From b6a968a11376bababc6c44c24b888d8cc3f1b38f Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 1 Feb 2012 14:09:16 +0200 Subject: [PATCH] Removed GemRB sources - it's now compilable straight from Git --- .../application/gemrb/AndroidAppSettings.cfg | 10 +- .../gemrb/AndroidData/override10.zip | Bin 0 -> 799116 bytes .../gemrb/AndroidData/override4.zip | Bin 684835 -> 0 bytes .../gemrb/AndroidData/scripts10.zip | Bin 0 -> 475246 bytes .../gemrb/AndroidData/scripts4.zip | Bin 499584 -> 0 bytes project/jni/application/gemrb/gemrb/GemRB.cpp | 90 - .../application/gemrb/gemrb/core/ActorMgr.cpp | 29 - .../application/gemrb/gemrb/core/ActorMgr.h | 42 - .../application/gemrb/gemrb/core/Ambient.cpp | 36 - .../application/gemrb/gemrb/core/Ambient.h | 77 - .../gemrb/gemrb/core/AmbientMgr.cpp | 62 - .../application/gemrb/gemrb/core/AmbientMgr.h | 48 - .../gemrb/gemrb/core/AnimStructures.h | 29 - .../gemrb/gemrb/core/Animation.cpp | 261 - .../application/gemrb/gemrb/core/Animation.h | 73 - .../gemrb/gemrb/core/AnimationFactory.cpp | 169 - .../gemrb/gemrb/core/AnimationFactory.h | 59 - .../gemrb/gemrb/core/AnimationMgr.cpp | 29 - .../gemrb/gemrb/core/AnimationMgr.h | 48 - .../gemrb/gemrb/core/ArchiveImporter.cpp | 29 - .../gemrb/gemrb/core/ArchiveImporter.h | 38 - .../application/gemrb/gemrb/core/Audio.cpp | 35 - .../jni/application/gemrb/gemrb/core/Audio.h | 82 - .../application/gemrb/gemrb/core/Bitmap.cpp | 29 - .../jni/application/gemrb/gemrb/core/Bitmap.h | 55 - .../gemrb/gemrb/core/CMakeLists.txt | 139 - .../application/gemrb/gemrb/core/Cache.cpp | 312 - .../jni/application/gemrb/gemrb/core/Cache.h | 93 - .../application/gemrb/gemrb/core/Calendar.cpp | 96 - .../application/gemrb/gemrb/core/Calendar.h | 40 - .../application/gemrb/gemrb/core/Callback.cpp | 33 - .../application/gemrb/gemrb/core/Callback.h | 35 - .../gemrb/gemrb/core/CharAnimations.cpp | 2391 ---- .../gemrb/gemrb/core/CharAnimations.h | 233 - .../gemrb/gemrb/core/Compressor.cpp | 31 - .../application/gemrb/gemrb/core/Compressor.h | 37 - .../gemrb/gemrb/core/ControlAnimation.cpp | 156 - .../gemrb/gemrb/core/ControlAnimation.h | 53 - .../jni/application/gemrb/gemrb/core/Core.cpp | 212 - .../gemrb/gemrb/core/DataFileMgr.cpp | 29 - .../gemrb/gemrb/core/DataFileMgr.h | 58 - .../application/gemrb/gemrb/core/Dialog.cpp | 100 - .../jni/application/gemrb/gemrb/core/Dialog.h | 83 - .../gemrb/gemrb/core/DialogHandler.cpp | 487 - .../gemrb/gemrb/core/DialogHandler.h | 51 - .../gemrb/gemrb/core/DialogMgr.cpp | 29 - .../application/gemrb/gemrb/core/DialogMgr.h | 36 - .../gemrb/gemrb/core/DisplayMessage.cpp | 240 - .../gemrb/gemrb/core/DisplayMessage.h | 73 - .../jni/application/gemrb/gemrb/core/Effect.h | 139 - .../gemrb/gemrb/core/EffectMgr.cpp | 29 - .../application/gemrb/gemrb/core/EffectMgr.h | 56 - .../gemrb/gemrb/core/EffectQueue.cpp | 1960 --- .../gemrb/gemrb/core/EffectQueue.h | 314 - .../application/gemrb/gemrb/core/Factory.cpp | 65 - .../application/gemrb/gemrb/core/Factory.h | 42 - .../gemrb/gemrb/core/FactoryObject.cpp | 33 - .../gemrb/gemrb/core/FactoryObject.h | 35 - .../gemrb/gemrb/core/FileCache.cpp | 87 - .../application/gemrb/gemrb/core/FileCache.h | 27 - .../jni/application/gemrb/gemrb/core/Font.cpp | 579 - .../jni/application/gemrb/gemrb/core/Font.h | 112 - .../gemrb/gemrb/core/GUI/Button.cpp | 728 -- .../application/gemrb/gemrb/core/GUI/Button.h | 219 - .../gemrb/gemrb/core/GUI/Console.cpp | 221 - .../gemrb/gemrb/core/GUI/Console.h | 93 - .../gemrb/gemrb/core/GUI/Control.cpp | 245 - .../gemrb/gemrb/core/GUI/Control.h | 149 - .../gemrb/gemrb/core/GUI/EventMgr.cpp | 440 - .../gemrb/gemrb/core/GUI/EventMgr.h | 141 - .../gemrb/gemrb/core/GUI/GameControl.cpp | 2841 ---- .../gemrb/gemrb/core/GUI/GameControl.h | 258 - .../gemrb/gemrb/core/GUI/Label.cpp | 153 - .../application/gemrb/gemrb/core/GUI/Label.h | 83 - .../gemrb/gemrb/core/GUI/MapControl.cpp | 540 - .../gemrb/gemrb/core/GUI/MapControl.h | 108 - .../gemrb/gemrb/core/GUI/Progressbar.cpp | 179 - .../gemrb/gemrb/core/GUI/Progressbar.h | 87 - .../gemrb/gemrb/core/GUI/ScrollBar.cpp | 293 - .../gemrb/gemrb/core/GUI/ScrollBar.h | 101 - .../gemrb/gemrb/core/GUI/Slider.cpp | 291 - .../application/gemrb/gemrb/core/GUI/Slider.h | 104 - .../gemrb/gemrb/core/GUI/TextArea.cpp | 983 -- .../gemrb/gemrb/core/GUI/TextArea.h | 179 - .../gemrb/gemrb/core/GUI/TextEdit.cpp | 241 - .../gemrb/gemrb/core/GUI/TextEdit.h | 101 - .../gemrb/gemrb/core/GUI/Window.cpp | 443 - .../application/gemrb/gemrb/core/GUI/Window.h | 188 - .../gemrb/gemrb/core/GUI/WorldMapControl.cpp | 420 - .../gemrb/gemrb/core/GUI/WorldMapControl.h | 114 - .../jni/application/gemrb/gemrb/core/Game.cpp | 1761 --- .../jni/application/gemrb/gemrb/core/Game.h | 482 - .../application/gemrb/gemrb/core/GameData.cpp | 549 - .../application/gemrb/gemrb/core/GameData.h | 138 - .../gemrb/gemrb/core/GameScript/Actions.cpp | 7243 ----------- .../gemrb/gemrb/core/GameScript/GSUtils.cpp | 2285 ---- .../gemrb/gemrb/core/GameScript/GSUtils.h | 140 - .../gemrb/core/GameScript/GameScript.cpp | 2357 ---- .../gemrb/gemrb/core/GameScript/GameScript.h | 1540 --- .../gemrb/gemrb/core/GameScript/Matching.cpp | 674 - .../gemrb/gemrb/core/GameScript/Matching.h | 49 - .../gemrb/gemrb/core/GameScript/Objects.cpp | 1164 -- .../gemrb/gemrb/core/GameScript/Triggers.cpp | 4105 ------ .../gemrb/gemrb/core/GlobalTimer.cpp | 340 - .../gemrb/gemrb/core/GlobalTimer.h | 78 - .../jni/application/gemrb/gemrb/core/Holder.h | 95 - .../application/gemrb/gemrb/core/Image.cpp | 47 - .../jni/application/gemrb/gemrb/core/Image.h | 61 - .../gemrb/gemrb/core/ImageFactory.cpp | 42 - .../gemrb/gemrb/core/ImageFactory.h | 40 - .../application/gemrb/gemrb/core/ImageMgr.cpp | 92 - .../application/gemrb/gemrb/core/ImageMgr.h | 68 - .../gemrb/gemrb/core/ImageWriter.cpp | 27 - .../gemrb/gemrb/core/ImageWriter.h | 35 - .../gemrb/gemrb/core/IndexedArchive.cpp | 29 - .../gemrb/gemrb/core/IndexedArchive.h | 36 - .../application/gemrb/gemrb/core/IniSpawn.cpp | 717 - .../application/gemrb/gemrb/core/IniSpawn.h | 168 - .../gemrb/gemrb/core/Interface.cpp | 5429 -------- .../application/gemrb/gemrb/core/Interface.h | 807 -- .../gemrb/gemrb/core/Inventory.cpp | 1856 --- .../application/gemrb/gemrb/core/Inventory.h | 351 - .../jni/application/gemrb/gemrb/core/Item.cpp | 248 - .../jni/application/gemrb/gemrb/core/Item.h | 268 - .../application/gemrb/gemrb/core/ItemMgr.cpp | 29 - .../application/gemrb/gemrb/core/ItemMgr.h | 48 - .../application/gemrb/gemrb/core/KeyMap.cpp | 157 - .../jni/application/gemrb/gemrb/core/KeyMap.h | 48 - .../application/gemrb/gemrb/core/LRUCache.cpp | 219 - .../application/gemrb/gemrb/core/LRUCache.h | 59 - .../application/gemrb/gemrb/core/Makefile.am | 125 - .../jni/application/gemrb/gemrb/core/Map.cpp | 3709 ------ .../jni/application/gemrb/gemrb/core/Map.h | 501 - .../application/gemrb/gemrb/core/MapMgr.cpp | 29 - .../jni/application/gemrb/gemrb/core/MapMgr.h | 52 - .../gemrb/gemrb/core/MoviePlayer.cpp | 31 - .../gemrb/gemrb/core/MoviePlayer.h | 50 - .../application/gemrb/gemrb/core/MusicMgr.cpp | 33 - .../application/gemrb/gemrb/core/MusicMgr.h | 49 - .../application/gemrb/gemrb/core/Palette.cpp | 253 - .../application/gemrb/gemrb/core/Palette.h | 103 - .../gemrb/gemrb/core/PalettedImageMgr.cpp | 29 - .../gemrb/gemrb/core/PalettedImageMgr.h | 49 - .../gemrb/gemrb/core/Particles.cpp | 389 - .../application/gemrb/gemrb/core/Particles.h | 137 - .../application/gemrb/gemrb/core/PathFinder.h | 52 - .../application/gemrb/gemrb/core/Plugin.cpp | 29 - .../jni/application/gemrb/gemrb/core/Plugin.h | 49 - .../gemrb/gemrb/core/PluginLoader.cpp | 239 - .../gemrb/gemrb/core/PluginLoader.h | 32 - .../gemrb/gemrb/core/PluginMgr.cpp | 113 - .../application/gemrb/gemrb/core/PluginMgr.h | 153 - .../application/gemrb/gemrb/core/Polygon.cpp | 385 - .../application/gemrb/gemrb/core/Polygon.h | 81 - .../gemrb/gemrb/core/PolymorphCache.h | 34 - .../gemrb/gemrb/core/Projectile.cpp | 1771 --- .../application/gemrb/gemrb/core/Projectile.h | 408 - .../gemrb/gemrb/core/ProjectileMgr.cpp | 29 - .../gemrb/gemrb/core/ProjectileMgr.h | 36 - .../gemrb/gemrb/core/ProjectileServer.cpp | 325 - .../gemrb/gemrb/core/ProjectileServer.h | 96 - .../application/gemrb/gemrb/core/Region.cpp | 184 - .../jni/application/gemrb/gemrb/core/Region.h | 90 - .../application/gemrb/gemrb/core/Resource.cpp | 35 - .../application/gemrb/gemrb/core/Resource.h | 57 - .../gemrb/gemrb/core/ResourceDesc.cpp | 50 - .../gemrb/gemrb/core/ResourceDesc.h | 60 - .../gemrb/gemrb/core/ResourceManager.cpp | 158 - .../gemrb/gemrb/core/ResourceManager.h | 70 - .../gemrb/gemrb/core/ResourceSource.cpp | 29 - .../gemrb/gemrb/core/ResourceSource.h | 47 - .../application/gemrb/gemrb/core/SaveGame.h | 86 - .../gemrb/gemrb/core/SaveGameIterator.cpp | 659 - .../gemrb/gemrb/core/SaveGameIterator.h | 51 - .../gemrb/gemrb/core/SaveGameMgr.cpp | 29 - .../gemrb/gemrb/core/SaveGameMgr.h | 38 - .../gemrb/gemrb/core/ScriptEngine.cpp | 29 - .../gemrb/gemrb/core/ScriptEngine.h | 40 - .../gemrb/gemrb/core/Scriptable/Actor.cpp | 7082 ---------- .../gemrb/gemrb/core/Scriptable/Actor.h | 728 -- .../gemrb/gemrb/core/Scriptable/Container.cpp | 295 - .../gemrb/gemrb/core/Scriptable/Container.h | 71 - .../gemrb/gemrb/core/Scriptable/Door.cpp | 409 - .../gemrb/gemrb/core/Scriptable/Door.h | 100 - .../gemrb/gemrb/core/Scriptable/InfoPoint.cpp | 239 - .../gemrb/gemrb/core/Scriptable/InfoPoint.h | 67 - .../gemrb/core/Scriptable/PCStatStruct.cpp | 185 - .../gemrb/core/Scriptable/PCStatStruct.h | 117 - .../gemrb/core/Scriptable/Scriptable.cpp | 2114 --- .../gemrb/gemrb/core/Scriptable/Scriptable.h | 537 - .../gemrb/gemrb/core/ScriptedAnimation.cpp | 778 -- .../gemrb/gemrb/core/ScriptedAnimation.h | 156 - .../application/gemrb/gemrb/core/SoundMgr.cpp | 32 - .../application/gemrb/gemrb/core/SoundMgr.h | 64 - .../application/gemrb/gemrb/core/Spell.cpp | 237 - .../jni/application/gemrb/gemrb/core/Spell.h | 174 - .../application/gemrb/gemrb/core/SpellMgr.cpp | 29 - .../application/gemrb/gemrb/core/SpellMgr.h | 47 - .../gemrb/gemrb/core/Spellbook.cpp | 1078 -- .../application/gemrb/gemrb/core/Spellbook.h | 253 - .../application/gemrb/gemrb/core/Sprite2D.cpp | 151 - .../application/gemrb/gemrb/core/Sprite2D.h | 82 - .../gemrb/gemrb/core/SpriteCover.cpp | 49 - .../gemrb/gemrb/core/SpriteCover.h | 39 - .../application/gemrb/gemrb/core/Store.cpp | 303 - .../jni/application/gemrb/gemrb/core/Store.h | 178 - .../application/gemrb/gemrb/core/StoreMgr.cpp | 29 - .../application/gemrb/gemrb/core/StoreMgr.h | 50 - .../gemrb/gemrb/core/StringMgr.cpp | 29 - .../application/gemrb/gemrb/core/StringMgr.h | 62 - .../gemrb/gemrb/core/SymbolMgr.cpp | 29 - .../application/gemrb/gemrb/core/SymbolMgr.h | 51 - .../gemrb/gemrb/core/System/DataStream.cpp | 220 - .../gemrb/gemrb/core/System/DataStream.h | 84 - .../gemrb/gemrb/core/System/FileStream.cpp | 327 - .../gemrb/gemrb/core/System/FileStream.h | 70 - .../gemrb/gemrb/core/System/Logging.cpp | 187 - .../gemrb/gemrb/core/System/Logging.h | 92 - .../gemrb/gemrb/core/System/MemoryStream.cpp | 98 - .../gemrb/gemrb/core/System/MemoryStream.h | 42 - .../gemrb/gemrb/core/System/SlicedStream.cpp | 126 - .../gemrb/gemrb/core/System/SlicedStream.h | 46 - .../gemrb/gemrb/core/System/String.cpp | 145 - .../gemrb/gemrb/core/System/String.h | 56 - .../gemrb/gemrb/core/System/VFS.cpp | 423 - .../application/gemrb/gemrb/core/System/VFS.h | 144 - .../gemrb/gemrb/core/System/swab.c | 33 - .../gemrb/gemrb/core/System/swab.h | 35 - .../application/gemrb/gemrb/core/TableMgr.cpp | 84 - .../application/gemrb/gemrb/core/TableMgr.h | 99 - .../jni/application/gemrb/gemrb/core/Tile.cpp | 42 - .../jni/application/gemrb/gemrb/core/Tile.h | 42 - .../application/gemrb/gemrb/core/TileMap.cpp | 649 - .../application/gemrb/gemrb/core/TileMap.h | 100 - .../gemrb/gemrb/core/TileMapMgr.cpp | 29 - .../application/gemrb/gemrb/core/TileMapMgr.h | 46 - .../gemrb/gemrb/core/TileOverlay.cpp | 134 - .../gemrb/gemrb/core/TileOverlay.h | 46 - .../gemrb/gemrb/core/TileSetMgr.cpp | 29 - .../application/gemrb/gemrb/core/TileSetMgr.h | 37 - .../jni/application/gemrb/gemrb/core/TypeID.h | 29 - .../gemrb/gemrb/core/Variables.cpp | 506 - .../application/gemrb/gemrb/core/Variables.h | 129 - .../application/gemrb/gemrb/core/Video.cpp | 236 - .../jni/application/gemrb/gemrb/core/Video.h | 245 - .../application/gemrb/gemrb/core/VideoMode.h | 51 - .../gemrb/gemrb/core/WindowMgr.cpp | 28 - .../application/gemrb/gemrb/core/WindowMgr.h | 53 - .../application/gemrb/gemrb/core/WorldMap.cpp | 589 - .../application/gemrb/gemrb/core/WorldMap.h | 205 - .../gemrb/gemrb/core/WorldMapMgr.cpp | 29 - .../gemrb/gemrb/core/WorldMapMgr.h | 50 - .../application/gemrb/gemrb/core/damages.h | 53 - .../gemrb/gemrb/includes/HashMap.h | 455 - .../gemrb/gemrb/includes/Makefile.am | 2 - .../gemrb/gemrb/includes/RGBAColor.h | 31 - .../gemrb/gemrb/includes/SClassID.h | 90 - .../gemrb/gemrb/includes/StringMap.h | 127 - .../gemrb/gemrb/includes/defsounds.h | 50 - .../application/gemrb/gemrb/includes/diff.txt | 20 - .../application/gemrb/gemrb/includes/errors.h | 27 - .../gemrb/gemrb/includes/exports.h | 83 - .../gemrb/gemrb/includes/globals.h | 213 - .../gemrb/gemrb/includes/ie_feats.h | 94 - .../gemrb/gemrb/includes/ie_stats.h | 536 - .../gemrb/gemrb/includes/ie_types.h | 70 - .../application/gemrb/gemrb/includes/iless.h | 31 - .../gemrb/gemrb/includes/opcode_params.h | 204 - .../gemrb/gemrb/includes/operatorbool.h | 12 - .../gemrb/gemrb/includes/overlays.h | 60 - .../gemrb/gemrb/includes/plugindef.h | 204 - .../gemrb/gemrb/includes/strrefs.h | 201 - .../gemrb/gemrb/includes/win32def.h | 69 - .../gemrb/plugins/2DAImporter/2DAImporter.cpp | 111 - .../gemrb/plugins/2DAImporter/2DAImporter.h | 169 - .../gemrb/plugins/2DAImporter/CMakeLists.txt | 1 - .../gemrb/plugins/2DAImporter/Makefile.am | 3 - .../gemrb/plugins/ACMReader/ACMReader.cpp | 117 - .../gemrb/gemrb/plugins/ACMReader/ACMReader.h | 73 - .../gemrb/plugins/ACMReader/CMakeLists.txt | 3 - .../gemrb/gemrb/plugins/ACMReader/Makefile.am | 3 - .../gemrb/gemrb/plugins/ACMReader/decoder.cpp | 177 - .../gemrb/gemrb/plugins/ACMReader/decoder.h | 48 - .../gemrb/gemrb/plugins/ACMReader/general.h | 36 - .../gemrb/plugins/ACMReader/unpacker.cpp | 454 - .../gemrb/gemrb/plugins/ACMReader/unpacker.h | 93 - .../gemrb/plugins/AREImporter/AREImporter.cpp | 2327 ---- .../gemrb/plugins/AREImporter/AREImporter.h | 93 - .../gemrb/plugins/AREImporter/CMakeLists.txt | 1 - .../gemrb/plugins/AREImporter/Makefile.am | 3 - .../gemrb/plugins/BAMImporter/BAMImporter.cpp | 359 - .../gemrb/plugins/BAMImporter/BAMImporter.h | 89 - .../gemrb/plugins/BAMImporter/CMakeLists.txt | 1 - .../gemrb/plugins/BAMImporter/Makefile.am | 3 - .../gemrb/plugins/BIFImporter/BIFImporter.cpp | 248 - .../gemrb/plugins/BIFImporter/BIFImporter.h | 64 - .../gemrb/plugins/BIFImporter/CMakeLists.txt | 1 - .../gemrb/plugins/BIFImporter/Makefile.am | 3 - .../gemrb/plugins/BIKPlayer/BIKPlayer.cpp | 1617 --- .../gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.h | 259 - .../gemrb/plugins/BIKPlayer/CMakeLists.txt | 1 - .../gemrb/plugins/BIKPlayer/GetBitContext.cpp | 317 - .../gemrb/plugins/BIKPlayer/GetBitContext.h | 107 - .../gemrb/gemrb/plugins/BIKPlayer/Makefile.am | 16 - .../gemrb/gemrb/plugins/BIKPlayer/binkdata.h | 613 - .../gemrb/gemrb/plugins/BIKPlayer/common.h | 78 - .../gemrb/gemrb/plugins/BIKPlayer/dct.cpp | 97 - .../gemrb/gemrb/plugins/BIKPlayer/dsputil.h | 230 - .../gemrb/gemrb/plugins/BIKPlayer/fft.cpp | 358 - .../gemrb/gemrb/plugins/BIKPlayer/mem.cpp | 68 - .../gemrb/plugins/BIKPlayer/rational.cpp | 83 - .../gemrb/gemrb/plugins/BIKPlayer/rational.h | 126 - .../gemrb/gemrb/plugins/BIKPlayer/rdft.cpp | 130 - .../gemrb/plugins/BMPImporter/BMPImporter.cpp | 320 - .../gemrb/plugins/BMPImporter/BMPImporter.h | 57 - .../gemrb/plugins/BMPImporter/CMakeLists.txt | 1 - .../gemrb/plugins/BMPImporter/Makefile.am | 3 - .../gemrb/plugins/BMPWriter/BMPWriter.cpp | 77 - .../gemrb/gemrb/plugins/BMPWriter/BMPWriter.h | 9 - .../gemrb/plugins/BMPWriter/CMakeLists.txt | 1 - .../gemrb/gemrb/plugins/BMPWriter/Makefile.am | 3 - .../gemrb/plugins/CHUImporter/CHUImporter.cpp | 525 - .../gemrb/plugins/CHUImporter/CHUImporter.h | 48 - .../gemrb/plugins/CHUImporter/CMakeLists.txt | 1 - .../gemrb/plugins/CHUImporter/Makefile.am | 3 - .../gemrb/gemrb/plugins/CMakeLists.txt | 46 - .../gemrb/plugins/CREImporter/CMakeLists.txt | 1 - .../gemrb/plugins/CREImporter/CREImporter.cpp | 2952 ----- .../gemrb/plugins/CREImporter/CREImporter.h | 115 - .../gemrb/plugins/CREImporter/Makefile.am | 3 - .../gemrb/plugins/DLGImporter/CMakeLists.txt | 1 - .../gemrb/plugins/DLGImporter/DLGImporter.cpp | 388 - .../gemrb/plugins/DLGImporter/DLGImporter.h | 84 - .../gemrb/plugins/DLGImporter/Makefile.am | 3 - .../plugins/DirectoryImporter/CMakeLists.txt | 1 - .../DirectoryImporter/DirectoryImporter.cpp | 179 - .../DirectoryImporter/DirectoryImporter.h | 66 - .../plugins/DirectoryImporter/Makefile.am | 3 - .../gemrb/plugins/EFFImporter/CMakeLists.txt | 1 - .../gemrb/plugins/EFFImporter/EFFImporter.cpp | 252 - .../gemrb/plugins/EFFImporter/EFFImporter.h | 49 - .../gemrb/plugins/EFFImporter/Makefile.am | 3 - .../gemrb/plugins/FXOpcodes/CMakeLists.txt | 1 - .../gemrb/plugins/FXOpcodes/FXOpcodes.cpp | 6767 ---------- .../gemrb/gemrb/plugins/FXOpcodes/Makefile.am | 3 - .../gemrb/plugins/GAMImporter/CMakeLists.txt | 1 - .../gemrb/plugins/GAMImporter/GAMImporter.cpp | 1286 -- .../gemrb/plugins/GAMImporter/GAMImporter.h | 82 - .../gemrb/plugins/GAMImporter/Makefile.am | 3 - .../gemrb/plugins/GUIScript/CMakeLists.txt | 5 - .../gemrb/plugins/GUIScript/GUIScript.cpp | 10768 ---------------- .../gemrb/gemrb/plugins/GUIScript/GUIScript.h | 68 - .../gemrb/gemrb/plugins/GUIScript/Makefile.am | 5 - .../gemrb/plugins/GUIScript/PythonHelpers.cpp | 80 - .../gemrb/plugins/GUIScript/PythonHelpers.h | 112 - .../gemrb/plugins/IDSImporter/CMakeLists.txt | 1 - .../gemrb/plugins/IDSImporter/IDSImporter.cpp | 148 - .../gemrb/plugins/IDSImporter/IDSImporter.h | 52 - .../plugins/IDSImporter/IDSImporterDefs.h | 31 - .../gemrb/plugins/IDSImporter/Makefile.am | 3 - .../gemrb/plugins/INIImporter/CMakeLists.txt | 1 - .../gemrb/plugins/INIImporter/INIImporter.cpp | 156 - .../gemrb/plugins/INIImporter/INIImporter.h | 211 - .../gemrb/plugins/INIImporter/Makefile.am | 3 - .../gemrb/plugins/ITMImporter/CMakeLists.txt | 1 - .../gemrb/plugins/ITMImporter/ITMImporter.cpp | 250 - .../gemrb/plugins/ITMImporter/ITMImporter.h | 50 - .../gemrb/plugins/ITMImporter/Makefile.am | 3 - .../gemrb/plugins/IWDOpcodes/CMakeLists.txt | 1 - .../gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp | 3392 ----- .../gemrb/plugins/IWDOpcodes/Makefile.am | 3 - .../gemrb/plugins/KEYImporter/CMakeLists.txt | 1 - .../gemrb/plugins/KEYImporter/Dictionary.cpp | 227 - .../gemrb/plugins/KEYImporter/Dictionary.h | 84 - .../gemrb/plugins/KEYImporter/KEYImporter.cpp | 278 - .../gemrb/plugins/KEYImporter/KEYImporter.h | 70 - .../gemrb/plugins/KEYImporter/Makefile.am | 3 - .../gemrb/plugins/MOSImporter/CMakeLists.txt | 1 - .../gemrb/plugins/MOSImporter/MOSImporter.cpp | 130 - .../gemrb/plugins/MOSImporter/MOSImporter.h | 39 - .../gemrb/plugins/MOSImporter/Makefile.am | 3 - .../gemrb/plugins/MUSImporter/CMakeLists.txt | 1 - .../gemrb/plugins/MUSImporter/MUSImporter.cpp | 334 - .../gemrb/plugins/MUSImporter/MUSImporter.h | 79 - .../gemrb/plugins/MUSImporter/Makefile.am | 3 - .../gemrb/plugins/MVEPlayer/CMakeLists.txt | 1 - .../gemrb/plugins/MVEPlayer/MVEPlayer.cpp | 187 - .../gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.h | 57 - .../gemrb/gemrb/plugins/MVEPlayer/Makefile.am | 12 - .../gemrb/plugins/MVEPlayer/gstmvedemux.h | 141 - .../gemrb/gemrb/plugins/MVEPlayer/mve.h | 64 - .../gemrb/plugins/MVEPlayer/mve_player.cpp | 478 - .../gemrb/plugins/MVEPlayer/mve_player.h | 93 - .../gemrb/plugins/MVEPlayer/mveaudiodec.cpp | 82 - .../gemrb/plugins/MVEPlayer/mvevideodec16.cpp | 844 -- .../gemrb/plugins/MVEPlayer/mvevideodec8.cpp | 797 -- .../gemrb/gemrb/plugins/Makefile.am | 45 - .../gemrb/plugins/NullSound/CMakeLists.txt | 1 - .../gemrb/gemrb/plugins/NullSound/Makefile.am | 3 - .../gemrb/plugins/NullSound/NullSound.cpp | 133 - .../gemrb/gemrb/plugins/NullSound/NullSound.h | 55 - .../gemrb/plugins/OGGReader/CMakeLists.txt | 11 - .../gemrb/gemrb/plugins/OGGReader/Makefile.am | 6 - .../gemrb/plugins/OGGReader/OGGReader.cpp | 128 - .../gemrb/gemrb/plugins/OGGReader/OGGReader.h | 55 - .../plugins/OpenALAudio/AmbientMgrAL.cpp | 312 - .../gemrb/plugins/OpenALAudio/AmbientMgrAL.h | 89 - .../gemrb/plugins/OpenALAudio/CMakeLists.txt | 7 - .../gemrb/plugins/OpenALAudio/Makefile.am | 4 - .../gemrb/plugins/OpenALAudio/OpenALAudio.cpp | 921 -- .../plugins/OpenALAudio/OpenALAudio.cpp.old | 924 -- .../gemrb/plugins/OpenALAudio/OpenALAudio.h | 148 - .../gemrb/plugins/OpenALAudio/StackLock.cpp | 55 - .../gemrb/plugins/OpenALAudio/StackLock.h | 38 - .../gemrb/plugins/PLTImporter/CMakeLists.txt | 1 - .../gemrb/plugins/PLTImporter/Makefile.am | 3 - .../gemrb/plugins/PLTImporter/PLTImporter.cpp | 112 - .../gemrb/plugins/PLTImporter/PLTImporter.h | 37 - .../gemrb/plugins/PNGImporter/CMakeLists.txt | 5 - .../gemrb/plugins/PNGImporter/Makefile.am | 4 - .../gemrb/plugins/PNGImporter/PNGImporter.cpp | 217 - .../gemrb/plugins/PNGImporter/PNGImporter.h | 45 - .../gemrb/plugins/PROImporter/CMakeLists.txt | 1 - .../gemrb/plugins/PROImporter/Makefile.am | 3 - .../gemrb/plugins/PROImporter/PROImporter.cpp | 173 - .../gemrb/plugins/PROImporter/PROImporter.h | 46 - .../gemrb/plugins/PSTOpcodes/CMakeLists.txt | 1 - .../gemrb/plugins/PSTOpcodes/Makefile.am | 3 - .../gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp | 728 -- .../gemrb/plugins/SAVImporter/CMakeLists.txt | 1 - .../gemrb/plugins/SAVImporter/Makefile.am | 3 - .../gemrb/plugins/SAVImporter/SAVImporter.cpp | 122 - .../gemrb/plugins/SAVImporter/SAVImporter.h | 39 - .../gemrb/plugins/SDLAudio/CMakeLists.txt | 6 - .../gemrb/gemrb/plugins/SDLAudio/Makefile.am | 5 - .../gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp | 388 - .../gemrb/gemrb/plugins/SDLAudio/SDLAudio.h | 81 - .../gemrb/plugins/SDLVideo/CMakeLists.txt | 4 - .../gemrb/gemrb/plugins/SDLVideo/Makefile.am | 5 - .../gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp | 2584 ---- .../gemrb/gemrb/plugins/SDLVideo/SDLVideo.h | 174 - .../gemrb/plugins/SDLVideo/SDLVideoDriver.inl | 539 - .../gemrb/plugins/SDLVideo/TileRenderer.inl | 152 - .../gemrb/plugins/SPLImporter/CMakeLists.txt | 1 - .../gemrb/plugins/SPLImporter/Makefile.am | 3 - .../gemrb/plugins/SPLImporter/SPLImporter.cpp | 254 - .../gemrb/plugins/SPLImporter/SPLImporter.h | 47 - .../gemrb/plugins/STOImporter/CMakeLists.txt | 1 - .../gemrb/plugins/STOImporter/Makefile.am | 3 - .../gemrb/plugins/STOImporter/STOImporter.cpp | 393 - .../gemrb/plugins/STOImporter/STOImporter.h | 61 - .../gemrb/plugins/TISImporter/CMakeLists.txt | 1 - .../gemrb/plugins/TISImporter/Makefile.am | 3 - .../gemrb/plugins/TISImporter/TISImporter.cpp | 140 - .../gemrb/plugins/TISImporter/TISImporter.h | 41 - .../gemrb/plugins/TLKImporter/CMakeLists.txt | 1 - .../gemrb/plugins/TLKImporter/Makefile.am | 3 - .../gemrb/plugins/TLKImporter/TLKImporter.cpp | 491 - .../gemrb/plugins/TLKImporter/TLKImporter.h | 67 - .../gemrb/plugins/TLKImporter/TlkOverride.cpp | 342 - .../gemrb/plugins/TLKImporter/TlkOverride.h | 83 - .../gemrb/plugins/WAVReader/CMakeLists.txt | 3 - .../gemrb/gemrb/plugins/WAVReader/Makefile.am | 3 - .../gemrb/plugins/WAVReader/WAVReader.cpp | 193 - .../gemrb/gemrb/plugins/WAVReader/WAVReader.h | 59 - .../gemrb/plugins/WEDImporter/CMakeLists.txt | 1 - .../gemrb/plugins/WEDImporter/Makefile.am | 3 - .../gemrb/plugins/WEDImporter/WEDImporter.cpp | 355 - .../gemrb/plugins/WEDImporter/WEDImporter.h | 65 - .../gemrb/plugins/WMPImporter/CMakeLists.txt | 1 - .../gemrb/plugins/WMPImporter/Makefile.am | 3 - .../gemrb/plugins/WMPImporter/WMPImporter.cpp | 433 - .../gemrb/plugins/WMPImporter/WMPImporter.h | 60 - .../gemrb/plugins/ZLibManager/CMakeLists.txt | 3 - .../gemrb/plugins/ZLibManager/Makefile.am | 3 - .../gemrb/plugins/ZLibManager/ZLibManager.cpp | 158 - .../gemrb/plugins/ZLibManager/ZLibManager.h | 36 - project/jni/application/src | 2 +- 478 files changed, 6 insertions(+), 141851 deletions(-) create mode 100644 project/jni/application/gemrb/AndroidData/override10.zip delete mode 100644 project/jni/application/gemrb/AndroidData/override4.zip create mode 100644 project/jni/application/gemrb/AndroidData/scripts10.zip delete mode 100644 project/jni/application/gemrb/AndroidData/scripts4.zip delete mode 100644 project/jni/application/gemrb/gemrb/GemRB.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ActorMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ActorMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Ambient.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Ambient.h delete mode 100644 project/jni/application/gemrb/gemrb/core/AmbientMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/AmbientMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/AnimStructures.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Animation.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Animation.h delete mode 100644 project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/AnimationFactory.h delete mode 100644 project/jni/application/gemrb/gemrb/core/AnimationMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/AnimationMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ArchiveImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ArchiveImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Audio.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Audio.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Bitmap.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Bitmap.h delete mode 100644 project/jni/application/gemrb/gemrb/core/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/core/Cache.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Cache.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Calendar.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Calendar.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Callback.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Callback.h delete mode 100644 project/jni/application/gemrb/gemrb/core/CharAnimations.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/CharAnimations.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Compressor.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Compressor.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ControlAnimation.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Core.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/DataFileMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/DataFileMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Dialog.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Dialog.h delete mode 100644 project/jni/application/gemrb/gemrb/core/DialogHandler.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/DialogHandler.h delete mode 100644 project/jni/application/gemrb/gemrb/core/DialogMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/DialogMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/DisplayMessage.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Effect.h delete mode 100644 project/jni/application/gemrb/gemrb/core/EffectMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/EffectMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/EffectQueue.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/EffectQueue.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Factory.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Factory.h delete mode 100644 project/jni/application/gemrb/gemrb/core/FactoryObject.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/FactoryObject.h delete mode 100644 project/jni/application/gemrb/gemrb/core/FileCache.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/FileCache.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Font.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Font.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Button.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Button.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Console.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Console.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Control.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Control.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/GameControl.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Label.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Label.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/MapControl.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Slider.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/TextArea.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Window.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/Window.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Game.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Game.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GameData.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameData.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/GameScript.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/Matching.h delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/GlobalTimer.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Holder.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Image.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Image.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageFactory.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageFactory.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageWriter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ImageWriter.h delete mode 100644 project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/IndexedArchive.h delete mode 100644 project/jni/application/gemrb/gemrb/core/IniSpawn.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/IniSpawn.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Interface.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Interface.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Inventory.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Inventory.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Item.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Item.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ItemMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ItemMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/KeyMap.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/KeyMap.h delete mode 100644 project/jni/application/gemrb/gemrb/core/LRUCache.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/LRUCache.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/core/Map.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Map.h delete mode 100644 project/jni/application/gemrb/gemrb/core/MapMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/MapMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/MoviePlayer.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/MoviePlayer.h delete mode 100644 project/jni/application/gemrb/gemrb/core/MusicMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/MusicMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Palette.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Palette.h delete mode 100644 project/jni/application/gemrb/gemrb/core/PalettedImageMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/PalettedImageMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Particles.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Particles.h delete mode 100644 project/jni/application/gemrb/gemrb/core/PathFinder.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Plugin.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Plugin.h delete mode 100644 project/jni/application/gemrb/gemrb/core/PluginLoader.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/PluginLoader.h delete mode 100644 project/jni/application/gemrb/gemrb/core/PluginMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/PluginMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Polygon.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Polygon.h delete mode 100644 project/jni/application/gemrb/gemrb/core/PolymorphCache.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Projectile.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Projectile.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ProjectileMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ProjectileMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ProjectileServer.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ProjectileServer.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Region.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Region.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Resource.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Resource.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceDesc.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceDesc.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceManager.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceManager.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceSource.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ResourceSource.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SaveGame.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SaveGameIterator.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SaveGameIterator.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SaveGameMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SaveGameMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ScriptEngine.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ScriptEngine.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Actor.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Actor.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Container.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Container.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Door.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Door.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/PCStatStruct.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/PCStatStruct.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.h delete mode 100644 project/jni/application/gemrb/gemrb/core/ScriptedAnimation.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/ScriptedAnimation.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SoundMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SoundMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Spell.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Spell.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SpellMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SpellMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Spellbook.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Spellbook.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Sprite2D.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Sprite2D.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SpriteCover.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SpriteCover.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Store.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Store.h delete mode 100644 project/jni/application/gemrb/gemrb/core/StoreMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/StoreMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/StringMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/StringMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/SymbolMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/SymbolMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/DataStream.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/DataStream.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/FileStream.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/FileStream.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/Logging.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/Logging.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/MemoryStream.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/MemoryStream.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/SlicedStream.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/SlicedStream.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/String.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/String.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/VFS.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/System/VFS.h delete mode 100644 project/jni/application/gemrb/gemrb/core/System/swab.c delete mode 100644 project/jni/application/gemrb/gemrb/core/System/swab.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TableMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/TableMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Tile.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Tile.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TileMap.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/TileMap.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TileMapMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/TileMapMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TileOverlay.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/TileOverlay.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TileSetMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/TileSetMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/TypeID.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Variables.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Variables.h delete mode 100644 project/jni/application/gemrb/gemrb/core/Video.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/Video.h delete mode 100644 project/jni/application/gemrb/gemrb/core/VideoMode.h delete mode 100644 project/jni/application/gemrb/gemrb/core/WindowMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/WindowMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/WorldMap.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/WorldMap.h delete mode 100644 project/jni/application/gemrb/gemrb/core/WorldMapMgr.cpp delete mode 100644 project/jni/application/gemrb/gemrb/core/WorldMapMgr.h delete mode 100644 project/jni/application/gemrb/gemrb/core/damages.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/HashMap.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/includes/RGBAColor.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/SClassID.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/StringMap.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/defsounds.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/diff.txt delete mode 100644 project/jni/application/gemrb/gemrb/includes/errors.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/exports.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/globals.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/ie_feats.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/ie_stats.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/ie_types.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/iless.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/opcode_params.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/operatorbool.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/overlays.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/plugindef.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/strrefs.h delete mode 100644 project/jni/application/gemrb/gemrb/includes/win32def.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/2DAImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/2DAImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/decoder.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/decoder.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/general.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/unpacker.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ACMReader/unpacker.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/AREImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/AREImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BAMImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BAMImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIFImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIFImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/binkdata.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/common.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/dct.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/dsputil.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/fft.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/mem.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/rational.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/rational.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BIKPlayer/rdft.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPWriter/BMPWriter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPWriter/BMPWriter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPWriter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/BMPWriter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CHUImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CHUImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CREImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/CREImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DLGImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DLGImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/EFFImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/EFFImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/FXOpcodes/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/FXOpcodes/FXOpcodes.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/FXOpcodes/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GAMImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GAMImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/PythonHelpers.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/GUIScript/PythonHelpers.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IDSImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporterDefs.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IDSImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/INIImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/INIImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ITMImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ITMImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/KEYImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MOSImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MOSImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MUSImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MUSImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/gstmvedemux.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mveaudiodec.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mvevideodec16.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mvevideodec8.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/NullSound/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/NullSound/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/NullSound/NullSound.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/NullSound/NullSound.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OGGReader/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OGGReader/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp.old delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/StackLock.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/StackLock.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PLTImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PLTImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PNGImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PNGImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PROImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PROImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLAudio/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLAudio/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.inl delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SDLVideo/TileRenderer.inl delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SPLImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SPLImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/STOImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/STOImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TISImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TISImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WAVReader/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WAVReader/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WEDImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WEDImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WMPImporter/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WMPImporter/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.h delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ZLibManager/CMakeLists.txt delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ZLibManager/Makefile.am delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.cpp delete mode 100644 project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.h diff --git a/project/jni/application/gemrb/AndroidAppSettings.cfg b/project/jni/application/gemrb/AndroidAppSettings.cfg index 92b4f2ef8..2bb56fccd 100644 --- a/project/jni/application/gemrb/AndroidAppSettings.cfg +++ b/project/jni/application/gemrb/AndroidAppSettings.cfg @@ -5,12 +5,12 @@ AppName="GemRB" AppFullName=net.sourceforge.gemrb ScreenOrientation=h InhibitSuspend=n -AppDataDownloadUrl="Baldur's gate 2 demo|http://sourceforge.net/projects/libsdl-android/files/gemrb/bg2demo.zip/download^!GemRB data(override)|override4.zip^!GemRB data(scripts)|scripts4.zip" +AppDataDownloadUrl="Baldur's Gate 2 demo (800 Mb)|http://sourceforge.net/projects/libsdl-android/files/gemrb/bg2demo.zip/download^!GemRB data(override)|override10.zip^!GemRB data(scripts)|scripts10.zip" VideoDepthBpp=16 NeedDepthBuffer=n NeedStencilBuffer=n NeedGles2=n -SwVideoMode=n +SwVideoMode=y SdlVideoResize=y SdlVideoResizeKeepAspect=y CompatibilityHacks=n @@ -31,9 +31,9 @@ StartupMenuButtonTimeout=2000 HiddenMenuOptions='' FirstStartMenuOptions='' MultiABI=y -AppVersionCode=0643 -AppVersionName="0.6.4.3" -CompiledLibraries="sdl_mixer ogg vorbis openal png python" +AppVersionCode=0700 +AppVersionName="0.7.0.0" +CompiledLibraries="sdl_mixer sdl_ttf ogg vorbis openal png python" CustomBuildScript=n AppCflags='-fexceptions -finline-functions -O3 -DSTATIC_LINK=Yes -DHAVE_SNPRINTF' AppLdflags='' diff --git a/project/jni/application/gemrb/AndroidData/override10.zip b/project/jni/application/gemrb/AndroidData/override10.zip new file mode 100644 index 0000000000000000000000000000000000000000..03db8032d1b0885b4b5cc69560d964068cc1d9bf GIT binary patch literal 799116 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/mkwxLH6d?^X0*2 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 z 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�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 z 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%0DM?roTNcER)LgSF9$e{U~jzMa@? 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 literal 0 HcmV?d00001 diff --git a/project/jni/application/gemrb/AndroidData/override4.zip b/project/jni/application/gemrb/AndroidData/override4.zip deleted file mode 100644 index 8c8645b43ec22ac1278884e77ac456b502dede89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684835 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�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%0Akaez-0Dc;E8_ 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 GFaQ9#%uHYa diff --git a/project/jni/application/gemrb/AndroidData/scripts10.zip b/project/jni/application/gemrb/AndroidData/scripts10.zip new file mode 100644 index 0000000000000000000000000000000000000000..0ba627309b332da0ad460ae7b87bc7a7911d7213 GIT binary patch literal 475246 zcmWIWW@h1H00Ge+dj}8=!`uuq4DO+x!O2CL1trD$p&^_M%&+`4{6V<1f}4Sn1*8&8 zfD92~U|`^202$(ya&TflGXukFHU+mh! z;?_&`Q@p<&o63AiX=W4)m%{FnB1MTKDT!^eY}TjN`|}%b+B0>DmX+h@Utg>5US4d+ zQ!jZ@dbn>n=>7;)5q*%X$I;mK{FANV6G6W{ttN>I9&XZ_FBVQ^S<%vx z`gmQyQR7+jLsq0p3My>uQdyMM@ci!STlW(q-CTkWZL^(X!rH&A#gt{U@S3$rzK%u~ zb9S{%4HA%K-SFtdY>!hnl?A%)v+fbR_`up{;sFuE9_9y3>x5UPa6j1UwcBy6`hk5h zM(+P#{Yf%lK4o>Q>H3Rh4o+Xb`<)izW4YD#B-he`?Z}~SX?xb)5;^t!`ehQg>h{#T z==gE(pJcvhW=80AkgJtX>io_lO4JoHpJ?FRSt;>UY~_7^4J?^KFlRlKob>){)* z?`*7F-s;_9n`q3`(IK?-*7y5+TV-}?_3@tR@X5HDalTq6z4_EBo~|do4;VdXxUKi_;G^Azw?<%-%{r>+w6at!C=ho$oV@i>9TTX z!IFrJGB3kbpC>VJ-}7L-f5TvA)U}k1yMAjJ-zY`Tbn^3xn?31tS_@xW#*W)uYc9-n z{OUR{>ypNkt5-#TIKKJAb)RG9)_-%RRXp<7(Pc^hqHn75^sR?hp~Usn?$uX&rr$WV z@pQqQ9r4Qp7tW~KdxHDXb@k)79lrnO)sfwF*mnbWX~rt&i<4hh#FxJCYrhuv;mwRA z?6O?3^?whVny1X3`}~MiS@sRFKJod5#m?I~n)+v$nzrco?d7dmoRTI{e}CuszKQ0W zd7fV4ev|+F%gHMfc5VEem}j-Kn&HL&jLcuM;!PpPZW{5}oVS==V`wV2&2Z6~$atTL zxdOY>EwBCg_AusXec2xij_-4i{@y9LzUa(D)y+5G z@*Lc;Van3f*?~42#cTBM<ZG%2L6q?srz5UvPf$uHP$frC;&ie0fDw{PVkpVc82B z4`#K7pANsv&-%NYjGkZ@Burk4qt4N_*Tf{_P*{gfp=5Q(fOVxvwx`g6`P!bE z8XGV9yIj(~(Zw^ZrFn^9aMY%DpWp;3j{biq)~YHctzK(+s=`GzW6PqIJ|Z2V{|siG zyQs5#(vb)0{D#qoX6R~$i!9~5WtN`htXy&98I$v21r5mq0Sn?5&3q8j6CkU7lU z>T@wv?Dh)AjRnu!w%@a1Nw4BBKbP~&=kRasBT1(|=+-W2RhzcN(D~?#$tp6R)xuUJ z7|r;aA9!eI+3~!J{2Tmt3#>SpB&v)H4wR=Yygk2vuH=u;GvBi|^RZkhFuGW6yJdq@ zXy<_+t|7u=s}DV`KC{dzsgOnblZWAI?^ALU#Tr$^&i)P(` zR3xu;h%Gd$G9TN%>`vRRXKs&mzOOb`;^bZNt@Fz5hQIE*!4luQ5Bx2^V0Fx6;mN3iHP1M2 zZPok6P}6yCqRzE*mr@)eZFhga`0j7!cf0qFZSjeB)KAM_vn!Y@c$NLRuE>W^|AKxi z$Q*wevGA(v!b@M|N`y{54k_I;<&)K^EK|OkUv3+opU*ya{;k!_zUs?X6IZ;pvG4oa zZM4wi`-igkU-qW6U75|HleOr+%M`&+tx3<^8=KTRRaGyFNl$k#G+cCP(ud$c9rct; z-?hBD680`y&hxZ!UjKUc&$%IT^O;YmKY3i#BxnC9;KA$ZO#j4WJ|2JCv?$VQp^Y}* zucmCxB-XICF}Vi>jYQ|n3R-o&YvWmw>W-DA&;9cE>^^F4UaBA6;Lzkl)kH)AFTJme|TO7RR65Sg^t@a@BNk zjU~y~oSo)HPEzePj*+pxEHT-67I#d|V#kvYH2mA&?K5FoCHawCIk#CR?8Tk9pSp4j z8aU-I-3hdQmX`59XV;Upb+gV-R{Z%>VA}E>ddU&fr?O1D=$Y(#-}%APkKg$0?#4g; z%&jXam%D$JI{)fBC!UL@?`&q(if?JIcS<)a5Ibk{rRm=p>Hg^BOxt(-Z@Ck-H}Cs` zqs9NOUV7i-^lOdmoc3#ilc#%Ux7+25ehm=*wL3fS=-18n_q81FKCxs~l9gcp&TCp? z3paN^>`R{6F>6s+`nkt{v_4+;tvK``bmHFXsRBVJOzOT-{AGrh5~k1JXU=P=*}d@k zeD>x&=VoQE68%vdkrouRE_u)E$v@ofKApdmdi6|2=fM^1Cdc?iq<;QoP&Cxl=Js6T zom^+%!N0sge)8IzdPk+TV{h%eu+E+@)o1F%i>1pxX8jEFjNTjL&Uk01*Y|mG=MP_) zt#>T$fA+)lLe6{Nqw=;3tqU#GwEimg?uaCB&WAs)1{~Q_v;*hs7S4Zgbp4f_!#}Tl z-Ww_5bB@2=!Ss&7q@}{4UH47|%zJeA&+2C<=j5*v+;Kbetj5)D^1H*TH1_lW%b%|SQBEe?o)u`O!TOLCHc=jjp+36hV65lX)Z)s9| zr?_>DK>*Y7*}HZvV#{PW>ZBwk_-OC0|8;k57l$X$eiBq#8ZCWWs`R_h_mb~6cNc5z z7Rz3JHg5C2{ROq=RSCBBFMl#hf%t+`#j5*1`GR0UT=0u3H{2tT-*#q`P_Nd8davjJWRpG!r`0EAf49 zeCDFk2RpjiWp4fI56DeSSJo^{GWwwtdu zTw`Y|^R(>$o;6SFg~4_8jjI!wZ>@1qc(J|Mw*M^aZLf_ts@OajqROt%-zR_9Z>Hs+ zBkz1p8?|5d&u=t~V*Lv2S_qX)%Rt*#<^g!NTj4y`KAT zm@5?a%rfWbey$r~(L3T3W9Qs_VA%e4ruYxfA>CKu(Z9XyZu4Cn_>|V&VeQ!esY$^k!g_+>r28{^Ory@GJudycYVqOPe1dj*PcD?vXj@8)!u#|vw!9EME)j&Aj5#TmV>hn&R*9bAvEdb z^z~P`!_TA~S$t;0zs169t~c60E%rZA^waCZi*sM+CLGs`SZpJDU&&ZxkMNH`i3*cz zyfqi^xh-I@Rbnqx_n-D-5}!}Aul%7G(zZMYs;5loJHGS{%e}I-OKJ)hpP76#cVeZ> z!c8X(`C{xRF>ma6A!w!~a?$LIYVM@{vF8s~Z1~NckS6EH)8;HMbl+mfx`b`&7ZMG` z9e7;+$jMf-`vvM-Cmqb&7Wd>*Q{gYEu9fqrdwc88Xy#A-sx$q{nVkn8XA9Ooxfdp| z{GgWkGx^Pq@00TbRz6Nz|EvDamvfQns&A^FFmqe$y)!CiQv4gQl=fKr(=X8_wgGKZ z7@mtP{IRK2b;lAGN7Icq*LH20q2Ho>^P*<(j?6QQRs2=G?=tzyEEqmAdDrr|&0um^!0bVJYyW@3d zU;6jmF^@K{-?9Bc<@t9zEq`b5gU>t!tSk!h=D%=)YP=cuMZyqM|CS(m#G zN-6M|d1olv{K^y5onTivOn)m z-eoqYI%=;a6x$l~v**|*9B1y6D|p1XMcU|r|LnR&VpCEzwtL#d@ASGL@xuFvpunP6!RIgZ`HE;5jpAS8k)_7Ye-oI#f)re1^S*&@fhI8)nLvC&# zZD!i#U=U+2TJ(k^yiGd>!6Tv*UoVVcX@`?DDr&EA^7{PM+u zYtpmcI8|C!CpV{>zmn`tUL-XqeQU^SD`zDZ zeLbtlj_0{+6HTNuo?fz;AilA;KSsh~apwG6o6kGsZBWyD>!57jf2YMNGQoyjPiN)_ zCG)wWZwds|*KE$>P>^7Dm|TD5xSQSjN77-ILAOp@afUCGtB(HpBx_qSdWr3UZ0_hy z_cOgaZ_6p!F28Q~@$6is0;`mZ(J>Ary>pAOsz5ZtD2S-*a5oSA6A%T-@ABgB8ZF043{ve<9K*NqCh zJaog=_8%)Wd;aZjUpt?Q|I1(7F0flK72%9~Upe6c%l2@c1$rXSUUJx&m$+n1m~;13 z>zob3t7@El+**Y>XMHw($ga;N%3YA4QtS8m@5+O5<{#&u5>43hVWvoV*_WR$p7_4u zN}teWcX+?r0{K++t#d}ae%v$J{MsW%hyPwB5Un*V-Y^uYp?*Y{^!|Cwu1 za?-iDBUr;^)r1#E+B81gvXN zkbt72t)ct7%~`DhfDAg~=*-Yp-2Z7jmw1Qm|fX z^z*EI1DnhxVF#~ho%C;(P5qFRE7G4lLHyRc>ekjr-l_h9V%-akt>mL--a58c`scJx z?*+R4`{f_JO%3&4cB8iJ;=Sy;Gw$`- zdwg&ZUnKf=NrLE(Xa)zmhsl z-+1wRz1;s`-sP>Q^ zoA)7^L1-G7sAUs%Sy{>_&!{aoudZ@I9`V!;_J2~K&I z7E?aG>9-!l>Caet(_!|K7SGA+D$8!we136tU#0c44VR^tY<{+G>HHV`*G{*FX`HS6 z^lbb7fB#-w-DkObulDCM17G#p8vA|q&+dOLTkSAs=Kn9-&94OaW;aYfVk-UOg6k*u zbH*SqxkM zyZFr6{ZL<_X^Ebpl)sJzZ`%~JHkI|W{R>O4x)y%wy821)Ly-*c!A~1mKb`w#BY){w zO{Raol)izy!VP{`W8d`E8Z>4<};tlR;V6Y_{L$~))l&+ zO}@A;bUWjBw^PRF%)I9veDgK;PoDg^KJj}^{Abzhw5k95d{;g@Q@wJ*S|(K6-QT9p$sbgNU%#8rb!tb-WyPx3)mOMHSu*EoY>HdcZxF8f z-f*u&S&@0*TBC*Qw`sLbRpaakn`ID{IsGMb4uQ z-7=B2#!}x>+r2f~J53j}hg_N4XgTx3U9LqDJ_!Y1E*E!SH8X0GxXCi<+^3noP6n?3 zwU=7uOPy@inzC6r_Vu>=t&AKODl&{VS=nZ%q@FzX?7*9E?a!CLoX}cv_EaCkq}TJd z-`Iazbt&&7=dIJH9Db3l?U8)+>Aclae>J_8qUXlO**yBqzVD}csL08hQxmAfQ(p-s|(#*da1dHT%2hUgc`{LeQua$LS;nMvv zQ;yG!-E+`8ieYY_r0ay|OFx;tU3W9~FXQtyn=-oNTbUjlt?T}mS0v2FeZ8zT-+sf3 zL}e8VXQP(6P26FJ-!5F{b9;_YV!K+o^6G4r#n0sTepzU{%UgaOTUz}B*=DwNx_=@c z)aT#3^JUGK%7m!vdzCI$n7o*Ijd$MX%IITr54U}rxW*|j%s${5tNqChLE$f4uFk4n zX1y!n>=pBGfeqWYp85|S7KU`d#d_==E;Y0jy<%ZtSjvOF1MZranp+7Q#C`3r;Sa*4 zsPjlm!+eV$SqRuZj=$)tmv-%B(x#JV^32$ic?w0Dr{qpLrMXms@s>pQBp0JUzjIGE z7*6QFwf0fN(s$S6*UztIv)$EktAH=jF4ZzPo8yz@X-$^yP&X0rYmz@|c8cYgg(v*x z%`lxkeZrZS$BI>c*qel2lax{`R!h|U;WL5t!TpsBL{#RlGFN)RyXGfX(4^)C!fI0! z&TG3iYAXDEQZAfvP(5eYHTTsuPOKU|i&jK zwA<9+x@khZ*ZJU}~H9Tc2J2ySztPJDEedg0rKlmi7zATw)+0n4=gMeE3;X1zr46rwne1zG;UOLERvC&uXNzN!l(Ba4rjOjHK@FDv;1(1 zz!AfecEJjRPm5H(9Iw@Hx@aNA`}hHq!ZIt(yZgRZa|a)ZD#&@zqIJk9^2(o%$5UoR znl)NhF15HeWmEW>ZilX(pSR8!%{%YYni0M21KSOeqIEJA!aSafeta~!xO>j>=0Cpr zGCPVcc0AFSG_wuM=o5%FbN!KbY-hoOvr8{Mv$t(XJ6$^a`McE1r3o_C%d}qW%oTPF zvVA!7nTrXo!f5yZP zeFfHL*$eYh8&mR;bZy&WbJ<_p% zX7=vFce~Vf&OLs=?dI;|(J@#5Z%!#Z!O1^r-bRy{6b(C97K^zFC9ixNgg*=8yaJUrrQz zK27lR`N+t9Ro`CU+lq+XpU~u7PU=U|O znRd?vO{oPXCZ`f8I@gBz=0EZP6`g@i-Fsgr{=DI7B>ncF#N>!1hMQ`Eek%-fU&uao zyX$N8=l9xeyvI~#y4;$o#Cj)mecayg*k!EcCDJ?(xPL?*GFry>AT@hh;D>F$r)cQ) zi0!B;7s%Ngn6OLii`85^7wM?9b1eVckDba$OxThrRMxbf^(IrD56e=8%0+P<3$_1ZlC&Gue@@?hQs#78$OMtJ z->IjPBsR}To0MdB@Yb)HcP@zP@K+x4Fy`=PGkDbDE%NxLZa~{}rgI1HbX@~QE@a?{-pz!Vcp-UpuM7~W@`+dcY zrKi>1e%JhS$^~lvA6~FD8h6giGYreMn0F~XN@3$$y;P1KTh2)fQ*9g@-p4(-m)vIj z;dtGbB{%#3WISqB>{-TWVNl$3qWpQXdc#ed8NSZzc?E)ey-t7Mw{3#LwP}kRv{!L> zr(XOld`oj;|veeaBM2Ce$&GV8vkzj zo>}*2OJUvPZM^ZjC0sViYj(+L@wj&gdJEJ|DbmZ4C|FtYqnv%g<=17_@w@)|U2m&= z@g!DqZG|&S=hnlo=ae$`_iM~3FTTI`btIeBfmW@&hKU^eSZySO_Be((RsOhbcm6KEYCfFN> znKWjaJxfWAs+a67JvDtr9&7Gl)^)t1FEsbD<(Txi-Sdw=EM{OV^xt51#bx@XIz=J;|$a1V@6#P;=Dl;MS70b>u>H`to1zL<`uEpz0uUt>Lrny2k$kgj(RMX39?wn%78SWQLHgU{Z zXs>H``|`~ssTXs?Mc3PhzyBV$cTpLe_{-T{HWNzvdyRG{JKAc8>?qNztP)N)_}2E- zga3NVuAU?NBO6v9IG1^jW$LDRUmaSMRr>>!&>hdoyyp1Z5 zi}bws_gDJ&Q@dx z)tA|ajlZ~^tC0!SiI4wSz9P#?{9w9P?Dt>Szb>HBwKkxe2zY2lu^1|m|yz)$( z^w4HT|GyNA+8CQ33;Q1>%vg}6zbVOb?y@&~|CVg5{__0t)bs8>bNm;T-tm3-afM94 z-}Nak`0KZ3sHJ${-&3lr62e!q|H$R=_w!CDySA*|XuF%qHCB4o52vqURpyzie!N?? z^zo@{vmeD~*H@lCC3JS7_^$2)(x%;KKXh)iz0J4ObXH_))3cJaw>I8|SD)?vv1F^< zd;_tZFEHqnZ;xg}jVMEyvvU9w}_%VqnnFXJC-TQjWQYdIksh5GcvsN@eCh z^7>@_PjsteRipSMQ_J+{7fvxwis<*gu_w?(N|Alm1M$ah+dS1)|NR(!_wDaPK53@; z{6#0WtX{SH^}0>33;w+R`0Q$QptSxHt2>jvK9TBk+&X<(Zq@n=o8^6HJLK=(%F}Pf zacSY~@Z&Wxl^0%^JPet3zVG9G%NN>@7Wd2kVxL(ZB)jnI)R%{jE$r{x$hIfOs-?ku z`n~Rl6Zk)PZ8tE_DL8Sc#P)d2jVcx&exB-&;rnjS(mV51JNniw?ne#nyDN@F?sk~| z=k(ixuG_bc80tvm%j*>L)fW5ZOjp>}SiRY_+*Rzuhf{)i66~|iGu{bUl3k&;)txYQ5XoV2YhIlwx@OnvtvX`8cL zoR5CS`J8TIXNsP#vptMkQ$eRD?Cb7}A?&FY{PU-tbdh}ZU0y&ew5|N4vEY<5Uym70 zG?;hNFz1SNtWu+6{-vGHJWr$EuKs2F_@CR=c3a=(*%w(vB(#NN-}?MM#d7TO$%-Xk z{TNIR%}9ErJxy0<;%`2h4O2h*1gtGivQv&{J99B-)yp%B zzA4))9&%Iq!|+Tf=hfB+M-4A}*vz`BmgN2`XQAME|EPkCZVHF%HU+$x)&9Wa(Xkk% zpVHky%UQ2q`6}_lf$`^-yVLq_rx)#J4faiJpEN^e*($Sl^B*ww9h__Z>{#*5f5lnV zd|M|tPu?N7Lpmu^uP9Id1^4EXU1>8Ob4K5i_^ht7^}qY1fbCa4w&b_QFUx9Qcm2va zof@&*-Uq+MHqG;i`S7q#)ZE9Y*!J-0NV8`?6$f`+x|lBOdRf(TxwNS52k9E7$V)c@ z*K5`a?S6P`!Y!4kXW|mh88`phMXjHza$JAew^<7^XZ~04d}C+Q?b@Q?Es@(X*DiAL&$v~#QC}E+O-t9aat7&od=gxgYLVkOt5=NW(bOeUw<=eh zo!sXdYm`)|nV`|`eN5TeTX*x-sI0dsSi+?EGB&X#qj6lAZd4Spc8EZZ(($;U|9GWYrE`&ZAZy8GVL zc~Nk6svbuY_p-}!}l1ePLA*$1+~6wK0x**WVPac*tp*B>1j%?$kv4N!C7X zVrkRaoDr&Kp@neyuQNv_BTmY9;8%fAyo^wCDoO(;jxK z&wo(zWtCd)yE5i{=H-yx9f9S&>B7Pc-0vh@h(u8V>?~3b4P=+!ED74);2X3 z?XYsuPe&(*O*+(@YO^boOL*z(z9XiqvTUS%Z#dTRoStfSrK(DZ+cuyu*2>-d%*n$q z`qact3xrz~SoNDWEem+F{JAxM;Y{1Zrlk><_a{W3oc~Sr|M`a3h8d{`ZpeNAWiFgr zppc-=k-Dbr%gZI~|68t9#qX5owcZrozeIH;92H%b0@@PJ?7v_nb+{`MB`=N zu|Pxo@aE%+xRbYyZtJNBh;G!{UNriY|Cu{8w|`0h^>;`6MxVEd zyz!g=bXgz&zx39vA7;+$=bz2hztvgs&y#13oW+*g2l=>}pQYVn+7{{ElKM`v_HpCo z^BZMf>e;?A zb&pW{`l7lg&-B!${Znt}bW002%2qGBd1KDv%!v~Jn-(r;df;=?*KJG0hJBqP9iq{p zhl?VwexJ6XyLC6G{K535@VD99XH1vTvzS@2=ix?X>4c0mclF!k zn*}Dp?5Eapq&cVFSlhJ4-6Y*Tt*6kcJ^ts!)#`s;GN<02{K=LhD=q$%;N1?DcrVTc z9p_y3?!Daov!^Q0uYdXS9gAxJzPmKjZ{^dO(isIzb~?oZ@|#r7&6SXTlC`nA-^cdQ zdzmFUYtuKM5Dw)oTzhD_|DC7Gt}JbGt(&&gecNzMKC`cK*{0c|@;jB3UH5G{tkS%$ zDE{&3gWPAIeb^AvuJhV^tNJv?%YlYo-L0L^d|kyhPguO6?I(w#aE!Hoo}GTBpy84r z8L9dIWEXC%YLWc2<;SMi52il$-sHuVd|K~U>qgdYfke)aD?ZBV{k;ET;#MoGcEj&8 z%6D$q`uF3uqYj4er2JiYp2*AU6p00`O}-I#ykKvR>#<#e?+j1mhhLrYx^BI8Mc%(l z8TEf8e5TH>xgmM!U~e&pql4#V(Y@xuyM2GK9x2_vyksVuaj_l;TkLk>r}MTuG;Zp4 zOcvgF#bYy%g{ht{E3ehWU3Rbf?sear$Szt?sp&6!Z%InJ&P_g7cb%19*Mm#f7u=h4 zpZBO#>#DtB@187S`ueAxWnp56TX0Fz#*eN~#Wv_Hn_3{w`1EY-(j#ANeZT4_-I^_T zY59Rkmw#P3dqk%0dh)b06@S?Z_a3R(n-L|~H_iK-#>~ulsqXtu?&UteyzAyE=4ziX zI|1)435!azX-U5&$C7LZ}K=PqABoTM(!atE?3E@3yE*0e>+`tMSuCNr+d!CuG{%! zfn}JQ>z;y3KSg7L@0?9v;C*Lj!h&-iZBABKj{SA^`B505X3SRd?GF$CcrktYw#t2?DIKD{L}8>HcVBSp4jd)5qVd z4u7^?efYGk*2XQLk|N*xc6nbds#jZjRrcI$d$&jHyFLl;eYE!PmYLq&d%XmMygD{d z@M=AIy?jr0bi3Rvf!ITrTyD0l|LcX`Iln3IG&_QUfuWFrfk6&Sqt@9sF+0^Kv$&*K zucV>`ysRBGv(s20sav`9)*V!wSJ$UF?_ZrmrTB4y;}zoP7ev*54>;L5x$2>Mf9*B1H;QOoQ-h*fDl5BaGBdhk1W1f{^Sx}xw0+Rs(WYpvR?-oCj~e& zb$jmmt(onhGSAE`dv?k5_uplHszq+{eKBwD+?8)3T%f$|>nx!($q;xk` zEE9Zornr9b>IYwV7{t#{^DmqC`^n5`CVO+arANxm4~Ab}ynjM?xqsL)XPaHy{v6mm z?RSHaw!*T_|JakalwQB~OjQ2uT+^=}3^7cva%&&u-H^Xt{{6tUh4V5e->l1w);8K0 zcIBgH!t4Xm^M9T%@twAw=OI^mf{U?2xZVX*=F_EhidUKn`}YK#Z{P1J%;Dmr)K&VZ zYDpHGMQ;BNYnRmrW8yhas2;TmUuP5hU{(a5^6xkA5=_rK2weMqbyM!9B`NPOpS`z^ znYBSx{&@H7mw%gHl+QouUTb&#z1aME#)u1IJ(t9#f;MflzRh%KgWCBLhtzj$9C!Mj zHA^43pnrVw$4AEJ{$=giAuY+abJn>|zqDU9hH`iOzgW(^dpvQ_sVbglH(q9I~)xPu2igRVf2EJx}mO4o^;!L8|=Gf<*YXuU51^+p% z;Vrzgz;9obn1ttpQ@2>&gv>A9aQ|xM+!7N8qq+KK9CtYwWISRbr4{N^cdrXqpT16B z;m2A(DPQ00J=ddn*ZRHVl@)JI+9B_s-d#N7fAypFHre7oPSicMYJ7fcqU;ZY)bzJ? zUmbPo681MO-F=%ww7u-vEA9(Y*8b0?9kX!w`}V(|NoUgt3*OI8;KfgRVSvLJa)1*(YR6Z}aIL{IohmWVT^L?I{JA%|SuatL$J0rJNld-x!Xsh6KOxU#RzGU7 zyuZ`2nO!)@DYa{+GRw*cQ~Y1!5O$GabXdHneB4T*R^x2-dt z?ETE6$9y8^P^7-y`EzcQzI)F5dSZ*p>&ahEu2|V?5_o%~o8{fW=lokwy4WwQULvIu znwe*@S$L`RM>d(P4{l5MCn-zZS4|TLKA0eS=)A(M#?IE2ENfQZ&$!~b{o;z1Z;gLW zT=mfuaX9a$M)_tlkz@Cz!x5ne;Y<tg?m{Z$?O8+TKtaFl?r{OtQ&R&9P}_dVE7{Q?y{mk z3~EJ%>QNIvt-I+_JW{kb0xi>MU>u(ayP7EP+m7-ij6|*g{-Z+ zYoAtda{HV&E!sANZ@Im3onfm5-=}p)bXQ!=`jY+W1ta$%KdyT$L{ByJC|&`by)iT7PjBzk-`TrhsN~hJ)hpszj&wNynBkFn$LxHei90f zQ_NTvq0`d)x@ieZxQX+cXMt0lEd3{6((Dgg8gwx6Q`6&__e73$ajlWgdLPiW%l&Lq zkKxBT*8Xlp-UC%oP-wxuOv%c30C}&TY`WvuM@6-6_$@7ecucN)Pc)Xnb8+(z=CVS*$RpLAUwehWWn2 z9~=XsgI%sFJu4P|r1ELrS&KD%AKoe^Ykx?;GCT7Aie8VqQH(+1y;pL?6~A8b(2!9( zlD_NLrjq@P_paXC);raG<>7_#3>oql3MZ&6{`kn^O>4TV#hietSi3J)k z34dDX!66eYe8NWsdEBP?IZi-uf{k&RH?d~lKlWlfbHM!-U&&A%={#s|)uSW%PuAlnIkU{nG?Y;SHRj!nEonn|WMj{V}^xO!E`SfWzJk5W_HN%D*j8dnyYhc^YMoni|Xt4Tw>?GlYGKu_g?>n zDW$o$i{|ynE`9COktU$RqG;%#?yPn%=H${AM{71MWwR}2(%DZL4#Jz+IZ`VJ|HalpxP_#z8Z-Ri&P4U>>^CrAlpr4%-Ep9tq@YuOy#_>A#Z`@kd z*oylsbQagQSO}d{b$sh88)Buh`0lLxd214$M-9@@>WXJq_}|Svuql5p#L81D&lr{BF8^+M%-IOmG{|1@kY?7kgs z`m_1}BB@6vy2f13q^3*G=6G^GDDBAS+Tz;6z+2MKj;G|vZ`hO3`P7xs$vik-q~Y79 zuSeIutX&w_bFeW-!ZCZF%TvvD7WGQ|j6VX!3gr5sCZWk_A4iPR(4m;wTeGta_n4wwf=4P>{?UVpDFqajhCb? zV?E{;PCQc)x#H4j?0DFl|sY3UTIL^5O-`Z1h?!}&( z)R1-G__1cHib(9d2P&yQx+Xb(>Nk?=TI5*LYsA!bNU^lbD8=>RgeqsnqQ$qvmK5IO z<+8pS<{msZ``EMimfJ70ZC#`1&!`p5^M3t3r0wwR>W`bOd%k}cm7lqJoxSthK!c|{ zzC;{VIFfEqzwy-K$f!yYnZ&Zghn$7E`)gQUN^E7=qC8#pSe;}Zzl_`9k^bf|noa$VGtq1!vAHDYa5w!i~8r5TeS4ednQ$AO*@y-3} zS8L+TaCO`PLDslE^Y6UUFq*b!qH?GG&k3j1`PiEBtIpfJ`rXqvpXK_Gy_#$$W!Jt$vtIc4Y*njy zf$g3CRZTxz*B9t-5OJDgdGF&5Ysal_H@41a;5emFE^udcn68(M&He@79yT8{V(XlPmg*Nx5*b17P_yWC4O&HqIS=eD2CQZrtC(h31vmyjhZeK)T)`}Sh^(odJfj# ztQXPyoN%l9K=ShY3=^lW*~dIPruq2>?HODt#DDd5`G}Im8$A zXmmVoRjX}&s_D=s)xB=h{Nq1jiW|+vGG9D=@$=(%p?|zCOdtNrn`C};vXuYVGI7I8 z0Xfd^^EQ9K#9hU*jj`fb#@u-#v2D&jPlQji5`Xl0(r()mZLv$c&a8amcD|rw>3x5( zJ5%Qw3vClWT6{I6IQQ#^GY>!PH2Qq@-u3F&qDulc&5${BqabJYnw9**wW`mbKTq@t z)L$&>Dw8KDKKI(h=&(;k_j2M7G4E>#s$+Nj`stK>O}dxC{`<8*&s;Y+6?1%R(-*PC zsr8Sa@`dDVSl`%k^e(f5I6vd9niFM{F3)|OnDNn5mJv8@hLFggnn5iEc;-`L^ zEUKO!uUYtkb=Cn@JKh6pYVS<`JJYv)hV-`SOu|~7+oIN)d~!Bee==gt|EZ?+^VNC} zd}%t>@0IkvC>P)PHei(cP-DuiW>` z`y>+1OXw-gv%kH$-_72IpEca0;!2XmzFOt0I>~ZgUt*G(_P&;}6}N9Ivt1?3rE!&O z`}I)8di5PgqLS<`o)LC*k)F9o#>vpg(qN~ol3>3emtpafqN+_j&C{I>I4?)>Opm^Q z?(4$}segW5F?`Ea4v2bbE)7~TN#xXxhvBztR!q?oFTZ?qQEZ~TPv!=5(ODPS*2~8J z4PRq5Enm0kRP5)wUkYnhFP@fo@L0w{Zs6rrpC9S3=9mp3=9m?SVplx zgIH;qIjMSyx%h^#PV4v^YWeA%($VNFFXSl<*${f+lJ<%xr&_p|r-(7KhME+84sP)A z1r1UqY;f6V=P}W4dbW$lgycQl=>;4V%zKjmiPmYEg$>5 zJ@AzEF~_@QD}_{-6!Il+yz3b@h3ibAyk5?4p+`deCt5}7lUDTbMcamB0sz9qxAqXilD zl5w}3xu;FMoR&Igd8*Rnkn$ZFvF~42ZgMn8_s+N3{Yv@@qvF+nED}3Kq!-NPyu^7( zif^{PWSjqj>SM+qdCU{GpVo9rR}@+S2p*Kzy%k{hM=Z6E<== zt^K)7L_Ry~du+sV%Rm2KKi$2y-$ec0mB@3C#V-oGEP3HGUun+?$+LGm%YN)Cm6zUA zF}p*p^yPt7!a=`uovbEb@%^-aLd5m=UfhBN#pZNAWb6f0tyNP-)gIA?xKYw=Y8sERuE52`7 z^|4stdi_C}Gyix|OR)|2-DlLWGcb5aF)+wrDa9O~l&NW{a+v z{Y;W4&E(-5&VRjq%5OP1*^R{x#e7()VE5p;O8}SRd>4P03;Z7ri5sXfa=hAPAe6JE zLt_Jn$AfuVj&|iYpSb4fGEL{|2=H=gm1mm2;;3(VM-sDE2m9WmCz6w2Y%t_?>bk>{ zdU|hxTdc%hjkax97R=9J$nD#ql4SFPVamgu4XUDw>lXGgbWUKo$e`z-J~1SkVZQe^ zu2;X9UQF-#oU;1q%tpNp4hPTukXbuZQQ_A2BR2eQB4Ubjb!?agCy2d!d+>evVaABN z>kINN`>x8?{B78BvFEX7>?MiLpT+%(2Del^8WbN3v+T&VJbQoQ;jA07)gMB$?r&qi z8@8YStu?#Oi^y{a^7yQ$G4EY?dH3t>ehj}tv{dhIzrEeSQD^>Q=2$7gXRRC0#v9I2 z%zC!dK-s%1Q8sv+%U+J2kH_AK8~3vZrz&1b)BD4a!^GInQz68o?|H<0ap#>#8{R$p z9}6?zBr0G$WMT#oz` zF=3*+v+w4lHPvD}{&224aE0xQa6#(*tcx#2#DV5Gee~9){84aTcdsA>mRP(9Q|p}uWd2mfB(;PHA}m?IVwYMuEXSt$9$h7MP7BhvkR}g>=oSK zZxFyK@k`Uqh#}ErZA$M2^C=!KsXsm2g~MMinZC9y*);lE>CQz{WtMDOA0A?E^2@0u zZrbfvGwhe{dJ+Rl6sc$9*{MmbVTH5hf*7aVg%JqFJnx#42A$p}6zuYSQwI42ZeKdcaPvoU1&zHN{ zS(z>8l3NqA(|b=zs!rUk0IiyY2GiD<*9C>*_xh0y!9*PS3QnfaP?N%jT^VQ z%AWp^*p?tvSUywa{vDgEZC||XR=o@ljlDL<@MU;W!!9*z`E1M8>$6tOT5!>crLfN8 z&gZJ8wuSRf_vpOcH0Q+9&z-V5oyRw51wLD+#ReZ zTP>J<-Zc2{%I6X)b95wp-xV&ruCK=vV6T#~?5^mv7N*k%OV0T^ug`V7v@!CfWVUNs z-*O~d`V-&1vVOHhbNg+%nQgy(Uw=FJ^G`wU_qA@zQxC+xUzlB* z+Up)DZM(QL)qINAi6jaAZIh;GA2*$Pn~P=koG%u2`L89r7Tz$uBIf0hT&nUTSRt}d z>*qF(La)|@hy5Do1ccQJ_Diwn+}KH%?}JSi&W zkabe4qWp6%1A|bbZvl?qwx4#MGJ$jJdZB_2vG;rz4^4c(wfRcMgQpeIlZ{_?_mqUL z%o2aT_3UDc``uP%Yx6c=H8gnnUPg1f!Si?P?oPFN>hSKrNwK73AL z>h5C~`%@0bJ??mYd22{fvBUk9nX#`nyUpMEGWPGE*o&{WC*O2EXEMe0|GsnTnZf%O z?fRs&VZzBf`?l}CUjCgw{>{GLW9z=od?S`C-*|6E-Ib1Qfos?HCT;3gnJM-2iPOyZr_ zA`jPXc=kFy?DkYSwksmqX3JV$Jr2!#Uyn{CUeDB zubEc6%WM8mhV^%*^csc#ZA^XlBYx`6w_^K3Z#>eux7_7l{69Xe`rC&;mIdaNZohiu z>XXHr{+>vE*k8RkZMuD5!0tSSQ)4G4(Z$u(9-vlkK(rn zu`n>a;KEU(=VYem<)-G9z$UCgwK)i*)#z(OZ|1!=6R6#`FDYyPiM?K0>92j8?M}QF zeRZNu<-USHqi(R7bf<}i)yn_-oNrCrlfoRO;GpyA%o)qg8yT5rwdYze&tKkSytPek zzOmoJ>FbRawQP~PAb5If%I8+5-IrUqukUTCaNIsES@Ykr&P`GrJ>qK`mWmX679E(s za)}7n#8u%+FJ;#p&}`F*ucZw1r#}5T`;>O0al)M)u^p z&oYrPR^RZM&2j?V{B?hlO*#*9%RM~E?X2G+|6X9V7*qaB?zbdRcA1 zeZr#kF$qlRA%fFHrO)<9oMW1qY8){^yerjLquMc!Md;0p^;dO-Yw|>tws}32-5|0f zfNzgioA06{nWh(atydAi`PzD^t(>2rDTCF*V2dI%INy0hLcZTB|4Obf|Q$`*3H&y&dY3vp>%%n$vjj$a@~W*<#ZiJ+?|RYfn{T z-}5p^Mmg%hw@=q)S1Esr`7p!BI4WY=_RrrA{P5XxX#RsJ!@us8lP2{&@aj4a4NhQ5SjEf(IvdGf#aTto-=is>rQ=Ze2`| zC3>GTuc{NuynZ%wZ{@X3S@njZ6JmmIidWdkumA1xoLk$ic5mGz;qJHPQf^l6x3`NToz5$-`XxD2eB1qMr$_#8J!SfvmS1@N zYw_9qbdx%%)^@dthh&RWE`3#AZ~LZ{f8wqU-xmJyUARef>&(Yyj_RNGcO5LevpQNd zA-bOZUOGd#2V>pAw5x{p7jJNTbylB{%d;zOIkLa7<8-e6mx!RdN$ksRY={f&V3E#d zKYT9new3AVZqD-cDhrqXUdS{(Ge0(dYo6b_ds^kkxvlm-Tz4t#ZNdiojy2W04^3;- z&#(JmS6%cq>_Oi8_r7g~qCZQ{)~Lu_F3Aa;v}13fKHt`wxYZ22<*8O@ZXGX^+P&Gj z=ljVeGToPT4{|LFKh!K=;?D1H|M!HuL6T~y_DOT?uNzjL$=8OHchkr%h{i@%JdrB8C zZt%FVYWdVv0z5lrADNST>*@XbH`G-2OetDz9oxD}WuBz{=QG{MMRzEkT)~-t&^z5^ zX%X+-62D-kxhbOUlRg%)M&;~$R?+rY(tYll*{IHi(3MTC6 zR!G{h@w5|5^QGRi;V@cD3vX1K2`ALq;3?j2z*Ev1N7jT%q@NPiR zv^eI4JI+1qENFax!GU?UubG%^g3Ox$ts62of>wqKzLuIWJ?8VL70-7z2QOG@wmZT5 zOIjn_#r^40#|;!W2&HW6lHJm|8wYHvhZzfnjn5ou>0C^a z3^wVp`)F`$k=YF{H z{!W$;olHw#RL_i_v2bmRVq>t9vlRE^&$eyB3Y#jpx<7O#L?}DW7YOGNOgmF)*d1wg zU2aj1-$T<2l1qH7KAh21>r83C=-j#K zo<2vl!1&uO7VdVA8#@1j^s;3a7r9^7tZq9Wpw0fIy~L99YqwaYV$I6iXl2Z;#*{C49bbOM?MryxRQ>Ml`{e6WFEXF>p6}7)@04@kDU)*hq#fnm zONDGV-d~tAapB}c@?D3r_VZ2a-Lm%_bJgDm+ufSu*1znNWBbba&^Zz1E=Dqeg8?RcZLcQVln&=1uFf7sTw%-($b&M(^RBH;nHT{a)*L zUXn+iO}Ta7*`Ok|vZ)C>f4n|1HK(mQ{QQD-^)>aS8%lVJcV8|&zE^=c_SC8~Pr7n5 zZ`>2P?BaMQ_H^(Gk-4wdgv=GVvE|v3b(X6<@7w>lH(xgN=hDwR7F=EX!h3;x-fig_ z>Fh>NmKN{4yj%KV&mpI&FZ|2G-m`8L|J9n-%w^TtS^NC!?dIL>>*u{Ut(Mh2-x>4q zO3A^$wti)Y_h=Lbt99k(O#k!h^^x5ZP1LUZ=U!kh%{@1I+ScEO`I?pM_JnSYIFx+; z&7bObJx##@-&FhLt0%tt5}UGqtzZKzktd36l-7piIY<7Z#e@mPhw~+_;O~|nMY?BPdpcy-M{cn!*%~?|MDAh z%Qwmi7ns^N=U?Hx?Hf*G+fxjmusLO}-?bRUCUv*w$I|iRfIr4$1W7rsSAK z%bjK3Zg}*i#7|jQo5%3>ysAw`|0NUuul^tT_0MY#tyve+C;6W7au42pB~n(`NzSce zt$mY@f4fPgIUL-CJ=pOI+}w#GHM{ zoDSc5W)s%Nm-lc*z3LwQjip^{9w(?|J@GJe;On2dxh?5PsnN^6ZKAVelV{f@MJ}_q zd-hi_pIg2({>ZgODpOR>e~}lxSo^7GI)CWp0Yl~Tz2(j*p|um@eN;f z|4xhgy;i?|--)GH8)pd?Z8{$sk}&0`ji_UMVM$Zmr75o>Ry;AQtActQmeVyA!*EAy;i3l@8>{^8 z-bbxB=9`!OyTHc4kSmFOTYPXyViBRX?cIpn{6}sA|9a|=c6f+dTCU`setK!3orJ*= zQN}LCOgly9*Bg32F8ek~=KsFU**ta3GNH@8rV5?BS37U!&6#t>i`m5E_3oL~oUEw{ zIJdw%Y_VEQ!_(bYme(*Z`|niC^epSG8$0O{!%Hhkyw{5H`lrUT&KKHiuH=o?<`$qGlxS1fK=J87+pXas|4JNIVhg#4zmzHNC7e>bJa ziOs92KfoFg-xa&b+~%wh>!Y7`E1nH|B%w-=2riw zraPiX?A@etA0yeA%#CNNH(YM0>?yyo^}(VQqR#(yIm%avySdjL%V^7(vAtpGXFr2g z#ZLDx>aahnNIcbgCi!2tjY86Qxjn3}n$GXwl4m?>eJIjy#)*6F!AD_+7A5QB%{HFFKExuvc5h3ax$y`{rU1KsuMkH=M?8h-TiGi$v`DDw0uGK*Yz2xs*kv5D=8bYX$P&o z_1H1~dR3_Cw*JL`A6NXpv1ZYiH606$>(_=}ytvkJfB%j5vz8q)_q7f`7sluI-FeXz zuUoGpHBFDGD^53ic*$bLLpPa)&t^Sd>QE)rc`w6oKKq%~nf5LByyn-GOpIcRb>CvJ zNac^z!`&;U9WWR8Z@swA^P_JIf67lT?*;qakA0YQ=xa}NG~>ZnH;U6-@^-IVovBnZ zYt>4nHr|?beLjo7CtN=&dZ1qMk)hVIN#!B;!xGw*9$Bf`SFFvp>zQ@gy*MShxlZp0 zQ`@4SR%;@kiRfS7Vk!ApcFwHY#W#&_-&B}>VEN&iSpxSE$#-_SlBdc86bo zUiIXX;=}7blVY@FcpTp}=a^05D6*12b%#s+$;YeS*TN->HgfL1>**nOb;X`#kvI5T z!atiw#FhMgwOa2L!$+=;UxrDKpWXhdnDm$BV|8HLn=zsk8JuV^htJLRxM?BJV@aWZyzUm6 zD>tLMwR`sLalstv$H{f)B9Fg}t~hg!{gXxP1L5W8+*UF(Q6N{S}}|9;p+qaY^$d<^PLNS zxs&&G-lb`s?@!)*Go>}GK0i56;Eb>4t~Kv-rIIp*Me80tEHi!5&7QwPKDpoV(}@ekW-1zqJ$lP8 z$UL8LXyV0fY!^36$?u#o_YI5JQK^5Cha?hD^Zk?*4qB3;9jNvA+6Ad;g-0s6eoMZU zjM}6u`-#siTAAnOo(+#5xy-V?%vsa;QC*_+rSz672Ub2?k?i8!*ZBMKOWwb;1umx9 zX+DfSqPBq3(ENJuov@u@N*0BlexFnCJg9hoX4<~RQ}?V0czXoW2!Cx3+d_h3}4vXcFzi&Jx|>0 zf5@i)vd@DaeS5$4ijLy5c~M<8eCY~2t?>#XJ{1$?bp(%ovE)=yPfjaZV)bM}{qy;2 z+nD};n7r<0WI){%&%X^*rITMJy~?osH|LFT*7*~C>YfQZ4_YK0`KobR-|&n(yG3I3 zpOqgZPftp&o)w)Edi#yU*!cIEymJr!y!~0U_?glH{#%k;ZYEu5DBi%_ z&mNO|fGf==Awf56-|7~ZiOVALROX)*oiZzRh14-sp65Cj-*^|ESM#!VKKO7>`-Uk= zYIj*5xceKiE&Ooh*3>s#W=X8V<_ss7*@R5GzgC2K-2vWZ`(66Pl1}aA)m_`9IeEc_ z?xZ5YrVoqs-@fCx%jUDo?n`*N-F%03{|Eu2D`gkW*R~d$weI#^Qs66S;mJ~wP~g@kuw#_{f1jnrH5^w}s9%_}7rQ)8Js6<=T{e z9BG0MQ+$mpSno7DXvkihl-#fJam$PqbEgF#|28+~MZoF>6QpZC8$R!IDl{oPYim;f zmRqqjqa$GA4{_n1tffhF!u5K)_>_;U1V}wiOewEQd(9*`$Ju?yj5Il)qf+1Z{dd2- zAE8}253Yf9w>?nN)WpWfec=!|&zjQ>}b@l~^xcC2~1Ve^vAR*hHO z?JL)3>xtSHFM3WzyY6 zeEX%?UcBdByhgMr;JfI;DdGzYHXP%2+pyK?GOya1{52xew$7WFWxUllbY+z8bJmk= z58H#DescbL*m$?tJkvYd)*8Cm2jw|ok|Ce!|x@^+NeJP1QdOmG^f9_E2(`7ev zqhw{P{ubs3)Xj?Nx;xKKthC8ny-&C>!T7vDW^Y$ShiyV1--9(*?|uB_r^mc0?03c! z^S%el>{s}sTO@tm6@S0Y-j;Jbr({i7oJix$L=Cmbk~s_HT|eEkXn67|`R(Cy#Z1Hb zn%|5!&QX-yc_QXbN~A|1K-GkczPS zHanU3vBz&;g{p~q;UXHPH*1%j&TzQXC;Qu9J8S!5hgGH(?0<4swZ*?bz4967jX2Jj zd#eB0ZNnyBTP=EMZ}OJrKLwHJJZy8dmRr6kwc;&ysC6~omYZ5pbUR$I{@UZ<-fNvY zi&dAbJQSdlyXT@!lAicG<)B%7cHCYU>m;B1=!!p&+n+nNJ925xkw6xg_G*)#Q``TX zJ05fA#@(>@X@9Pk<-Ez6GTCQsiop3!^|TG&(t}^FJGlI(q4KJ;CBE@3*3Eo34 z?bqsToT4%mzg_RV^w%?RUtG(*j~wy)j)eHV`mkd8w35tq+r0cAe0i)Gs%3w9_mZ2> zg`cp#Ij$u8MELn($1qz9S-vC-UYA3zOMi2?bv;&?pmY0ao|)mzLj7RdO;Z?6xc>YQ zs-5!V-rKi1`J9~E$G`vOws{}4^!~}bs)tK=2<>4J)4%z|X32NM2R4Vkt6g|IOQLdh z+QlO4oxIN*mWj)+={WvW>9;_~oQ$12zc4L6exiJnzCv$#()HVnGh9VftFvG5H&5DI z&g<8H_uFMlzK@5ds5-ir#ifQNsd%PcI`v#^)6xGE56)WY@WtUq>Fxhd%`QLoyj$G2 zCHdRiyjP0LBkO;8ELIX+e)V%iQOt~v6nVAjY;m<*g(o=Y%9sV*6t4ZHcjLb8&%y~7 zcdO6r6*#@xUi16zr|tKr{+!{TH~Y-wZ@V)J%jQ(vGtIg{l-uSSvz)S9BQHlSmCE4d^p8aEfX=D5hU(fWN+e+>iGA?<#=3dOVO&>g0 zhN_vmt_*)TpKYej3K_eSx%XE-6!&AS+LRy{x$|82YJJX{IlHF_ouB#pe#!KIF8Ah` z8kWr7aV2Hm`%O1*EpPehvi&T#-R(<;H~;X?zP8OX_R(P-yVB`$h0p$+POj&=eCx_p zU89)uI%yN+j90u3lvsQC&W&ffD?HQkYYs368B7zIz|Q{Rm0j_h`5dVi-cMS8W~KJT29FJZ#D+45HFW~Mx`27w>HkLh%u z(TJ=r*|$xrfidA^`@1KZ26F}0{+Ir_pw}&`{?l!L25xV*y`p+pW~Da zR^d82T`$^*J;s}zB_k+4eVTg3Ki+AVnNR6V*7>qtWZKmQZ?rEg6=uGoc7Il6-`_)) zEH`>N>XmZ*a*nT`kgvzA`f={vt1TC2e_hicB>i0UQV65R_WcnGUpDeTXn53kmho@% zQ;WRTJJ$31ADov8%v!Z7wyIi(g zg8S}O-VlZd*9#LxXXIMl54bsZsZ39<_T3*$FZlikYaIAxwNC$y_8+6S+vYsIw6U4( zWA38!Ic7d2lzKX3hS&a--7|7;h%`*y}g zvRA-yOQBPI?b)SO7w&w0DI_yXnEhB-F6XO9@3)ovX8nFpzO9O(efN`7qVFY`X0JQ9 zO@Mbt{SBqUgqfNbrp>fikZ{RTa?J|a=Q~37>CV{`agN7F<65wyp^2!_d_9>h&K|8f zlLHhlhH8oU9bj^nB{fBdd|%i2{EaX9@bM@|@=>mpt1Pa!eRr?*RLzq)Xv4ND^4Ep8 z+u7yq{$G+Ue_uVfsG}rHe}-q`7KO^&D(A~ZlG1Y%LRLLeQMePfPN>^A zVTW0D*v^7Y^(?n8i-~xdB);5ax}aba^L}L+)mOuq#%U=;51qqJ;IP+1*Vw0*B03tv}%Wz^(6v-jc|7a%opf($*Il zMgLwt#W7M1?_3iU!$!A-a?Yk2H!tTlUsMpUwy6n!+p5bKcUp@KV zhU;&8gwi5kPRlbY_`|&_+VaJ_%>BH-{G;~UUYo~$`Cp3o({*PUE;j$WTDbD0tGk8X zVZ)U%cUxY17~J3SIs4~3zoU@_EHh01eYejl-h5@#-j@IS>+55Wotwauvu2f|?5&>2 zGxd+Xb)Ovw;=H6-eJI7cQHD<{X&SShURLM~{%i7)$sfKSbqi~j{Jo(5jJnJEtBX!Sw;_|cQ3M)=J9*Ov*7iMO~f05fheeLuz?rar-d8d|m&ARyY zW6ky{c0a`LMmg`g$ME~H@LbmprPQE%Crm^x+$eWU_1fyTH;`HU$DepSX1rN=Y7A6E}Ck*^Ie^LchS{btp(rzuhPu=+w?kccBOW}u?1|}wSGHndsy2H zq^cg~S!-;Vo2}j9uh#OmpKaHX-Ijj>r}!T&veHPgJXPveFSsS=e#M=a9Fwk{)?sEo zxwYz6g$|2V?J?fH9jo=PsNd_7;@Kg-P;SF(u^ZZA+xC7vbCvgl?XI8J`hLrTtG&C@ zGuRm|SKN?H+V!C55tG%?Sxp;?q|1+6d}R7EqiVzEN%DtQ_3V$~bQ0)#_>(a__eOkC zvxrWLhm+PX_ivro4;=XOQy@-9*w18PN5j9fA7rO9`^?A>Z0u3&S6>-Z^kG5TwBVxD zMxhr>e)n@Tx;dIYzIPIkSujEIMg8rVBPDjnx4h8qz4GE{#2l`$@7pH$DL#9g<+@>F z_22UhD+}_L7k2~-T=Ly`Vy4tutt7d#O!@LxcAC3N-3!usb>p?@Q?<*_T{Ty(dZJx* z`%q`WuFkFoZ+14rOHmQCo-}OrIq~sJ98>ce7Mm{Z8BPEHznfd-`A@r=*|hg)i(tU> zx%LfSCmR^z`s$sm9Zv~AH2=sP&^0$!>z(e6>?!>I*C!R1Jq->0F~4%Bfd6X`PQhue z3upV6vq$yVbnkS2&11xRanIDg0^vrvBa22|s;)A4w;0#IUAG>uua|u%$g+Lg_0VPWSvTb`dD`YJa(*^b z@!AE#H_VkEP1ve-{pcIl9ij%AKNV-H&padEvVE(!(2hAzi-WGI$8IrQ8hN@T;2>A6 z$rsVjrLWhi85D5^$MEtTzH?>Cyn~5`FC-*NRJiY$a-Yn*;9?@Bp(*+F)zhUHUYES; z*{r1bj#sp?se8sA_mWB8PcJh@turw)o)qKNx2}1$jKC>b(`P%68@nu>c%AR*p&TdA zD?f!k?2CN1{Ohj%zt8#J9QF|Cd$dDHrdTSlCPZP<2brTsonJiux%}7F#-fvVWU}^` z$gwTEhMbcI?|}*RgK% zqRPlKo_G8hb+&KF3UBA)<`=G9dg^iLNr$~kt*4T;r?0vq&8{JS%rDaXFiT6NopGPI zZouW)^_CZyy-U~eJrQy7ek)$T@$u9}sRxC=8%+*WRsGi1mtk~DPwqg{Bx9kge+_o_ zo)r(VWBYriWzoG84`(F_PYOP~k@NZjou4MN4=rr230ThYLnp#x?tAZVx0z>TY**DO zy&_qDFzU5msiUq=eoq7^O;*Ay2kg|*Ohb#L>HXu`4$AByuO#zX zjbF(vSE;<55%;u^`;x2VxuUk&%J!>H>fXB{Ha&6Yih}3K>!&yGRG5=5bo`IV2K(B5 z?|azzZ>2O%Tv<~X=)CRZX1-`0n_Y+X8?U`OpeI)4b?=tJisy~brZ~>up|eD2`nfC5 zj?P>aGiPD>XW1M7KNRzNK0E&CNM%ypM`3e&gQ*H@9S?lU^W5mPC}n!;Lg${z@&|N9 z^qrnJRIGY)T<3aLP`B<(|Fh@q?3LDyF*k17{!_wZ|s+q3xO z`xj5h8NP2$$7!9pba#pNBb#spGgley>gL7lFf6sW< z(846LJo5b9K$!)7o)^8PZTa2)%rNFi{O_O;y50Gh;oE@F{JeEW%0~^;cds$Oq?Ubo z=bp6E6!XhI-24Bu%#%DmZ{4(04_5PkPF!+)f#9)O%D*c@dyV(Z%y2%nIk{d@enz^L z_o3|q+n>xmYkR!DpIiUsf4f+cmo9Smd4g@q=GF^Q=kI>par?Cm|E<&$hYvq9v}jtM_rGv=?TxoR zQJinrUNmW$?il;scxi>lSNFZU_M8d*`;h5iX!?f38&{lgo>XyGr)%l1t;{B$UwzVg zmt3C7(X6&ZK4KZ`{%2y!7Q489YS>LU_S!{i@nyFTnI<;L-7apSkMb2isZBibVvC^C z`?aPKeaY`HNrqnB-+WG6b>g`fTb>qud3odE%hrXrLquW^f4Vg7`yuPJLk5SJJz%>L zW*l~G)89LaN9(uNO|Ctdy7~v>n=L5|-zYv%S-+-m(+|Gz4W@EsReRaj-k#lOHD`B6 zRL)!b{#}6aqPD%*0p4ruX0VIzG2C&Pe+>50}njs&;1z7dQbmS;QlYRT(j0L z+O)#(TyTl~f(PrIUX?kdp4}|--?&4wY-K)A?+>+b5rxCg&edPzxiI7Z_OxT-Ef22- zDmBgEjdxDT(AJ)Q@Z9bdy>j#CXgIL$z47kwFJELaZnH79RRa(7=T)~T7Lzpi1i+#&%l)6btyxK3VHHFw&c_UG!1y@7lA zS4r>t$7(k1U}U!mgGXBex0Gk_M!%vjCR;Dw@eM9q#LI14o6CIB{qB2{D{Yh1j5e-F zdGTY%lOLyY&VTB1>Wq03YQS@C=c=^Wdq3n>U7a<_sg(Ph$eD)B`4XqTE{h62!CJX? z>g1E#4|6rXX5n9*G%Jzi#}3uRO5g1bCZBsP;~Meh?lzk%d50o zueaffNc}>k^V5z!dV6c%VpYCrg|R)!A4_}KWJK-;v8fz-=&P{DQ7p+#-}+Gcu|Inq zpQPRmY!Yl)^!kshB!`=mLHU!%%jX&ksm!gG-l^UFSwY{!@ZXHi`{#bos?#<9Ch{a@ zS#|ZpCzk_5;`+j`q)%*W5E7}IBQQ~zd)m3ulOMnB=Dv4Uw6gfq>GTJ=D>g6U?R?_< zbjFHvw#UDEUu0IjIPd9HNxtK=N_J%>dfs39|KL*B10hEr>FX<3i6-3*TRl1Wr^jcH z>s+sJveym!*lKXADf@GBB-FNfn=v<$6{?m&U3lw5| zHc0Ayv{O{hXh%sLXLPLG;RT#F>wNb+)_J@S z`MJ%j><-uNzNM=!^;s|k$u4@#)^f?CZLMpQcitSO%c4hI<5C}1D6Z!{=X>4kvq03O z8Q&f2qUXq;)3%pkb9wrH$(NGP8Ooo!c`iQqdd4O>|HZ5XHj^u{|JQ!jiof_l?V*5B z+*JV^=KC`k`(!rTXK?NeS)5nTeA&tPW58*@vS;1(_K(ZHd~Bb8(e%^0_;&jmt~OQ^ z*L`pJ9=tVJHo>iZN4cDxW239(t=ns(o;kO^JstD#&!!)ZopVmSD$cL^AZ}vTsv>g4 zxnW9tU*AAZ7+q7&_kI$P1OEVuY*J~1gc15PGvGA#z>G^%zpJ{#1oiF|C-Sv4Z zt6SpXW#aXx`FN)2?hME^2)>{t@@8I$rsKMB!@xVi=iOBotF?)0at7Cb)=FVC>arC) ze5ulVPg}-gW`;G3sw=`yJ0DrOL-5F+552NshAk1fGiq~xJh{90+nvnp{k`{v=QRJ} z)cNE2ujaeSjJ|u_oc~4gw{8@_RQyq(UH9cW@kjfg6c)=CE{ZIuxZeJK{#{k;RK_yp zP4kr0owyXdjz%i|(ssS8rpy~~a#!k(Y8Ej$SLL9UOXq$#*m50#f0or) z%xKZOQ#WqN@0fi2fw|TSPDies16+0dT=M&$Rc~nDUb#)~O|I(dnqr0g`$y|?UQM_^ zQ_6^0|JHj2{<^Mie*ux36}(|~AI=uD988r-ohE|L)0x3vc~5d1SUM(fNA4X32~Dj;A(%dtI0HD*Sqr)IZ^AGmJXB zduIAO9hs_K87%Z~^}qV;@XMDicwElEUH>9Ye=S##cckLNvkSR7COCK$Jlb+gB~@B? zk&x!2_v`QbytVjtqcCvdDaFc};?~BGf4pAGUfVJ!KI3qcMvLLCEBUwOzD3_+4loq> zp|RV^c(<9(=FJzMZRUFuYT|IFQoD?eNj^0^Bkg)yYMI%sgo)8}=3d_#%EMxJYTbo1 z>v&JU$=RY=`8UQ#yCLjMII8gV+PLyU=eXkz4<5fUw_bm_jroniEU~6TWf`v|SJ!i_ zo3VjUp>y`Sr*n*tZGM-`s4~&jPd(Y@vYnWNP-GWFH`h@x>l8yb*G@2NRY33B>iKpG znL6F_M&1v9&2SG|vRi_a-%Dj(_fM6Va&Cv>g*sm++IjA3)_pR)weX?U4F5^*;=3JO z#MagSRC)PsD+f!;!(Gz@V&BA`o4wqpTr1bnpe1rm_Pj{z<1634U_-o z)zi24yQZ)IUmO0`Kb3peyDQc1`<`u7-YavoEOqYU3w_6=r!0@2c*T$ZC`YUFzq=D( zrzP^gH+Xf-`i9_4KCb%1^AeX>m6e{leK%v(`R03^Pf~i9l`jx*`xm3vQerKb8K09U z#h2q*TK_49`)lbe+l{W?$0b*8O5Zc{q;>J{WkPE6c{qi0Jxw+8y`P+MSx}a2ySb{W z$w&IM;nyoBNmo8jC{-;tcHS1LUR{rc7;5BcyM1(|F(VWO@$xb@tC&s z&e5lDF9*4vP<1VKmHW=x`)KoClcu>pW^d_C-1~FS{Sc3m@BGtG@4oME?%ne7>*G(A zi$c|{?eux=zqp&(`c!{V6nNG0dz$sm*|Cjxg6m5h+<0t5e_VT+ekjuRfMdF|U|~SM z{EVPym2a&lE)DLyuk$94Z_*c?k2$l>9DP}#re_3;*HEFp$Tb=rfqkT{_^^K z^@54>KOAY#N_%nB{oR|AMbk}$XH0c}{U<`+V&3^%iKb_2XH}Ox>k+*Wb7WoU|2gyf zU)AK@Uq8R7q|N2p%LBUvzmdydVQaeJa*e}&uS(XUm;J!`nr_xeU0H!l%3 zyQ;QqmsX$Ku9mQ5k*=qkD~opMr&V2a&)xAUCj9Nfp=B-nQylX;o+;Q)B$InWpKz%#7?8!=>yG>R9hI^*LT`+`+hCy!rIn3H5S=T zF72(enpB?i`lV#`eLTT(T`k;A{8oZSj{0o}dFvY;Tem&fd1u1o{Z{)W&nSfYN54?s ztvO@D-?^!gN&XpGr)FPDWm|Xjwo%ySwz0?~mp#{}Jn1auTvB8BfBWX3)z0rHWalf- zae5YTYnO%eN%y3$^KYko$(^rvKi{hCW8ooJr&|5W7ZaZrEt_$A&dcXZuN^zOd0lS! zzgNun9;ZCA^_jP)vs>j;b@(|2-4?;j?GK&T?^=AkV4_Yl>z;{+4_`kP*Z1F+Lt@jz zY70**Yd<$jv#h1AW-_&9@8WLj_3DeCsBrwI-G2D@iYwphp4^Gu$Lw4adOK*#6;*4& z>cGpk+It_=ANu|A^Gx!g#^=0*gdH=WT|k3hR*WegY*<|Eu*M<}x!d z++xFixCAtDnh;8zA+hW_-<+@0mKAAXoNP1?>~Z_UqcZt)Vvn7kBU>+EY`Ih^&{r+v1ryyFvor7Wv=Z9&XY1aKY_CY!zk!Rrw>>H7PTsxtWXM{>nQIHyrfG}l&PrG1 zo^`6J^lXRNj@$FEO6$G+d4sK|mhGn{vy}7)F7@7h%F{kX-`c!3@iH&Rx#@ExosFhd z9s0RNcjjFF*UHzG7wS(xagbkozevQSE4puwy$LwW*0SQg!qi3S%a%P`6{slDu+;zM zr@u8@mt=f%nZHPx8?<4xFyGGd%g$&r@Krnzo5snwEf#TI3%&!Hcz4zSI5f zei!bVqgv_rxYA8fcTvvFW2-Z#Tuhp(`>fJP;nYp_r?Gp;G=CH~25qB;WP?}-6tdW>)Sb^Y}-Bz%fbr0D+?V7a@^ zp=RHtsGOM!q0d9RV;twJ7G9_o6Pqt`LSTQYM{AOH_XMxo9y6xKJG;q7FOGM*#i{DW zX^<87J9*3c#-i+G?rr}bDEw#h7tjv89&_3H*BrI@Y6OraI33M#m432t1VKknm6||PBSTv{5|&o^QCo5>$@1jXVfH?=>EMO*}eBj z*3Y~9UTy1LxHo{;Bw)6#{D*G`A6}jiSHHHds;l(Ai!Af#Dnr-W+d6D8~mM%)8|vVEcHz#KEIm_*fTx3z*XE+!&$MkTY3hdDh0` z6|=wU-HL7g^L_5oB}=ljL-*a-{eEv{e%hU8*07JZcN|o>^>*easC|!7IdmxT1s^oH3RY>w-1$UMm_v*lKH7~@_sDZw7CH=UVt92RGt zn8DI(X&&}DHdk;5tJ-J(=T1{kRbJe&IO^GogF&L*yNnieeLkMFb?GJ{Q{fFO%bU_S zJdyNjK9Ux4d+to3;v1&vhwfN<=|>`r3vYCgYa z^IAt)nYI3L(hK&*%xvDTwx8`xbS7-$Jv9D@qEihYl4_v0JlU zvt_k-1>a+fn5Fu{hi(O3)Ro&9`sk`-fzUFaS)NiewLBgaiuucT2;Or)tx;R}?s?#@ zS*o08t{b*&;CyT{D{p!t&+Obik?NZn9h%Nf$-ck8nwvERZ3GhbNf+pR;KADEVGVw_{LTy^8C^O-`wtLPJKRo-Q%z`UncFXgSIDPGzX)|Yk z`1j`4$>#kx+%B{7{FXC~&%CX-KRmgz8hw@eGJ5MT3jwpnW97Uh|zHr|~y`O^Bh=Nk*N3a*RE>0Gcgd|NKOFlYPw z(o3%?Z@3Y$65d0Ko~^FOR;uBKNzcSonEf@yeOimnzN| zzq97F?Av#DuXsh$A~g;EykIE|&-(LQ|H7j$=)@k?rQP&hH=hqxn2JH>xVPKHOvNzB(w;;c$#4R%i zer^$HO%VvAtt;9Z77eNZ>yGVz#36TW%^e*T-&=WGR>>r-P-W6FJL|SO)Z_reE;Dw{TkQ3G>n+x!#`~td$^6>c-xJJeFt2lpSd_2nY~g=?CeNp=>a0wh6@S@F zH}i-}rk&Wzi%C07=CmlP9p9hY_AE6Qk7dOg5z>*_ zUpz94W^T;O4&v4hYhADH6vuUP^W=%*jD4ObeBS!#3Y_KP61?B-AtY54wX9~7k4*-{ zw0DPpIF}1dzF)bZdjI|J)*la>Zb(~JaC&~_I?prWoefDxmdtcHd4+}RT~pm-W|cp) zH^?62zxF##qP$6CQQCHYyRU!hWX#xd_xta4+<(2d$#_vm^zxiv`{qW^a=0F&*qEF* z!{d_8GxjOQt?4Icq`jHBc#X2&yoch81+AVv&zh!Tc~*&Ko5w@bPEOBMo2rXUzDZXK zO%-FWTz3B7cg|+l8s;NUf}57OvlXn!=;FL$F1&P$ySbLBSlx5stLI*Sy|wz6>)Ll0 z6+UfVG3QjqF%#*VT>i%Ei@%=Od8vY7t>cZ1xz|^n`=wCLa?WM7<-=Fg9t(af0Zq_r zz1}a$)Ol0OeR|R3JBEtyTV+;@|7yRe!mmzkOG@7UYj^N0wXBXe;>T=mZQs)RChGHx15?~vWshs7E}S2!Y`O2a zn}43AcfifX+qceg4>wI&wMG2N!YRA^ExLC&vOd4F_Rx_)yRrt|JTuLL*Uzsy7cA3A zynKbX+1=u6g>lE@yyqLm%^o@0|JYT3>!n>=d7bu$U3-sfbgX^bd_?|d?(74avf;_$ zdB;7!mwx5Qt=;0DxA)t-SC96uw6C@T`y0Y zocmer|Q?Z#i0&JMH-`7vj5 zn7-f1b8dZ!Uf~T2~amvGKN8egRF3_@6H$0QS`>f9X zn#hMASZ!83(N{~iz0H3#=a9_M{ZG=?w*qp8n5H}SpB&y&mN3$ ze84QWp7Z*hRq~k|9SVL_{r~qj?aX2YSrexzvAa^O^&MX2pK`VJigYZidS0)2QZxUP zvCWzY+rpRAx>px{T@c@O?986c^;QbfHWv?@{VzWGRZChoKv4BmjwM5zozdHAZxbtD z2QhDI`!2NY(XG2Lj(Rh^(7tNd%y+Q;tL&^>SEqO9=ErD1z3NvK<=-Q~r(RzCG;rtT zx23-ecZaUK#D70<^ZmC+LRayaS{+!o==EK$w~A-a`@CJSS9f&o`dbgd1_pj^&Z*->`1? z6mPfYi*6Yjo;Oa{{dzs`Vl-1v{^Z-MyR@fHa#cBY})J~mwjCS+#qg4!S4f) z_iu_^Afx!TBJuZzPd}Q|^%(V^%OyYfT=^lT>Wy;F52>_e+;W?9>_5EuU3%aE-+_{~ z`@1eryR+%JbX3%CvCj$zf|;J_);=gMEWSGX!A8B$KJ09-tB=ofygtwHdisvrM>c1k zjW^(aXP)FdTScN($YHi}yzz#ezXfOXp0}+?nb-flpo`~_vs0f`0spErhotHQ;ak?W zZOUWlo&3f|^QukY1*Y4gIpQ^~w{#{bzWSbG&3DH*;&;xzGLt6_TMXXztp7dP@WtNf z8Ltj6yeECX&Lyfu(k`{%r)bl3?c;98R!mOc^}^iFoz48%hRR;+FQ@&s8}Cznd3$c* zd5PWycjcS-m}@QGnW)Fsax|YTxF9d7&Y`Bds5p2N>7?TUB&Rxok7b)-f9;JoJ3%)Ik#q?=V9xaL24cVxa4 z+s8L9&E~u+MtAl3q-sSJEH`D`E>5{$X7Sx*$CEmTC+1dH{H1$;6+T{b??QsnB~Q)P zHwG{7yinKpZ}`Lbd>pHtto`G>2Zij@o^c&5)&1x4@a*(SbDUNL2mt-o8s~_ zW&bVLcoF-K)oAyl*`CW!PWOH%Cbld{Om))IqXyGw@+;ou?~R(7)T~<;RB9 z@MU+3*D%G#x9pi8U9#rVSH^kIW|jpk(5qh%k;CWQlX3ZA@xrLz3qs^%>iP|ZP7AIV z*^x0p+&NH7!f<1#-z>iGk@JmgY_?lPeNa#FWf#n>;kq0CX!qpK*9DiI8dV~n2{_J* zJUKc2sK}R_ORuo0mgb~P^LpyBq_M|(9B5uFTQ8;qIlPD4!6xx&;46;jpgE7y+zSeZIt9s z@3>-{<}`Iiw!>~yi`Cf%Z12+|qt1ez{BiGDfStH&_Ix>s5JP;@{A` zsMfVyc0uO-dC8yV?q6=>{ab(EiTCZVG$)Du)slI2T+VgELtWqFH#3+TRPV~_oU8e+ z-?-`aV^5CqsFHd4cDFb(I&9tV!teS;*mU&4NKw^ zYq+!zG8jM8=~lVD`wuMOocJ^W_3wA6f_z24I&CGT+kUTdfQ zrrB1Sx2Bsj>9U~ctUQAw*F|(0Tee2LUy|dnu|O)+i+jn zzB}Dz=X@m-zN1%f_4iypl76`E`?|aNer`_N);HL2=m%t}g?_E?moobF=jO)4KIU_b z{w4co`)$ABFPmI-{dIqD;Ij|uTc3Zq_h0%#5y!t166xaqB+AyUJ02MGV%pT66W?-j zzN$x5Et(r^#vfJFdo}Zc;eGyxU&L$z*ZhiRbe&jY?^#(k?fT;lGTb@=R~(s|eD;L} zFK9OF6q`3oyG!;)>}1tfYfi@Q;#OxZQNQLbZ=T})?}XF*(}(|UPz;zK>SD;u{Q$)4HRslHk(sIw_5T+5$Z+BCODBZPe(nv9MbDol$Je{Pd8MIcP2l>(R2UWc3tY(-G7Gr#pUBg zZ&}P(+u6iEe_X-4=C1nXrTNhjNbw%gPgT#Lkm1be3Uzcx{Z#d6%vD1Dw_#HhR;}qVd&{nnj^7QLWE_Huud7r551G$X^Lu4ei{iKS{8lDV~)WRFX9 z9lBbQK11>M6B}EHb1|wKg5TcUeYtz@A+xV>mtQPP{p#}lmiFtLjGNM=l4dTk-&g6L z{{GF@k1Q&x7dA(KGBeow^l}`Zzk;aD*%J@!65qZs)%@F6cBf;qY23bmtyiuedh=1} zmqX~D#`n`gPDSjqy&imQ-p>;)q#F`J<(yF%d}U|Z7f6riqBYXn|RgnSm%ok zFJ)3RGS!9RrljBTyYYJJf5y1TSF4XKU(AsEEx^`x^?v*HnU=eigrEJ;NhxT&pxZg| zMZu{J9{MU;&PP)hmM!>oe)h_l`_5n5&!aJO^;C|K$(MJ$QF=Ki)|2_$rIk0YEsT8W zllR(V-Jj_kmAj9>)}PgpE8npHh7@FSJV@+wRlrT64)^>s`zF%1fiPwS!ahnO&VG zxs|_Nnvp2MdU^J=y3j)#I#`zfP24{9Z^yKQO6MOIUOryF(0Z}CS(~A~?(MBlJJzdm z-CoC;5qqsVbI$(LmWS&N`+c`QXx_0z(uVoOz7OKoZP^#|WuBWH?W{9d@rNC?x6i|F za?+fYfx%Z4`_PwLYHCVSVsbWtX6M$3*!))(A~kt+M+1K|Y3G?=c)#|Yv(rLXZ^nri z^5$y^%X~09a>DTKr}y72czp}FKE`IM$|=l~Jb&YyC8v6U|MX<>ItP8e$TLsatUk^; zDq?lI)I~-78t0auS;{wR6c=7w=X`qG`2+D6dMt(h2shinav z)|U29%^X$S()-#Pjwrn7Q4QMgGAbxR$iwEh?c9u$={k2-c)zZ2WA&Kh8nn@;q5Wn5 z?}IGMdsiw5_FTK%!FnN`u~)b&r>S^#_Q|Gm3A;QwW1k*4E#okKvEIa<Ol!KpE4lFvrQ7>8bu)M$oy%_!Nuc?{Q8)92OAw&Ay67F)iFd*2}wZjmE3@;Y4! zUWs!r6v&zeFmC*C=d*m9u>72Z+&0#aHyVG4&lA)ZmvMh-{Wm1(bm)-)31d#7$J0Iv zu*z9K{>E%1v;F$}pZce2w?F5%n#X?kp@fWtW%B;(^S;bA>`{As@xtplOcfzBgHCU+ z&sB6;t9qPuPM~MRl$x}NP2l~P7I~NF z|CvXU{~P8fMBDv!w`!VX*1z;YVAa`K7X{i1=TDAY`>(y!r2mIVc*^v<482*A?l1o= z@A}>;skp1GC#+5R{|?6M+wL}a-(DB(uBvXewJg|aZdJ&mF5OJtR~9#w1@l8H1cSHV z_dk30rR~(2>u=4RwV~r1-=XzWE9SGWS~O#Y`D>{^8~*f8`Y!L0&|fK{+P*dVtI{=F zj=WpD6Sl_O^O}2-<@^nH0@8B-`b+GtK)`6Kum!F;1oEQ=EGtrnsFG2f^N%_HJ zX>%OzDvO>jiu=zLb|XV{!ZA6U&d|+!6+X@hli0c9{UYriDM z`UBBr=e#SD!~1nOGejoN_*8n-EB2~sMeFKrp?f#3emEQJy=D%(ddAAstjQAU29Dal zp9WPnOb8R~T`07|d+W2Uwd>9ux|V5oVb9J>?7IYKst3F-joUb3-!9?%@_cdctzy$J zeU~4 zcz#(GJ?X=*y}Qpvc&=F9_`7f6F=0W!Ngov6>cm$w)YiP{=#xGh^mE;|ea!dI?T)_8 zdq#TIlW&_hzE^%Sb!_yDC!L#D zb=)_4hgNGX+P=@L_FT-NyQ>q$Hn^M)UgkWZH+Qqx?D>tCmHwR0T-o@qsbhEiQGVhre593RBUYT3(c;xQ-B(a@mPAk8+ny#CwY{HNV? zi}}horh{QZ^06l;^(k$#yyl-9=kV|R%73h=WpURs#q(jT3=CDg*k{GvLp{BM{NOi^ zzw_7d2Vt~f*R|pG{z{$#e`o&`5j~TZ=qgii_s!hrs>+Kt1*#alIhJ!KEk!C*c9*CB z;^Vcys;?UJtk|)$xPOL4N%;P%udlyuaJ7~%OXIe_$i;t8Y;ITP|BkX1i;o3)?q0BM z*Ho{7YAb)G)x17YRoe_cl_jmbv?}QG_wO2WI{u`be_?I7>7E$R;ZC2-v@dHrm$e+< zDA*KayRCnsAp4dJ#Zs{oI0jlWgmc3X)HCsXG$y<+{l;j+{`_S#pxzxSSY-0f!~;L~;a zdsSX0&zhBPOv#DLGnYi33D-#HO7rxY{K9d;8f8WK1KNuOt)AV#s&nzxHCK+?pah)vb^NcppRJT`EG$WRa%P!N!jh?`Rtv4SG$vmP)NNrK7hIgP<-=yV z{@}#eZtqfQ-_1{@+Juc(Y?v~2+S_2Z2n(y%m4$t;mLIC?on&dl=fo3rV`s+n?2vy_ zbNFvR)p~pBcaEbggVH|J)gpD;KEle7uK6TDEvkcHcy) zo}i0rU&9s!7oNPd-REz2R)MZpq}=%wodU712Zaje-PjoU@}yVo3ZWD`Ip5ZON=W#^Fx2|tZipxsk57O;NP3yroW#2-cakewxWX1 zX=)nd+`zhXKQjN!P4?RnZZ#`JgKgzD&c*Eiw5%T_|+>OUk)65(%@2sC~yfyypcFRD;Acv{PmM^=%fW&uJoB?qS)yG3ebT84Crj42lbYQ7Ssujg5)IKbnt56F#Qu%DN}jd7_gj;0 zvpxIp$wdZhCZ;6WOv#zsJAJmtzU511ao;=oHYX_IZs+^=I}6rCykF04sCD#W)AohB zqUpPCKRKtVYgBtsn6xBPFGsdfK!^A}utHx5rNIy~jzC%-ad&zI1+cc%5JN^yei>f2wwYI9kxbNr|Or=6i;m-p7(TF7=SUh;Xo z+OL?zIK^E@#jl-jJMz?oKS_6$eVtm+?8kTi{eOJ-5dVr9?>}#BdA24_ZEro&tsbC} zT2DW>d=oYXhKr)uM{1pO5{u!d_Jhi35JoGf-$vvX-vXV3R(Dj)PQ=uRb&f@*Y`NPW z%UK5xD0Cd3Z_{3Kz_Pv1a_*Z??{}9wDID0LmU)T)ZBP1|>37rb&%0|I*p$6X!t4Rh zo{UpU%fc@7rRglX5T`OnLvgK;$p(i+}W})Ztc9o8GhGiF>A_YELbDN)%Q%N zZK;T{r&z=EU{B2>Nvq~{ESbJRh?7Ny$5L_j4vS|jGIPBBE7E4UqEDFH!o{{9uFE;NE9eFK zxJ-AD+&BG$M{3Xa0QZKi6HON}J2}nNc)N{d5>;v8-GYajjvK`H8?aJ6b}nCZJ)m0$d0?7%k8bO z#4Gy1EU%3WHJ2CNa58E8dOF@{<+2DJ7ZW96zvRX#0GRH|oNl3x40qo|&z^B)H&kyGq#1xtsp( z4xLeGc(Ce8h-}2`$S}pjMh`>Rt^DPavNL0z*xSvsLT`ND`6!q<{+xT1;in(>Uwm$v z7Hn-Q{bp;YTx5Vru}`+fye%%ProWtVATH58+bZBolK*e-`kpZMjMKmGCX44QgE<7vMAD=wjD zm9t+fvVS}A;=nb5Z@-t7mQD42X|Qj~BPsh<=>;`AGj8p9aiBfxYGZd+Xz+N z;M|Lxdf%;aug)CSsCwu7yY9w2k@D;`v-wQ1^I|H(!`)AO`Oa*te&d+&{9D3D_8%1J zFXdZO$XD>@$nLBgU-M+T6{2tP8N9uB&hn8*U)KA#dmgAAxV3xx*6!x;^Aq>H{5I?D zy5=wM__to2d-#mt>Z(KU-mxct`Sa*+`+dGR+w?70-|cw(E+hLYzrb|!jyv;K_qqP@ zJ1sAFxUVz*#(GO7Md34d-JP40*_Yk={VV$L$;s1_w*`LZFS}N^EN+=Uzo_x2H`BhR z+Um}J`E>G<&f`gKy&?O)R;~T__HX+6?-!o$t=*UUcH(A@V}$~@Hcs|ntBGR!f8Xu? zzFxkxgpC%{e7XaVs_*Q=6yE)KTA&T-qm}sqUzF) zlhYi%rttp1zDLsiPR;#@);HeIJ5rN>Y>mj|x@d0utWbKBYFS3H-xJf`bKRAVF@1Aa z@dk7;drtGdoAxVw`j^|!0@W{R-C1LD#IdzT?+V|uhRLE+t#lV$PP%ov@l{;PY~BzTuUkLC4J4?MON zv^uN3KfBMidB^;~zgMT0`uP20vDy=IXuGSlSIg$eEeFosUh-8RwZHISzq*G469dC8 zX6$1(fu)%x?nw7bfhr*oMyrUX2K)BkG7zyb-=DN(@0+m3Lt&vyi%xAi;Fi>==Gd{= zGp-~0xSuThl=}PW)4H6aSDrm7|M}V3J%#TKD(o|=!X?jkKj7nDHCdfU;B`>e%c?V9 z0<#XSc{iotm{CgBtb3=DpBC8H9(bJbMKaR$`l(*i`x@m3Wtlg7ZOd3=85P((eW|Kb zwpY2>G_@DL?J*e0DnSM5D>(gzs z)&$%rVOK5IN%h;Mx=!rQ?fF|pMJ>KeZ`v6?Ax<~h1!Q_O$+X^n$vvvaP!%;8w_#P#RLzqQ*mX0A4~InXp`!m8TO zd!AcFhb`j@dE_FK?f2=(E|#J?!~fG}8vUv$JaOYThx!E7Erp8b!agY%KKpL6^VhWW z6YtIC+kTj&O}KDhl;5_LC%tQ@&dj=XJsTD0`MkFIV|wUCp^Y5xF?sjL0=G>*Et~N< zTm7!n6_XTp=K0BsTmEZu)pty*D_K&U^yGiN#kE`#)UXQv-TTORZ@+{5!LD+9wtDeQ^Py(qCDBQu#$>u2wbz~EOF zBFE=H4W4sR{Km_#)07^>rprgMr06j@Kip+!DcY2x%R8BEZ_RJp+=G`)T3?)b*Yh}| zxbFX)Ka=My+1sEO*(>{lZEu1jv(~l?d~q2L3-;dnF)v|H38U_|dquxCi3H?@9xys9 zGRJm@K0Ca;JhUF zP1crsdJ5n9+Y&EaBzNrQS#UVuy6_ZMa|exW#TCjnNB$plYK&F4c4d}m-=w~1i{*yW zmQaK1x(oC*D_6=?S{<;wpfD|VlWAXCXOqRg@>jn<_#_BVI(p1JfHC>uLi3%{e(DMQ zat{y6^}jv%)({Wic zDea%kw0qJAGv^BaYOAa?I4ru@Jl&2v?vY?pPS!)-3#=?Y5+BZK>IohEw7IjyYChY# z`!|;|e$`^DJh-}l*>0x8fs35QHST|ue9UH{BNF&yFKV3w^oh z^xm(N&N=N+Ke((V&RB2K*0`vGZB6gClzSJfpCC}yTR+9C`b8sK@i)Hu#>iO{?jL$~ zBzvPn!L#G%y^1$ABwk3rw;#lgE8> zG4nd#%MERrVFp2dE^eoLW3DXqX4$n(DfPg%OObZPn)|$utXmtiTJh15tBkUob9)`C z`-Q*qJp5&H>yND8lY2DjXrZE8_Mb_ED-c zGEC2IcKG$^wR?QLu4<^J@4a?%S)?UL=_>c;*E1ttXXGdgM_Ws2KNZjyy$2)b^*zAJlsoz>y}_RIV{m$|v0ov`KjZ+F@CiOw%|tgPQ@KJQx}%(rgQ&-04M z=k73?+OthO%fvMK{<%dRNBB$^y*tw*(WjgKo6c4& zO4#CC$QtKm>brB@iW$PoBC=itFVncOM)StCgOfG4x;SP;3Pr!vvz2LWQ~sL4|761B zwkxZ>+-~!m&blSI{kQaYa@p6l zJL{{so#%{+Xgc?%;gyBp^s71rhdP%vUAV8s^&w&Yk+ltHSO4%$N^j-5bW7`SI4}2_ z72VUs&vdLWRygjhUai^xsZ(z1>g#DW3GaXVO0Tk?Wx8_qmW|i8%<4LJBVdB;R`#`J z_Z#Le{Q0}iW!uNMAs!0RKNwf28B_`X=sLx5ID0=iPq1yu$6ReC-1%W zU%s(_dgWV@l*azuGul{Rm-czR>x_S}M!#sQf8i(B*Cum>T&2#1yA-+p+H!(1XvLz5 z-A-!d_pR0zHHfUrPzhF;y!XY6lW%4w$)2qVak`n^Ht*a#&1)BZJj5pPnV!|`Z(w4* z8(OTPD61}|e3O}#%PQ@JP`mq)!jd1q0u`4sKXR$#IL%t!6u=Ev~=UdN;4% zan}UBML&G*9lLy>-#$TpO(SF1W0%WYHRkhQKWS^Vz3|eb5BE#an=ikDd$mki85rdG zu-7EPrAa}F$%xzUKus4AMr*z-4f8F2WFcVtIR0X)UfSbCMfuH}XWwczRC}z&rXj61 zRamu$=a!+E>dBLz-fvHB?&TC-F?W?r)77fKzrIeN^})s5k>9Ry{xO}@EcUovNt&$r zlT}>`6HN|2y*)Q!^;V|Sxd(HX7qeeBy?cKS$3OnwDHmN1zntZHgKM8q3iFSA9Szo# z$zR=AYFlK_D=2Al>`DpZ+;&2Qby>rb)Ax(rrT3+L^s7I0NmX>gh3-X3%8kc=_AkH4 zb9Y(D1QxZMN{NCzkuJfWAI%)^|C$|hSyiX(XKQ1cz&ptU4a$0fJ`MrC%3OIGnCSI@UzPLtE;Bj@bClfc< z%q4}>Zgezk`|!qpe_wiVft&t^H!O|Dv-a66S{qetvvmCyhosrLhXf>&g;b7C`6$7- zud?yCXugGQ{R{tili!W@vXzM(&4mnnK64UY?cTgl_&|!7&#{Hq**I3JEq(fX=QaW5 zYi)}gyjO8}rwD%LUKXshIfXO(lb7LI!PNC9x*b|Xi(}6T&0F`0;@!&iVXMo7{A-+4aQ?R@?99 zJrDlA?()_|F{{cDH{&Q_N2R$BL(lDM;NR@(prm!MYSzzpmk-yTK44O?u*=LK>7aRo zdu>;4OWNk8#aM3`j(k7QT`hbte zm%~P%SNKZrE3q=Gc~=tUwpi@QOI>g6kQ+N@sJ5yd7ur%h|E>Berhn6%?bC#a>sv{I^vzK9KwJj|EdRrtAt8*}8f!k689pv$qpgIXZ=1`n1>b zn8o|E%PxP+kh7?*kNK0|ul~7k!FrL0Q`QK4v=*FpQ+d)W=Hm4yJ91vQKYUgE`pip) z&N_8Zx3$*R>GzmqpQs3zyx+de?_vDx>3+Ee8#nLW8RoHh=K|+)e+g;T15v*upB_5d z$o8vX?n#>uY*X3SE?Q^$nqzI5gqF-qb)jnI<>p_0nOgI^&#~Hgc)w>u@R~OVI~N4K zTlxF%>&)MOt&)A_DXaGD7@waP``~HnjUyiyZ@((t7cP@-n8zTaXcWycx8tzfWR+zn z`A%$-sC0e5N!3KYAVIN1E;6NCIagcaSbwr!zF79ujTu*uuxhQ1L4eo_!?!C7B zUa)M<`_HT7Cb3@K{O|(vGv0SI7R}f%v{U?f(bO9gn76KbFJuM&EzR>+3FnrV7KUGc_4IF_ z$KC__odHuT9{(4se7wtOJ!^nS)#I+9<7Ee4)-B}Ox8=c&bypVsF1Y{qj+L#|^u+6u zJMVok@aT2R-9EQ`mAFr8*sndm{~Vuge_ytCP3_%pGW++L7o;7|bp7zx$?kkmdwo)L z&|i(%Q2kl8`X${(tF?=F2D!a>8ld)7rl!XKw%qv(wGq2~W~5Y|w)?&K-;c_Fclm3t z2%KdJo$1l7e!Q?T?&k*$@#jm|hR3ft8q^wp;YM5D>y|pn+HKdmxyDMwnT1+zf zzhA1eTR*O5;r)fz&T1$IO{@FIjM|aRJiRVDnTLVltO^5zJeDQ@pdD}iWvNAFnW^Ql zg#e(E7=+PE({FfNyubz2G~sU{u!gE$Yz|r@S#d# z`>nhG>+af4n$YsWvV7}wuO^er@2`K^!uK#tr~P^Xi)^`GtYprDr*>Z94%s`));LtQ zI%ll9dTerkH$&H1p({R{`5w1&7_!g%wR}VKAw{M>@k{Mfm&@5^bN;aS-og-nwpskN zuzcd;YYEYM6-jD;4@|yXs^Gwuuyb?#jEg~MpVT;eXP2wla7^%4*t3*B>zw}fy_}m$ zThlEKBK&1Dox^V(`pTLVePZ^tKdmzkmK^5Dos=Nr#gN-tverTCyD~@TZ#f(8^T*3q zC^k;;^w`LAs(F#EpCxW>C6cH4}pF=w}PopadbQ?@W{#aSlKMRod@3KO&v z-gf`IrK!x?(z<@`$L0T0czW-d|F|W=C%yOM_I?g&9g%lk=?gVaK0P(jL!$JPj(F^{ zXC4oVvv2%qk?4Kxx83-k+okQ+kK?jUn#$@qcqL5Q9{Uwv%H>HkkmUQdIE*zx#Y4mB ze%;uiC*B$C?(~*D6B)pqLal!`upyO%v~FrmO7N5Gcdm*v@Sop!1|>~$Leh=$69*l zTZ#D<$uSAq;+*R>JvF1O9eFx)5@xJqm^p;vLmQfbo z^x&PctLieHWwq6dZQ6eb@3uSkWwVIB=$AObr&;%=ak2K8J!Q4J&8=hl?heNqu|w?z zpZDII@QBfsOXzfKK=*o$=Bh?*1McLHwiy+NvKE=mE2_wK=@R(Pa)&{)Vj9o7>x@-8 zEW+AF+NWK0M)Gu6d^+e%Ymo zjUs!Ds}5bcVz7FugZgf%t?9b0h4DK|uUskWVD}EOu(4_Jboe1XV}0!GM+fxJ9FdXQ zEV(l3h|`14N=ch*t8*8Idrfa;<|&BTd1MFIwRzl3Ynrr^G1DcfVu7H? z43U3qp(T}lf0#3qmvkmgVteXPe?h))_jb1^pZOWSTdld-MYLm=&b#*H!0xQCkDhGd z`BJ>BUhm6!%l~s`{V9&So*()*c)z|(z`@B@X)8K7%l9rZ((aOR6mzP;-#+wA;lzWW3%noy=sWXom99AS{kv47s@|vnna{;ON*r@u z%A!4Y+ljQ-uQz;LXqVFL%b@r`T5e8BRPx4+*ZdgHPuqMfwMau(eM0p8+=I2E69p6- zCFdt6UUpGeOI!6VQ6_Z%VzFaeLyoDkNw|tHvvU(T7UaM4(LSHsvUW`pO--xo3X3K+ z?l|`9;BS#q_2WJq(kwBl!I=u1WEc~7TsxN?YV6$nT0z+H)z{0LKNqVBO?T&cV$W?Q z^TX#<|FWXG1uc;uX5R>4ThenNbM~smsoU6pOwqAI7)-F_(E z<}7#mRoyhf+TOYTk?n%q7U$LHF3mN1JHx_NST|t*vWLYs(%0Efs8nvgn7wUR=dTIV z`W~0>U+8>4_~KgCwE@0a^5OlmudM!jmo`<3w_iPX=^xkFslpfk%>R0~Szi3xrMej< zce$@78|ueTeDgKy^zN5hyY}j>*zobtlw(igJ{@(GpY?KCMZR3T!qbhWr6rD>*)9g9 zE8Ol#o^buX(QNCkUl$jph1(Y{-@VX%{_i^nZrNSF91~HI{VV*-3+eAEY-iUcy|gR7 z?enopuyT4t^p==AGio;ONxIT7eZxfq{jHgs=W@qIw(mXmT#PBuL9+0Miu9cm)2~Kt zt#iuj3QpBuQdx7XJ@ra!aGmPEL|!1yDK;^dpo1pt3dx3iYN0=2K452%=*fhr1G9! zQ&odeKqmTOPSzir=11q{(^Q%3+LR_~Fkk%1nw2qk@(q)hs}H~AmulYi=kKut`(>nj zpRSqyF6_Ixo6yz@RSTA`YWZbizF8Ub^Y0dkZF|khw*L_)Yi3{dN#(oeWPEJxH_GUk zZ|05g)Z51te&GrCdf$rIuFC=^dVRFmm6YVR`L;wa&xWsBzLQHfuDg;Z=F6XX%lxi_ zPAdm*2}9+t62B!qUmkMxHAWRQo;5bTa9q)IOT&!Id-|eYOfcJcv2@-J1=U%hh6jQI z)f$TC@-lJz-}<1!EHCG}z%XIe9n*;mRthJ1=nLIFTAkQtbY@C6O9T7ty$xTxBwv1% zU8ES>8{Eitsn^B%Cg<^Gn*;fMgufhee0$nS$#GVZuGxi)!tQdXf8Lns8k2K+W9Fk{ zkIi>wAJJR&Vs_V;&WUq4Pp>=>a3ia8*X1LZjtcKAyZqp%w3Ic+dc_ZN`Nr>+9cT6) zb$nWUdGXODOD}v7ohSF|=WONqEIoCvOHSSuRatj<&N1V&H_oi+_&dc`I+#&HyyKQ+ ztYJxKMe>ttCf-^VHi;?Dx4ibdl`lOZl;$EovBEb${roW=?X&6k zA9~yn*_deT@h$mMm2r~GVI#3uLK1SkNe+fi4`jKL7N?|C?p%6^e{Sd3%T-rvzWSWu zzkB)4gq2AXLH{* zot5|F#*E8c6~q6-hGK4dxt<}y+a?F85mqSv0s7Un_rfh3ZIR5@2}wx z!sxx0FwpX4fm*fwNiOk+wBD*c{Z^NA)Y-#1UxiD9Gxc{1PvL>;=H49U>Gk`QnOVKw zw{N-RWi#Q-Ok?BpKHl&T9^#qO>l7cVKK991d}e%1^GJ87>y`=UL|u}0PR%j9{=kiQ z$Jf7VPl|V)m+|<>KR4?+SL4q)nh{=xlT#RfY@ITtNoeUk0nhh|+F=H&GAg<=E=}?c zo5gh5q2l9m-7NyF+S{L9?Gg`ZI;J)2R4Y^9t@h*h1Wp%ed9pTNU6K_1Vw2|6t|YUA zx1Prze&El*KXW>5H)mk$GA~d7cY4J-6a4%N*e@p(Ez_+*r zk!6`TPRG9!T>YGBafxraPtL|Q5<-uCCKbfY)R_1{({J(m8G_p;=S|u_=9T<_Uq9r%Zf*{FYN^40j`wScq`g%DZRuclfo=4P`xZ za@M1$)%b_r^xCAAWxOUk3yUajsjs;*E88pykYvD|Xhbx(m91pL3*?-|qK5cKO=< z53ihyu9^Mv-aO|#qg8>sSXsrHr$3(KB){?=d(3~KoS9li!FfXc8@Cq9{h!;ODbu%k zhqQafg}k1~=B}LE+P$}b818;)Xmq_bY=4uP;4cM>zoPFBC%(CURA%bN{5!iYeo{QQ z$jYhr>rBf-FIGvG{@vUvaW5oCY0JVg>4dVV%k7uaC&+QVHhQvp;l^@S!w)`7R!gr9 zOAyL_W%PMwi1wM!2TsK77O;xZ)6|c78q5BEJtKFESEuH=ln&uNq5H4f{`aYEHeQ+c zVWnhEo%RpIs`Bru7MFiWaP6zfifdWJ`rtw1H-q!P_ZEtLTeRb~W4*z<<-E^xgM@=p}my7dgLbK z?MtducLr~E|F<>2`qkCdPrvb5+&%mMwMEa0u+!V`-`{*+(l@vM=Zs7pzFPK!dPQ2^ zhpsP4s?ZHC7q`jSsJ-yRezy-=6Rtilu?$ms^Sb5Ymhz~C6WZ0ya(T{oocVKS_^L){ zZJ+m0ziXBGIqyAsANPO${?@+nGS`15#P|oO4C$8G^ywZm149-E_T^l``FZJtijdxr z(|M0A1Z<+?FBa&1aysdCGUd788^^#WJq-3No_=QP&C@hyTN`Cg2r>HiJNHt4x*Ye9 zgo&X?U#(Nqe=t#RbM=mvmg_ynd)sE5ms~EOf4eP1aV~eqku2StH46{+Ru#PcZ62WW zV%kivkNUb>iyIFl9TZu!WQO-9mOs(nUXGnn`vpDUC+J3LaI$-9FWZu`IV?Cqievr1 zE$q6kM_+A?%&K%%&9HF|-Wj5h_4}j6tOpzCcwKV1bxtbmP{Y(I+FdzK>9b9@E)YF) zZQ2EMzE5kJUvOVhoyA$lKIP%QmT)c6y2GYiIs7-ZsuWaqxJcg?I&$hl)r(Tz8`GIT zziOW<&$XtZP#7|vt-(>QtsoUqr$ms3m zbzJ!IZ_K%qlMYRv*L;#=rMdaxl}jTIJyxk)P_cPM)7xkAea0f|d+dzkI?aDb*DPOf zzf?oBljVAlN!i(?5XUs$t@r(0vn4(^Donlo`%%fW-WiGR{Yz{tE`NOBaiq}d+O?^H zHw1!$>WX*2D6pvWdbEyxe$D;n{Wbfam-y+Hh1(VbR#S5QZGARC8DEIuzSN}@}i)L1I7c^|W%`BX;d~q53 z`~_sn&a=ABF1kJ9wrFsopZ$#kp_Q{oV8GFF73s>w{OJ-mzEt4`|$Je+1#PZ99*NV^89{F+Pr7_pP zOFZ$0{5)n;LsrVq{9{_meSf3>+<&vOHdx=gdBWcCsLzY@CtoD~v8na?lwv$@(yOqd z<;nVQ?`_+=JjOx;C=6q*Ra5!wEk?f9J+o_M+*Vqsu#6Tnqol;)+t21-HA4G>0aa%>HcEnejzP|LS}(dj)8#LT0~d@59xv-M%gK7j?_W?i`UHM>AO<+x1YH}Q|HMV$`ij>!>) zX3y^leaJq***Jss(dEZaPH_D7xX|L@2Em7M9E($=g5=q*s0aE?c$=8>QzveMq>s7gLVZ~aYxWE2D_(P+ zT2!qda@}$bXa7g@ErAK*Da%(dK3-7ebnDrHuu0ck)=MAQ^=4)`yYYQ>3udXMo4B_f z$`RA(_*r|&phdG$Ma@wtYehpu#nwCO)sLDCYnsE8ZOq!<-L_3S+VoH>a`IZC*mX`_ zhh_+WSGr>)w&1{K%XhYlhhIc7pRS$!?)Nln6Iu3O-z0b>B$Kbd@?|?F;Wqi>iLx`= z4DBAln`(|{b2Db?N{SV@wYVRynEhEgFTLm7AxWJ*rU!Gsa>g#!=dZCbeEv4_#G=Ys zib>y9_pnPj9BE;jKj)F6;F?{tPuzRIyzTk*{g)n8b34X;5lp%$+gLE=#bt)4zZH{X zn)SL{TkNG7s&-$!w14ZmuhZCsk9%wm(o5Fdb^Cq9!6;+BZRxR`7SV?uAE{Efp{>$( z_fdY=Bachky=iZR|FOgtp1gnP!I9S+JqpB@ou4Afd7zK&%&$!Sthhu z$Uji;(uwd%TaNbF{CCb>z*+so%w)&aQr@~3Rlz$osx&@d@e?e1D$uwzN=S5;#Ih`l z{#uo!?F+W$1ssp?)9iFH7mPR~d_%r^jd0M-OUF0Pv^C}^n0I9Bt+_%A^&F%>@{91_ zu~FRmXuD;>+z+Nn^C!>vwRKgwbL)m*9T9R0uPnwUe_fu3tqHfMBNKWg3j zXnVWlU15=(PxrPSx0P>C;aa8Jt+U{7V78ms(&w&rE5HBU8)+OAz%dN-^2diA;DO((AIvp@Xzr_)rMIsew{v_9fk zxqbe_%^gQq7PY;tYV5iz-ll(J{i5e-!F%tD%xOJ!c9n6@yhUL;%U;Lx6)%3r)2;bS zJ0S1d+~iLxJF|kBjApZ|CGNe=q}g4avFzXRpqGC%`uo*4f8U(_|5DlK#~PLK?MzHP zDQ=R}9CDbuXAdApCS zHS?P5vRkL{!J4H~CMV*pJ~%$K@mXZB_ilP-Qj4NnL5*LyQ?AEFk$W1hx96Uzmp^## zU#{ls=YAjl3qF=dZ9~1WcB-vmV_;Y$gnc&OJ=8PYKgh?0K(Tl={C3eJH-TEW_=_9m znWAqn#+y~ITswt_X*HL!Qs<68E+;QBOrC1uBK1Z!e!j7?;=0#sHm~$L`jlPbYsq}O z+FjCfFWsEI`KZ@9*Dn5JnqMOy-Mb)p^W~J~G3!ovrQ4*YsGhc%pw#T?t`jCX|E%g& zYu;TMTlG%P-~8#BhVcH)0aD8izC5>C?y8m+IYGeA&-j>zc<@h|lsC$2k4!qGu(Ze3 zX1Zj3jF($X&;&R8mkymBKT4MNP0KuDG^s-=a@rG>Wxu@ZE!=KQNpE&lDx{i zG9g_>>{S$VL^w;Fnfdwtw0)iiO7pU|7jJYhE4FZ{J8#qXa^gj!^vkJtTG($~+WYpt zRr35Z51H@IUYE`Hx4nOZ>(&obY&RYf_7^j3Pku6mRntptSwTVi&biTd4D#PJzO~o* zVtZRYYM#68an;Fg%U<7}`|&_Yrb(H5U;5n1$3@hR-n+hXsb-8S(;rtKHk)(ZQ{)5A z${cvq@$8_mbExyN`3%|%1e$(sn{-rZ?n{=$-H9KRKWZ*@GJ9$H_(F$B`_UtBeJy8C z$gjA!e-1^f%+)UzdZel)WmqOQ%yxSexiVVi)}2E3*wS4bht7XEu&*UYG4!AE z#FIJ?7#?Q)eB$-$%2SW(ZDq|f*8ex=$zV9wEoXAgV;7I@nIbLueJj@-D|1)r^tjGm zu5-Rwa`$zCYwfL`m1$pMKA)S_Ve{^0>nh>1bXu`%ZvSP=ehIm0&$RX&3O?EUf928nEb$ea zd}bZF#30Mkoe}MvUH(@gQEqY^$HV1&EoMCZy3c&)*4<)G4bv{BWbp0ooql%rHp_xv zw{8`Ru9@34r(gVq#avy6MG{3bvp=++Zsb^WsGuco!LPQHc9Unbe{FkK;BS1jy*56i z{{D??4XsZ<@QXaKj(yIYwKr($wa3pUW^QY?2ut?9#M2Y7PUPEZez&zV9IN*UZk}ei z^Gr~(J?j)>wloIoNpr3hzRf;#{bZ=stz9c7+bs21V(+CDvRW-s;FRhmy;J;C&U>jI zocuu0*D%q3Gf!u2z$fo7_s%W7Wqv+FEbHeKt?N3@4EtGc6sxmtox9VaXL4F(^S^hO zle*@boXX<4DIQs>dTa~Z@2qPgO!Gb;pKbI#q^yi3)K{ic)Q?q*l#ztIY!J-5yVCFL)OsV;X2xXB%o zA6j;5Du0o}ozwGgTOSvjwquRJ{hr$Ul71iTi#D#9ecWV2aqRY&|GuufYJ8k||Ert2 zzw^^FWIzATu;TT;{XXffFc|&mTj@wDUCeK@tF{jykRsO!R zIBSc$at`hOt0RMN=l@;H+J4SHxasdH8+*p6>#q*Hid}tm$#&gP$JTE9TSlLv8C+x$9oHPd~Olv+(b?SAX|UV&>`6-29W(oa+N0 zXRSuS|0O%)GM0QhAGJ}EyT~K-e_d!m&n<4fvg#SeZ%EmPkH_N``YVUy1Xiu zbsIO#UAt%A#pB1`RJor&`gv~0hW1zGe%EDu_CyEgzS@^<_h#j4rcFy%m)4d|SP@@6 zuTFK{{1@9dOt$qG?O*?qTs;C2Q7+lPt7wYP@(k( zo$kBkAYik8{~{GVg-Xs1T}rK!HyUJjvOZ}KlVRW8tG+S)LIuyK`^(>^x-L-(%KN-x z-MUw=1kFO+wQZC`T0<_CMXcT&(o%Xi>`>O@o(HeJ)1U0zBJo>TCvCI1it1f$ez*S% z&R8k4sV&VZF#MI{!fPki#?hhWp+!Kprn%XMZvxcB7T3n%HG*0-tBFTCT;64%OB==Gm^89&#a=h=j;1-f5b z?@sYK@h@-Fssg1gyrQ{JjhK@^%BijYZPK{i`qABPrTpnK(|fiqeHOp#68q#e`cqSq zzNNH0I#F_vCI9t_`lnp^qIrj(+*r+jC}n$JGRtocIlj0lEp@xTD#=`Wv7!HZu)?yq z5c_@g=fzlyug+qhFLd1d$dVm8jNn;$JaKJB58;EAS}&0g7$la@-~K78LM zVcU%J>E}OBzj?=1s=8S_eah5B9c%o5*sOT>((vArh5HZYJo@lq>&6d~Tc3;W@Y-eR z=g0ajYqhK0yqfZPb^qrq6QAZW|N6)6ou5-qY;&_bhqQwO)RAlz{ad8X%D`YM%D^DQ zAj9Au>KU9|lvz+xte;t)Vx$jBW5M}EbS5JLL96NO_Wc!2|B_g^e3yvJ-q&xO9X}X# zPg(eMm!0K8U)Ai{8!}g&-hY2`6H{*Es~yHR4#oTQpa1roG`Wap`Tlw5#Iw{a>J0lH zPCNG4Y>w0X_8#M{4SMxSbDYfmloz!enb0>wU!{7M=896k1%d0$56-?QTBLIH{*~}! zhHO>F(++l_aHW@~Ixbvx4;3;G2&vvQ2^E>abg23Mrp_e64FwD3 zm)a~45;?bMMUSvR;ZmsTJ_H0XMPquFTh23PPDyunn}Y;CFU+gNozDa<( zm4&<09|X;vT$aCmtAJ9d&V~IAT89>;X#QkeJu@LGkiqzq)5cYHsroa-80E!%woY4Ff~!&;d#NTcUnB|U2@zL_la{V z`et;yy!>D-{fhVWs`*i8ccmUWvURJ*;~mDzlYZ>lvrdg&UAvm8e9H0&owl3z{C=G~ zVa&6pX+qXc?w)|Ii2gePcU(;xuRd7ccJXA#J4yZ{+J6{J4=?_&6&-X*Fve3b^?Xl5 z+k+2{3XX4|ls~>5tg`IIb+v0PG8YW?r54Z6ykeB*^5^-ji$({Ph1b0*71n$8RrqnV zUboGLG}9u-biL4wRG;hy<)d@9C*`k<>bsulPO&Oloh|jZNELq_%do&Ymo-weKShPf=$-rg z(6wNlsL;F1FA8#2@9_M>cd5VNJ$mcl^ zANy`k_h*~OdG5tU$@vnuE7$&Br^Db~W>!x^wI50lhMrsfQn?n;ct~ zbjUhEC3Di0HUIP%ow#&9{r}?IKR3Vq^L1Xm<|p-uWs^AemwmD8I=*PD@~yeA(x=dyJ-djw2cZQZ#)ES1F zzAj&Q{n>uknu&jRtE~xXNP2FQb4%^n+08M^zlCUAm)jJnZtGn;rJrmghe*9<9t!Js76B zv+UOPE|9!vc8#Hs-rbg8py>`FM?yl<%YFf7`<4%9xl-OPN`$N4ph?bh4 zx_GsuK4~?{{@O&wc*gIbru@Ig8*;FTQ4O`WyFqvMNt> z+S`5hdkWvl*MGZPSAF5AgJ-DL&ri8Ezq4lTo%(*~gXpy~Hucfg9v99CioBO)*F0A& z(mMI8!eQ5YEsu(BpHDQ6?v**ds!g)5HF|x(kCfdO!g8tgjeGuXZQSGhq_pV(g;?`fAH7v2Vu0qyk79h z-y$}T*Uva~RD-Y8Wv|H72MQi*)fzTry69g`vVXkvn_iT@%AeZ%Qc_x`Q>#8#r9V46 z`}?+L_ElovcepJnTDinFX^mNs;IXUwM8c%kH&47L+j~bu?B9y+*>(TLJRQ@Y-FczA z^xA6!1I?7)xfi9CwLYZhbp*V=vya2sS>~(U$^e5YCvQpZycZ3s=YQW2SyiI;dGYV9 z;gXUO>yl1}n3mj=kz3}i2fB*l^WR-lH04sgR;i_NuY3FNDr;(ly!4?XmL2E$3@)zG zUUMajV^U3ifkNRD&@oiTp!*SDI{j#onE%K1so{kn%Elaz|5&7TrAo8kMeZG8Vk znEuW_xS-y4$6J0ToyQwqo_c*GDA()I9ufC>pJF8VES6n*Yr($0*H(Am^VBKH%jCA6 z`13A({Zl)sFDnGxmh4g5djD$_?+)?Fb1$v#4OT9{mVf*+o8`r2S#P#WW}JA}n^md1 zK6sPJZiipXj`(|q->?kopPw20`)*T?%cFNG8^1ezn{80H+tKyrYVFA#y!YqVE$r3) zu;|w${W}x3=S5oX=lwaSGkV6=ev4mr`=l%$UJJLfTDSW8zM?(4pQGMch>HG=G@Iq- z%bNBh#*m?&CBvFoSMII!)5Ed5-%dGi*vs?rww3Gq|7@%`*d+F-KKY9_0oJ10(qYEJ zz>v>_{p1<{f|AVqJopqCCTbu%QL0ao40JDK27nuuwv25 zIobk|AD5d;EYw*(>4`y%U(qy&`KnX2yY8`UJ!@>bSkvcPtMhdifn24Abq;ZhW6?>L&baO%2@lSiI)&rvjd zrowrAS|<;uoOR-F^(vF-y8Hd{K3`((~iGrl`uPeBftOGS%J321rjcEtz51g zNm=#%|I${TmCu-7PY?2qSa)hl{D#?F%%_8AOcXu3PHoCs105z#zBA9Grg7Wp3c0*l z*Yy2>(E}&z4_cDvI>g$~y1b9ImX*1`(sBNkr`J-lKy`}Q zhvRBH!sk7YtKz+0oFHQA8+1Zaq&BS7=Ydd&(oHAr#q&AVEj?jgyucuBURQW)X`og7 z<0ajeU)<^pdU`V*C*7acS}PPZy*epZkYD6`kJb%|{gKz)KJ83ssXwrF&6G5O5Bn4{ z&;CoC>sxGi@Kb2RwaA0f<_kWZ6mZRco+|L1@6OJ3%-h#xM_;?C9NOiR*?q!%YVCU| zCjNr29k0}v-B4M+HNF0WfKC7WKPU3PTARg)7{~K$y5#ce>7tCFNQuooH%^-R2JW?0 zo}{wF_*DwSyjqbeCARG77Ix1#?=7ojPk-lVx35V4x#X2K|7#xhl6V&BQVp9&l^2g5 zdfd@hXr=c5S^C_!=Z_~ol=>!j%B8>CV0nOn&D7#QXA&G>h5Yut0goZk6XiBH&@7yX;0lcp26cImOBR<8eKEtNNKly`nFaO?1kcFV~6 zo`1J_)Qva1&GLWI>rRDF!i^$Rc~{1H{o~wF9x-A2q00MvZ)^Xav9mcn_WGZ5 z66WQ1q>dIENIWi=c=WU^pQmC(^}>3u~*(uhh({Rg#mIb0|pC)0XaJxGk{srS>lUpmdX=dC&=T)bpe z)9%e-amqXi4XmAA;%RSfjPzTIcdv?-e7Zj5KG$3J4bngL&)!`j^WM0_S6w(&7BFx2Ajb(<2ZkWqWxorzng7Z{19>27TJbD`^T z!uF3U-*}|@9sktciVJh`QhI9E|LWDMb#jTmzI%=sD}{QgzU9>}oz%4lMzFQxMJe5=q2jZgKa`CN9IemHgS*&S<@l(XLKPS!2XN%30+ z+Q+`TK3iL>U=J^A;(CRh+72sbhDWTt%B1r1{sX6FPpzN%6yz7Bmn`HxcIewC-Y+}# zXK%PB4exb}O~_iX_RGw>AwDPmt=qJ&P^Cn7YV2E3uUl|w{%)Pt{k9Jd_b1oSmJ{pQ zI`vunt_$jubIxsr^}0{8ykBim@tCV#GI!CJ3#<7Tm+bZuYS}Ge_pNS@o8z{R$!|7S z?Dq}}R#+GZ>2<3Xo6cg7m>{|-&)!zv;@q^US6Q_R75hxpD-&axEb~FV?(9-2aIc#+ zg>&iJ?$s#0?$0Z`uS+(!{EGa1LHKmRGLF=fUlP}DE!=oz?c0a%?H-&>H-2CF?a|qo zlur8{MQ)Xyg#AUez9Vu($l8b z#ycM!U{&6};68_trx8gc%>Zyj1zMv^Wx1 zNi6nS_De+5Z0Y7Tntd#q(>{1)`O?M z&Q;ZVGxPh4*4=J@?{Htw6S(l_r21^LZSqy;zFqv5x%sQPf1|Y$SA_DajqhvoHCe+I z6B7=V9Qpj}(r3QMYZmDEYjpSVB=<_%JB7O#nmzlUHqE;*!TE z_T>lr*5;|%H8KJYXf)lGVkK5{=msJ&+yz8wwiqjbDH+ADq7THa_d27lJd=@ zl?T4)Sd`D=rUXfN#>W zH6fGEYP&XSD%kwps}|KcB~`jM^y3t-fD?;W#7tG#^vgiPcjB~Q&!QP2pXaC=q;Nh} zJ(|&U=hwQJOCrx^TP;{G>SE1$LA=9TMEH-KhV$;0a4m0}!Q@gXIBJO;#643tkYP*Yx9bg;cY3 zRhzmw&)vX3HU0atG%t9?zZC0S+cihg0NS);-1lqYcUI*)aRxk((%0^jKcZ~kwZNY5 zU~8xJu|{**U5Y--9;V3rlx^t93fxsAe_hPzNED||f|qDw<<7G|C2vPA+GNwJTDkPb zwU$lcS6meicK+Ns?`f0%E1rwnH6Pk;;Moyiwnp`^V&J1KvnB3+xqR%Wua#L$>BY_u z(`CBlG)vq&>`n{po6oJ7`=T=_^ZR*6%_q*Pf`Q%!phy+s@azxH2cS6(XF^D|(=l`a1a&WY`uku3W?A=l#2mW7Ni zkNM6ToXc7(%e%FA&V(mNbFNBm&Dl{ZBmLl3q0ZwqvEP$Azr9`XsCjBi?Dhn|0=Yem z_p&)2zcDzN%oRL6%Uve$tH+X?tCXX*B{Ob0?J{Xmf(4UQb@b!#N#P<-zfJhJR;Suz zE@SBKkhAN;Zd+vW#qw^hF1@+e&hTsTCXKTP<|m%pe9xrs_~Mz*`)ukn`qeiVW+=XP zG`35)x}^8M^vk1P&%V9e`O@|h`~LTS?S+S{tiFvY7TD!grRv*@0-M2JSe16)J zQ&;z2{r~Bh)u-I5g2Kw;@*D2Cp9@P@EmnJwFZ8HvOJd7JVb9Z_Qj+Rqme=k-KKI1W z!WZZMR)48mv}?kel+SZ!`5%0d_{XH0XHi0QiD#(l&ob>d&R2Fn44-%N{Px26zjQy& z5)c16uWpZpNBXJHRh4gFUjEuAbdoD|+nq%VcH~z&MepCC$v0*1)=wLhHdZXWlVi*E z=fi`IrJGEw>%&6wUI}hm^MB?fxvW1A?rzh`DBhGM@(*dpD5#nCS~w`)hl7FPJdRUf zKm*tAsd<(JYS6inx%rPgg#Pu^yUI_@OPsdBLG9*E>B32dZ57iQHl01=wmkUC1GcJT zJ9d^$Zu$E){HoavmbMvF(^T%ne!Y?%9$LQ6WB%GZd^^?rOr8sdM<=;+%NZuEH&YCC zk_tZ}^m^@+?xjkitG%LnkMVw-uJcsJ`(y9fDTS;p|0W$z(LL&PNwjf(@kxo!qcM8} zPTEagdt-uRZ$}Da|I{a!dy`tUofbb3*UeC6vb+E2k{Z_x6|N;3YT<^0#eXl#`#Izs zQQPPQr&h?qTa!9WH-$Q0*Ja$FGUw~$Y3XciE$&ifn%5G}3NakqCob2Pa_WRy z+GpPgW|jr2@v{HxOg?s6)~Lk$UN>$3_c(n)s5j&8H#1c|YPRxOGBo>6auYBzWN%=< zz4cw=;Wrk{$Ln3*R`=O&vF-ojre}EaMoI1QSv)?|d(_`mJh@r=$nXm1-tWoRCs{hI zW%;3>(Dli{&!?^>?!rfTdlBT13lb;|`drrc)-&$pcSR0-+b z{dI?a!6i40)AidfK76Fz&-Bsh){?{< zjN#Kdrid*3XXd=GBTOeq%1OVM(K%>cTS+VT(@lviIeu;z9WE>g`a3=F6!!}MYY*JF z{a*7Y%+yPuky+?ZgN0fa!+*sC68z3nu(9WkA1By=p>N;h24vTd=gGy77VuXe%l z89NwH*(UW)*}E~<^4SAT%c#D$wqNHo#`^8q;+(ntwEU?TGv*$8{^f?@La|4xc2^FF z>WeKgn-YEF*x}a&zu_DYk>2Fo>Pc{IGZZ&c#D{-O8EQ$43n zL>sRNo4LMtm;CW#sWUiCX8qN$GE)AL*pjk`>%!iXdJ6r{yHbUUH7_$4acw&B@z1=+ zx1!d{=AHAK)UPZwZS@j^4W?2h+>FW(RS$eSu&w6$#sz-jhunX8fABr6xy(W+j_FUr zH`&z!MssE!e310w(84QM{HL>p6pQv{DLuY)ql)?R?((+3NpW7C`lr0ggJK-g4PJhG zd+~#lWHS4*&P7ILN5owZeY9Dz@aUrn7t}udoRr)eFz?t6jS}zZmL#rVHj~qOp;u0< zeANA3XVnzzb1Qf%A|i`yLxdgnH<_(}`J4TVyHo6p!%I#rY1$Ec-&QXzST9K=z18I0 zskz&P+fEm?AM?pqy`tvcgNe;?g~iITOau3 zp-ZjPyW?4nb3BX87ap7`{rUTXC<#@uV?5LSnpg0SCr?M zxyR4{weIJSXEG0t%$03fJwtQTtx0dJHb+V?UBV?lT~S|T)rlQXZ`NPC_vz4FhIOx4 zz4vF{bZ3ZQE-dhQ%|CZzGVA2OOk93eojkms{V(m>t9r77cgD}`Fj>LJRs476l+Bqv zMf0knm!6+`#U#eq_%#Jm{`!oMp31*{t=9JKh>Xvt<_&J^(pqk&J`<5_DdOT&GJeC5 zDW5t2wbJ{YCz?8)=NERZjNkR^+|}Pc^%nmE?*w&boVv*RWrtvp%0;eK+h4uk*}Wp4 zZ_d9D2j!aV+JlM@GspbO-xBvPYwh=2>UokmycZ`%J)4@f|De?g?xj=jCCZ-26q!|i zO!)qnxfeIMU8!7}q;>OqkvU7*?Bg9DCK@$KZN1gf_4x9X7N_!QZ0d$H z^9fO{6Xnj_cTb=CD?;X!ntZ9hFYpAfIF`LRctU={?0-xR;HF>8FrS)-ESJzh0j}Gj7ixg&(YxUWasC|&drO>C)cbEI99<^TX3?>m0+5Zz$P*LlM?;cH6#4PToA>;Fl7YGo4x zADl1bUAo}LU4=jOs1rNS|J|~&;mSd^HToJydHax^l!_>q-R-Ld_P zu2)7_96yA^Qi=*m7!Q_cS_J!`?}~)p~uux;+B1CNd5Zs zby)f8+dG@AH4i>IM6=!##G~xyZq%c)RVL+=oJ8Atu4wAHvO5;ve?P9xP_&I62GBW{JPMUqewr z^H=*Ni)^DWpPgM%%5zPHr7y~Y^Sj`N-k3YS;VaA(7QR0G=f{&^ezhygjxG~!yWV{i zyG1#>qG~daa$~|og$6QyRkRM}knLgUVPS3S`{dmD%LjgZ z&ExrzqBK$3=J$&)tnNi3hKr;{>_16z^S;>F!TqUPdcj@8v){I6ZuMmj1?7d-p%i+6OclH~voz|9qz)9|T!#2*Fas}BA2JId!C!fh{hR%QcT_<9f zzg?%vT78$3taqHEe?Pl)DC?t7bB(H}e8z^f^*^ip_NKe2Ut<=VaBt#b*Pq`cf}bys z@jA4%W@e^V0C#BX)4jjNwe#*@c8K)0O#64^r2N`H8>O@54DRcHIJMPTsXgaORPrG)c&x0AvT$4hWY&J`{eacqdf44>b+Oo{vrk2^P50&rVbvyg< zgW&ns8@EU4rC)Zhw%WIS`r$^y+4kq=T;n`nvnfZcMe4%2shX#(i?r{$cDxNvwEZ0? zn6{1gkMphxACe`G?3>9d{A^wJ-bwSTx3+JZVWhylf@Mlg7)P*UrAdx;mP#um+K5lK-Ri)Jj77yr0( zYE+cE^Y@x>QVAC?wjK=^e7J}qNpo7Mh7hY^Qgz@2^LH1YOQb}kJ5B!-)yV!Tv0|b} z{?j9wD>bTCt<>IK)pcc0Xvh;a%_nU$FO};pe!t|)wbU|3q2pl7zuA(r6z ztTriimu=2oSrud`|9!f4dPKOUm`ruE(CL(G|KArVoD0-EU}|BtR_X3igOEPOGOj&G z6lcifu<^|NT-?+0qQ!rT+FtwFcPzg#T)w0;#fUL}r$N?(Xpr&`p?#k}u;y~bKV98^ zU+}|K?saVcmrrx5Sjnh5?X#H2qbn^!>3exMeOo!bsFzpi8F!2L?FF0mBsVLZ%L%Z2 zo%@1Ix+>!L{j+X@?v@KD>{79>y!_{isr}<=mwsG1k)d6(ljC!I{F=#Ywb*&vl&ei6 zm+@(Bo>P87q;%=OKwiu9>KVdzI)5zmf6kLQk}{o-{ky{<(=eGi&M)G&Epxc8@Y{c* z{HfPRKi}053ZD8Rp|HKWi(1`zi&QIjxOm6UsM|Q}?fMlvC)=GZS+O?v-3zAweSdO} z9h&I5eR{vzH^usvi^E=KFP_Fs*NfL%}7kf9Dv}d$vmP z)_ZTf%<*~c0zGk~qS`r~+di~BRNcicbGTEV?Uc_6-X_h+#oyb%+Xf#vvd;VEwW)5t zEMLo|0xzc9^ek__dHC`7k4blC^LWRuZ8kjlO{qJj<@C32T9S%|5_L**x-)wJ?)CVy zSHbRJVb0p+vU8OMW*k$`nWcF0v5QREET`U84-U13zFhy=k<0pKO_!J1BSs&&*hF2w zH5>LsvhK@ys9zqc7r1KQ-dygPtbeyhKA*MSI;$Y z+~Ge(^Zxz3%f2hO=p9-z>CwWA<%iQO)^$$N=C%*=GE8dN)+}_J@WNs?17|n+LN9=Zv49R^U|cxHv61H z*F2bN$)oygpY2PxJq>9J)Ur_ca7q@8}C$Z&wZ7veRJEY z?YmEwZNIjs^@q85Ur%ejuj`}Gw736}wyI0^*gG5%IU|q#=sznWwoDssHdl2 z7_2?=(O<(Kgwcjy_eMn*-|`TvYl|=B3V(ZmrTU=w8f1}W#>$enX6 z44;*(7YJNs2?-`W1YRweAT`F_)Bzvr)H>SLStB^v&|^1R;2c+Gsp zt@}1IeW=;@jhFqy>r?4GO#8U@OWRfRpReIw_OR*vv@n5R*Djl-B(x^%I9<<`%NHND zI$i44F7Ic~9Z^ottQkK{{gG@jb8*!4pKZLC-%ie*X|T!X85_?|-YdSz2itTXzKk@m z5n$4FW8jy0Dz)(F-R}o<=6ruB{h9fXv|gaY8kK1`*xor`=HT4Me@A(nSW+#U$+^DI zi%OpEX4N}b)Ov&Wdx5F6NXP5nc{j~$3~#XIY~6ZWgE8~r7gH@x@7w4x>1oBb)}}(=eGeDi|G~xD^EC3mpyiV4)Fm(GbN+2!c`MWO_S_%uq9v3S^{s?=mcPqM=9w*?yW^$O z#D{fTFFuRvc%t#>VAR4N?6Zsa^M1GC=&aFke7@=S+d1Xyt?rtgG3^u!RkuDPn)>M@ zlXwAN0Em!*DxQTdv> zME_zJ*K5=HtwJ9L<~Zu=?hR-dd;mf88MQ(uo}}Zrdbi zUER*&#%boHcB4geO2Px_Y@PqvswsSr+W6%cc&nJ6zcW*Ww=JzVr%mi__K5`J#IC5f zJjJKe13Q%z3m@KIdPX=}&~b`oh?+0cE|q&8{|-E#ci`YOL7wwDhku5u)OJpmd&R7C zJ$ru9{8KD>8WEZbLA_GJxkrLiE8Romx4oJ;wdk1eoShrHcV-tSOG+M&O1-NsVWeF7 zY0YHT+OmxPg>eD%o_K7M(dGQN*C69T)2=1C;+jt`L|7F@G=5Fl{7gO7D8OFVPHR?? z{iNuX7k2L6IE`ng@`ay4C4nB#o!(3rF<*mLUH+A zKk2Hud|mpx?EX%g&UE(lmRqtMoi!rb%ug&XUv2!wce}aZb*GA4GN^F=?QZ? zb!TlMb<5}KUE?|%w|=X;vs3CNc3;;xg)gnw=C53Qaj!}Aipi{|JB@BXI3kO~VD1%G)OW&h1zmYN_$s_x-x5mqZ+UukKXSf6}RU zUhI2uY`FT{8s}oeXE$_C>utLyxajgHw@qIH?ey}GY$(;8+&)u@mC;<2^{B~O`&q~4 zY}|B&e@=p=#nTtW9NwJ2dCbaV zt#D+DV(*lPDTcvq{Z@a(Pd$4V`X@PN#vHBMTD!v=0+(}_wsjf!$UOG%>8fu?-ua{R zx7D}L5rRH>k59f^VOlkP`9d`*;nwy)a+8IR^YGiL`l-)YByaPg>D*h*|6kYDsU;b` z;5<^U6l~t+D#x)eDJ^Wn@4M%>{8mn~-qf-B_UyRlDYyRkY|hR&`nVzgp4-=p#x~FN zH{OwRufKfKB1Tfj#aU89aFBR?46X#W}Mlv z|4QaXt5w>$&U*jTvnw|WKH~k+!oI$K9&eeqYE9ewj!h{nj(f#S4VQ9Q+wYS7wR6#1 zuM4S@-){2`^bj(an-P8AeRGKLk8cYOybf8A{AY#Q84HCsugtVqr|o`}AnYi8?MhGu zTVB~|vke#4EK8hv@j%^$Yf5Hjyx!IF+ZPr5pX1y7YjgX#Bh1I9x6R1^BUs8+vT(z7 zoh5%3WqL?@w+gKJ ze}AU1`3~=I%m=%Q{!J{I*v2*9i(TVoJKwo&h?$oZsP;#y*6Pk*s=f7@+zvgpp72M3r|+MlvC z-7D;KDQAv*S#{IXz@VVM$+52Xw^$!JEq~i*VQqJEtIWq24gbzhH+NB(DbX4H={Lh) zKaHq-sl$2O1NBm}67DY2(@kfnvV!DRZAtSFGaS-+^~Rw;o+L=dZj&i0RRFxAyZLiM+F7>3fTr z*OV=;#xH#vdg-;u{XduVRy^6aX}V2q&JY}{4Cr$=0iV10Bu?o(39gNH8Ye=HbA4P@#t8RbQ-+jIA`r=BNh~Nh@+S86{hn(WG ziMi$Xu4vo(Z>(Fyu1Zd@|M%SD#hgpeJ`~OIS*^?ae6e-k^yA#C`1NI$Uv$`R5;)1) zc%zZ3RKWj|pm_^RpK-j{_P^+y(6%$WD|RhN_UE_G<8D;Up0@4QxyXjE>=`G{PRO-9 zwCUX)i%u~|5w^(>6j`nWJ;+<2t<+tYQpxG&{m688?bPYfmW-2MZ|9tvkr4ama_;Lz ztcB@YJNa6!dv9-JSZ`^T^7f3u-=nv!!o7O}Hopx#`^X}__o2FC@K>|s)#5wirq8%G z&AtA|KKK2<>)yUlzMX&i#9y9`L5BVYtlq~n=bXv2;e98!?BjBVy!_~?|CjA)-PWJH z|Euvnp?8hiL6z^y_S)O-|Lc0_`j)hBb3ZI%nEwBr-L}04)mMM5<9Phud-cCB1vd`f z;K+PaFyrmJ9k(Y|y?#9P;pP8@*IuY{9GjQ!yxZNj>BqSx5iF4&hyI&>eIxsGb(_1? zT8Hw|mQ8hUX5E=}t19E(LC&^#-BriGWVVDdImm_wh-8&&Z7z@L(AO{NImG&F+YHys zi7n?}Db2Z~`yu4l_lI-a>t|;cKb+2I*X0xvY2T|>etG%P#~N~9k3BRm{@?l7;Oj^4 z&N=?GcII6dsOEge=hxBFXQQXW!#DjF7bcy*QL}hoRJ*a3 zLz0N+Q6nb1{{NK{J_b1+tegp3>UeL6{L1k<+@Ul(A?IuCmIcNYcaOBJD|+x&26DA@ zd%1(;I_@6}ln(u0*u}J4!TP9C0i&zZ)Lh1zr5UPUb}^puKD6iD-O5b|B{vvMi~S(_ zF0HX?$9{h?mJeQuvKN0^X)I<+dbskrJ)gSWj^^}=qT|Ws5A5$NiurSgzhu9wwehJ| zf<{lZkjfF|$HgK)?n!Q!pZIWF)!%vl*W4+u{W!Y}}t5KZY!yQoBHxDOg8hw=#Fd z53ziKjh<}p8_p^|*~BxyDY4h1u4cvwzrM{qPp$XrIWKNf5ZcE+qu5_bMs-(C->16` z#er>N{Y#qa%MY#$(>fQr^jXL$gO4#=HJ@ha{_J|N@r|F&A?2hO9}_Q0_x*8VEI!|Q z=UQE&-jATQcY^=Cy}(h{9nak=Irp%^n_{Epq?hLpP2b+IKZz+OL|*f&y4blN>5?_S z)|arV=E`{;Y<7C+y{2aEjOa5RKKB<^Z0xNMY>Pgw>3q4+tK;gE2l^Lo2CPvCVvnm1 zNt!oJq-#NmiTH}e!g4F_=!X{hFx{bcN%ZwYT5%5_MW4bnz4W zj83a%hdTd%_^~Q=MXv4FL-Vuu#Q6y3d24Ps>2Jzxcl@laYD5*A{(Ud@6(>D)S#6KE zYpaG$G}H}UKE-YJohzF&s-69(tf{czye?SDyW->&t#+NmDQgPPY%qT={L$^H?a|+} z^Ur7oA6*#O^ELML!yD3XS~fqdS+mY=vU#Zk=dFlmy*htn+)H+TywZ?xCVXwssYku4 z?_aP~$KUH>bDZsRNyIrefPKToK;ve+#hX|nOLNcp-t}YO@bShh$t`D2e(%ADyX*EI`P)G3HSYVxVC|{-=BBwz zr6-u*abN$riTBr1(~o~2K6twCa;bXlexAb@PZ!9#~wPv$SuOvA^}R zUpsS)hwG~cB^sqd|9X#EFiul!mE)9hwX`*}f0MlYZ+Z5Q^NJq?-@ZApGB4}s{Y2s0 zFT-+jt$eMFpDcVCRhXQTWcKpfwJ_mRkq0l`z0tLYT|LeC?44WrZKZi3dqbl$QaG!> zTgu)qVz)eVzp&uS72Ot-V|DtKmm8m^eOj?URmqkoqC@4uU$rffhc4|uW@VmL7O^47 z<3VR}?!67))_pwJKUYduhlTIP-p_Ahk}|Emt&CH$er(X(YWpqV<;;^uw;eNHV(cu} zt0E>Pm7H&vzis0kC%LcNeNvtaHXr%$x8QoVar?_#eGm7aN_g{+T`*7Nqo!YJmgJ+K z+}j$ui(I86{Q_(}ReB|(ZrgFL&szIg#p3zJuPXn{_IuCycK^@O+?q+DtL5%Ds&k&L zx_7krR^*?SiGQ!oKbQOXhvH+Eg@G%d?U~<|sgv|-;r<_2r0?+0kE{E#CvNq9$4bYi zQ7yN_(|=vqQQKLTmDc}x+EfqzLNTVT%8e;IHZ8c`|6-=&ai@g~HJ|WEifQ@!s;=J| zed11rQPg5nO^dU;ikB=fwQhFXdTqrE&$DLolN~mT*-NKwnwZIU%*JGvAE(~U=WDpQ zg;t7x=hn&yGkPCoX1V(Qy?auv<@#=N*X>(2ZC<$KU8iM-&{lTTO~7z`zFoD-9nn;MXlSV^D}c{U<8|B;1A ztz6wv(b|QpeWv$s+Yl0HKKnckM#i<~*7!pnQDG)BEpBnVxiW#+~)pEW|G` zzxdt9t+lm>C3#+CU1~gUz+)q3u(LJp!zm`Ny;qN^PwGA;S@N?=`^M`ar?u65XRG$I zzMJ%J#!P`f zuj?kn2|YV{ai+R(3vxuX zU)FNYNSG~Leq(Om8O|G*J991fax=7R1#8vXpVO^avGvi61FTb9ekR&HPmeh#F!v{S z#3b{s(^kvh@YV{>c-(g}+IT+u`ine*vzL6}o59XFoox?y+iaIlkFu1kBmJ4bzyEWn zVKrNm$A`Pemskru)VP=~cj|lXxmHG5IWN|F6UJ9(-4_4bd2y9F&kUTE0g2c!fv?t9X}GOU$SMk=AO1aP4!EoeLr4fT&uYD!1ptsZ`3^YUb`nIO~UGA zrW;S_iIOkti(dHc+_9;7dy_)GkEm5I$8>kir-^!3W#(yIoO9%9sa&1YzO`m7KPxtr z9?9SQpy;Lc)|b{1VOzfWS##S>tWI6x|1znKJ;ph9?V6nv@2KtgZ2Cc~b6VeqqPwaG z=lrrNUL$_GZI$M$z_o?J;oftP__|4Le|xR6Y{C1<*9Ec;-{ThBKK|e?QfFrl(1V-i>_yxf8JNW;-=~GyZ1CyXP&K6x|J8Ry({uuPkeg!0;$&z=js+K zeoXfN5M`#obi1i7ahsCZjB^XZl z9Fyrg^L+Zgo28FmF6+LZdDyT@-Yk~ORA>5R;ma0Ak6m;Q%zVuD>0spJNg=)0wtkwu zm)p>|}kJ_?epg4<@-UG3=0 zS(P`}Os?_!!%L#?)mL8pcy|81_PFoa$A8_vA$y-mbLK6E-`7`Nv}h{4w(2;K;HARj zH#}mK)I;n>tTP z*Yj+i&N*+v6;mgN>|YvqPV`4WSMc0h^$W}T3bqDKR9~uP|1)9rSuVLZ7UGpl!qmFf zy8rC?_M_IW?~B?~CiX*d2QT&I$}W0#dreVX&%NUA_w(<6h&fvmRV~%`e(mz<`OfJ# zB);nP*?0XYyOM3JC{7oS>a|-_chf2ahb*~F7=XMdF@UQ{!ga@oP?f1^;m^CHQ;N7APK4ahk)H{LX){s(iG`lER} zukHP+`aeEkrOPq{7bSK6TLp7uOrJfC`xKzC-hlVdi}S0m)X6TEz0;GUn|*a}bJn@Y zZIAwlWwUcv=3mP{bN$`^V|$i{Z2dF;#xHTy@rOm({>{BC3=ATCIA+gM^HNfa2vi$u z!*1t2@(`#!79ZFozWGxMuaDm5i*^#p65cEma)q91X1y`{a%@N7ZcnjH`?}S+2kr>n zIN2qBIkfcLO7Hlr3yX`_^WHz;n>@{ECzJZzO;ehT7G6E@tb1z0<(VvZ*EwG{ zi558X!m3E+N4&|DC|=oS$g)NYMn< z7`=7pJD=Gkee}}Rz1+by;e^u48R-We|MAZ^aJw~yYtn%XOV0?7TCqzeizR#~M6XRX zmO7X+mAzytQ~g?oT{4B8DK>lAPhHS^(A&lH-&vUPno70{^A3i&9;(p{@hdi1WyLaH zTiUb7YG&ok1QwmMiRm?sH_r$Ne6CLSWD@2&-E-{p5eJqpt?K4KEM?dec;`Jl`N<|* zz~=tq^>YfhTr!VR*!WW^k)y|wb5hdjiXI03zV!b`I99*?cK1Q#%J;ht9{5=Mg3oqC zLP}+0cK`2b?29*=OZ_@0+TcG`BXnPXHn(BYSxYg4MUytDXcyHTD@$9U)0yCQPh*?u zk~h4if*gfOdaol7UCx}R_-mT#9(FP3Q%f1&H$9x-QFq6;NAGv$gFkKIY%%5+I+v{H z6uUe9MV~;dm~xHz!x)JR&t`_a;}>hVnPYM$zjxYAgM>HHm0?l3a|9iou0G6Mx2xfJ zzUjoO{5QAuy2T!rD^TpVU2wGNJfp5`S9M3)2D5+5GWXiN>0ByU-)?{K3e&IcTUb=h z{FgrP+;{DvX0E>Kt5g581bY)_e6#HQ@=HD{b=C*YYkA_Q8kl96y#&@S3N4Ba=UT)e zG4Vs_`e%<;v)!4wjM02qct+0}IW z>&{OrkEESh$(JFS=*p5~kMpKE3$$?iW$_d$QPmDk+sL(9oX&jd)v)jfd%|3mh)R@UAz?7Xi*V;l6hs;>8c7v$%MzIAH0-Bi$p55 zJkP({arja7&!>Crwl3Hk5hGZl^ed?Gcc!gSVyYznM~QP&!+MW#zDd?Em05M) zwKn5lk?HrvU4jPdeN7p~#ddvd4U#>U`$PJ-@QT%&Zo zu{+fjueG!acJ;D8T!7g5$_3f^`q+A!4|M12vO|2EcuTCOoQ-(RYct*b>7VuIlqg@-Qk?{=lYpfqvpD| z_tf?jutqv%zJ8RYqThM7e%Z;Z{Wh`p?$^9~^t#E>>FpRYe&V^ zxv~%5+da?~=YC)L@sTcQ=j*N_HPFu2_LlRDUp2~I_7!85t}uq~e6?K<+xZ$Et=skT z&Fs%#em}R#j#T=)%Wt~z^OFGKp(e2p-xHjrxfmF($zrcUgR?Vpa*AP9=qG;- ze-K7XU{@tG^QF8$8UN`L()c8BjITL)e@tD}fg6d=226hz)of~8xbb=A47ba@vfr-f zhkl(SW4G!3X*aQ^ce~!d3V9f$3hExHoQv`-4W&XRIB7kk?hay zcxUw(^jCgo5_YAva8F8*@n#Sgdb#V?^oQvJcK6&rC@8h=U)af#q-N+U zox(D0wdWg-CzCE@X}p%YpeOn4qTg9#*7OJMKHvQG0%u#Rbo{dY<;W1ssIB^J^#M07 z4sQFZ$?LU%u7omxJ4_Ck~ZzCs`ky z-FZMpi0jem?VKU*dSXU%c3gH?QB>)(r0&NHSeCLvS@Ofpojk79 zO9Mmxoz&<#Z*RTA{j#7$vqWdt)gMnye#{Too_?XV zGIN5akw)q)+1^&U>@%vXukUqyeRs=x^~tLb`j%hF`o8Pm2bzH;iw8b@Byr4`>b^9`ruwLUdDVX|~#NP4H~D?7OfQ!j|E z+;~E$e&<0i1;+*K}~FDttxp9`)Fa9_4T zr$t&zOFASt*4|0x;VM&MSDx}?mhKt_{$E3us+G`8{4K0OVKkt|lF!i#w`GM>|2Sg+%RsOksMNNb6@|;;t8e$y!X;11d zHr6*}T(pXw{TKm0ngVZo6Fn;K6=u1qRByiB4`)WdnlCpPZO zvm@7jI(EtIqgm6GxCvHEdv*RY@tO98Jl?*B`%fj?vPoAS&bWHZ^|oc^g4)OYi{?Ig z+O}h*)$bM^A*LMPi4n1Lt1MrS0q7u@d2 zkDnK}T;8`T_xfX(7bXiQHCwDKJK}SA*^0jAC>Bfhw}ubjvlmSB)I43pdAU-wb=m4Z z+YsZ7-GWosImMqfy&Q90Pi*RwMNL8?zl$fH4!tq`osPe4dj6Z+M^_$dTl4YRtSUy+ zcRzMMn}1Wc_0O|xJy$h1?$~ubD?>yT`PC*ya80+G)y{n1wybf-8cy3sv-xD>S>CPP zq__KizT5ptFE&5SsxZ#rUGaapMUF&T#75aQ99MEg`VY#j(|Ibyy)o6(ZtazVorR~C zM&!M_e$%AvN~g5$qn;0t)1xLHp6+=|g(LEJR*s*@-hl0?J8oUuZTgk@){{Q%t>tGA3pZ$01+p-j zUA!P{psI2>tJ73Xv6<^}p3sAYg@&0u0Wp^M9x6^%F8}sG>0gifZq=HHHc|5|CC;3j z5jo|s#hSK1JAXfv|7zuYhToRQ?+&9^YiH?6Lzeh(?pYNDiyw$Z<{xY3=3dh9R7H#L zZC^ln*Y!hR-z72J`q*N9JagWOzLw*;9;@?*faT%?fQP6g?X_ zu_ojUb2!tS90QvlH&|Mg65T5{YHxV4MU4&9I|?cwSx4nK%6c&pzor#-S5)JIZFC{J?O$ zBqq1BjAP4lxkaKY?Kd$$;+)bJ7BDG3tKeAJyE*Qq+y1SYqkT%aQr~H{&^obT!O%Cc z-66}CWO_S)SrYnCc30Bjb~olXm)X{*w$7~(K5KP%|J0??pY~a<|M$^ic4X4#ty3n& zmd2bnOMaNklpar({?qyZ{j&1=qSCwbQ)0HuXMNl7@5Y*3$MmTG7i<1Eo>-dvX!DmjY^@j6{!Ckc zZ0^O-{rB^FPsDx^tLVHOQYdlP`B}`FyP*p%YcELLY$d$RefD*hxTo5z2LQObU! zqv4}@$CPidy#IN8bxQj!!#&UEdUO5yvn%QE3*K|<>+bxyD*au+(EQ2gDf6dE%YA7t zs=j6H8M8Xw`0u_Gx4&y#dSa`+KRU&8-hKU|+XuW|E3XPi?%6VT?#F4HwaD5uKV{H1>vo2vvbF5@gnUUsto-pwaJ zCavthXTMSA>$&sWj+M*I&0Wwp<)Q@JyC|0yhG~JU(yWVThZmXDt&6Jlk_&(Qs8p8i z&!-8S?L@=ZJo*>(_*U-|J=cn;n;R0M8sd`>~C5_-SpQQv{HXJZfw6+P>%atC<)WX5ctm54uO( zm_U28H~3=SEeC;`zWqroL8)5pOo4G-zY-=a^kA8gJL{8(>^G_S>~|M_GJO0Vd)sA; zulCck<<`d5*425*UcU=ks?UU|P2D2SlBF)Hctf5$acki%iPwjZo`}tR*k>*ArHa3! zc$ZPQ+y4beta90o?bInWs7gN~_h+W0(iE%B>4_N~-F8ZXTx~&-QOeuhL4BH~^Iy4D z&pq`fC{{Mqi*4HO2&3OZR;&3hADwku%V^PoS37i5ns)klOg)lwaPR8fM$1KRd;87^ z;ajwt*~jEHm-bevCY9^Fekopd$p@IOtA)Gr-#Q?=ZBy<7e$lmuf}$xGber=TzD=-u0VP(p|e^=5$=2HNj@1eq&4gncrn$ z8CzGYr@YZUq?p3CbZz_QiGMuS)a~|7yZ`Ow$KSrYwMdeZFpI?}>F>g^I$3%sY77(|O|-J=p!7T{N#d_}TttR}WhMSZL38kE6%M zbD_tIi4R0x=-2mTzIt!4L(bGTYbL*hja}HH{pputTR?-#i{{oV#Pw z1V@Wihn!S7ckd}OUD4>*GAqmU*qQ6+b35BBByDEy*yHeG&gJj5vyCnO*VxTGE$IKD zxs2_5$(#EJEiFzqsQR2c=+~yRFrk0BA!v=mLG|K;ZOWWe-9)q60^18*#C`lf%-^EF z)tIGCdD#?H7f+@pH=U_XUzbf{n(Q#?#rii34Et{+ ztlKwBO;A+fqlo8G3s$=ma_{cy$;}RMO!}~F?~Jbt&;By;)ZD~5Z|y#Bcax@jHp*M3 zupT_blu>v^b<)QtVj73PGsUg+_$ZmBvB4r`;Rybl~h5x-Mao%tzy<$_%{i4IqqmLwQ z`=DF9bf=KCe^T3_7n2n@m-X-mJUIAG+I~XfUCUhcny_oz=Umv@%n&6juk%62zC`No zwx`Y4zwY%*h<9+9>Z?`N?##_RMXI(SHaXHEMU{zZM7OAXuogBRYIt8w>7xv*dG zyfw!qU}fE9ufsFGhaC9!VQWy?t5&Ax_bZnC=hk|9X4@t{^R|VDrzS3#xs;hLN85q* zV)a3B#;FpQ3|qMrTyEByPnB>Ex!Jvc`KE)yniV`#cWrbGj8d#UY?yRyzf`#O`y8Eu znwK~9Uz|D}YtCc+j{9G=o!CY`t~Z>smRTPO^J#l&wlQ%h@9wqE$E#od&=TXnS(4e) zp-`Li;7f_U-s`K*Uz+^Q&7WP}y~E+rgBxa>U$R__y`8u3w2hGDboDJ<>50p4{$#tY z6?x*qU$rK`@||VDx1NRlc_gj=5@t& zHJ4XiMh5fDUuIYKVbex|N&FL*?w9-&#U9*PxJ~!t{e>}M z_onr^TzdP1KP>vV1zXt)lZ-i+bQc}}^+Iab#O`qa318>9-T3-8v}r=%nG3Hziw9rs zO6qrs$UODiqNHiY=}qhQtj=@j3(46hs1p0-^YNxQ+p{yiKi;zMlc&IbyeKM@mKHAQ;znvr(?(~f$y zeO9UGHauRz#=yWRiG8K2vwJ{(QAtr^Cj5Xm&@dMWqYZWKjksIB$W5gF+Wtpk@msuu z6leQx%dFzlQkx^RwaN4I6yrxLOiom=`ItTb(*Iso;HQtt?VQS{nZLj8E`N9YLWA}$ zsqzOLJoWE><^5pVwZEX2>sQv}i4#6nG4IOxd+6>_qn5PotXaEjnZ8ZRvvi;H*LUuQ zdk#+3FWELc%Q<+G>qF@|&DMsqhtm(eWZkoY*Ww7fUwWQEQTZ-T%^ivY_20agWE@R< z_s3Ny_mAXLfko3Md+k{dRWM-*|q!lM*AH3!i9nbK0QjuJ^ zl0W0Q17DRldT(LJCJx`pv=?XwdY^RJQnYZQNNQ=Fl%l6>#eQFmmRuj z8EBO9^vdh4Pf8uaoc!ng`q9;v{7vSq>E@ob{*yG9p4s^HcqI3xqUf(u%Xhpv-o{ru zd1Bj%A=*zo}jU2wOPQ>mB7X9cIEF~FR zZFEi7WPg|y_tAg{Nhc*roTvX(OqaWLdlgsQedTV3S#AFs>MCCN2oc7w&8dCJ>ho-FaJ1X8}83azF5kqY%h4pTH?at6aLYW zS&2J*_a`<7``K&9dsR=hdzIC^E{`jo=eSd4dGpfL(iv3?mAvO0K6vxx^Gbp1$#%9r zGb}b}mTJ9va{A`a>zCqGr_H-}U2WOirjr$M1}|?^A5xlZpPJgeQ;9w?yRU5(PA{np7Br0?0@k(zeV z@T-%ppYycUCx3FycHePb>S6PpSMS$*sVJ9M|#WZ zguO4@m7lUV-Anc2k-944-#a1D%2W7$w{+Ph^T1Avf71@%HI>pWEevpyUZUf;?&+zF zbmanzbAEb$m5bQ*9({c3x!~0N;})8(M#s|L{mR=TSf3UZcWkK|-|bT$=S!c8e{^X2 z))Q&{7G~zE*{(MF4<}r@xajLDkJ9-blRvPo73=i#i;XUO;eOm73t zU27-*P(^^J@2{Xl<35?!&d^9yqKWwxrn1%__V?HWmlX< zL(hJgeW`EW=4;dRayv2`Hr!NM`*rHOIVX>u_VyHdWqf1F!2%PR+vc`&+Ow%#CSfSM$8gnYNuAaQ?wX$&59+I3`uAY<&j+jD z^ZonzU!dmoGv}uDe@;BmW@nS%7!o$2X!Dtwde0y4QNESBcFwVa?U5EHH_yv|riN@?_Bs{+SFY-QY9FwZ@P=24o{_sW zHRI3w6}@hc$<2DdN3Ek%<@i?hv-gh`hP5j1EZX;c*UvbKiy8$UtAF_KZ~OK~NbAe2 z=6b0&s|)VuZvM(Q`>{~vhO;MYb5737zrk}l?sM9W%V*eMM+r~gbg&>`&&0Ryrroz) zu3onPpM9pRGtZLid%tbF{J?he)&z0Cy7M1oKF?@c9;ji++1Xg$kw0lp_tSrjl2Wo( z;`SRY3oq?Hjy93VS(#D`y10hG5xN!x`X^`;iJTj{L`E;Jd31MVUR(p|3v)4m0BET{ zh=yT))V^?1x{-cp2qyzGs6hq7XpJh=L8A4d*8H1z7#OaoFfhnt8swW=T%4Gm8lIV# zl3z|B!5)>&?0@9;&G=6jmu{+$i}3-U^D{l4upO>AteW%e##OG+$4qlJ#`c|lmlyW? z@%O!2_b*I-7aAt*JL}QMS9ilhV<()RuXi}P<^iM5Eb){>f3BMDR7u-V%xrEaqI8Ztow(u5XyVx9cnav%Y=oEcbzJ{Oc4Fk9-&W z%BfQ>nC$W)w#Hrg+dP>{r)?$*g2gd{?(cksj2|6qVLMlR^6c}z-PTGPoHAk)C3YOq z`NaCr`e&+9JoD`a*DK1WpByXRp7JU$QbFR)vIEkIj}FKb6;F{qrqMXn%i);Ji%U12 z9;`kT^TSqYyN=L@xjYRHr&N~SP_$8!>J5C;@j+nwR>y0~jE_aEcc+``iWs&VWZ40=CvZpn*h&wlZF{gci6qFxsNeqDWlb^5{eZ>DK_ zt&^|P6JVRGB-L>L2Or0oo~s{}-&|OKc4cP0>&xTIY|VALd&IRDO(v)Egw&1m6QIWygxjGFVC|H_C3Ul;azy8eMLV^bxc<%MXrxVuK*#f~gW;ST(4 zF}>2}hBqtY_6-lJAHDN9@R)CBcTC5`8S|}#%f#Qkap1|{En9SzT}7(q^MPk!JTDxQ z-n?u0bK|kis|ne9NiOqWE-`=cy?Xjz@x68JYjkC&I%yjzzL-~A#@v3t)UnrFY1>5U zV@!vq_*`3N!rt{b_`#yPf$yWGLmX-pK79E<%lCtNf6`R{pVPNmKG}D^S-3&SH|2xT zhMw1fiV?i0mzm2QC=>iHn0`dz{Y(YTbN;W|A2zx@Fks$t_C#ZJuf34@mq-Eg*`mS| z`IlUeVG47(yMra_M2(-xzOG75~&atGGs#xUK~%#A+2{)yAATZM`~-vmPV zvdv_-DR(EFTDf@ZeN*Y`{`(0Dp)4;ZaD7kPtmu1tZovFVow!RHc2V#4&uEkUSeiVu z-uzbSoQ~rq=b1eoOMbZe%aUnRSjqH~-@d2sUYfgM2TT6;iMeOf?+QDgtvqnWYzNyf;4qfXvt z(&9_(D=tr#ENytlboI)^gPS8ng(5k(b=7WWoVq~C;k&Zv${d&1-wimVDp^7e4=Sgg zkr50vT`beZ6R&Vd*^2?*}5t&r}R~xsr%bs)4B>aEY^B6lXq%C&ec7e6`uPt#T= za$h?`Y~Qi_&L^hC6g^y|(_or0xm&caf`3J{Q!VF;>oPG9UiTfI!+u3K_r<|B&D(P) z_?`YE?6LTn>KAPXbLI@Wce*?b2mkdb?(e>vv&LCMHbN>c%;&L7MuOhWgshwT*1k(^ zBcf;MHf?nO?le1M_R&jb;-8n=nIAZQ`fSqGu-;W-&;6GgUw;5@{cU>9SnSGes6dRBDEj!mfbHByWdZXWh+MDyuW`u7q zKl!lV`1|YSQNKC0zW*zl>X>{`ZuyPV>Kfl3c_y0t=svt6X5xe?S~E2@Z~sVot?hjO zMRs)}Z+Q31FZaLBU$b=K|1^jBD+GUWu=B~uCdRn>%Pg>a(@>JPrk{bqD&p3uG_7;h zcRSC%OO|!Hx=Qs&&fOCQ(YdBi_zs+oma(w8>G^zetbe+o7eflr!%G;(m$LbvtK7Ka%+EclDua7An|M(x7R{O|qj6yLq@c*lelO%Fm9cBkKdQ>K?xG5t74zl>Pw6W-Pd zlj@hXFD&2U^sF*KZp*a8E;=)|XP5p_uG==hbV&*Sn`6=}6*O}i<-?Hz+i@SOsJq`$Q zsFaE?c-or7xhz5O*{ns}FPHhBJz0}>=B?ScYxit<)LbXbo&Nai>`gM_eCk&|KlwVZ zWAfZRtw(lqy7lRtJE9ZI_jHq)^riz-)weh~O!Bsv^J>~vzlpvQm)|G4|14TJ`|3%< zl(Xuu4%V!Ubu@R%*p|=t^x4AP1La5GtF(m~G|t_>v+&q@Bfe(^zLj5^J{+)~WNR@m zU{iAWk=~i>`@|l!I>@g2kT?IgOTj8Hucf;S&fjci(9QhA?aHOQ%2{obgnpauGfR_0 z+uOcmncuNvo|LDObm)(Pol{g&d0UuA%khVQZZI&cJH@u`!ETS->YLM#zLeiv|BO%G z>0|#)&P&VruBX3#`M@+}*_3H}PQQAnx%Eczf`f7I4oc0ubnfE8#%F&nAKTJ<^O%g| zoSDg&C7!0+g}Bd4csfNW9~lP{Ck3{-kfVU z;uk;OYWH&g)&J#IUaBiUS2N9X`ng}nSo~Lohi}cEUFFF(B9(voT#MQof&~vUU(S1; zw@^a}9;&Ud>;9zjYg5QJx!Lh)$E;^AvVP_EGIgWFA-+PPSFw4a zVFJ3fD>`19i*~Ks#hY-X`PO^EgqKcR1b5y2q|$LasO#WOna%rl&QlLrbNbDhU?FcV zpYm_hpE6`~J!2L6$@(uzN#yOPHD0nVdEp<_KIyF8x=%;_nR@cQS6kFBAKhw~>v`w& z?|@y*T$g72TKC-P)z+)!#vBS-Pio!ntv+4;qbt|*!y1k$-icDD1e@n=4h_4#v}TjI z^iL7d!kRCh@rO4FMS8T9%9!V6*8J@LB@?sMfPIk%Q{qJCi&KR-x|vP{Npu%Ue3)kN z<4oeh0u>&+;v4duqCyfs&7IV`kyiAcpl>ZzR~krlApd5YLOzq`K< z?{6?I5MOa&}ACQr0(3)#4BiPqAn$Ejx|^P1z{QFr;^Sbv!NOtqzlxRE_C@jaOAf`wcprb-8KvY^rxw2H!Kv7(^Lk9#<2Oa+e(n1?w{5QE zfk#%a@;<+Qz9EElty00lTc^ub9(vhloL>Hk=hiNM3A<}SkpicMrmL(G-o0wo^wWz| zCO-E3dcu9nG}d!cI|W0Iotpc-r%OU>ZOwtJ3(Wo8UtfK|#r5*}(JZT32RHT1y&7H2 z=cX5W`=8~K{$D3%`0<{eBdKh0@%*o+pZ=_nZ9e|SAe}q;Uj^H>kpEe0RQ@Gj_`j`! z=`GJsm%JBhQ~T!bU;jw@p-0^0Q+!c7KL-k|6Rz_`6nICJyCvCZMFS>d4QT61l zO_3SNyy4F--Rn8Kl5v&t@jRhJf7--X_PSlXDe9@3dd_KY+XOi=ONA{bSCpOWn&rFK zdeNB=ja&L&N!*#VGR#(T^~Km&y=Oo4{Or3;*w&$l8O>=59_nPhCc|S^{|RRe<{2g zQ1Ja@c~AkfQS)QxKaXwyHaW}G)`)ER!lfl@vUA6R8r}{r)~Q(~Q@3*ItvjeVudYvV z-oHABO7Y_Y$1B9oFNmuB9&rA_lSOBmCMEq{Qlh*d5otCQJifiyygt+Wb>AIA^I?kxqMs^~#z94Y^v|9x}X7v;WD$ zvu%@;(xeZ^{{P#R{$*CX$_De5Yp>+0hDKbzd-?Kvxw9{1e|~t}{@44%6RQu4zx2gi zy!)rAMnO0|+cNBf)3I}lp9UD+lg%+Muw{_k^;`UWRSlO%YJ}=px5cj0{7sI`seJdo zM0UzO#s{BHemZ%tSl+hS{lW8Vi>Lf}XZ9nj>Pz~kM{*}_m2|k9Pm`~>_DUciiSN)z1RiWY|~!<@maz8Sgvx}JpTI0Y62YUoSN4M?C)O5y-!MyEf#db>tea+$fkhu)eoMICz;s}e|Kz7% zztnlMmCrx9{9ujUj_A67k_nE{243?um#4h_wvDwV(Rbd{@oscth$WQ;9Q$TAO2^Pt+Ai5a#^nvqrb@&H}f6 zRbn?h9;`aW^2TMZslolyy>3=)3^UJ(OQ-DPV36^MiHcUJ&)mH(Tv>dbyuy#S4JNbN zF8)Z^BIVY5N1ttnhRET+DOS$Jba2F8{=-v{n4s#9%EufO}n?Km-v@dCqv{%dW!gj9G;6EmJK zULd2V!+e%ij44^Sa*br)PlFrN*rQh-%eld`RIekJC1}f*7s-}F@80< z;K%XnzP(N}KB?9`s`}k}XD6TT*@hMAQH?)Jvht1CN=z7{e*c+u>$mD(V~L6@J@cmK z#S|C6w(pwo-!h`{(}z&*yBBmNZ>`f`yDjMN$`ZBiIsHGEZg#&N+Ze6wv`X-$f1rlp zBBgaw6H|klUT%NI^F(}K#DjNd79TuVY{VewP#LkmJV!u%O`oDBN96&f!yLMHo{iJ5 z%v6@0YnZ%FKjXv27MH&l|GJX`D=5cewyr*_O-XInWLj7 zZvHsS<(rtG&-7Kvi}HjIyZ7ejeilqQ-TNRao#|(p$=P zjKEL3DdkgQXBe+$o8H3JoBO=FLxyKdwv*wCdxhCm@p&tYcO-C%ht3XL&Bv@#bVHe| z-r$L8yZ*v!9*dVr)rWFMJMd;LludP8@bxfLdzjPgxTq@=7X-*HFfdAg)_GO<)s_-5 zE+wP>U!uH+R3~*c3idNAJf89QLE_@8FSySi4`4ccAmtB3k4?-S{ppu?v;W99Yc~ql z7ENK<{KU}4q{L=RmG0vZxt1+wDjljVo7(&4wLbf~QitOyQ+i@!Xq6%NT^>ynzf{KO zlOrB{&0Vpm#;nT9tjcYBrIvJ#UvKD#OW!r(eo5}x;{UYu?8=9#>$dhMJ-2C|dv4_$ zm&;ieRYy(;Zrfq%^t!+FQ_hv%D&~Jv&*hyF-TL*6=|2;xH}_Xb9a8m)>&<^I&M$xb z^U;*5_RkuE+CE+`YxDXVCu(hsxv_nUyyw<6QsV2KN{)ISyS!t@$wi`}Cg*28n=sYn z=2Y)plTT<)*gWrf__>=`-<}M06z_G+s%EgQa?*N#`A}uN@ z9v=Rd*!!@@`RANI7q;@YJl*rVH(U-%o0=tk!sW0Yvx2EDquERsMv2UFXD;sizuL7Y z7jNM3NmmZcNZKkB)UeRogr#l$$0@%ao%~z%I`6<@?d_K@K6sW`XnWvBsi}O8AFCdZ zwDRfWKYHsXt!QxX-D1A3ILqE}xnExN;|H2a>ddugx2{++A1Aj)Fpi?l6~e0kp=bkzU=dPtJ$_nWD$NVP=Htn<-Y^8+bD_l~#FK29^sxU8eR_ z^_AX%Jf&~9m9{+D_42?hQSqv4Ent%qUxqtxT=!wE4NS9_JzNl&mGpapT(I^xM}Zly^-rnv)H^&o ztRffA8M7f*V7+s z&J_>Nl5;6ubBWlMXG_;Qtzp)FlMpT0EVJ>LOwse>6SC#J*WI>gi{aM&up>oX zeens2Zl`U_%DrZ1308T#_V;e&2*2#dF)grV{cClX#^*r>QFFJa&spQ}|I{{x_LwQW za$k?D?z^7zLGRJ^-m*FVXZRy>#GkNxW?fpw^Q?W@4EarhRY6rJ+H%aE=q0?|RhID9 zUF5-1H3b=`KTk`lHqSXD=k|E^!RPI#4;EO?)n@&6aC!IE=eM>!wbA=FC2z^P21fxt zC#8lymuKO>HWm5iPxj>e-NLb=I-%IZi+99dJoER<8O=Wek+WjI#_7se{nt%$y&SpBX3GNB z%O=w@kLx;_hm?Fdr)1(QII-y5AC-I7*WYlr{fpe7zCw8FlZ87)X1(2hoqv*YeY#1|NO_$4@c)0lmuKh>zCbC9r>Vtl#!k0+ChE{sm3)(q0v0;$rpVowJ(J5LyfHudCv(5Hm)frDHIq(@PQ0+CrfIwA!`I*XQr)!|E!4Dgk=IsQpy?p=Ud!p4 zh(c%dQzi3VxxSVY$|l{}w)N`8w|kEBO=!RUQrgzHU;cKjT;Ayy-%Hvin|=S2T3(gE zDrw5%M>X5Ns7~~f^uNNt?T3|s!s)GS`>!{N|9d4^x9Z-3(@JmRwC#_{#4h;D+`%&K z^ABFW|61;ETAREj9)@;&@Yu0cE&k1EO{rTaW1Id6Ke{!WXYRS5p6NddrFhO6_y4k+ zKQo-4^}2@9I)g8MGiOiTHp`ml2giEGnG@4;XXmWoH{L&?YHyrX^5@K-ht`J6_!gGl z%iL?^wEEB79EL;9B~w@KeOY-bu=1?j`|Wn7{YC#g5+Udt!BVik*C*T!2uF`f52&r;Sm`Mc=7@@1|o zI(7Ih@zDF(i-)^^Mo7u}IrIzMAIWslLN!49-sj>AQg;kO6DjTynrta+8{qpdW zvWBW=Rh?s}O_=JhDl6XcY2V-HZc)49^ao|jiF%Xo&e^`YSoY$t?oi7;a{TpsXZ-tC zZ>v_-b8dG^mf;`H+=cGjy)vxUSa|I--sjZl{*w9gHU2~{t;zBswI6ml#W?LL*>`dN z#)8VF|6N~vzh5)+qG12$xYb@8796_t$VGF*k~!LJYc+e1O>h1^JM|6E#`N}l(>_t2 z_W!3{4rhf<64_nfU(nXP`{56_iN2rQJg4|EoS(6MgM3x|K}F&Fz8m}76D1p4BBoAO z+}v>eoK$D)=TJ)@rL|waY&`z>@O81&WQ~kFx;LZDeC?ix{gOw_L4$@e{v4h)fti(o zfk6agTP$ec1u~QYzse3Yjse1GV;Nf`F6My`B-;0ARV`!ZOQDSAb5}l7T)5Enw1CT@ zlHVaSA2e)NTqkom?|Z*feV);3kfi7v)Rohey?SGbtGGe^<(9^x2kCqX2Lh*i9GjfIfaf{u zo`8vu?q6_i%$ex3kvGO+vPWt(Lw(p5v8r0;JJaV>e#`u1^MEO0QEK=f$;)d31U~QG zWYK2X>g%=G_l_IukwbqCc6?4_yz!WQ$M)sH)iO3Q%3%$ifDgxfIA5M7l%Z_J{<_&|5%MWg_m%bT1S*yog$!b)cM z4`n9^s>E!27;0dnGHLpJwN0O&-#qqNdfwKDhnxgF=Ox`KiC23C*mM)Tp| zl@IpkH27WLWEHNp%@G{2> z`%7X|zEmo)_J55?c2xc_Nl?8z?X~;k(?-vVdG?*oYj(^v+4my#oXC4wW5<%uPs+@` zs2%i_-Z!`WRzcm>Ow)Z+=FGVA?7JA(Kcz>VT=r?Ne1BzHSnOVE6utXq@FLeO^#XNE zkGR`}99`JA>#EU%_NQCFKj>?jtJ(kf%Z9S;p+~IP4~DsGe*anJry^!u7qRoYR+9D< z-K9D0uN1;0?DA_Fv`uzHe)e6|Mhv z+BNF%X39)%`Q+RB_w+Qz^%uem_o}BWe@wOOc%${acG7|(*)5*}>(=rMe7T)qaIQw{ zYQW`PujYK`^83vB`giJigK7TX^tSfjogU=7`vzl5@e8}8$cmCQ#|ORgAJdJFD)pV7XVHzHGEKIK(D8f6LmS+7;XOG2dUe zJK7{`#`=|$Zl8Z<*FWL<)U5xOWxI10YRNj6fBV307`cpXfBo}s|4a7lzxBXZZg1wy zDePC1BiHR&6)JstV|0A$tO}mHHxI9$ep=z_&U@-twriiilzMdQt!TD8zix>=z2)-U zIBl9a*5*_B(DD^WOwh5gsmydTpTpV-g^(;-z zsa`o#C2KqHXctbIJt<`8uh3l^`8;KwA2X5<37cgy-}Ts2hT~_747`*6-fws-D}VI3 z#=G_=+tY7F|Gzq7bEPu!mwY(#c|D*~Rc*48s0k|rLy{<-Qq_#W2=QKMshS5aRW&d3 zHePxc_FF(A;X*)@$BmnIp?L;JZwn|N-*Wi=`_hIs3(gd+w_c&FJHN}!FV2m(jyc${ zZkg;4ro$NrmDILh=#GnUS-AaHi%U^rjN|n6+ne_4s9xDsxc)`x+Zu6kg0Z8nod#xKz#f7j1N*>-^26)pEIu zEJYOxMLdscvF-EN$8*eB#%xhji@{BscAW-6?hKJ&7h#!b+wSQleCKboTnOjdvzO^b z@e|caA799690ncpmh^|uOy~{!P2*YMW8OBge%RV{HSo3A20hJByDn5_74YeJWlXQ> z&70=Y@$X)w#3AEWUmx+=7hKrRw8}gGpKbm5prrjF{&cI-WB(r8K0Bp)T%&fewc56* zcAn0QlNAL0B;yqhI_KZ|+s3inScdnn`_g^(Uyj?JZ{BCk%C2_qihNnRayr-KnVdAhZgwP>w{Sb?8vV&b09e>yHpF5XnY=l#j8FpBxqy#Vn>hH#&)mfV$J zCRrT0v!&(x0WpEX%tN~qc6g|qKd-jv@=ue(ziijl?wA;Kx~x|eyE}PCpGfUChhKFk zb{Z@^oV@aqybQzXJd-v0z00l|BtEn3)PBr$JYGLi;QewNvkiA*PTVar?>T7qr`fgm zA76b_>W?qWOITE6Q`rK?#tTy&Ry?Z{{3c&y8k;9?dQcCo;^?C&CNBC^j|S!!+et?zqWrqb*kuX zSe##E-sLdi+xJ@*iYIV)t~&ER*0%q}oR&XvEgGwXzDKYBz4!6Izk!RKQnEZ+6UFbZ z558(9KSN;dhEwk{R~9{0SkAk3jgwER_t6ViE-Ri3JvLEWUb-&kV%YAu7R$%019^U_ zCbQmHW9-jz|E1aMGm|S!SG{<%4kUL*kL~ZI%}hDhB#-^N5&V7MB&Q1RrXZ~wy8^Sd z*e&0_S{B%`GG~>pOkuvT-e~1yzz7Uj!BE-FysYuq`|ZBDGfZym*_zMoS2gv*Ve4gAxLWEbYsM*m{Pd-92FIW9qABSXdoF&+ z&i^&#%1ufBDp!@8!GHJkIPdFQuj8ox!$MqZO2XcA3(J;YQ7`zWUU)YC&`bBDl?7cI zk6+ZZschePZnBJ{SEN>k=7N)R&7Md0DJ<0yJu>A&ihoCz3A>M_zpJgQ%gtkPz0Vso zpRd&LP`An}Tz>IgwxHU}KMNZ7efxDT=ZSLK{a;_}DwpxA-jt8^I4st8qx9I_dm6F< z*?;a$+He2Ck~3REI3&*{B}Qfaq^RpY_cXoxTcd9W-L3!b)Zt&gUT^E&?~X;&rtVF@ zdNwEQ-P+~rv`?E{-n=X7|Lk?n>^9mjm(?wF+e%{g@S2e#$TQF{FEi*rq{%hGx*ThfSr!UI% zOqAh1drfHlf=L`N*F8`I@x-gCb6JWQV`drWQx1h;y8)nQ5%L z~D;Bfm_H=>s1czsvQl6NQ`nOF5cadKr#5fB7bT|Y6;RUUWU23%ay98e|BD+;s;3nr z{EFr^92eH{QZZS)`D>izVG*_0To1%JEqw&0sivL2qr}$L z>TdqeO6F+7Z~qS&?F-)?_unqEI<0BmBkpTHHTzCj3I_X45)Cn$D0pzM@V9+Jhu-a) zCvBhkwbuOGT#crG1}xG{);)Lco!IQm;g)F7GpD$LW2;8){quWUdv-i);_(SIoHxDn zoPWr(@vrFt36-T z+UmZ#|Kv{7Yd+SEk1W+ME4w~)x%gc2;`d_3C9JW5TC#Qd%vM*4Y?sK{d+u)a_w`t-SII#)jP#DP($-m)_XsZ8?jnm z%cJhCuU@j}SLTu#jvXsgR!4Q-{FP(EbdWo=YKA7)Dwg^D0k#6iY*ruo#+a_V*iqEN zML@sM_iF>&5Rn7(WZu^A|sNi=N=Jb&BiULmNJ@ zcx!*W9OJX1k*{WB!g=qnYc`onxh+2D!~A+jgX;Nbk)i92x%1ZD5{vnJb=l-TTf5eo zA$N|QyBxf`XrZl*2CgI_H}anPu~_;9{%f^OXgArm@yfR_wjcwXY)l zOX_R(la_C7a(@&B=H~_7RW$vc&G5FS*j8WaxPPPZGHF#Ai+!aze-g7JKkUuD_`IEU ztK_X|RaO7DpR{wH{48_hgQHh&Ec0xt&HAP>v1XxJ>F*`K3vWw?Jkpz5a{VX!sV{-E zISuvKMYlK33g@4AbLYNSclK0WIe&A?vR^y2tGC@Rw&89&SRt{m$)ZGdwJ^(HR>iwJ zO3nx5C~REw#$wi$`7f@@R@!K6y>o84y?(sysweZ#O}M<>JuWBrs+@A&+A!;Vfxq`< z-o2`Ggw^Qk;@f|BikTO@JN|HcZcgf={NLrb`VN0%{9GYqdYxJSr;7XMi(lWj^*?4e zFY0{sB=3e~Of3JE0(O;Omn@&ih*p;NOXPo_A;(_je0R=X^M$9LI|o|J-&bA5xwNj{ z=-2cGb$cc9{fhQpn>btWTHL<)_xi_qW@)EzzY4ArOt*O$abf!%)t_i12GyBIuJW@m zFz|5VF09}K2B5+UgwX~JriP*(MX7jF#ajApvtrxECk?5yT`s=iFfEg;O5PQ?oAdPj z{H?w_Qq!i0D%^}M^_#oPR9E7W(W`^%A6(C|UXT88WDYk={!YCa(@teM#;@DfbzWTR zO`Wu!^;~Tau^rBBUjLd`Zi{*{L#KjMTlIODZlhdrE636^U)wbIG_Q?uKER@gmooIvo=}-TttsLGsY9BQ>!WM;!Kjc%mMEd@{?Oi^euP z1E2IwdT#ycDz|4?&Cyw%`r)kVNvAvw9d##L3ffcz{?}H#Gf)1<$<2ZGA0|%}KW-r5 z{=n&lTj%}xEO{&sRk)6CEN2v0ESP%g`{!FuelgyjtY-p@)A~z>;I7>v$e3kfYECD-Mr_)-&b8OO%U208WyGV!)dr52J^>aU>b01jfnqGE4zPmla z$$H9kL$NLHB4;)|5|`>%*E8DLxPL+NUGK)dTh$(3eSLVFztn1X?ZYxkXGCs?EVz{S zKhsoeUqI2q(+tJF^QIo?R($2obnC2fd)n=+E3ECt+!IatF6t*;F?`yv?Y*z&#mxLk zDvvK-k>0uYz;1Oh9j`wU&+hf#ci{RO)oC?-BZtcARXWdF=UhA^BYL=zS%2#Wt>&v6 zq)N-!B7V2()NY&|+CPi$PE5JXj(>}tC;D+$^KD+au(!7GyqB2xrd7cX*%4Dx{%+hvQY%Ll5zG;L#+|Fm1>`2Ljzz5JE&TlY_%w0WoD)VTGlHpg~V&q=I% z?#F(yLco9W^9!>tT@~crJFz(G-Q$x*52BARJYUZKN@|Pl>WhoL-m8D+$P#+ty>P0| zo7=a)ZCpHY=7asW-qr1UcW;j|FPGVJR%_X5`>bD8H!?piupH%znvR-n^<)3SxmhHb2x7Rqd=)C)F=^c|53h!N+r&PDL%w^%XEPwIe zDK)&8mGytFark{w{%-&LW&L$;F1yXuy<+z_Yk9`$evdQDyNvlOK z+3E+~>Hg1;+8SEdzA>wlm4U$y^RQd!kfgJ_p((8M3@Tkf7_Ed^8y=m1%R{8@*#1Wx zaXzop3TG|Zefw;)q1r|l#+%Cmzp2hTz_8g=&cs+Hwf^rsN$GeF&*;phUa4vOitV3U z`?2S}Px|pX zY7S1TuHAZCETq9nyQ{00WuHm=?2kNW(?TYQEZcp2%Gtyt&rBwZEakj)t-Q!r{KF1& zCg-<~F%=BXeN~-FHotkMJlx%&uB9^Xp^T`A8&@x10i#*qtz5>M)kk-|cr9n3KlRDY zlP6X)h#xRoTy}Q5#91lPq?+?Oz7HoJ^1Jj@uQY%;>7kxap895%Js)lFR0cljo&5WJ zM`(86`Y)Z&X5C1eZ4}aD$T=zT zNZ_wLzW8r;$I|M`N~~0WPnTPzlGzo!MxBw}BXY5U-=h!j84j+?j^y6e!Z`W%ls8-J zGRyyOiCR6yKFNzuO=orKkILLng=NlH!S53=) z(0lYw@a1B^o4gi@%WiMbKDBLiIqQwL7Eisx5Bhgb`TAUQo1~~!Z^H9K7WWP|+kbkr zqiy~9n=^MF`QI+l$SMEEoBhmN#}ps4FQ$fDq&}wiZs0d!`?$*I53giQ*hxKIiwpa{ zPEz>v$AP`wHzK%%_icIZUDwJr5oZk3tmbiVJ37r|&8L$lX@RSlmU~Z~p62!JK3Br+ z#?{^Pn8o+M&da}WY~z%*D_4a+@8n9%dvobHQ+dJ!x9G&SGkfp;Etqlp`#R2zB0o>_ zL|5*4cQxXmfWK(vWGR^ofeC6Av%Yn%c=66ee24mhvo}{{>fNn$U18X^QQp^W@jmgF zo>#cPsuf7x`Q9a@QnAT9^e0Q%^&jNS zczJzo&O-Sa`(9j2RK2=$y7;@R-Rh6UWPU!aPPUh@4ES*+Yt5R=Zu-(2PObQTe0jhA zJin(&0z7+fY81xZ`eV31dHTMHEz9rPyx(^qY+s$#{ympY&02PUS>;&<_F4I9-*PQ` zZBJZ{xtf|j>E*(G+{c?w-aUNXfX~ot?!;qU`Fbryw`a^<;P2iO`+mtf*0m=Bd|d@p zKi|r;E6P`Sb!1!DmwT4x)vu1XuD+IO+hU}w*3vZX(-xVCl^&OLyw84HefE^Lw|ntV zhsitDG+vz8sc>8OaDLd|iz+44=56_XEz|9K)`#2QSJghrjQkw`VGDCmed=s`)e^;? zuklII8$;_n)fBwnsSW$&9iezxVQSDss+_m^CqN zsoj(xbBfRJ-L`&i%%O(7WwJkb4kw&sQu}^^J4|Q6h1+jxlyCK5zl=_Zvm)<=!&&b4`$N4cf@rsJ~dg`6JI^wh#e%wcR_bcoU`gclSkRv?K93wu^R5@fA-s8`3CNnMbD*IG(=QL?mGYN3~Tlu zF8ymIS-p3!yB|4adOYx#AHP@5=C6`m$$m{N7O6FzO!3v1-x(XNIagp(5LkyaZPB{cFR9kBe!M|kKpWS9|Ug*G3oLC5a1E-d~)=rOPSStwsrT9 zZe`rA)&#o$Vv#lY{tNFZ?|;wXX121K!u9VeQ-+D}=8re`WX@naBcpw4RoPA@>0Mt> z?rTeZ<|H?*a;@2c&#k@H&%I{vvty0zW1q;$dS|jCIH=_tMY%1kc6_naLW+ zzsoC1ymWB(?u_2~Vec#|^0#rPdd)0P`@Jk;+L;RL+Yhfq@b?Et%744J;pD#3v~}72 z_dnzt9TmRZz+oe3!n679x&tL{hnL?AF}(WH`o+}X{ep?Dit$(UW6sr{-1e}waqF3F z8?(yUON1V8S(*7mTYWiSVamDA4+kP2eEIbtXXC$(cXNW*o6UJJdBsh&^@+Qp6inrM z=N8Y+e<5}H!3hh$jCDs}>u~5!yi#w)rM&0M&yBw)zl+bcVN!qScfNQ2l5e$}xQeg5 zD_;M5Y4ZQv8vf+_AF;T^{yl!X&h}Y1*C3XLj3se^M0S zS$ATxaeImC-+d3PtNp?_U8Y~?ai}T^Ez0jY*k8M3QqHrJKj%fSOSoq%@~ZCEaj%hcD?3 zm&w0r?5*2@|i#z8g`i2nexc0ZPVO)NpH_o?U;U}JyXKeAKg9M z_OSAW;flNdyWUnWj=XLl7<0r^IfMJ4;ny6k2$B7HDbrpQ<=ng+R=*_kS=^z;^5=eX z-*Ixz&c8TkYmtGI+{0gm+0u*W?p%DLFr9I-yRCWG<>bl+#${~_=ii#6Yq0j?iSLhe zpREb|@4H%u*>3TV=PoZ7oVvKh>sRrEb)Nq7e!ZG^H2I&>`z)>GztgkU&oWe>7Qa$# zMN#PrzP7~=Z@j!4{yNIlK!sCyaeHF_?&7QW4$pWw;rb%^?;4_$UEEh^Onq{F?HLKn zFK3U+tyf!~!6$fu_vXY5nVt890|QR2w)#_b_rk+p-psoCC!Z@CU*TzPiMudy&4ax= z72cj*w9P+HP1$l~sQcY*#s`fS6}&z9_J(Mop}Xvr-)DKZooH`M>I}2WdCRt@cW#i= zyd@?(*IX^+k~#68m1k|!+8NWX>zWu^PHq0=?ITy*vPEj!q(y=D0u`MPS8Py7TE28o zZsyv$nZXw)C{FwE@S}m4O@n26;E(W@Gx8mWH5ty|ob~?WzBa3giPB0;=SyXR1Psoc zdVix|!1kv!%gbFQe+|xt^XFZ;w{m6evZ%EdZ`^aZo-I4R-BrybK2hsa!0roz%c7?x zGP3n~nY>DUd!6%6D$CY&rbl1R-KN%OEaOvt^vnG}FB2@@emh(3E#J3n+tVpshgp<_ zx<>81x=RZ$X^YkD+qqA%u-qo)Ij8cRlPg36kKMPg*Sa&+syMy$jOY1_ z-_L0*R9EBP-t}WbCl{;W@oSDj{RPWhOHGfb7YG%en!*2z(@n`wl3%&9$yCvQ=I4u+ z2dxeqSk}`qOTx>?@3`xlOIrHc@)K_eMt4SYaJd%TYFyWq+2X@8le0o7UDbTr%Y-(8 z4W(i>JCz2=7?%`^S_8 zj{AMKO-=u#8Q;xmC!pt{{Jnejt~Tw<;hpLH;+&6P-H%p_6XpoxE&3sBcQ)(lJnd;Z zPgkT_`~3Btcs5umH>RYiXrja;oef6|>LS=~{ZKfRV9tO2t4hW*9$l~Cb;l-7Sy{ij zt7xy2<88+8=XUmcoO5-VczF8C?^~i1i?!{`Sj9xImfwfmTQ{4<>XY}r}A#j z{}#LYT}o}X^ycT=TXJOoMpcd8it6aKld6txzpK5nzTJQIsZQND>#}Ea>?uE0w3b8v z+RgZ~SAHkAvRQ9DK6jz+(-W)x!)q*0>|OKjzy0_2*b=MnXKUWget+)obbH0`W&fRv z^8ZZSX@2gE?XMs%`Bu%Dn`6!|uk_#YKGN3v;lED{()jE)%2cnZ4{V5frT;zBE+L4U z%b;b-P3`z^ZvXae=(4(2FH@W|b4$-9ahsa9sf|g6OkO;vl@g|`bn-Ip+Ob_de8uM{ zXN%I;i>A+R-FMo$I>Yg^O}cl$f-5(dJ<8ea6MFAv+OwR`bLQ2&p7{0Lb@p6w%XPxJ z)ps_WPi-ivYJ-izJ@+^FsoVUOIWH}(AG75~ z)4%7=JLY|w_5-c&74_gNrztZ7LlXzq+0fvU#G(@a0{FRrpb8v>(JJw^A^!Qd3`FeB z=RaDxcS+E(N!zk_hg!3UMW{@3@zi+5IrE6(y{6ur<+Atd^cS`Y?b_DvC3E24-|F{2 z3z?L6_5A+8Srcb)?u(SozJxhV+t+9>YBljoPzcLDDYlfYxPU8tTP%xmgD`T_-Tz@Bv_*|G4?5Wl9s`99j#O9tN*NMItc3TFko=x1B$9Y)I@zV^3 zHm1_fw5IzEsTKMU=Xtg6f5^is=PM_wDnQTxtpxVB)MNd|~jhA5&{I~qjGIgnk8ipyXr}(uM zm$23@EMfltl<7u#UvhoXx!mJTo{zSLO5TW3{Q9g=+U-VPtgqzxqs%qzw+)J-98Mf> zdh+b0`QwbhPRp=u>?VCtRqGjZ{gfvCHSBj6w(q%=%&n)N!>zaOZSdn2uP>y|I#(%v z)qBM;t?42@d%R|;eaY@kRjie_SX8C3W7;C4^@3JT=Wd@^&l@x;^yH@P2g5nuB^Tx^ z%ck4s1iLQkTsQS)wQ*>UiIbhLomW`nv+(Y%>SpSxxS+y4;sOW$7i=h!H zTQ;x%yIaM|S>zu7YG}42Bgo$PCp%(*Te`>IA>~$hSSJeu!xTZR8POfQeHhW2{_3yc z55i~}acg*N@hT62TE6{@v?~omW5NTHH?6F7Sj4$CZX?6`*~_nVEI!93SuQc@>;3#@ zDZxJv?xn1*IWV($*ZG&3X*0AdmT)iUy?=mfxlT$E>)e84PF!4#`;v1QxG!%g-sfUo%mZ2+CU9Velg!0TnH3U@8x1z?QLlc{ zc(J~1;zJ9!`_=p0*UTxNvoya%wo`W++cuFzPQCFVPGJ0-l*O7aO1%Xk~i{}b3M4^5)!oU@zz$&V^IY<4_dqqHD$d0DLLKP zDfJ-BvnRceHvO8iccC7WU762LQ|<~2Z&{_X@I%!J!5lk79>yBv2%YR+-TCHj)v6o& z>q1+XwJ8YgV~Z#WSCVlqxhZnEocUZUSFYSimVb8{R=k`Q_IugY>{(pS*F9o2!~f0U zc%-f^qxw*p_4L`+nC-h4?Kt_MqgD7HU%i9x#~1rA2~3$`Go^|Bet5D@#$7Sh+S21dBw^LJJ!Z(i~kn-w5MyC z@-hwW!>jCqcFtUpVeWaPLT4sVhV`_FxsMa}hB0jKUp$*bPB5|S>dqava`~#1vQ~v( zN-Z&aao6sX%Na2xUi-`?n?)}aUD#G8Q#1SctK%EXD|7y~Y%Y<^aPaob+t&3Wc-8Ff z>>t#pn7`+H;J;$O=at**)3xt9%-lcvzMem6&Hqg)d)K7wRoMAY^W@j~ zX)*fRJLm1w_&vL#v+ur;-7dTOGc}<-o8IwHGM2ty_A6qs=()Z61|NcD%O}K~Yp6Tn z(0R@}`@!;G?-h2=Y23oO`T3X3yWd`i6-=A_szv7I!po*@w)~dTQ-3=DFIi?P$3O9*|2J%l>85q{^GBAi^uDJrY zGGKFepi&Kl(MqoIZ~r>s zSnP4eU+=%)`1_8>U^ho&^8M;}*LPmGTPAJBE&XL?Q_Y#;bz)DR3(qtDl%6_GLvd|# zR@YCbPbWhr-d%HPJ*ae>@HG3{Zr_M9-Q!%`r75ZbB!jsh1k-t-)+-3-Vw6k$;m*t|FOadSGe$ZL0xOh{-W252* zhR7<8N4N9r)z*LZ;E$82n)~CU(55V{f>ZNu3U!`;CdqD)G|97XQl}xqyFVK$xp~(M zZfX7zSbd-CQJ=i)l~-*~0?%_lUT`zNTJh_z#P!lYO&4`!E-(3Y@0@OLqp7e*!l{r$ zo0B9zE1!xyuvuqm=BG0O*90G*|De54Py)1^$;Hl4(5Y72is z^KGuJ?1%D@;uqesPM-g!D88K7WT6mM!}B9dt)*mzBG=NR?`@R6Z;30nzkdGCF6X}| zi~}Q&Z_Ef-D73PB%JN4?8-qJ^Qd>VN3f+5kz)6v`Z-7m-BGigfObyUUguU&j~ zpN7sitE6Jr#+x6OiU=JqK3VKKwXdP&S^dn$ilf5w&sz#Dj##L5O|Wm>3gx1-$cf+H z9K3OSUUsCW^y1XZ5|heA8;;Gs6|Wj@ezNE0)w{BPw;HYB=e5aVwK5dgx{2lWv)qYG z*s>>eDz4g=T>SF(gPF^D1S8##o6OpDakAcZZfi#8x+x7)Qs+s3pSYfrr#8*fDos|P z$mrU|MQ=Z@H*0+R=ce7xkM9p1Q~0*{$B~6y(JL=4*ZwPCw`TH+Ws_7j3pQ-+di?%Q z#qy2nuP02{7<$1*_aj@<)W3}9Z%+S89vlmXRyR^}9h4_~_9_PCJr)@1%kxW}-ncDelvM$$d zzWOqu9xnZ-c{6tT8}w=k@-@eJ7Ur{Pg--St|EU zw$V*s>u&SAUCv)$t!I^6=lp)z?aJs!3#HAkFF!t|>krG4gkldJ_8DbN&bG@J$%ws~ zFZAbt<-b>7as(D{moYyvt44Q1(D@$AXCF6dW@;?iXZ7X8tVib#1#NOlS+=M_&+XQ^ z2d&FBe)?4{c3pUb=h=>R95*lieW19bFMqZ4R88aX2fwYh*A)~?>#yFF|Efzb=KF6s zD)W6k{yOn4A>5APsFD7k%BmSZE`+D_Op!25BsFq+(BoXnyu>&b@rW z+s)sKdk2f)+v~;G7k=gz*ZM8|HQ?;OZTgFRXZK91Ex2$*CSc86p2)P_>)%z_lzn_W z;q{I_v+}l5)h~O$#V)zLH;Z4nerq>#l4+~jZ@n{7L9_b>ckZ1t?R%XB>)k%RnfJav zU`ndsUb}1Rtp_#M*0%qH{>py+75yr{RH@~=TRx%D1n?fc4uhU?$7FDSlSD{+TC z@IuD#t9PgE)aJH(we>BR$J}daOLu03tu0N7<9waqQ@!|WdCrTv`=&R~8-HG~;ooJE zigb<|1LkYW4!d`ryLayL3*OJm|`7n+a1qYHs*V{dqF{v$Vme=`5OG;0id^^dCTydHFtv3>I?#-jy+QK1tJ zxpR{ClYWLAl#E3nz8XJ_wvuJ40}VH-S*b;EoSvJVV`qXI6fm(L`FA*Mf=>dJJC#a=PVQj zHqNa0WbuJZg<)+Td+!LZRXzQWWsII@nc?w zz=4(nR!W;o6Be*eX_Zd@veRC!@#^kY>1>NFRf})?YiNt{l%G`Y)V=srYe9yDVWIw! zDH|oFekAcn&ksDjt7zA`7hzTPZ+oh?y*^Z0&mqRM=HZFV-rd&(*d9Mz@cvdhgWg2H zlONvp>z=uAZBin`a+eB|j-)f&XPo1(L8cHiccTN;k^P0q6y-5ED|N*3oK^sSY~WeFKcj&cSq91 z36J7+8mbPPyv{%Kc~|Cv8(T%R)=C-hJ9{72tiEJ$si%9#rOWcMcgkx`WV2@d*%!Fz zLdz~QrSpd#9m(DpP$0HqYu|Pi!Mc~Gyjvp#Vk%>DGlGqp>oj~{Z0)~w(k4NeCot_& z!z5egDTd5uZ68Mn zuDHMZaDB7lv^9(yzcftNxV5law&F8~*D2lA*Ej8E`@&xSH&K_D*Q@^Pj<|_=)|a1m zH9Bk+j=U7IO)c#7oEPFo%<3C!dCui^^lo3iWt-sX53zA|E5xtIx2vr^?X&DbQP(<$ zJWb7Qve$RLy7hLEO46o99X~A-LYS;s9_`sDedK5R>GJzbi+q`sPSmq6?$UjyC_lm7 zYu=*6JI)xbiM1>Fy*B=|+=?KrlV5+8pA%o5{698E&SLGwiVW$9gmt!EcV)IXTw?mZ zVnW=hUAxY|@+x}wcJAvxd8?M%)V?|epPz<);Sl#R_<7v zxc~OvO>LW^o=m;6v3SbVuA16uTtT`UgK|%-{UrdDo3Q;SE1C(LFstJ`O7C1KhJ!VU2vzNGeB*r z`?p0cu{ytx{Uj_>OFUTw^q-! zKlgjd>aW#L>)8_In{2X0mNB_Xl}tN5W6NY`BR*zR3%N)Ammj%Rom4v`c79{}4eOYc z{Yyhl+1v#bb-fRrIzRK$NtWF#dfbb-?7Vl z(eKli_d59fF2}A2lI*#1PXBAav_Rg^D`#0gx}9SQo>Z~s%$u2-T*|J;WTKT_Crwt- zh)fn2E84ra_*X^kj}xtNduIlz{j5KC=7hFq*+Y@H4W-Mc-_+MI+a9;t$n;ZPmRRDG z^;=z(zWZ6PKYh~lo7qm8Z>wgjo?JUUsPglT=RrkDKSTFkpLpzhZTR%pi)CIVPpVtA zXr=fW^+@|RK-JdWWA9$gWn*B_6~r?uYCxdcnj4;- z|Hwn^Z%_SE(VB?OZ&M6Ccclw`^*YwbBgEU`?!GomL^QzRtb}-x=*bW7pNHH`U{;(P z%c)v+wRYa`l2*ANSr-;?XB{sV&cycHYLXcq(8T~Ub*k1WVp0%#;1tF0^=8E z=~*Y!O>RcDP1~3-Bho>abEgltv^V&8s$Eo`IpOpcLuvx<9^4VOn`^~VV}s$BeJGV8&)$1fG@mrs|w z`$Hk=W4xe)eAWbK7wvj>-&?u=uXg# zD)Qg2U-9X@#V;xzCaGW0SYhp#@x`{QLM{HK_SHFp|D)MC(--!XDk)c&=_lX2kx`Kv zzdzU6B0>K0WdVhkU$kUSTraa>{>8;^KVK&O*z+sh)|1ZOd9^k;%B85uK=evg$&$;9 zV-yp%++xUH$JNei>vvK!vO=$SQb^i--~UCYuN~jyK7W0-T}LQMuf< z+2@-Ta>9aN=|z7`{`jm${mz};`FFNGI9V>1Yq2w2ZsumK$mM=c!A7p?KA#=z^mn|j z-kGcxvT}a@&B7PUwz|apFxVsFGO@HV^`_G%D-tYSLHT&$1 z@KrOo+>AFYP1Zg>$8VyW(!By3@wxj_UYqu(ubb*Pb73g+*+jA5rpIpxe!QW(Dg5RB z9Y$FfgVQn`19ETuRyiH~`OyER-=1@wWKt~N%WUMk@w7nay7H$_ewoYt++P{8-?8i3 z{sS9!d0rOMV)D((D$x1B)V9X$K!n0>nWEgH&fO;zQ~nkw+em%gb^iO?#0xJ>-uHV% z3r4R{zT{YN|J~B_a$kR)-+OT5pRF$^Ypq`87V#~i@a*TkyUJ5N`W?QUZ+@{{!SBW; z=khS4*2z~y>Rg4V?cuy};htGUlhj(tHFd}3nP>f%)Yr_Yp0#CcpzVUi{z}yduW*a}L;%oDbH`!fVZ8u%-So53Etdc#CCVX z&6ATKCuq$HjJ95Idh4(K^*gP0Rt3MV-7MN;y?Afb@)E0s=YGblpBM04t!8C>ymVo^ znGB1%G2{M!4Bmb2u?63R*InUEdjDDSmhAn7`{G01+6mt|d^6QJK%-IZrQNpO-}fGW z{{C&Ebj$+p9rsiUttxfiAuk_ zHqLHSiu{jajkrbe}qZ_&y-9f6n|9E@KMT*K96U zb7_-${m)ck#Rd8z4Xr}^ZN$`wa@h3_L(qq z-^54qlN3HN{&~%%En9krUxz87D*vjl_CAXrbzR-RE}y?8oc3a&+igpe)ZO!L-t)Wp zXL-|Q`N-TZ>HGg15B=V2{eD4v%ul8XTNjzzthB9lVqf#*wWip-mG?Gi+`4yhzI1BY z_3(p}C0DM!RP*!?GwQ@e`uF`j2Fwf$?(DehJ0lYU_1)T#`}wzQL~7OQkBZiE1|4JC za{Ei@ediMmZi`gBnzZIk@RWIU_Qr|AQ$OC9%VzxCxbF606}b(y=XO4qi+|3hRwB&* zkeOvsLeopzo+Gn3xfc7L?VNUM7h`GtV-e#fui5P>Zm=)4rcQ=g<4>fQxeUDc!Q* zMGD`xC(k+D0yPXvOAJp4N@( zt}Jmgbpjp~iu~q3@uBUYiHG>HzZM?pi&Yv6C7RhMiZ5@ppI>F@^4WrGa-g`v!edi9 z-+#a9)EFh*$@nZp_}FUa^W1yRan1cGBHTUHiQQZ!Hb{_bk(Xt)|_nG;`;}(#O9P`e%B#@+TPa|MC34Em_ulmU}{^fg_u=#^Z4 zI4U{ry~bCo=Lfha9t&<-JkkHev-4hm&*{J5-nnn$=gt!v{}*3dP|R5?`ij@?yZ!z` zi)SgZjj}z{X8bF%@V{KJ?aSVo_Oq-6+)f+p^Ep!B_Cw*TC~JLSPyV?c+2s=#g?=rI zem|M_TWd}3*V<={e-G_Fp|1J#UEs5p+x-v2^LP2k?OFfua*>%0 zjIHT@ZndL$rM37T$-R!#rIH?Y2mT@$mlp)6Ta4^ibX0?)$Xi;_K_{s}U};nDd$0{gslw342a5?{ah863P(U zxW~o#pnQXo&GZe6f*u;*Q8;LJa@s{U#e+(>PE1n}Q(My)W!|t)MoC&++g@Y_!(+?0 zJ~|s_NeU&^W=~5sShgX=BsR^=NI~r0pC3Ezdk*s6dw7=D*}UVvyuj*oCjXaRVm>+h zPDltP`%Wszndvd{!BOtp=OrF)`!i2|zx3Bwd%isyO?mb#;%s>mzuzXF=S?)=VgGv~ zo5AHuhtap%H@Ztsn2Kj4IGHBS)XJ(mUZxc?P1QhIyDN8Yz&58?7BvgQ_}7tYKTOsO zY-Hz_Z&-Subz7pYBwwf4^Sei0INRsWx$k+nt(x7j<^P!rUp$m$GoEp*|Jb| zirEKo@dcHSEzV{?-}dr`LC>8%tF&fmFVSnO{%`Q*c9Na=o~T+uZMXXp{zs(b7Do2I z)PL*cb*m{`bJL&QGK-Up&Sm_wIdNjy)+;m2>({86wA#JroD}hO|Ej5(YR6vqcHV3g zj*|A8VRl2t=)9J&0OTQ8J|?%eybUEpN@S(2Jqm$YP zbr-$v@9*PWyW;bW@JYJ9OL&iMJGJsGZ~4XrHjLgkub-n9gfe7_Ow@f%s>9UdE!lb z|9fQ-?31)gP1x0Ld}w@Hv%7TP{B8S6YU=+VwtQ9g^32bVZ@=|?iwMq^IIh9|pI!0Y z{zr#mt_f!@n*PdU(_{Bz9p_X#=P$YSsQhN1_Yak84dspM+doXzoaX;-wtUI2{Ket+ zp8^$`RIhrU>|R@BV0T|9Uh^t<+0=i_0}pz3?%BZ?{w#C@o2&63!v^l35!dhikC}Gs z{)xMPHTvKFuTlKyVQXjh`TTxsX>q;R;l8KWi|;Z^=G5I?R_Q7e9(?m%&0;h5S$7%y z3Pa{e&tLCx>;rG)oBThw%~EH(K74QYd`Ixpk7s8ez4U3Gso7Lxp2{|F({z24#J`MD zLcS`|FCLkSd~II7qReRJ@4)|iRhCWMJ-zVp%oRKCpW?JT(I-3Q*RdzdW-gllz)R>q zD{2uX;~o*2&Cb9OA z+Rm;E3p6og_PJJZp<+(U{`WIKiV8Wcic^uZF@9cWZ}OmN-Ldo!a(gn)DXE!X=oQmh zbRkw%abk=F?~4y#-8LKzYPy-}bb8xugUCxf#VS8+d6!&tIB;^((G6lXiYK@}6zgfU z&N%;6S?~*snGN{Zo1UXV8+N+{B?x(#{Ejq^`Y1U&|4OLP*%b_(F)E^~C4R)n>#+r= zNC!GPNvM`9axXZ~Bz06|Bj=~E@{g0wJ;+-uSmniJKbfIQ=B3cdiV`N!);)HuBpYXL z&J-V`F0leewTWIij5TX7%+h$xc0o_|*~RWz)49$yxXyYrX?@^qRUwzZa*+~;WLs61 zeOB2rf$7kpt>!yr{L~-t?K`y9T5fmq$?L)`Q@#7ve`#DcW^Uzjn~zqP_gS}HEU}ULbyt~TzShDiKfm1; zd*+dS^kRdt7AN=Pkmu`PoRd)HPT!!yFLGBZ;9EnHAcsNHy=R*zxO1;nJTy(shS99O z!<$=<^{~RkKRe9@cYj&l`cYaY^20$#1)*C0i!b)M6sTNGE>^kEZ7D7`=VOG{2W{~K zd6s>D?`7WZV-3E4HA=EK!IOn^O1pT}t0^@ClPuUiC%r1wi}GcTJ<#eCyujjtbo|+9>1wA5F(%wqRC*tb8)=#`-d9-B7RQAP-Rd%FZ?6E(jdE;1% zoo9H!rH2zmY_60)w^@|l>B9Twfh!) zGL}2LOTH-5T`E~9pl0o?Pab!Vy4x=KG_!@1b#w027mFw4toU$oRl>3(hGx6ACvU%; z>*QA85LVrx)M!{A@_yN_0HG{hD~Ze^ao7DK9#Thg_7w{}kGs9+nn232AF;0{v_3d# z)fOt`J@u#IQLXLA*6;MwIcLDXVMl`419slWHZQ{6e3!}xr?MzlJNh2iat&IyCUM=H z$==c@Qr^qHj%dEd^hLK@Xx5^;|37-(7c&eloauC4>ENFF@0`Bj!AW}s_bq)8yg_;X zsW=a@jh%G|40hVi_ES5|xa-Ls>1FrDc-*%i{%F?sN%8JM%kMSc*W9-apK$8L_t4_y zh7Vo~7`+aE=X(8p3}5@-U8&{=SHw>Gp~b1{-N-K)Dj&}^C3pSn0LR~2jdu*5^hf;v zro7~xhDY=S_vFv{y95)B^X%u``n7D;ywCfqt-iai{T4NCN>;<(x7ndpKAc+jwRX)- z+m*XI$Y$G@$93!LGn|-z=PbHq^6hc+!K<<&8$+4OHoiV3>+q-d*o}y_SG1HJA6H0o zrxre*!JZcDoDiF`>y{?_%h}FlrBfQq4sv^2o?E|vn;^s5z+JM3qa>fGF1a3ja>d+4 zPJ4}ug`2q|PJMcKA08gGykA#^x)}@YFlxy9vj7NlKc8>9a4+-ybY+5^*{KmB2<5sN{XTL<{8)TJ*cUu z{eAPZ?G?UF3ntV;Cgc4yOUEqF0vcVx~y^KbMVru8XNyQY}k6F<3J*_`rWd< zJ8ySyQfkQMkSbI-QMGp09;wXBJ3l#EW=HF}T#blY!}h?$Vzt5x!;LmxPyhMU^M@~A z{+u~fY~7BRmZ>iLrEC(WeJR+qPHSuWiC16lF49o?G2dsO8qb5>Mps261MDM;=5|;& zOfBl0&^wjOaIMj{o32N~Eflkthh{u5TN%cFVyCwHGXJRaYduZ&8ot(c>2F^8C~#`k zX`71s$Mu5dTH8kjEQ~RX(d=V=Yw}aTw$_IAa-G$-TxCNa-4^{&xqJD_wIH31GU16^mwVpv|C(20 z5u~^GWX20#waP6iVGj2y61q#y^X?Gv>e5$!`#5R8)h>srdn$}^uT71A z-fR5ZoZ)|b(=PjisXtGz2+a@k`cQw|eWT-D<~8qkyq&~xC2fD8^Z};pEKO;8MRS*( z%)i2RQtNZF)yK-CKfW;&bT&IJpJW|*zT@BH7sn->emOWV z{h zv(IV&CC_+#-FuTevj0-&|2Ds|HEQ>puANN(V#^{o+aH^DOF?nk8d0g;34g^=D{sb^ z<+C?3F)+Mj!P>=l&PXhBPtAkX-rxK+{6QFP0Z(u6#k^Y%0yTa6lSJYiidOiBtjwCi zew?+*i{a)4jsEt%$FAQhe^KKw@z=+@#!CV(Z&}rH)8Vg>$a%z3#YXySuXaQdjeLi2^LwBc_$Ci;?&{)#!Dp#15U*=Cv24m9su< zG;ql%N#s9tfw!-!-A6;>RBCc>%zGWjD2}Q7v!$iSiyNJBuFw{+$zO5Wcpu z!7@^D^|L2GJFnl|uu02Z^V^Z^vmWmvr#l?efA+sDEOTq7tkJjB7V`zt&5AT<9r_(HqASJ`1-MVa{r43iaDcuN@KIXavv0ZdvtNg zPCJu%(}Np#&dQotUM;`3d)lJ;lm06Ce4q6C=gIhAj{I|dtLu6_T-=u1yk30$<_;m> zVz2afKhospFa67|w(5!7)g=(|h?Qg%1b!8?c-%tl$35Fs2fhJWU1qBz`{qlK*=A3 z(Xzl>$;|vm9^Z`rbZvK0o_X+O0>|7hj^2C|OsrWVq<1Y}I&}gw>&nc>Njc7k{`{&8 zeY!ZOZ^F&UT<^_4g~G4yey?@zL7&cAX^ZxC=F8=Hw_o@uc18I@c`dJC!W4$ zP-^qxWDnayfB9>Qj8aXH&(;a`Ov`b59=&htx3nYe0y|rd#IqfEmQ;9MUOBq|M<4g$ zug%`eFDwpz#LBW!_Q~1rP3}g`?Q0!&JQcbzk)`1DgmuC}&-SuAeZ14o`;j@unU~YW zN2$xoK;A_CNz(5FVKQrbHsvwCos<;!=BiC-0oxVf6#1K6TPt0fR@@gZjjd4Fz;~kN z?JEz)#E0JHUos8k8gKsRiuXBf^n3C8_kw0MDHUF3E%M(OFY|XVt~n6%TlqQs2lu9a#@bCIRN(GJVA>3W~VoSa*HeSgTkkg*Ya z_2Ee{&!h=&tAsZO*T0h3f0M%P4=G_xjzY7#DQ|`zf9ibUyUx zPCwIa{v_*(%?=ffbG2<79n~CPv@p5|*q_Qhk|XTnFv;GbVm`~mGS^4UtCRh+ayLhq zEcJ+AVV>-Np(U%(WuEh8b-(V)h38{7UQd(T8QH#KON5(;(~^wjS5}Sxqc?FFaDSh> zAkbrrgwd;3$Nn?U8}}SPv@u5i>GscaYGxaIzDSoUGn_yF=%dNP3zDtQFMRLOlFQAj zXV-0P)IRO8Uv-J+VF%~P^z%>4j~+Ud$}eFnC|@!!Wf60ch8VY)R~t)6a{PzA4<3o- ze!f|Fon^}|z1q@3_d^R`=XB;TmUo!^$FR;y_;gO`seoxLzt4SQ2vkYfs9v}3W3Q3d zgs265-A7oCna*oHEn0W%*pnMhO1j&)vJ}7Qh#5Q+{2_lt?2_#aW(1y3%XV|U(|eR+cWq*KSEoDKapUvoJ9 zLnY?-JRgDXo$my)ofhn!B4wpQ%M1<^jh!-pX00|2FN7 z`!zF!;HhN4gb#BOaE9I zqS7^^)pwe``=!Ri+>66s$*?WGR}*05q2T)ZMZ{T_N}cOF?!0ddVom1~act++4{E)9 zHg5d|4~<(rL4}udq^>{GPQUAP&hpq-|4D{|OAQT+`1+i4POXfIG*4ryc<^>E?T8&Uia%P5397r&~N4E~~gnvS)sM^V?CH*(mF!65CX)b@Si z{Z})$ebwijUh1WLQE5aSYE;lgJU zt+!z9fpn?0H_m)}-^P~|E){a3De|0d+x_3ON`0I&uNyX6w4JZ{_M|Xmj!k_mdxbD# z{@xk|jfZo7?YPHrkAu~}rl4NwfuKym$43r)#>d{u_5Gjew%B><>>oX+W>#oTIrh+A zz}xObu#U&V0%Lt&M!qYJ=lE^wVk4}gEt88gl+x6FEFS3|a!>4Y?(+VZ#eqm zi3@iPNIQ06?tz|TZ-cmI_3W&ayQTU(M{tcup3w`rHJy8yS8niRH164ceUa_MxzqRf zEU%l|>iaV0>iSnrC$Ct#F8Ec-XW{JmqO3X0rt!k;O}7nxoy8Og451@!aMfl-Nr9V4IU~pS(Qv% zU9g*7kbAErOU^2vCWoD+{uAf+|H_Y3wtatVITz#liH}~H21WdFeI1(gCT>0dbV)fY z%L>(v+0(=4B&@5GnQq?u)|T}#Yba|;*KFN-{Rf*wjAzd{{_)p}%%17Gw#PqOvMH=DI3_urPkKmJ{H zZnE3v6$kDzn$!m}JYA#3z<+eXt%l2Y428n^2F7oF~_H`i&>>z}i#L*8gS<0sa6a3->zMJ_;BQ}pz;${8?5ilm)#{1co@-XdJ zx<|PCYVIyjsd)N8EARL!)k%uKuTHc0$H4qME+H!CZEL24YVOe_|4$ym{xKUqU0i;k z-ei7Y`ooP1OM?GB{v*sdeWPdw<74ms)<5NUZ&tNhC4axM(I7)BIWg;>*oEBp6BVme zmi(Ej-PAqr**6buzbDal>{E7FpPyIho^~ns{^DgKe*eTxEZa=nUfxgi>~Fo~{r-nh zYjAy^<%g)O{x#?Hl}}$OmrI{))O<%M&2UFTiNN9?>4)A&aP2*rp7lvCsCW7K#g`}l zQ1pIwx-Hdx!P60{6aBe;IoI zW$1stFRSFQzW$`LSFgA#wvN3jR_^NR!bx$xbK-j6JFIu}TW`;R+WfTm_2Nn=2Lr<` zHLT4~@D2+2_$jFA3Bu^j&&cTfM_xj8a&@kpa$+j{*$OFX=QQ{oJdO!5@|kr$(|k39 zt?KxW$lEFp@8_3F7yM>x+kElOI+{CRD~*245F%?wLfu0;Pl z@ch%mIt$m0dS5%3AD`_$oFic{dzYPSR@0`V*7ct0A2v;8DR*KnUe0)@@QF9mvAgdb zB-d4c@UoSkzp#_1%&APq^nqN6r^1zQ4eMDWc}wpy{Zd`DCOt|{(t`P!*Ea8cZrRgL z2)wOM?qk*$F|(VSFT-o8AU2QZ_3?}>$Mhe<^Q^`l3m9RY^dXU`<^HJhPm$!Y2O9RkIx-3s=Dl$&h+?YijC3l zQiGKjJS+6?Z#8fa)9(8>`(lH^aem)_ofp3Z8m6;(fATV1WtO^rg&3o>@Un;#GVk=3 zGu^BcYJs^l@89CZOU+GY%#zIvS*djOK>VxUS9m1~=jawG#Ra%eekK?1>FaZ^ zku@^0??U9=N>*GTVS;M+CPojD2qR=k5{Z%>ll;HtJKQ>!y}V7X;q@aq^gJ7uA01; z#F9k#qujKXCM>5gBkt{eE4xi#;vth_BL{VYf1-Y?sdm zIIfoYK6p`m;iJaO!i5W)4_GWUNZuco%h4rQnEOg5shmge&yI$Q_tUBncCZS{)hFv1l`LH4aeo) zo!42Zp5bf}HG5js^9ileC6Xy`Si=}M_w?# zI(KQ>;?tX~7G${>?LT6bAs3KyFh%(6;W$OJ)q9^kY}FU)HRsndi(aGpobh(&la~+o z@xEx-6R>>M{@0&>#vGUDEqS|YZT6yxTR*I{d0EcJueNK)p6-cDcAPA|-*{P0D);^G ze}|X+{&QpgjAI!Q+E3LZQ~DL$0xJ%9zghfm!)4ho`PrH!A)f1|wrCyrc+H@HlTP;; zzvV%Uyo*b;82XlmFxH&ulsw)Ua!a(RVOEVR$G18?JzvfQwLp>Mt7Fb|?pk-@jUThC zZtzs^2g-YIMV?+BGU>zLn=00`l{nXid^++wMJxPU?6=wX&ZX8nIZw@4pB~fBbhpHR zM$iYAw|x86`|}SAZxMdgJ!?wPb`R;WzUZbW6Mw!rdT>pJQQP*#%hQv8WXxbob9p;S z`HyB_XWy(Aw*&3H=X1I{T)&nG>{~glc8`Yj8Ge_!t6G``cWzSIC!u8VBKX6P+1 zN&S$yw_?WDKfJ$nROjuTVji;PaMUGH-CC|A@**Ohy#Czh+&Hqgp4wzNWAV!+*Tt2T zTUCx$Fod2|dLt!wG`UIoo>;J^+Mco`^9Kh%zFw+nyCh#x*675G!-bmnH${~)DjxdK zJcavI!p1XJl?B$@72XDKo#r}wNAuh6KRbBS$H#PUvPS6qKCrW9za z^RIzDNAmleB+c7Z8<(yAvO6U=sA6vUm4NTAo8ntA=w^L5UR=u=4=Df`Nt#h%ZG55qA$GhE8Q96_LtODlFO~{H{QPw?Y#h!=0 zTjSOz&*blJ+^Nm>@N9?$ur%;kz{hFR zFS00?q#iqbd+r2{^d%0@l4A1oJKLk)MSI>_b-q_BE{_$=>>riiaBE7mbj z6g-(adC#TjXR3Plf7*OmZ1W|$&bvmXgpcKTXwDP*OX|_{ZMKc zKL5lc|4Y@?(M#U@&3SgU`TxsorJ_y50%UU&8`x3^f%-(2%@ zDgUlXE1CGk?-zf5@Z+g*{EfsXx~y&I1oy1sTvN4r+H>|zal-umHhw=?=TtxP-gTpJ z6OVxT5B`&@B4#YDF;SIFPhIlqezwfCY3&ymU-Xv}|81gpIHo43Fi^<`u z)`#|_WK>-1_|g14N8NqH%UKii;5c;3da=#mpL~^w{P5dHu5s-Oj(P=wpj)rO%%S1owypC zHuF7a>V^Etwp(R?sF?~p;CA~D zTs-l^Q@USmueXz$$W*5veaYU_6ta^U8@OM+I#bYccK*S+d>LsvC!+2L7rdUc$@az4 z$(AlYcJn2t?R+H0l*{q3`p~o^TkaTDZk1%|%vRmYd1s;hX@UKpPa9>1HF}uumty#J zgtbVZ@ccA|fA==%?DomiJ?{GHIG^IwsI5^uS6tJ+YE(I^WJjn%X)=3Rjl(Ro@7jAN|@lE>He=tCM&MOV0e6J2%96&JN)U{&n{4jga?I z%d(@{@}-&k*BY0v$k#B@@LITGfp?L5j-;c)d&yc|OTD|R-gBjQE%MR0vEg>nh3#gy zUwl)P?GLy6w6w|Sd{~<)v%32ft;sXoQk7OS$H?qE-MCbr<#@#WdR0}{#>#+GPgVtL zPIgfNH-7f=6} z{Cr`!TyMPE-jyn6KhL=!e{4=vyrTG&DUEsSSNJbsVD_2Kao+yI-3P&M1n$U}xG&~g zvc)n%>GHI{8?+{`>bj}i8YkIzOgZ;g#d4Pwg$*L7kLSF5_vVPf!U-XJ)C?LM)VaZ{08Ej|m}eh6w6aHp!DFL9gf9Oc=Zwzz8Q3vb`Fy@}7u8gA;i-Dzf>C#`-gi*aQc zlef5n++nW+o(7+Ugwx-YwcWk9z-PgX9+P*!f6mGKd?t8K+YY0Krxi%o9F)G zU) zh382$?V6|VaNDvW?GBUK%)-N$JN&zn4|E0Gm&`j6=agBy@6c)C4vBY0r6R}Eyxw;v z^h}=5;5dQZprkPD`N{mN%Q$4dh-Ys16lHdLHjQ`Zy4ck$WefIL_slQ(6efB~GN5_x z29IqCvC$p@^A0HZ)iE(U$|V$>F8IDFR{qn01Cw2+IBwd*y8BH@Q*h*==O2PwS-$cn zO;`HFqG9){((?T;;eOMI5M|l#9Pdo_Tw74{`K(`xt$vhOSD#9s(3BU>Y%3K43N9RH zel*V~R`_s{C1YO3b_taYzAZ&t7A;-nq3}G(u)C6X_umgT-MLAdWV*FiZFXr;cWK!d zRyY53^s`rPyFax%opWBA$b9;YsEgO!{?Iy13PD(JZY*kxjV~j=9*vwiEB1l zpB3~vA2j{B-t2oTKdY_1d7}2&Q=D^DFJ&i z^6i>}*P#!tO?Lb2duGZ`rS2c?`YW8%-$iY^^0sk8uCK$q3%e>$Wt#t-YWHrXhea9N z-}Z;e`4+r?M142jf4y3w{E9zk^ZHH8f9>}<$@q7-%(D{qxhGYgbhgXq_pl{gzP;qz zdyCsqcDL#KN6I z>MDm+gA^y5B%}tN_Vf8|Q2y|N%%R7JUNsr{KjFx1lKT^x^x`a+T(~|RrUXRo zj?JxnmcpiYg~OqL^NJ@iKV2=w=Q9P^N485E?%&|@BzAt6js3T-iW5HH1J>`b72D5P zP%!_^hn{>r-9o!AiR8~8pSC^t)!%ON|E@K!jo9T`Ur%YegcO_c9=`BQZ7ILju1Cg) ztk++*I@~_b?B@-6o|c0fq9gZ&-pF;|J=vv}hu{2Z3eVZvV#ocin+$f?D715k77BB5 zxOGm8>U6j!GK>98p{lO^FZL;-F-o5v9#WX_f}uZ?f7^Vyy0JXz2|uJ!-6A)ygE2Os;pdS z=rr%K`iwUp_x6--d;V7aQ2Ys(rL4jSw13pG#((-L5v8d3%J=kVvxgFMg*D|1>O^lR zw6VWV*0lQg<99kM|7K-l2b2Hdwq`#WIsE&S-uO>@&m?@qvb3OGAkAX|gOj560{dBw z(Y?nyZ?#Q2vP4_x?!4D(s^_LHTbf!j-SK-!QTS4yyek)G#w*z}Cdm7~zB;F1;XLc7 zk8I!Zvguzw|M=eN;{Wp}EIgGYpkXFgFekXoK|_D~5~H7sHO)9TtX?H6A~mYa-T$WnKR{cSl0?x4nLQ{{5a~aqZXMlV9E!B)MGr z-z*&cb8g1#;$_k;vr39Reh7TeJ1IPkf0wuT4be9XKRUnYsr^w}6Zn;pOZ%NU>*txr z@+*~dK3!U&weDz$Nl~A_urbEx9!fWGNB9^5qFW6Ag&!}pncjz3R;kU=yKG&d&!Lm-v^1R2aN^eOT~qRZCL6uZpDMY3P5;TrbVJE>S>c;io7a6ho8|MuS8n0vA5#UEAD?nS zweX(u84bG>|GlTbz0dx8I%lTh|JYoWwI1Q+s`{xJ8;&&}F+I$laj*NZ>So!AvOgxf z*cddG9KOFbX?tJ#vB*m1wf$Q@+&=B0RAa=u;>@FO;STe5Y&%q*r8#|>>$>*uKIaW} z0_N&{oT>Jgt@ua`$~HB}V5nRG+cE6uVh|n4_yFBB;fmZ*P0Q`h4ksdmF@0mXw%Ru~!9fbYB1J zXcN@BKl^TsM1YG}&dwzfjy=wo>@^)K-b-coh8*}~y>^0}%|qq##WLR;9X`&J-0)7# zl`%}@`Gb!g{hyR|*2vhO*=}~%n0p%g@>dV|d!JAKD7wB(U0FBYgKhcglInx}87U8% z{!HYW(>Z}+JaMRYu%%=7d(qGVy`c$Gn~ORT{m}~SJ7l)#h=ziiV5uj zl4rCY3Na@>)a;NCpDnTHso1|EKyAy#Km zxrFDv;tckW+XC%*A1#%4HHd9}aPSuQwVEk@65?h)0Sm=%^H>{4h`wn5^GaB^TKwd~`~>i@m5=V{Ay^5AaUg{~opOtswWvfb)Wb?DX+}qQ5gyJ(ZS?`}_TDtdQMA$ahGW98bY46!n z?-pnHc-_8iT*-Z|p;L=Xb*_*0EwLK2DR~cgIRB*Q%bl6VT`#%YSLD}g-#14OX1%n~ zOxrN2_~@m)_lt|Su8?;6QKDruW8q(?#P3!@r{ccPS$(g`Qb-lddd;SmClJ4?#bwzeR&iHzEYFD|i_qo5gXD-pZ?b4;6Y^X`z z&`f$Q4;ur+8(w@#-i*MawYlN3#Zu-XwQ+Svb?Y>iWHb3)T2^*hvPm(qD>qGC{qZun z{)jCLsv-?1U2FOGOV0Cjlk9HaPYL}?_sTz?_ghu|!o$snuO8D$>9fyb|I(+wczcP* zVH?q%2GXyd7f&pHrQh8nxl-ZMosgPnG9nR{g8Tz5bmQ4z_Oi zlA>s`cFG*>Z7P3eYMt{uePzweN9tQ9va0H+A5C|XR$bQmP=#k>&9^(1(Whp5n15S! zB0Xkeqxj*gL6d#%KD_%=_0F@HjXlSXnh10Dx*RG#yYTFT+xK3w&c9glScFZ?F-B=Y zV@qsW%NhR;?watD<5Q2#>`Pcs5){Sbsg-4roTxoXd-XMzYrKtf=BB;Ac%q!~oX3-M zZ=BW%oMmDYydRY!>1!!EYq_h~A*PgkDKi1SmFIR&qVT@p8MU7 zW79AGPzA;s4n$Xr|Qf|>hyhoCvn@ci;6i~MkXgXpZ?jb zSlj*P<#UGFubx*OEp(`M5H9?8XN{t5kmP;2s}GBAOg_Ez%y#jOp|iazcklf$Up;45 zVeH+?+22jwr*Hf$|Cy&&{hNJ{?xMT3tDan{vU~a>f8EL{(%Vni;I6Xc+JMjUe9TVfg6?Y=l3dv+nOzV2?`_H0J?y!}^2{su7WKi*uriU0pXvH9=u5#(>?>!8pW3E4?TwQPcf@8%-xc`a*OY?$A* zD97TAysoLcU2_X^%PQQ$j*6XJ{(tqP!2izmS9o6PXRsa&_mr=l{iFMtX$$K-@AJB&Z<*djE~ zr)1lSH$I*!C(=77?O5~UbN?L6drY@x?z&!}Uh!4s%%u05*Zh6lm}s-sFh5Y~!ZG2A zPmA}gcgijewlkiyaiw(1_HQ#2HAJ~853YM}8GT-P`O}I2I8x&oD#BHQG=F=vwqCK5 z`u3CS&1bg=?Q@!@Who}I;`{#1%h6tU+VPEwR6iHbgAH${geM-|_G4x7-6hLDCpt=) zTQDxUC;fGC;`v_VHPe4(wy3`Imka#B8=INfdatZ_ec+s_lh^|1y)V41slU8y^X;gY zCF+50p7-VpcTD#_@z-pN9{u=%uj5aC1G_tbzmWSAXX**Z;Rb~?=+B&4AZJ+bi z=VZjTtq-GGCZDZ}UFVkNki77k$04)O-w(fk-&LCE{OC;B&k4KkSO0yt_-cy#`@TiF zyCx~hz49&7ymr~R?8uvfhwXK{Qp0w9aXz@_tJ;H=J&c#8Uo`tRef5;BzjCj=F1aWF z@VtM{HX+GhD%19Jo3Axzw2l7B*`2hr=jW`4g@W7%g?4(#SL)bpSbN7{db^I;y!lHu z+TUN&^i%Wk!taZ%a&>L%H!fZ3`=WEkQVUhlk5-9A3*+?MuUnXj81mmpG3KwC&RY}S z(#c?U{N|QvYg&#!i*7A&l(CRxf8*4o=U*#XmvHEK-5EKTIS=N3bx^QYS)5@YxmnD= z^X-h29T#prC_TMkj?m|d^-q>I$bEKpEmKwY*v#a3;`nTr^t40kL>FimQ58(Z)L-DqZ_V7In~ee*eS0P z^+bO|8q+bR{WyK+DGg}!AcgEoRtUp&%|#CSjJY}Q~Se1D_%n%QA2SXKHW=Ge+_KOa54_3rf7sJ5R?!kr2;yesGHzj!M-pIzzX zb++r0mz1VuFDld%s8dS3`OkXq!|vTG6JG9nI^})rvcuok99Qz(KJkS4vT4QFt<7JT z`s>`Vknwo8^_KeAsL8w*Jz|GuESxT(bN9$XF6VcF4Vx^>-xq$GqiDIr&Qjr}Mk;6B z=7i#h$}Sz#uHEj^GY{NrcIVs2bADU7`t@CZajsw6#;hp)wrZ{X2bGn1{!IHsH!>$i zdMh73buG3&!OD*>zj?p9Lg?3;HDw?EAL8HZZ*zm=+OL}lS*FLOKW?>XXdr!QE6(uN&sm!pvp!`D_YX!UGlhwH`&2I<_?5zY>zH|Jc!4d$zvXeOug0|$8^NZTb7c)8;GU8Pg{1y7Kt7rgqNPX(!k|%|1QxK}p8r_JDX9$Cn$ACvl}txM*a_o+=f~e}2u& zABX0gJ@e1~c*0(@PVobudA!!;9Zy(&B0z4og7)5~Cl~%)pK3e1=j}zFFII2!lWmyK zGtV+Gn|N6MPl09h(NBgaH^woXJ+RVdhxLM(>Wt4>L3tBzU9ahsTAj2%E_hwdg`IP& zB@8bvTz<%Dty6mx-;+B+|Icb>@5xrszw$@tnAMj(2{Vu1FUhNad#P+~=bNX7S^@pq z_hSviS&f36H=T}N>sES1y;|8dd2#5ZENw5Bf1)wZGyd`4z1{PZYxmYk$?^NoB_DkM zF(T#pnSd{=lD8P-Dem92*?1#c^X{9|J4?Uc{I}iG)_g|W{y_CRS?N<@XnJif0~Oc5TJ7ZY#$u5u58Je{WaKUAy@G>8ktZ zmW4`hiJa|ccwXe#Yn%0_CLNU8mA+AT`9cpzNlVk*2+{LaI_oQpL^-33#8Zqkl-FlX zsn{w!<(HYQzijHWGR@?j4(HESMOU(@R|u%zdRshsZjEcm0iFxrLyx!!-#BG>TmQ+K zllAjo@x6ZgKm7LmOHt3aeTwMi+`?VhmC~VS^qcVm_$BNs?A=t zup)(VqVX5|1v+9UURZWkojoI8yf#yC< zdek=Q#RjGam70NyqDzuwMIC|{T{~46FV>uQ+hWhnMq&ATZ@0z=+UOr=eiC@}((d&a zs_vf?abC=->bPTygT3UgMXSo^T%Nw-pMLh1O#k=49v`g8vUzW@euupFlD1PZ>lL2W zY;kArP_#MxUfIm#zoFfcTND24?Vr4Tp{&^|z=ajj89> zt;uBlI{o^hS(hK~==u@T#pX5H5uWnSVwlZoDTfFv`n$^9@A}czylNz7tn&jHVb#bz-o3U8k zqSiBwy~7$?l40vA!IDvw_xDQJ6(^n#7FEu%RSK83 zb8gwvuqdqcTFLYdlle>y>MIw`^_a3c;z*~Gk@Wn2e~J4`j6U71_L0t({M{*au{7A_ zZQ3Vk>+hn6qib~!mNOVm@w%^?=yHVVf7}G=Gt=+h=aTfO^nUmvao43x_kfR4Rga#s zc%PC_TE6i14yF&+FZ*4y2@#Cq&A7`IKIP;Jt_2=*r(Bj<#(q)%*)uWit`k9Pp8wgm zFlz0y1G6l1j12bgsSN&*+j>BOdCRS*w+xg#ZAPBwElXOrF63Yl z2$k@Fl^hR)TIL7ZKV3X2G5zTeE1rM}GafDfxuc1{ zTfLOk@q4mSi?+^5-7U$fU0O0if4v^|rZzlVXdvXj^6{~{mQ}Y3IQDP99k`ciao{V? zf~R&bJwJ9HX!4B=E{18g*+j?P%$^qqFB`4NhITZBoPm!Q=(t_=xZN?Jk-<><-T@MMSaWE|XC3hsPRu{x^Ho+*3bEi3aVp2;b&9cS_aHO>EB0Up8M~X}jx;UZ=sg zY1*$g+Dpuq-~4>@$BJpTvkqr3nfm5wk-@)|w?P)0*?zvWU;ozs+LvtoP?zd7-pz0S z_RrTXHj zxyOuNX|#qsT~m86sM6X`>C7?R2V0HTY20CG;)-J2{qo+n{eCZ&IZH0o(PUMf%9o{S zTJW;CI7?>Jp`LwhHk*5*vZv0N+Q!ktuxs}53en)DZ?xX;+}<`NZ$r(dt(n{-T9yE#l4l;Pqp*&KLS3#WELXI+JW_ga`jSs*$e9}%2_Z}OZ9aeT#0~Lnt$oQhJEi@%E`MLR z^Z&ekUo7vo=)O$e>Ze>aqd-*nrt1T<@^u>1G~-WQ@ZYph;eSzw!kRDNm=8V<=*^tE z+AKY(|KGLOiu2gc-Mt{y*LikL{`#x0{v#db1nSdd{LzZ;U}Io-F3!LpiP@)d5A}3* zH#8>Dq1hV|o&U%}q^>Q#aLT>|8gHF$&%F6khyRXx6jz7$>a4A+E+rheED+w8$(~vN zN6uPh8}pWurSGKu_7(rB{kF4J_{F5FD;SqQa4nV!+}K#QWr1Mhw=CITO&=d|n%unH zcKK+K!^+6E&t6ZN)Vw!sl_~l*nPpK$(}9zdj(s?Cv+1|?f%(OL97l5W;%fZ%9d28z z_(AzWid*u*mxrSS7BKzE_%{1i#?iEreG~hyUF<0k*wL*}Bg#B`wd;2Kqq)k5{tC3c zZlAz*VKHN8QqwiNce?YBdK)#j_Zq$MV0)~~{KDYNYwlBv-aBaQd;Y0Cw-v!;F zIcsZC)ZP^#u`~K!dxd^fiTHJg{|T?Y$m=7u2b?7N?ykK4CQSd7>mKG~u9KKwF1nbz z>1vnjQOk5~hm7t7zljpt-rK9{YwYZA)$cieblDfXkMd4TrYlrVM@yZ((H+O1`JrRU zlU+xZE=6#QEQ+t5VYvTF5M%nQg;D=MXqsPm>@FpFI{Ux6aeVyc6H(sTZ@r~nPu*lX z?NW$-yRKMU+ww;}XA%Xz&al^>y1uK`^@N;(8qY?(j8r{|Z+b6;Pw{Nk6W^k-Cu%K+ zcvN5Nia)Alx93Nlx#sm(Pppfz^kn*^a;M@K?ER|ltxb;)O+VemJ$--psiRGbOQ)G@ zom_F#>C)_L5?_}*VNtB^G`J#DQYIvZ>UIk%hDr~LG{el9i-#oa4z^(~gRkC_~FbnT)-#ob2_?sJTJ3EmnXR-3p8*bB${N6q>Wr~h6ja0GV_6}-iw2>AzJa)=$!IQ1; z4ej4aUp|>~VgGyHS@qkZcR%oZq5nvx?1icN<-psrJnz|+Pae^VXYV+1_~H)b*ylR8 zZp68sbCT-a(7bC^8js=RN3y%!{_c8W!oK(2ihGBO8ul)E^h!usG(z-y15;(NRQVdF z+mA|Fg=TAQc>7K3#GzoV4YQ9ha?U?3_924Ta`JUoje=E5={v*Q&PgmioR!C3a^i?t zgZt|ZzV|LD9-PT{yJ&x(PUq4-wz380lY`r)uz8&q{^UJn)qMTc@nvzEtv~nVUi*Ev z?0jp;BGYo28{3i|epz=lKVH8q?ydFpu-(D)zp3qFxS_UwezyE~ul}oIKX%PMl2&%x z@Li6}2WGXnRf||vvt=$Ort%Ba4G& zvZ|9OO0+;o|Dttr26;7cMaNW* ztamXgK9%b0t(d*FX8rZqIrHV?bGYRTt6y$?QW?JfjalBuy7T>tV&wE`zD@V+Fxynny?%vNWo|ANC|4zO-Z$0zP(n-r7*PPn1yy(It`G+C@ zW;Wd4&KZS6V@%& zzq+hF&nq{nYk9t0{qFtGzg*05^$LLRf z^a`8vNtX-HnoZDV%ba1c?&gEs3HuC=Z=IFNH*K!$p)+aQ!mB<#e`3CzM}6a;bdz&_ z58?yhGoYZV?X=m;$>uB!44XL_unpIF<`(1^mAGZ*q!Osz=7z=QKQvb5*Bj zI`oTu)Qxe_C{mjd=cth86Ts1>svf1ano)LVgr?c->%< z*(Ey|PZh);bC%{b^EB(>^I$c*=(de%r@;obtXRfho7}gZ3)`n(z~vLNrFiFo ztY;n_U-ufFOLR(%yi{{iHswG>1Mvn z7OB8v`|7`o6+O{Xk+N7i%OGxDcHN<}X)AjC6aC^ewwW$|!&)kM;=_?Y5$AV^Y+mKm zb2qwzS%+P5EA#rUhl&?J<(dobeZRcML-_8T z3Yz_)TK+(8^}OnbvAgCmFFvw<)h4N%b2KK+_KQu2`JEiXOzC}xvTf-)WXJ4E0%s`~pb6MHv z&7rdkEgjGEZRDH7pu0LuGeh!x#szdrqc@4DJ~>rS6s!(z>IEaHL%Z=L^Nix0;=FYsGc zT>5=baz^6aU-7qmx!2s9EApjm<;KtNJq+~TGM69SvVQM&>&|168>W_8dtH8*P$RD9 zcJc1)2alDuU39!I|23Gs?P7(5^kyrUlqvP$%dXq--QE4~fWcW{RS`c3-;F* z#a?HelQ-{r3)??8t2s|4TTiaZy;^WgF0A`f-(MNdxU)*DudO(i-}wI9CI;b!9Ck@- zMC>2F{@diw)Q8sPXFQ0ENpS;nZ=|vw`y7Yx4mdSb&d5+S1C4*e7hDc|SMes;S`?V_|V4NqL2C?+-3dKw)SyR~jM zV{`v4{jaslvqM+&^Hp4ZBme!!UYp-034hVr*`Wz-M>x0`7@p{2y$;De)YI3IKsod_ zsxtq!o7n&8KO+1_O;e+8X`l3)Y+@j`#pR|`>Ds;(#}*l66lH8&Xu)K;DS3f>-TgBY z9%%;VTwb)>BS7TRi@o=E^YhiRJ-l zd^vm0RO0KzCEnZD@B6$Z?ZOMQg_pBp=RN+vE@7jZ;_oZV_X|zdO!wFuVa=FR`|F9c z^nw0u{v0e<()8Q>?G9<*ZOp8AAbgs0#(SH05{&JQ4!<2JRd2Va_Y3Xp_)qfFIWuIC#Z6CoTfgSD}d^{N* z_TPWIa$2+A-JBK6HI$Qg3!OS>+OyJqieais?WRThvY)~#XJLQht3pBL@EVQ_efS&Rrz@3Vd{-Ry}^IHug1>@9Ct|E=o1f6=ZL6GT@itdmWS zD~Xkwz`6ckz`|oSzVQOHvJZHE5Bl-_*1y|FFBPv$T)1qKj;hOqWqzBUWSX+p{?a(O zK;?+rzg1Vyxpba*!~Cu5t%}Zm_vy3dyQ_6hmIMgL>+xfcCScKKc^C-`%-PsCYuHWP~-TyvsZPfz2z zvtE&7S4mbval4y$?!%4#H_m;pi#N9r{(If5;LZm}pPcA3x9>L|(bhZjwd?D$Wt(GL zb3FD>eZ0L$NBj7#eLPN2-wUmp|Dxew#rr0X)Q-SOUxH+gML z@;R3OU-2}5FW;nRkF}Vj-Y9p??%Zz}^F35FI(m;#gRAF*zs;J*mF1RySaAF)>#@zv z(E{zucjQ>hiCr@5aqn0oV)?ZqXG&C`U3#AO%O4!9Tkqw%AGv+9c>^cgg%evCzT}3i z^h)HKsz)v=(OZ3eY1N*U?L1z(M_xRdlcciox~Y{?-pBgt1kqQ27na># zcRES)+TzP+mX^(6s=3JXDl0>J+Wo^m|CeMt{|i)V(}@xYFh0(%+GAz+d&Az>7NWcI ztPZzJo8D8LUA_D9KE|KtW}cp_^YX3F?&pdp`C5{fEM4&TX38E5PUA&7%Q@yA{+uQL zX7A;r^68TwI@e!{J@@rqK6~wN^*35IhaZ?qZ@<0&4sn{S!@loIjQ_uJhJbM@}|I^krsJ&jnwdvCC@~ZF4 zXLH(d`WI-Oujo3cFyVS-n|R!uf2&jSJGd$eQEV9J+F4rY7?UwNvA#T>^k-J zc-xN-{{KIsivl~WzXpn{96fuY&2F+m=#mZV%btpczw!9i^`%$*nU(&OsC$pLbWQqy z{(`>N`xf)fbAv^`n4Vzz|Gn?W`b|f6-n()%ZpLKAzSC>PQ?v@UT&}sW{F&YkL2c&m zOzQWx&wYGz&OxuMn^?G~Kl%~TYFoF6_t?+U4Z?CC!(W9u)$Q1ytJY&BH)YCOA^R`N z`(Kp&;5NShVV=k1y%DFp1=jB?pH*b9R*<-^{Lk0fFQsqm>iOuq?38?QB=apHUu)48v%U78oKre-NtbuCC) zq8{wtqiV9)Oc*BC^PfGDORebywubNQF+SQjJ zy>ZLZ^E;2oaZ1>ke^m82RODT7Liuq0D_ivho8PbZ$HdRyUdhZo*Z9Lc-s>A1B>xE~ z-e8|#^K*)pkWG5MNynk1!e?)GT$#Kn$@SI#6+!#@vb=s~Et%l&<2fld?Ao5QdK#rO zH?Ms%r$aBHPSxGhzVNAQwtHF1n*E%0E#_f=ePu3NI?uN?wVJ;6d$_OZ<8T(mJO`(S z*Hy8d#VSJQvUN9ccXn;tvM9vb()`d2F~*yJ)(cg*?sXBJq}BFD_OfK3TG!0^6`Q7) zyJbccrcbf+iZv45e|>$btnmK{x}Q_D#Jucv{xrOCUZj2BPBhj|^>E}Jg%tM{B3GSu z^Iv@$U%r3KsaS)jHgQF7i*Bv;f9UJ_>Y%ywrDIbo1b!?O&b(gN@4d0W#!l|W48@+> z#II?AMj~&EDxKE#KC_g*=yE}Jb)f%lU4}FMPp_t!y;&MBx@6fwO^L;veplFQ_gqM? zwlTeHew6RwLhbAEAC=nI^A+7*yxZu3pX-ClH6OXZJ%9Y*{pzf}T^Bn8+x{)o+NCjN zbJ5n@Yr9Sav<#s>7?owmAmd#=b;C8@|X zuM;`dlvaC4H0{^S2TQ!Qb0ciz4^GV=^=UxcT($g2hMgAKAinX7rCf`0gKU)1k+;Trx{lf3N)o=el{$IoAxa#Cv3D$Zy z|DRp;39XlFV)sQll9hqMUz~wK3hMx_e?W+#0fDyV)`-~rR~7=bdi#^E>}xoZ%6Y$h zbuEWT)Rvegg*$okwZvsUBzL^=(fsAEuAf>RTGkYEI6n{gClo zcO^q-po*xp{0`xNA1&r3NAz<&I+XJL*(TPW8%7ht4fOcTRUPQ_{oA4ExAp=`$a>ZDwCyX}K-_ouKx0nednF zwi+AHUQ5;JvE+R8a9SZdYu%USd(~5B+rVBmP zFihY(#UFFdRdUyz>5PBcIRn;8x_zA;xLzuC#`!Y_s}ITE^xUVq!;p22vG}KgbKI?} zr3XH_&C%&zYR_%1J$-+oo7y6E#$Pilz5hkB&HktD>*(2E9aOMAUVsSOned`>*t zTk+dMK1%raHlDR^TX}l@wubD`yrWU{L43uVMS==bH9CT4Om)}l?{-}r=_I}PtMKHz zbB}y6{ZRIj=kC=5{EwX9U+0U@;oTPOm0)^kYx4(Y)g84rH{JJEU*fiFK>Yw|_o4yHu)DXRgzQ77p`EYDun7nUC@v{(eg&YpICy_JxVP zzwTWsT6U0o8D~SL`hi`xxpG@xrrC3=bzQ65UBY+$<#wjOH>d5&>;Dl{EY|eaHnEgl z{Z3r;gtrdyQ>yk(Iq+)AVe=C`xBU964py98mM}}pS$wIi%f@@_Uojj!_(m|_@$Tve zy(R9e&aB{(d#D|s%knz#NyWh*_tt3_J~~>p`&!tpunjkkOKNl<{-?d|{PlNtwypiB z{m*Ba#j{fr82nkj)-LU5Wn!Mbrp9%__bc!J-rf37v)QzA>oW0(%EM~2?wEd2Hu)xF zdcvk}@|+q*|Gl53vN(F?%2nmb%{Nr`Uy&leuT45JdHHg^dB@*KYNq>a-Tqqj+{cNf zsZKHZ|Cv6TKU#jQJC;M z8{ZybIGY@^@M+&1iSv9>)O2d@2fld4E5Flz*eX5#CoA?QMxm1N%B9zuRW-(! zCrN95x@qcpI$!G#ce%(~H}8u(N-QsQZ4nhr4NCvKdaax3(ePub%beEUGr1Bp@BDh7 zs?Et;c(-z;GpkOHGq=k9DiHhX$t)$4V7b1tHct%Q|EdeiFN>SB^Lg9+2aDckt*~?Z zdedpc+8(>rrFmC_#kYU@Z+xvDbx4xo1JkX1W(J18?0AMG-4k;O4N0yIiOs*|B~W_| zbg*jAlOP|DqT4U*B#sAoi%iJv`qUy;%~PHHe$iJe&j0(8nHwkEsar9%;=tzgb2BYB zZ}yc)lKb+I`G?Zerq{X^Nk>_mrcal=93<&m@HB1pkF2!^OQJ8lEzwhqdTdv`>Pfvs z_F~Ti8E3g~XzUEqVgEH-%S9t))%+QUqHmlMN>X!3JjA{B$EGVBG0egzk4I@t=k(tm zx%x*nflpaaZ22eAm#(56u#sokQ=`X*JrzBR98RSzi9On7s4fEZ9|prOA-0P z<3~RG9_yS@736c_M2Z(n{N4k9oh1G4%m2Js8~XP^|FJlULkU6+%)#m%HRWbSOf$|k zy;S*fi$O8WHT2ux{o5x9h3lO>z+(D1a^vft^NvLZq((Ajf9o*0Ch=4G>QRMd(x0=9 zPcMnMDl7CYck(MiBHky9ZT~2SmyyVSe8{J*|3vV}R&vx*!NlB?%!RaT$JWuGa z!sMXH3)5TIJ&2cW@VmavTK>)HzTAU4C9l@?r0q%TI(oGwy!5Jd)u$LO-UPn%eb#Tj zMIEyX%5O|G`96Q;BumK+NtR6yuWz&z@2qL6UzjYxxy(RN`J~Y1uQxN+80}Pv_A6|= zxI*)`XomQ#O+OCqS<$M$=5^fhSAQ>OO7eCsTVb)_!_8$PM&Vp*Q``<*-t$f1 z>%SvQ=AFCvR-jbWXuV#3Ue$j0>$#F=9ZS#hYZjbXdAxSZ%x|KliH_&wR+ZLYTf=0$ z!1tQ>PoG8QK?(b>nCy^$5jst#QGaUr`nTKF7cLVutIc;@ruS>J#;hLk^12sa-0$6$ z{-BV&n(5rddk1FrDsih_KB}@}PT|ZB!{3=R%U+v)SsL(rReJpX;vehwyzYt3FIn_& zS4#gpuG(o%`!gNZH?oReo2RAIRsN)I&Ms&9qWG^KJMUKhs#rI)J&`zA|iE+m4QK-AM3eX;3;!L zGv;f`|l^SJ8>|} zt}P46O!{s8{r!!0DVs}E@3-|o_-OgqCwJj-@t)upYcI{vP+Tija->T8X41+7@2))D zbuq(n#}ez48%6GCELkJPbXe6pLHDTBB+&=YV}iIkXRPL(_=RzsQfo)Sgpy-Isy9tS zMP@J^O0So2);3K3y!M{g&mOOU4A;P&UJhr@J}R_u+&sri=&;4yV>(TY-5UNHUcy_} zexIZ|_h3mj%dcC_3C|h7u)b35;{3-j<>Ag2b1mVR!=_p{ByVPxICyO6yp-oHkgXf$ z9>2Yz($XXDugNFp2IGV~D`LA$-8Q?lO5ATdYUrc6gmdoljm=U5+~?zdq?&LZl-+k= z^XuR53~DMJ)*)t&8%N@@!t2n1vj{v zUi8-#B)<8z@cK-i82Mwu^)_5p;S7vd{a${VdtUcU;B~JArt}a&G4;qZ`Vr??Y`fDp zsN{>BmJ0mVRwvjo!Ek@r=7U>`n0yQuSNid8xh1>cssQry6go zHF5lxOTNV1S`czEy*T84f9nLkEv}19{+wjZh%ukt+kZA}@yi1$1->C+x=})&O0f@H zKUxL*CvAJ6eQG1SoO;~zjiK8&@Hnkn!~2PKUguS>4}aaZah)_-)@eGO>84}6uxkjD z^^x`*Y1Q2#(G$e@bjtI;&ipv@#)0&V2*tk(V>~_G3shZmzU^wdT(-)3$EzbMo?TwY3~vTWCNO>1(5ZdD)wrN} zL4*FXzo&8@{jcSDqum+I^=&P4nz-wP%wys{ylT$BO;xn3{MdIr=p!b>>YVkex>lEDpXPk~U25AN#~SiA zd6P$ujz!hKTk~2TX8d@yJ2rnxt@YxMuTR*EU5r_%I&q!&j<=5Mt9!1rZ0~<;zhtgu zuhk#DUbmn5xov}V31i)D!>@BCst?;7VcOK*-=U@WG5^hD>p%nBX;%t% zYjpj6t=8EwA+lN`sQu-fEfanBPij)Tw2MeX5O1CGc(EgX)*peJX4b-KJevV8Zkt=B5v9C;eV z8(0v(^zoM1X_s&8y|Zy|xztjbIcY53GxiD1+nZSa<b&F6gY-P*G;=|p9p@0O!&=Zlu_-ah9X zXaCvenuAmOCB&{w@|g5>*25c1+!q~=Ns61^v_;KBz;jzzS?K=B7R`4TSIoq9KBJq%kI4ZQ}2a||KF8#RqDhk zNj~Iq_I`arH<$TgwYR15LA{q(E;H3Mq&@!2@?-Bul@e$E_@K2G-L?x)9ogqLeY=&H z?VQ<}wck&txqeVKDwd!3hJF9}3s=6}6y=XMGkN`7lgawJeR9gdLY?FCY(I?I8N*U_ zC6`tB-@bkKU#+SAPxq&e_na4cayK;V_8yp8y3;amb?J&kPtCsnHj643|KUch7h2uS ze?DhtV7MiLYbljike?5%BmTo*!ykmv_J*8|sP|X$6#h5+r-&EdB5)Nb*_H@{h7CI zsGQvzSu63)_c-4M-j??Ef2F#0Pv;kwt!doXFP>ue3_d%3-y9!P(OIsmLbcede>|V? zW@X2X^|fC^dA4q4&Z^d8p7lHHk+t!m=QqTgm`tzv_vzbR4ARYbQSqdEBF`3md9kPo zSDsWXt}VXh)BB|2q&IiIO3ft;SMGYT2~xA|&sj6eyym=L__FHbgHwvJrxt!-V$5St z{~To?s$3Nz)nF84r!#bh!(9P1?LuTTx<0&GF{@S0tF$MeTjYY9Xcm_Vl*e)3@etee1XS z{_@Rv{Zb`&U)+5A?7^msi(fmw-*r2GYUi(}sY#!0^P{DlulXEoP+lnel1=eh^bX^O zw09lL&Mj_;Zg;YC(r<6$n0@`{nb3Pj6j-Y1i!eO7(qUI;!=kg_wO2XrUYTb6)UkW}|A_jQs=E@cFJ@Ss624~2^1JWK%d6|G ztI8HGMSV{A+Gkg07Td`LAAR*}@r%{#W#exbsa>nT%cXwj zw_=5|;j(uz6`3u>QqXt zSm>{>DzWCw#lns!MQW!`*Dka_e7?1YDSDqvb*No7@Bce9J3Y*bPdM1^SX6NN-JG)g zclO(Vzny$KtWdS&f$vj~2I~;Z*DpW0ndDdS$DDWjE7o{Z=SE5GyPYvNm3TRRAL1=$ zd-%Zj2y4~6?hs7_Zs$*}ZGpY}bJ>?QY!UdS`X(=o>*wvT#n;a_Tg{9~TVHc7tXy2- z)oqQ>WxrRkE`DxruE)N%X5zP(8{$^F^aRS~r9M#>>iJN%;;8GPKkG}9c5g09)@j|? z^5wclf5*fX36G8}KJ3-WXCJ0uFCDkKe~p0Fm9A^26Q`e>^iA_cIn(pNMK24S183x_ ze9M$$bqhJaHuqkwrN^2(Y=7H!O5q&i2yE_U3=l7V#vwi{ zF`mn4j_Rr@X549pi`BTD54)&rOy8b*qP*zrsoMF?TTcXR)O^78rTSyUvcwRj;)%R{ z#&ymU+%#4e1oWJY_%4>FbY|JxYqoxS?ImxNZ7=S>|61;u+?BG9{#W{T%?dVGgzI0L z&#nA1&DeUvJX>So#eu(FYTV*wrhR$t#9~!3)yZA6^;}H4P>Sd)Q@`7HKS&oA)ZTx) zv|@pWGRGBzrM{-FNtOJ|LUN7`|3sW{+m>wkBzo^=GEV*Yj;UWt{i>!}^IcSAGq>uqt}0 z#j3rY?9skz>kQh}wpy4TK73Bw`+;9rchu7t4>b0El(pSv!mho2-m}BAT8np{KCIkY z6Jk`!bnt>i;J><%_3~FL(|W}Ew6A?z_Vo_OmWPvL(p2C0-rOeIE4{_i#LmC?+Uv46 zN!!x*>gdiobA~nLaOp!AtER2pB&d-_hwO2#^j)ThdRks_}&fmWC|Ll>jwCRue z-W*BT{E=zZSJ~XBo{x`OES|J@^4fizJ#s&v9r`Y4JW+jON#i%}i}9{Tv0A=KPxa=q zKins=ZtDJ3qMsj&D1S=H{Pm;paOFGimMptIyE!toNn*W?Yi_Gvko;C*=JPzm@YXTW zZuQu0n)V4EbsZlqKdsoX$zw@r{J-9-S0@&Rn~85&uatSHV`1yzX`FmBGoC)2+jaAh zbmLC{kFOiQh}GE6aB^Xo8Gm$o`J8B*6Z>~ZpM9}&;^rs05=#<1zGuf=DL!40)9$`v z!@S4kyt13$$je;qJ~}~uW$T^G!57xQ=h}TFWq*TCWn_13{k>ADTsvZuyy8q_>OtjzUCB;J@j&6lb0|dCuWMeu>}u3H{f&wmk>H8xuHOz@)68z|W_fBf} zXD^M;;y$^SI-!frv+IJ?1hP(gyvRQCX32rLCmGe{;X2NfuC)I7e{tQJQgbe`+ZjbZ zKlPoTYW=TB+4NA4zu)26^i#5SpW?rrT^5c}xxrOz`CWnSTX z^R9E@+1{n{FP`kavg%t}*{ZNjQ!l=sa>xIR$%JF^)iK-a7ZmM_cwK)b?B?!cX3>zKE&D%0XGF44(B-?b)bbMT> z@xSi<4HlV68nqFf4mQQ-_CBxs#q{o_n#95M4;7~@f~yODb`^5HTXv>X=+X`b_nhyO z)*7+OF6VBp`!BSpM{b6(=D(#Ijr0U0Qr9%B718!IYxuuxQjmtrsxp^L(KotxaH^+ zagm!WwXZiTE#}nuE}FPTw1u73KrCarhT0F^fVS^K^H%75kYvkv@Zd?pMHa<{&Qqr8 zI_8+J?T-51P-$sco$pr1Wx#k$d-Kd2NhXp~M}Cy)oKN&zsFM-(OfAYm$EM<9dA(et zZEXv?HOHIGFBRPpQ#to6_207Xh}rEq3lkyzNlmFA582L@r`%A^f8^R9_4h{ivOI}H zH~0^<&6IVSXFUG~W$foJ12V1CRgdc&ZZ+InTju zp2jrOWp6l31v@q-*R4<6`Czq{(~)^W72GQW5K$GXGU((*I+&!s~Qd z1oxdYe7VrcVwS{ak+c29ic2_^12uU6Co+FwpLX?sPV6^b;b#kDT~lL@NKRC_CK?yI zD*Lndvew+qwk7YL&nvdy@kT0wT`|;_z0EM`QR7FKHxKxJwaqqo%CT#3tc#ziSJFD#I7TfOPlh+?x7%8)y8wUurSDzhf6)EvY%z z)F+m;CGM1^QPuY^6?b-C*=F-UgY~`A#$|ghAG=)k{f@`umF@d2_`KvDpZ`+bA|CX0 zvd3->mmWrsjm|&+UY`*l7%Fz*;~iGEodtg~MSe^^dZYZ=!r#0fZwP6y1ec%dd7)p@ zUCyzn((!(4#P!1u9hN_45<0l@;-~A2gA(oc%obi<&1Cu}!n{5#v$V+T3A@_5UHS#; z+S9`iFAQBBnN%p~TH*7V{|xUg{YKu<=7(peo97+3jGX()YL@#%`&f%_R|?hDer#@) z&k#JT5qrnv)ttupkqx(5EML!D;`-5Q9e;)BFAv+`pMu+)>?ixLymsXq_1_%Qe+ETP4~m|x7S^h zVU+xrd&;8Oh5PXD!>6C!oOSV5Do=6p%b6>V?~*(ISmjaq_pf{QNZnw5GofGY*ZWDQ zYVS5mH3rXmeD1=5ck$)5Z?|uCQN3~hI7{6w=Gy-&|MKTQ-qyKYe*2S4vmj;fPJTR{7RDc6@X#zMQADikIyxm+?b|2Un!lt}>T88~XkD|0RoV z)-QjyK6cN}1-E$7$Ey#N&Eee7%)nsAfqSUSlt7PWZD@4 zSBWlEarIJUKe6(ch@ixQ=p^@JTV~hqPoC6f_IBN_OJ0>7A8V%XykXa>x$dxG4P*cF z9^Q`cyS&hV2z*LJwL!~2f%^PoSSD~h=oWS`N>gnMhWrXA{8dLmn;#Oca;@ zTMFLUxv;YX+Jj66`r|d*J0P!Rqp2}n>Ja-R-F5?DL;U{C1kg7f`r}MyTw%L^`*5D<76&vJ>`9`&MsW<*FJMGNbQM6Z5?$zML;TaoXk= zF2ugD@svM1`P$`9)_DCkv6ve9Z@u@VosVlw{v*BDFp+=Tt{(?QrYi54w8-fE@AZe- z1XoG?4|?|EQ_`2Ocdsq+>XPy~A3JIO(+a`kjr&V-?iZ$uv3yPy$hvBN^hZSK@ArqS zu3qfVfBt@3)K%q+(&b6|X&bkS+d8>)@x3=Z)cxk;nY|bJ;?3VDH>c+dUtFR$*QeCQ zYk#Fjd;c%bf6s+p|BAi%Pj-27d;xp(`-FGB;@K1Ieg|J?GEY9GDIE7;w&R5z@oUmn zbDga|zn}Bn^!DOHa97X2;>KE`Hg4 z#RTzHf10nED%r}4R=ez)#HIK`>zu*G>6~{NH`P|X;Jgu=|2Ft=M_p@=`1+V*j|43x z_iS~(zpvO|XYIZA|H`-JkKZiY``cyL691L6*3NzXdSTgzc(=Xnp}q5&cmCr}%m0>- zI>yn`u;_0L69a=2_EW_IOEXK5r>{WG6c9#hs!R<&n0L!T#O8Xup_kqgCa%s^UapoF zA{;`DS+m__#D7cXXTRU|+Vo2O{q1Z=7WQ8Gm9l@XdH%Drzr^-_-@9q!%&0JhzuVNx{C5*16CO@&;{G#W5fxSeH)0B%li*vt}cdacyeL!Qf zsMq4}ZXyq^UlCY%X{9Zfv$Dx9Hysfk)lHk+-eq}D5OY$MzvbBKmvU=I&{`p*4K_z7 zX==UL@^^-=xlPzaLCb4j^`;w&8L5Q|mUGX0n-%KDS>}7&pp@&-W+org&s^GDr5aV{ zOUs-H`O{miX2EZ1T(*$c>X6kFg8EShMD@!mNICZu4If5PEC2aeCM@g-RiNC?DZcFcgXXx z?|pbU;l@$5FLO1Y{fY9n7H0i=)A9V%h-ZiXigao(S~TBucv`xQ$ zNKU@m`I+tImXzsVPPc8Gxb*FvnuSiAb=#NkS!7i zz7y9~&SusBnOD6&_s^4yVYljLoLSNI`g7g=WWR@R-roFW8WF^Aud%$qJM0+moW^&$ zGUqwt96!s+_BU+1wWG|TmgVJzudCnN=rOM-%es(fcK-Z_`P>_(skq4h{-SThJteqh z+cduBt^V@0)vP}X9||+|=rxJoR+oP`H7_Bp`oZL#hnenI-e6&w!;q8z&;MYq>+^Gu zrpo8;vHYm$pvU+zoacp8%}!ar32WVJZnu7XcCa+|{tDR2thbH73b)PZ zbvnD9>)gSQEH_nS7n^yjbo|8+T9nAFqKyD$A=saXutN? zy~TC>7gsr+C-w^>?;yaEQ|GVw*GhKv|4h=|1;zqbXJ;kqUSmjYR)gcvi>k{DkHo6iVHd0qt0%=R=GK}y>n&JQjxs&PCGLxjsKDx zX1-s;eC+1=72-dxh$gM6ZQsCfW7ZBm=ZAYOYabr;3lB>4Ymi_6_NH)<%|HLZ3rDZ; zr*s{SSF37Y7j~ta?}_>8x&qE%mTH!lLOyAS6j~~^+lZi%&>(=RQH`n@1zliSquGlD8hUNZAvWpR@Yy7GF$G^JxFPlmUz zN#QDr%h_pWrI(s=#5+(WCM-rz=eXy*kBhxNEin8TlXX7OlylA_%>}{gksr2PnN;;k zqjA9!OZR2#LR>bO`3Ti)+gLD9Ws23x!;#&aZ@sF`UVq3!K!UH>plfyfm&EcfslOu4 zzs}wl*4^p1XQ{Dzhpy^5tF;rmyXL41tTw6Q;z(Pp`P|KMoxwA%6${(c3Oi41Id|!s z+)3GQHsZ5ArY^@59E5_7h7c*)1AJv<)KbwPcR$wKpc@g}be zK2{5_Os|owKM~ZBwR_o{Z-rV4U-g>i8~wg{km>wsrDb-0;xklVU*Jr98q%e+^R}Xw zD*OD&+h%TwaY;@1?a%xuH_wc*jB#Ezr;#hiikE3;4WBr=moZK|xW;+&JZqd%r zMDKC(m$-d=L9I=*;!m+9l5>pSaTmDeR|;I&5cT=uk%!9D z&R^zQ6}~9uozSySLiZYjyBG2aoK&zlxoPPXACIYS?{|JvKD|gfD_s8Mc?p@vFHby( z`Xf_m_&em-3!Y$u+hvCQvWa>E8@U57&vpOowen@u+r69SJa^r>&`$p9>a$h9_J0@u z;jhh`z3!(;`!p-V<5Bz5S2R!7J;tae`&u?TDdR)@i8-uYWUR%re>~&Z<&QEcEBN>K&T)G7xUX|rQED(p z+{dnpvxgg>yVqyk?KfTHxT}r1@+fcntDHmHQ>XsT?aH*9TX}FAZ>PwE>&%R2ttw&< zX>Ff(wXt~B>8MkOm*v}Y++zKB=g+mQPy0WI{NDaT_+yIH_useD*Y>Bf=kE!1{205M zZR>;;49BASo-VDdD?B-qx02uIgk{;=@JHRjiqV_PW;jf*l$*nm9+=mAVXo@71E&|g zHL{!V*Q4-A5~3AEL|JR6?5q4{+0 z3N7c-8@4PjJDN^!eYT0yDt{l>TK@MNZa-Z4VV#DAz?U-{Q=At?S2fkReKk^QtE*0* z>ak<*f3BoOg(|T!Rc6oE@?>`hnHO9O5M^`V%PI{^x zG3gKQ%+>a<5?Z%DwdLry{zui(Wt;LeI~|f2d@DabX=UWnefQ+A34S~HQSk1*KHfH_ zJvS!j-+QxV&5UF7D?XnHTaoLox%P^^*@Tw5?wQ=o_8XHV`&N7T|6YBmai!Id|0-F2 zjqkm#d+8LB%gTFe59TY_mz!=q?HgdX`o7dF+x=6HOsswr5x*r< zL*k9_?om-KKv)YJLe z-#o((*!8jPd~rHg^3?h+&p@y2!kI479dix}o%lat^|dQWHq4W6Oh})%r0l-+{S1|D zn^Fs`#U?yY+Wq0cea5%<-Y=P!{4n!ItpUFimw-Uc{*mdQ5z8M||hsJBw}`lV-E|D3+h)E)K3ko(k; z80A#KT8EV!ua1WApH&m3<2-%C%qfamjo!bE78LXReU)$}^mp)Qzh192v*xa2N;7TQ z^+Zp7XWM;^x81e3B<+Wv_kq+WXU&8CsBex;CCP2E*H zucVJ<72o4h`hUoZuD|xT<;(Hu3u>KY1iN46&1F5|<8<@*$z!z#-gA{Ly~MxbL%G%4 z_;r8h2CO4Hn1;-iKmKm zx5e!rO_<8RFrCj6*s=JtmLdq(3s>+HWQ z7C&6~zVj+%U{66P5`%_lA1m@_zKc}V`WyDk=VB#KMKVBxF{KBA`k z7tH0FnaZhi!rC=D`P99M;*Ap4&%WE7W|{w7H0h1wA?pOqf`zg-JlcF09d$Q1{QY2g z^IvImnIG2@0IWGZhtLirLaU#En)wMBSo4OE@_gXVOp%;7;8gkWw7q% z*#BQ@N8J7!E-U1YPF(!-oBTA<2b$-5)RUO)7i7AASze~9I`2VLmrnh4;W=g3rMgc{ z?~msH`K&+8DOlq3LWR!Q|HoIIF*bBQ%Rhr}4x?3pgR^Im#_FWdPrIbpR(Q;r@Z;>d zXGgeY1go9$Kq9a~l>s+E+oKU~-^<=m&5GlMtv z5%b2A%sI^IQ4?oQbejJBN}hGTD@w~bWN`V z0ktwGlh!=TZnIrea4R{h;Zxg_DQc$wxF$Y@n=S;h7cd;>c>)F+kR$trrm)><}SaF(hK~H8&2)~h0xY;+UUte#{b-P&6 zl6(F0@uQoK=k4iZR!&Xy*kOL8Ve#(pwZB-WK8$(x|M)WNTf48r_V{EbdK(TvV{fh(VHk>;7 zB>ve|8%}GPTfcrU`<(bXXz`a{%;i=+bNbWk(mc-dm-j_X?f-r?b(ZcPr}NGHDfzeN zN;j8PeY-B#Z&3XHfEmyCv3iyG7lx+gE?RJiAeT{xV4pQSVJrhJTh!zy5gl$|qBTGq1fb-ld@@b46Fu z*J#tyOD~wqKE5pcc0cy{n@@0WI8wPTUGm7(dV zvSqvfR8N@?W;ae0zWDUrnr}%;>Il_PS?HE&J+l`O4+B2&9rT&Dc3 zknl6mSw88Af!A_F?t}wOr-Zw5nl^roGFqb<X`tE;z=!!Cw6kM z&U;h%UQjaZx}?Rw)n)g~|15l4d7=Dx!od?#zy0!!HXJjU)#JV{J)W^5WcH<}zjtjD zSa{7Tfzf#tNB3mkbL%VSa9VXc&zLNFG?`Z;dZ9iOVB>k1d?7CSS4R!*_}9cbYAWUFN%LfR;oG=d3k# zl4?B7-qdpT^nK~{%@IC^Uzx5p2(78jaUYt9J1>6g9MJ@ei9^&5BkTXz*$ zsBFD8S7@Q0gY?JmJo)E!mTrBtowZ=@2h*hams(i2uCgyqnY(1&$H@_fQPFMNesZqW zZCKZEHr$76-vMF8!nHr%Cc1s+aFwsj_fz34c$B)})}|LsyWVe2D+#P>Vc&A^`}bG9 z`#!C>x=zq})s^VTfN-uk+#^6s;*{dNcE@$b!kEEDE?yzcP3n%90c z_ht7zyr0pt_*#Q*jY{UEDbmXhePcVf*Y;YD?JoH@RlkfUhE3{NQ29^iQHf)*Q&HZQ z4Fc`A*4-4E{`QLIv^BcL8Uy4k2KN&h(YQk+Bg9WedzMJ@I zN4wkIdY!BNCv`MEzskM6H$V3K^oM=-?tB#dw2rTuW5cBhoI366j)f<`t>F8;#-{Vp z7wdE7_xTGqr7U#Wwf*m7S_k<(!OyAsWjy>=w+&O%zYL3+9 zXWhno%H!|NlRf{EFXxEos-TmFyIwqxEIgIgzeV}JcyPUy+4(gmh2m$M%-?bQ^=+N* z@V129mieijdn-fS&$m63t2I~6+POBUNb>9IGhDr~+IRFOubvya{NlO{nH@K0a&&jC zXOFqDTTECkz5k<4FpuF8fjEVmK~MYNg#F$llY5)}zg^Svj*xdjp-Lj}{{I(xiqy^n z6>qYwDU1_A6Zf*XiZ^F>BltbdprQ?g(TcaTk=6N+JcK|;Ld#BkmvHRlO_iBv9vcZM zsx-GTww!cXd{ryUhk37IUW)nTliT;N%1hpUR{7@DS0#ZWH{ZRg`t$1MTxE;8;yqPi z+>#HSzjEaLEGl6=exWx_N$8cN)x{VW8LQK!C#LjFT%sF(e&Y;%kt?@(Gj_duY4~qv z!^fuOx7#=VX=Yzl)pF%=t4D(9>B=+H8u~ZSDE4^bW4m!ieN+0*wgy*$&nrDbbkwqs zI%*_b{Bl3)R*>J(H#647n3`%xh63bixnS2Q5ec+}PzpSOlj!}Gv++lw?^&fn`DHFInEv*!iR~Wly9ajk7 zvbJ%T9dpy<_ck{(EAt+RxGcG;_k?S0q=NI7_ns|^J{D_)?V{WHiX5VLyzkr3^X}M% zSN|J+U(2}is=vO*DXK(r-KY6?3WQFFYD_S^C9;|0uUh(v2hr(Q{xw-gh2M=U|I@r> z|I5DLviI9(ALNKK$mut25ZCFXhF^KL|U}6{yuqeEu*-7pgtR8+u7GOVy80J>AKvKIpnX9CgAz>K(LO1$CNwY)ZU%@ z`!Yd*U7c@Ewa1Y~#|0d}i%wGRmNs<$X1;LBM&@v%K$m}OS@SM`zLWg^%2$~kpQCTB zNH~}zHlg}?RO(@Cj>t&|lz*+QtG=Fl-)weomgruEt-u&?ls%}bXB+I7w`Q&PlBZvDrucpHH>oJd*$en>-_iU-Okuu z=fX6zR?lzEU);>F39IS z@L=7OjbA1Sy^TBlUHWBTY}Sj`CZ!o}`UZb5$?~(`{dXhZ$2YC=o&EuEWl)DJFlo8o?@ z&|)h)+sQ8Wrq(Up9tM>@dxE47tZ#B$6&ttOjl);(R@l6-k179q zEp&Zx?2($W}K?IKR2eFmuN46>Bwv?qA(o%)aM4pUL@+H%#?6Y&G*_-qNe} zYjMEuJFn-8pNM<>fazm)ZOpWdix`zXSAPlJ{cOR#b&oB5pKl2)YJD!*qVvVBI*u>s z-uyDfC$Fz+m-Ij1#d41QkF!SQ`wyzFn##ABgecz(z7_Pyqb zm%M}|Z#+zzS@!1bgv$pdLvjPoNqu8Z^4-Uf030;n{72XE$CforGzxA{&DO?m(4O!fAyOC~dUO}f3dZujNW!ix+--c6|tTyQG2N?y-z`?NCEN2Sk~ zm0p*&j+}c}F0Y(R?SS`^onN}2-DLf!)n(sPDqp@VVfq5AJ^dNxzb{Rc>~@rUU21Ha zG3krt*0x73Dot&Tzw`cA75x9O_jUQk7RAsrSFQTah-800rGB&Kg~{S&rn91TA8fLS zO@G;=WF=_YzjC9ogS_W=3_9GOKu<5rOb^tR-E0VaqpR2p|sd_*&_~z7cnpE zO)*&dCC~H5zRsH+y06wu&+bjuzpD87Z|D^Dwh%$@+{Iu0RQPA{?apyGi&DFl9I@xf z;j`QJ32@D=yZ3CXOjmu*R_!wea~Vo9mDAHI;#zr{C9QWYtZUqQ|7Gc|$35jsEAE_K z>oeW+!_w^8zx%yc>|ME(OyjOLR~xVYF#WnJ@4Myg^O+idCDr9h5}zHgi86o3y}_z8 zr0Qcy5Bly-RUh+)8h6smpHDq;V19Gk zoxRMAO{X6}|dJkfpmO{-I(Yuy(A_CEB}XyM_XEzTkDOx9*sQqH*Y_Nchex@Yeoi_QZSk_O{glSMB`+U6SAM{qxG$yu z*EOrXORjF$5Hn+!*u`7BXu0t%lg5=j|CUbZJhWK)r=sDlTe`gS*IUZHY1#Mx|LdpM zvPEjj8=k-8E7+Bswe9t`qXpSY_7Ux;!`Y+Kn+_cCXDRDTYu?~@>2I{@1w&Ofu^T(f zuKCL@;P@xZ{wu#{#;2!VT7KgE?6KPlyJl(yvs@PZtjG2B>H4EhX*Kc96X(5}y)|gz zNk7J09pMJ+!}?0joK@cWgmc4(PTSYj7Fyn05{rd{cbz{gxX?RZCe&wNzOdM8=ByOK z;C)M2y}A`;&t976?X_XOtoF7lYv!}NnChN49KE?pYp0b+*RQr88VmK@`mQ#M7a4Dv zZt?W5RdKBN=X&K^A&;-0vEKD7QdRr&t9jjz*5BRO7rb|;z}YehfuFkl=dvWG<|sKW zWVw5Kso_VYLl!`7yv*8umhH?83^zC!upK4nT7iC)AgGB4!f4IBy`jFvkK6=oqxUc3 z)(cpwdY~%SGscobCn9uXlgFVW>RA(_3_cn-_p(|4`TfPCW_HSCnV_f5rl0SCR+#`eqndPl&DJ9~_K`!@tfd(33%mDKNf*1gv80o#l-bsEfTLyvu) zYkTVykEujgQowrdfXbhSJj+GG7Ns$%-EMuL*;CQA$sx(OEBAbtXxfGwQ(GEK1>VaZ zaG0oP9COm$!SB1&y#Vnqys<(z*l%j@T3})_W8*f{6}?MMPrl|`p{JhqI_=qV7UKt- zro^t~P2H^IcGH!E=dwP-tN!Nji?H-+Wz%M;xRM!jl} zZ{#x`$?(1T>2GPSqWapcipj;+MWF0bHD#PUUqrs?oS22&2HN- ztL*GQcdm1-;;h5I&8rG{^N(h{5j3%SJ6~?s|DX-k(FF=OHZ{0CIIp>~^3nfk6%*f| zO|F0PJ@bzHKi*kWZA}_?__EL0t**LpyXlqx`;8N`OP%Hky|OE@i#ys@cJN|U{w$Tp z1^+~jT)TRi{Y$D6`xg5T%N8GL{g`6cmvi)&&oYgD@2C7KZM4v;B&@ z@!dWBqrUI&EoEm++yAKvt`!s4saUj8Bd_H*-_|Di6XsI&C+*GdRW0*1{}LM&-&9w_ zCnP>q>7TLw52t|oG{+w%^Ult1wpek@b@9!tNZXypyc+WN>gP_LefU9pd!$8w<(eqb z!UL>rIlUt9ck%4c3w*z7-6S`iDVBC|MW4^SFkhACpMCbQR!63!e7d~Uw@Z2lwU`!W zY@Mg>`cR+Sd}`A+C&@hh4mB0#!c{+ytvlfS!Da8FoGX6iTc2s3-EDM!vsn1dfBFXx z{uD+G?1Kt}8-~UeM}!y{D*YH3#Ic^Z;_FUeH0!NQcJVEbPsV?`IM?kuz*eogL3X|Q zIZ?Ko%cg}h-itZ+y6B|Ajjq-so`?G0f4slGTJF*d&XnTytBU2^jPKh1o%L?!Ji+Re z|LuRTW`B5L^kKbA#*nR~t3`ggO= z__SA)qZ_bvuws2nN z8NANrIAvg1FuVQ|8m9b!u0d>iTVh&$p*v zVqi)VaNOt@(;sq{;pVrF-A-GiKK$}>uoQgexa`TqhT?!Z!cp@@o}$q zm0(`Z$nxvhj#^fUwV(6WTmS936JN5NIoU{2{IFr>#K3Hux7*fNuQim6?RP)iS?Hi9 zQt9;e>FQ}Z4OcF){ym$S5Vh^R>pz}rUm6Xo{p8N3bA`BnD;fU07p{L6x%$BIhw1BtE7ti= zd&XSxrR&x<{v7M#@2q?8#1;h#ip~yy_J%X#?Z05X=G<8Q2gR$;XfR*pYvuH+RkEso zAS<@_GqZ8PEY(k?+u!O zMX7P{6dpSJ@>OH;tqZGMeXpOJ)O0BhX=XRX{++%0eC12q6X|NbUZGs8r=Kp~rEplZRAg;v z_VTAemxT75*Pkwz^Ia~@i6vg$(DRjwUSY??ORjTOwg$8nieH?;o_qW2%2iESb3#)@ z3>S&zXt?&XU+;T6t5~3u`IuYshK#?NoO-n*=;BhL+3f7XQh&0X4AyBJ z3VD?hf4ottQvdAI6d6OE`%LZY>t69$9riEZU#5Qd^SnUr&N%D-Yjc>)o||W`YM%0Z zsSZQLPPti*1}`^iel{$cSvS{_S7lCsw2{8Uc6s0Djd6~0TNMpM1zBA`Wo-B+6QC>p z!%MK-dub{A!dog+nNK9l0k4KxR~YylbrRFQ zG_h-;SJHCN2~6d-j8#{@l^@Eya_VSf;KN~pf#HKK6Ud?G!I#iF>8L*PdQ`X;=zXHmGiC? z8b4uq8f5qHXoba$Ym+?JR;ZZ1PAQP}x2}D8=g$8`<#Ufu=}R~rGMiv8Eum9deA@c4 z#2)7^Hvg=?+eV97ZLT)BURYaQe)+ue<9ET|&#x_99<%A_HYL0A(@U5B{K}X1=I$BJ zMUEK?5yxXrEck1d)9$+NaN#SPHCH?Pj=h`ty{Dp0JS)DGw|>^fJw~PTR~%j*zdrp> z))$42AC2LuF85!W1_`@J8XU>#;EDSDfrDN8L6v*r)a6OnPTjbib=$CHiX3z20|6aH zl~5r`9d}6w{rJg;IE%hkBs$G=Q?AO6N|@lAvaBKQx427`LdHaX7lUI0-rn}}5As~I zSQsI3EcZXp^fTW7pXpZ11j`p)za5=-?CivdV|rqX*w#9xYp;oYWZu>H#?UE0f9H$a z=}9{q&aa93!1#nKSAA1YhD-lM|5Nkalke=^Gb_zVLNw80?Hi4k;mgfJoTPC*7HeN6E zUdWFVhEXzt-X+sEFXQ~VY+W|{wXP7!eFu(cC{=X$XsZW^AzxyWY?N#D#j_LY;eXZIS- z+_vmk?Dk;gdWAp5$1_R;PXCmia=P%fao$p=<~O^hdxi%G?Uqbc7MQktitzM)m&sEX z->~#qlsNwd!_=J*y*~--?|*aZJbTe5Ui-1N<7Xc~7G5{ArN-uG$Ilt}Oz#+cxUI3^=!3^6ryovA zxoD!({bZ@XUs5usQ}l=VU;6B=IrHL+!me4)5f2nhyt4WG71MjO&pNmNGCtSL^S%F_ z_x-uf8Y{lF&kcK@S9EpKOGQclOQ%)jytl29e>%0J>y_8-v&wlMg-vH32*oVBKG|cc z@0K$LTAOs2-Qv7=`M~5uVgJ_^Myy;}9BjF&!zbXW%zowG?;pF;PH&v{<`8?p?go|m zqaA<$O**Gm_k`oXMKPY0V(IB0ewHg43401@P4t^|cVo-!HzA*o9a}B=bEki=Wwddu zNt~n9CDXa$x3zWqH+d)ji>j$GJjl`L&G+DWzo?xz;|ZO4$2k_d9sj<^Yp45;kfR4( zPJ5NT@89y>TGe`)r`?=8GPxcyvX2*)-ksf6s`q4ju9fkecemxAbJop%FKzuX`pwqa zGxN8zcTb=A!!_8ZdfL*S z8CNW?-AbC?J&|AEAu8s)SH{$E<<~B8T}N7tr==z(PTn4(9dWLyzIcn^qK~Q9B@_Q@ zyp&iUv~j6K`-Ja$`CFntF>?kQc`Z$pFW$eGU24Ot_dc8cUQ_3rr$5Uf-|y$y*bKHC z344>?ggNWEu%0~B6l}YAs(fDCpSuy;8_u1`nPSHvy70@2Rc9}CM=y){C7|m3Ys35d z+O~YFz2XOu_UO{K(C;VbKwfam~Y18rfcit-o*?;s`bnE|JbpMZ* zouYrm+S#kUn%1Vd+G+2;;dAlzpK|9vd57}L-=009y6%Mb;vnCgrVR{&v5b0!i$3fO z66ELox=>T@+l|vaJ(Zi1zPbn1R+c>7S{W}D@`^os+P;u{UAajSCsu^HN$t9I@6w+v z-Rs_hDmijZOAcM~uyPifld<8w@!aqYRy8wb+U>jXz{y|4?*^3@bImr7vcEzhlYgpGxcFwNmU3+=%mUGpAl%j6!RjyWQoXD;HyLRun z_rKfAe9B$ZPQN?t`1$?k*LN=Lv_14&hUMkc!i|rjr>*?BJTp6I%R4o<^BMkumRV;l z`lRlgx31XnbY~XthFfdS%+}6Yf9TEBWlLrHPTdI?e7=7N591EibuKCQS8}jTa`K*Y zP)SB7*x$ai!)e)qipa!o9*UUMn<&To$|>sH>-W%w$R@NL@9QyKq@?EVCo z?APksl6kz(h=Ix4X31yYslVo5y4nzPDaZ11Y1#teu+6$_>@s!>y$kS^nDj6BV{cCs zi;#EbjP4}c=+KZP3F&0j^?OA=wR?pgyu>;q<$c*v;i>0!?>L+}@i6#U!|lbzK0D*P zY`WhrEYpAfVQ)dn^69w|hf?S6N=?kvoa11$dTH6$#f8^r_$(Hf&nc4kcYB2Xi_c#K zBR*}KbdSON+P#OYD*xUwJQO~=Y4K*8Y4ew_kvou35pgV5DNeHM-36PA;qs*?tN3an z7&i0r+52x?8JsH1@S$~ooACWvO}DQnvhIAj!?g1FUDwy)Y}fx5C&zexN&T6$`ubjx z>puVHT`jh2X|J>0BgD1r_b11D6HnQ2r3Brr**SHinO*3rH$~wk*EARA|Ga1MI4f}L zrK3gMEVuM`$8PpiS-)m=@Jz>p5*;%pRL+y}I+ZtX=~M5mc^o#XY5(-!fAMu+Z<)S6 zbm!N5FLM|3E%7vr{>m%3|Dul6j*oAd&CPggB1{TC-)7J2T51?){8-CD`uzkQr~NlN zgntITd0`}4=>K@C$VapJJXu~}&fMc%sO5ZQ4wFXo+ABtj@|9HNWX<|-MCQ~~Dt)@s zdF_v9paawPh4W4NKNs9L-*R|EhLr1Np1UoadfVR|jW>9FJ%sssvi|y|=GHO18}@98 z?>)-&eU469_@PI)Ub0NMnbiMRcU_WZ(sRLMUOdiHRuA_z1p7y*+~L2nO~O>K=lxXUz1EKN0{5*C7C_3+D%Dz-t<70vHkj|{JhlMr`=60$)CU9N=fnBtoW)g{?)XK+u})F`%*q?_bFPi^J1>A{|RQhsf(pW^-bYthdxFY!W8pE|q8dHWB0 z_pGd)Q`5;R`Dfa8wx8M+qT8xh-#K=s`|Tqk$+-P%?yO>SX~c|CwOpBb6Dl#nJQ#|J1X44TAphGVgqPyz15JC`o~nYBwa0KHm|wHfZ^dqVjpQ ze-!**&B*Rh-Yr*uvh1;uN!Ttesn+MOB!2!)`gH%(+tBJG4VBOJPB2Z&duX0H^*<-- zpcuQ)3NY*thd_akI5RT>DjHl*B7Vj9k%4n zTx+y)Np{A{b3ul>r*{eXNw?^fT$QLiC;L^LxoVEjytW9t;5nalYxBSG`^~xTTr$Vo zd+Nn>Wv@eK#%EGWpRGIep+_nZ3C^O& zmu*?H`Q3*-whPuIDRbSrzT8P|%S2A?(iWr>k zhl;Vzoso4qGWLgqgU;TykEh>NT$WJ1WV-@Sb8gKXMX_lQr|SP{R5`tB0z;dcvPjKk zNrt%T4R(*s>r$9gcnZ8nJ0=bNpt$5uabZN-oAa_(V~lPCT`K2wEhbFndZcB z>8F30P*WpQkmJ5jObiTFtoTx+DS=Vi-jIVupw#$y{S8I&%TipP#hRC!og1p!SdN)_ z7N6p%?!9_SNcptD_t(2Oc{*QCStfpL(mlJq+w+e~ezE^jzV+nPCH&8Mo<+2TUubto zizx~|9Fn)wWro<)1h>p4pDXLG)y$SIP`9;^=hOf7<+J1?nf|BRYwHq{<`_F2x71Hu zel=_}(+lIv9RaJ($jmrqcx6>ni|2(IpDtzWTgk&@ejw%7%AIQiG|y-44m~MiDzWS6 z0zI#Q$jvkEuX`EQIg2wQRQjNB#0Qqt&XBV&@^*(mn{jAa9#>kJV@U{uvFn~Q1**pz z=A1Kq6F7ZKTd|TwTv5swhs=VR8#kG*n5+AG;x(ximikkh&FAiy@M%2VW)^N;G+9{j zr*(m1LUX{>8KH-i*$y456{wG1m;51L{=q$d=l^DP62jAz76;!+K7FKn?gJN}c_x#m z%s$oeAWh0|Utnv!s7}+5gRADVetc`vm9UNHVEa`0V+T|AesGRhd-$r+EItLN)hEl| z|Gnnq7Sg)t-_i^T@zm^}jhA#hXLu;4S1$<>eo{T@sKUaPKlh(#nRNS@LSnp?1>3yF zkYmlw&rFov{z|Kb?mzPKB9A&Vzn(iw(x>GM=DD{$a4~!=dGUNp(5+_eP$};H9}_F= zq9Er7_EUANJvN_b{mKc~tPrmaq1>r(yHb7>#MW_UijR zU$%|q!&X(jSp!x?8w=?YUnp)(fXe9-22T>QR8~ zE#>JO{GRi8smwN6T=p$ms>s{&kJH*Ye$}C0bY7fb`x|(D^WKVDzd)b)J!$Lx!<(+I zP=3X}V{PR7EsDCg{N%UycQoByRGoFi?4_;l-Tp63vG=k)t-eiq@Qe3(xlhOy?RN)V z-%oj~o2%=2_(jP-uJVGjr)5KRUdAV$|H$xe>Cp_6sngCOZT1FDbjX?++Pq+5V5nxr zI_v3JT9TiVT9TSvLO37g-Et7v`&--XB&(J>>n*uiE7;qUnq~>4NV{6PcH17ieQS3{ zIq%c=zppL0w8b}+@6D~x&(6-SRGxqN=Ut_a@(c*uOu& zMQct(tfJjhwVeyOXRQpqfiACcWbCfF1~tCbcZ2jqB=we*x~+>kt|IGr=JvXP#oUqa z{;m!a%{j5KEBSK7rPS{RbM*tmHVT^R-U`(%-Zj}$8&uZ6y??WdJL>K3mK)k0{ahN? z9*Fv7mHO%knr}%>{^+ADAk!@)>3pfJ>QLp)wlBw)e_dGWKjXCK=TGbB&X>~hSk<@f zl5|OMqrl&{DY2KkR&I^iR?5Ma@Un2)T{|7)u4n#VBvd_3&d*!d*gCu8(=>jcO*gLy z9eHt*gY|R?XVY&_qkXP!CC0mFr~1d$+MIqi*<|St#f2SWfs@W2JH1yZEG!0>y~hy+GzOydF0xwyIu?2 zxXiKMbJ~(E+?nYr(~i8fzw7et$a8+->-PO^i9PN;cJA&h zdHRBZMn9z=ar`to{Vpx@8-HK>&o8Df_6H)OwG+D*EYeL_b@bQs4Gh8@oPu}C@4b=Y zlmE6+a8>Kh;ENxe60S^ZJ*i#Lz-{-(ZpDHJZubA}W{HNeaKGELN~gP!r(R1>GJeU$ z7pWXU*0c5Umn}Y@z!I*Ll_MJV{E6fG)tC3bn!)#Dg~pyMJiK?kp4PnG`uv~8i}DrI zf2wbEpCo*7WkFgLUmen+PN3Yg%KDS8A`=6{bi6GhOIY6d<*(rn!e}c7dV@emB?#Ca zkN>Em7a+;C#CFLX87@vC#uRB+8S(0#?OV&&e3g2#|NRVwg{#(H>E3#;_Vcs7m6s2H zxV#}N_M97E9KU`@+j)tkRHNK2*&7Yib2+*xAKEmlc-9;;ET!)1*~S9SB;Lo&I%WAOU;R`k29;z%s#P-Y4@{;7cALxC#>{bHTBE8cdzCI$=uF9 zxG7lRu1LbkL#yYc88c^AZnv1c_NjcZ;ttcDhQAWJ_Z7{};a<0EQ)5Q1;^Cd)eg9tl z$unp*3%@l-yKpl1!XLX|EIKgp!j&net@=DoM}KS8-F=tLGMo8cvjLCU$3(S=PM^4! zKJq@h)^O<_d2~`sd1s*-OMZ93KP}ONpR@LM@z4GBRO_D3B97C!9Spk_dcr^dwc^-# zyM1@=774{ge!=E@>-)uK229oY?0r%*_KN&8{z+-Nhq^>|T1{RuYl2<3POHndXaAM7 zZ_HW8##%l90gqL4;`7HzTiGZwib)eJoW{NUaky`h0>jMq`?l@UPT^ zIkh&$Z>@erH+(EHlH^zKf85z$D^fGVt0*<}($VT&S?^AyetjBdW7E5;?7_(|H?8ix zdloY-$3}lCPxR)rso&V|?`gju=YGF5R&>?fQ>W&b#$KqGs<_vzdOhMXdc#NmK(1OG z4+Ddz7OqWao_=8jlH6UX?BYcc-!}j0vW_tB6rOZ(#**q?+wBEZIj!Ad51#u{RvO6> zp4t?{X7DoSZ2$e@cTX2K^q1sc&C4wh4Y7D%eJ{ZN?@yD8PVqDC`ayrE>A7EjGUdg; zGhgriXwCR{=d0$$Y1-$zA~mjB>r`;w{i&pOd@h@1zS-^NAD%bO;PztqW{^@JU_I?s z(A}6Ff}Bof{A*Pk*KeK>B(yQ|PfqI>+sZ`kq-Z|cUYUx^hQ^S;<*mGbM* z!~6;RCw@>j=Q$Cz@${eXExQWrRs2nQ9++EBf5q9|GS4Z(qi?N5Djz4ez-q>(eF7W2 z`zpegmad!Q95X*Sb^}95B!g|hyPIEajFzT|Uc7lKc!^cRB=);|qBsuf1lk?l3l0t^Ho|S-7ii@$A~O1}DxY zxP%ymxG%dW`TdHZWS{%t#)WeQn-{qx?0D;@YP?`eN`h7Uv1zYeWA6GFbP0MqwMJX( zxUs;$DK2F%*a}&)^?0(tGzr1RrsKQwf5iQA@gZ+RY~BIx`O>?)(yqu4XXu=V;na~NBO^= zF?pido0YP>543kMIj3drs6&E4F)Gp|gnjO#4b9(OC=QWO}88`gbifZ4WZMp1g}? zt$j^~qJ!>+&yN|B4^QN%KAc&?!|+|hJb7(cdk4?T4FZ!qgi`a?YR*+`FpydnDt)v> zApFAnHk}7S0qz`vH@GZwxnJ?!;c1X>d}7CMn4FN;_=x#sE6241hL77Ueowu9^2Z)U zPHs`2LPfoOS(&o9(ch2F_uli#smYf*?|+xsd*}10FFCfji*GUDHy zdyf529q$+Q%u))PbwX%Tc{U6G6z;5etw^t>?0)JG+B5biM^5qhFlBZ3GAF%zW{ovB zWjE`)YCZX3bNX)doh=fPRoi<4KipywI=6JP$dAX*u7?T#-wvi62-X3?z?EZM)<^8JVnlhJiTN01i z)q)FW*K&86r5)K{ZcjSSKw{m_3jHNu3yCdaj~1=X2U5zb3 zOTbaCOWZ5eB({Ed&vvIb{p{j1a);O^FT7`XT-jHWN4@zX+mB^Gg$j;H9MlO-v<_)E zpDi8Yb8JBd%aa|flRrs^)GSYX```8KhlXz%-=@iD&XO+EuH31)hjB57uGeMhlDf;g zeouYFul8$i)#{1+J+^*hxngeeS>f+)<*#D@c-m5>d1^{Ujo+T1DqY~aGJpNFV2(2B zDAqXdqF8H1*4`sW*UX67l4ufoD_?)AHb>JkrSHeTU%%xM_T-s$Bx7J6TW#^8Z(pJV z;&vPUzqKcYudSC^GFD-6_i1N|-Y>Uzd-*L`D5_T(5fvDc6ced?e;HGr)$!Taq6Ob~ zH{4ilz_MA+?fvz&U-W{iykEag+_FY@%dPyD$GiUZ2=X(E7#;s49x;Jaw)MgdyPm^2 z&CGwf{;8h!xZQB%T4Rpn`u=4V7i%~Vyj__6Pv`URPvU`Y1#I!FRV3}!Ye*)k8oJnK zsx~`T{oK5!{Hgw)lXpa?&VJA<^QYQdSjev7&cdlHo9;v<-qP^gX_@ua-Rmbu#XP?0 zmClbN&3yg_XFZtmR1_OErCJ*icck)vUKLdlZCIbYptS~K?F z*fDkG-c>?kQX!LBcfG%`et|=3_m0K$#e;))9$&rZT=brx@6*40U1C#^)4o&E@mGe( z>|J-STq{?7WWiFW*E_4~n{FrBNK3h^Y>nO&eA4PPQ|yk?2XRc!hl^^Z*0D#| zP4xe@_E=(V`YcAHFX!D~torlmqWHe%hxh*qTh87&^f7;G%$)xhxRS*mnLMeRkbCgw z%FiEu`^(!%oN3?P{`BwXqI>7xn15L#F7@rFMQfM2^!m4xtZwjZzjof`!jXBN7g}Vh z*3Zn!za;skV)pUCbKe)f_(|HzIz&5W)G_FU%5S@%t0 z<>KFqQu4noxU;gVZ{qS-iRW7$pEj2>3Ck^5uu$~E2JXg=AH1#X8uPf>j53${EDh5FQ%A4NMH0t8Mw*nM`gT_kv9Uxr!30mJ>pOPZqobn-2mw^;v4 zJO7gxD?a9JUh!%2B>6TYOU0PK!a=>YPAMBpe)TD57dA_BPp>-X$d;YIkz<+Yfm=y! zYty^~`L_u(aZ1UamUkC9+2PXn_V^RW;Px9SsU@soYtN-^zRWu9%JUH?<^jD=>C&W~r{eQocG5*!{_baw9`RJH;;a5F>Pg$kdxy|a|e*Tn=Q(nlacGIaS z*C1|wtm48c$NW#*Enz9CT9ufvoB5Yh@74{c6YqK1$Q*koSj95K{lnQd&ClV1zaCU| z#oCr#xVf6ij9YV^y=05_hi4Zq9DH2OyyF!6(jVG_?}THk^VXKJJm8PHH`%oD>dM!Q z*R#)wET6aToAr*#n}Ssv9?tywb+LKA(;|uZ$PLn0oAWpKJ}ynvh-dk|YFQqi;s)Qx z4jb$4DqT~$p%j+6EuQ7W#_fhb|88xHjAmsnyPe`)&dT^@v3|-q14-EfZx-!rz3C?3 z<@@fm?u8b%kdn^M*X17$mn8SE(?7ZSTFP6qX^#%8ta=eyY*igT<$31h(u%_!D<}M6 zNvtd0d@nC{_4f&@86K4_DNDU5tNQcl0@s(0K~Lts+wK_{|M8=0b-^A(N7r`$&X-ey z>YNp&pGn>SER*mD(5@BEGx_6g=3e{{oS)}x!%9A&#$@XYv=L!S8nTX z?x{U3omI*kq%eEpOztI{#h)&zXGR^U6}xd%{Vp>DLnQ~+fm-)a&tQK)_h14&mfo<~ z{6`idwQBnxb?sx(O!c%cvs+cm;gg{p=-|2F_VQCId==_9PL#d)@c#L&8kP*}*p>Xg zHRpCdpI4n+$oRcPvizZtQk=oLFKkYrV={KE@mkbcqPIXjOd51dM&5eX@VVzqmvHY& z?pyk!Kke2|hlE`TTwy_HR3n-GMSFNTb~^1B@_e75taXBe-LrVvmXyt2!3k0v=l^eN zou-t2^w^$N6@IE2YZk4H(GqB_-68L{L1+1-DF*A(R8J=yFghjbYIg9}v$;_hWYVO) zUr4i`JO{c;N9Ziee&$mjVh+vnYCT`j%CuX_+LgbBWqL+(bW?<66!+ddhT@eo-2sJ&Z2`%PM7(~bMu+TJq)SBU7Yy5!7yr7Nd+=9H3A+O_Ehtq;MjFh!E1i+@46{`hgBN?X|ypMbDZP0_oPBc zqD|-V#VR?>DpzJ0eXO0ME3#s%h(v;)Y2wmb-~RMG4tcTWOrqm8k>j%hx4Ff$7~Pri z-+Xh>hn;T)HkP)OAK-f6RQ*9qQm<1ie|hJds(Etn@~?e+aLrxdp}jYc?L`jvPCM;@ zeeqn1wlBDr^8PVocoFln?)jzt?|#VnOgd2ZG{#_^iR#Xc^Jn^AJ!PGvr#Jl`uj9gx zhvUwjoOI~>wC2fzLHYZ84j)!|)%i52;CQ7-w%dG(^GCJ+Fw3eh-Cv@h`I2+pQjNFP z-GQ1jr(UtMw$x2H!rt^G@AdA>Go~lCdCGZK7A$*waAL<}lQna<1>O)krt*XS;lGY%G%DFwxYM~*7bFU!9ihH zQsrjskjiJ`4%0qW99}v7-|s@dPM#@3GjDG>BpA1H|E##@DlW~&A=m#Gy{)%Bzt(Q= z-oMZ0yM)UByuUAI|3#jU>n{EFEK|?4lG^v+zQwWECzzXMy;ohSX8rGT_u%(8!Or!| zq~6Rc-*z~7*$l}?!6ttUtEy(Yd2Wd{_bgT2d3i(p!-L!Y3S3R(e6!|>=NXTy^1dSP zg(s)(b?Bd(bhF|?*7^0`x4Mqsy|pNMl3~))yK3tk)C4cz>5`kw|2Il4ZiTz=?77zG z5)OG+AB?#3@K~0;z|_87)AnokCh``(@l?CXRnKoC?7L*2(ceo!7yS#)-g=miT40=? z?R{o83j@Pd9$W()&hCZ;ii@RT(Z#Dg1nQ>6UtFrcrq z%wr{;vL?~z+N!@FZ!^1vn5b>dH@N$^Ha`AYP_td^F4-T9enJ~tPV(M3IY(9G%~LD2 zN!)AM#Nu;VX6viG2$PNKb(8+Xde^Ow_5W+H3vtZI!a58q2(oYby!YsJ!1p&&+~NEOl3A{A5qerXq8;=4k@ zu;=>b8LS2gjJ`o#7g=^*joP(9@r+rdgTLm7ZCneE3r_bqHko|^&s(N@D?C2RM{#UW zy{RO1fc1ro)=j1#UaeOHU$bq{bA594k-xk=P< zHl+pnHrD^vUp&HI{DbNIve&bm|377{ecH5m>b{FIox0(M&IxBcC$K~xQ)a2y68l=* zZH8?6gCF`{wdX&!Z+q^T|D=gC`SMrUY$JnM3I97EPi$V#V6)0)<)^vpbzM5PK8ZLm z!Ryc?lk-1WZ_iw`$)bg|a`BC84V%obxGEgz{26sVY2KO5JQufXJY?R$A*9D!ArXYiWCSxqgYJ#>NUI*8a^~_53r^bp!Lh{ob)LAoAPF zR+FYcqX#NiUe{+#tvr(+akn;vxle&tbOo z=dMN4$tzhBi^3cKDjeN+);oWj*S&DLse5Of3BJ2=`HWLrj6eRpSYTDAQ~&7Jf4Oyh z?!nJ5zPWuY!{%#_{KYwI0;kWs?Y^%oe5$OjeSV&wgsqG~mCCBu6=~@S<*#RjZS)Yj z@WW{1p?lx&D(}m_JJ%pi>7BvW_hH>)H9;WhYCr#7o}Jvy}XCY+C5* zDg5(`?_|B}+r!ORzV_SNrfQXsPj#*=)0H{zS$cMz@u~gXJ8gIU;cC`8w(s?J3%;cf z9n+U-@_&dqb7Ga-XO@batLH4~E#F}yw17`de0?Uf&K{Zg%oR?459&3|__fX+e7@27 z&HacACc3?EpBJ9`uKaGo`_Fg(eLbtUBBonq|A%j@Cf}_}XWw{thyMGP;I20h+ZPDi zRI2J5#s24C7W>y|+WR?)uP!)gUA52`$Wi^eYS-M0`*-CZpQy8JV<7vArHu1VYq$05 zl^W*9o93&;U3SjgJ@Lo9E&bP~&F733{r&2g;mv@Br&z20?K+S?r?>n={IO~8V%GiC zUK6_3nRoNT9|?zF=S@F=c5;pnf9S#s%nS?{*|AQ*`Q#_21Sc1zrsfeS@TP`d%mW>s zqZV(tNdIA80(0*Au;{z(4vlWpnY^4<+bKHBe7JYStuJ%>{`-#wymsI9x@)6wy!hP5 zGjj@eEcmwl+q;BqUP%vQF3b=QoPSH?l#fRupUD(yMN8i9+H*aZ8hEa}TW~Zj`-JS4 z70-W9&;1hd%$O)~L! z&D;|4mRCKo#m+!tK*JcX6>6Avw6<5-=TWfOa!y_ zy!p%y-z-~y=hKw1_AY}>l1EC}OoA??x@lB8$0)3OIrFv9`zy^3wH|9FqINk^ z=5mHupu=YcuR{lugj`JGT|P(Jyb(BhM=kaC_sV?D=CFkq4os0&`}8T|v+x_8iIMXz zO|vb&vFq6*$x6eh5KIs@hJviyFtyj?M_+-BE1 zrXx?*%lP*5KA0fU$@6J(jON?G_^HPZy=VSZeRtjccX7XB`^5?qx|^Q4Y&3~$*0f%+ zFn8{qr*8t@azBX*GgSEh|FK1ZUuN+h%k}!*1q;A4*sC_I-!Aig;`9*aeU|4eHGeq< ztM1$^s%gJ=?v!+cOM4u5uC<@r_AG6Es;rq$Jwr~>)+X)exyLg@c9y=mws^wIs+pU= z>KDzPZCjIH_2uuW?=N2Q?|*7?PxWiQ)Xw*cvQOC4x%wv0J+{~5@||b@*$kegEm(3< zOa1$%XXgxc)N_vyXYJqZ@QuE_t^6*_?B}ZgnIb%rFD|>m80?yJT=}cf0afFv*~f3}jB(m~ zCYZ9bp-ey`)rWj9QBZZ%1&U1qQT+uh;rnFTsm ze_igownK5>3JV1py^Hss+RW-zuF;!*_~lz8DYoX_57)N;Kk}vKLHooyfu$>E{gCj> zPwzk7Zov0@a^mZXm-h<$!{2p(*}kK73)?}4Rr4?J{l|{lB;wL%p0C8hz#xU^k_Py~ zE6@}p2%}9iP7O)SS27p)d*)x4=Fb3+=^~S|SDSgM_9*^@C`JDFbtn~bV*ITyU{5kcag^GH~;ipe@w`MHhUb*ysV7&g) zv{%!kRrhQxcscXzxl>P11uwq7(WccR!twU4NoA;sf&1q-UT1*39_c@$1{PafN+TLu3!b;^gr*bZwLjb_$9DvznqWzU!BFTcXO6z-kIyezW3$^>xCb4jP{-WmF^mCVtG2@Z2jz+Mpcs5E$=5D@}9(+ z`8c?0laSKKXYVh&d?}o#=`v^j(l5d6eopH}J`}yGCZQgG` z`z^owDrSqd=GjeoS3~v*g*{2!cRHe&HLgpwWl!Q#8PmM9=6h%L&#D}h>G^t9ZcojF zOH-C!WOx2*Dq4J0PjgM9&5zBW4_V);o)eblvM*UjY5%Sp@@<=So}7zFyc`fPNoU6b zYg?0~iy8l>U9t0!H@*-WdNy)L=QKClEAKvq?wxtXDD_YGY2M%cOkC^Pvv<7Je0b;e z>y1Lz+a$A=x)m^;{Cj?HqWS3uvKQSK@mR)xuMkVzWXkexl}y&@-VC3YGHb4Gc%H;- zwO!zfaQH3GNgD+wsLKaTl6v-E>#*om|JN@zhh3evQU2rR^F`X``vUu!e_Cz{*!*UD z*zpgw*5Oxvn!3z;pt#90dfR>LOFT230xw;PnyoIorES$b{+s(>tee-{esjt9#E|}@ z`Zt3s1g}LTcc#CxykyU@+~Hp0zlGn$tCy^oJZ*Ku$=AZYN}znkgNd7_KMm|odeGFe37BG?9CUe%d*~$z%o82~EsY;yJH2vwM)0WA ztU2%WA`fT#%ov9?aY52MZm<3HiQDh{HjAh!`@>V&&+su{Fh6Sjrv458YRfkZ|7Fzw zvYjMaG2!9bW1kyS^BX=b_BOsG>GD-~Y4BqKReQ(xnpfW)V%oooOw~tx|h<6_Xp<8PnrPC(1dWMHO^f0qo3;pORo1Tzd*QOIv^ZpC3y)6t#*{80tGz7#t97S` zrnvO^Zatsc)7s-X^~lYpZ1eO~H_mTgRTHmiaIEJtxO_%?&6O;sNj3QeO2I`vhQcx3 zF_N(v&FePw<}lahT&h~Lm5u-TG|L~^&$qJ)dz3Cb`(@(plQSm#wmxlhd|trRDPcQL z^Yk1&ZBrGOuUxTOHg1o?hp>xzha$H1o!F;78QJt;hSlKM1NfzQ|e%un4J*6!Whv)8wPX{J-=>qj{%?>ny6&pLV2 z+&cE&!-@xw9(Oo8)t;|>wlLKq_)N;FFPmesA3qA5zO7N;mgo55iyQ2#B>G}z9gdJ0fcIJ)SxLm9?Lf=C!Pau9x1{7QLHRI=Sb(?!yP2Z^HR@e@|TZw)Xta?Eb^s zA2(dRv-_}|Rqwj^b>=%)oNS2^x;yQ1?dq3FH;U)%zVE`f@5HAQn%VbWPhMiY>oHsM zi7+=ydq&i>>~^Gi%Pm0$22L{u1_jKt>=WwY;~1QplbT$TnGbJigHkgHqowGhQPst_ zKA+&0-Ze^2y{V|=9&!42k9Pw$FhVv~sWn4^+YJpbRW>a-;nncv*q zy~^9ttS7Ci>et8D$6v^51YUC#eTf{q33Gk_4(ZKN20HN6hHKQ&E{Jb zc`_{qPi-Rdoi|1tJ7c$gW7y)ti1v8*oIOvnek$^f@8Fw{K`uG6Y~2@P4S!hh zTc!sZ^v}OL;s2R!2itsO=eO3VEwT`q?0aTr$IRE~|GDj6+ca}VeqqMr^A#tOZm2$c zsFieZ&c2wh`H9i<+t(duo876tY>oP|JN*`G$`bQsx~J6~Q;Uu&=#=RZVSi)9uq#i8 z>3{k$RvZ4C!u-lV&P6#m%(&3o-_SlKC6HTUis~OivvmNpbmzy%r#`ZxE=lm0T z&8BnGI9VRnoImvWM$2a3BhRJJGjbVBuYKLO|K6Rx$ld?v)@Jj!zy0^)_jv>H5H|mx z!qcZ5$$HDFz?04uEB{68Oyhyl^ooC?VO!4c+WYQ@by59I+3(hi1$Xa}++-%brTy`{ zpSkO8Q<`r-e2{j&N1_8qd{WVkj=w9wEJ4qN`J|wXdiQ5;O$(>?4$(E?2dwW*< z!LHc5W%?F7*!yQx{cyAs_+!^~_lCr^?)=@)4`zw}s7l!KY@Ru1le?{geE;3fFn%`=FB0rq*i(DL3d3;~Z$#V>q50mHIn8)FNglUF#s{OksG2%L> zALqSLu8n&6Dssn?^Yc%KdA?e(x1@1Sz2J{OIl|3XI^<{BG#i@Sh}dNPOux|jNnT%~ zXDWA?u&=Y@zrzlNdU}@ZSC1a6soy-S!N2irN}tq0&u1IA&O5cTNN?7ms;sZ(tBcR~ zDp|QrJQrfO`I2Qph^41((zY3{rmNZOp3dyImFYO~YNvJVsh45L<9Gd=(p=X2_EEyd z4@;U4NHPa(mR6dx@tWa{JC}+hpRjIBJ^N$M-8DPszq(eo+)zrzV9kxfh)<410oEI} zu4ai|cP)8gq;1h4IW07@;vkER&cgQ_dS1O)9VT3>$ZDY@x`^4RG~!e1l1UeQ`T48& zKK>*f^=o|?Ys^)(cFP@)KIZ3TgeS)6Mikojt=hUjuJoPz^TV^_-mkHhdAL(cve0az zR=0qwK=%AQ0TYT1Ry(aykBpq!b1e8^?iCt=`)*4{PBrZNdWUnac_J%+h1?Ir2-VHf`e)hxW!J5n z`I+C%#%*=Nx8;ZD&+0m_Im1Jz-1zUFNynQ$&5d$UwH7s(WDF|WeS0T+?fv<8`;MFc z{oVa;MeViMF;mXIcUaL~{P|(JK}*K88Q&D11cq#r>Q6DBUH`u(;@g)?#o~eUrk_jw zz0JJr#@Pq|(lnk5e5}~4mU~n~$!VRJ*xOSs3ES-+{wmctaAQ@i@byKLS3P#**}nOe zS<5>qgC@lZpCfAzE$!duJj;b*?kK$}r#g2h#?t z|7~X;`d`kpY(KZLI3&iU?9>)RRe|c{UX>aLzUt_Fr(z z=;^hSTNG9{-ItG?EV{kn%!#`d8yAXap51(*)~}GSS6Jw1dXvc1-65Zn4lZpw^zmk? zLGy*=`1>(is=qH@|F(N}{`c_1-^%YOvt)DDN=EovFc=wS^*Ky4%KG)k@@eubR>6AH zS*s#kGHm_%l0ps6aUXd-f#K#gBje&#QNFw7-Noyky;m%ZV`2If(~#?RCS~2~OUf@} zES2n!$Xd6WG}~lzwQ2w1-QMvoM#oI?*vT1w3n#Cs*!}F%`gVm$mwj9qv+SkHKfRQA zcJjEv`{N%^KHuHK`18e-Q1-*GIzQQ)%JS5hy!cY}{qg%|z5@nF=5Cy|kXiS@+_fv} z_N~4;`@@WC%R~2f{pPHH{cp4Fo(k@V9q(1Iy#0Rrv0q<+GgpDwg7u197CGJddh2%5 zS`|~}NAbdy5Bk(~gIu=SPMG7ZlKoi8>vgWrtSfg8Pu@MNFst}y=VcvyTJIF<-uZ!Df=314No{X zS(HtF{K%wql^kE{OYJ1S-<>Ze-f2A2?@E{MiM$Ip!vt4-w&akH{LpbnYSpVV&mTNH z!kv_ORda{?>%If`rpULZwsiC4dEWJ!a*FLz^!?@~{>}*^3A33C4XRqA?34QK4()1T zKC^m_Pl(CqfUZu~j?;^mw(PuZDsmvTK`hgS+3Pt&$_>2;C&_6P37VgIKr$J?^@<3^!;q={+#k((Gd=sS#^&8pY5x@du$5Rq$`2xF{h8PF^ilo zJAd)jm+$ZQ=D)7nT_1RPW5*_&O?H}rcTYcD<-zp2q`ZA;KflC`3wM{q{8b3ktC(ax z$3=K?S?~v?^y_O586IE0S}okPx+q6s zF8iO*DQD`own$D~{Yq)s38AHnr}WP2O|(s2tR<;CGk)1N$L}>Y)^8+2d0Xuzi*2S( zSgI-TL+{7^W9ygSU0l;Q>2mDl6G8V9O83tGT(7a1xglnkagNkEFR}Toirebnw%Kg{ zb2aOM`~-%yf4<8jtIt0B%$Fkd*V-bzh1F8wOiNkwl<0$fo1Q4>bTmuVPid{*WZTrT zVyg7fFVXWozh^a{P10nxZ4ol8b2MH#Ht;LDY*$=d4EJ3Hj^4f!8A1&+2B9$Cp(7p~@c;mvQif1_}t zq-$Q_tv-fnGfoB@N-aA#`N$zd)5n)0It&xl7Hxf==NL58OvUW^U)P1@%Vs4lTWJ0B zip|TXDORENHWgtm8%3uc6^;2gA!mA$);+~N?8Z+Ml3w%PD~tI3!7!X{#gh##Cw&@I zr~Zp+*s)5B*K6{%mJiqGGsC8kJ@AmTiZpdwK$#wmCGR=G6t7g%z zYj*l6Q^XfNd{L}$oJH1qV?gD;9Y_yv2;Q!RFkUlp3%yp8EFgYnrw3%<<=HFd2T|upTo}GjSB@l?jJXr@-9X-_?gdA-i7}00TZXC-aGYiQV#Qu z#?&2O+p?~SeQlo=I&Yh@wxz!J`X!rs+g(^}CT*SXeNf_3ORB(xX;0_Mlm-OOmz=pb z!A13`+N|ZVDi_*o_!!vV6$Zpy+jIF_!;1Am`#cUladSB$aI*W;648F{oA=(y=LiZ7F2=U&+UPw|D7VdnDYo&*oG+i$*#sNCq)3s8TiVyTj^lfKFRnnC(0 zevN7I220|1>&N%LE_%fN$yqM_pqjSAuCv=dee~;7Vw|gZe2Kh1hn#u#PuGhxTfUSz zJ+lh#yAhiI_|WI9Z$ZX^4)3n*X{dZDtH&r;d#%^+^WF|-)7KA#c)pv9SZwZ}{5!K? z+pM_W(7)@BE|{43!N>SbiFVX3&VyT$?n*D)?{IZeU+=8H+#R!>)>ppm@nq~vT<(;` zW&1Pmh)AKL{HKc8xqF(v1s;>(`R*d(ow2C-V8^-IfSWtwPRk#OW!+)4by94HwZ)oS zcGl8mb*qJVgLSgn7_DzG-AOvv!dzc-x@E^s&7}rH4SRGK+iBblTU}+o-}&GQBjFD` zuYQU2PLcb=d#*63bkf8?YgvbOK5&fV znY2c9@&4mi!s`lF9ayT8@KpMr=jto|dASSf9%jmU?r!>Hf8uo0lyC0~kI#SU{Y1-l z@rt;>>OTxij_la*CB}XG>50$dU;dr6rSY9gse6a7o|mEEg$K7~x2iVmEtA+4-O_cx zRIi)Y@aNKn|GfTAypob_o0L|(_uiEMy?MJP2i#V@=&y0{`tsUindPaQ<}OxD;0WS9 zDf-7XJa(u4r)3QHZ*}*qsXfluUa@*^W4po~^Zy*t7oPoT`t-|jjij=hg;CH|b>9y^ z55%tDX}?)m_e9c(7fr94PV9&*QT+OGrCs9+f%c|PQM2`SY`D7Kie0-`H+Rmy`&;TS zEn6!jvyRw$KXXwFhs?&7$$J_mo!+i1+}yuRage1!HxsSUO_ z&azEBw`t?y_h(nzNyMLKQ7C_|%CLo({aWbjw5!M3bkE#hz3Z`#ilD~HBGCX%L+urL zU!N{8Y*BSjTiqmi|3|~yb&s6yrwZR%+C4{0?xDZLce#Zts{?CuUFXWN#s((2>~gyp zFx_Qlc%YW(p^LFa#j~a+x-&1Gwshy@NlSAt9el!=VDnaVX^mr8xb~sl_YyXp&3N_V zoj=zn$+I2mw#He)E{+>(*{A#$pJaVUbtmJBPq|K$|C$L!3G8!CyMJbL#}EBW&(73D zZa;l#hnu-r)&`dqZ%S95JHnGYsbw{5b<%Ubz7GqWbKT~*m;cNQzIpB$cjAvzI&3K) z%&TH21kK%Y{6WymExK_mPlW#;yW9RL{JhsL&XD&l|;kss>GZe`&_MAhYGA%j51IStj>v!4IjRjmyKQ`|gd^7Zbgwbt*2SIq(GU zq~uE~KdUCP|FaXV9(ZbZWDQW)gB^$E-BF(vg#y@BGJ1A{uVqmbtyTRC4ub?tC zgp+|8G*Se@Xro0_gMIUFISAMu-=D-H-of)wd9TRV2LT=doC>#99*O9FlgQtE&vke9 zivP98PFH#sp__2u!*!?tPvWWOXR3hV9EO;F>HQ983J z#$dIHVoNRjkxmaU#g3-Q}n^Lu&c?QNkHFD#fwkhJuOvb4p?Z2;1yX1An z=YZOMZn=Y#+%%7o>u%1(lSWlXg|GS8SabOu37MQWsV10H(B|Bqm&~pe<=sz} z?o564yt}}Zn`y@S+7Ahje?Cmw6%A>zDZA)R-B& zp2+UZ^qA41n5wQ4uKYxO(ouy)D}T;Nbvo%Bs*tEJJBPvFLF@IQ$l_UotN)oyUZh{P z%j9t2{Z@ZxCc~dvE1oy1S_Gb{box@fa7x)jKgsAr^0pE^ZHFE6E#!D&Z?MJ1hD0Skcsb=r2o^)K=cCRD8{aNX%O+KFL7rWS) z<9kxCIWX@mnYZ6_-9K<@;%JOT`H>21p#|MWN{LX)|-8F)7?&@uB z&0Efy+*%sj#1y%43e0`r!J|v`L1~>gmc2=M`i-HkK->M zjqyq1IFo0mHQ7?4KQZ?74ZYhurs`fdj5M@Wyr#7WY_+%3l|IJ$^VW})t-toZt6N{n ze)xS``{a9`jrP}M&%Csoc}RdM(CFY7&YF#>O-=jPTV4!G>{91fKf2ADcbj>`?~gyy zPn3P>>6!Xx?z3CF4j;)mu4SRIGc<+&N3@pL!bwZ*gk0qxsAQk$WN_sU%RFkfb=d(E zfxtf(L~fmKnyN0m%GFU6w3hQ$xWegY2K>__!U9|^j(ly~EF-3~e9@u~wTRnCR>|rn z6lXCQUv{i|$B-se*_jq(!;o6B{z305uJZ-`EYFqF-Po5f&Ca;Ijj7UL1LLiY6c7-F%(> zjO+Ff)An7Q*7=ryj-uhYB^?f@Q#x7B*FCCrYO&@ObNrUIYd&k_i{+YU7O}*1+*RS; z^YoCfLY!LRlwZmXQ)VsesrkP~cgl&a(=`$tO%wNIrPsMyYrp9c-=Lf?l6zLO`tUxE zCp!%9Ka-rEblaz6=iCMk{khEyR@zW=@GB_tjcmy@r{D+&%Trq0zxLkJ*L-)}-s}rpcPq3~UQuJ_Awjv@eeT7p;yKnEzP_|e({!zA zRI}&vSu>t`E}Z%#q5QkA_M9B;4b1hn@ocYO8l7HL@b}62J5QBT&}G`RuIYnj)Y|walNow{+(KA5OK#^JxBhswX-?-^w~}?S|MsiRh8+FCd_j~>vt2(t>?Tc^SzvT=6uR3tGWcv5(XRfW2YC3Z! zbKMO_*7u7Yy}nyNK+CZoW#`F?GBGeT;oX@Gznc(Lae**e<<%P$+x^HvpyuA6E~a>q zP4jli=sXWTvr@Vsbkd1Ok7tyex#OFbVifr4{rbtGPj*=E*#2|Hx^=H!F(M<0-o(*WWF49ZAV1$ zwna?x+}MBb_CoV_@UZRUjyQ%>KCtjv;ewBnds|57?sZMy4iTT?4_?&GmCH&?Z3 z{yJS%{b1XyH32uw)m4piQrvc_trNSmyLz?vslu$^O`*#bc4{9uWw5^B(hEzEPy3Hf z%{g0sX2yeiPtLtK9KqB2Iwg9Bceq*7THOl0{!<_0=i2i;o3LxS?%CG6Q+!VR%L~$+ z!{O`ey0|7SLC0>!JPgd9FHt+EIV$Q9Gm%L`noSCRaSRT@;Nha%>|j6nlm2M zO19_62JWX6X*0h_-6o&vr|2kGaJ(^U04 zjq8`4yxMP5d+&bEo5!!GI6D0gvH5buaE@l!ri5QpjgI|_m~pH0!*_-mXO>+)`T0w# z(bqzcrh8M(Pk1G|UQ?}k7h3*BVjX|rj$vh~xyx^|WwmoA=Ka`;2(lS=<-G09uMbE8%b;^BMV=dv;|eBr@bHMoa*I=dUf zcffGw1T;-u>KD&Ha9%pudaG7q&kYT1kBWY9tMHr%r93 z6_Yb%#yOK4TbW{}c%{BLTak4$@RKzE)~W7C@A;@~2q;>0L*_%_B8zqxzb~^i>zJi? zwoEv>;75c?ROiK@VgacLn}2s%W}V(RBj?3sBe`N$sl^%Vo^hV&tlXLZ)iCFbX!nB6 zGOkK3%Q!0M6l_V8n7vQc*sks3F^Mah%?f83UJ3m*(oLyhj(M=FNi>{u-(glOkLD$E zvJ<#+mTBg)7CEM|o+)KM;hh%wNAVNS0|}R$JLjG-T|9F^@lkZQMw4KB>LK;hCmi`# za5uZX58i#BdHq)o=JmI~M(sT=edVfg=jxiH+vgpr5#%iCnIY1>F{P-9&+hl#Tk2ar zdyWP7-ZinyuD_jq<(Kbz?zwf_FZ2CTayX!=x#<1#JBL_m&#DSp zJe$?2aWkpzNRir%NRu|n=t74lA{OLX$CurH2M&{pD7tvz;z3={tySwGNueo@xF_G7r_u}j!5mznV{gE%5 zZ^};lsvwvxyqj@Vz^1Gh)(Za2g8ff#)i}$v^sb!{Y1UOCb;_uU@&CRjg(m_(bI;ja z%zn;Y#YrexXwH$ABU6s_v?zS+JtEx6anwGHul{*)mA^-ZkhhSwkh9Qv6*HB8s)0%m zC+#?4Gv(!8r$>{HunUE&tn;j~`M=9|PowmY%I^F#>KFQEPwIVpNIoo2>ZIVdLxQ4w zdkj*au9=g#-oxznQ$FtbZ;YM)&19C>Qf1e=zO-qoby2Xb*_M@IVR`#`+|`a&ugf;N z=H-?UuE$+{>S)93sw2xHzPH&Qd2x8&|MK&%f88_qFuRWTd(>rj=A3J}F(qFQ6lBdw zJp7o!T03O5o|E50mfcqy+%1fLN-PYyFvp#bRXf+kTo;(TF6~!K z0lU@4li}(~vu`gww)TUz(>ku-w?wQiSp1KZ*!lK*)!S+>DI34`R^yr zKACyRorAhl=16?|VSH<6c`xzV$H&RDApXO(u#uRo>kt@bJKf%X1( zUuWB@^VVFkSf-%<*5~J=hlTI0r$pI2J@!oHPUA;U!{`~$*Ue~W*_-FS%X)Wm(u%9D zN(Fkin%!Qnvz4$jX*yPRTXWrXt$Tbkrn^;@9!puQS$pqnc(%ULH1*^+>s7<0gBf^c zv@a0bsFHa{H2uRre+LKV_lXhNRgMNZcP{Rz*2}FI)!sgjbIvm}x#X86KaNb&JN|NA z!Mxj%JIdQv)|{O5=M{sIiy>EwmOIPrtGPzpM{>^b6(>2U%sW$>)hn*ZcCzVnfgAhu zott$;;yHKvBphDMas8vg|9v7d$B*UR5Nf{Na&K1j$v>G*vMSr+r|oTBqhr6`DewK8 zig4EJJ=gZ;*M})S+E|;AGQ-lUIIif#;e@vBYHWt_hr3pJZQraicg8uv))S|vJUn}F z&f71gM?UJwaPL{PWctjM>6(qVZ)@7OrT;b2H>%J49UgVfh)1SY<-qaZOXS_3HEi7! ze562LYvYBNCtprG&s7jL-~7pk?!Am6-#@o)33&KIgGXuQ`EQ>WxjkNKU7h_j#gO~I zcuLUmmT@!v^xvb%RPH=PE-p61A_`9M)~dRo0y&IlUZC+tXEP|0`BDg z!M@0+`16;-s{sYyKb8j-FdH>LcK-9&_HUE3Ol^(GmM>gdq9!|cEU4k_;9{McRWfxe zm)^RAiu3CF6zBb`bEp(QE^xd;{QQEb+V279A3RxfrfE{r1jjx-y^jYM`Z-93KNtAF zz=OASNs03U7PCU-HIHUK)!cDpW44Bdp5sTR7_WsYq8hGKcB3u$i21td!B2h$hEOjC z^t0;RLp_6Bot^V@a}i5DK>h+@w0h|%;tq$EyAHJdnD9Y+_tVu%64qA|4=c{e$tpjs z+I=uXS;bFi?}oHAn65JmI3W_A@2V z>z6l%-MbTK^Kf;q^>aJ!#3>VguWqR1{`K_JFSfSQo%vQdn|2oGbob_T?`CAr5k7XT z{NSYXH}487#wf5Ko5o!BkTKSHi|u#uW4S-xZO*^L|Db#sbK_fu=&synKi6coo!EAM zkLjYV4cFD#syq$&r%Y03IydvJ(9NaW*)pd&2t29YAlrVoa2w~3q{mwtnGS3^fB5F{ zk7s+nuG_!i{N9&a%58st;y%!{^?~;PW2~yxTg!43c#M87<5v4D=I|iP;B7ri&%O4C z85X~r?!@z?UuQm?ApThM^+wNpE9r0fZhJLn-|cl+5|k9 z)4uF2i_mDbBb>F_kJvlaXa@8k(YuXuiBaMF_ zub)s=Wj0e;(s{EV>q{@Bxl1w3d>76>C9j2nPetzy>xBIUHs|v<^T!D&{Rr(ZE%AN5 z=khMuwP*8s<_Vno^z6YV?*;sJM-H>^ySnq~+OP*|)6EaRT+lD4?Zatwi@$iT>2=2& ztC|yS>_vo?|2<8+p?>GZQ5Ly?1f*|L4+aprA*|4sgp@cFia$>ASg3ktG% z>T)0d|Gju#;syWkzqh*s-wV|>&S%^2cP!Z8e}+Kthe`pvwUsW(Rt9i?sc*Y}={{W$$mf3v%c$=`RkVm@-uZazK7@Z(>Z zxcVC{2~%dQczXM_!Hk*ZeEs*X9+Xe=m5X7Tn)u;iQ2w?HXE)2Y%|HL}^!cw*OR{9H z-p~>IrhFm0N2>H4%bpLvQy0tC&bSe_B(S9y1X2h&5>IpU!V&Up2jxyPMD>HYGvu7!Ik~^OVqYon;)1Ty z>;AcxdyOmpa5*V2+jYYBSA?&bxv7;}v)nYPZ9SP-{< zt*%6ClJL%ps{Fj~99}*9?0J8~-Rgp4Y20j)E)F(xES?E}=k0J7c(^9yMCM;z(V~Xk zvu0elow@pIcC`1h`{fOj&+v#J?zJh_yJsTpR&Qk~FY%Y{gYpvF7u9{w#go6dKR$o` z@5c@UrK#^GF*j*8JaZ0rvbwaV?9wXrjZQCg`Zy$+EF$g~JKryk*nBx?v24T7^gn_X z7q@&rKI?*IiuE)NuB%}!T}cfm6qr{$`*!$jj@iC_w(?RLZN({5_iPYpx7fy_Yk1Al z&PFpyr+MS_`MMJiX@n`?o|Y7mzx3c`8F}q}d<(L;Hs3k8pHs#8#O&zzi!|Fil6;md z7P0lN-LHG%s`trjxl0eK-t;r^b{J%4wv+fq&uzQ$mBhxI2&1u~};^9I|U25*1TI`WD zugvN$Q-^Ju%kQHR%{yh^ZC;$zv3Hw`UiE@qwoY#rrDdQ`p~sU-!FNa7J#C^*k}x z>yy&_7auD-&$3deg+uw^`7=k1SU6Od1tj#^wgg28Ydm0X4LW^EpdwmpXHI#7&fa$I zd_Gf`&sjD1r0+_}S3iGze*5&x_rxVcm5v`PclDi=?mb1N_BeONz6ec+X+Ksrtz*-Q z76`04y=U>7$rq3HzIM2_{GweJfoQ#wQ?&L>QL zGG{~4n&m=QS4Q;+m71p&9z$KDW&J2H%W23 zy(|wSmseGiw-6U=;@OlVu@ftQGaXP)c{7Fa^qX88*2(uGXPd4&euG~k)-38&N$AoC zCwvPhnt7WU#u@L+*}QXa!~rJuI|>YPOc!qllnQQ?5pdDZIWE{Gzl+4w_O%J3+2%-&)Ky|T`%{+TgB3-E$zz#UoZDcpR(-w zI?;2VubE7pH6e-fv+}pML9gyz-^!X`WPeq$X5Qplemkb+<}c@Moia&t&lc~gOMmn{ zI(6dg*N~o-7k;07v0O<1;}w<{DM`yNM;Pum+!k~1ZEk4l9mT6Po%}&tBVVaR?3G!4 z-r6rbEb^&I;OeOzuXC4qb_O|ha9+)RnAIC>6Xv=1+lDO@MWeceANHpiJZ;?mQMW=i zxN`QjyZM}*_O~u31{C%%OJ{u9y3^K3aej(*@&U%BFRVG*Zjxmyt>x9 z$Xv9nXzLS>z@K-PZr@~~I=PDXdL`3jE%q&0CnW_1rX4zev^wwrheGx0+@AspN)B(e zc`k|+{50Jf66LXE%B5A@lSIT8r1Avk8T;q_?N(%E-D7`YO_Z3--~X$d9?OS_g!sRj z*=&42d%y8}@!z|xy*}^T6L7+J?R@S>u6c*#zsUBz>t{KdWMW^KanVDeBJ}XF%?)_j5Q<(XWucavY{2&}q$a~Tg)P3gD3 zDv7O@{A*$(u6$VA+P`u^VvC(w-7J?bhK4+0PsLavmj`=76%-{NrhK^`?X1vV!%~qi zy??jDCu=F2Q%SBLtVNtlB4)pMqO~FB)CwtQZuWCucpsf`YddvKrSM7bqqtVDAWKe< zX%p<#bdG6xi^t#GG3$uvk#jtzPw(%LKX%;kX(yxp!EM3&R)~w1+}^~?(Cy!L|7Ki+ z_uorLWA7U_C!Bv-xU1>1kTbU&qhgZsx6f)5nZnc8-^{78`!_SvJFoWWY2UJr>qi_c zD-5nL611&9_wknCyO;J4o-SJ2IZvYFb-1+p7EV3|ofW*zOL!(%z9`$>uD)t(Hc!Yw zUM|0@({x*ee!J!`QDFb7%d%pp#%`}!Zek|svVtrZ?9|(nSSK{>zopgI_xC7s_Lh$m z40&Rmy?q`R***W9uCL)GR^|RlX+h5X<=SG=6J%Chk=fnn;BiFg_)EEY^G?0dY}|4= zId=UW$)AF%7tT3s>8y~d!yDa|Gyw= zebif>_NDyNHgk+0y{p~95-TrTdX@e8(gUIAt?u7DC9rTY!?!tQ!Os>gIkcv_BjwWV z@-=z!_jXO18oV@M;^7Y)?_KP>w@$ZX3DZXZa_>b2GR@l}7cVr)SH9gAzGALuDC>H| zipy*YDL+58A7sP8HVKDQS)pcJ;|28bLUKG;>s;o()7Ni{&+6zCkJe6Jk=kJ5qST0*(4lc9jUQz1rm39Z)3O{E*m-)Q>`nd`7Zb^DApOtml zP+WA;+C!(-CNGV>x?Sqj49ikw@4~eUAKWY7$8~6S3V%iTnOf%J?%g$vtlD?A;un_u zC|7bi-@QrqUdMsSjQ_gy9;@#O*|T-8t#gRB(oX-qCnv3&!8GMrS;FN@4?cg8nrP44 zyYNMQYI^J|w%s;QpYZ33#b@O|f48N1s?qfaqMw(~o@sC7cCJ};chKDL$8Tyzcq~$$ zd?WAVOau164qG;eO#j54ndo-@(DUWfxE5s<2A?=|kzXtOQ~h#>Sou{)ZwosMO-aA^ zUWg@V`fj1V&p(E;3ryO4pK`<(Xi4Ma7m8iZS-JH zYmwyJISv2M$vvH>D>I+C|e2tacz){v&v4L-9 z%%%SB)zUYvJ#T!x@#MF2!rW$J-0#|D7RcU^p5LndZqsgeCX3_3XTEUW*vYcTPi4t} z>&Hy@*xxj=EB;Aa-r$hG$Z*?Co`}nxA8s&CmS)L57%49)px$buxu>$qaXRPx3+tY+ zvgH74-n`Tc=uf5L3vte4T)Y<#-_s>MWe`Wmp%51;t@XzP>AC5|p-1C$_ zCQ;~huR4R_9nFH82eV_Cnod95@?TD&Dt+(x3dDD%{>TFYO&0hLGU;OXv z4)fH>vtK@`GP6lE?n`%iHFfedUB;_XOn+nKEDv#Coodf)?rbsR`KGC#4>Ydk){}b> z!57_dB_w&K`rqnZ3Tu2de^?89KRdnRY*{0NWM|5}nGAC`ZRR!FW0AR8JT~IVkNY+Y ze(E$mZFm%;!}xcndg_I=bfcbvpQ-(&e!K6UEBqe0{C1l8X1Takd{d@6E>YRNkLSs( z*gHLJGFO`0efIxx-7E0NtY^-O2ZaX?zbHKXSp4$CH{VJwco*F7`Bk)cTHT+7Z4c*_ zt3TcTqp`}i{GE;5vGd2wx8xkNy#J&Wo4+c(!qFrf_z4)g)(k|Fipx z|9pM=TJFjbEpAiWlMD3P!_Bt}tZ)}Kyb`-Fg;UyOUfOHlz1K2K)|oGuyd+I;O#=6> zIEill7aHsA8e6|sy}dWNd_&si4CCOOTW5s0f6Y9_^7jgpV?oreTW6;Au&{(+OZ%tpcgu6@4H>baqdzi&G$@4Ba^i>HOpk8+F7>ac3roM&Eg z$24d4Oo91If-I$PHkRC(v0Oi@#6;YqxsR1~vF7yCPnf11m~q4J!K2!j?u}m}K5t3* zd$Py9_@C^f#=P%ePp7MDw>?;ua5AHU``Np1Z_@1c@7vXCFKp0eJh@QVU|J&QB*_`! z^IVN2&Q_&Aez<_;*`4Bdhh@%u*i&viula&+-umTTCIam`JEjXA_ZRr~@@(R(5^hDF zUpCd1zc!Wls&Z*6%yx@(X$_HzyXkU@DO6o}W}}i;lKVrv7CmnjVC#)*Qkc4KrHcw{O0Z`4idoxI7itN=Iu}`^ zJ!!FVMcoXyg!5SfLTVd@Z@vhuC@b`Or`>*f!M*P1ckgqRt@g2I*{GSWyiz63%p-MC z?hz%Y<4g;`Bt2!}+p$=|%`)&k-(|hMds&03zI`nH-(2`bCg9=A_3QH8r|<1n{H?z^ z-pB3l&$A^S*JtrQf12@?`PvmfiFp<0l=;;J&av?=@$uy`w_0nK9TV%nZu#faj?RIa zPHxU_4-%Z7G_OBqJK?u&&9-)*p-OTXI$>3VmC1M@p?oxSqV#eFG<=~U~j z!4I2?cN}r&33Ir3OQ+arieRZzLQegi*=M78{;Afs9A5A(a%R(3W*a$YwVoSa*gmkl z>$<-7`VR3=GJ7f)FTeP^RB^BGqpxBUc|w+GD)n=$U)dL^cx<1?_a(PBTuA)e7ksnn z(IbyTYBznpdEF${ar?cla=al=N9Fq@eNZ+pKyWIJp6_2zp&%D(M0-|?@c+VE{{+hjJGkPFu< zn`9TORvzLh`a7Yl=S3-PJ$F?BqvROAjk(_oQM(PrV` z(0cJNTiT5)to1pcQBUB!yKNHH8|2O zp0oFF+ul6;Uc^eiT%iwJkK|r@eV^0cWlP|q`@g@&Y0BF=X1<(zbWw%F-$NQ1#~L!c zLN{iZ%rWJu)j8;PXgL!D^WwP-w>Tb7FA(Q3WEvUT^-H zb4oCOl(%VPy0prtZ0@)DzHN^;3bpw!uK%*E*-Y4B!IE!_-+w$eWf_}=&5Cb zwO)q}n^sL%e$z^ri#L~M)zsjSwZR`kR(ph$n^+C@AgB2=VYU#b(l!LpiFYe#^ z^@M_V&J?4>bIL8IiqZLdJ(m2Nw~D3Rwsdb9XMv{6=F|7~rJmh#t>8}XR)w_7=Y!w; zu;H%JD66=a#^zx9A>?1r(cHF=b%z#hx}CcHHhaO%{kHPo^%$NVFf@9`^T6(F+V;hc z%u6E+vvwC6=D5XG{$cD5+x-(95Cq=2Z?Kt)8aF{=9 zbo<1Wd%x@c{;e{xcFLuUr#e|y#xjrb zDjN^8tLoEh=aLFrB`od=t@!REc;S{(`PnbIjz_*fQuv;}xBqbe=7Sr|>;JFL*eo); zFfUP!Qy?WWab84}V9_j**C*Z|`~F}<$l;KO=T7o=ew?D8^59ic!Da(ClT`tpA{ML% z+fST4$e<(rC$;-T*h>kXxeLB2vESyCIQafmh5lOp21YSCslc97FIijiXP(l2Rx1>i z)G6Z6sCHxj@xH||w4KYTrNy`@4|MS&Ack7 zSRYZ5^s#q0=hyjB2Y*fcq%e2Nj|T!zFP{~5d=l5!bACe4ECoYZ&R{R0Df-W5Bm&bktDmbadPzZWm~@A!Sk^xqk^ zQ5kb4{mOS#U+pD)`qd9rsTA|6F9apqWz7yw=Q|?1tmDy4##`>XmhY}*XO;`ptCsy= zEZks!MPHgTDYfj0TX*fO9ksG0uUT-MT!G3sK2zH`=9s=F8w(8|ZKC}MtRHinRCGg5tors{`*JbxNF`RuE=EZnH{?!rR=O<{LxP{Xr?^Gg_(Re9?f8o4Diymd+1@vv}H=T&tL<(sd=^7h`; zt@!(AYhaD;)`#q?)&h9i*4r(LuGncj(aYGKsi%41S>D3^!86y?ubHFl znCN)MU`xn^1^btH8?0hmd3ECAqM~}%?|+|px`pr8G~C<%Xzt=0b5<4vu+D#RP(*Rj z+=zzXj$W%=ju>bp_(vE|`u<(6Jo=jIJ;|#gw|!?{{jq#yr5ewQl@lU=*}FTq+w4fO zE{N_wv-9vry9v>2oSZ&5?=02XojWJnCER^-S-H(l{RQ2uYI^dKo&MHob2{q!V%KVQ zO9$?Blr_%LTMX$;}TdZp@!P`^4c%3ymC4OjAjjR^i^!yJp7;(bKB_SD*ct zl%6Ug*44cDV8ONXEbhD3q)4qZ*|#u=J@o4x#Kkde%rnmqV=G@*#CdV~m zll%mi%@x04cruoIa`@tR)2_vDnY)O^TDK_Oxhi=2S(Upg-7}ZU&$OCwKIZHmv)zfS zbV4VeY<3oDe`<9xPjk`{m9XmHN*i+_r? z#eL=#Ixg_JY)V95(`?Bp)@M1U$fgD9dvRWAc)Vl#tZlJPswPY!T=DNi5dz ze&?Gfn+hL!qIN}AbN11g_`e>D^AF@6zdvjCuD4V2KP)qSSrTUS&`kD8_MMcC+x*@y zz0qj>IHX9y!}a}vrxlOx#W%~YxnA`#{#->7z; zliARK)o{H*XvHKX3ofTUm{lUKt0v_7yMfv1fjI zS>NXi*O>@iJKYq1g z)$e1fS(_Vvm8eGqcpD#M;qJ2f4_-x4=txdegfmp)&Rl&HJfvbe-a^sk75%gTZm z5!W_vY_$AvFRg6h@4dp8PPFQsR`gyvpV#c)gAI#6#hrikgMl-V@56J?8Sx)ggwo#S zC1h>BGo5KwXy2MEpC3k*h3sRSKK*q?+p~k5Ex)EMnf8}OF+S)`((|wVZv55mrp1$u zjL%%x-L=r^zwp(Kk3xKRx5Na$W8?dyqAK{#dhzP%-y;6^eEt(0dU%a<3C8n zZ&+~eZ&tlr;k$|-tWoOGmlo9YTIF7u;vF$dvrlsO?XB{mH%~T*gdXRbCZqFD#US(J za)z^sceNQ-Mf|$7SidU(IyUmtKUCyjjCJjAM^G96M1&(7sdYL@1+kePS6$+Vib02xxvy9z|9@kDEGXp zmOa;YqCir6^1hx=TYJth%~E8mp4#laDk{{~A~iH8s?OsNx5iBWJ^CqXn~!N4Y%B;l z$vo*z#WSIQFZg3mN-w|CcU--f-NBoqVq<^a??tupr7smTd5T|Z2S%iuDV#m1Vf*%5 zvvQ_IjNe%g(JMtBsdWOu^)_?*esQjI+#vdnf02|=zFRYku*bwgXH)Ivw<0V~F>sdr z7O8Br)#XrZ%x+wq;hO#Idh=`ZGld_2-`rY~{7!HCzDs-$nUiI|=dXI3Rm)S=B-obJ z|8mo%!&?&b|2P*rh>3qH);W3mRC1AKhvTxoSy%P*6w9MnZ6D|bUP#IHI^@gHbyCVW zR>}A2`h}mEe6AD;clt7i=V=%!JNKU6e_rkJ$&zagHjZ!Z=v74dU1jh(FEeeE)F;<7 zzK_oDQvP~2$!zsu9meNg!nqw+#Lt-+vXvCu9A}-Tr1)m?6N{uh*CHo;JR8C=j=6pSMSGTr1BkS71 zZ!v2h{?*b1@%Bf2Ay^}IIc;WLN8J~dONn01}n_zpWdmWEWmcqez3d*JH8DdlRKFd+A zTr;zod7sWpQ2||9ovpe78zvnpx-(1psO6N$Y5QNOT}s*a=iKvLeg3rAou0C1G;^Ay zD*eh#ZGIX^^>-W1eZ(DdX79fx!7o|P*hRJS^puF&dwI6p)_Int*l}2Tv)$4p-&^N< zOm9ZZhRvG0TV-ePt>(hYTT_|$%-pxH(pY(B=DbJkOMdp%UAnOTg5Ue^>wa0Vuesb7 z<@kBO&ehKIsbBsDA3U3~e5rZGMXe^!{7EUxUAB5 zx4xUC^68iX)7Q#_ZZmoJ21z|!e&A+U+~(h(zWiJrb}mHb++&~KfWrq1kC;D|e&7CNi=qxYfDP+;Qd`WwSOUJSlF~*}ICPklv8+?30%dHYNxNNkWp6%i>A$d=CdI3ks z?5556NoA}2(+WK|#(BDSHchiz#V~z+eL;u+lFj|A7tf!)yg%C@B;H6|oB?%=w9Q41 z%SefVLAQ^AK@QbF?xCKL)mGt|c`5njgoaAb*#0e_eQc9`bp6pVyUe9*)=rb`C&hi2 z(K+3h_a&6m-2DALIe8xK&U6;71s1!O*Z-M)GuDokY0j4QxqiwC>1AnUW&6q&9DnlU z_~f(a;w{botdN~-y=z|VWMQKX;>&V>Szp>deVMOk{obu6_X`s}&fk0!Q@rz&=i=)s zZ^Kp>GyQ)lRO-t5<4Wnj>96YEO1Q1ozN{>LJ#yErSqILydTV~1)B1nS&M)elinqC3 z&v_Jd_)E?8nmfOy%&@zd^O$#b?pujxN$uOWZF7u$bXdo(^txQ3*qcXrHT;)vUAd}b zbk{CwnP1y7zubPNEo{Y)ZS!4uKkZ0n*zR#KCcq(2_Q2|&%aZ@Qtl&H!`)TGbxtPgj z3IdZkdV~sNE?uZmxvhGR?cgkj*L@8IN+&M+oKt4wO}fSN_S8)Vb8QEXKen@{xyotY ztSZ^KRpkIf^2y_kzv_zC3#I<)tO-doPF+*?i}To_Ne6>}%`EbHR+T)nL879_RQlT4 zNQS1s`fJtv0;j$vSOnNBe%;PodT0LmlW$YpM2teyUM(oM4@pa@vY+ku>~FBqat~oI z{rD{@j4Q73ojAW>Us{x0`cL6C%h+2Y*&;LNYpz-4clNx)G`Erqvx>aaEWb@Md?YPc7ED ztdl)|{GoE|mRp7nSakI9PMamH zVwc$D3I!N!J{RsdGwm}^*T#!6_7Cn|Zsd>%{X0L3ciK%xpPboO#nx?hyOpQ$CiIoy z#}DrR4lLoHxBjQ(_C)W-2jBCuduG3=GYCIWQ_vj0^44P4y$|kvu(M1{XijR{c|$e- zy!n+)awDer8f~zH~$O(R;H49|BwQ z>}0R4czUt?LsQGHhjTXW zE?R5G>Je^St2jy9h>aESO+4bDgDzo8+Zo!T#4_>?y@>F{HI8UY5@js)>hl1Mmt0sSB z{xkF30ns;tatH55-MZv``0JFy_4ZRvr2I0NX==<`U8`QaQ%*Q*@j`b5EDO z-ehw7ZCB1>*R&pPq5YhnV_*7YZC|RFZdYQ^e)Ij4&Gmt^{`$FoJNVMzowL+_&i}b9 zmA5AToqcG*i@xlN_MPva71zhj`km+c?%-*|cdV`VTfP@_npL}VegC!TK+C+R#{agN zJWdZa|2_A{8}DDfGxkln=k<17$;p}XcBy^+b2w-I^9^@vZ)@g1KBv9OcCO(z%i8-b zg_8do7R~qEw4vnCTlutqO7{<(UOIFCiW4?2Q+j^8Bz)TXX1l87HmeGYjn|h?uz7Q$ zYNuYrztc6GA)6jZD4U(!Xti_Zo@7N!WrrhC9v9r2WkfdzA2?oll%eDIZ_TZ}Yq!RF zr<`1@l%Ksn(%NBjqSKP=AAIFxS{0?29F_LIy|E*3^I22xdwa^4n7{2;y|nwaw(*bG zX$yE5wG^*^pY^@&lVFQipW@^?wKnI-hJ!)=)2zGBG=^&@h{+~*FYbNZ$Pmfb`f2ui zoB8V;wS9U*Jd*#tKK%RNgLivx+3cK9xJRJ${L%?ex>+;!w9Zu$bYQJ7cPtDz&bN+F zYF^G>0mBy;1FDyZF?6>+`n++ru=R{>UtRMy)+hY?RbeEp=`8q`vmz#5RX{mItZQRm zl}PmeBgG;Gdnat;kYKiCILw;(>XdrFrm4zYleIB_Hx}8xxv%1$<~IGZqyOIdU;lgD z3q2;_?YL>muCuHMoGw;BKFNUl_qwZ7XX^-794X-|@l5Idb1eGdiHob6-?W};2x`}QYYlf$7`B=RRc1>MmZq{ZfqY@ykj_YfTP%KYAr9 zcpCJ8(`&ZI2VN<83o6Qnedo>QV-QB#ua25+|lWN&K zkAw~Hvc64vwCxN>^`#%4&4)uf?JCb4;`H}XeAmgr`MN`C%v{GE!o;- z?icXKebOT%akIvW&QeNG0_Q%x)MO%Ng(Fv5aMQ)J7fYo4)7%&x)At51BU z_H*8yv+@Vt@TfgrY4omG(*m2J29lf{X@bX2NihFVXj{v4>eZ1#yXGGT z^Dp*Fd=v^>K6$29Fk6;r+GB&MH}5jvOOB9~NtpWd`zZ&P)f0o%nqIVYrOppOFz3{Q zB^^^{{_>RkAiI#K%ks(N$CCsZJ}1;`H~)$=l8{`rdHbi-%)(=8$&=2^(UPi2ILG}g z;^3(l6;io7q*B*nL+^ z-gP@pI0&_uu(}5^sjOt#xeo(^l z9oBgvQ>}+OWd=(GP#G)}}o&<=iLYYFF+zy18L;NQms_n3{tJ8N#@vjJFytWzCf3 zJZ0+G&r@c}`gEphpX#26DjJvm*p@7~@J;4YTTJW;-L+0jGMy84UX5v&J1Jk8;@od8PE7|zg3;*_>+?&Z?mMQ z*O|>-%YKk|`*pt8{&y4kpBVpP(%v3Zt9&@GM$_o+$JSM8_bxA;ED&s|V{D_-9ph>v zaia6g?tJTXp`9t*bA9Sp&fRe0<>baY5xdH!LEs1zU-jbu}OYYFCXCZoy&Hu z>s)v?yFd47aS3C8X7BvF_Fr{AtnO#>p34$u$#Eul{@(-j4=!*0lo7RTe==jh%be4j zW$fpj=)5F-=V<9=i&K9Ylh#$;`IB$HKgUso6)M?X;yCy}_PDh1 ztFtc_{gZwWewMe4??Zah&b`0#^?hXdo=rT^^^>1Fgy*@B{K5LI{Hq^LOiB)vu}SMl z`QogySiX+=_~&0XtRY%kJ6=|E*~FC!dY!rxT@>;n^40eBJVj1%m0!ar%sCm9Wo%UV z@AjXyCokPH=&Ez%R9JW8=I>eR4#r_6k198KR5aZ&x7h!z{p!ihuUL#Ur{42ex%dsk zi9@~Wf>&>DSX2@i6gtD^>AMpfVjE*(9WVUQyZ2^JMcZ=T&gI9u*QUO8(d^sLmnb#m zr`tEV)^{~x`af9?Rq_4V@vxx$?TvN-8k zmbE(bmX*HzPY;t82kkA4aqW&(W)lKl{$%WO0zN){nRl~GH4!&udvUqWb zY;8jQHJ!@|jh?{`sxIdiPFg*IMJv>Vb!uzMG54}<(s8SeZSV2u`|Sz1ZfKI7V=Hqs ztfQ&6m9ei|f4A!2sC`b)cg#=vU%VmEaAI#klhlpwYQ55j_orR4d;H(ldu^6M*fYk& z56{=AmR1y}&%Qq)xL`Yt@b;dd0<5Dtv$Ik!9WQ3eDxE{~0H)+7y4G zXXc7@1G|K9o08)TI}^j$rcyO{+IA^2Z zhx#+pa<*^UnCud-mU@5QbD`^VhhCE9w6Do5Q=^R&zA4P{s+;a~qkTu#W;Xu*!p7;x zqyl23>VL~xrm3^u`?s)v*X@9dmy1NUMHXt^P+hL@VZvPTGxr*A`rdByoo8RW{mz%W z;y(9VUq;UGnzwRW;Tv-uJKm&k8%pB1?|IznUh?>t5X;|`{8`2`*d`xTmlg`#bZy$B zsoQJjRbE^;Bh%*K$}?Xr#T+9)&uecLUBcuPw1K5`Oa7mkN+iTL9zOm9}`V>zO>g^wd#wVN`D9I6B|BHsowz`m_>T7=Knf%R{qcPJ@$J8;?Mvorx)2ibDe3c>N>8>}eV4Fhb`vi|ScXKVXnN1w zD48a|E|y0<{a|U=!&{LBcawJb3H7~w_m?;F-pzFR!tJeXA;M;dCuzR6n3);4Ieq3N zKZlc&0W*vI9JU%SNV}oGRe$po&!@?+Cn{W0Gw&#>V0@X-`tp%#kuHL!9>+DjPdlL|G2_`gj_TI<&5>L^@n>#CnXK61s%|SU``xqn z<8KaLxiD{~7VBcp{SCO)tu=7{&-{*d(d92>vY%xkfEoUS-wqPs_n z!q4q$hq4+<|obA;z{Dp_3ihVh*7%D!JRZo1P z5R?4!gVl~dk!c@GIm(#=3$%^)7}l(H-X-%#XW_>C0keMZnx=WqVb&Yhm0pi@WHYBs zwmuduscgX2y!`kZLl;Gp1RC8`=&Qm968RUDx+VdbiZ-IQ_m$OyIf;~>zf5hK}*S{D27IL2DEGf;u(vVp?lk=TjLe1H4Tdp_9J~!r9*bv9! zxOM+Mj(N@MdmahiJHCd+II&Mg`%s|FtT`>aXE^>(w0q0n&i`t8=Kn-1=`YW-Cht)T zU0}!e&wb`y6JgOyn?7?Nn!WLcit2R1Sm!1G;Y&|S`QzS_hJU#e9>4j^dE4SvtMUzAlfB%X>@V4KiuHd?IeV+o;NS&=UE8Lo z^cpA~O1BLoa;Apl(9^{*I_9+vo}q4@ev=p zw20VMC)iheNY>ja_n18v_$u&0s`z-^GRcnZkL@$xMw-$;)#Q zw0+LoOXI|L3qd9b}aqbD+Ok^G&I4Ko)?^?m5JeWW8=ek$W%0k7uy4fgYU z-XCfV_P%}g;{N7SOp*M$JL5ckpNABG4V_oP^Xjp+?1arZd-m_l$@`VHfB7ooRIBxB z4D++5&DUn^w|}PFeZS?x&RgMauYUg#-Lqm_lUB_0Rp$GSHrx-m+>?KzvC3Zhe!t+jnvOFyTQD2c1goeJ0Y8VOmSUblj8k=x1F_A(ASkyDSB<3;Stds~uOmt~Nz2y;b8sGufSQvF76My}I6sxsEA+ z0^hewoZGms(s{#WqggHg|9agy`)=27)j3iV9#5FR{zu^2_NPB@6i)fD)cv?c-`$AJ zHM1TX_o)iaNs*WB))VjFv@Z1Wy`Z|TR;RWUj+bc$il!Ug?Ak2fOrLDQZ}T?KXww$= z}8uHPiI&@%=#4j@}~B_FJT+fPv@NcpklXC_x}}H zbC0k7MYo)tB2Mvq{Y@9i5Jyp9QrUJCm6Zf2_Gk4x$=kL|nB z{a1F);^w3F%g*vG_?hjq=H1&J#=gr}bslYC^UesIQITID{9K|~_EnOXO54YvTYta$ zy!^UTsZimH6yv{L0`nOEKbHSg8RD#My>-U*)ZFTi`d{ZMvAzEyw&dtNM&;f8O;z|7FIatxsj&2P}+J_|CuVe0Bk& zy={#hhn>ZTgI~IT{x=8+oar2L=ShK!dFH*Untu}I7klQMOnzg3BSq-!taV>pu7`S` zI%+0dv4>&jk@=H}xnq02duTc-v^7c5s=Hdm@-UTNGZr^ao zJ$$caf#R2$Pn!kyNj^(*j5WDs_ghUaE8@-Fi9c@nZ{;n`m+8@QvX=uzpqz(a1ioY%Dc$o^t!9h4*rbjFTJvl{bb}7)klYK zA6%GoZpE>#{~TOqXU=w>3ckUhdQ9c^(anON^e1h+rLAXcty*_&jruZnK9(8ZJPSPE zo?rI*#)}pA4L7TMZRYL~JCx^c^mgH+BMl$^Z&+}2mtz0_^*dI-_m$3kR6p7O;j&%U z0xIE5p0_+MDs%ZY^)YZQdArx9YlY!Kt0uv=xZf+}|IM6P8^1o+V|{thZIf^B-n^+Q zD@!kXw*7}3N46_pMtt_xZ>A`H9wPt^S-F{C_>FTKqCXOY(ir3b}(HPR?A` z^?jv=)2=tizIzy)IZ#=%);&8utzq?4qeCZM)|ff(_;kvkL{z)Nx;Odj+X)k2y(lRU z+MXa{>-vB4iwT{Dhu$13GyP?zUU0WoA!e`g`a-|Z9~)+AtXnVI_4=h|&gOGp51wS( zb^6?bUDAPUqU_n~YrehztGk8qVEt$7nq^i!jvT$leO}jIi7i4LZ{;qmS#&xlOX2Uq`7)R1?`%BeDb%QT=A>=*)|)3PeG@iv-Z6dn z*+ldC)2bt%HgRp}tuvX>YZTDj5%e^nKk@kk-!$3pcR9@Keox=t%r8}Pv5&z?cF_aw-5e3QUBq0^8dceUYB?D9$fTwy7UHVF3qohu36j957KY(oqNX1hkL_`In|oQ zzt!$BHHsZL(pT7eWP?QG2?z57Yo|o(bX?C4xnVp*W!4I-3Gxmv_pWm5_*qb2ZTezy z(pCeZs=KfM9j-9gvQhX&<@x>zkA<7b4ykHUi%42)3`QhFB045c20L` zVfB6K^6J~vGG znHHj9I0u8DgS%PqT0OAnkdVrI-g&7E${#nv^w zE$c|*gZw#q*9-z(Cib`3?*3w6)Fj*6uusTpT~FcTIdazj14Ms3zQ6Df>z}pP{=W{5 zY*{hmm&Z%?^#?yUhkDoR@PA!&<3;+_6lR^o#dqgRmt8h%?GaDmWf9u;`^0KxZFzP7 zxDTokEnj{;PTKV6vUk{hqaXz<+)pU#G)%X4n%4CD|;zV)Cj!SR-GrgPzi!XG9D7UFIhRUUO9ew=hbk@9tm?QiW+IxHqR8n^S^mqF&#k;q9QG9Q)Z}9WH z&66tkL~)kw+_R?Xw0Cl<@wv~Lof_eBF={esonK1^HcW~@$`X}f*TdA-jE9KyHdS*uPr zUidNh!?#$gzboXYTq<7_Wo>r5W2zu$#AH_82$KjF=C$`Ld1iAws1jLrVV8umU~Shj z5mWtw!19LyNi8m~Oaktl+7SQG^w{kc0@K4bFz&m3M{&XBv(^hAdRne}na8x*WsV}F z?j)Y@1D%a5cDt%FCYPGO*nVrnUhjvEuhoqlwms{;9^Lau@$%D$=j6Xdn6z-0+_5>n z@SWw^-k^Isz5aaD{~cvrc9_v|GK};NY(Meio5h&EFMg{zYu! zu$MV4S7*ihd%4@~!1=u&WoO*@v#LC24r`9Vffbx`2~rV4GCxk(`1;OltjW0iz^P~s zck;Bd9|AL9Ok(ZZGdGW?z;qJJQo%#X7q02wkx)L7D8tp zM|e(>F*n)j_ICC`hkIGa7uT8exanp!bIR~vQOLf)vAm&uug1+84@G8}>MhLis)$Z6 zo5A$7gRMAi#?y^jCnFfcc5f&S`*~XZWk|f`c);Q z%gPo$Q7*)8N7K_^(IRuRO<(#7i7g3g>kHfRbi?d`#|raU6gj203-3$2xw~1M>#!fk zf%wT+H_Wv#W1Q&ib4jmowOpuIzL!$-HH#{)<#!h4CU2ViVE*s&CuQ1i8+C7MZ_nn~ zv*~5kDPaTVCJX07Ew9h}-SOP~oF~$scNW*g(AgWpZ*9|lyr_C{Zt|TczFa<2gtxNJ z{v`CNPrzWoynv>?6}v6F(%nrg&$2$AxhTh@$nSfR%6HbucVd6de|zDXpi=c_ouygj zJ8$~t$OvA1S(zfDHA7)tjQ<2@+n^||_*BhTj+Z!RE51ps7WBJTvoKBT`owNdvH8ln z$=exT7q0&9t;?GB@C9Q4zSdeEtdU%>V0|E z%4uA?tme5tTz=xz(|gPBCT{1@)0*5IBGP?zN9M7VIDS>-RreOpH;5}=q;jEOuO(|@ z|4gZX{n~|lI+rQFnUEqfJ962QI@^8mdI{BsxuS%9*sqGb5YgZJI9Zo1i{p`N=*=&w z7alxvGUr>oqSRSKQSj6LIj?KHo^Fh+FDzI6Bh#YI|$zQ*uHS^L)=e!a0x^07`!@Asd(84i{iv}L+w zzFqWU<4M^%iyJ}o9Z8b4Sx_u+pf1XJU9Q*F)`4Abea>RGB}UE$=g;QzS5;Z z<%LjB&&`t3P{ri_!zRa?ZJaqS{r&iT=0@HbEoxU?Yc`~x`(1gi`}~VP&p%%c({*WL zf8CRJ(m#ZoGQ{yT03*;hW`T>P&{_P5s(g_m7d&7SgeyKc>!drNn>>%FF@a~_BM zIm(nexA8)Bf#>QFnF2FUM?`;m{#YHj zMMSZG+pmndEjp^Kx?M}XJ(Y~~%@=E4QPcUFEVcf*A%DgR=4l>mdGfoy&WzbG;aT+I zg0;Fco`_x8+7J_8II%|cSmFFj!rrR)R`N3LoD`GP?BZn_pSd|$Nc(J9``T!ym~V5= zhTGn^mJssqxzQSNa5gK;q5Zu5$+L{3yv5c&W>aaH_KyADTH~)PjDPukm%aYBXV3e1 z$L^em(`+~T2*s~U;yd_3^Q-U@9~Xgw>*c$*KX?(t+s6EU_qKmk4|;!1=8U!0E6uo5 zxYx1V>dg+5dApL+FXapQ&M@<8e_xWL*|cV<1B3Ij8oASFp1=24-jZ7A!TrBeaV_Ix z{|%>?GjvqOpG%r(Bf;;uoBv_>BSBRs(~QYQ4KAJ2Z?b&1o6q~eJj3k8WL_ov${xWl zolKT4F`qdetxs0G#1_lB(&T4sdsOc2yt%jKqsp3>P3|jvHC0|k`R>6(@h{hCe_P|h zHepV{7C)x7F_*a2PCHFMJ=Zv%862-E` z%Jz9T+lF;!b7OWsJ2n5a#Mk^vn~Et4vUk37t@}1RM(Rn8@U3a0n>YmhopQHs+mg0s zW&K7i{*5!3nJu=gIW^PM{9n+^Acu9nZGk)+51L1Ba(TM)>e7Y!tg{6C6`E3YwH#fS z>}om0V-vJ?@rhL_9}Tl+oBK!`I+$0k3$6b9`drD2(AQzCA8rZOe12@YSn7pT%5{DH zmv`E>ECiX%jOBe%t8UJ>uicdq@Y=E~>c`cWXAD}^ zQriu-`AC#qF#g0Yl$kF*x%j2?!}jkdmfz_4`(WY&JBd8&$63vF*;}Pb7)8Tck51a# z{rr(~h26hpm2sErN|Ud@+Eu!D&xy6GM1Guc6AF*TbThR>OwH?Re~=yF-Av@B}(zU4+| zHvU&o+-Bdr-+2B1_Unbe=iYpBu5iz7&+Daahn4&6rb&LC#C-ewnVn|uCGPaJ2IxJC zh%OcTk;cAxQ^WK>r~I;ZPq^lPC8AHCM_$D0S@?&Jki_VNe2cq7zK6{ZI5#E9BUEes znT?Y(&k7b@>E?TO+H%&now53df49r-IeqhhtQyyjqC>wjvyDVjE^DoKanTO`b&1P3 zyyUwrcWasDnKpN`n!oOB!k*907O80T@4T7V%CjVEo3nlQI>8@@Q%j%p{0eQ(DE?Hf z?fm`T-01jc2Uc#K_crX?>87XWBWo&|lG(SguI%eswro~lYJlJ?*5yT8!y;b$b*&N? zspj1Fcl~*Juji>AalW?aCC`44-+g1D^bb9*?~lBDQolU!`MK%i{ZERZyuQNf%fcH9d6g#)B;AUXycv1;!lC_zCmEOC`kQd2 z_+5JQ#q9@E3QXT5@AtSFWRrO$L%_B{`^4LG-<~}7o9w;FDMazbg3l(g+Zxjj#PI)K z%$j{)EbdL%O}kK?W7n*sUB%}MzSrPj>ML(?`uzV#-Gldu{pSUmmjCky|9r#WX{`VFQCEs8Y0m!glZ}Dli8Mz23|c7)+DxBHXpQLJ zh`{{YW&(BB*Y7yXpUbB1ZS*El_uGOSepw2BMz=FBs5fuSm@TbZC6anw_S^mPDH;^u!19j_8ebN!=m{2B{pa}Av$j^g zD^z6OZE`<1t>El56VJ>G$}b}Mmr6?=e6099KI^~nV|hK+Q$j~wKFMh~#~kWAB~pL5 z@`ABmPn>*9%XXKSGgLd)ZnHY%z~7*`u}ytn8 zEt&eU?t-(HP0w@ry!X!q?$tE47g+J;KbwC~Su~t8aM$8if$r^d7V7zVOk%n2wWjG_ ziivEEL-U8E8rymGmlnqNJvU!`lSeOqxxk@Vi@E*m->*LudG~I4`S#5hInS)<;}E_+ zHzZ4Z1^S(Z;6Pw54*kCCdbWrL3ImZo?l-fA`Dh_zgx+KCQ_xM7^4~3Iu z-hsjYWjb6u4>l*PTv=eM-als_H-i{A@AJjotbgLRyUNt(yG&8~#Q%?}qS*DS`yu0B z&*pYMR=FNEHR63S5KI$eA{W>v6PSH{G%n_w;X4y z$@1w$aHlt%Ui0VUlYrp8-R~D^drtI_H&=dQ6azEKl_Nx;2;1`#cTGSkmf$%=yQ|atpi5vgbTR_AzX$ zI{YQ;;JxQT`MpmAMKhHq>4$VxZJD&nN3GQSs@)vfNA3srUv$$sGRt}+$F`$dZJ%AH zAGCRJP2~4t#zA6+MP`sT#v*>@kQK|jZVti>%(jr<6mNI zzKdVQ)OXR*%@ZE-X)f<7yO_PASK)TwzjHUtmUT+$yFTJwezI_FZ$f))XH<8;PU?=x z+7jlecY1I5ySUskUMX-`M&0_5WQ;lx~Dh2+ZQ|WSA6CR zixa!M zJ!IbT<*DO8`;W1c-G9Bgu;yZU*DIyq3hT(5g5 z`y~=M)BY^$m2$rg0S}kmFnO(gw%%Uorp4ld@1n;;Ts7KG8G8%0ou=rt=2r$Q6PAmqCrzKvxs0RrpI(T) zomQ*V)=<`+sg_ZH3QjMyDvyg46u+6}`qb3-T2}D+OB>pYHyE`4s3 zb$VfI`?D|q*8Yo`T6RNn%eCq=Pv1^$-2O*wQ(v(3W8HPE>g@8@9nOUb8ZElyt}Ad@ zM)lWbSN5B%bI&Q>xqRi-tB=1N?`8a&_Uh%Y-nu6ztYS~d9Jw-Emv_rP1|Eysd6ApG zMVe^%*Vtyu*`190ixH#~nhVOf{z)7A^n-Nzof{9mFdM~=NfNX9A0t0<|X_7 z#Im>o4_8FL z@2|gW{L`Tk+tzFaT)Uh=&}ZMQ$)|H>V|IK-ojtMmQ2X7j^~_fO<6_w_lfC^t8f1TG|yyeoZ#sZsItyo%B>-(`bezeEQU>W0s($a zl_9%6r8F8RS@yg+6nijB%t7GV_q3a4mCI7zUjBJYtdZ%!r0UT3{mZOg^6a1d`&`N; z$yfL5nIjA&&s>t961-`e_HCv^8`RDh9LReo!*NG*a-O__)%8~nSNAXeV!p~Q#H9C5 zkJ=LFV{<##l`U^R*V40m@<)&0z7DrQwJZ11u1>O?5VdQ;eo0=Q)8Bqh+TUziD{yAs z#MY0^O`*P7e;GFNBsENlG1o+y&&z$~p4^-%mdPNO;vcTL z==Ee&()|qLRD#);iuO+N-*`zATBS$L28Crp3zJnu|@`zU44)vDJ3{k;Qt#-1EDj? zKeyhx*ZtP+@U=4!I#f27O-v~jQ5M~zK55Ur2Ie4oFO3UXk?VG6B9P-Ub***ApS+C?F;}1Oxcx;R(v7gtQdN92`h-0hF>l5p$t8?Pz zGfjS^IaIA&9ug>ia$(ONq1?Mt-cpy`cusFWa9ry9s}1J6>VGZEdiB*oFlkY6dg57) zgyM;xkJ)KeR2{5q*jng5MPSZ4g+G^MDlFgsNz?kl`8a0RQ?C_`MnBFmzIb=2ATC3` zi$i)-5p!SwQ$Jhwc}C}gyI+E5ty~dbDv@om$cW){(GSCxaszq(i3vNetyGzGxtR0B zb6$D-Cz%u6f>-30cdYrp%C_OY`o52co3?cRJl6W?Oi_aNIw$28&6Q!x&c1b9`BwA+ z_b0E+w@Z6A#@!7}Kg+($CivHm&Bl%{LfscVPqea|bi9hcZx(q)>(egdJ>e;(d-)Xl zpGR=)R9%n~z^9|RxoT$e`x{DI_uiG*vE&cmgbT^vPVxw88AiI@RH)fa;xaKiSZhTuk4RkePU6viS;k7HK}RZe_VLQha)PL@<;tA1_g*n2mi0y z8rwIyY^Or{d_ff*qZx6Bo^MeI6WY6-TY35krPJce*PiDHo~6G-LGEbcCZjzMl6R}5 zFI}|d+&MivZLS^vS~kimU*BT#OzPF8rC-JGDtgUaeIn@fmtZxo>!oM>?sim1sr>3Q zOl?2D<n zxS-f@$*Vh;4`5G)wHy8P&ANcElO1vs-K)TxPLpj;YGh z#ful0NJf1qi|d^xx^kt#n)wvpX%6sZtbGd z--|CYtm5dAda(KBm)7d$orZFOQreT%AFbabJ=xM%?%)H4BW^wUZF|`i6I@hs8)ISx zB})s~n_Q01Uy|`ax!0goZB(AC6klo-;zgSPT?J~623bQ zWg2Yj<$sm=Kw*WzLEU;+9zT^OUrZ{!zl1b0B9uZzKj*Ky z+L#-9TUz4$m3s?Lmq#YmKa^}bsJc_>xrTFC#G=I>Ov~l2KDfR0!kHzMdW z#I^`L6<)^aDd1UaaVWRw`s(RYFE^L4Z7*FHb2xfeT!c@!LBeO58`3KqqIT`Kp1k|w z66+TkQtkgHF}=5m-X>ZTv-{jE=@rXuI+keWsd5-dw0~OnnEi&AS?d{|mbV9(&QHJn z=_hCWlO)#6M{92}>6>l1sTLQ1^|*5BitIyafquz>(~eb}2KLMsc)ITMhUi(7zgbRi zTl)6ay#AE!vqLVcGqKm)=Ur*@VlrRDY{A%V-4UPl+y%bzFaOCtF{0~8e0caL%U$If zVSlIJ{HPyP9HzeCq`-qGuugHo@+)~92WNJDkevP^SyZquS6J#w>nS74ij@aAm{{)X z?B_aI9h%HyS)u93!q~KD=FZ6qd5kJ24tjGcaR``1cHHsYU@c|TB(rCVLX*P5*6_}R z`a_(0W>T__Sy$)O$36OUX2s2m6YQ#P&A+tR<3_WLt%Dx?)arvW^nZ8!)6)Vko5Fv8=8AJbjtb^mi&m8y~ba~II^$O2BL#7xn z6yD~~BdoQO;rY5vqQ6+u{)E)V8O>b#etYg!&*iH*m=fJ*WLfFm?9)(PlyA3aL-2z0 zTD=9He-tLISyW)4Xsz;|=gRGebD1{I;P}H5=2*4U<@3ZZp%gz&|r7Qj5Ql_1jHHt?@$WzN|W%a(UzGU z5LU+aCi1i8y*UxT6P(my{shgH)jL_`>Qn9(`EhH(+nMvvF!o9=2=2F1+rQ3%w^-2a z#1zrX>onAI*8iL0^5b&{cgpe=XB(NsEf()P>2!20o58k?HS;8oh#x$=F6`M;v8M_B zuYVP5+_BHImejetwR^?Q$6hR~N@jm{7&D#zUm$zx-7K5^CsGoBR7f5zpZ+D6@z(8o zv8`55Iq$DqD(k>)b0?#BTFtdbs(G5MI~^Vd++(o0_T}yyzo%-|+JfO%q7$BOD>>K~ z{-^1X=+DoFe)I3t*8I`k?ss1GleIO^zrvGqoB!Aa?9*(vFNmvbUz@zJId;@#@6MHzP=9Zk_aO0%r+2pP#jAbhAHWG?V|%$t3pR$Low^jk=6nRu)dDrZfC^Qs5yBd7IyDe^;PGWWHp@dnX4Sp@hqi&wkzvXKg_p?p){o94} zqbq)&O_u%Wwxw>{?w#LV%u}=~WRGv#ccR~^NACTMKlAQCnH18)S!dnJ z@{c~M?R8aLwQ7mZ7w)9J^P=K+daK|59PfA|F1@Gq^sW*5?m*7bI?~nwoqz=GA8L5^rUW z72o;mQnlx2Z82A_ygK2MONOCMa(jQ!ryDgjK403@{uE8U()U4H{ePH6(z=T^JxPH_ z141+xdGxoR%uBzb&AuT(>qw=9`RXS(vlv&N+`Cz#y-tniue{4b3y!~gB~+dsI(Ob> zF0b{p-M0OLcWz5dXvsVZzFeBN&}=b-@Z7idk0&49zN%-I%6SSks(#u( z`ua)P{!_~=X6=pN55AelR5APf`RO*(4tbs|Unur?`VD4r{hh)2o%bCT-fe#9uE_R! zW;l1e^P8!fkEImsx9_ab6#gAQ>%g|}U!o&K-%2z;;{NTGly-WZ#2%@ls$R(}P5kl# z8uxxq7h3i(@qXLh(1ngAx8;2jbg!TO(6aydx}3k?Z++6ZcP+td%C>PS+$u3@JG&qwrgPo)C2?9Uo0fd}E!xSN@NUWl9d364@2A}*TLpF} zM#d_>UGq)S$|ZdM{a{VY3mG$K{_xnWyzzroOU=o&J6?qf^M7hZF3Bp=%2>*9(8&K+ z%@27`o7glHJ`Xos zeWd$SXe#5Tj4t+L+nO0P5}xiXK7FKag6rR?##29EX08%TH&2QAF4`4bkoArCj?|@7 zo27MbxEj`nKi2i$qZ&WQ1rW{LA|7aqq~w}!|3Tk|^aKG&;$O~0irOV+kL338HdK7aIOR_w1@tC&RT}syXp6Qs(VG>&ZTDq6D?hMz2H&tp29DZ^X82as! zVL6y|C~*O&;J-%R+HH-OH+}VHGH~x$lz*`MoZh+1=4%!$b~$AB);EC1QRHj9uC(9B z{0Zq1Cs}Sj___4wX7hWWgyzmUb#~A3FIVR+;@euc+QZT03rdmWCrxf|v`eSCe@$J5c*4j;^Z{P6nW|8dRi ziLcqZ{|n6CyUjF*`IFc(?-lQJvnu!wo}Mb<|M-1;|F5?5bt+a;+RXI@&H&Odu z%Y1*ZVzb6ZGp6FLrTaARn{3!}kG--+Phh#)U`+e<2OXu{=Q7Z1wIz2ga zl40v#oBs?m-}Eniz1EE5icg?aKimD!Eq*7qwx4E{Hx8TObgE;{l8zYvQ`1UM?O&v~ z^4^UcuK7Ddn)aRa5!fC5WZp@aZP(g4I!X^8ThPPp%q1~J{fFn>S+U=_7bQsbo3=zf z%eb4?Q(0X4Zr6FXZQ;^C)?Mefi(pTUUik9d^BwH#PgDlAA4v{c`@yaKe5Z;~yI^DS z^V>R{?8`Q8VmiF-!``{)5A8hPkawls`st(yeZID)54)Qs?SCD&uz9S{%YG{2ceDI2 zW{cg`>-WeC@4a}gy!vyX?XIiBPc}_doiy3!?@md-zNC_$TSU}cdXg8ODscQ!+#FG$ z^yFhf-p_9SH8D44YI$|9`PTfuCUGjW$doMc{#EzaTMJxJw|!e@qPZ{k$@bPm*Z)MCSAoR{Qo;j_HNzJ(EaS7G>=x_lDT>1 zMpu6YB;4(-l5h)WcXC;CwXfrDq;kc#1wxQl_mB7oIr0CBLdlIfMShKLt#f}Ex1`B^4(a;FZ9ERk*J8z&{gn}xav%Kie!W)n;Cja7``u|H+Y{-=J-P*oYuLW5S^BVbZ&i-C zy6xFou>|AZOU(lFx7OX~$v>9&?ZdPuip=TTb&J;g?DjbC@YpHH(WdCc|LL{{E{~_{ z&Dqx3sds-v;NR-QpLOb7H|*KwQhMYS)7Atx&o5h7CI>c!g?#2b*w6Ry#M0d<2TncN z@W3ygb?@SU!pQo>XOB|-BOF9lKdb(_U*X_}RgpsfCYW`W3Ux2#E6w{8&*$N_rtFQ! z(|ecuIDMvk40->eK;coz64{$v6a07jPu!Tku=US|NxyfB_N%X2^fEf^jD=fyR7JD# z%BEXRmEzM4Pi$E#`Apn0XWrYz=Qo%8o;kB+XHoOPurWCkB+ykd{t`5Zp75i(XAU15GuT4*WbMA3P!c} zANo}`&APse^DWO+p@^ur^NyXiI-l9}XH{7%nJ&bX_Sa*!kXq}7hail;wZnsHUoV%F6jhgsLGnB40f zeLNo;OUMKmDD&=%UaQJlVD}=H?_AP@Gh5D>7CZg;H2sCuakHu{%@w96EMq2iuhn0D zOs#2onIOmfdR9J#ybR`98#_`qOy<**mwW!su}r zGZ%#yHov{k8NcaY_4ZOb3+pcn?`CbA<^R`f6D!++U9uM+syx{xCwJ-W zh5Ne#7fz1b?*Ah}jb-x2_kX8vk>xVy%A4t3UvVibyq_&yUSHpU^^CoUb;zymy6+J- z$6v_Rn|(QCFY>PS{=OHy)o;W8FEJO%Pgrx|-`Dg04fz$!U2AVYJl?VQYT5(-FTdYU z{~`Ew_ZJ?XoTM-1QhUx6?9%(-|L454jErB@(zmA~bF8PB-i*SeWqJ2yB-B99$2J8tvri?{M7-Q@DWxJ#~b8uz)jd$G^d~pd&_)_^Ta@1WRj& zmvZI)H_cw4!y_(Xm{5rV5r2dKhoun9Wb;fpo zj^!`&INFU)l+3x%#<5B>;^B(_mtWNJ-74dIrlHoPe`x(>@fA%h#!VU@RYGHUzjMsX zYqG3wopH8h7gy<{M84G1>H5Fy%;`!zGfp*6s#@hLawb#Zg4oG>Yah+wo*%2j`KdT|&fh2XvrAtrJ@eUv zLuKb&rNj$SZh@R_j8UquGS<8e@S3G#mA0BsI{d%a-c)e~-X*;20_XOfx-Qomv9zl0 z`x;UGYS;WVTQj$E#c!K*H2YL;SCCFuoL{11w&A|-SF;xXnUqx1dC$mO_Et&s>9gy4 zXWwdXcDi$8saN~Y^bf6pnif87OZr#Tn$J3{lxWv;`>$K2QkD14^;tJ>UAg>_Tr#pYZJv+jd$=GreI~X#IvO{wH*9 zhd!Qh=>PgYx3{&kX1mDt{=WH$@yy#$fy5V|3Qhh#pY%?@;I-~M-n_L1%q&OvjMAt2 z-F{+!?MEM@!Q5rsdp0n%tL~U@Z=-#5zUuM_*GCKFS-aU~ekAlvy1h?pHy`Udw~aE5 zKC{o~mKtdH_&a$gmvc|Ce*2-@BQJOVuG=5#Ue)Yb;M+L=rir}1a+vo8r&8|a(h3e7 zKT|H!bIhdNxmAnq#>^>+%-fT;6>r6;%bDybhOGSIyCV zsl~K$^CP8(<}WWcd-SWCb#2X$SM@ltMoe7leeR{z@8oJe)IFMTCi3+b?I*`8HnPm~ zZIX##&+G^g*{Z$v-682SnvapV~ zcZ2^FGqRlw|JN(q!Bn=R;O~#m7)Q@~?I4$vfYL$QS_Vb$#PV3sK@n7N6#jQuh zCqMF5y&d&-@6t(e_pF6E_5NshBU)uA;wOpaseErH*n+j!no_4X9Jz8fN z_$%s86hqV$u0sLm(pYsjXWNMFkEn1IX;fy~#%1~WMXIL!X@%5XQEr#FY){>H`s0oU zo^AI1Og1|>=On)@y|ev6@;AoiI+J%UiH(|kRz@_hxP*aAe2r#+y~{k8sYg?}rf@i3 zeH^h{P4A1-MCrE^3_@!wI;Jgp)V=C`g7(7g^JH)3Oxfgrt+P7S@8q6RB|hI3&d0L( z<@aCfvzwi&lW};;o4t2 zSGBZ0o4N1MD{UU_h0(=-Equ-p77LuPXR1c&-)?Hfrjge){#1qsnEhUY89F3-)-eJv=qU z$&+X1(d(|gU;p3m-V`44w3OSnUJ){}mpX%Hw_+{RlUTMeo$=i9g zmvNM=ospObbah!$I>eRI>Lc4mmF1@GpLg}{D6Tzj&cj>Hu zxX^#M@nPrIM`iQ31}|xN=l!KQblT#e0M28tzc#EZ{Inp+biwO2GAkl@GpzL4)vhs# z`p@5^cleR&*Se|+cUnDKvMXP0v~CFuiMl%Hnfuz{HGU>94u2@C@sqlq`fvKH%Wrdk z-9E(->@+>$+4G$CprGjvU(UznX->WNVTrVMGSjW|jEkg=c$UsTK1V9<bGVU?qvK}HEBoMeXGF! z+$+2*%!96o?y7n9@_YNsqj#@rtv$ZIY1QjBPr4q5zfijVWnNM8`8~_^=I=t6fH={zTQw@eY7l(K!J_nCQi-jT}WY*uhYp3OnUcqqwew5ulCHb^FHb%{_U0VQqA~T?WL2LpDR83A*8idRUu1PZ1Zf>6EZn6qGiPb z{*IfKzil@!jGfAyTQfWC>)eG0O;4n~^9j<@G_-pp<9=t$%{4{6!WXA6JNH0)w(aty zI8PUmnxIJ)j7nX$M>lCVc$Po(HISaNYkpz#?nB%6yesJu+!<|?wNh_y{a<^;noH0^ zk=+-U9~WU^V3@^)aoT7=eo;wLVrB_}r6Oy?e2X8s3D_Q9|3XK63J24@Q>k-p6S($- z+?>HQQ8!$x-7#xn=Tgb5XE^kKetkLZNc*)LH+^;0)0X`%-G4ow&FaGMozvgPE)uQH zEPo)j`6=(0gk?!9m)t(=lDpJtMvAM}95WH4Yd`Ou$bGcH`rCsng9?7frqXAJUhFq4 zdCSMj*12VZ^j=dX=3i3ME*q@M&L4VU`lgg|VL*bxq-&BpHD#Jg6hgjaM`~Q2*z?g`LqzPT+Em3mCk3Xuo)Qb0{XM5iFy~w9p()l8S7i@` z2(K#$TAl6S`JAmRLuc*7E{0c1ri=J*IfPr}-EKH%d3JH!cZXebjDCyHoX_E=5Xw3G z#he=|EFOR6rOrCUws3=l_)32c5$^fv2bZ^(GA#b7TqCDDeR1W73g3+;x>iSJ!#s>m z2YVhka+1SU`LZG79sg;M{ihi2ntAtZll!|mEAD5LuW~Kp_m()Aw1p?_@z=WgFos0Lev^<%SKRa^O z)om#r8`U}2J04rG<@3Xv9!8y)^_P3zTweL>$^8xQ59d2`3BA%(y%^qih%-qmxoQ5g zC~5h;Eu}Jb_Du(`7FfLCz0cofwJX&Xz(qkL&7uwi^~s+`0LV(~7CaR;_#Z z7`inh=f8Cpd*(4W=wa^e&wuBa&0glUFZeQNlE|mw<9lApPHH&S#s%UH@R6eIxEtK^GV_Sj#j|Hys4car3j=knc zp2h#PbT;R`_Ok5RuXwE&U!1|;d#!fGquX!Aem>IXdm@!LdqI@`jj2iB-f!txHTT`_ zqd78brcb_V-G3nN)nzNMi*Kg5ZuBslu;tgGv>RUg`kq`j^6Ff(Xy+m0X~nnp9@wbk z{?xi8)o8DB@69{YuC)2gP%jc_=`>J!lHPWY+it0z*C%)PFZrA`Y595UciporUsrj} zPXBkC{Ngz`{?EL*zoU{nxcmORDPf*>3N(sddL^4Q-Og7Mt@Lx*73X<#kwIdR^@^kV z-A}|P>Ae-(&HR7$%WwG?b-xyyE?5_CWV_iR^zGxPOFnJT-kV(OS7%s!a<+8yqt08# zFSr(0+_-Aa&9#5W2B%|Amy({*Dn6&94?&uR5_k&+cpSnbR%Y!d0v<*xz$R?cMe7XFcn0m6Im~ZS8mt z^gCUi^R&KO>h*%}oq>oz0DDHf{Igpis;W%a) zlbITymYP^nOrVVE4f73tY$34svvyV2=`&#ok7^Ezn6e+8CM>$`>C_abZMT(x(?i>m@9FZbwg3?6xYvO zTWWN?cuUG}Jo62GEV{p{YHjy%U*`C~`4?VS$*t%uo0l2;ckT4EH!b5rW+(Ccmwt_S zZhc_=>!|D-;jf>muK&urCyYJfnd+6Q&^NPpRalrvb+LUa`g+%H%j&SBzpgs87cI@s z_%PM&`fl5h?CKdRl6KLrtnNEiRooEs?&w;o_g!jlan0?7-@S1M53ere@MXJ{%8=Mv z_<7liQ_>e$Z)I0p`zm+-!eNGYg5n#QLwVyrA6pXZ{59pyzQlFw8+Prfj{7(5r}aTm zk)^!5SI(PomW^3y|MaBYt?az*d*kG{$@VmqCmy>pC7sK|s9jR9NhPbUxqM?(#?|w? zdPCmK+s4Y~=2se*baIs`TgS=|%U?Ji(@Dz8+r&T9YsD0SB1V=VC6UjYJ2*UyCl-0? zGcGanl>GTGIyxeGO>8UEx{}G_w`)&V_C39moOW9@=TmxbYV4~=lAli{cFKPKpS5l6 zDfiO?@Ar9EFdvmVwd&;o@7RRNCRf*Ab$S22s%%63^y#t^RTY~0|8FjOvFYGz2_>Ct z5_WgOLhm*fZp}aQb%w+C=aqN4*WdqYHNo@Jq*IL2D>Mx>efC#Geoa{Gd-9a%vpx2Q zrMFL6rtrMeUeqRW65F<%4=c*Q9{#>4CXZix@Bg?Lt%Y~u^B$a@uAi=`n&tSSV= zc+*jlI;ZOgKh9wN5*L_w>YK0)`~R5}UC(Sx6FNALnN`W;fd70ImXH6e=XJVjRh+1C z6TZ(PC6lXW(kT|iS(Ys)x2>)4$fN|pO(#PXEs7GvT!X!so_rNv7j>pzW2bT7^>=3; zZ~Uncv@xaWN5AsChtW2ZyJz_9(C_d)Tx?T&@RG>f8QK2@i>Gq1g_yf(Iw$@oDI~Q~IiyM0d&68+;?Ec=;?^se# zO^3mry{{K5E?vf8cB)@_8A~KblJoan@{X3Onp1(*J+yOzURAO_)HI(cNuLF z2OZo}{8}Al-RC4}g>qZA2|wiNTB);v({f#~ko45s8~UD2;p(zc720a`b>01fzAuqV z!D<~zVYBBgKAn`a$~wnVN8W1k36t3GlY8$8-rV(dufN)~1=4I=|6YDyyJ=tXd+T>R z%d-rVC)OS}?Dsi%c5kb}+(Lg}|1a(C$wmtgZ4=E`w&YxNX20p>v=>|D{Mv8mIL%=% z$}iq!=X$&*?SlOB3<<%sAgL1n!e~az$J=t*?yVH;7Pwu-TeY0+&OzZ{&#u~=E|WR# zd*qmrMbx{yo&D(Ca<$RCd8Y8tplfDkw?uCnW zmG3x)oH1Mxn)#yQbjzJZ4T8_bN{^&^DeKsNFI@c4&vgGfL*F->-u!!ZO!j;KW#dnE zTh&Eo9$#|z?BaXt#S0`=jLuE*thn+&!#~sM>g|lazF!Y^7^QMG+|8^HbaQVM@w<4$ zti`ea&iD?PhKe-#SHTe{xUId=L< z$M=(rm?PSKCdR1%~s~(tN(Kj@Be6#)!V$eo)NWxez4nM*AXrT24yt{ z1}W6l!pP^d6DXvwN@eHY^7>}{Pc*%GOXHQy#w9oNZr`4&*s{Qzp>gxwRjU?p${pB# ztT{*c)GGVB^D{q6fA+Y2clFvuTxsX#e4leYpzZVK&rj86aEse#q`vrYbOq=03#H4q zWwT3X>^8pr^g`Sk88Hri$Ec*8AK%=xY4BRj)f=^!?b)1m_4au`n*Ev9_B1@Z^DXgZ z=gi|`4f4z7oj<$&n~^OiL?0N<7sc%=l$KmWpRVi;ChuRr*2ECzxkFeMY``C z8$y`g>DCAY|6F=`zxyV=?=zSWUtOH+zaZUz$LnI7vlGnL{w&Tr_}EQuha%rGMfL(^ z0e$YAhx?fG9`9rKzw`N{wTXbEhsu!^%^wyVVoJKrym3i#=#x_B71N(QIqh^(m{E5_ zY-gF?G>x+|f{SXhZx=q8c=*)w%TpICv$eGL$9^s=$Zxv%pGCg+;)xft=igJ*iQ+E* zDI7lI&CyF61r1LgJBae3cA>&lgfUt2L5eqY_} zCC|>$r;+zYbJ707mJcNvT=ohdteLZVtM-<~?O$=VbcejOibz&iMdPQO+*h5fCGU1$ zm&s@Qu6RqvKBm0)-h$%vp8D&F1~n4feS7yz|7|zBaLTc*N2GpiS1ms2Y|`zY_&}*y zF5OQ4_Wx&7Uq!FIB6;5;=h@->u6w8X_}__i^$RsKUGd6wN)eo4_2D`XyQIyl%R8+W zP7UaM^|+nwl6Iv{L}eaVqUxV7Os}qPW=jgH*}y9QIicrGQMi)N11GMDH?A`6R6oRP zW5y|Ta{bTw>OX%coxIu}&dXC%s&V-0&-OOH-p~A7<%65T{=KYUapL8vsac0V9F(jo zs4(Er{@~4Z+(pYW z*LI|)`iE4+@34vN6T9GJC?E7RcK`2>yAbk&xeA$tC*PD{ATwikfp1$F#4|@bY-8m!JFLC0Lt*`b`qi1{%t`$xC zVKK?we*Z>Wdx>K9V72XSx(ep^52tC~bjZ)yJ^AV*!N<2-zTZ$@#h}$C!nV&lc2!9G zQy2Ej(Sx{UUzt#5wZ-w#j6cy00$iGR zb1!wP%dBv*&|l|d@W{O>+#uFTbzy*NQ)YQ5v+Jgam7xoDgkN?QiD-)b3D|tXXz44{ z+ZjvcetB@)DtpX+@j27{0r$?DU#{8@ZN>X8r^FdPUN0S*^a1;_AMiSqVv&rZgZzjDlk7}{G0E{jsB0Pln)HXyDh?BZdwpq9J7#VVxGn(X^zI_ovRON`yP6{ z_1eL@iDoiJv03Yw*4*y;dtHs;OYkA@JFN#;uj_s~Ve(DzDoX@mQI2t#^&iR{dC| z?$;{Y?s`t-j`6Y!Wc%&tM5C~myV6WYWMRCg8 zyq~HrYqVUf$MW0f75{~c>O7lSwpGuNTRAVepKm!Iv$WwV?u~n6POdxi?e1j-OEufS z$9Wb9Z8SP%cy4AFuT_f3rnmF1%jMagwl%)-KmV`sH<_37Q{ULmJR0gO^R}VaPbO;G zGk)#k6D4&@W<))U;1VuvNCksjMcW%u`S>C!DTxShW)IR8+oSS9e{ z{|JN9|3waw*NiU7XBlXjil$p#dac#C_d#gH`JK{y%(W3l(@$s4kJ#N>mRIIv{GQu5 z{7TG}6#X`ahfDJ-Wn?||`0i+&IQCcg*|f?35=zp)1gK2?uA*^rZOsIw>ZeOgbH4je z`jnZy`?8ta&cDkF-K|a16z>TAJs5E1o%GpxU2&XCW}SWVIA(k5z5ZMGH?MZvU!6YV z?dv<6gbZhHUb1n!=9A|e-5W#vqnplLFM4w_JTLW~UZSFLWX@yhb*0*2^ECG*InGf{ z;d;pOZBx+xRk7Emx?edLf7r4lC6H$dD}VSI_Se^&OPBuD`MEvo#;b)q^#=;v*57_< z-?M9OwD3OXi*dyb@$Z&wWm8_NVHxil%DeM9xA^6NjhpzECxzaV4ZdgN?;E}K%KSxY zvy>Y2cfWM+ikd89e%wdRsJ9~QQDL^pi?6eeb+jz|-sl&t|89$@_N%$-N4;aBWi8!* zwC?$k66BiiveT$v;f?8D+XU&Z|GTfXRh@I#VITWR_BBIOi}lO<_f2nW^~ind`}cs6 zS+;Yp=%sILHBu*BOG-Yin(cU>=kLnv`waJ|Pd{_;L&lluyA8ed&n*nQH(N_~(H>DP zV^^Ki|6CtCt&e{dZo2nhRKMoDEBEHTIDV>FWTm(3s=&+lWmG~{7A$eyCmMg~!tHOn zeBU0B`2Mr5Fy~`@kbdfJ&)J)9`%b@>wN%LT&%BaYee3w&HCcJn=ClPYP1rcaSf1Yl?ygB&lO;0E1_S|Dej$sAccgg$jJZD8++AO$>%DWPFxp%O)sc!-`3dwzwhfAm1%9sIsIb$t-Thv9{XEYbtzlgBFVi6{%`!m zT;UQIyX`>OSNZl`2mi{RJ2y}3`q{Vnjb&!lT&K?)E|itbFKe4^8`$JE_mj|LE}sjW zFKe$%XJiXKHO+g?hnEwk^(!BJ$YHorQn37Jmf7-n34tKJ=4;Pk6Fn zLMWf}6y}E$H%^(}kR!72MAjRlFU#)s?z*j*vGsrL>f35(o-91;RXk(%Zn^l{(66E` z?eToqqjv{QvTOPv(|uA>#!07GZ|B`Z9(p@nBt(}cguPUdS@AXO^V3sK#TS|u`#sk_ z6UGtxs5h)WF{{~tBV9W$VeQqR%}g(huXiMb|1Zt z&AwgyFXx>*etGMbFE;bJXt?NLtxd=Y&XoZsyLfaTANo=DKC`9O8XgP$51w}QPd zwirCKT-e_lWYuJxx`uoI8|UXMZoic&`~RXudB@yuw;csq;?A&coxzpHBNf#bAYCwP zp=@fOd)rQH&aDMO=2x|X)mT)YFZGd?-W*+4DyH%*Xu*7mo_UgQd8@y?^gi&jM|YLE z%1Q61DviPCmF4bbZi`!7#+VYZ^2~(S`QKSG<}Cg@xl>4b@2arbJaQMJmBqjIumA1i z8M^XW;pu3$BQsAg{k*l@;B0f}Eg6>rgMdd3hqM}l)P+7s246C~c~A3-&9XW2LCjLZ zB5wqR&84q&CLC2t_O!`~+g8OmAuMO5YDk)a#wU(_2766xcjW9!x0bs$Ei9n-RePn$ z+p=D{lc8QhowHRkmmPAsnxLxvqC~uBT12$byr}sbybJ9MrvzW^Yv0PhV4a_Ecl$k; z8+td-%1U`AwQSn5&@KO7M|*GkiJMw$-15JRUc3{lbuwZ>PL-Ulg>CD*bzVmgPU-H? za5!3buQFr*)2QQD&OEDT<3IAr`o{J`>u-7m{~r9Uj@`?Xb#Fy)uhx;f|CRIRZpe1$ zk4v0&3%R@1FSvN!eZPmT$Lh4!zj~`_-Q2%w>r;_S|M*j{BeVJ z*ZH;UUH02>-Fac}{@07xt#wTQczOL}-TVFhDe}L$@0?ohpSt};{QtOrtf*b;X{KB* zUlEE&{U8HD)@QUH zz8B;v`f^eNUrM3nb8gOQHR+~&PNgC#Ys^lwJ}PZ4|5!OufB*B3GynFqY*JYzyzQ1u zwcT0y<&jpe_x3D#rV&}VZgYrxf}QW?6fq_{qX6!e5kUov*;BeaCS3i#r%!U->g-6b zvMbGxgIbu~4kz9&DEzTXxq>;hPjL2;H9D0(n`V4{nL2F|vt|$T{>NKg|NlL`ujJo^ z)V~srulCzkDnDPwx9pkVlHE&U+g>E!c$XVtc3XF8z0&dbsD+Lfi={HSj7 zxk)v1&(+T}b$)UA=Y)N!j5gh7a{fok&n@1TCT{y7{YvYnCei2HInPB`Ed8@HEXyK} zv0h^1hs3YCKUe>=uU&nv?Y`rO_e(3<=jLX7U`I_v^~QSZ4hk?Z1lnR;o#zu8P?Vom z9Gseynp~2Zp9dS8`RA|U55j2sx!*=t7vJ&_`Y&yFRA=2TQA3N48yn3zR~|C^R+Qb$ z{oz;8$`G#wf*OKSUdl5AO6C9Udajt+@lUIQ!+xXY;$Zo2!@nT(tAn z5pJnXX>nosuSL*Um_O%J>gr*!{SX{H*AWgvHW}CIz{N*o{G0FUvzJ7XgM=yg3Fb! zl`=mst1LUx-zmIH|7f1~vtRev+9zFDD%hDgeTJL2-wgG-7{0v3+Y{XU9P%b*J~)43 zs{LZcdgB8oO9^eh6Rga;{N8N-pu5nnrvHR(uf-p=T!jT@fg;i^ zu1AWJQmmD7T2H?^@Vc#`Xwy{orIXT`b{*koy~!HgXu_?)@oDW}1%+TQA-}yU84Rp5 zyx;wre7}9W@Fm$Ah4Q->S6I)eso*X?nDSxjy%4&K-J#w# z3R_ba*iS#!CtslXiG70_`!S~JI&-SI!sZ74m%CAPf@jaOOf~KZ3vs4HcYK=jJKs;7 zaFlmbU(JV!GjgSc!_uGSH1MD2lX`NZ&C~CPDZ||UPfY0O*D zZ5zVm(&4Twbxh^nnuaf3h3^i3*V( zo7X2T*~PxUgG288W05DW?oL(T{hn-QsVHA$(ffAm0@as1N1F;ao$)xm@UjZq@0&*- zYNvZOKYC!nHd*vop3)e~zkbGKa$5g|EMz-x<^( z&lJ@1;HSpMEsGRN4?p1EzbJ0bM}<)FYAc)4=7;|}?AE7)|TcKvwI8)>!fK<12DJLM-F=6Jx7 zxlo0nu|-2{LB!241M^RYY=>?%7Arjt)G|)4vFVNwn8Ve|AK@`Ex&G}f{l-m;R38){ zWSZX1dtm0R#HG+x16-lt1=1-V|l;GOVo9$VS-h9@D35Im?|q=(sh?v5zDE;>`C8>spT$ay-&Bm)+8G zf|t*{-aCz(?Z)Y&6O2>8e_0SUk%hbEioy|lxgc$a$XADAbjuRAO>ZeOpJ6ZTD1Ru- z&tkcZxF_#|&4ovF#n_}DsR=rD&bDa$)3@W0NNiU33DTBa@2GNbEvH18Wt2ss~? zxPE`vjPsYL)r(!s3(|FpScZZO6*_KP{MMJDht~!>aFdVBxhd;eXU+o;9#d z+)%ew>D*yvj+OR`>()j&uH4F&d3CjD<*n@H&CX2qOZTzuXO@aGy6|d$$tC$*o|#@O z52ae0#QPL<_-80E-e>7MAQ`?x)*^gs(!9u52Ud#s>+Rk6D=8^dG3TpHr=mn%sA3<- z5x@2+avLVRPjml!P*r2cd4K)eVSjmVHgD*BX2P;_8{eV(XAZtOvFYuhlFE#&{bv(v zb41f#D}OBYx^L0x_a)=qlant$KA3bYokw9F>yfJ3ApLW0mmkmX{CfLh=MSD+8&!n3 zK8J4GP%r*9ImWN~{pEFk>)-yHP*&>nbHe+s1wLV^w`#vuEwA$4T3r#e?(Vn5omIKJ zV^`gOoc==mRAb0N|BEy3{t}#e(>^x!xc!@n?Qi9acFG4P{D1dndG?0P=~)--l&YVk z{NJJ2w}qF#uXD?9pl%D+0!HYqn4KCPM!U=fIY-KchmP@U->TEC9HWoId-eyuE(j z;OfVR^`AHn2%Ruk`uFd$D-7Q+>sDU;f4ua4`^0zpfq#Tc{%$tirL6a_I%MS~2|veR z&mX2KuP>|+JfyJK z^hML%QK$M;GuIQ%?980}rnpUQo~COj$!e#*UcAYC`KEm3+v?hbMouU zv+qo)DgWZ|>F`C#e@9;RM`Zc_4sMnaHJ$K^d)a-Kb8T({{2N7<@o!~0Cbh;>`$6pP z*ar4hZ~H=8|4d2U@VaB|Q6BBNG2*6cKJ+widp)7`@a1QcuY`r>W-u?y5;(WONllUU z>+v2PVU6gy9J3#udhh1vQ`*xpw>Zjkd-jA|E398$J+f_{{c$0=^^#%%GWs89F zB6}(Slst`!*JH8RO3G11t6F?-#k97)T_1S}SR&S7>=FOdId0LZI}fL`f8KKD{{5{- z8MfWxDOvl*^I)vozOLC`8c~<#EM8cZC3PV3!6TiGXE+(AFSx*16K}ofvD-DBF0&h% zY%z_Q8~a4&&3ies=#vE}Q|wQhbBYW-9uoec!4dh7+GOs9<-A%vr%~NU_T71f4&e{~ zvsiT&=6m}jy=3Q3E?=#=qrcLq@72|+y3I2*-tH`6d)ZeoYmHRMM6N#D$&ozQe>#gR zrOPe*ZaMYjtcAZ{9Jv1|=wx*E{ja;s4>QjDEzxLqkvGzNbJ+EJE0q?Bl>Ys@XpNAW zcK^wT?cWO)?QYc$dbsN4y!W23XWte2f0$WOwx0cY=eBhr8OH2|kKQ>vmT6R)wMQv9 zK34ZpSxA0+xxgy(57P{6>aW=??>aNR<#>y?eB2{bAuH`=hc>GmI<3oSY-Cxt#8R>1 z=$zozQ%=YQ=zc(eWTyNXM)bNk=7EiRsuQ?%E3qhr+9 z{ag2K?faa#Mcsz^z%9;e=i0h2^5SEKaKO>Z&KM<0gBX#Itdn{UswNmr z@?!qju%5|&Th{z+uc%-qo$20_3WIJxFHHIQmF?u&_0#?BT)*Gh$gsB|c$I+M{3RAj zm!8yauW5had3*Yys??V?!E2@^?J}z6TOf60{bXCun7GtOifTo+HQR+Ynx4O{vN--x z@KU|0x4mV#W*z&z=Z$2+vkk0%wWd2~&hCn^Wd5^kv&G)NC!dPUuSz@Yy(V+-jFZ}~ z6|XeTKNo%PnRxz7!JTt|H+lN+u+{20;o_)d^J&ljO`3Bq@Y_yXn9V3Mb)nImb^A|l zIJKg_{@}ExfQ55zYOZ(M+F0cM`lga9U&qO`pe0gO?UoD6`NK9Sykb{Zi_n-cwGx6e)nJ4<+?a%*z+fw3T^o}X4_cxz8<`OF=aBS!Db$^%pZ7JQk zVe88uIVO8{S-tHmh_5+YdNW%@Z%T0aEwxfVTlP(>*Z3w)J%71M<7MHJ_^J2Yg0*ScdTgUolARRqkMzvYu5>+4r)tatZr`mjcm zN$8AhvqqA{wqHM1?wUGz>caE9k7b>^YX4tsIossAR8sojl;ee|=UVzR9d=Im)UhXg zFUzgc8-gEM*c~6<`dRk*$HedoqYYCRK2m?OIWOgt?>tW^ml7 z%b3NYm0%d^;+}dii@(J1%;OBkx#xaAe)lr;y-j)5midO^7xr?@vD7~!%VYn2qgx(N zz8$~2>ns15z*+aVt=$!{?PMPSO$mUF}zcuShqVa@A9sB1yg=T;2jDNQKQ}WE`he9f=7hifMTP>pTcJepw z)9tsyzT7irwXfY9(G%3!c--kwi*Ik1llI+6oeReC#}8DdiZFD@v%FN8P@$3=Ldbv;auOE1Yew|kn$herp=4QUJw|%MRv27k7uV(Uaab|d|(W$t6 z#cr=)<1eMZe>P^;-`alKds~vyq<`1Uom5X=`@Y;ftuA=ly&0C%mtK;#%(9t0Cy!&B zvw`73zvUZWGtcxa{ryVg{paXE;>DYc=3QRpu(?`WE`QbYg%!u2J@`5&HLScWn)MzKc=SYV)QHQ@Jxuo)I42 zQ|3QSyJ~cEp6ad5s?~hEVt*&zyz};3Tik^9mhy&M6}z6Xn;g8e*i)Hn`;LqkSABOs zc~u<0hrgn(b>Gv&Mw2hU*Z1CQrTb^g-`@+j*#DO=ZkTkhm|Ff1%UilkfLVR53YsKmLEg$_d_^@5|2= z>0foeJK!qFIb`!D@JwJ`YFb3IGnIgvbaGq?VKc}wSe=$obK z?~LDvdc965tz=BqG~;kFT)m$4=-izL8@Rgv{oGvrnSa|e-dP{o-FJOn5%V-b)neYZ z6|UcY|J6S}(a`hXo#)z8Uu^iLw;x)Oq}^AsR1YlkjWTw#oPWqFjou$F6NU%Pe+1yJ*|} zLk*2p5~)jLZTkM7ocCjWWlGwPzbRgKW=&PyvFT3G|44VUDO1_}cYfB-zns6YJv3iz zu>^zYA5B+|!Y{T}ORrSjat+cBzPFzNbztO6|GJ=K3=9mhj95q4@=Nnl;G=7x(GU9*0WMN=nU;q=o{d>6%8Hl)jw{txZY4EYW;DXxPg@)U2a9CO1;D}wd<;CaOv$b!1 zoFnk=r`!2+*ZwsVk23)@B3YApT|i$8jG2fH_lShVs8rzXt9~6Qzte>;b7j}L%d0*0v1jI4bx6p z&5bQEQ+@K_oT`$)9cr*#TBtnfloA8OrVSX2xj_d2hWH1$5*R0XW1C%kd)u`6OXC}} zeWh1Uiw)eCZ0);A*}G`XO5IFV%bhc0`rD@|%*^h(GATsp{FmeJEg9q)IQQi&ziquY zbM_>b0){!?Eh|>IeXF~9+otOKHdg+tQa>H8Pd47<&UWq62A=m5zpR~_78(KOhtLj zF?Wq~UYk4dYLuS{f3@R--z|m%?~kFWE(fvNvxL<9D zLfg>;_ijtiIBUz$^0U_1XY!rEO{Fi3vdtKouBgsu+uVKeYfnkr{FBQ;2LPV4`_ER| zm=fT%KZx&SM7|F*!{IqHcbRtG^kyiyI=@7Jf$Q^}0?Qe-$1cw2Pdogt#Os{9@Fm5^ z=TgjG#Ko7XrPSC;_AmQeYqZot?MR$e)=43UwYdlGH&yLQ+*NaGe&Z}Xo-;8Ms{d-U zt~$5!qiEaG$(9AahLdJ)+nOZYvP+PyUisLhh;7$Z?#nP&9N9eiNXs=r%h?AGfBvgx zd1=99%W|!Ki_&(>h3$VeAuRfGRP`-K@9ashGuhQcU2S6c zmuD7*-tL$j>12YjtAe{wfg;$HX7k4*h%P^!QW#s!)YxZ!2PE z9Gd>x@p|0)TJZf(XVU%thAc(b$#CPSf=`W6UFLN-*B#%5{X_QoZ!-* zRL*>1?)`^{=N)sGo>F*0Z%^IL%d-ydHxE^2cvO7cIw(KH_V(qow|kivovM2FzRh&| z^*_uW87HRxmj7ZZyQA5EZ`t0D%c3M3Qa;?U|4Sf;+4yRT@q=(2(b!i&%F1+kWlJty_#WmRXtX zKb}6B^0)TR3af2zJ*(LNjhH(FMHU)sH1{1})ucS-f_S?8j$H?eD)01c_@pj4?@+++&wG|E(BFAb<5J-r z)tmk|_N#aaW^}m9b4(g>KiN?HuA|CuiQS%CA*_Jq4i(R#Duo& zhPNx~rFg0r`)`+LzkKj!>VC(pD@?PQ&YZQ`DY}I*{^}>0+b;h7LE3NL+}gz+%l{!! zVPl#Zw+z#I|3*%U15;*A3EWb>K3cnqQL)c+u9dSz=82x(&Hf*@o;aa@>Y8Kcf)M2& z3$Nx19n@%ls@QvAV&5Bm4=>&Trjmma+=`D5oH%Btv*MANqC#{dM9a_WGQ9@F5I=k>u~=hD^V?PE7M<6 zFSSGFZ4!TcTBJkvf6)EH7i^EBuitjm6uCP)CDg3CJo%l089&PxrIZs{fydY%az)-> znEg9j?6vX7FRr>PKhL<({coAr$@D|KYa8S@CoYmIxu&wtcVA#hZ^JKbu0VsL_RV)4 zI@Smk`p&9e(PDZ1x0J;uGaHO2!(Gu3GC#9>WUNDL5jgxm;e0Xx0 z)ATm}LWw1H3{$h$$tB${>zSI!csjr4=9jIU8|EnWow&F~GUI@Z!z!lrPs>}@$gOTY z6Mpl>I_ZaRG7AJ6H)a@gTC534&T3NT2-cRkDOKzvHF2u5qiEu@l+@eYJ(prNsuC>X ztWG>S@NnB5{!N!GwYy{HZODJ{`vlV|MYkgh0$$!Jh>1UbnN`F%!1Pk`9{IL{y7qwm zuf3&a3+Nv&JoBQQ-y+u9)^5VS?}2kXYA@_(4Y@Zj_I%pnhq`~P=Y3gzIqi^e(%jF5 zi;aDG1m1)&%W-;Kv*?#fWKBC~Hlv+UU%f|a--dtt_9XqE?YMq@Uf!&=59G}jS>IjC zy?`OD(<~>&_t4uTbLBfX>D-tTdBWl8X3igc3t4Pe6o|WROp>+Vb~NinfpkWgOpEuc z_CqOm^^fsxIWueL#?v<3=ZpeeUy080u3(&dr7*TyPfKm_!MjHP9{$}e_W8sjv*&6q zrG=0Dto9!4uy3}Ny5Fb9q3XKHbZd(Hl+a0i+8Z}-e&_eVx}hz1o8`_0o(kt$rMJ&o zQ|UbK-kEK_9W1qB2WNcX&My#NJ>&3`CiV$T30z$b#~8n~%Nms1u95Q7VE=yj;@bzS zJ}=Z)iZh%)cW#legL6d6k-Z16$QK0#{(Ls)i0sX*r5>_^twz$@^YS*$`O`63ghxVZ z!X5#I>H@*aQ(J<5o!!`BsxB-r%~jIkL)qdx(V=~BjF=wt9KQOD?O==Eg}s}6Kl_z4 z@Kv)MZmM1VwZH9^`>N?rwq}+a?b>7W+GoODgO~khtQT^-|6eAdDbE#uG_beztZk~n zTem%rynEE-*sh&8^TFWUikMgBS9}cT-k<)*-}&tHRuSc9`I+~=z5cfH*v!C_FE!8h zZJ8|W`{-c=>pJa%z~>V`$h`XZukPNLEn@#N@0+e#`N2RqQtE*X^Mhcv9W@Ub<+fa6 zV0%&P=(4SB0%N?$RGE}JZ#z_X72E11f7fW;sBG4wb8_a}2TYlJuZsM?cuU>)t!cHF zVZ+HX_S`?=hhucNe2W${E4ssOciT=Z+f=e<#|+k7_G_2i{))X|JsEKOMqPSEZRxf7 zZ;qS_aobaD`QyRi|IVRC(!H#|-!Z?gm}j@2|Eu&$@2csBUVW=8K3p>KF5Y)8%|Mo? zntA{07nLG>MN=pB`~LgbC$mS<^iZ*hk4wSZscUEKSh`34oWzIiKV8lx9DBC@gj7z# zon=h-!?iCt#fk0SBJFv4`pknKE?o)h3a+XgjcLvHc-5xP`X*+NtkkYDuEm{Q`wgPc zyfLo*x1sU>F}_koJCQ9lN_ut{d9qWQ_`Yx)RH~iuca>;mtZBCsd#mP@_nCWCIQimc zv8+zIVgF~cNvmey*$pKe&HLCgnNsVtkA$ZQEfzhUwBpeE(}Ca1<@Bd<3NQaVbN=H8 zcjnCfYH2g&lJ(5T4m<(b`(p1mDjTxTw|F+aM3!sq&*K*iEo~Yi{&8IS6DaJ%X~X(z zJ@4+fJUEVYKbu%nr?`MXo+8qwHfYyiYjv{Q|@BQ)%DSH2U;)-54{Hc+Hd< zY*W@ceO{V!I@xfCw*2*zhY$V>C@yKp4tgWMYU2X0pfhQI>(5zDu6w?%*jD=EzMUp4 zf2SC1bzf!jdSO|B)>)}9(l1Y`?=bXKxq4*9VuuR{a~4=VTQPC6t*`O})peY=cQfA+ z-ZJaGZfED(JJUOS{kSwdO8Gwj{AN6@WzVd#o$_ZUPiHq=zjML=*-5RF`9cyaSZxYh z_s3saDEFny^wiVC`zN{o<*613?%ZVS@!~`J4d%k--bM#k+;EtZ$~nVb>(%cF%WY>h z(#|G}IWsPt;5)JWLyE+d>;C65=IwKEGM0K;ylLjz=_k@oIalt>vh}$*ss8B}e<`~- zgUyTnS}%Nh->CYaM);wXm#+9-{g^4aysK2JrF!PWA0O)vEfeRO&7v#cJyT`(Hy&oq zx1W3>JT`8bb;s(Z^x_+S7kRQvPHFBd`f_$}qxB6V$?$un3q>}6TwuL>-j~NpW-Sxy zuf0EN*RO9q-~I5q4M{Og-al1}E#g(P+@rj;m9zFN=HIsS#QeJT_4jt}o6{HsOPh`Bp#aipAb>wpRdH>cJ zgZyPBVJG5KG&Ub=uzmWvrZC>W;F_n;lJe~zG}8e6B3T4-~R7Ctl=py zvL$Jb_8Vv6BOO=oU7fekNAJ>|wr=rHQcH>zI75}DsZI4%Y!$T5n6%KyPePh=_Yy{# zn*rY+8k+W(9XWDiehvSHmlsve%e|HQxie7gUB}Lg7xvnv%)B$}IN#=p|L?w1n|H->g#X)h>U1BeM4!< zscVkr|B6aKfa%s zC4JBMN8jMje=J?Uc`eIIT^{lC^*TSc6bf%Y?RRCzKfB_(32G~rp3C5<5mVB+F}de3 zm;Ju#?aM#j-KUh)`{&4+g*}TL{I~k^m&bEdpZ`+1DPY3P&)@kC?@F5O)=Ao0TXOT_ zjQo_{2TzO7aeptTd-zz{%pV)f&cp@OO*whwwDAJ&J%iS5tE&l1!uq^Fch_@BcJ7{e+<%%&yVtS<*=qKk zldhUJajkZVZGRqlY}r4Lxr){wHqBftnzsC^k;1x)V+w2+zRuZYa%tncivAg~4T@$- zJB~hDm!ZAr@^2Z&i`9}Q9=wIzr_#=qPv|aZ&Uxlz(8+x0jjMTC!^(&Sk{OTeruI5Z z*59t^x6g}-$UDeprw)}YV?@x|1A00f<5Rb0L< z8Ss6dYqdvIsZ9E)-n=XpJ?`jYS($zNvY%Ql`}FVc49BjEmMym*F!OaCk<^k{BG_m6 z7G_f6non-zNI2 z1lx+tOJ6bRYEnqbzC_#luJr5kFF&8*y!yzr>(l3D_swG7yKB?M{G)rj9^BN6DRO`Q zW`b#XoOlki;E!G3k6kjK;S;Owv}S{`*tz$aXL6s}RT*4s{2gfC>pG|Q+ZMIXcY0ZW zbRJBaUCQ>Zd=j<)YWYonQB#%hwuYYd zIU&|NzDtB?nlZj>c;>j~wD#Uw_X-)⋘)nwH{h??6!N!9IrVOPAOKeIqoKD*W2g2 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

y!hz8M$kO-Z;xVjP+Z^|FB7%Et6yay9@6g)a~5m zpJ=tW|DJ2V-|j_sW0&-p{IV{!dLp-PqF=2-*qnPct%jerc(R`P&xATLIyXC2FN2wZ z;SxK>y-k^^@kOb{C6xuKu+5~P1qmRGz9?a`Z}B5HfwuF{!nd5Bepe*H?pj=aj3tL+ z;#9_!UlI>xdUpuUayb*Q_+a0s*OxB^Op;I!eaK{U_jB2PTibGjAE^aesmCP$y|{a@ zN#?I4&w)hE)R1Wj8<|sC);zZCR~4U;^eI^Lh2rE7NB?k5zW74$P*03sRnvb*p_{u8 zA2C?WI)}x+;|IqNW6>6egTX%qxj*r!+B*vw3#9mSYrc4=!x_M7c>DhK*1j75%bT3i zx2ZF!giUmj;eL?$H+^H@1|4Oka|f;87tJ~_Nv%bc#s7H3?j%>YZyU5w@1sJ1e3kRNuR3 zUVN;%T%%{6%b5?SD!Q1oPn*YoXfZ6F=C@<*uI+ORa#%Dxiqapm;^ zkvm;1)`yQQvMR5x=FT?XQr8;plJPwP@PES**Ty7ky{Q}g(mwZ4xJDX*Q&{XfO~<@xE{ zz1p>>x0$YcqxZ$|2ES?fvs)55Pftf$hyTf3a_nWxFN^1<^;@^e+T}jmT=dm&c9(nX zzqM!UH*eXwa@RehD?b)L+PC`a`d^$q+xhANWEIuY0<> z_D05Uo2~m-?>cv<==Om%wdEJ@ykt33c4^uBibUy|<`Z3?)O1DpUMUHet7Grm-KLgf z{xI+US8my_{}@qo?#U?`5+>pd3_Fq-7-Ufw6?x{BrRJ677gZ9qu;HmqcJXbCN%Pmn zH%?qFl({CwRV!rF`17WLE!_2R0FWs?A@o znK4~&*0U}D{3Mcpb;Fga(o0!czDDtZhM#T~|MwJkd@5jdE_|B5*}UHmB(s_R$5c%b zx*yBd-{xMg>i=$<4o`ca;h; z?v#!=%f)c$mz?fxweM4MYIoha#oNG8d(yqO&T{9>$?tv$|GY8RZ};P$%i|a7&k@^l zY5f%EP1mGvGacBVcD~@ji94zcJEVN7ryDG)Uf2KSr}~k)73YsP-|XR055A;&{qD<{ z_jh}C1sByC@11vsZT-m}CBGfjH>16$F=V|x^lzq#fzIvc-v3yZzhq9@<{5S@oNM{6 z1=qqIPAhOL%t&%i+kK8XTH#A?`G@c%-Ok5syq{h~Iw&{puAX6FWp|Ek!uv<1&2us? zoGjRPW5e^!47->+7H(zv;C#DuFPmlgUxwZBrJkFYW}Xd?+P%{B#Mw37-K!3q+ZA^} z)B0E8;_r99-YPxBznORI+v@9ogCeWmN!|V}Qqlg)rR2v<^N26!_;@lLxxAuD|vc+wgAN>1D;&3Jlj`LaLJ{4b;;ZvV}&T=rX|{_Q%( zoDIKY%~uLDNH6Qzu{}q7!;1B0yf){*Uh&_2Afo1>@PXxNOOr0C&a|jKU*X^&F1N1Z z%B%NU>{qk4zTYV=zm%bXEw+96-vd^A+rD`{P1wv}@g^cJULw27u~~Afh34)ipv)_pZOWK_Hd3v?ViZ*f~gbQ zd2(kgx}3>$E@z%~+ZvO|^Q8^84VNnKpIzj*L4HB$gg2+ET>|XFKOUa)D|pwMdyg3I z8Q)ni5z&0)?^jlxr`sH7@h-Z0@}bfkx#!WxQcj!sd|#hlyzRc?o9x>avpyz2Q22c% zzF@foF`q1_(`?(?8#tb_v)yJ7e*Kt#eZJX&IU(f^IgN6h zFFE^9E^Jm&Hb_R-nGf-H5Ft{*4+->ARFz?6FE*w@#+7~b2e^<5mT~1rm z>)B;ze*C`>s~4`3dvn`5Uj9afDFv6#Up-jFx%@$RzV+On%U>V7n_|IodC~bc`6G7^ z@xEaAE8{Y0X+EPZgJ?4&i%4Mg;;sIE2}kcwdsBac`&EkKl=%#2tQ)#jJbWANW0M;D{d3{RonG{TsyE~>C>N#ALV;_vlg2E-_^d`S+GC3 zQLyzYR~Xw2jY~He&CY(v=DWw<&SPt$Xrr(@eY@3_ zb5buG-;7R}Jzw#+!+PckJFD+@Ke^93V`WCZ%d#CsF-0c2e z3CXd|n$IM|0-i=K-n-aT>8ZeLZngcYzLOT4-TKND<$UqW^fvqXbA(;bzb| zfGd9H;@=KkJQtXy^4rTpi`)EDFB=&txXwOb$-hLh1D(e&N>*tuRV&|%cd2QN-uE3#ud`ju$j+>%xbow%s-)5f`%>2F<^1+v^UfpgZoJByC8b{R-fJvE zrk-5vvNE?LRH=Si5krIM%UMvW>b3A_$cRn~SVf#?(GS7UK(n9Nu zO$*QUZJm+wU%UKu@H&^9|CD#y+<0dz;k=ML=FYq+bDr%rOI`QHH^_xULNiIccHR4Z z@_&_{ZCD_1>7|Qsf{VuSH@Cm?_ReCNfUz#tJ)En?C&SAN6t>NF@pJ!|ABo}Wqd2yEg z@0sTR^?S|tp0wC$Y!uI z9o)he?vmtHYIUb6PrZP>ca^LBWjk4?Zx}H6E#nz0vANHcWNaoXwog|92dEkujrLBfz<4hTz2WE?P=!i#l9(wy~&r zuDj{|aOaz?r*~<*@v(?HpTude7J8tyQ8d5daD;@Eo!zWDTRvsAZBGAhT+jM?W^U87 zX?sFnnp8zG{MKo_BHi=6IrE0iZT$^9LT=7BI3Z}M^P9n2HIdD+kM&7!?$vI2^*Ox$ z&f*W288>8CP5Z1mf94KL?rSc2{x07xl<#Hz8gu@5jG5d9Uta#?2Q&6Kf0BGvzh7#P za&&rX#j``EnTdz@1*nMoR=w?MzbJX>>?y}7zfZ<9pDLXE@@LP!I~)%lM!eW+BF>QPOTg7qr9F-T!dtxhFy6>BxF5DTpj3KXlQbv5aQ?8Nz;^e70 zJLlBgc_`PH@cPGF$;T33sy+Qr-CD}_=$w9(WJ6#7Y~M2n1;rV4MI4%b^L08-YsyxqB)Of2({YcX+-;n}M11`MVWj9~9(uJ$?!<=98$1+r6xRVFufg zh5bj;FYev{=@*9j^nz+_zLjB^0Hw&U<^fE5U41=PR&bB)ZkcRIQKOIbcl+?JNZHSMQB)!G|N zj-Q`d(j~lNvs%ono2P2`6!{)r7wh}$?!~)rHr<|IvuF2=GJDm_T20)O`>Hv0r@#ER z>BK@IFHu3EAFS>juNaoLvd5U))wS&pDZ~>`Pt%yJ^SG%&rL&e#lPc ztXX9cktN&H2Cr5-lJ8;hQ zj)@V=QtxE5uEj;3X{WecZ0+52#4Tl4@@5`9SY+z=qRQPh+KDastczRhh*IP05*vKB$Pkc7~N7qcTxPQ#F{e)}h;!b1PK#q7jQ^}m>6P}wM-CQ%r zYSxsrWp?GC9D;U~EH~`>%KeXFs?k#EEEe0_Q8j{XM_FY~efb+3Kfm<6`=-Y;)|mU8 zRD3fvooDF^Igh4qwVgAYB=4IGy!`morj6UKn|%zQ zv#rI}_^z(^*Y;Xxdu!RkXV*4f?k-!L;$}EgB&6Fw_1cb)z3i{dpMD72lrTB;#gY4U z-u~q)e+xf6d(&^`=hQQO`uUr`Xy)_#PG;$S$GJ@Y`eO;xex}V9&by9AJzs0DbV~YA zr?T`%E*7h{DPsQa9G5p0o;k4m!N!HcZ0l^E{aCtf=~v#@O&cVvO-kh*%6_b53zbRX zT0F_Pfi3!K&V=MU%~NdlmfYL_=h7N3Jq_ zd38d}b~WAWb63nbdProK!|$nExvCZPXGbqM^w~q$bl#(oFLqygy;UxrSnI<0d_{kd z_w3ce{PGzGvg@6O_+SvvEN95Gea6*;S<|irngJH zQ`j^A!=WD6{mVi=Px)fzcuc%t-GoCb-?b9|-+#fJ-nxlN`|aPXzekTg$g}$^5^HjB z?=1h_k8c(jh%T*my05Zk*Noa9Vp@~K7B4!H<-90Q&biJ|+V|NDrUN~bU#f3upOu;B zTR2fgKBF-)`0t~lc~jE8`Zh64xVhBs4&x+&E^$Z9NlskE$3@*wY5g_L zw_k#e^Bh~T@VC~__X?8)m`b;%y=B)|c3b&D>yVdPU)`FX2sfQcE8m!1ZkttqyJ@MA zmrKCmKPeHrG;VI)9hWcL?Yi>mzSe7o`>!nLQD3^JE3(e^dfDC$tGfQ~V4G55=lyGD zkpEPJq=HZUV*C37ey`}i*!F9|`H~w4QewrMT!m+bo@)O%W#&gyodmIoe47sR)t&rx zZ_()$AKn*-A8doG^wvZ}!^hajXkvxD)z)zuL?f zo!U*70$&QnT7srlPj7pAR7CYr&ZnIo8@k&)lNoH@C^Ame-7savrkcE{xqB4O<{wu4 zrPcVrQuOal@zXz>FJ3>jK>xBQ_q{C?d3MzbC{UJB2p}8>~{*_DlKz5acS=Q zDa9LJJx$XQH$3%CZq)%PhoIUICed$Btv#^qgo+Z|oE2uQ3BOwYTi?BS(%9(nybYeQ z_shk1TZhiMC1SjK-3PD2WZl3Pp{4uNejMXC%3y!m;BSMw#1)oviuFRRQa{dgKNUV) zXEJYxMUr@dw2FaEPx#SXg$2_T_jBtz?0j}h;l#R^+qou%pP$lY^zxnLHEtz7>FJ@T z{~E4-mfCqH_r$%1T5a7OK2tt?x-GNlMw#bp-d~WjoUsRzL4bipUdbDtj#IYyU`4eClMIva6a^o$SiY zebPMzMPIf@I=|3&iWmFG=A53rxq6y+gedp1w(Tha>YI0Yl=0TQp7FzuDQxzJU5xVm zXBo~Vd#AT5R@KKHNSXy=RB+hWL&>xhW-F*M?^~r^|OKc^2-`$uk zA^-LNJHOvTfh`tX1@)Z=Kc43Cf4)w6(~4ge=gv&3WwZOT^7`Q>hC`gG6~d)S{sgvVDeo>*n0?))Q*@0^v}2l4M94zc|D5qM z9+7wJ0wb2O8HvRmnBMfHc!kd_uU#q~>*_z}Mz89d#IbC3e}wL=OQEOl&F`_+o!D?v zEFg1fs3)_wiH^>UE76-xL=E44EZn`JD11fNVb(|D_KP+?e(^F$&9kEFRTfvQRBFYt z6^H(x*zNK&)wuoQWurfgj$wQFy{<3Li&(d9bMmLd#)*|)kG$4Iy^)(M7Gd<`nBvp- zpF5uiJ=(tL-=DYt>?17x>|Gl0Xq8|4^V-9!Eic}zTil)Na9BNT)dKrH4dsVgCZx~Y z@~uDXYX`ICs(*`b?Wl6H=Mv83T^lFr%6`gQMJbYZmjlPr50aBUY+5XDxOxH4rezCS z*476qo(WBF3~c?h>;ZrM%Y^c-4wG5;47eRRLJEk^f! z%%Quwoc?krjLQv|TCTe7yLhdUhA1!3l0_TT?Fzya>;m4*+P`DxRV&NY%kS(Xd@z5G*pue7&w=FhU6{o&cp*$R0wsc)MOwcD2n zciI0?Fmtr7-kdLdO3XE_ptx>L=5jqF`zu@W=k89_SnzZEC9iVp2cH#=pXUlr^s##S zt!|}ulIs_@CjvRJPUHtrFZUZd>m`{0b(kBXiC5tUDW%0%qGwc*0Mye$=y(R~6Q=gpU@Ov8`?Bkk;v#|S+=eSYCpS;Iv3Y~< zv#irEC;j+YYp_%MKidA@`5zqSE#_okc(263Ac{H^54s!HG0c^~4BA=H304uGHvbfj z-I1l7bW=GoxmxY<+Cvc*s}v6u9GUIARD+Q}KBb8J}7awhuMf%Hd@_Sqguj(rx%S8_f1 z_&kTx^9-)1cjP|2S#mypgJw@WtJ7qQ7ws|*la*t&H|+e)IHUKxZAH?&{_6p*Ob-mRATEVHGzPJY&0xho5!-}9b1wjuPrWBHBOWxtL|I?NXgUb64)u2#uQ zQAHsSrm#+X`y=R?eukgCW%05N8|F#ODn0Z@{mJPj&Z;wsX2m@o`+7grU9};tocCK~u^VZ@JT`90y{aDwI5XGa5xK1j zoWe3~OUurrlPz-Pua+e46n=IhVHfAd_mKjvlbqtDi}&*X_`}qA+2IJsPg#v$KSRH+ zda$x_ro8;@V;q$-clp?x{i<8)ciWzMmvwGC_lMbirr$sR=&jnFxJ6*M^{X#h6Z0p& zP7n$>wZx?OS5TN~k>n}{vrr?Sb;ZkE%EWJVPWEZspxOUpRju_#ZNnO`S5a?&S^ZAv zKcJFxJ$c{!qp#Q_W_*q)f1&f@dwFEQl#TCx*Gv+-qUOjy&F#M0*`MpTt~U29J}x6> z@M-7&X+Fmz^mNy(eRDGH{69IxuX|!zb+%ab+JEBVFh6~8tF`jy;J^2NXjkvfHe)+H zZ{ecPUwa!DxH_genffao$p7UuBiTL^lJ8hvzE)UIm@+fy{v7j`LuUZg1o}r z^FsOQb)Bod6N@bURj1#bVA|57XlA?q{)^J6wYRJK=k!+{tyT`bsq|b}^u1de^Af*} zYQI^$CNu9d+GtwuxL1FzxX*Gei!-4t4y?bI?ogQ15Z9R8*W8jJb8^O&gL{i_8lMsT zb=U1sr^ocGFQVgSO=(s?AW&<2@$-ipPLbK_9#PV&yoygmx0|g}b4fMUn^nlUEKbSW zX~u>He->QqUq0_^PwW&^QKRK|cc1>d!|rbWiUpgjA74{%JhHsr|A618Y5%U7#Ms(g zUdVmAxqiQA&b%(y+H4ESw-&LkeS5^!PZrKxT&(_GR&K|VThcdI)=o{h?;(-ZJ~f0V zod2=D9d}+{!tcVWw=ugdS}Lp}k6&8OG4*u*;-(9_*=OebZL{X*RX;G9OLXqv$Fr77 zm!DX&DR>$4&OH_lr{CV4GVl9Yr|TkFu@^NW_Xe9Cd3oy4iV!ZDDF(a0u{6)uOzk>- z_*IbL>ffs`g=z8$E1%IjRj%lvbkZ#FlI7d;TWu?QeruVDM)u}7tc#1;&o=k=h8oWe z-4zan@w0Yg^~B?hyay&jr%m{9OXiA0Pf) z?eWq;?YqjS$#*8NFg~oj_{WK^DUzaEOG`pda{MelyC+;y`R4J9*Nywv%49bMO{+in zE8^eko~bj$^4~MLm1JzHOERCoB(zY|Zy9?Y!nudu%v zI47~~Q_~ZxIrIN*Tf3>aM`_2hLW`&aB0c*nbR-{qk6CnX=RzLQE@9JaL1`iDpR}Ko zm}+smPo=T_ozl^uWx*XxS*zJs3gqWLiBV4enr|5vw|jQ*2EWL!H7|&9(F>-*fB= zpA@&(Jtyu(#?c>4*_wpb86W3)mXz%II(p-T*{6fKu7*sI%71_O+`koq`Nxy01v|D# z7G05*uGWhSS=DS6*0qx>+_jC?c|aj&vDQekOC>5_X4k_ia|ZOZe^Ned_=0 ztpELDbzHSQu8}g|H@TngVKLa4qBX}{;aiT48P^-O#zVbV=U!aHAKjdiS~|z|*7dr@ zb;9v#>0(Dp zrdefDhxc75+VxL$Wmro=blSw0xNXxNe@}RS`SGcOFh%eAchJC64|xJ%9ZB|5#w+?N{%T3eA6BSv^~)+I)7c?B4bT1-F7#I92x6 z+h5Np*08)c`{Eaw7tdZ<|NrvfZ+S(=(+6*&{@%Q4`abf1_m^3cw&rpFMfWbBk~cTT z-E#ebg~sa-FEJ0^KkKZW#UJ*sl4g@wV*PvrzC5t2a-Fths@W=u&5e7Ve5V~Xh&Z=z zna!J}DNC3v($<-lZP+PVydvX-`ohlIpJ96vE}cp&{CMB;$&wexz5eop7GH2NfPh+$ zy#t7bVSdyWUuJoVerO0M12cPohCc|St(F2AB*MVJz`+1AXgkMS%fGA)426Oi$Do1? z@=Yx+PE1b?&&*57FNZZEL56}bn!#%$a`PWq2>kP@I~p_5FGbWMW4qPMRkoT-9Tqn? zdF+UL&t25Xe2-1~=Cas#*Y8_!K4Fa#%?w{HIwSqwJjwGt+xgDwpFQihp5-`ym@Hd~ z?cP?k3Y(-kFJ-^{m{iEM_p6y<)X+(KPj&MN1c6-1>0S-F;b)?5_)~$xySK_{cgo zV|Cw)grg!kOCr2BvHg+o^m6R<*e~drpP;^NgMy3-@61b+Z1YW7moHubs1}`D zGZ*XfuVm>BGntyrs^qngM=mX6TCiu*jGXz&+Zq(31J-GH32(_gccrWC!ya#zU&om3 zKQsJd`YLpmWk2Jo59OTeL$v|%zr^$Ny~A6~G2e;mp1?y#`UuFETb3)tLM5DRYG ze<^%cR?=(VGXaLjR5*|C>EsaYsk;2m)@#T1dl$Ip^?a|@uXyp(?#uDug2YFD%T|^)JL5 zS*M+SUL?l7&qv86$L}HU296yU`1W|Vxh^_dXclO7etEO&o(#)^yN&`6^$jPz%WhfR zW!D{0YcJ+xRiHh^?88Lvx2OG<-+dFa)tc{2&2^U4j3r(ZRcljhMDlfc7IS7P-gMIr zUT!d>Qd5>i*W{kZpQOdV*}4xs|G!bkXW0a+y*};w#_P4OWgqP43)+6=-=2yL*Pu1L zpZXq^F5@yfGkwvd85*urQ>QL!$-l5ojbmcV%R?6}R#t{uy!?AZfpdFwuZ$Xd?7_gS zh1~9r%d88|hObaBY2`8Adt?{K%G6eqCPR5HA+tC3Yi=2donL0=#b*()DKBzs%ff37 zYgYPyZSmOq`DVR{)Uq}6pY8jee|}xlk_#!C7Wa+{O0^w(%9z-*e3p93N2XrpgKHVD z{^aMqZ8lB&&Gx<>RRVM79oX4z)cF3uDjRi!)nWd5E|+{3b$FfHnyGs4v8>6hvY?*t zj|7`{9b55X*AvA%!lm|gK0DTimWCfb|0HwGi{}q=f4i`Fd@D0vR5M#nB~&qqwRe&o z`-f#S9|Rl~Y*mj~xTh(r#K&sY8oA#UrKj8%uUDB>9ci_Ve`{OdU*7_@m??L66liU| z_37Ok<(ZTGL^NydH3J{LT2#d7=f#p#>|k!KZZb>oyCTzWrHk@P-xm6{Bps7)iMUZJ;}W?gSSt*Z0(&4 zL$Uqxlb2fE;dqmxx^hcwQd{t0w&`AftUf$1pJy$@@3!v$^ib)?S;~@TXM{T@&HNH< zd^P>f5wk7gW_On)Wb|bpUoidUhODavd~(x+=8C4(DWA`{z0$mzUr5|7qu$J`*5IA& z#Hu@K+5B`zgSr`y@1GPg zw_I-WF*>;~x_^mF;NRsF5@DjvB#=4;zIvDFV)-6{#<-0@Bg0- z{Et5iAFQ=i-?92L*Q-zI;vpMPO2ocAd;c|8)qj?ETb`f08)@)u_vMcT8R4q$3V#X} zwO3|s@7*W5t&L-=%#NMMnKy^bJ{FRqdOs|>x#8ahyP6&Ex$L{GfnQe#~!t)g%jD+SLpqk(KStWOSG|^diJ}Iet~&~ex_@eAFDOp z_h^C#tJdG`bGrVzoZ56<)}Cd?rpo#|bARsL?IbF`OH1!kWa(3>d!Z9<+*h{CdYJO5u;%(rii|SncT~JNsZeHR zbt0?x!i8^D&Sx|)cv+vC;`ZUK*z$zbGclsmvYRF;wfOpob#hBDr4zAxv|4`Hqt+@XmuzqiXJB9`V8B=#2&z?_eG{`&eKLzn ziuFn=O7K-y#hYoo7stO~claRt^TT)k_U9ii7C&@< zD!X&h@1v|g9hSX2SN8V9OrJaKx0j}DvbPF*@sq*m6W{rLe?Le}y0yaZOxSAQuzr(6 zbAI33|3Yoe9_9mA7t2m)esBBZ+Pnkj=lW}M?uq?z_S4JvPi|UI>U}CSKku!=m$zRH zmmJ~ie46*a+jq{p!iFx#h}z_9M49*2mnvcW{f|SKanA{n^LwO~|fx zzT3dGjkWmk<_8n=PX3yy7^B2~x`VmsC1b4i7TfRTPPr1_PYQo!{$Xy|=wRaMvJrF| z_!@zm-#W`3wpe}m<>R2QnHH>Fsr6vm4L#-GFJv8Nxhrsds@*KxzDCoMt)#p}%7HQA z2+RZQCAy;`zfQ!#%OJKV=gRMj3d`*I1tNp1+T`#Zm2k(ZQ5^d>nUt#1{8A z819)7=N}$F;rHp6ugW&XOgeqDiRWa^jtF1(^6Q6LXWrL+w)yE2&uJo+PH&&Cp7y5U z%01@4xtSR^{SLVPW4gxEV3_VLw^p4i>~6qs&KsLfu*p12RV%jn-pI+ZVI^C=`nSFv zaW@q1*GSi>d@w&VS>n+mba4LaXfGh4;CG4QGAy_KD?zr^Nz{seA)4#7WZ z9#P8@x7bO%opw>7{InuhsH5#2-}KL+!Yn@=ntJo)4>3HyUy=8s+V2TFg6(~`0U*N)w;QC)GCt>?>pt=`8x?y zZv-WCee7dXY5M*9b;K@)oANbZoc-qinS7^8Z|#C>X)$S)34D`(PLn<5pMK6P-NBuC z!PfKkLC-fVx_@|~|JomsPj7ABW`3}l=jVNQ>kzqpUX0PZl$DQj8(q5gYJccCIhlOk z)pn~FvrSBpb`i5Z7(C^YLgY#9sm2{5s|0tr95^)7|M24XuO1fI{9aS}+-iZLK*K_h z&5C=zC@||3cVGA<%(!Qfk4*H#o}J~zo`?O#p3Hy6b6JFarP&E~=4Dr#C?~O~>E-(x-cNKms^O|wW z!L{E4(>Es__Rkl-e0h<0Pc6{CGuvR2%S3U^`)XckKKpXs=@dqIk+W}>UUb*XWHhU|*@Ix|)$`ZoKq zgr!e)NP7KDlvi2M^X!3w!;BLOee^zTxSGeiKo$PM!^xuW8zWLVnk9oYq z*OgbfjG8=OsM>5PvDxxF_i>2ak~POG9bWHmXkRyv_4A()u_ZZYA|sMM#+-A~cjsOk z9C_fUkxtCdYY#8pV>v4GrBvoi@4QMa_BDI1TCl8k>aLV{^5KHzRCcrJZS6bm=%zik zY43fvGUv$UOpD3`3WBCHd7WnS`+iC>=}qJQ7jkahTGP@mXSVK>*8P?q+y5X)ZM~X# zclU4q$w!Nb{57uNj`=;Z+j*J>!|FjY!HaxnB{>;u*gD;9R*^JhJY- z!pALd%bF#c!>Sut5-NC#o;lB!Sp4wgi6Zj{>wbou?YMJkW8vfF-~Kh_S~xbVHJWx9 zIJnJwf0_3Z(~PiKwFA?dMO&22)gCl2`ZlfURDrly*+GNvHF^o9iTCXMa@r5h`BnVe zx-{X&i>urds;X2r2e(|guDq~lhLHTrXRmMl=Bt?QempX-#w(WbuZ#nGLtnFsq^Z(F zmN!%LcOLw7kx3`ekNID_R2#qbab7lkKG6azNuwRY#mT?_wJK}PoH|)nL72aqr@`b4 z%Z(ICt^*#+#RDUL&9;A0EZCZwvGX<$tFZU24kn)1Me;8`m~Jjle70_8Aaest6`Pax z7IWw8_qtUMbi^)WGV?09@ksA{#*&F&F8(fioSWEqJumI?!>@loJr;0&ay9A4(sPTC z-{3Q_e{jgB_gr)Pj+#~zlZF%e)1E0w)mI#S^))KAU`kf(T>d$m3l{CW`6_F}rLU1q zcf@u+Ic;=!LD|~y*SwNiyBC#iI&yJA&+>ErPdp>qTytiwop&>6W9!v$jgadZ*=tnv z_8R5CdU^42X?WYc^Aq>X`PjE`re$P7>gOiS_|S+YQ(L2y|5Z(OmFq7|P0TDStItTi zsJ~XnWm@Zs%#w)Ii^H(%o_xmW( zP?6QcpuI1C4wmT_l!7FKk~cdg(?6r`Z>0uLZ(6;cow9p89V{;M}&b^JA0X z=?%R-IYz6zEKQ3fQ-de_1}jfbnEh<_;tkte|9xdDWSm{7Q+Gjr>E8-xms@St zEUIq{I8f;s@H_DTG`^J?=GVUWmsxzznP)Qj8t3lg#U^vV-n}RP{mJ8)7m1Tq4+jp_LkZ;ntf{KQF9bXcT7hGbln;wbOO7-qEAMZR;|13tFcv+!|_<*eH@D z{kPaxTV(CTNo)bjwF+6MmNx7SPkX4snJ#umdU8SHy0gAp(_J&oe2=iMIo4URygvKs z6qlNB!rncTC;zL=ymX#_LBz7;NBO5a_cJV_HX>N{z|_gOF)j;ha1+F z2Q~a=xv4#ltCp_u4RmI@>|wG>b#V?`)rNUu0{fSoxqXN?Vu1+%ij_G}-d+#mNIW3? zk!N4HT<@feh@*0OQ`{t$WhcM#ZT}+OZ*qI@w%r$(DXU(1wu|3{eY(}jd)p%tx7=Ko zZR2qv^vllMd)LX z&(0*|Y<(&0;*lR*&d-T0^$KGuV zGxrGB>rdNx`|<|epOp{q%srU!;aZV$amAPUtIf6?ughE+cpyC{Gbc$v$Y92QY1ZQ} zzqUn2<%`VW_*Stq@x)U%yQU(oNQPUX-Mvo>Wp6EXHkO{Hqu!l7OK;LqozzKjF>xCb zC-tmm(X-X(ajKfI?aSg_PBO+%#Ake1n|%7NmN5S!DFvziv}4jS|LuaxKmRH6dj53E zndyOt!uIuqM5|3TapKzeu3`UkeQe1@RiY?7ZRyIc5RPKsTF_!ZQJgAt6w4at~}e^DXy0lTC=cr$Ke-D z6Rx^-#|s{Ooqtxs-k0yqGuGX2PsZ!^t)Kc&x}#;=?+Np=_jG3d+&6QE)KbBDVoTi* zmFk|*xLKXeYPj!kT*@>3&*J;Huifi);qAQnUxaM^njuXYyI}w&)X+e^IMkl{aXIv)T(J`mNpx;xgWlL@k!LP?=OB^_&>4u^X}6$ zwgWGXr*xl9+gx`^RwKPu?m=PO5yk4A6!Fe!GDKmf9yuH8OI=j`UTwrE5Q4!?^;5fl|l(pdY z)A&;vAH+SSPd?r2R&}qtHg40?{`(aZ%PgBpuC-XzX*`pV(LG+NR-NtrbGxn1bO-r- zd&S-#(F&&j1bf*ye4odwKfx z%Zg10ruNOBxpS5Y2kVrm(2NPIp2)Mfu2Fv{TsTidDJwSBw!qZL)?n{m7iBx;BZkFa zf-IwtAM{&1Bjr*R&vfZ|VuwGL9IID1^g5u)+0h#1wNhlplA>oW+igvYj!3O`57-%W z=iIyH=FVHBJ2uQ&<@yS8tDhWKzKk?%G|!O*ab98g@;8 ztL^hwsW{=`&+Qt^!%p50DgNN)I7vZp&ig;lI_8RgsTcV5H(oDw&*qYQ`PVtaJR-E_ ztY8T{tr2CR9cz9{%}s`RQSZCyS#5{^8{FNHGhI8H27TY?d6pfy3 zs-lXVyMKP4y_9)nNyCRP@Aj-&yx4igr_;NQHhWDk_U2rF(uqslw^v`Ux&PzB3sc9O?bhKx?(4pg7CM-&_t!k~*H-T( z*UXo(M^E3kyN&n9jxtWh{&j!-53Al!@GswBB2#ek)R&s;HMf7V_{j65f9-deU`YWIiiIJ-8JnBbNOFb{V<$!CUA{&%;Bb+@6H-cH!zxh7x(#J-t?gNz&YjDbFVt_d2s7@{WF>STERE&p=(fR=A!*| z&QUy)>n8CF6&bx30Tp))gBH%+Yc9y9kuv%-hw2G<`1>}Q?7uG90;(0m)GG5i@V|u^fZ}ye{T*}XP zPg$ydgUx75XS108#MO@#pZ=`hD%IAvt8PbWR`&E;26MD)n|}9K2gUNX>0S{Wi9`fC+;EN*O!x`G_~9oDnD-u zPkJ@?PjR+|&dHleAD+cq8|$v!rj$LyN;zxIf{TClmVL~-Xx>xowOZ_h*3~TW#;@0< zKF;Ue9{9ZFO7w+1rOxk%@95c`5nU+9#l?7-fuVO-TQ?W?*n05q{C_@O+1bN{>1m{S8TqJdh7Ee*O#yT&oZYtH%%*+`K+RSSlza#)}wu0U|{3i-6@S1zPw!W*T6}A z)uwF{{#y^EdYpOvRaWlS+Yp^dz4n>itw)|oy7p&%TA|*5w`ztYt5D0fisGP_3w9j> zw;-YlVv%ab$v+ndrb`;l^_lSF-Lkt)v)Q-x>oxBZZChP-@OqbybcTYG@8KflAOZ15 zT16T-HAj^1baDThMR|t~Z@9kk@9ghMFLED#b4!q%=6SN{ z>#r`c*Ww~QYfK)l*mCai-M^NXgwjR0g#9_If6Usjh{tP28P{jkxc%bt#ny9<-xo>o z7wWxzD8{njJxA+nBflGU*A)JkALd)MwSh71#-lxlcuSdNn3LEd@A@Bb{vc4ZPhb$+34)|$tvVXJs)L|R&k5+vX6{A)T>Z^}lKDbWUVb(dvrp2anHe|+ol z|LeGBa7gHNZwQ>dBUD7FsZyO?YwAj`+EgjK?MW+-7VOi$qBrH{{7{jkUosx&gPNT` z#x5#b_&x2^nn}*HWIjepr4-bB*7z*^E#c(n7n^nnvb#Ip+Y;Qs#O>#JLcF1NOZ8)s~0U+8~y_V8V0P@v%lb_VeXBY{>S1@*%ev3@Ag_bf1+@joWz^Sa}S@{CYZ2C_)Ev@ zpPKU?Z7eG}ZS-rALgta0Ya3QPPrJ(Y`J3~Br>3RCQRmd|sBs#a>vJUKtxZxrS)mt@ z;iUai_(V@;WvSK8rTQh|eDQ0yPUGcpy~VC2CofocwCBT7Ma9{zo;y=A59I!hc^58o zzwcdw;r`a6pKNu~_;^ofsLnF<>|gpanEk)3iWcL^x@0D)H@U`NR~9una@kKz;EOicr$hE zPB5AJ>uZnMO7Cm`ciKIExmjts$S#W~S2|<7>`u-v6+cybQa{5i$+-NBr^3!je@^$? zDn3~+TO~0+_|$QErmntU-*;~1>RN6u^x;8Q``nOv{fj$eYk0p_+!owSn&a;y>+|X5z~;&nId7{8@ijut1Ktl&5&=UY-=!C;u5y8;EhU%U7tdF)$d4Ffd4B zHW1xIJ$?KgU0_WwjsOjR5Jp?~u{S(B|B;)>Uzz`1+Mf~=A1^WU{C3e~D$k5Hp-f_J zy_Z&XsZ}(bl;W4-SM>P%ac}bMAB-$zTXVNWC7!RHTYY|xr2OHRzc2sv@~iBy-;%sz z;pRGKzk{5|byA90%PbNVS*y2kbUb15omI0>D931OK<>2#c@obJW?Z^*S@ch5-;%PP zwr0)l1ic?F6C@v;-?%_T$!?mr(hJcwKbYK9SR8A`JP*o=Phy(v;PijG#l@cAIeUWE zi!JnL^*E!na)#@H;~x+EmUm=2Yk4rddt{iP{9=P3uX5Ktmg3dr7pMICu%k=%)+#3b zwG6jp9t)kUs9>G)a92aRmQqcd6`RN8C4!|7m{z&0+Qj-{XVL1!wb}>vrOZo@o|w*1 zn~*3|cItUYS{I|>{Yk8hHbD_CC3`qZdK$JBJm=Z>rHy&RuI~luUw?;{7u2_Iv(SxM zdfue-NZRLy#DpU%9v#Y$lX(iVzt4`pa5&3CHoai|s(kC_b#E&#y!(2P>G~`FInOpE ze?2Js?e4tv`HU4IqDyaW-@V=7ScGvO@0XP-Ivql1zFVB*(B`h0F)6((SvK%nPpP1U zVlviZ7UC7*es&q`!(@JNmbZu9>Fto#IDHmhsNUl40f$fWHRMR9i z{-qBb|GaBEbK$AfDpTIW9~CkL1oboQWS#YURsA%MNF& z_*!?Zw)?!|Pgmn=QFDdW(eEyI?L%&N zXIGxwo7q!ePr7K{Gx6NAMTgtDo!h(p-F&UJOjf<&xVorw6}zO-;#HaMzCwK&7a}~K z94S5bqU}`a{MFCJRh>nhO!-$m`+5A=aoyEs??PhA-mvTZSZFB2Q+1d9&+~7E=C3Bq z*xlrIQS5n{gIeItotdSx%iP=N{l4(}x|#aotnxqNrV?*Ga>JLUu$LcVX^higlTnr2 z;A&lP&3?{?TdQOFo;-b;zIew5_W525PHb_T@%f8NR{G7&PbJlK-mHl0%G|Ho4E2jCEsgFg|@_+q8=>P5*0%Z=4!& z_g-^x_T3x*MdEk+6&t*{ZT0EwW_Hh|dBRi7I1eq+3fcHZ^SDvzo;&sx=jNCBY~Smk z$78|x&9398IfAigHZrj!HCxOR5^v(^wWLlZj zy4P=;o?Cd=438a`7BSAZu6SK}ulM!H>$)o3j;+>$oS07f7yp7^5!UuwQ8N{?O!IKNdx47^KIpe9+BT zx#ZxxHYxpOg8ys1q@-u3H|^>B_E>b4xbBgE!K+Mq|Ay|X4L9I_;8X1AP~w|eWJ+K{VLAB84l7p$4&{z_Tw zgUf+_r-1T^rRA1;-ziNtkecmX+I#H7YBTZ8KQ1rjvD;nzV9GI{GoQqNSZoZl(7AWv z!V>BA+wvFqhfTWjI$5*dNbZ2uh4*bz2kvct5i(cL&bPbou}q0oYR&CBt3=hzbR#p7 zxF?(+mE9xrm_FY9Gqv%5_$`_Dmv@Q_W&VC-eOJf%;ODB(pFMazU*0Jd^mddFp8UuB z;Le44E}kb>9(lu;FwMt&{gbCxo8Ldpy!2`Nop({M?0;vkJ2OrG-xBR>H5|EpN%x-E zsqgpJ-rgOoQ)lV>3vFD&ZtwqMQ5FUUIWDZ@67Hd%zW!mJ@J%bAItPT&>zz>F;zt$& zwvXd4y6PFEMp&y@8_#}}ATzm8l<}0=$!9K{I?ZK0E}l(1|Lda6?x(2FJRKmD^YZKK z>+7RGiJI7%PLsA3myutiU9q5h1v4*4KvajMyP$HQ!P_KKgS zJIdyWsTA+(mGSy0KR4?&SL4Y!nh{=xlT#Rf%m6Jk^w}@u`9488%s^E}#dqeVNxosT zm@Ye1{0g6#p%^qR_spfP%<9DGXjXhze{ zv$JMh7Ezn6v>;pLNHpsO(G%V#!hiTQ4%c#KYl-eVY$}v9IY%;AKq$*a`lis4OD$Ie zU$b49?ws=Z>?wZMWd|x8t;N09r1iB#+}A!`JR=}NbJp4-X-NU@^NF8w4ZIG#-hW`T zxNDq!npm^PBL8Io?mZz)M{A9hoG9Yr^p*d?b zx0QO`lqwaR@#sj+n)ICyHZO8IBB!&5c^aemt+w!!1s+>=yis$L|CRapkKb&wJG(fP z{#5rZJ1+Im<6^4hrSf9MCA_i=w=~*UJ&4)8?s7qNU-n^*Z$5$3J|>FT@y$E5pi|W( zVa8-$n=aGET&bTz_9#93UO%nXS2$>T`>|6?B4)UJ7vYyR$~U)<44e3Brw2=J!J3wT z7v?QFA|B&CQ9OI;oED#=s6Ek|XA=%oH!TTR{XaQ0ZRd;yx7}mR<_O*_IFb}O)hYaP zz!XMjqrZGxU!Ch&#an;h!t72>;j6HxAx|nbuADPCJ0t7Osis9%tBWEp8h&Yfb=S?Y zxJ_?Gkx_5}ceCLtY4wBqJH=V=S@2ag_FulwZE$AG+Rc}4yo&!2uYAFL`oysJNzom9 z#pmqf-gEQnzWfUZ=NByvGo5yiePg`q8q4T2cLXiA8Q&@Kvr1l}{PES}1&`lGvtPd3 zb#JNt!7tp+l0jh~K1}f}eBOCt*1GMt*LAL0ar%P#r1d@vc#pk5)%y5ek*6i!v`y0Q zZu1@#nHQ9lrDc3aG47uIs%^!W*qKc>1{B+GzoY;Bntbm4dv&G$ckFHz@2|^?y}(vs z`0B4iiJPaD_X8kElQ=%eF~nE18~a z{wj>xzSS(^vhO!%VECTJh^>9=oRL`Mo|;FXefzdHyI9(M(~I<%;XW&NRa+RoRb5$r ztw>b&qS^Wt$0wCMx^rhrwol)hjhcPaWNuzt`S+uEKjQ@kDPx9I>)FMV?|QlTlrP@R zXtGOs{n{5F`}_0XcfYQ2{CDF{SKKo5#m_H3&e*Wylvre;{8#b!n_Z>8=D&O9IZ>bU zL}6X^{xkRD#RETE^zC~4?OXDv^>;Ih=1zMt{q!GaD_yhg9ABPTMZ0c4{pYXI&dw9_ z!%v&^hW!lvXc@Wef5*GeyEA6#EK0RH9d^{Hx;%VIV3^Cvq;KV6w|(tSuX~qy@ov&I zy~Ryef|i_~9Xcg`qrCq4_{mw~FO6opPcMJ}?52rS+U1gsUYuo4ua>2*eqAEAcXv96 zz6Sf_NzE@@{a&cKPSgJqn&;VlOu>r4K0C48C3 z-`0F`{gmJ0%_l4CZTjM3dKSf%+?4iZJHEbsZ(zyKs**~>clMo&3cY47dR6?|Y?soO zyrM-1BBNAp)*Ma!H`U~MSAp4l*Xt*jPceCIa@J08-=qw$UA^(M&wf5yt)|!*s`bZx zN~~-5o($Ld(Ui*cRp9R1FSp2-Z@WD=>`T?1#ZI|-d9v~9r&GM7XBhjgoc!oRy_vbE_0!W$ z{gcnGPOTH(TVreCc{0H}Jn-j7_kW7s_t$kTInb4V`De^D{^R-Qf2E60`ttfP1-pd{(J6_YYr`^P}p|#4r1=TFjk1@${3$LBf^wC&f1ZDJ~J&>UwfU z!PHGnp1+p9(7oL9cZW*JG|w=b{n{N?k%9SEzWIp<)g09qOHBE|6u_x}LF4nH$u$$5 zf)?4W{Uj>vt?l&VmW*n!NB2J#oeT4&n715Q^RHswny>{8f7?zi+Hb10hDEiw%v|3{ zc)I8PffI^Jb1#sz}4PS>B;uayR*~Zi<`f6%C-t*^Ehb~I$f)&^hD6=W#u<* zv^R-p`As`G%SCd9r^v-)FV3d*=`a2ge?okj<)6!vGoR^w!QEMcKxhRaUVlIcG~&CXsr8j@eOR;DK<$Y-{Teqh5a(WdyGs;&8L zac1Wyeb+ReIzcgXMd+fgUa2eWc^(_R&IK9er~RKRb+sdDwbDn%m0mSQt9Ql-F>)_a z`rEwF;>XELGJi6{uJ7LKdy;48g`8DdEsvwbnkH(Tu9`ndDRPlXoT}u%#xKuVe?8Rs zIpMKJ%8~4Njkk|$=II}0h+Glh!}Y^6@T$L=a^K41iDxFQ@#)m)?)X1Z_uhJoPoI0N z%(h=IxO39TAz<3x6G4w64DWn?!lpI*AB)77#TO(DLEnYEBEie#k*>zpXvY1 z`q9GU@}y10O%5i`I!8DCZ#^?V=1;X2=kMYJf7(jaxXsdEhL&uUcy@A)lURKPFs{NGDc6d^W3iV!qOw^LS=?)7N2^`)fAtCuP=QTNl*6IZdx{df#lv9 z7Hw6`Ta}iUdWM|Yv-X5pT*K5)+cO<Cu)rU)BnMFsdD%XC~cQ95YluO(@Zc`XlFteu|u(fH@hoSx^Ejx#s6-)(ys^!lnG zQ%Z>V>6&vh8xKqok1H*{Q1AVu`uCr&DMf|u>Ro;NA797AxA$eKE27uey1k? zxY!>4_Z(il|Am}SG)xF6k}XV6!ubfmgSR!M_sd+qZ_Nhb{jy%P( zWZ4_;Ov3xx{u(XQs5GCb`k4Lp8pfRc7ta2P%TcZ{Wo!z*&L-q)#^mI()v28;xjI|) zT02*=!jBV83$Ao18Mdf!bOudmE}Olz>zUQARE1~U4ZjN3J6|{OYh*odwdj&{@^{Ob zb+sXWy8D{G&bVFjz{*xQVPz7p;9Q~p>gUJ*E}SDcmH&~lr@7g~xnE=W`qbCE|E+($ z^tpIGd-~q#wPF8v*gL*lcuO))W`5994)??Dci%>|e+$^l8E5wM+rxKypSCW`w5Ygg zk&?G~amBmC7Hhekstxj*xQ~6`{rklAU79l+y^r;#tepL^IfDJ$rb%pjq*7v^WY7JZ z@?cWo1h)cXUmI>t4v8DL@7_;cn`U*=K7Do1&u9C2&iU)rRsQ~*V56`}KkVj^Gohozc!ERb?cd6W%bCX?dL7FirkRGd)Db0jTcYP zdgyKCzT}NTZ)@cXwLRPC$lYQIV$-^;n>_v0jyCiDhZUz^Ee=-5S>bi}Ql4?<;o3T$ z@pJA1Z z;Yr(Y_|C^tCV_fi&x40+1(}q>ulQfOS~7EEuZVAQ-t}e1$KR|w>#>L9OwLmCk5z`} zCrf(o`1tefj2{ZFRhItmf@ei%Z#fl`_2vDFzpX8vZ#|lX;?8$2H%jvnx^X%s^3MJf z)6H{)9S$c*TDbK*)t!~s`=iL#`^=#ua_i@7X=j}Z$@~BIWy7!6EMY0nUG2V~*p`Rg{d#(`d=Kr zyXwLImCc(Kw;NpewqtjyeY;GQkzRI^QIG!b!w+wtTtEHq_WeBn{PRmLb!9Z{FjU!F z9k{GfG*qeK&w^K7mGy1GTO`EP*>>(bp> zM!T##cpNVk&-z?)amt*df^UPRL)Lcn?st`sP}H6J_2i-6*_(t8HQi8m>TW%~!g))i z=ggzawrTl{Rer<7XdwfkdT5HPOy1jf?9?E8D&(eLr>1J0R z`(v%hbw7?N?V6uaSH4-JTqO0h#{WGARd*)7DST~saowAvVWH{y$EF`XeQ}55_Q=Hf zRnBcEj_b^oU2$sW-kWzGgvlSYlHB_&BDy3$%FBF`Zjn)0UMHh!*tD1GT0g8Vh8oRJ z@BV(#dRJ256Ty70E*{YZ5?g29T$z@3#rn9*goxDTm-f~DXRNoB`f^&W7+m23{ zzGt=Jdi}cdZ!YFAeE8^dV1>&3^~O?1XPIQQo1ON!|H`KJ)}IeMgg-a>W!7}ax!#+0 zu>8fgWXac^uXrnB7N@w>BzP@!p4@+Yg@W);_gk+$&ikBr5OZ$X&z{`Em<t;ay5MrK<&WX3Ese#G zE}U9X|Fi1SY#zOHmM3-1eyqsYex%#ZJJ-FQC**^7wVYWtsYrGcPtEBt zh34KXmR|Yqxt{$OShnKFk#jm-D;A#WEb5k8yQVAkquufWi)w@s|v{JlrK z^0B&UzMjjg!aE(WY}u+*TUDGK#d%$|;AGD%xmz-`r8j%M$Yt`4IXIF$S|?>$Q= z{FS??{dNBKR|@f8)&5Qne81zq(c72WN>6f*l(8CkJ!Xm&e4hBIcKO5L>lH>>7tih& znYPQH_5CgOEAHz>I~Bg)_i?lB_TOl}OfY!Y(oN1UHa^`O_00cQ{+dGWyN*; z3f}{fZGSa*&Z+BhS=WiwN%q8wl-Vw=Ff9tau~=lyxs!9mJsp#xcAlMazQgpS|Eu0- z-T$>ZJ}xKCWie%U=^XS(yGU1kNR+cquDGrS+OjcLx6Tq_rj_eEVx zFPh$6kXF9?@xv#k9OCNeZN1U++HZDsTZz2nM~Sdv zBb8a&RU93ELhsyP=D%yRO4PIYoyo~58Emdq%(mN=c4n1#+-QL?MhxWD9M(O=3yy~+lsZTvDNXK-AX{(!q(SivfOzXN= zxjszpo_xMy`T@2>j%$~#{Qq*H`>O*?1-_hHa#B}Z?v}gfEO5&!_=|aW#)ZB;Z!aBA zTq~EdBT9Ui(xiuxsWDc~+a~$c6?7jL+v?#mbDH(lY+bjPjp5RU+RrzMKmO)?e+N&* zd5zOeQtOhI_3)m0_@E_gN7EHE=B4ROuU(!zd1MrM=gbYG+B1{<3cT(A-d*ygug{7- z#%#9dqA)gL_x?r4?n^(pzo$iewz=8~_3#IaeYb1-t}(Vh{rjiJ|1*Cp!;ZDd+%9>W zUUoyJ*lF@o8~G*!Yo4&sjuq7Q~mJ8?e!ZBcH<-Dj(ESoVk>JLD3w%F<`<+`EUH z*Y*Eobq{^xBK+e-%|y1XEqM~3X1+b;q-ElNF?7{kfUvz&3e|?i* zYjx-5?c$wmb7R-}uJrj`GSzP8=1kT(2X{T6zh{bc=ghlK`j2&5ep=OSYuuH)v><%K zdXJBxN&D7)RjkS~e3$g{^t2yzumjv8((nVZr_q8@u73qi$hB3 zA-4@5Y+jh)eB1oN=Cupb?ix(1W}h|p#mmbY-HZ3TM(s__=Hhn?i_lwru+;T>Lh^$B zrZ?(Wa9{r++mo|9OVc6J^qOpH_@Uje(k!hSE-$;rRvPbj_NLe+W~;{sx4-P^2)MP5 z`Oo4TV%x}=(aPRi3bh8lZj4$d!c8S0w3^iG*8rv%pR4gFc#*6jE^nx7*) zU%b<;%u{$b7w4U;PMiB5NTj+R6TG)wscz-rhl^Yc5|_(oo4?{ecQvf`agq4%njH4D zsLIWSbJ)(jmHPelMbqisDN`5y{$|$MJ7@K0-wDjG4=io^a^wC==EbwE-SbLS&8K&&o8XIiFJ}T|~IH~1Vn!q(@G2uJWQoUwC0aRlr}?$;<=OK-7+-xjC5&O#{;To7ByX_qGOH@x zQ5>8%MZ~+T#F!&?*ZgOvRVS({+3q^}u0m#tw6~oehZN_U<=0taLIZc5J@@-fN!Xff zgMvNm@|s~SFI@xd&KxK{%XR#))B}&w<=OF0CWf&OmSp{v|E=)7<6grn<*#KuN~|5Z z36-bMe(*WSo0RQQSF>H~leGNB?@2P+4rRh?-6~|yPPwb1CUfBK+*pkT&zQnGuJ;+v zVR+c|$KmR_3*tvSU*1#Td;F5$>+Var#MY>?WEt%xSDE=Q?Y|?`k^#@z&{JlCQVyxTZ|DEJx+OhVh>i)xCS69xMn7zCxT`cxY?ac;W87o8O zZ=&bU@z3wunWpYNFYuViq3e-GPgPv}PyaDzTATUUV*g@Ut!-JY|{GXGnKo=+3Z^4YsLaCPLDh*SG252-}waf`fIQn}>* z$(s|8C$f6%obA+iF(-L>51w@luAYwnV#lWPC% zyqu8cDxtA0G9Yf2k*B3)zwwvKOU(JC_26FmOI^#FkajLlIdz&tuW%qR- zbG=vOhdXB(eZ(&OD!iHL=UkK^sq$(Shr4sX_|J0fEi=E|_o-T3*Ux7DyyNy!t;Y8CFb zdwf~c?|1vsOMzE5WVIETCjXX5PF0XTAu)Srtgm&`$BWYpjzGi}^fe&F2xNg+(k_SyINof!`6TeeHP zzU(;t_F$b@dmLYqY|#DFoAfy{PfPFxy}i-$bz_5BTYK5VRjs}b~~??mSyO;mH}{$p_4)c9!kAUNtBC z&4#sq=GltgcU$z;@%`&2-;b>?9!Le*d22c(K6!KVr6PaOk1EN;>nqol&R+E}y(D|q zze4xA?-?(1``@bnxg^0QU*COXnPJ>s8;1XW8>V$1I=?{LuB+YJeKRCzu z*YQw*y=(o)3uPfsW~cthX6N-Y z&42N-^pEjfGh@5D(n7;E1s6}0sPG?>x+fU0`K??e$GyC$ot@7^55-S;a=K9dM#VOX zkhKz@wHH1A`CP<))++gZYpqYuK3XF%^|axSxdpqbUC;0A$~ItCw(sEPTwpQR_wyn~ z|D$yY-gO^7*+xvaNorlS@0_V=ziY+A!`xMcTcr3^m^?1+KdPx1Y;=p`?WY1+FP0rU zlJ2C0O#S4la?Nck??uh+606*FZ{J)ZI7#yRG1D|p=A+Mds#V%&Sh>Q_%p zR==O~X6|I&vfu3cxAyn=*NNUK-K6!NDKhsLe_+}?saqN$bLYN#z2)0Qfu$M?A6Lm- zFpw(fjpAH$VR_p!k)6uFC2FP}T6*T~4Tft;E9b6LS;iWySM>Hq)3-o|rbm}|CpffD zxS*`Xa=>`Wqiy#qLXIvyKUc!>gKXl$-TOrPmbJ|?k1`P0e}c>F?S8Mkh`6(%+@H^$ zS-o#zau8cY-@Z5H?ri*0INa zZ)_Hi zmOse4?Pq@MLdpC@_vN|Pe0s0mN*w=OrYK;OuYa{jO(3bmz0sj{hbWKiXWcov8-#ZU zH2?Wg8pGR=k$vj$ONWO{HvB6l8+<=3Q+I96p9P&aj;j{-Oi$QXp@={0}s?Jnrx~ee(9oTLljKc~fGaipZI87GLvQ-G6yw zMvixE&B?>})LzOde5n=U<*K^T7yEdAt>(IyoYvcJ9-MgL_G+IOSD$>oP$C!qdQ@zPqK#+&2#YQk3|b^txEa z$!Y!_0fzmNZ%zJOn0W8wg4{!AFE0D~YMNa$* z$4_hSy1BGynPutwosMTK0@h~lRD8I4{kIg2Yw^AAf)_9UV~F;f$XCf^`}RZX%@5`B z*K5CROeqYw_o`=iTEF$F%Fl&|*!~DTi|s!eS$4eiX4FQR`V$$eBqpuR*u6)0Tji<# zskZMvsP|cH{q$*7Rhl3BJMWZu8bcjoncMa?+= z@3&%m*NHKN1m+#rnC3s(>OxI4GaDOUP*uePhEH=YsBRO~3RxAq+RPxQ;L%Sl4}Qft zPrf)D;(R9VH{;fad0RF*vMoRK^|{@TvZkK}Q)Qx4=dDTV_+is~;LxNA7aQ2s%f!Ez zUAvn#$#3_+P3Et*NQZ2hdE{H$wTdUMv*|4h;|r_Lfzo<00bk5>m)%~m`5(PnmCitLV`o9e%nm1wa| z+s15p;^B4EW~)Ee0(_@BcKzA=yu@(t@jj77S}P7n{S7{R$>fQ{;)_hqi=SWIBnUcu2vdI&HA)m_R50IXW|#7Y?S#jUG&}4 zKY348Yt#F^XG{*TCMvH0bpDt{xleGsje7nK*_m~{WZ=THXc&87(f zpTiHKMe@P+ZnrY~VL?G7~7ICH){FY&T@mEsn0YXRpg z!n5oyeAE%Wx`aO_VctvTCGqB4`42wqP0Fy7O*4<&nDr^-z5kB)eHJhIrptZ5`%q=- z-8**=+|>D*H0{aeH(mSU&k}t1qeOBk(pM^rxTq?`&b_wOPu-2vq$~qS*2{n6H6?$HcmL|v~iWAe1+1D z^NY-?3od0nT>j;=e_Ma3ne@->&AWm-7P)(zU-yP%5r?Zw`$jI#SvNSgHPvq5Wc=0U zp(jw)rzG1U!OtPCT)u1$?>YAL_2)Z2d&WB$hl(sN-#q8*y#*FA);!CTzLnaAb47|; z{|H!m%0f9{`9HJ%)%D*D_MZR8!ZqL1cXdfq@QZDyN)+Pf%JHTJ}f8EXxnh`mS7a|r5%}G2Mq!Y6=#38_!WszRw!P=eE<ac~?rKl#mSJ`$yPlp+r{+!)=?%;jt{vVS& zWjyxSMe0?(da&y9z2g&WGI_VGi^+>Uz1c0dh3n{lBcXaFWkrGck-z?P$|i+wd+`6g z;#>1SA%NoVa^cze#)w^KK<>uoBOzLwBiG|BgJ=uShE*&FT4Up5M_ z;R&a6hzqBnYTPqe=KCp4?+f(v)h1>C`Qqe_ooWtH| zKj7c+dcVXcwStE#jB7V5?k+5O<=CzJaCf1?Yq{X%obP7ZsNX&O@@LteIHoy0FLuB6 z&if|0b8$zx0sobMvrn!Ff4H3C_e1}+veh|r?H}q(Bo&oM?%m4H_(Cml&Vg;>jf{7v zwg}(&sPy4NI&vd`b=HL~6Hfe8(GtCQVL}Dl=TEm%e{C@TA-k*E zeXnQ#v+tJf-|}Rh$z}H6{{8sU)xOP7YNh%-ZC4+BRk`Vi{_LWKZw~-Jeu?>awZ$=?zxote zh&NAfetdcR^e=~goxIWS-E~kMIJ}EUb|ix@KHy$+q-JHlKexvMFm3DZQSbMH4_T(cyoQTM6i)G1wF z5ue{II=k6haj#5p#XgN2rnp}Els)c`r!x5T%KQ7y{N^m?ichyLxjhJccsWD+x}mhK5bj*#aMYab;7C1 z+uOQ#xJ%!8E9A7^cmC`-bv*2s>sRtV{bRmo+wL!YDP}5PCaA69zq?_tICp(VmF@nk zJ8cjDJO5X4X4}8@Z){CB+!c86_DA`tv)L=o^pyYJ9qlX9>6Lk#V@ZqOm&e;D$LnWi zT#(-TX8!D3@=G_TewsOb>!SO&bU*FC?|s@Sc1ze7B}KMY*J*CXH)1C^YBU%XXFRgC z&C*`IIF^0EJY!>P#+BTka&x&+HqO4UFlk-ytK58xp7Zmzm-?0G4!_@f>#AexVwRtW?kss_UQyEPk)5$IC0_D@Ls`_^58oU2 zapueQv+WFceZTyo;X`33y;;As9hkW6*i!a?R9SFDQ20rak@0gz%Nd(`f1cbFHdU5= z(d_(#6R-NpyYCh~QgXDf-(CFh!_W6P?AR+Otz%qyFb zP=0&x|e zuLIS@JzwXli7&Vx$h^kieB;jp_vat-%sOxJa>>_a#W_CP+$=V+{5{KS9&TrLd!_96 zT{8VjKR9N8+`^xSEKOcs(-Ye9QH~E16p^H6WF+zhCmK zx!h{>NJ_}@ds@Vd9~%np%?~s-`*Lr|-6esyi|#I%_IYRO;zf&J-{8;QeSq73Re^Jq z|Nb9~yH=I|epvnZ`les(yZ;BT`Sb8kH=dGYAov)Ela{O!9I^`79F?=WkR*%pfe z#nm3q3%);SkgYtFoIk(e^coeN__#)?OHT~a;~ay|&kAR#dUn>7%k9}7zrx?Y)wmmP ze)hT}@bsnR7q3lKe0zni=y&&Jp0tjC_aP%;pO%7Ss=?zE%aqF&`Fyy>v-MPMj#=o$ z*QKYr@9q4!^>d-Y+i#*Nq6D8xcFz?-Yu;c4!bPH>#Oh9 zEcCv1S5{22z_xpetLpMkk@^jf=N!~yKR)^T;(z;lU;GdK|KrQgqtX*BmVB?6Ff%US zrjB8ajfh6Il72wK{?z@)g#>)`zC2HurElUffMW zzG%7s&s`Hb4HOUWI+3?C_II!H#S0rh?w(fnRgm9r%hkw}r|h;SMjzXycVv>A*{pq~ z(|gm;9J19_S}|MQ;0qC<;`O5Q^sFcTw?%XQnr>`;5C=k#jr6`qcMiJsYq?-{7CC^*gpS+t<5S^rZTP z*fQNS)9n^z4)48nqxH2k`{NmmzS+kPSvXot9ec?1DAAFjvtxDCQ-iX_)ow@it}v{< zIdNn63R&sh3V#*`+C4jrcYx z$Q;$@PkMW{>C*2svzT4&J9!U;1e6_iy*>B-hTk3GZOqv}@+Uto=xov3xApo`hTP2?CbN0r)yxMo){9Q6CIX27b3V#d@5_C7+>@s)dM=w{2q#J#W8})B} z>^%KwSjxOM4+MN+Qs@aT?>@E58QHJ`8xY*x@mpy3A>2(QxE=W zuJzMjzUkh{^42eY;Z_FMoXc8oCzMTJ&0SNz|K7Xu<43;ES9-ZiabMN%gLhch@B6WT zR?74bpXU`hotb{r=p+}%#otpzP6nOJS7rJ7@v8M?p&y}>JOe_#LN-2F%5f_4lcIaU zxlOGa(>$j9DzrO4ea%dS6E-#0t*q6oR|;?K@Hce2kPv9!xhnLdMi!6cqyDajVwI3DE zF11hfY>!a=X)e##o$xE-ozsQP2EPMh_AdGyD;IR9db2KMdlS8d>*h|URX5yLO=ywY zaC*~r^^1keueQfZ3+*<@Hs2Zgfc1$~)$?ZKUtT?@Oy}rKK0hZRc)It@4y%>B4Ew^5 z&rUkj8vD3r=Y_0A>axB^eD#vfSEn!07Eu0Jbj5n2xm2SfbKq3gwZXIU7K+@n^18fn z@6=_BE46zU-SoQL`Ou5GjA2pJ%%y(W)*G1%Ww%PcxL0NTVUOtX4>@NgpA=kmWL~bg z`sH@N^4%Mm3w7_leDQDB<&S?#-9HN4efdOYS8+t1Zfe-dU1dFwSv%#Xs9wI9b8z*h zWIc`ZXJ$B=Z%VovJUgy9!R$=$i?!;u+|Sfjq#w9bP_(!0l>YBieP_4tf3q?D2iNlHvuk$6E(`ab)iCS%&*QtJKR*(w^50o@`;=M5oN!sQ z)^y*O*2RUqjxX4XcSJmn`SWvyL5wlqoi3>@VyDXH<^*rg`4MYmdg-HfR#v86jKihg zc%FMdI)3bX=(*d;MCs;^|7v*~kGl9Jr0f@}wmkj(7W2mIFQ+eC(Px)+Dy}}+zhw8^ zOQ#<$(abhDvq6r#N#Np#wWmV;-|kGkU7mdS_=h`^zn=UHv$@99X8E_MW^Q`$3N2$b zqj+ES>L<5D&S=7+E22tUcIfl&aJeftLy2J=W^xzD+*sDXt6I^@1)HE z^};hzwa3616>EfDym4;`Zzu~J|Xj6UB;iYKjn#elMxt#|> zF7s~Mu=lM0)Xnct#PB`YEYHvAVRy2C`OfK;Ytn9{UELMpy<*kT@S4r5JCgquh;(jm zzCP*hlw&1&yU#>)E@@_c_kKr!&BYZGsyj~PZrl6zs?*Fpa|PMWFBo%ry=vvV@P6vT z6i>S;thf9NRGVTpzV8sNozOgOwSqx$`Z97pM7xtjB7jIOzG#;yY}?b z)X&lOz6}L8pYHzVAZ9qlxBS@$#X!qLTGeM`PP?&fes#(r&qjsg+T=R^j>HKXrU|u& zWqNNoxEx#X{}T_Z?DO*OnKf_jrGD8XwrHRA{|S-aV(PPnE@^3$PtgiGY81UEKC|UU z`}~#HP0xh6YX7o~o#daA79)CcQADfWb%`?%GMllKA4|PfzFUNWCWMxO{+ds|x8lC? z#M>L{ZC+00pEGT%yrN3nC-V!DFS}B|KJ}Lp^0HqsY42YN*UulAWFt)fO=wfyWWg7d zqH(OUv>b;kitbEYsmRYT&*ny0hhqNw9JzZe4kok0Ywt@Exg{A78vJUes zojP-uaI7x5d~u5K422TV2)RGM)ybDP9o1*V7hSmGwqxV;=7+m)R)54( zN1j1u(Vu4SPCqRp!WtHSRZ#2ABI#f2(zYbspA`D@c-A~|rug;o57UpllG^ik*^hs7 zbKi&UU+n(ot>dm-->J6NNxN6`YSpmsXiD<_mvQ*V59_eQ8rvOQG|z7a?UUKNPn@;n zmtg($CkN!jo0YmJ_1dx7@NTx6-y1IBx7PQ8IZM98p^Ba?)m(!O(-+=q&{A2u)BhLi zd>P?KW%@7Y9ZN0q{{E_l_xzdj-6m2wbK7FG+b8A77B^4&6L5Sd%NDMc4@(e>u+BPy(+Gl+HvlGk4>W4<0Zd3vf@*0X6hHI_`f zIpxp8gM06`@f#h!c2kw}qQOGb<7;g=f1Gu_mz39M$$xQ^)lE&FKhkn97wo@2t3xEP zhHuf{*!4XJG*z@2t|Zp((UV@Bc7dD4@Ln#{uYm3QtNV(&GS2Yxopd#A+|1PWNO6yy zc!JB9OorwUvl&yi7j@t3Wt^ew@IS?%@-$!7w{tIlGm31nKfOYJSH=8UJLcri)DUx? zp|<&4b^2d6>7`O^S3k@Zdh+8@jnOWNeYJ&!f2z*#yD;q2W?yk`=1hIl{i_1G+T+TW z*1fv+^o2&&hOaw5Fe+_}txj6?F7?xU>Fu2h4w_l|7zmyAUH&pxar#u9$=bJ9KMiu% zDP8(TCqv`*kuHsA4K0}q%I3cfW!n+|;mcQN)#N8tlE0*$nn@k3;+egQ&3yaMO&v?r zcBt&x;>X38x~4El;$LH$pOd<_htS-0yK>I=oXFymE?x4GX^nXIbe@dFwpnw(J-oMV z+WCvu*Pgm-y30khv{X0Ye$DpY)-_$`QD){!(&ujVr62z3o@-WaaOQcj@V(>%i5jMx zXE_OOmU45Mf6b8NeCOQ7Qo*}}dFM(T{t)K!fQ5fzNot7yCySo@ChI%jUEJ08zYu@m2PljVr` z)ZcGEJP-f+IDBhF?wWUrn`-7a?J`}oKxo5C!`YLz`G4IU$uLR&rr6w0^S~pU&U+|b zvPpb7Bk$%J*MRiQSS!vS-fDaDxu(Cn{dK)-`?s~tx%0lRKf>^Rt?NBTkqN)I1@6hN zo_=<-k~i}cr+}L5$FaxvYYE?r*1FHilA~O|V!PzNs)mFgpJGmR&-Z)IU}s>+Q^0z37-%c8Bcc6$kuO2#SN!k! z-=*%p+Ue;Mhf7&kuhtb1O_Qq57eni%!Vx z|6ct)@j2JJ{rlr`pER{rB*q+Mj_iB)P|9kdzq6M41+M2NDi@;GF}oY}sqk*QRbUnG zp<%8Sus$q*{m1jNK4L0q@TxEYO(Np^R#U#a$n6~Wyn^wG`na{`mmJY+3VTu|3r?qwOBLqTtClP zy3jjTh^y%i->I2R+rY}*8kEuV|@ZS3F zxhH{{_uu*aTKiGrR{@)HKAh52>rDBX zq4ZsEo|xLk>g0p{rYc2;^ck&cbtcLv-n!!cqwIjh_6PGgSDvUg3wgaY>g%qu=(Ujs zvbRrZIR8w%_420qivOk@(=SgI@!E6R>0~5>cY5oqHo5B1muII|%|KIjoWRN@d;7OctLBjapwL@+$WvtmjzEqIt=sYnQ%ix%p*-guZqz z*Az{~Stg~ERQ*@4e0kZun&;TO8*8JzmTJfH2d-+olkmPH`>kcdJMpHPC1;jq#79#h>N>oj}I{#7{4i(o$L$Xd(iQF-m9Is4}2=jRqa-*(6T%8@l2R6*Sb01-c}me2%i`6)`|dAVaP4(y zf6MC^3hzppPR$f+*mpN(C~<<6L8)oQL7|1tKoiSpNw_kEH*K|L1_6snxO zH!W=4>m5h;2gZtYuL&=TlyTp^{*Bq%8$4^aEDwBLeEQw0(;S9r8(S0d`uP0}wtcwj zsumX%@?z;jj{ClA?tTjQ^trQ@F@^0T2f2!N|U0&Ii^OhX%ugRMYwoh5E zne=>xNL2R`Yu*|Qsgn7(nva#NnfhD$8qZdl6;^k)UZ}5k^?3Pto5mhpuKeyp^;Ll$ z*I)lnjP>YWSux|i+SE%be;+Op<~s9ee{Puk?0IJoif|{cj+*{s)5&WQ+RlD07cPJ4 zS-I`C#`6nv=G9u?GESc@=TiA}apn}S4WI5Ex$U=pQG(2mmMM}OrO7rt`K4~^`FYodP@`YOwI-!zt2Q@c~C*cf>-;oA-FnH%gX zd+q$*%$(!4RpGNQzpUbPtEZQqdnHZg==|&c)Q4rY&c$M@<^Q&wJj&U3OQ*C?>0ACY zxxSyfS%0l*4VrU7^`ztEqDO8jlDDO})#ofO)tOLIIx#oeO7W*_S=g7nMN_V4vu{#f z{L}9b&wHECclA_~JAWGJU(a9t{=HUMPTPcuu^diJj!6yu%QD|M?Gark_GfLZ#}v~& z7p_ikF*|o%Ng=*gJDm07F5eF!dgfVeN*2} z+Y@0g|J@7F_`Bf)^CtezeHEPAw+?r=2aT4mA|v78wdD=3#hLmS>#kXu{ZpdgtI&fc zE$@xnnbY+)z2V(`KcloT{)j^VxjSov4$I!1a!a6(h3op1ta-IHX4PH4rT-^iJaq6- z&4)~fN&n|b)ia@1^#6)K5Y(TvXss>7+?hR^Jy)EcoZ~#6slswJYt{U_9&;`P>1I4)6XEnfW;N+Mx2{K4 z5%c>49J93j{ifG!<**T)*e0U8sM04Zt1jltF#+k06JIko?D+n)W!)1OmW>Qsxo_5p zpKo#h?(JM~PO2w}_eD(O`qfLh{5(ANxPMVuB(Z-bC)>&iQx^MbE$Uhw`L-kEL`vw3 zT`E6PT_bO2{ygQ-pOSFnTnI;YS^~%Kc}w44-n+n6XBqc>Hui*<%U;KPJI=SYYJ16L zDZXgi=igW&T)5Xi@>H4g#O8~t#NlNpcm<41S({&<+fd8dbuIJzs@HcmeS03e{JLcC zi#_&B#CW5em*19)-`Zv(!O#9TaJid_&>E55?^Ewz64~>Ni|EybOPnA4VxL#CST%&-=Ifc2>z+w!#<#tDV!h+X$s`1S6nQ=M&)k=p5W`mxXmEGHG zgC#y5Tl#))!?(S2S;DHHwZ(+aUzyjtMLN^{+|gIp*A`6PZa(vIr{-5@L6NhoLhK`# zvd7<5HY}cK_Vm-I<4iMsT~Fs|NlX#W-FaY{@8jZ}tUakyCw!~S$j*&Fy6Aka*5!)R z9A=H3T+?g9weDOw*0?@~Urqf(lN4Lrj+-swyoNs>U6o>tl-{&iV7iyu(ro30`;}%) z{WL2zb@n%Dot)G^t=8h2#mgpa-1FV_>9X6_ukYWfecQKddHCF{b0soomZ&?-eX%D} zZtL2dJ6!xL;?CTXR+Go-&4G#dZ)0FUO0zill+3; z2M%Z2HPx|h;XnFDeup3e;_cVR( z&f4akJv~3Jd}HXXL-{MC(3AsLi#yyVs$FiEr9Wxt{)+2QQiI|Eib6a#hcQ^AD>^pUfK}zwf)6Wi;w@V|%Ti zYRO)>Sh#myW};QuDpun&*BIk%yCc%O5~^mu>nXn}GTL;GiGAYq z62|9`{nBh^{1E*-WAY@~+^If>AG7*%KQr>3d^~lP^`!d8X2NO5zATRD&+dBdaKecF zmP(}Iyq!IMY;7~Q@2NeNp!h@7x?H6B`r;p-WtX#yzucW)`FE;K`N{Jd%exxoOf2oa zPcK>WA<=1SXm727g_@dm;|4Dr)Tayzg-Azglw{b*-&aZ`r86zIk(| z?DF=9zZ0+SI+RiOu__`+(l((Z;CYbu^`v$FLBh{c7q=KsQ#20V8a9us{a;SQ?~gx> zCpE2`Yn{C>@YNnU=E+XiR;;m%3~Y)o_HMcL4rs9iGbDb z0?CkBKF@N)vr62=`j%U4O68p#Z#QkWZU5Dj){>mI!yEUS z=vc9S3}qB+t8AU@=I=P^yzaS_?0?5>g=5-dBx@zQ_Z7^|;SMg%WxjT+>3h*@nZFl* zo=sp|slTOlHRd{Q-z%(S>R<;l!a&LuU;|8$L0 zzr1`jVdHjDKgHsV$2B(5C#N5odH?d0chU3g?%ywY^7wL#qf>qOo-a2H=V*!;w>R{j%HN=_lesUB9$h(g z>g)SQ{UXZEKhz<$chr0A9sb{a%B8@?z+kC`YhWWF2$udh12p_WxU_J@h ztlnP|_BPE;G-m$y-*UxF>F>{7TmNs8)elFj#^_B_cMnKroI6yc^ItUN`NblR6{~x5 ze_e5%AQroS*R{u&+PzkD`9|8YCwnrTS?K-WIc;A_Q^T=KpAz0)a=#wKSQoRSrNLeN zU-!#N{vW)|4UAihTXCD4CRk>saOO*m+iN+<<+HR})4G}-? zw5C6*`XM{ZLm@#ZU=3sG!lYk5IpQy7Ees937VfY+$ME&eS^1)Knx7VI^4{f^JIzDj zYxTw)>18Zta*;W2q=FnGc3kh-eeedu(*F$KPh~9m(%bIO(S7gG@+UJnysl;CMtew< z7WuNrx`}%%Sl$;^-m&mbM(o*&giGZni`T!hDq&L&NLbOsv)1&Tma;^j`{BlQ*BDC< zwIn^$-lnTF;ab-s#^*=Ob#Dt>*)OoRopNU0;Y&4YFRn>$oENAkoF-w|{`1VTbIR8R z61S`UVY$X6^XmG8qgxF;YG!>^OUnNndHBcNtJwuN9TYBCZo2qlSN{W#MajAoYK||v zvi2bF*BZ8a!47$5QlBCp$K+i}SflNu*?BW@4X=CYl>a*@Ob&kvqvL# zi+!y5aP7!8TakM+FN=%4DNz+kW4ZD1)*M^KqmTcqaK`$?#xIHZlDcN=i!9f<9~^3o z&#d&d>D=r-!R(-onjDM4`yqQJsA#9*bZ1`EE1kX-%eGEi_SxgzhUYhLxM=aTu6!a? z|JW)cX5oiepS#Sx%f2daZVlP>!idrSNKlL2!=;>iKR$F?ckt+YqagpEM!zO3W0;y2 zdh6|D7l*7|7WWKLahC@9z_-Ds6X+Jhy_R|+q&+bJo1Y=Qm3|Lw{$s!rj(8NfLZzioQzb-toN6Muh2vi=lRcP>A*z_6RV$;Yg|ocdjLYJXpcxl;G#{6h)s;?i-!zr6O> za$FL8IwSLJ%HtBh{e^4!-xuDFRQ#TGL{i|(nT;vTi=wOM)OdYWQc`~V?VQGhg6g}E zk5oi=?zZ@lb1Yi(8r#xs`D+&*;$+#N)5UyZkyD8Ib&c~i_RKQgqURSIUz@mn?V34U zhF23!lWxCwJg?<-wqWAKzlVR^6PvpwnoFtRO7O1T$)4f8PVw*gUkm(x@Pk8N`Z$|2 zU)+Vb_D3+^!c$L;GmK6UN#zp1Ye#Ju}E z$LE~Jhh;u~=Xe6e-Ydt=IC_Jt_4A{jl|H9fj{e?Y7jVV8?yQdX)||_qH%(@fUf}vc z>33N8#Zr~4+djnkMJ+pScJq3tZ_?b$7w7Ao@pgOKotba&`G;oJf>YuVo`146_G=r* zZ)jcTp14hAvwGdj{QhH6v(J|qEdG}ERN=zx%FR4kGyBd52pYPxZToUA(EiH4wJ*8+ zF6TaMc$Gi(*z@xbj|IOFop@ed;;b$M`VHfsZ-PTY~Am=?fi#_0XOf- zYe`R&5J}feV0kBZvgn5UMFq3?%#Naup+SsoUwoVAXM_jpq&>f~UgqI#v!lThC+jp8ME0FD+U+g=HOa9hI{&$AU|h%k zERG#pv$CNoYXHE%xYFyxG z$`vNHX8FrEUp1?>7kp7W+x@BR{j{j(M`8j6gZ8&S3oY_pZgH(^f2V7etc=mSQxCU& zIX+$Z_foFP1u^VhTNi8e2kc7Uv|DF+{+p9sGd`~>c8}d75`BBqBcXr7ocY2v6$cYr z_ExWZe1HFGC1!yWcjhYdB+XWrKet|wiOp&K-A=9NSMRO%{`qRfE$N7010H?7>a=&; zZUr8TRi1Te<`IkDvk^+N|2`>A`0-~|<&-0TbaT!$hMjXu>;I$6s{i%wj339ZFWMq9 z)4<9`Vsfy9l!9sEQu*WTP0Vo*-k(}3AMo({ndNSezdt+be`@)gsQ3Rhm)CiDiO$gb z!Fl4Iilu_`()gr+j(!fw*#FxUA3i#v`0$VJS&Q2?_g<|HQT}ggBidV{t|#ulXOZZB zx#aaZhs*sq|8m>x_#XBd|I3OPU;{NcOEyi|z{17AFiR6x zgVWcYP=hn7I{%S}(0}RrE~^Q82F@1FamCiNqb(hTvMW!vbruyXr!3&yCt<$HS8n<5 z58-!nA8&8GX?r%W%(SVj^y>P1S97%remyMt{BG@vUil?lcP4HvV_v@CmiJ||z2z@% z`7iTbu=`$Ao4c$^=H;`ylkL{ptk{-)VbW7$iS-@(i=SMmpS)8&bV9)%qu3i3Urric zYmlGLr}*H~((hRoPmK3m);+^3EwjlW_Pk+wbbrIk#zg&p$5_|CJQTBU^U}3@75FMN zjw+wK#k%WB{5v*bk!<1P8xpq6jeI6k^=!@!y@PkzPNikP>(WX1cFz2c5zDTAhCIzr zrZ$sr&2OCX<4&Xaqa8nFqfQ(Ue^k7NxpYBR1#StytBf#^v{V4_g6i348Q)cY(*oJva9s!x1RnN z6HG3;Iq$vAaDkKg=$YyH(Gg1POxZ>g=@y>N#-)7hUgKl|ieOI!qLb1wS!UaI52$eo?Zc{bBK=Lg>| zUcs9EnA5q+S?9Ftjc-l+HW@6>-q@>~+w;@-ljT4ENf$O=`RJ1LcAw7`v)J`3Wpz68 zlatc~&0W7JD0nh1;XAlSP47pE{1N8KKC$OND4h5p%mK{wHnv-uB6ljmi<){ zlf~AZdU)wboN$lmXM4^vWsxTm%f#blKW!-z?!Knfek&>^Z-Q6~=V9KB%26TN_MS`C zyU!WCIrP-(h{P2|y^QV3tPA-(A5IE6q;NNK-^Fb!yxZ2SVBvVwAtAR-IVO>N>4)s( zr06RV3Pp|*laFO4YkPjOi1U+=@5-65sEAp6nwQN7DXWkBBqDyD5==c+YLRQ?xNu+j zF)N01Wi!@w3P#oju+M#X_)GVy)#iKia*vlJtv|zh@GeunQG&E)`*NFx-9^mG&51?< zLGK>FF*>Z-ESr zv4WQi53~H`IL-B|WxC{-V^4R+w14(DD(bH+`mVTBe%0DpA#WafXsnV|S-0a@cjwcY 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 LLm3!kUxT;+bB9h$ literal 0 HcmV?d00001 diff --git a/project/jni/application/gemrb/AndroidData/scripts4.zip b/project/jni/application/gemrb/AndroidData/scripts4.zip deleted file mode 100644 index 542fce81c9200d369998a919438c0f985248f5f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499584 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 Sh?D-;Hs?2cy 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

B+gbFN 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%0A#m2YnnIB!U=F(TjdCz8+1uW33Ul5VQ=iHNV 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

JW{lewc*!hh4VUBEvs91 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 I&cMI`084Pz6#xJL diff --git a/project/jni/application/gemrb/gemrb/GemRB.cpp b/project/jni/application/gemrb/gemrb/GemRB.cpp deleted file mode 100644 index ecb6d5f24..000000000 --- a/project/jni/application/gemrb/gemrb/GemRB.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -// GemRB.cpp : Defines the entry point for the application. - -#include "win32def.h" // logging - -#include "Interface.h" - -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -//this supposed to convince SDL to work on OS/X -//WARNING: commenting this out will cause SDL 1.2.x to crash -#ifdef __APPLE_CC__ // we need startup SDL here -#include -#endif - -#ifdef ANDROID -#include -#include "Audio.h" - -// pause audio playing if app goes in background -static void appPutToBackground() -{ - core->GetAudioDrv()->Pause(); -} -// resume audio playing if app return to foreground -static void appPutToForeground() -{ - core->GetAudioDrv()->Resume(); -} - -#endif - -int main(int argc, char* argv[]) -{ -#ifdef M_TRIM_THRESHOLD -// Prevent fragmentation of the heap by malloc (glibc). -// -// The default threshold is 128*1024, which can result in a large memory usage -// due to fragmentation since we use a lot of small objects. On the other hand -// if the threshold is too low, free() starts to permanently ask the kernel -// about shrinking the heap. - #ifdef HAVE_UNISTD_H - int pagesize = sysconf(_SC_PAGESIZE); - #else - int pagesize = 4*1024; - #endif - mallopt(M_TRIM_THRESHOLD, 5*pagesize); -#endif - - Interface::SanityCheck(VERSION_GEMRB); - core = new Interface( argc, argv ); - if (core->Init() == GEM_ERROR) { - delete( core ); - print("Press enter to continue..."); - textcolor(DEFAULT); - getc(stdin); - return -1; - } -#ifdef ANDROID - SDL_ANDROID_SetApplicationPutToBackgroundCallback(&appPutToBackground, &appPutToForeground); -#endif - core->Main(); - delete( core ); - textcolor(DEFAULT); - return 0; -} diff --git a/project/jni/application/gemrb/gemrb/core/ActorMgr.cpp b/project/jni/application/gemrb/gemrb/core/ActorMgr.cpp deleted file mode 100644 index ebcee7124..000000000 --- a/project/jni/application/gemrb/gemrb/core/ActorMgr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "ActorMgr.h" - -ActorMgr::ActorMgr(void) -{ -} - -ActorMgr::~ActorMgr(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/ActorMgr.h b/project/jni/application/gemrb/gemrb/core/ActorMgr.h deleted file mode 100644 index e072defc5..000000000 --- a/project/jni/application/gemrb/gemrb/core/ActorMgr.h +++ /dev/null @@ -1,42 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ACTORMGR_H -#define ACTORMGR_H - -#include "Plugin.h" - -class Actor; -class DataStream; - -class GEM_EXPORT ActorMgr : public Plugin { -public: - ActorMgr(void); - virtual ~ActorMgr(void); - virtual bool Open(DataStream* stream) = 0; - virtual Actor* GetActor(unsigned char is_in_party) = 0; - - //returns saved size, updates internal offsets before save - virtual int GetStoredFileSize(Actor *ac) = 0; - //saves file - virtual int PutActor(DataStream *stream, Actor *actor, bool chr=false) = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Ambient.cpp b/project/jni/application/gemrb/gemrb/core/Ambient.cpp deleted file mode 100644 index db543f474..000000000 --- a/project/jni/application/gemrb/gemrb/core/Ambient.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Ambient.h" - -Ambient::Ambient() -{ -} - -Ambient::~Ambient() -{ - unsigned int i=sounds.size(); - while(i--) { - free(sounds[i]); - } -} - -void Ambient::setActive() { flags |= IE_AMBI_ENABLED; } -void Ambient::setInactive() { flags &= ~IE_AMBI_ENABLED; } diff --git a/project/jni/application/gemrb/gemrb/core/Ambient.h b/project/jni/application/gemrb/gemrb/core/Ambient.h deleted file mode 100644 index ec4f9be22..000000000 --- a/project/jni/application/gemrb/gemrb/core/Ambient.h +++ /dev/null @@ -1,77 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef AMBIENT_H -#define AMBIENT_H - -#include "exports.h" -#include "globals.h" -#include "ie_types.h" - -#include -#include -#include - -#define IE_AMBI_ENABLED 1 -#define IE_AMBI_POINT 2 -#define IE_AMBI_MAIN 4 -#define IE_AMBI_AREA 8 - -class GEM_EXPORT Ambient { -public: - Ambient(); - ~Ambient(); - - /* there is a good reason to have these in the header: - * they are automatically inlined, so we have - * no roundtrips and no overhead for accessors --Divide */ - const char *getName() const { return name; } - const Point &getOrigin() const { return origin; } - ieWord getRadius() const { return radius; } - ieWord getHeight() const { return height; } - ieWord getGain() const { return gain; } - char *getSound(ieDword i) const - { - if(i sounds; - ieDword interval; // no pauses if zero - ieDword perset; - ieDword appearance; - ieDword flags; - -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/AmbientMgr.cpp b/project/jni/application/gemrb/gemrb/core/AmbientMgr.cpp deleted file mode 100644 index a998eb86a..000000000 --- a/project/jni/application/gemrb/gemrb/core/AmbientMgr.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "AmbientMgr.h" - -#include "Ambient.h" - -AmbientMgr::AmbientMgr() -{ -} - -AmbientMgr::~AmbientMgr() -{ - reset(); -} - -void AmbientMgr::activate(const std::string &name) -{ - for (std::vector::iterator it = ambients.begin(); it != ambients.end(); ++it) { - if ((*it) -> getName() == name) { - (*it) -> setActive(); - break; - } - } -} - -void AmbientMgr::deactivate(const std::string &name) -{ - for (std::vector::iterator it = ambients.begin(); it != ambients.end(); ++it) { - if ((*it) -> getName() == name) { - (*it) -> setInactive(); - break; - } - } -} - -bool AmbientMgr::isActive(const std::string &name) const -{ - for (std::vector::const_iterator it = ambients.begin(); it != ambients.end(); ++it) { - if ((*it) -> getName() == name) { - return (*it) -> getFlags() & IE_AMBI_ENABLED; - } - } - return false; -} diff --git a/project/jni/application/gemrb/gemrb/core/AmbientMgr.h b/project/jni/application/gemrb/gemrb/core/AmbientMgr.h deleted file mode 100644 index 0b6daf122..000000000 --- a/project/jni/application/gemrb/gemrb/core/AmbientMgr.h +++ /dev/null @@ -1,48 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef AMBIENTMGR_H -#define AMBIENTMGR_H - -#include "exports.h" -#include "win32def.h" - -#include -#include - -class Ambient; - -class GEM_EXPORT AmbientMgr { -public: - AmbientMgr(); - virtual ~AmbientMgr(); - virtual void reset() { ambients = std::vector (); } - virtual void setAmbients(const std::vector &a) { reset(); ambients = a; activate(); } - virtual void activate(const std::string &name); - virtual void activate() { active = true; } // hard play ;-) - virtual void deactivate(const std::string &name); - virtual void deactivate() { active = false; } // hard stop - virtual bool isActive(const std::string &name) const; -protected: - std::vector ambients; - bool active; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/AnimStructures.h b/project/jni/application/gemrb/gemrb/core/AnimStructures.h deleted file mode 100644 index 9692cf947..000000000 --- a/project/jni/application/gemrb/gemrb/core/AnimStructures.h +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ANIMSTRUCTURES_H -#define ANIMSTRUCTURES_H - -struct CycleEntry { - ieWord FramesCount; - ieWord FirstFrame; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Animation.cpp b/project/jni/application/gemrb/gemrb/core/Animation.cpp deleted file mode 100644 index 4d58f1fdc..000000000 --- a/project/jni/application/gemrb/gemrb/core/Animation.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Animation.h" - -#include "win32def.h" - -#include "Game.h" -#include "Interface.h" -#include "Map.h" -#include "Sprite2D.h" -#include "Video.h" - -Animation::Animation(int count) -{ - frames = (Sprite2D **) calloc(count, sizeof(Sprite2D *)); - indicesCount = count; - if (count) { - pos = rand() % count; - } - else { - pos = 0; - } - starttime = 0; - x = 0; - y = 0; - Flags = A_ANI_ACTIVE; - fps = 15; - endReached = false; - //behaviour flags - playReversed = false; - gameAnimation = false; -} - -Animation::~Animation(void) -{ - Video *video = core->GetVideoDriver(); - - for (unsigned int i = 0; i < indicesCount; i++) { - video->FreeSprite( frames[i] ); - } - free(frames); -} - -void Animation::SetPos(unsigned int index) -{ - if (index=indicesCount) { - error("Animation", "You tried to write past a buffer in animation, BAD!\n"); - } - core->GetVideoDriver()->FreeSprite(frames[index]); - frames[index]=frame; - - int x = -frame->XPos; - int y = -frame->YPos; - int w = frame->Width; - int h = frame->Height; - if (x < animArea.x) { - animArea.w += (animArea.x - x); - animArea.x = x; - } - if (y < animArea.y) { - animArea.h += (animArea.y - y); - animArea.y = y; - } - if (x+w > animArea.x+animArea.w) { - animArea.w = x+w-animArea.x; - } - if (y+h > animArea.y+animArea.h) { - animArea.h = y+h-animArea.y; - } -} - -unsigned int Animation::GetCurrentFrame() const -{ - if (playReversed) - return indicesCount-pos-1; - return pos; -} - -Sprite2D* Animation::LastFrame(void) -{ - if (!Flags&A_ANI_ACTIVE) { - print("Frame fetched while animation is inactive!\n"); - return NULL; - } - if (gameAnimation) { - starttime = core->GetGame()->Ticks; - } else { - starttime = GetTickCount(); - } - Sprite2D* ret; - if (playReversed) - ret = frames[indicesCount-pos-1]; - else - ret = frames[pos]; - return ret; -} - -Sprite2D* Animation::NextFrame(void) -{ - if (!Flags&A_ANI_ACTIVE) { - print("Frame fetched while animation is inactive!\n"); - return NULL; - } - if (starttime == 0) { - if (gameAnimation) { - starttime = core->GetGame()->Ticks; - } else { - starttime = GetTickCount(); - } - } - Sprite2D* ret; - if (playReversed) - ret = frames[indicesCount-pos-1]; - else - ret = frames[pos]; - - if (endReached && (Flags&A_ANI_PLAYONCE) ) - return ret; - - unsigned long time; - if (gameAnimation) { - time = core->GetGame()->Ticks; - } else { - time = GetTickCount(); - } - - //it could be that we skip more than one frame in case of slow rendering - //large, composite animations (dragons, multi-part area anims) require synchronisation - if (( time - starttime ) >= ( unsigned long ) ( 1000 / fps )) { - int inc = (time-starttime)*fps/1000; - pos += inc; - starttime += inc*1000/fps; - } - if (pos >= indicesCount ) { - if (indicesCount) { - if (Flags&A_ANI_PLAYONCE) { - pos = indicesCount-1; - endReached = true; - } else { - pos = pos%indicesCount; - endReached = false; //looping, there is no end - } - } else { - pos = 0; - endReached = true; - } - starttime = 0; - } - return ret; -} - -Sprite2D* Animation::GetSyncedNextFrame(Animation* master) -{ - if (!Flags&A_ANI_ACTIVE) { - print("Frame fetched while animation is inactive!\n"); - return NULL; - } - Sprite2D* ret; - if (playReversed) - ret = frames[indicesCount-pos-1]; - else - ret = frames[pos]; - - starttime = master->starttime; - pos = master->pos; - endReached = master->endReached; - - return ret; -} - - -void Animation::release(void) -{ - delete this; -} -/** Gets the i-th frame */ -Sprite2D* Animation::GetFrame(unsigned int i) -{ - if (i >= indicesCount) { - return NULL; - } - return frames[i]; -} - -void Animation::MirrorAnimation() -{ - Video *video = core->GetVideoDriver(); - - for (size_t i = 0; i < indicesCount; i++) { - Sprite2D * tmp = frames[i]; - frames[i] = video->MirrorSpriteHorizontal( tmp, true ); - video->FreeSprite(tmp); - } - - // flip animArea horizontally as well - animArea.x = -animArea.w - animArea.x; -} - -void Animation::MirrorAnimationVert() -{ - Video *video = core->GetVideoDriver(); - - for (size_t i = 0; i < indicesCount; i++) { - Sprite2D * tmp = frames[i]; - frames[i] = video->MirrorSpriteVertical( tmp, true ); - video->FreeSprite(tmp); - } - - // flip animArea vertically as well -// animArea.y = -animArea.h - animArea.y; -} - -void Animation::AddAnimArea(Animation* slave) -{ - int x = slave->animArea.x; - int y = slave->animArea.y; - int w = slave->animArea.w; - int h = slave->animArea.h; - if (x < animArea.x) { - animArea.w += (animArea.x - x); - animArea.x = x; - } - if (y < animArea.y) { - animArea.h += (animArea.y - y); - animArea.y = y; - } - if (x+w > animArea.x+animArea.w) { - animArea.w = x+w-animArea.x; - } - if (y+h > animArea.y+animArea.h) { - animArea.h = y+h-animArea.y; - } -} diff --git a/project/jni/application/gemrb/gemrb/core/Animation.h b/project/jni/application/gemrb/gemrb/core/Animation.h deleted file mode 100644 index 5c32424cf..000000000 --- a/project/jni/application/gemrb/gemrb/core/Animation.h +++ /dev/null @@ -1,73 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ANIMATION_H -#define ANIMATION_H - -#include "RGBAColor.h" -#include "exports.h" -#include "globals.h" - -#include "Region.h" - -#include - -class Sprite2D; - -class GEM_EXPORT Animation { -private: - Sprite2D **frames; - unsigned int indicesCount; - unsigned long starttime; -public: - bool endReached; - unsigned int pos; - int x, y; - unsigned char fps; - bool playReversed; - bool gameAnimation; - Region animArea; - ieDword Flags; - Animation(int count); - ~Animation(void); - void AddFrame(Sprite2D* frame, unsigned int index); - Sprite2D* LastFrame(void); - Sprite2D* NextFrame(void); - Sprite2D* GetSyncedNextFrame(Animation* master); - void release(void); - /** Gets the i-th frame */ - Sprite2D* GetFrame(unsigned int i); - /** Mirrors all the frames vertically */ - void MirrorAnimationVert(); - /** Mirrors all the frames horizontally */ - void MirrorAnimation(); - /** sets frame index */ - void SetPos(unsigned int index); - /** Sets ScriptName for area animation */ - void SetScriptName(const char *name); - /** returns the frame count */ - unsigned int GetFrameCount() const { return indicesCount; } - /** returns the current frame's index */ - unsigned int GetCurrentFrame() const; - /** add other animation's animarea to self */ - void AddAnimArea(Animation* slave); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp b/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp deleted file mode 100644 index 941e963a1..000000000 --- a/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "AnimationFactory.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Sprite2D.h" -#include "Video.h" - -AnimationFactory::AnimationFactory(const char* ResRef) - : FactoryObject( ResRef, IE_BAM_CLASS_ID ) -{ - FLTable = NULL; - FrameData = NULL; - datarefcount = 0; -} - -AnimationFactory::~AnimationFactory(void) -{ - for (unsigned int i = 0; i < frames.size(); i++) { - core->GetVideoDriver()->FreeSprite( frames[i] ); - } - if (FLTable) - free( FLTable); - - // FIXME: track down where sprites are being leaked - if (datarefcount) { - fprintf(stderr, "AnimationFactory %s has refcount %d\n", ResRef, datarefcount); - //assert(datarefcount == 0); - } - if (FrameData) - free( FrameData); -} - -void AnimationFactory::AddFrame(Sprite2D* frame) -{ - frames.push_back( frame ); -} - -void AnimationFactory::AddCycle(CycleEntry cycle) -{ - cycles.push_back( cycle ); -} - -void AnimationFactory::LoadFLT(unsigned short* buffer, int count) -{ - if (FLTable) { - free( FLTable ); - } - //FLTable = new unsigned short[count]; - FLTable = (unsigned short *) malloc(count * sizeof( unsigned short ) ); - memcpy( FLTable, buffer, count * sizeof( unsigned short ) ); -} - -void AnimationFactory::SetFrameData(unsigned char* FrameData) -{ - this->FrameData = FrameData; -} - - -Animation* AnimationFactory::GetCycle(unsigned char cycle) -{ - if (cycle >= cycles.size()) { - return NULL; - } - int ff = cycles[cycle].FirstFrame; - int lf = ff + cycles[cycle].FramesCount; - Animation* anim = new Animation( cycles[cycle].FramesCount ); - int c = 0; - for (int i = ff; i < lf; i++) { - frames[FLTable[i]]->acquire(); - anim->AddFrame( frames[FLTable[i]], c++ ); - } - return anim; -} - -/* returns the required frame of the named cycle, cycle defaults to 0 */ -Sprite2D* AnimationFactory::GetFrame(unsigned short index, unsigned char cycle) const -{ - if (cycle >= cycles.size()) { - return NULL; - } - int ff = cycles[cycle]. FirstFrame, fc = cycles[cycle].FramesCount; - if(index >= fc) { - return NULL; - } - Sprite2D* spr = frames[FLTable[ff+index]]; - spr->acquire(); - return spr; -} - -Sprite2D* AnimationFactory::GetFrameWithoutCycle(unsigned short index) const -{ - if(index >= frames.size()) { - return NULL; - } - Sprite2D* spr = frames[index]; - spr->acquire(); - return spr; -} - -Sprite2D* AnimationFactory::GetPaperdollImage(ieDword *Colors, - Sprite2D *&Picture2, unsigned int type) const -{ - if (frames.size()<2) { - return NULL; - } - - Video* video = core->GetVideoDriver(); - Picture2 = video->DuplicateSprite(frames[1]); - if (!Picture2) { - return NULL; - } - if (Colors) { - Palette* palette = Picture2->GetPalette(); - palette->SetupPaperdollColours(Colors, type); - Picture2->SetPalette(palette); - palette->Release(); - } - - Picture2->XPos = (short)frames[1]->XPos; - Picture2->YPos = (short)frames[1]->YPos - 80; - - - Sprite2D* spr = core->GetVideoDriver()->DuplicateSprite(frames[0]); - if (Colors) { - Palette* palette = spr->GetPalette(); - palette->SetupPaperdollColours(Colors, type); - spr->SetPalette(palette); - palette->Release(); - } - - spr->XPos = (short)frames[0]->XPos; - spr->YPos = (short)frames[0]->YPos; - - //don't free pixels, createsprite stores it in spr - - return spr; -} - -void AnimationFactory::IncDataRefCount() -{ - ++datarefcount; -} - -void AnimationFactory::DecDataRefCount() -{ - assert(datarefcount > 0); - --datarefcount; -} diff --git a/project/jni/application/gemrb/gemrb/core/AnimationFactory.h b/project/jni/application/gemrb/gemrb/core/AnimationFactory.h deleted file mode 100644 index 2da099b39..000000000 --- a/project/jni/application/gemrb/gemrb/core/AnimationFactory.h +++ /dev/null @@ -1,59 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ANIMATIONFACTORY_H -#define ANIMATIONFACTORY_H - -#include "exports.h" -#include "globals.h" - -#include "Animation.h" -#include "AnimStructures.h" -#include "FactoryObject.h" - -class GEM_EXPORT AnimationFactory : public FactoryObject { -private: - std::vector< Sprite2D*> frames; - std::vector< CycleEntry> cycles; - unsigned short* FLTable; // Frame Lookup Table - unsigned char* FrameData; - int datarefcount; -public: - AnimationFactory(const char* ResRef); - ~AnimationFactory(void); - void AddFrame(Sprite2D* frame); - void AddCycle(CycleEntry cycle); - void LoadFLT(unsigned short* buffer, int count); - void SetFrameData(unsigned char* FrameData); - Animation* GetCycle(unsigned char cycle); - /** No descriptions */ - Sprite2D* GetFrame(unsigned short index, unsigned char cycle=0) const; - Sprite2D* GetFrameWithoutCycle(unsigned short index) const; - size_t GetCycleCount() const { return cycles.size(); } - size_t GetFrameCount() const { return frames.size(); } - int GetCycleSize(int idx) const { return cycles[idx].FramesCount; } - Sprite2D* GetPaperdollImage(ieDword *Colors, Sprite2D *&Picture2, - unsigned int type) const; - - void IncDataRefCount(); - void DecDataRefCount(); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/AnimationMgr.cpp b/project/jni/application/gemrb/gemrb/core/AnimationMgr.cpp deleted file mode 100644 index 7ddece946..000000000 --- a/project/jni/application/gemrb/gemrb/core/AnimationMgr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "AnimationMgr.h" - -AnimationMgr::AnimationMgr(void) -{ -} - -AnimationMgr::~AnimationMgr(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/AnimationMgr.h b/project/jni/application/gemrb/gemrb/core/AnimationMgr.h deleted file mode 100644 index 4bf90c61d..000000000 --- a/project/jni/application/gemrb/gemrb/core/AnimationMgr.h +++ /dev/null @@ -1,48 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ANIMATIONMGR_H -#define ANIMATIONMGR_H - -#include "globals.h" - -#include "Animation.h" -#include "AnimationFactory.h" -#include "Plugin.h" - -class Font; - -class GEM_EXPORT AnimationMgr : public Plugin { -public: - AnimationMgr(void); - virtual ~AnimationMgr(void); - virtual bool Open(DataStream* stream) = 0; - virtual int GetCycleSize(unsigned char Cycle) = 0; - virtual AnimationFactory* GetAnimationFactory(const char* ResRef, - unsigned char mode = IE_NORMAL) = 0; - /** This function will load the Animation as a Font */ - virtual Font* GetFont() = 0; - /** Debug Function: Returns the Global Animation Palette as a Sprite2D Object. - If the Global Animation Palette is NULL, returns NULL. */ - virtual Sprite2D* GetPalette() = 0; - virtual int GetCycleCount() = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.cpp b/project/jni/application/gemrb/gemrb/core/ArchiveImporter.cpp deleted file mode 100644 index 2c8524ff0..000000000 --- a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "ArchiveImporter.h" - -ArchiveImporter::ArchiveImporter(void) -{ -} - -ArchiveImporter::~ArchiveImporter(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h b/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h deleted file mode 100644 index fe464cb25..000000000 --- a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h +++ /dev/null @@ -1,38 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef ARCHIVEIMPORTER_H -#define ARCHIVEIMPORTER_H - -#include "globals.h" - -#include "Plugin.h" - -class GEM_EXPORT ArchiveImporter : public Plugin { -public: - ArchiveImporter(void); - virtual ~ArchiveImporter(void); - virtual int CreateArchive(DataStream *stream) = 0; - //decompressing a .sav file similar to CBF - virtual int DecompressSaveGame(DataStream *compressed) = 0; - virtual int AddToSaveGame(DataStream *str, DataStream *uncompressed) = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Audio.cpp b/project/jni/application/gemrb/gemrb/core/Audio.cpp deleted file mode 100644 index fa114c4bd..000000000 --- a/project/jni/application/gemrb/gemrb/core/Audio.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Audio.h" - -const TypeID Audio::ID = { "Audio" }; - -Audio::Audio(void) -{ -} - -Audio::~Audio(void) -{ -} - -SoundHandle::~SoundHandle() -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/Audio.h b/project/jni/application/gemrb/gemrb/core/Audio.h deleted file mode 100644 index 4606f38f7..000000000 --- a/project/jni/application/gemrb/gemrb/core/Audio.h +++ /dev/null @@ -1,82 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef AUDIO_H_INCLUDED -#define AUDIO_H_INCLUDED - -#include "globals.h" -#include "win32def.h" - -#include "Plugin.h" -#include "Holder.h" - -#define GEM_SND_RELATIVE 1 -#define GEM_SND_LOOPING 2 -#define GEM_SND_SPEECH IE_STR_SPEECH // 4 -#define GEM_SND_VOL_MUSIC 1 -#define GEM_SND_VOL_AMBIENTS 2 - -class AmbientMgr; -class SoundMgr; - -class GEM_EXPORT SoundHandle : public Held { -public: - virtual bool Playing() = 0; - virtual void SetPos(int XPos, int YPos) = 0; - virtual void Stop() = 0; - virtual void StopLooping() = 0; - virtual ~SoundHandle(); -}; - -class GEM_EXPORT Audio : public Plugin { -public: - static const TypeID ID; -public: - Audio(void); - virtual ~Audio(); - virtual bool Init(void) = 0; - virtual Holder Play(const char* ResRef, int XPos, int YPos, unsigned int flags = 0, unsigned int *length = 0) = 0; - virtual Holder Play(const char* ResRef, unsigned int *length = 0) { return Play(ResRef, 0, 0, GEM_SND_RELATIVE, length); } - virtual bool IsSpeaking() = 0; - virtual AmbientMgr* GetAmbientMgr() { return ambim; } - virtual void UpdateVolume(unsigned int flags = GEM_SND_VOL_MUSIC | GEM_SND_VOL_AMBIENTS) = 0; - virtual bool CanPlay() = 0; - virtual void ResetMusics() = 0; - virtual bool Play() = 0; - virtual bool Stop() = 0; - virtual bool Pause() = 0; - virtual bool Resume() = 0; - virtual int CreateStream(Holder) = 0; - virtual void UpdateListenerPos(int XPos, int YPos ) = 0; - virtual void GetListenerPos(int &XPos, int &YPos ) = 0; - virtual bool ReleaseStream(int stream, bool HardStop=false ) = 0; - virtual int SetupNewStream( ieWord x, ieWord y, ieWord z, - ieWord gain, bool point, bool Ambient) = 0; - virtual int QueueAmbient(int stream, const char* sound) = 0; - virtual void SetAmbientStreamVolume(int stream, int volume) = 0; - virtual void QueueBuffer(int stream, unsigned short bits, - int channels, short* memory, int size, int samplerate) = 0; - -protected: - AmbientMgr* ambim; - -}; - -#endif // AUDIO_H_INCLUDED diff --git a/project/jni/application/gemrb/gemrb/core/Bitmap.cpp b/project/jni/application/gemrb/gemrb/core/Bitmap.cpp deleted file mode 100644 index 2a55fa4cf..000000000 --- a/project/jni/application/gemrb/gemrb/core/Bitmap.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "Bitmap.h" - -Bitmap::Bitmap(unsigned int w, unsigned int h) - : height(h), width(w), data(new unsigned char[height*width]) -{ -} - -Bitmap::~Bitmap() -{ - delete[] data; -} diff --git a/project/jni/application/gemrb/gemrb/core/Bitmap.h b/project/jni/application/gemrb/gemrb/core/Bitmap.h deleted file mode 100644 index 2c37bdd87..000000000 --- a/project/jni/application/gemrb/gemrb/core/Bitmap.h +++ /dev/null @@ -1,55 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef BITMAP_H -#define BITMAP_H - -#include "exports.h" - -class GEM_EXPORT Bitmap { -public: - Bitmap(unsigned int height, unsigned int width); - ~Bitmap(); - unsigned char GetAt(unsigned int x, unsigned int y) const - { - if (x >= width || y >= height) - return 0; - return data[width*y+x]; - - } - void SetAt(unsigned int x, unsigned int y, unsigned char idx) - { - if (x >= width || y >= height) - return; - data[width*y+x] = idx; - - } - unsigned int GetHeight() const - { - return height; - } - unsigned int GetWidth() const - { - return width; - } -private: - unsigned int height, width; - unsigned char *data; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/CMakeLists.txt b/project/jni/application/gemrb/gemrb/core/CMakeLists.txt deleted file mode 100644 index 2d6c8dec1..000000000 --- a/project/jni/application/gemrb/gemrb/core/CMakeLists.txt +++ /dev/null @@ -1,139 +0,0 @@ -ADD_DEFINITIONS(-DGEM_BUILD_DLL) - -FILE(GLOB gemrb_core_LIB_SRCS - ActorMgr.cpp - Ambient.cpp - AmbientMgr.cpp - Animation.cpp - AnimationFactory.cpp - AnimationMgr.cpp - ArchiveImporter.cpp - Audio.cpp - Bitmap.cpp - Cache.cpp - Calendar.cpp - Callback.cpp - CharAnimations.cpp - Compressor.cpp - ControlAnimation.cpp - Core.cpp - DataFileMgr.cpp - Dialog.cpp - DialogHandler.cpp - DialogMgr.cpp - DisplayMessage.cpp - EffectMgr.cpp - EffectQueue.cpp - Factory.cpp - FactoryObject.cpp - FileCache.cpp - Font.cpp - Game.cpp - GameData.cpp - GlobalTimer.cpp - Image.cpp - ImageFactory.cpp - ImageMgr.cpp - ImageWriter.cpp - IndexedArchive.cpp - IniSpawn.cpp - Interface.cpp - Inventory.cpp - Item.cpp - ItemMgr.cpp - KeyMap.cpp - LRUCache.cpp - Map.cpp - MapMgr.cpp - MoviePlayer.cpp - MusicMgr.cpp - Palette.cpp - PalettedImageMgr.cpp - Particles.cpp - Plugin.cpp - PluginLoader.cpp - PluginMgr.cpp - Polygon.cpp - Projectile.cpp - ProjectileMgr.cpp - ProjectileServer.cpp - Region.cpp - Resource.cpp - ResourceDesc.cpp - ResourceManager.cpp - ResourceSource.cpp - SaveGameIterator.cpp - SaveGameMgr.cpp - ScriptEngine.cpp - ScriptedAnimation.cpp - SoundMgr.cpp - Spell.cpp - SpellMgr.cpp - Spellbook.cpp - Sprite2D.cpp - SpriteCover.cpp - Store.cpp - StoreMgr.cpp - StringMgr.cpp - SymbolMgr.cpp - TableMgr.cpp - Tile.cpp - TileMap.cpp - TileMapMgr.cpp - TileOverlay.cpp - TileSetMgr.cpp - Variables.cpp - Video.cpp - WindowMgr.cpp - WorldMap.cpp - WorldMapMgr.cpp - GameScript/Actions.cpp - GameScript/GSUtils.cpp - GameScript/GameScript.cpp - GameScript/Matching.cpp - GameScript/Objects.cpp - GameScript/Triggers.cpp - GUI/Button.cpp - GUI/Console.cpp - GUI/Control.cpp - GUI/EventMgr.cpp - GUI/GameControl.cpp - GUI/Label.cpp - GUI/MapControl.cpp - GUI/Progressbar.cpp - GUI/ScrollBar.cpp - GUI/Slider.cpp - GUI/TextArea.cpp - GUI/TextEdit.cpp - GUI/Window.cpp - GUI/WorldMapControl.cpp - Scriptable/Actor.cpp - Scriptable/Container.cpp - Scriptable/Door.cpp - Scriptable/InfoPoint.cpp - Scriptable/Scriptable.cpp - Scriptable/PCStatStruct.cpp - System/DataStream.cpp - System/FileStream.cpp - System/MemoryStream.cpp - System/Logging.cpp - System/SlicedStream.cpp - System/String.cpp - System/VFS.cpp - ) - -if (STATIC_LINK) - ADD_LIBRARY(gemrb_core STATIC ${gemrb_core_LIB_SRCS}) -else (STATIC_LINK) - ADD_LIBRARY(gemrb_core SHARED ${gemrb_core_LIB_SRCS}) - IF(WIN32) - INSTALL(TARGETS gemrb_core RUNTIME DESTINATION ${LIB_DIR}) - ELSE(WIN32) - INSTALL(TARGETS gemrb_core LIBRARY DESTINATION ${LIB_DIR}) - ENDIF(WIN32) -endif (STATIC_LINK) - -SET_TARGET_PROPERTIES(gemrb_core PROPERTIES - COMPILE_DEFINITIONS - "PLUGINDIR=\"${PLUGIN_DIR}\";DATADIR=\"${DATA_DIR}\";SYSCONFDIR=\"${SYSCONF_DIR}\"" - ) diff --git a/project/jni/application/gemrb/gemrb/core/Cache.cpp b/project/jni/application/gemrb/gemrb/core/Cache.cpp deleted file mode 100644 index 4c11ebabc..000000000 --- a/project/jni/application/gemrb/gemrb/core/Cache.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Cache.h" - -#include -#include - -// private inlines -inline unsigned int Cache::MyHashKey(const char* key) const -{ - int nHash = tolower(key[0]); - for (int i=1;(i 0 ); - assert( nHashTableSize > 16 ); - - m_pHashTable = NULL; - m_nHashTableSize = nHashTableSize; // default size - m_nCount = 0; - m_pFreeList = NULL; - m_pBlocks = NULL; - m_nBlockSize = nBlockSize; -} - -void Cache::InitHashTable(unsigned int nHashSize, bool bAllocNow) - //Used to force allocation of a hash table or to override the default - //hash table size of (which is fairly small) -{ - assert( m_nCount == 0 ); - assert( nHashSize > 16 ); - - if (m_pHashTable != NULL) { - // free hash table - free( m_pHashTable); - m_pHashTable = NULL; - } - - if (bAllocNow) { - m_pHashTable = (Cache::MyAssoc **) malloc( sizeof( Cache::MyAssoc * ) * nHashSize ); - memset( m_pHashTable, 0, sizeof( Cache::MyAssoc * ) * nHashSize ); - } - m_nHashTableSize = nHashSize; -} - -void Cache::RemoveAll(ReleaseFun fun) -{ - if (m_pHashTable) { - for (unsigned int nHash = 0; nHash < m_nHashTableSize; nHash++) - { - MyAssoc* pAssoc; - for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; - pAssoc = pAssoc->pNext) - { - if (fun) - fun(pAssoc->data); - pAssoc->MyAssoc::~MyAssoc(); - } - } - // free hash table - free( m_pHashTable ); - m_pHashTable = NULL; - } - - m_nCount = 0; - m_pFreeList = NULL; - - // free memory blocks - MemBlock* p = m_pBlocks; - while (p != NULL) { - MemBlock* pNext = p->pNext; - free( p ); - p = pNext; - } - - m_pBlocks = NULL; -} - -Cache::~Cache() -{ - RemoveAll(NULL); -} - -Cache::MyAssoc* Cache::NewAssoc() -{ - if (m_pFreeList == NULL) { - // add another block - Cache::MemBlock* newBlock = ( Cache::MemBlock* ) malloc(m_nBlockSize * sizeof( Cache::MyAssoc ) + sizeof( Cache::MemBlock )); - assert( newBlock != NULL ); // we must have something - - newBlock->pNext = m_pBlocks; - m_pBlocks = newBlock; - - // chain them into free list - Cache::MyAssoc* pAssoc = ( Cache::MyAssoc* ) - ( newBlock + 1 ); - for (int i = 0; i < m_nBlockSize; i++) { - pAssoc->pNext = m_pFreeList; - m_pFreeList = pAssoc++; - } - } - - Cache::MyAssoc* pAssoc = m_pFreeList; - m_pFreeList = m_pFreeList->pNext; - m_nCount++; - assert( m_nCount > 0 ); // make sure we don't overflow -#ifdef _DEBUG - pAssoc->key[0] = 0; - pAssoc->data = 0; -#endif - pAssoc->nRefCount=1; - return pAssoc; -} - -void Cache::FreeAssoc(Cache::MyAssoc* pAssoc) -{ - if(pAssoc->pNext) { - pAssoc->pNext->pPrev=pAssoc->pPrev; - } - *pAssoc->pPrev = pAssoc->pNext; - pAssoc->pNext = m_pFreeList; - m_pFreeList = pAssoc; - m_nCount--; - assert( m_nCount >= 0 ); // make sure we don't underflow - - // if no more elements, cleanup completely - if (m_nCount == 0) { - RemoveAll(NULL); - } -} - -Cache::MyAssoc *Cache::GetNextAssoc(Cache::MyAssoc *Position) const -{ - if (m_pHashTable == NULL || m_nCount==0) { - return NULL; - } - - Cache::MyAssoc* pAssocRet = (Cache::MyAssoc*)Position; - - if (pAssocRet == NULL) - { - // find the first association - for (unsigned int nBucket = 0; nBucket < m_nHashTableSize; nBucket++) - if ((pAssocRet = m_pHashTable[nBucket]) != NULL) - break; - return pAssocRet; - } - Cache::MyAssoc* pAssocNext = pAssocRet->pNext; - if (pAssocNext == NULL) - { - // go to next bucket - for (unsigned int nBucket = MyHashKey(pAssocRet->key) + 1; - nBucket < m_nHashTableSize; nBucket++) - if ((pAssocNext = m_pHashTable[nBucket]) != NULL) - break; - } - - return pAssocNext; -} - -Cache::MyAssoc* Cache::GetAssocAt(const ieResRef key) const - // find association (or return NULL) -{ - if (m_pHashTable == NULL) { - return NULL; - } - - unsigned int nHash = MyHashKey( key ); - - // see if it exists - Cache::MyAssoc* pAssoc; - for (pAssoc = m_pHashTable[nHash]; - pAssoc != NULL; - pAssoc = pAssoc->pNext) { - if (!strnicmp( pAssoc->key, key, KEYSIZE )) { - return pAssoc; - } - } - return NULL; -} - -void *Cache::GetResource(const ieResRef key) const -{ - Cache::MyAssoc* pAssoc = GetAssocAt( key ); - if (pAssoc == NULL) { - return NULL; - } // not in map - - pAssoc->nRefCount++; - return pAssoc->data; -} - -//returns true if it was successful -bool Cache::SetAt(const ieResRef key, void *rValue) -{ - int i; - - if (m_pHashTable == NULL) { - InitHashTable( m_nHashTableSize ); - } - - Cache::MyAssoc* pAssoc=GetAssocAt( key ); - - if (pAssoc) { - //already exists, but we return true if it is the same - return (pAssoc->data==rValue); - } - - // it doesn't exist, add a new Association - pAssoc = NewAssoc(); - for (i=0;ikey[i]=tolower(key[i]); - } - for (;ikey[i]=0; - } - pAssoc->data=rValue; - // put into hash table - unsigned int nHash = MyHashKey(pAssoc->key); - pAssoc->pNext = m_pHashTable[nHash]; - pAssoc->pPrev = &m_pHashTable[nHash]; - if (pAssoc->pNext) { - pAssoc->pNext->pPrev = &pAssoc->pNext; - } - m_pHashTable[nHash] = pAssoc; - return true; -} - -int Cache::RefCount(const ieResRef key) const -{ - Cache::MyAssoc* pAssoc=GetAssocAt( key ); - if (pAssoc) { - return pAssoc->nRefCount; - } - return -1; -} - -int Cache::DecRef(void *data, const ieResRef key, bool remove) -{ - Cache::MyAssoc* pAssoc; - - if (key) { - pAssoc=GetAssocAt( key ); - if (pAssoc && (pAssoc->data==data) ) { - if (!pAssoc->nRefCount) { - return -1; - } - --pAssoc->nRefCount; - if (remove && !pAssoc->nRefCount) { - FreeAssoc(pAssoc); - return 0; - } - return pAssoc->nRefCount; - } - return -1; - } - - pAssoc=(Cache::MyAssoc *) GetNextAssoc(NULL); - - while (pAssoc) { - if (pAssoc->data == data) { - if (!pAssoc->nRefCount) { - return -1; - } - --pAssoc->nRefCount; - if (remove && !pAssoc->nRefCount) { - FreeAssoc(pAssoc); - return 0; - } - return pAssoc->nRefCount; - } - pAssoc=GetNextAssoc(pAssoc); - } - return -1; -} - -void Cache::Cleanup() -{ - Cache::MyAssoc* pAssoc=(Cache::MyAssoc *) GetNextAssoc(NULL); - - while (pAssoc) - { - Cache::MyAssoc* nextAssoc = GetNextAssoc(pAssoc); - if (pAssoc->nRefCount == 0) { - FreeAssoc(pAssoc); - } - pAssoc=nextAssoc; - } -} diff --git a/project/jni/application/gemrb/gemrb/core/Cache.h b/project/jni/application/gemrb/gemrb/core/Cache.h deleted file mode 100644 index b83e57641..000000000 --- a/project/jni/application/gemrb/gemrb/core/Cache.h +++ /dev/null @@ -1,93 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 |Avenger| - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef CACHE_H -#define CACHE_H - -#include "globals.h" -#include "win32def.h" - -#define KEYSIZE 8 - -#ifndef ReleaseFun -typedef void (*ReleaseFun)(void *); -#endif - -class Cache -{ -protected: - // Association - struct MyAssoc { - MyAssoc* pNext; - MyAssoc** pPrev; - char key[KEYSIZE]; //not ieResRef! - ieDword nRefCount; - void* data; - }; - struct MemBlock { - MemBlock* pNext; - }; - -public: - // Construction - Cache(int nBlockSize = 10, int nHashTableSize = 129); - - // Attributes - // number of elements - inline int GetCount() const - { - return m_nCount; - } - inline bool IsEmpty() const - { - return m_nCount==0; - } - // Lookup - void *GetResource(const ieResRef key) const; - // Operations - bool SetAt(const ieResRef key, void *rValue); - // decreases refcount or drops data - //if name is supplied it is faster, it will use rValue to validate the request - int DecRef(void *rValue, const ieResRef name, bool free); - int RefCount(const ieResRef key) const; - void RemoveAll(ReleaseFun fun);//removes all refcounts - void Cleanup(); //removes only zero refcounts - void InitHashTable(unsigned int hashSize, bool bAllocNow = true); - - // Implementation -protected: - MyAssoc** m_pHashTable; - unsigned int m_nHashTableSize; - int m_nCount; - MyAssoc* m_pFreeList; - MemBlock* m_pBlocks; - int m_nBlockSize; - - Cache::MyAssoc* NewAssoc(); - void FreeAssoc(Cache::MyAssoc*); - Cache::MyAssoc* GetAssocAt(const ieResRef) const; - Cache::MyAssoc *GetNextAssoc(Cache::MyAssoc * rNextPosition) const; - unsigned int MyHashKey(const ieResRef) const; - -public: - ~Cache(); -}; - -#endif //CACHE_H diff --git a/project/jni/application/gemrb/gemrb/core/Calendar.cpp b/project/jni/application/gemrb/gemrb/core/Calendar.cpp deleted file mode 100644 index 673bdb040..000000000 --- a/project/jni/application/gemrb/gemrb/core/Calendar.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2009 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Calendar.h" - -#include "win32def.h" - -#include "Interface.h" -#include "TableMgr.h" -#include "Variables.h" - -Calendar::Calendar(void) -{ - int i; - AutoTable tab("months"); - if (!tab) { - monthnamecount=-1; - monthnames = NULL; - days = NULL; - return; - } - monthnamecount = tab->GetRowCount(); - monthnames = (int *) malloc(sizeof(int) * monthnamecount); - days = (int *) malloc(sizeof(int) * monthnamecount); - daysinyear=0; - for(i=0;iQueryField(i,0)); - daysinyear+=days[i]; - monthnames[i]=atoi(tab->QueryField(i,1)); - } -} - -Calendar::~Calendar(void) -{ - if (monthnames) free(monthnames); - if (days) free(days); -} - -void Calendar::GetMonthName(int dayandmonth) const -{ - int month=1; - - for(int i=0;iGetTokenDictionary()->SetAtCopy("DAY", dayandmonth+1); - - tmp = core->GetString( monthnames[i] ); - core->GetTokenDictionary()->SetAt("MONTHNAME",tmp); - //must not free tmp, SetAt doesn't copy the pointer! - - core->GetTokenDictionary()->SetAtCopy("MONTH", month); - return; - } - dayandmonth-=days[i]; - //ignoring single days (they are not months) - if (days[i]!=1) month++; - } -} - -int Calendar::GetCalendarDay(int date) const -{ - int dayandmonth; - int month=1; - - if (!daysinyear) return 0; - dayandmonth = date%daysinyear; - for(int i=0;i { -public: - virtual ~Callback(); - virtual bool call (); - virtual bool call (int); -}; - -typedef Holder EventHandler; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp b/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp deleted file mode 100644 index aa4519042..000000000 --- a/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp +++ /dev/null @@ -1,2391 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "CharAnimations.h" - -#include "win32def.h" - -#include "AnimationFactory.h" -#include "DataFileMgr.h" -#include "Game.h" -#include "GameData.h" -#include "ImageMgr.h" -#include "Interface.h" -#include "Map.h" -#include "Palette.h" -#include "Video.h" - -static int AvatarsCount = 0; -static AvatarStruct *AvatarTable = NULL; -static const ieByte SixteenToNine[16]={0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1}; -static const ieByte SixteenToFive[16]={0,0,1,1,2,2,3,3,4,4,3,3,2,2,1,1}; - -static const int zOrder_Mirror16[16][4] = { - { 0, 3, 2, 1 }, - { 0, 3, 2, 1 }, - { 0, 3, 1, 2 }, - { 0, 3, 1, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 0, 3, 1, 2 }, - { 0, 3, 1, 2 }, - { 0, 3, 2, 1 } -}; - -static const int zOrder_8[8][4] = { - { 0, 3, 2, 1 }, - { 0, 3, 1, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 1, 0, 3, 2 }, - { 2, 0, 3, 1 }, - { 2, 0, 3, 1 }, - { 2, 0, 3, 1 } -}; - -struct EquipResRefData { - char Suffix[9]; - unsigned char Cycle; -}; - - -void CharAnimations::ReleaseMemory() -{ - if (AvatarTable) { - free(AvatarTable); - AvatarTable=NULL; - } -} - -int CharAnimations::GetAvatarsCount() -{ - return AvatarsCount; -} - -AvatarStruct *CharAnimations::GetAvatarStruct(int RowNum) -{ - return AvatarTable+RowNum; -} - -unsigned int CharAnimations::GetAnimationID() const -{ - if (AvatarsRowNum==~0u) return 0; - return AvatarTable[AvatarsRowNum].AnimID; -} - -int CharAnimations::GetCircleSize() const -{ - if (AvatarsRowNum==~0u) return -1; - return AvatarTable[AvatarsRowNum].CircleSize; -} -int CharAnimations::NoPalette() const -{ - if (AvatarsRowNum==~0u) return -1; - return AvatarTable[AvatarsRowNum].PaletteType; -} - -int CharAnimations::GetAnimType() const -{ - if (AvatarsRowNum==~0u) return -1; - return AvatarTable[AvatarsRowNum].AnimationType; -} - -int CharAnimations::GetSize() const -{ - if (AvatarsRowNum==~0u) return 0; - return AvatarTable[AvatarsRowNum].Size; -} - -int CharAnimations::GetBloodColor() const -{ - if(AvatarsRowNum==~0u) return 0; - return AvatarTable[AvatarsRowNum].BloodColor; -} - -static ieResRef EmptySound={0}; - -const ieResRef &CharAnimations::GetWalkSound() const -{ - if(AvatarsRowNum==~0u) return EmptySound; - return AvatarTable[AvatarsRowNum].WalkSound; -} - -int CharAnimations::GetWalkSoundCount() const -{ - if(AvatarsRowNum==~0u) return 0; - return AvatarTable[AvatarsRowNum].WalkSoundCount; -} - -int CharAnimations::GetActorPartCount() const -{ - if (AvatarsRowNum==~0u) return -1; - switch (AvatarTable[AvatarsRowNum].AnimationType) { - case IE_ANI_NINE_FRAMES: //dragon animations - return 9; - case IE_ANI_FOUR_FRAMES: //wyvern animations - return 4; - case IE_ANI_PST_GHOST: //special pst anims - if (AvatarTable[AvatarsRowNum].Prefixes[1][0]=='*') { - return 1; - } - if (AvatarTable[AvatarsRowNum].Prefixes[2][0]=='*') { - return 2; - } - if (AvatarTable[AvatarsRowNum].Prefixes[3][0]=='*') { - return 3; - } - return 4; - default: - return 1; - } -} - -int CharAnimations::GetTotalPartCount() const -{ - if (AvatarsRowNum==~0u) return -1; - switch (AvatarTable[AvatarsRowNum].AnimationType) { - case IE_ANI_FOUR_FILES: - case IE_ANI_FOUR_FILES_2: - return GetActorPartCount() + 1; // only weapon - case IE_ANI_CODE_MIRROR: - return GetActorPartCount() + 3; // equipment - case IE_ANI_TWENTYTWO: - return GetActorPartCount() + 3; // equipment - default: - return GetActorPartCount(); - } -} - -void CharAnimations::SetArmourLevel(int ArmourLevel) -{ - if (AvatarsRowNum==~0u) return; - //ignore ArmourLevel for the static pst anims (all sprites are displayed) - if (AvatarTable[AvatarsRowNum].AnimationType == IE_ANI_PST_GHOST) { - ArmourLevel = 0; - } - strncpy( ResRef, AvatarTable[AvatarsRowNum].Prefixes[ArmourLevel], 8 ); - ResRef[8]=0; - DropAnims(); -} - -//RangedType could be weird, reducing its value to 0,1,2 -void CharAnimations::SetRangedType(int rt) -{ - if ((unsigned int) rt<2) { - RangedType=(ieByte) rt; - } else { - RangedType=2; - } -} - -void CharAnimations::SetWeaponType(int wt) -{ - if (wt != WeaponType) { - WeaponType = wt; - DropAnims(); - } -} - -void CharAnimations::SetHelmetRef(const char* ref) -{ - HelmetRef[0] = ref[0]; - HelmetRef[1] = ref[1]; - - // TODO: Only drop helmet anims? - // Note: this doesn't happen "often", so this isn't a performance - // bottleneck. (wjp) - DropAnims(); - gamedata->FreePalette(palette[PAL_HELMET], 0); - gamedata->FreePalette(modifiedPalette[PAL_HELMET], 0); -} - -void CharAnimations::SetWeaponRef(const char* ref) -{ - WeaponRef[0] = ref[0]; - WeaponRef[1] = ref[1]; - - // TODO: Only drop weapon anims? - DropAnims(); - gamedata->FreePalette(palette[PAL_WEAPON], 0); - gamedata->FreePalette(modifiedPalette[PAL_WEAPON], 0); -} - -void CharAnimations::SetOffhandRef(const char* ref) -{ - OffhandRef[0] = ref[0]; - OffhandRef[1] = ref[1]; - - // TODO: Only drop shield/offhand anims? - DropAnims(); - gamedata->FreePalette(palette[PAL_OFFHAND], 0); - gamedata->FreePalette(modifiedPalette[PAL_OFFHAND], 0); -} - -void CharAnimations::LockPalette(const ieDword *gradients) -{ - if (lockPalette) return; - //cannot lock colors for PST animations - if (GetAnimType() >= IE_ANI_PST_ANIMATION_1) - { - return; - } - //force initialisation of animation - SetColors( gradients ); - GetAnimation(0,0); - if (palette[PAL_MAIN]) { - lockPalette=true; - } -} - -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -static const char *StancePrefix[]={"3","2","5","5","4","4","2","2","5","4","1","3","3","3","4","1","4","4","4"}; -static const char *CyclePrefix[]= {"0","0","1","1","1","1","0","0","1","1","0","1","1","1","1","1","1","1","1"}; -static const unsigned int CycleOffset[] = {0, 0, 0, 0, 0, 9, 0, 0, 0, 18, 0, 0, 9, 18, 0, 0, 0, 0, 0}; - -void CharAnimations::SetColors(const ieDword *arg) -{ - Colors = arg; - SetupColors(PAL_MAIN); - SetupColors(PAL_WEAPON); - SetupColors(PAL_OFFHAND); - SetupColors(PAL_HELMET); -} - -void CharAnimations::CheckColorMod() -{ - if (!GlobalColorMod.locked) { - if (GlobalColorMod.type != RGBModifier::NONE) { - GlobalColorMod.type = RGBModifier::NONE; - GlobalColorMod.speed = 0; - change[0]=change[1]=change[2]=change[3]=true; - } - } - unsigned int location; - - for (location = 0; location < 32; ++location) { - if (!ColorMods[location].phase) { - if (ColorMods[location].type != RGBModifier::NONE) { - ColorMods[location].type = RGBModifier::NONE; - ColorMods[location].speed = 0; - change[location>>3]=true; - } - } - } -} - -void CharAnimations::SetupColors(PaletteType type) -{ - Palette* pal = palette[(int)type]; - - if (!pal) { - return; - } - - if (!Colors) { - return; - } - - if (GetAnimType() >= IE_ANI_PST_ANIMATION_1) { - // Only do main palette - if (type != PAL_MAIN) { - return; - } - // TODO: handle equipment colour glows - - // Colors[6] is the COLORCOUNT stat in PST. - // It tells how many customisable color slots we have. - // The color slots start from the end of the palette and go - // backwards. There are 6 available slots with a size of 32 each. - // Actually, the slots seem to be written in the cre file - // but we ignore them, i'm not sure this is correct - int colorcount = Colors[6]; - int size = 32; - //the color count shouldn't be more than 6! - if (colorcount>6) colorcount=6; - int dest = 256-colorcount*size; - bool needmod = false; - if (GlobalColorMod.type != RGBModifier::NONE) { - needmod = true; - } - //don't drop the palette, it disables rgb pulse effects - //also don't bail out, we need to free the modified palette later - //so this entire block is needless - /* - if ((colorcount == 0) && (needmod==false) ) { - gamedata->FreePalette(palette[PAL_MAIN], PaletteResRef); - PaletteResRef[0]=0; - return; - } - */ - for (int i = 0; i < colorcount; i++) { - core->GetPalette( Colors[i]&255, size, - &palette[PAL_MAIN]->col[dest] ); - dest +=size; - } - - if (needmod) { - if (!modifiedPalette[PAL_MAIN]) - modifiedPalette[PAL_MAIN] = new Palette(); - modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); - } else { - gamedata->FreePalette(modifiedPalette[PAL_MAIN], 0); - } - return; - } - - int PType = NoPalette(); - if ( PType && (type == PAL_MAIN) ) { - bool needmod = false; - if (GlobalColorMod.type != RGBModifier::NONE) { - needmod = true; - } - if (!needmod && PaletteResRef[0]) { - gamedata->FreePalette(palette[PAL_MAIN], PaletteResRef); - } - PaletteResRef[0]=0; - //handling special palettes like MBER_BL (black bear) - if (PType!=1) { - if (GetAnimType()==IE_ANI_NINE_FRAMES) { - snprintf(PaletteResRef,9,"%.4s_%-.2s%s",ResRef, (char *) &PType, StancePrefix[StanceID]); - } else { - snprintf(PaletteResRef,9,"%.4s_%-.2s",ResRef, (char *) &PType); - } - strlwr(PaletteResRef); - Palette *tmppal = gamedata->GetPalette(PaletteResRef); - if (tmppal) { - palette[PAL_MAIN] = tmppal; - } else { - PaletteResRef[0]=0; - } - } - if (needmod) { - if (!modifiedPalette[PAL_MAIN]) - modifiedPalette[PAL_MAIN] = new Palette(); - modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); - } else { - gamedata->FreePalette(modifiedPalette[PAL_MAIN], 0); - } - return; - } - - pal->SetupPaperdollColours(Colors, (int)type); - if (lockPalette) { - return; - } - - int i; - bool needmod = false; - if (GlobalColorMod.type != RGBModifier::NONE) { - needmod = true; - } else { - for (i = 0; i < 7; ++i) { - if (ColorMods[i+8*((int)type)].type != RGBModifier::NONE) - needmod = true; - } - } - - - if (needmod) { - if (!modifiedPalette[(int)type]) - modifiedPalette[(int)type] = new Palette(); - - if (GlobalColorMod.type != RGBModifier::NONE) { - modifiedPalette[(int)type]->SetupGlobalRGBModification(palette[(int)type], GlobalColorMod); - } else { - modifiedPalette[(int)type]->SetupRGBModification(palette[(int)type],ColorMods, (int)type); - } - } else { - gamedata->FreePalette(modifiedPalette[(int)type], 0); - } - -} - -Palette* CharAnimations::GetPartPalette(int part) -{ - int actorPartCount = GetActorPartCount(); - PaletteType type = PAL_MAIN; - - if (part == actorPartCount) type = PAL_WEAPON; - if (part == actorPartCount+1) type = PAL_OFFHAND; - if (part == actorPartCount+2) type = PAL_HELMET; - - if (modifiedPalette[(int)type]) - return modifiedPalette[(int)type]; - - return palette[(int)type]; -} - -static int compare_avatars(const void *a, const void *b) -{ - unsigned int aa = ((AvatarStruct *)a)->AnimID; - unsigned int bb = ((AvatarStruct *)b)->AnimID; - return (int) (aa-bb); -} - -void CharAnimations::InitAvatarsTable() -{ - AutoTable Avatars("avatars"); - if (!Avatars) { - error("CharAnimations", "A critical animation file is missing!\n"); - } - AvatarTable = (AvatarStruct *) calloc ( AvatarsCount = Avatars->GetRowCount(), sizeof(AvatarStruct) ); - int i=AvatarsCount; - DataFileMgr *resdata = core->GetResDataINI(); - while(i--) { - AvatarTable[i].AnimID=(unsigned int) strtol(Avatars->GetRowName(i),NULL,0 ); - strnlwrcpy(AvatarTable[i].Prefixes[0],Avatars->QueryField(i,AV_PREFIX1),8); - strnlwrcpy(AvatarTable[i].Prefixes[1],Avatars->QueryField(i,AV_PREFIX2),8); - strnlwrcpy(AvatarTable[i].Prefixes[2],Avatars->QueryField(i,AV_PREFIX3),8); - strnlwrcpy(AvatarTable[i].Prefixes[3],Avatars->QueryField(i,AV_PREFIX4),8); - AvatarTable[i].AnimationType=(ieByte) atoi(Avatars->QueryField(i,AV_ANIMTYPE) ); - AvatarTable[i].CircleSize=(ieByte) atoi(Avatars->QueryField(i,AV_CIRCLESIZE) ); - const char *tmp = Avatars->QueryField(i,AV_USE_PALETTE); - //QueryField will always return a zero terminated string - //so tmp[0] must exist - if ( isalpha (tmp[0]) ) { - //this is a hack, we store 2 letters on an integer - //it was allocated with calloc, so don't bother erasing it - strncpy( (char *) &AvatarTable[i].PaletteType, tmp, 3); - } - else { - AvatarTable[i].PaletteType=atoi(Avatars->QueryField(i,AV_USE_PALETTE) ); - } - char size = Avatars->QueryField(i,AV_SIZE)[0]; - if (size == '*') { - size = 0; - } - AvatarTable[i].Size = size; - - AvatarTable[i].WalkScale = 0; - AvatarTable[i].RunScale = 0; - AvatarTable[i].Bestiary = -1; - - if (resdata) { - char section[12]; - snprintf(section,10,"%d", i); - - if (!resdata->GetKeysCount(section)) continue; - - float walkscale = resdata->GetKeyAsFloat(section, "walkscale", 0.0f); - if (walkscale != 0.0f) AvatarTable[i].WalkScale = (int)(1000.0f / walkscale); - float runscale = resdata->GetKeyAsFloat(section, "runscale", 0.0f); - if (runscale != 0.0f) AvatarTable[i].RunScale = (int)(1000.0f / runscale); - AvatarTable[i].Bestiary = resdata->GetKeyAsInt(section, "bestiary", -1); - } - } - qsort(AvatarTable, AvatarsCount, sizeof(AvatarStruct), compare_avatars); - - - AutoTable blood("bloodclr"); - if (blood) { - int rows = blood->GetRowCount(); - for(int i=0;iQueryField(i,0), (long &)value); - valid_number(blood->QueryField(i,1), (long &)rmin); - valid_number(blood->QueryField(i,2), (long &)rmax); - if (value>255 || rmin>0xffff || rmax>0xffff) { - printMessage("CharAnimations", "bloodclr entry: %02x %04x-%04x ", LIGHT_RED, - (unsigned int) value, (unsigned int) rmin, (unsigned int) rmax); - printStatus("Invalid value!", LIGHT_RED); - continue; - } - for(int j=0;jAvatarTable[j].AnimID) continue; - AvatarTable[j].BloodColor = value; - } - } - } - - AutoTable walk("walksnd"); - if (walk) { - int rows = walk->GetRowCount(); - for(int i=0;iQueryField(i,0), 8); - valid_number(walk->QueryField(i,1), (long &)rmin); - valid_number(walk->QueryField(i,2), (long &)rmax); - valid_number(walk->QueryField(i,3), (long &)range); - if (value[0]=='*') { - value[0]=0; - range = 0; - } - for(int j=0;jAvatarTable[j].AnimID) continue; - memcpy(AvatarTable[j].WalkSound, value, sizeof(ieResRef) ); - AvatarTable[j].WalkSoundCount = range; - } - } - } -} - -CharAnimations::CharAnimations(unsigned int AnimID, ieDword ArmourLevel) -{ - Colors = NULL; - int i,j; - for (i = 0; i < 4; ++i) { - change[i] = true; - modifiedPalette[i] = NULL; - palette[i] = NULL; - } - nextStanceID = 0; - StanceID = 0; - autoSwitchOnEnd = false; - lockPalette = false; - if (!AvatarsCount) { - InitAvatarsTable(); - } - - for (i = 0; i < MAX_ANIMS; i++) { - for (j = 0; j < MAX_ORIENT; j++) { - Anims[i][j] = NULL; - } - } - ArmorType = 0; - RangedType = 0; - WeaponType = 0; - PaletteResRef[0] = 0; - WeaponRef[0] = 0; - HelmetRef[0] = 0; - OffhandRef[0] = 0; - for (i = 0; i < 32; ++i) { - ColorMods[i].type = RGBModifier::NONE; - ColorMods[i].speed = 0; - // make initial phase depend on location to make the pulse appear - // less even - ColorMods[i].phase = 5*i; - ColorMods[i].locked = false; - } - GlobalColorMod.type = RGBModifier::NONE; - GlobalColorMod.speed = 0; - GlobalColorMod.phase = 0; - GlobalColorMod.locked = false; - lastModUpdate = 0; - - AvatarsRowNum=AvatarsCount; - if (core->HasFeature(GF_ONE_BYTE_ANIMID) ) { - ieDword tmp = AnimID&0xf000; - if (tmp==0x6000 || tmp==0xe000) { - AnimID&=0xff; - } - } - - while (AvatarsRowNum--) { - if (AvatarTable[AvatarsRowNum].AnimID<=AnimID) { - SetArmourLevel( ArmourLevel ); - return; - } - } - ResRef[0]=0; - printMessage("CharAnimations", "Invalid or nonexistent avatar entry:%04X\n", LIGHT_RED, AnimID); -} - -//we have to drop them when armourlevel changes -void CharAnimations::DropAnims() -{ - Animation** tmppoi; - int partCount = GetTotalPartCount(); - for (int StanceID = 0; StanceID < MAX_ANIMS; StanceID++) { - for (int i = 0; i < MAX_ORIENT; i++) { - if (Anims[StanceID][i]) { - tmppoi = Anims[StanceID][i]; - for (int j = 0; j < partCount; j++) - delete Anims[StanceID][i][j]; - delete[] tmppoi; - - // anims can only be duplicated at the Animation** level - for (int IDb=StanceID;IDb < MAX_ANIMS; IDb++) { - for (int i2 = 0; i2FreePalette(palette[PAL_MAIN], PaletteResRef); - int i; - for (i = 1; i < 4; ++i) - gamedata->FreePalette(palette[i], 0); - for (i = 0; i < 4; ++i) - gamedata->FreePalette(modifiedPalette[i], 0); -} -/* -This is a simple Idea of how the animation are coded - -There are the following animation types: - -IE_ANI_CODE_MIRROR: The code automatically mirrors the needed frames - (as in the example above) - - These Animations are stores using the following template: - [NAME][ARMORTYPE][ACTIONCODE] - - Each BAM File contains only 9 Orientations, the missing 7 Animations - are created by Horizontally Mirroring the 1-7 Orientations. - -IE_ANI_CODE_MIRROR_2: another mirroring type with more animations - [NAME]g[1,11-15,2,21-26] - -IE_ANI_CODE_MIRROR_3: Almost identical to IE_ANI_CODE_MIRROR_2, but with fewer cycles in g26 - -IE_ANI_ONE_FILE: The whole animation is in one file, no mirroring needed. - Each animation group is 16 Cycles. - -IE_ANI_TWO_FILES: The whole animation is in 2 files. The East and West part are in 2 BAM Files. - Example: - ACHKg1 - ACHKg1E - - Each BAM File contains many animation groups, each animation group - stores 5 Orientations, the missing 3 are stored in East BAM Files. - - -IE_ANI_FOUR_FILES: The Animation is coded in Four Files. Probably it is an old Two File animation with - additional frames added in a second time. - -IE_ANI_FOUR_FILES_2: Like IE_ANI_FOUR_FILES but with only 16 cycles per frame. - -IE_ANI_TWENTYTWO: This Animation Type stores the Animation in the following format - [NAME][ACTIONCODE][/E] - ACTIONCODE=A1-6, CA, SX, SA (sling is A1) - The g1 file contains several animation states. See MHR - Probably it could use A7-9 files too, bringing the file numbers to 28. - This is the original bg1 format. - -IE_ANI_SIX_FILES: The layout for these files is: - [NAME][g1-3][/E] - Each state contains 16 Orientations, but the last 6 are stored in the East file. - g1 contains only the walking animation. - G2 contains stand, ready, get hit, die and twitch. - g3 contains 3 attacks. - -IE_ANI_SIX_FILES_2: Similar to SIX_FILES, but the orientation numbers are reduced like in FOUR_FILES. Only one animation uses it: MOGR - -IE_ANI_TWO_FILES_2: Animations using this type are stored using the following template: - [NAME]g1[/E] - Each state contains 8 Orientations, but the second 4 are stored in the East file. - From the standard animations, only AHRS and ACOW belong to this type. - -IE_ANI_TWO_FILES_3: Animations using this type are stored using the following template: - [NAME][ACTIONTYPE][/E] - - Example: - MBFI* - MBFI*E - - Each BAM File contains one animation group, each animation group - stores 5 Orientations though the files contain all 8 Cycles, the missing 3 are stored in East BAM Files in Cycle: Stance*8+ (5,6,7). - This is the standard IWD animation, but BG2 also has it. - See MMR - -IE_ANI_TWO_FILES_3B: Animations using this type are stored using the following template: - [NAME][ACTIONTYPE][/E] - - Example: - MBFI* - MBFI*E - - This is a cut down version of IE_ANI_TWO_FILES_3. A2, CA and SP suffixes are missing. - This is the standard IWD animation, but BG2 also has it. - See MOR2 - -IE_ANI_FOUR_FRAMES: These animations are large, four bams make a frame. - - -IE_ANI_NINE_FRAMES: These animations are huge, nine bams make a frame. - - -IE_ANI_FRAGMENT: These animations are used for projectile graphics. - A single file contains 5 cycles (code mirror for east animation) - -IE_ANI_PST_ANIMATION_1: -IE_ANI_PST_ANIMATION_2: -IE_ANI_PST_ANIMATION_3: - Planescape: Torment Animations are stored in a different - way than the other games. This format uses the following template: - [C/D][ACTIONTYPE][NAME][B] - - Example: - CAT1MRTB - - Each Animation stores 5 Orientations, which are automatically mirrored - to form an 8 Orientation Animation. PST Animations have a different Palette - format. This Animation Type handles the PST Palette format too. - - NOTE: Walking/Running animations store 9 Orientations. - The second variation is missing the resting stance (STD) and the transitions. - These creatures are always in combat stance (don't rest). - Animation_3 is without STC (combat stance), they are always standing - -IE_ANI_PST_STAND: This is a modified PST animation, it contains only a - Standing image for every orientations, it follows the - [C/D]STD[NAME][B] standard. - -IE_ANI_PST_GHOST: This is a special static animation with no standard - All armourlevels are drawn simultaneously. There is no orientation or stance. - - - WEST PART | EAST PART - | - NW NNW N NNE NE - NW 006 007 008 009 010 NE -WNW 005 | 011 ENE - W 004 xxx 012 E -WSW 003 | 013 ESE - SW 002 001 000 015 014 SE - SW SSW S SSE SE - | - | - -*/ - -Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Orient) -{ - if (StanceID>=MAX_ANIMS) { - error("CharAnimation", "Illegal stance ID\n"); - } - - //for paletted dragon animations, we need the stance id - StanceID = nextStanceID = Stance; - int AnimType = GetAnimType(); - - //alter stance here if it is missing and you know a substitute - //probably we should feed this result back to the actor? - switch (AnimType) { - case -1: //invalid animation - return NULL; - - case IE_ANI_PST_STAND: - StanceID=IE_ANI_AWAKE; - break; - case IE_ANI_PST_GHOST: - StanceID=IE_ANI_AWAKE; - Orient=0; - break; - case IE_ANI_PST_ANIMATION_3: //stc->std - if (StanceID==IE_ANI_READY) { - StanceID=IE_ANI_AWAKE; - } - break; - case IE_ANI_PST_ANIMATION_2: //std->stc - if (StanceID==IE_ANI_AWAKE) { - StanceID=IE_ANI_READY; - } - break; - } - //pst animations don't have separate animation for sleep/die - if (AnimType >= IE_ANI_PST_ANIMATION_1) { - if (StanceID==IE_ANI_DIE) { - StanceID=IE_ANI_TWITCH; - } - } - - //TODO: Implement Auto Resource Loading - //setting up the sequencing of animation cycles - autoSwitchOnEnd = false; - switch (StanceID) { - case IE_ANI_DAMAGE: - nextStanceID = IE_ANI_READY; - autoSwitchOnEnd = true; - break; - case IE_ANI_SLEEP: //going to sleep - nextStanceID = IE_ANI_TWITCH; - autoSwitchOnEnd = true; - break; - case IE_ANI_TWITCH: //dead, sleeping - autoSwitchOnEnd = false; - break; - case IE_ANI_DIE: //going to die - nextStanceID = IE_ANI_TWITCH; - autoSwitchOnEnd = true; - break; - case IE_ANI_WALK: - case IE_ANI_RUN: - case IE_ANI_CAST: // looping - case IE_ANI_READY: - break; - case IE_ANI_AWAKE: - break; - case IE_ANI_EMERGE: - case IE_ANI_GET_UP: - case IE_ANI_HEAD_TURN: - case IE_ANI_PST_START: - nextStanceID = IE_ANI_AWAKE; - autoSwitchOnEnd = true; - break; - case IE_ANI_CONJURE: //ending - case IE_ANI_SHOOT: - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_JAB: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_BACKSLASH: - nextStanceID = IE_ANI_READY; - autoSwitchOnEnd = true; - break; - default: - print ("Invalid Stance: %d\n", StanceID); - break; - } - Animation** anims = Anims[StanceID][Orient]; - - if (anims) { - return anims; - } - - int partCount = GetTotalPartCount(); - int actorPartCount = GetActorPartCount(); - if (partCount < 0) return 0; - anims = new Animation*[partCount]; - - EquipResRefData* equipdat = 0; - for (int part = 0; part < partCount; ++part) - { - anims[part] = 0; - - //newresref is based on the prefix (ResRef) and various - // other things. - //this is longer than expected so it won't overflow - char NewResRef[12]; - unsigned char Cycle = 0; - if (part < actorPartCount) { - // Character animation parts - - if (equipdat) delete equipdat; - - //we need this long for special anims - strncpy( NewResRef, ResRef, 8 ); - GetAnimResRef( StanceID, Orient, NewResRef, Cycle, part, equipdat); - } else { - // Equipment animation parts - - anims[part] = 0; - if (GetSize() == 0) continue; - - if (part == actorPartCount) { - if (WeaponRef[0] == 0) continue; - // weapon - GetEquipmentResRef(WeaponRef,false,NewResRef,Cycle,equipdat); - } else if (part == actorPartCount+1) { - if (OffhandRef[0] == 0) continue; - if (WeaponType == IE_ANI_WEAPON_2H) continue; - // off-hand - if (WeaponType == IE_ANI_WEAPON_1H) { - GetEquipmentResRef(OffhandRef,false,NewResRef,Cycle, - equipdat); - } else { // IE_ANI_WEAPON_2W - GetEquipmentResRef(OffhandRef,true,NewResRef,Cycle, - equipdat); - } - } else if (part == actorPartCount+2) { - if (HelmetRef[0] == 0) continue; - // helmet - GetEquipmentResRef(HelmetRef,false,NewResRef,Cycle,equipdat); - } - } - NewResRef[8]=0; //cutting right to size - - AnimationFactory* af = ( AnimationFactory* ) - gamedata->GetFactoryResource( NewResRef, - IE_BAM_CLASS_ID, IE_NORMAL ); - - if (!af) { - if (part < actorPartCount) { - printMessage("CharAnimations", "Couldn't create animationfactory: %s (%04x)\n", - LIGHT_RED, NewResRef, GetAnimationID());; - for (int i = 0; i < part; ++i) - delete anims[i]; - delete[] anims; - delete equipdat; - return 0; - } else { - // not fatal if animation for equipment is missing - continue; - } - } - - Animation* a = af->GetCycle( Cycle ); - anims[part] = a; - - if (!a) { - if (part < actorPartCount) { - printMessage("CharAnimations", "Couldn't load animation: %s, cycle %d\n", LIGHT_RED, - NewResRef, Cycle); - for (int i = 0; i < part; ++i) - delete anims[i]; - delete[] anims; - delete equipdat; - return 0; - } else { - // not fatal if animation for equipment is missing - continue; - } - } - - if (part < actorPartCount) { - //if you need to revert this change, consider true paletted - //animations which need a GlobalColorMod (mgir for example) - - //if (!palette[PAL_MAIN] && ((GlobalColorMod.type!=RGBModifier::NONE) || (NoPalette()!=1)) ) { - if(!palette[PAL_MAIN]) { - // This is the first time we're loading an Animation. - // We copy the palette of its first frame into our own palette - palette[PAL_MAIN] = a->GetFrame(0)->GetPalette()->Copy(); - // ...and setup the colours properly - SetupColors(PAL_MAIN); - } - } else if (part == actorPartCount) { - if (!palette[PAL_WEAPON]) { - palette[PAL_WEAPON] = a->GetFrame(0)->GetPalette()->Copy(); - SetupColors(PAL_WEAPON); - } - } else if (part == actorPartCount+1) { - if (!palette[PAL_OFFHAND]) { - palette[PAL_OFFHAND] = a->GetFrame(0)->GetPalette()->Copy(); - SetupColors(PAL_OFFHAND); - } - } else if (part == actorPartCount+2) { - if (!palette[PAL_HELMET]) { - palette[PAL_HELMET] = a->GetFrame(0)->GetPalette()->Copy(); - SetupColors(PAL_HELMET); - } - } - - //animation is affected by game flags - a->gameAnimation = true; - a->SetPos( 0 ); - - //setting up the sequencing of animation cycles - switch (StanceID) { - case IE_ANI_DAMAGE: - case IE_ANI_SLEEP: - case IE_ANI_TWITCH: - case IE_ANI_DIE: - case IE_ANI_PST_START: - case IE_ANI_HEAD_TURN: - case IE_ANI_CONJURE: - case IE_ANI_SHOOT: - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_JAB: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_BACKSLASH: - a->Flags |= A_ANI_PLAYONCE; - break; - case IE_ANI_EMERGE: - case IE_ANI_GET_UP: - a->playReversed = true; - a->Flags |= A_ANI_PLAYONCE; - break; - } - switch (GetAnimType()) { - case IE_ANI_NINE_FRAMES: //dragon animations - case IE_ANI_FOUR_FRAMES: //wyvern animations - case IE_ANI_BIRD: - case IE_ANI_CODE_MIRROR: - case IE_ANI_CODE_MIRROR_2: //9 orientations - case IE_ANI_CODE_MIRROR_3: - case IE_ANI_PST_ANIMATION_3: //no stc just std - case IE_ANI_PST_ANIMATION_2: //no std just stc - case IE_ANI_PST_ANIMATION_1: - case IE_ANI_FRAGMENT: - if (Orient > 8) { - a->MirrorAnimation( ); - } - break; - default: - break; - } - - // make animarea of part 0 encompass the animarea of the other parts - if (part > 0) - anims[0]->AddAnimArea(a); - - } - - switch (GetAnimType()) { - case IE_ANI_NINE_FRAMES: //dragon animations - case IE_ANI_FOUR_FRAMES: //wyvern animations - case IE_ANI_BIRD: - case IE_ANI_CODE_MIRROR: - case IE_ANI_SIX_FILES: //16 anims some are stored elsewhere - case IE_ANI_ONE_FILE: //16 orientations - case IE_ANI_CODE_MIRROR_2: //9 orientations - case IE_ANI_CODE_MIRROR_3: - Anims[StanceID][Orient] = anims; - break; - case IE_ANI_TWO_FILES: - case IE_ANI_TWENTYTWO: - case IE_ANI_TWO_FILES_2: - case IE_ANI_TWO_FILES_3: - case IE_ANI_TWO_FILES_3B: - case IE_ANI_FOUR_FILES: - case IE_ANI_FOUR_FILES_2: - case IE_ANI_SIX_FILES_2: - case IE_ANI_FRAGMENT: - Orient&=~1; - Anims[StanceID][Orient] = anims; - Anims[StanceID][Orient + 1] = anims; - break; - - case IE_ANI_PST_ANIMATION_3: //no stc just std - case IE_ANI_PST_ANIMATION_2: //no std just stc - case IE_ANI_PST_ANIMATION_1: - switch (StanceID) { - case IE_ANI_WALK: - case IE_ANI_RUN: - case IE_ANI_PST_START: - Anims[StanceID][Orient] = anims; - break; - default: - Orient &=~1; - Anims[StanceID][Orient] = anims; - Anims[StanceID][Orient + 1] = anims; - break; - } - break; - - case IE_ANI_PST_STAND: - Orient &=~1; - Anims[StanceID][Orient] = anims; - Anims[StanceID][Orient+1] = anims; - break; - case IE_ANI_PST_GHOST: - Orient = 0; - StanceID = IE_ANI_AWAKE; - Anims[StanceID][0] = anims; - break; - default: - error("CharAnimations", "Unknown animation type\n"); - } - delete equipdat; - - return Anims[StanceID][Orient]; -} - -static const int one_file[19]={2, 1, 0, 0, 2, 3, 0, 1, 0, 4, 1, 0, 0, 0, 3, 1, 4, 4, 4}; - -void CharAnimations::GetAnimResRef(unsigned char StanceID, - unsigned char Orient, - char* NewResRef, unsigned char& Cycle, - int Part, EquipResRefData*& EquipData) -{ - EquipData = 0; - Orient &= 15; - switch (GetAnimType()) { - case IE_ANI_FOUR_FRAMES: - AddFFSuffix( NewResRef, StanceID, Cycle, Orient, Part ); - break; - - case IE_ANI_NINE_FRAMES: - AddNFSuffix( NewResRef, StanceID, Cycle, Orient, Part ); - break; - - case IE_ANI_CODE_MIRROR: - AddVHRSuffix( NewResRef, StanceID, Cycle, Orient, EquipData ); - break; - - case IE_ANI_BIRD: - Cycle = (ieByte) ((StanceID&1) * 9 + SixteenToNine[Orient]); - break; - - case IE_ANI_FRAGMENT: - Cycle = SixteenToFive[Orient]; - break; - - case IE_ANI_ONE_FILE: - Cycle = (ieByte) (one_file[StanceID] * 16 + Orient); - break; - - case IE_ANI_SIX_FILES: - AddSixSuffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_TWENTYTWO: //5+3 animations - AddMHRSuffix( NewResRef, StanceID, Cycle, Orient, EquipData ); - break; - - case IE_ANI_TWO_FILES_2: //4+4 animations - AddLR2Suffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_TWO_FILES_3: //IWD style anims - AddMMRSuffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_TWO_FILES_3B: //IWD style anims - AddMMR2Suffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_TWO_FILES: - AddTwoFileSuffix(NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_FOUR_FILES: - AddLRSuffix( NewResRef, StanceID, Cycle, Orient, EquipData ); - break; - - case IE_ANI_FOUR_FILES_2: - AddLRSuffix2( NewResRef, StanceID, Cycle, Orient, EquipData ); - break; - - case IE_ANI_SIX_FILES_2: //MOGR (variant of FOUR_FILES) - AddLR3Suffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_CODE_MIRROR_2: //9 orientations - AddVHR2Suffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_CODE_MIRROR_3: // like IE_ANI_CODE_MIRROR_2 but with fewer cycles in g26 - AddVHR3Suffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_PST_ANIMATION_1: - case IE_ANI_PST_ANIMATION_2: - case IE_ANI_PST_ANIMATION_3: - AddPSTSuffix( NewResRef, StanceID, Cycle, Orient ); - break; - - case IE_ANI_PST_STAND: - sprintf(NewResRef,"%cSTD%4s",ResRef[0], ResRef+1); - Cycle = (ieByte) SixteenToFive[Orient]; - break; - case IE_ANI_PST_GHOST: // pst static animations - //still doesn't handle the second cycle of the golem anim - Cycle = 0; - strnlwrcpy(NewResRef, AvatarTable[AvatarsRowNum].Prefixes[Part], 8); - break; - default: - error("CharAnimations", "Unknown animation type in avatars.2da row: %d\n", AvatarsRowNum); - } -} - -void CharAnimations::GetEquipmentResRef(const char* equipRef, bool offhand, - char* ResRef, unsigned char& Cycle, EquipResRefData* equip) -{ - switch (GetAnimType()) { - case IE_ANI_FOUR_FILES: - case IE_ANI_FOUR_FILES_2: - GetLREquipmentRef( ResRef, Cycle, equipRef, offhand, equip ); - break; - case IE_ANI_CODE_MIRROR: - GetVHREquipmentRef( ResRef, Cycle, equipRef, offhand, equip ); - break; - case IE_ANI_TWENTYTWO: - GetMHREquipmentRef( ResRef, Cycle, equipRef, offhand, equip ); - break; - default: - error("CharAnimations", "Unsupported animation type for equipment animation.\n"); - break; - } -} - -const int* CharAnimations::GetZOrder(unsigned char Orient) -{ - switch (GetAnimType()) { - case IE_ANI_CODE_MIRROR: - return zOrder_Mirror16[Orient]; - case IE_ANI_TWENTYTWO: - return zOrder_8[Orient/2]; - case IE_ANI_FOUR_FILES: - return 0; // FIXME - default: - return 0; - } -} - - -void CharAnimations::AddPSTSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - const char *Prefix; - - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_JAB: - case IE_ANI_ATTACK_BACKSLASH: - Cycle=SixteenToFive[Orient]; - Prefix="at1"; break; - case IE_ANI_DAMAGE: - Cycle=SixteenToFive[Orient]; - Prefix="hit"; break; - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - Cycle=SixteenToFive[Orient]; - Prefix="gup"; break; - case IE_ANI_AWAKE: - Cycle=SixteenToFive[Orient]; - Prefix="std"; break; - case IE_ANI_READY: - Cycle=SixteenToFive[Orient]; - Prefix="stc"; break; - case IE_ANI_DIE: - case IE_ANI_SLEEP: - case IE_ANI_TWITCH: - Cycle=SixteenToFive[Orient]; - Prefix="dfb"; break; - case IE_ANI_RUN: - Cycle=SixteenToNine[Orient]; - Prefix="run"; break; - case IE_ANI_WALK: - Cycle=SixteenToNine[Orient]; - Prefix="wlk"; break; - case IE_ANI_HEAD_TURN: - Cycle=SixteenToFive[Orient]; - if (rand()&1) { - Prefix="sf2"; - sprintf(ResRef,"%c%3s%4s",this->ResRef[0], Prefix, this->ResRef+1); - if (gamedata->Exists(ResRef, IE_BAM_CLASS_ID) ) { - return; - } - } - Prefix="sf1"; - sprintf(ResRef,"%c%3s%4s",this->ResRef[0], Prefix, this->ResRef+1); - if (gamedata->Exists(ResRef, IE_BAM_CLASS_ID) ) { - return; - } - Prefix = "stc"; - break; - case IE_ANI_PST_START: - Cycle=0; - Prefix="ms1"; break; - default: //just in case - Cycle=SixteenToFive[Orient]; - Prefix="stc"; break; - } - sprintf(ResRef,"%c%3s%4s",this->ResRef[0], Prefix, this->ResRef+1); -} - -void CharAnimations::AddVHR2Suffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - Cycle=SixteenToNine[Orient]; - - switch (StanceID) { - case IE_ANI_ATTACK: //temporarily - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g21" ); - break; - - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g2" ); - break; - - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g26" ); - Cycle+=45; - break; - - case IE_ANI_CAST: //looping - strcat( ResRef, "g25" ); - Cycle+=45; - break; - - case IE_ANI_CONJURE://ending - strcat( ResRef, "g26" ); - Cycle+=54; - break; - - case IE_ANI_SHOOT: - strcat( ResRef, "g24" ); - Cycle+=27; - break; - - case IE_ANI_HEAD_TURN: - case IE_ANI_AWAKE: - strcat( ResRef, "g12" ); - Cycle+=18; - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "g15" ); - Cycle+=45; - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "g14" ); - Cycle+=45; - break; - - case IE_ANI_DIE: - case IE_ANI_EMERGE: - case IE_ANI_GET_UP: - case IE_ANI_PST_START: - strcat( ResRef, "g14" ); - Cycle+=36; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g13" ); - Cycle+=27; - break; - - case IE_ANI_READY: - strcat( ResRef, "g1" ); - Cycle+=9; - break; - - case IE_ANI_WALK: - strcat( ResRef, "g11" ); - break; - - case IE_ANI_HIDE: - strcat( ResRef, "g22" ); - break; - default: - error("CharAnimation", "VHR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } -} - -void CharAnimations::AddVHR3Suffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - Cycle=SixteenToNine[Orient]; - - switch (StanceID) { - case IE_ANI_ATTACK: //temporarily - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g21" ); - break; - - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g2" ); - break; - - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g26" ); - Cycle+=18; - break; - - case IE_ANI_CAST: //looping - strcat( ResRef, "g25" ); - Cycle+=45; - break; - - case IE_ANI_CONJURE://ending - strcat( ResRef, "g26" ); - Cycle+=36; - break; - - case IE_ANI_SHOOT: - strcat( ResRef, "g24" ); - Cycle+=27; - break; - - case IE_ANI_HEAD_TURN: - case IE_ANI_AWAKE: - strcat( ResRef, "g12" ); - Cycle+=18; - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "g15" ); - Cycle+=45; - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "g14" ); - Cycle+=45; - break; - - case IE_ANI_DIE: - case IE_ANI_EMERGE: - case IE_ANI_GET_UP: - case IE_ANI_PST_START: - strcat( ResRef, "g14" ); - Cycle+=36; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g13" ); - Cycle+=27; - break; - - case IE_ANI_READY: - strcat( ResRef, "g1" ); - Cycle+=9; - break; - - case IE_ANI_WALK: - strcat( ResRef, "g11" ); - break; - default: - error("CharAnimation", "VHR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } -} - -// Note: almost like SixSuffix -void CharAnimations::AddFFSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, int Part) -{ - Cycle=SixteenToNine[Orient]; - switch (StanceID) { - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - break; - - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g3" ); - break; - - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g3" ); - Cycle += 16; - break; - - case IE_ANI_ATTACK_JAB: - case IE_ANI_CAST: - case IE_ANI_CONJURE: - strcat( ResRef, "g3" ); - Cycle += 32; - break; - - case IE_ANI_HEAD_TURN: //could be wrong - case IE_ANI_AWAKE: - strcat( ResRef, "g2" ); - break; - - case IE_ANI_READY: - strcat( ResRef, "g2" ); - Cycle += 16; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g2" ); - Cycle += 32; - break; - - case IE_ANI_DIE: - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - strcat( ResRef, "g2" ); - Cycle += 48; - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "g2" ); - Cycle += 64; - break; - - default: - error("CharAnimation", "Four frames Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - - } - ResRef[6]=(char) (Part+'1'); - ResRef[7]=0; -} - -void CharAnimations::AddNFSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, int Part) -{ - char prefix[10]; - - Cycle = SixteenToNine[Orient]; - snprintf(prefix, 9, "%s%s%d%s%d", ResRef, StancePrefix[StanceID], Part+1, - CyclePrefix[StanceID], Cycle); - strnlwrcpy(ResRef,prefix,8); - Cycle=(ieByte) (Cycle+CycleOffset[StanceID]); -} - -//Attack -//h1, h2, w2 -//static const char *SlashPrefix[]={"a1","a4","a7"}; -//static const char *BackPrefix[]={"a2","a5","a8"}; -//static const char *JabPrefix[]={"a3","a6","a9"}; -static const char *SlashPrefix[]={"a1","a2","a7"}; -static const char *BackPrefix[]={"a3","a4","a8"}; -static const char *JabPrefix[]={"a5","a6","a9"}; -static const char *RangedPrefix[]={"sa","sx","ss"}; -static const char *RangedPrefixOld[]={"sa","sx","a1"}; - -void CharAnimations::AddVHRSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData*& EquipData) -{ - Cycle = SixteenToNine[Orient]; - EquipData = new EquipResRefData; - EquipData->Suffix[0] = 0; - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, SlashPrefix[WeaponType] ); - strcpy( EquipData->Suffix, SlashPrefix[WeaponType] ); - break; - - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, BackPrefix[WeaponType] ); - strcpy( EquipData->Suffix, BackPrefix[WeaponType] ); - break; - - case IE_ANI_ATTACK_JAB: - strcat( ResRef, JabPrefix[WeaponType] ); - strcpy( EquipData->Suffix, JabPrefix[WeaponType] ); - break; - - case IE_ANI_AWAKE: - strcat( ResRef, "g17" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 63; - break; - - case IE_ANI_CAST: //looping - strcat( ResRef, "ca" ); - strcpy( EquipData->Suffix, "ca" ); - break; - - case IE_ANI_CONJURE: //ending - strcat( ResRef, "ca" ); - strcpy( EquipData->Suffix, "ca" ); - Cycle += 9; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g14" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 36; - break; - - case IE_ANI_DIE: - strcat( ResRef, "g15" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 45; - break; - //I cannot find an emerge animation... - //Maybe is Die reversed - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - strcat( ResRef, "g19" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 81; - break; - - case IE_ANI_HEAD_TURN: - if (rand()&1) { - strcat( ResRef, "g12" ); - Cycle += 18; - } else { - strcat( ResRef, "g18" ); - Cycle += 72; - } - strcpy( EquipData->Suffix, "g1" ); - break; - - //Unknown... maybe only a transparency effect apply - case IE_ANI_HIDE: - break; - - case IE_ANI_READY: - if ( WeaponType == IE_ANI_WEAPON_2H ) { - strcat( ResRef, "g13" ); - Cycle += 27; - } else { - strcat( ResRef, "g1" ); - Cycle += 9; - } - strcpy( EquipData->Suffix, "g1" ); - break; - //This depends on the ranged weapon equipped - case IE_ANI_SHOOT: - strcat( ResRef, RangedPrefix[RangedType] ); - strcpy( EquipData->Suffix, RangedPrefix[RangedType] ); - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "g16" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 54; - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "g16" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle += 54; - break; - - case IE_ANI_WALK: - strcat( ResRef, "g11" ); - strcpy( EquipData->Suffix, "g1" ); - break; - - default: - error("CharAnimation", "VHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - EquipData->Cycle = Cycle; -} - -void CharAnimations::GetVHREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool offhand, - EquipResRefData* equip) -{ - Cycle = equip->Cycle; - if (offhand) { - sprintf( ResRef, "wq%c%c%co%s", GetSize(), equipRef[0], equipRef[1], equip->Suffix ); - } else { - sprintf( ResRef, "wq%c%c%c%s", GetSize(), equipRef[0], equipRef[1], equip->Suffix ); - } -} - -void CharAnimations::AddSixSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - switch (StanceID) { - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - Cycle = Orient; - break; - - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g3" ); - Cycle = Orient; - break; - - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g3" ); - Cycle = 16 + Orient; - break; - - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g3" ); - Cycle = 32 + Orient; - break; - - case IE_ANI_HEAD_TURN: //could be wrong - case IE_ANI_AWAKE: - strcat( ResRef, "g2" ); - Cycle = 0 + Orient; - break; - - case IE_ANI_READY: - strcat( ResRef, "g2" ); - Cycle = 16 + Orient; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g2" ); - Cycle = 32 + Orient; - break; - - case IE_ANI_DIE: - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - strcat( ResRef, "g2" ); - Cycle = 48 + Orient; - break; - - case IE_ANI_TWITCH: - case IE_ANI_SLEEP: - strcat( ResRef, "g2" ); - Cycle = 64 + Orient; - break; - - default: - error("CharAnimation", "Six Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - - } - if (Orient>9) { - strcat( ResRef, "e" ); - } -} - -void CharAnimations::AddLR2Suffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - Orient /= 2; - - switch (StanceID) { - case IE_ANI_READY: - case IE_ANI_CAST: //looping - case IE_ANI_CONJURE://ending - case IE_ANI_HIDE: - case IE_ANI_WALK: - case IE_ANI_AWAKE: - Cycle = 0 + Orient; - break; - - case IE_ANI_SHOOT: - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_BACKSLASH: - case IE_ANI_ATTACK_JAB: - case IE_ANI_HEAD_TURN: - Cycle = 8 + Orient; - break; - - case IE_ANI_DIE: - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - Cycle = 24 + Orient; - break; - - case IE_ANI_DAMAGE: - Cycle = 16 + Orient; - break; - - case IE_ANI_SLEEP: - case IE_ANI_TWITCH: - Cycle = 32 + Orient; - break; - default: - error("CharAnimation", "LR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient>=4) { - strcat( ResRef, "g1e" ); - } else { - strcat( ResRef, "g1" ); - } -} - -void CharAnimations::AddMHRSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData*& EquipData) -{ - Orient /= 2; - EquipData = new EquipResRefData; - EquipData->Suffix[0] = 0; - - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - strcat (ResRef, SlashPrefix[WeaponType]); - strcpy( EquipData->Suffix, SlashPrefix[WeaponType] ); - Cycle = Orient; - break; - - case IE_ANI_ATTACK_BACKSLASH: - strcat (ResRef, BackPrefix[WeaponType]); - strcpy( EquipData->Suffix, BackPrefix[WeaponType] ); - Cycle = Orient; - break; - - case IE_ANI_ATTACK_JAB: - strcat (ResRef, JabPrefix[WeaponType]); - strcpy( EquipData->Suffix, JabPrefix[WeaponType] ); - Cycle = Orient; - break; - - case IE_ANI_READY: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - if ( WeaponType == IE_ANI_WEAPON_2W ) { - Cycle = 24 + Orient; - } else { - Cycle = 8 + Orient; - } - break; - - case IE_ANI_CAST://looping - strcat( ResRef, "ca" ); - strcpy( EquipData->Suffix, "ca" ); - Cycle = 8 + Orient; - break; - - case IE_ANI_CONJURE://ending - strcat( ResRef, "ca" ); - strcpy( EquipData->Suffix, "ca" ); - Cycle = Orient; - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 40 + Orient; - break; - - case IE_ANI_DIE: - case IE_ANI_GET_UP: - case IE_ANI_PST_START: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 48 + Orient; - break; - - //I cannot find an emerge animation... - //Maybe is Die reversed - case IE_ANI_EMERGE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 48 + Orient; - break; - - case IE_ANI_HEAD_TURN: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 32 + Orient; - break; - - //Unknown... maybe only a transparency effect apply - case IE_ANI_HIDE: - break; - - case IE_ANI_AWAKE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 16 + Orient; - break; - - //This depends on the ranged weapon equipped - case IE_ANI_SHOOT: - strcat (ResRef, RangedPrefixOld[RangedType]); - strcpy( EquipData->Suffix, RangedPrefixOld[RangedType] ); - Cycle = Orient; - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 64 + Orient; - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 56 + Orient; - break; - - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = Orient; - break; - default: - error("CharAnimation", "MHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient>=5) { - strcat( ResRef, "e" ); - strcat( EquipData->Suffix, "e" ); - } - EquipData->Cycle = Cycle; -} - -void CharAnimations::GetMHREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool offhand, - EquipResRefData* equip) -{ - Cycle = equip->Cycle; - if (offhand) { - //i think there is no offhand stuff for bg1, lets use the bg2 equivalent here? - sprintf( ResRef, "wq%c%c%co%s", GetSize(), equipRef[0], equipRef[1], equip->Suffix ); - } else { - sprintf( ResRef, "wp%c%c%c%s", GetSize(), equipRef[0], equipRef[1], equip->Suffix ); - } -} - -void CharAnimations::AddTwoFileSuffix( char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - switch(StanceID) { - case IE_ANI_HEAD_TURN: - Cycle = 16 + Orient / 2; - break; - case IE_ANI_DAMAGE: - Cycle = 24 + Orient / 2; - break; - case IE_ANI_SLEEP: - case IE_ANI_TWITCH: - Cycle = 40 + Orient / 2; - break; - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_DIE: - case IE_ANI_PST_START: - Cycle = 32 + Orient / 2; - break; - case IE_ANI_WALK: - Cycle = Orient / 2; - break; - default: - Cycle = 8 + Orient / 2; - break; - } - strcat( ResRef, "g1" ); - if (Orient > 9) { - strcat( ResRef, "e" ); - } -} - -void CharAnimations::AddLRSuffix2( char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData *&EquipData) -{ - EquipData = new EquipResRefData; - EquipData->Suffix[0] = 0; - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_BACKSLASH: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = Orient / 2; - break; - case IE_ANI_CAST: - case IE_ANI_CONJURE: - case IE_ANI_SHOOT: - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = Orient / 2; - break; - case IE_ANI_READY: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_HEAD_TURN: //could be wrong - case IE_ANI_AWAKE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 16 + Orient / 2; - break; - case IE_ANI_DAMAGE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 24 + Orient / 2; - break; - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - case IE_ANI_DIE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 32 + Orient / 2; - break; - case IE_ANI_SLEEP: - case IE_ANI_HIDE: - case IE_ANI_TWITCH: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 40 + Orient / 2; - break; - default: - error("CharAnimation", "LRSuffix2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient > 9) { - strcat( ResRef, "e" ); - strcat( EquipData->Suffix, "e"); - } - EquipData->Cycle = Cycle; -} - -void CharAnimations::AddLRSuffix( char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData *&EquipData) -{ - EquipData = new EquipResRefData; - EquipData->Suffix[0] = 0; - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = Orient / 2; - break; - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = 16 + Orient / 2; - break; - case IE_ANI_CAST: - case IE_ANI_CONJURE: - case IE_ANI_SHOOT: - //these animations are missing - strcat( ResRef, "g2" ); - strcpy( EquipData->Suffix, "g2" ); - Cycle = Orient / 2; - break; - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = Orient / 2; - break; - case IE_ANI_READY: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_HEAD_TURN: //could be wrong - case IE_ANI_AWAKE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 16 + Orient / 2; - break; - case IE_ANI_DAMAGE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 24 + Orient / 2; - break; - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - case IE_ANI_DIE: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 32 + Orient / 2; - break; - case IE_ANI_TWITCH: - case IE_ANI_SLEEP: - strcat( ResRef, "g1" ); - strcpy( EquipData->Suffix, "g1" ); - Cycle = 40 + Orient / 2; - break; - default: - error("CharAnimation", "LR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient > 9) { - strcat( ResRef, "e" ); - strcat( EquipData->Suffix, "e"); - } - EquipData->Cycle = Cycle; -} - -void CharAnimations::GetLREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool /*offhand*/, - EquipResRefData* equip) -{ - Cycle = equip->Cycle; - //hackhackhack - sprintf( ResRef, "%4s%c%s", this->ResRef, equipRef[0], equip->Suffix ); -} - -//Only for the ogre animation (MOGR) -void CharAnimations::AddLR3Suffix( char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "g2" ); - Cycle = Orient / 2; - break; - case IE_ANI_ATTACK_SLASH: - strcat( ResRef, "g2" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "g2" ); - Cycle = 8 + Orient / 2; //there is no third attack animation - break; - case IE_ANI_CAST: - case IE_ANI_CONJURE: - case IE_ANI_SHOOT: - strcat( ResRef, "g3" ); - Cycle = Orient / 2; - break; - case IE_ANI_WALK: - strcat( ResRef, "g1" ); - Cycle = 16 + Orient / 2; - break; - case IE_ANI_READY: - strcat( ResRef, "g1" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_HEAD_TURN: //could be wrong - case IE_ANI_AWAKE: - strcat( ResRef, "g1" ); - Cycle = Orient / 2; - break; - case IE_ANI_DAMAGE: - strcat( ResRef, "g3" ); - Cycle = 8 + Orient / 2; - break; - case IE_ANI_DIE: - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - case IE_ANI_SLEEP: - strcat( ResRef, "g3" ); - Cycle = 16 + Orient / 2; - break; - case IE_ANI_TWITCH: - strcat( ResRef, "g3" ); - Cycle = 24 + Orient / 2; - break; - default: - error("CharAnimation", "LR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient > 9) { - strcat( ResRef, "e" ); - } -} - -void CharAnimations::AddMMR2Suffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_BACKSLASH: - case IE_ANI_ATTACK_JAB: - case IE_ANI_CONJURE: - case IE_ANI_CAST: - strcat( ResRef, "a1" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_SHOOT: - strcat( ResRef, "a4" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_AWAKE: - case IE_ANI_READY: - strcat( ResRef, "sd" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_HEAD_TURN: - strcat( ResRef, "sc" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "gh" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_DIE: - strcat( ResRef, "de" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - strcat( ResRef, "gu" ); - Cycle = ( Orient / 2 ); - break; - - //Unknown... maybe only a transparency effect apply - case IE_ANI_HIDE: - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "sl" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "tw" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_WALK: - strcat( ResRef, "wk" ); - Cycle = ( Orient / 2 ); - break; - default: - error("CharAnimation", "MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient > 9) { - strcat( ResRef, "e" ); - } -} - -void CharAnimations::AddMMRSuffix(char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient) -{ - switch (StanceID) { - case IE_ANI_ATTACK: - case IE_ANI_ATTACK_SLASH: - case IE_ANI_ATTACK_BACKSLASH: - strcat( ResRef, "a1" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_SHOOT: - strcat( ResRef, "a4" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_ATTACK_JAB: - strcat( ResRef, "a2" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_AWAKE: - case IE_ANI_READY: - strcat( ResRef, "sd" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_CONJURE: - strcat( ResRef, "ca" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_CAST: - strcat( ResRef, "sp" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_HEAD_TURN: - strcat( ResRef, "sc" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_DAMAGE: - strcat( ResRef, "gh" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_DIE: - strcat( ResRef, "de" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_GET_UP: - case IE_ANI_EMERGE: - case IE_ANI_PST_START: - strcat( ResRef, "gu" ); - Cycle = ( Orient / 2 ); - break; - - //Unknown... maybe only a transparency effect apply - case IE_ANI_HIDE: - break; - - case IE_ANI_SLEEP: - strcat( ResRef, "sl" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_TWITCH: - strcat( ResRef, "tw" ); - Cycle = ( Orient / 2 ); - break; - - case IE_ANI_WALK: - strcat( ResRef, "wk" ); - Cycle = ( Orient / 2 ); - break; - default: - error("CharAnimation", "MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - break; - } - if (Orient > 9) { - strcat( ResRef, "e" ); - } -} - -void CharAnimations::PulseRGBModifiers() -{ - unsigned long time = core->GetGame()->Ticks; - - if (time - lastModUpdate <= 40) - return; - - if (time - lastModUpdate > 400) lastModUpdate = time - 40; - - int inc = (time - lastModUpdate)/40; - - if (GlobalColorMod.type != RGBModifier::NONE && - GlobalColorMod.speed > 0) - { - GlobalColorMod.phase += inc; - change[0] = change[1] = change[2] = change[3] = true; - - // reset if done - if (GlobalColorMod.phase > 2*GlobalColorMod.speed) { - GlobalColorMod.type = RGBModifier::NONE; - GlobalColorMod.phase = 0; - GlobalColorMod.speed = 0; - GlobalColorMod.locked = false; - } - } - - for (int i = 0; i < 32; ++i) { - if (ColorMods[i].type != RGBModifier::NONE && - ColorMods[i].speed > 0) - { - ColorMods[i].phase += inc; - change[i>>3] = true; - if (ColorMods[i].phase > 2*ColorMods[i].speed) { - ColorMods[i].type = RGBModifier::NONE; - ColorMods[i].phase = 0; - ColorMods[i].speed = 0; - ColorMods[i].locked = false; - } - } - } - - if (change[0]) { - change[0]=0; - SetupColors(PAL_MAIN); - } - if (change[1]) { - change[1]=0; - SetupColors(PAL_WEAPON); - } - if (change[2]) { - change[2]=0; - SetupColors(PAL_OFFHAND); - } - if (change[3]) { - change[3]=0; - SetupColors(PAL_HELMET); - } - - lastModUpdate += inc*40; -} diff --git a/project/jni/application/gemrb/gemrb/core/CharAnimations.h b/project/jni/application/gemrb/gemrb/core/CharAnimations.h deleted file mode 100644 index ea3331073..000000000 --- a/project/jni/application/gemrb/gemrb/core/CharAnimations.h +++ /dev/null @@ -1,233 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef CHARANIMATIONS_H -#define CHARANIMATIONS_H - -#include "RGBAColor.h" -#include "exports.h" - -#include "Animation.h" -#include "Palette.h" -#include "TableMgr.h" - -#include - -#define AV_PREFIX1 0 -#define AV_PREFIX2 1 -#define AV_PREFIX3 2 -#define AV_PREFIX4 3 -#define AV_ANIMTYPE 4 -#define AV_CIRCLESIZE 5 -#define AV_USE_PALETTE 6 -#define AV_SIZE 7 - -#define MAX_ANIMS 19 - -#define IE_ANI_ATTACK 0 -#define IE_ANI_AWAKE 1 -#define IE_ANI_CAST 2 -#define IE_ANI_CONJURE 3 -#define IE_ANI_DAMAGE 4 -#define IE_ANI_DIE 5 -#define IE_ANI_HEAD_TURN 6 -#define IE_ANI_READY 7 -#define IE_ANI_SHOOT 8 -#define IE_ANI_TWITCH 9 -#define IE_ANI_WALK 10 -#define IE_ANI_ATTACK_SLASH 11 -#define IE_ANI_ATTACK_BACKSLASH 12 -#define IE_ANI_ATTACK_JAB 13 -#define IE_ANI_EMERGE 14 -#define IE_ANI_HIDE 15 -#define IE_ANI_RUN 15 //pst has no hide, i hope -#define IE_ANI_SLEEP 16 -#define IE_ANI_GET_UP 17 -#define IE_ANI_PST_START 18 - -//BG2, IWD animation types -#define IE_ANI_CODE_MIRROR 0 -#define IE_ANI_ONE_FILE 1 -#define IE_ANI_FOUR_FILES 2 -#define IE_ANI_TWO_FILES 3 -#define IE_ANI_CODE_MIRROR_2 4 -#define IE_ANI_SIX_FILES_2 5 //MOGR -#define IE_ANI_TWENTYTWO 6 -#define IE_ANI_BIRD 7 -#define IE_ANI_SIX_FILES 8 //MCAR/MWYV -#define IE_ANI_TWO_FILES_3 9 //iwd animations -#define IE_ANI_TWO_FILES_2 10 //low res bg1 anim -#define IE_ANI_FOUR_FRAMES 11 //wyvern anims -#define IE_ANI_NINE_FRAMES 12 //dragon anims -#define IE_ANI_FRAGMENT 13 //fragment animation -#define IE_ANI_FOUR_FILES_2 14 //METT -#define IE_ANI_CODE_MIRROR_3 15 //MSPS -#define IE_ANI_TWO_FILES_3B 16 //iwd animations (eg. MBBM) - -//PST animation types -#define IE_ANI_PST_ANIMATION_1 56 //full animation -#define IE_ANI_PST_GHOST 57 //no orientations -#define IE_ANI_PST_STAND 58 //has orientations -#define IE_ANI_PST_ANIMATION_2 59 //full animation std-->stc -#define IE_ANI_PST_ANIMATION_3 60 //full animation stc-->std - -//armour levels -#define IE_ANI_NO_ARMOR 0 -#define IE_ANI_LIGHT_ARMOR 1 -#define IE_ANI_MEDIUM_ARMOR 2 -#define IE_ANI_HEAVY_ARMOR 3 - -#define IE_ANI_WEAPON_1H 0 -#define IE_ANI_WEAPON_2H 1 -#define IE_ANI_WEAPON_2W 2 - -#define IE_ANI_RANGED_BOW 0 -#define IE_ANI_RANGED_XBOW 1 -#define IE_ANI_RANGED_THROW 2 - -struct AvatarStruct { - /* entries from avatars.2da */ - unsigned int AnimID; - unsigned int PaletteType; - ieResRef Prefixes[4]; - unsigned char AnimationType; - unsigned char CircleSize; - char Size; - - /* comes from bloodclr.2da */ - char BloodColor; - - /* resdata.ini entries */ - unsigned int WalkScale; /* 1000 / walkscale */ - unsigned int RunScale; /* 1000 / runscale */ - int Bestiary; - - /* comes from walksnd.2da */ - ieResRef WalkSound; - ieByte WalkSoundCount; -}; - -struct EquipResRefData; - -class GEM_EXPORT CharAnimations { -private: - Animation** Anims[MAX_ANIMS][MAX_ORIENT]; - char HelmetRef[2]; - char WeaponRef[2]; - char OffhandRef[2]; -public: - const ieDword *Colors; //these are the custom color indices - RGBModifier ColorMods[32]; // color modification effects - unsigned long lastModUpdate; - RGBModifier GlobalColorMod; // global color modification effect - - bool change[4]; - Palette* palette[4]; - Palette* modifiedPalette[4]; - unsigned int AvatarsRowNum; - unsigned char ArmorType, WeaponType, RangedType; - ieResRef ResRef; - ieResRef PaletteResRef; - unsigned char nextStanceID, StanceID; - bool autoSwitchOnEnd; - bool lockPalette; -public: - CharAnimations(unsigned int AnimID, ieDword ArmourLevel); - ~CharAnimations(void); - static void ReleaseMemory(); - void SetArmourLevel(int ArmourLevel); - void SetRangedType(int Ranged); - void SetWeaponType(int WeaponType); - void SetHelmetRef(const char* ref); - void SetWeaponRef(const char* ref); - void SetOffhandRef(const char* ref); - void SetColors(const ieDword *Colors); - void CheckColorMod(); - void SetupColors(PaletteType type); - void LockPalette(const ieDword *Colors); - - // returns an array of animations of size GetTotalPartCount() - Animation** GetAnimation(unsigned char Stance, unsigned char Orient); - int GetTotalPartCount() const; - const int* GetZOrder(unsigned char Orient); - - // returns Palette for a given part (unlocked) - Palette* GetPartPalette(int part); // TODO: clean this up - -public: //attribute functions - static int GetAvatarsCount(); - static AvatarStruct *GetAvatarStruct(int RowNum); - unsigned int GetAnimationID() const; - int GetCircleSize() const; - int NoPalette() const; - int GetAnimType() const; - int GetSize() const; - int GetBloodColor() const; - const ieResRef &GetWalkSound() const; - int GetWalkSoundCount() const; - void PulseRGBModifiers(); - -private: - void DropAnims(); - void InitAvatarsTable(); - int GetActorPartCount() const; - void AddPSTSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddFFSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient, int Part); - void AddNFSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient, int Part); - void AddVHR2Suffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddVHRSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData*& equip); - void AddVHR3Suffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void GetVHREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool offhand, EquipResRefData* equip); - void AddSixSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddMHRSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData*& equip); - void GetMHREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool offhand, EquipResRefData* equip); - void AddMMRSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddMMR2Suffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddTwoFileSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddLRSuffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData*& equip); - void AddLRSuffix2( char* ResRef, unsigned char StanceID, - unsigned char& Cycle, unsigned char Orient, EquipResRefData *&EquipData); - void GetLREquipmentRef(char* ResRef, unsigned char& Cycle, - const char* equipRef, bool offhand, EquipResRefData* equip); - void AddLR2Suffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void AddLR3Suffix(char* ResRef, unsigned char AnimID, - unsigned char& Cycle, unsigned char Orient); - void GetAnimResRef(unsigned char AnimID, unsigned char Orient, - char* ResRef, unsigned char& Cycle, int Part, EquipResRefData*& equip); - void GetEquipmentResRef(const char* equipRef, bool offhand, - char* ResRef, unsigned char& Cycle, EquipResRefData* equip); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Compressor.cpp b/project/jni/application/gemrb/gemrb/core/Compressor.cpp deleted file mode 100644 index 187c160b0..000000000 --- a/project/jni/application/gemrb/gemrb/core/Compressor.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Compressor.h" - -#include "globals.h" - -Compressor::Compressor(void) -{ -} - -Compressor::~Compressor(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/Compressor.h b/project/jni/application/gemrb/gemrb/core/Compressor.h deleted file mode 100644 index dcc1ce409..000000000 --- a/project/jni/application/gemrb/gemrb/core/Compressor.h +++ /dev/null @@ -1,37 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef COMPRESSOR_H -#define COMPRESSOR_H - -#include "Plugin.h" -#include "System/DataStream.h" - -class GEM_EXPORT Compressor : public Plugin { -public: - Compressor(void); - virtual ~Compressor(void); - /** decompresses a datastream (memory or file) to a FILE * stream */ - virtual int Decompress(DataStream* dest, DataStream* source, unsigned int size_guess = 0) const = 0; - /** compresses a datastream (memory or file) to another DataStream */ - virtual int Compress(DataStream *dest, DataStream* source) const = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp b/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp deleted file mode 100644 index 7e228f6ea..000000000 --- a/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "ControlAnimation.h" - -#include "win32def.h" - -#include "AnimationFactory.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "Interface.h" -#include "Palette.h" /* needed only for paperdoll palettes */ -#include "Video.h" /* needed only for paperdoll palettes */ -#include "GUI/Button.h" - -ControlAnimation::ControlAnimation(Control* ctl, const ieResRef ResRef, int Cycle) -{ - control = NULL; - bam = NULL; - cycle = Cycle; - frame = 0; - anim_phase = 0; - - bam = ( AnimationFactory* ) gamedata->GetFactoryResource( ResRef, - IE_BAM_CLASS_ID, IE_NORMAL ); - - if (! bam) - return; - - control = ctl; - control->animation = this; - has_palette = false; - is_blended = false; -} - -//freeing the bitmaps only once, but using an intelligent algorithm -ControlAnimation::~ControlAnimation(void) -{ - //removing from timer first - core->timer->RemoveAnimation( this ); - - bam = NULL; -} - -bool ControlAnimation::SameResource(const ieResRef ResRef, int Cycle) -{ - if (!control ) return false; - if (!bam) return false; - if (strnicmp(ResRef, bam->ResRef, sizeof(ieResRef) )) return false; - int c = cycle; - if (control->Flags&IE_GUI_BUTTON_PLAYRANDOM) { - c&=~1; - } - if (Cycle!=c) return false; - return true; -} - -void ControlAnimation::UpdateAnimation(void) -{ - unsigned long time; - int Cycle = cycle; - - if (control->Flags & IE_GUI_BUTTON_PLAYRANDOM) { - // simple Finite-State Machine - if (anim_phase == 0) { - frame = 0; - anim_phase = 1; - time = 500 + 500 * (rand() % 20); - cycle&=~1; - Cycle=cycle; - } else if (anim_phase == 1) { - if (rand() % 30 == 0) { - cycle|=1; - Cycle=cycle; - } - anim_phase = 2; - time = 100; - } else { - frame++; - time = 100; - } - } else { - frame ++; - if (has_palette) { - time = 100; //hack for slower movement - } else { - time = 15; - } - } - - Sprite2D* pic = bam->GetFrame( (unsigned short) frame, (unsigned char) Cycle ); - - if (pic == NULL) { - //stopping at end frame - if (control->Flags & IE_GUI_BUTTON_PLAYONCE) { - core->timer->RemoveAnimation( this ); - control->SetAnimPicture( NULL ); - return; - } - anim_phase = 0; - frame = 0; - pic = bam->GetFrame( 0, (unsigned char) Cycle ); - } - - if (pic == NULL) { - return; - } - - if (has_palette) { - Palette* palette = pic->GetPalette(); - palette->SetupPaperdollColours(colors, 0); - if (is_blended) { - palette->CreateShadedAlphaChannel(); - } - pic->SetPalette(palette); - palette->Release(); - } else { - if (is_blended) { - Palette* palette = pic->GetPalette(); - palette->CreateShadedAlphaChannel(); - pic->SetPalette(palette); - palette->Release(); - } - } - - control->SetAnimPicture( pic ); - core->timer->AddAnimation( this, time ); -} - -void ControlAnimation::SetPaletteGradients(ieDword *col) -{ - memcpy(colors, col, 8*sizeof(ieDword)); - has_palette = true; -} - -void ControlAnimation::SetBlend(bool b) -{ - is_blended = b; -} diff --git a/project/jni/application/gemrb/gemrb/core/ControlAnimation.h b/project/jni/application/gemrb/gemrb/core/ControlAnimation.h deleted file mode 100644 index bb7a86d28..000000000 --- a/project/jni/application/gemrb/gemrb/core/ControlAnimation.h +++ /dev/null @@ -1,53 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef CONTROLANIMATIONS_H -#define CONTROLANIMATIONS_H - -#include "RGBAColor.h" -#include "exports.h" -#include "globals.h" - -#include - -class AnimationFactory; -class Control; - -class GEM_EXPORT ControlAnimation { -private: - AnimationFactory* bam; - Control* control; - unsigned int cycle; - unsigned int frame; - unsigned int anim_phase; - bool has_palette; - bool is_blended; - ieDword colors[8]; -public: - ControlAnimation(Control* ctl, const ieResRef ResRef, int Cycle = 0); - ~ControlAnimation(void); - void UpdateAnimation(); - //report if the current resource is the same as descripted by the params - bool SameResource(const ieResRef ResRef, int Cycle); - void SetPaletteGradients(ieDword *col); - void SetBlend(bool b); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Core.cpp b/project/jni/application/gemrb/gemrb/core/Core.cpp deleted file mode 100644 index 05d0911e4..000000000 --- a/project/jni/application/gemrb/gemrb/core/Core.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Core.cpp - * Some compatibility and utility functions - * @author The GemRB Project - */ - -#include "globals.h" -#include "exports.h" - -#include "Interface.h" -#include "Scriptable/Actor.h" - -#include -#include -#ifdef WIN32 -#include "win32def.h" -#ifdef _DEBUG -#include -#include -#endif - -BOOL WINAPI DllEntryPoint(HINSTANCE /*hinstDLL*/, DWORD /*fdwReason*/, - LPVOID /*lpvReserved*/) -{ - return true; -} -#endif - -//// Globally used functions - -static const unsigned char orientations[25]={ -6,7,8,9,10, -5,6,8,10,11, -4,4,0,12,12, -3,2,0,14,13, -2,1,0,15,14 -}; - -/** Calculates the orientation of a character (or projectile) facing a point */ -unsigned char GetOrient(const Point &s, const Point &d) -{ - int deltaX = s.x - d.x; - int deltaY = s.y - d.y; - int div = Distance(s,d); - if(!div) return 0; //default - if(div>3) div/=2; - int aX=deltaX/div; - int aY=deltaY/div; - return orientations[(aY+2)*5+aX+2]; -} - -/** Calculates distance between 2 points */ -unsigned int Distance(Point p, Point q) -{ - long x = ( p.x - q.x ); - long y = ( p.y - q.y ); - return (unsigned int) sqrt( ( double ) ( x* x + y* y ) ); -} - -/** Calculates distance squared from a point to a scriptable */ -unsigned int SquaredMapDistance(Point p, Scriptable *b) -{ - long x = ( p.x/16 - b->Pos.x/16 ); - long y = ( p.y/12 - b->Pos.y/12 ); - return (unsigned int)(x*x + y*y); -} - -/** Calculates distance between 2 points */ -unsigned int Distance(Point p, Scriptable *b) -{ - long x = ( p.x - b->Pos.x ); - long y = ( p.y - b->Pos.y ); - return (unsigned int) sqrt( ( double ) ( x* x + y* y ) ); -} - -unsigned int PersonalDistance(Point p, Scriptable *b) -{ - long x = ( p.x - b->Pos.x ); - long y = ( p.y - b->Pos.y ); - int ret = (int) sqrt( ( double ) ( x* x + y* y ) ); - if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*10; - } - if (ret<0) return (unsigned int) 0; - return (unsigned int) ret; -} - -unsigned int SquaredPersonalDistance(Point p, Scriptable *b) -{ - long x = ( p.x - b->Pos.x ); - long y = ( p.y - b->Pos.y ); - int ret = x*x + y*y; - if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*100; - } - if (ret<0) return (unsigned int) 0; - return (unsigned int) ret; -} - -/** Calculates map distance between 2 scriptables */ -unsigned int SquaredMapDistance(Scriptable *a, Scriptable *b) -{ - long x = (a->Pos.x/16 - b->Pos.x/16 ); - long y = (a->Pos.y/12 - b->Pos.y/12 ); - return (unsigned int)(x*x + y*y); -} - -/** Calculates distance between 2 scriptables */ -unsigned int Distance(Scriptable *a, Scriptable *b) -{ - long x = ( a->Pos.x - b->Pos.x ); - long y = ( a->Pos.y - b->Pos.y ); - return (unsigned int) sqrt( ( double ) ( x* x + y* y ) ); -} - -/** Calculates distance squared between 2 scriptables */ -unsigned int SquaredDistance(Scriptable *a, Scriptable *b) -{ - long x = ( a->Pos.x - b->Pos.x ); - long y = ( a->Pos.y - b->Pos.y ); - return (unsigned int) ( x* x + y* y ); -} - -/** Calculates distance between 2 scriptables, including feet circle if applicable */ -unsigned int PersonalDistance(Scriptable *a, Scriptable *b) -{ - long x = ( a->Pos.x - b->Pos.x ); - long y = ( a->Pos.y - b->Pos.y ); - int ret = (int) sqrt( ( double ) ( x* x + y* y ) ); - if (a->Type==ST_ACTOR) { - ret-=((Actor *)a)->size*10; - } - if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*10; - } - if (ret<0) return (unsigned int) 0; - return (unsigned int) ret; -} - -unsigned int SquaredPersonalDistance(Scriptable *a, Scriptable *b) -{ - long x = ( a->Pos.x - b->Pos.x ); - long y = ( a->Pos.y - b->Pos.y ); - int ret = x*x + y*y; - if (a->Type==ST_ACTOR) { - ret-=((Actor *)a)->size*100; - } - if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*100; - } - if (ret<0) return (unsigned int) 0; - return (unsigned int) ret; -} - -// returns EA relation between two scriptables (non actors are always enemies) -// it is used for protectile targeting/iwd ids targeting too! -int EARelation(Scriptable* Owner, Actor* target) -{ - ieDword eao = EA_ENEMY; - - if (Owner && Owner->Type==ST_ACTOR) { - eao = ((Actor *) Owner)->GetStat(IE_EA); - } - - ieDword eat = target->GetStat(IE_EA); - - if (eao<=EA_GOODCUTOFF) { - - if (eat<=EA_GOODCUTOFF) { - return EAR_FRIEND; - } - if (eat>=EA_EVILCUTOFF) { - return EAR_HOSTILE; - } - - return EAR_NEUTRAL; - } - - if (eao>=EA_EVILCUTOFF) { - - if (eat<=EA_GOODCUTOFF) { - return EAR_HOSTILE; - } - if (eat>=EA_EVILCUTOFF) { - return EAR_FRIEND; - } - - return EAR_NEUTRAL; - } - - return EAR_NEUTRAL; -} diff --git a/project/jni/application/gemrb/gemrb/core/DataFileMgr.cpp b/project/jni/application/gemrb/gemrb/core/DataFileMgr.cpp deleted file mode 100644 index 2c95d6787..000000000 --- a/project/jni/application/gemrb/gemrb/core/DataFileMgr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "DataFileMgr.h" - -DataFileMgr::DataFileMgr(void) -{ -} - -DataFileMgr::~DataFileMgr(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/DataFileMgr.h b/project/jni/application/gemrb/gemrb/core/DataFileMgr.h deleted file mode 100644 index 8df95ae7e..000000000 --- a/project/jni/application/gemrb/gemrb/core/DataFileMgr.h +++ /dev/null @@ -1,58 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file DataFileMgr.h - * Declares DataFileMgr class, abstract loader for .INI files - * @author The GemRB Project - */ - - -#ifndef DATAFILEMGR_H -#define DATAFILEMGR_H - -#include "Plugin.h" -#include "System/DataStream.h" - -/** - * @class DataFileMgr - * Abstract loader for .INI files - */ - -class GEM_EXPORT DataFileMgr : public Plugin { -public: - DataFileMgr(void); - virtual ~DataFileMgr(void); - virtual bool Open(DataStream* stream) = 0; - virtual int GetTagsCount() const = 0; - virtual const char* GetTagNameByIndex(int index) const = 0; - virtual int GetKeysCount(const char* Tag) const = 0; - virtual const char* GetKeyNameByIndex(const char* Tag, int index) const = 0; - virtual const char* GetKeyAsString(const char* Tag, const char* Key, - const char* Default) const = 0; - virtual int GetKeyAsInt(const char* Tag, const char* Key, - const int Default) const = 0; - virtual float GetKeyAsFloat(const char* Tag, const char* Key, - const float Default) const = 0; - virtual bool GetKeyAsBool(const char* Tag, const char* Key, - const bool Default) const = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Dialog.cpp b/project/jni/application/gemrb/gemrb/core/Dialog.cpp deleted file mode 100644 index a8399ee59..000000000 --- a/project/jni/application/gemrb/gemrb/core/Dialog.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Dialog.h" - -#include "win32def.h" - -#include "GameScript/GameScript.h" - -Dialog::Dialog(void) -{ - TopLevelCount = 0; -} - -Dialog::~Dialog(void) -{ - if (initialStates) { - for (unsigned int i = 0; i < TopLevelCount; i++) { - if (initialStates[i]) { - FreeDialogState( initialStates[i] ); - } - } - free(initialStates); - } - if (Order) free(Order); -} - -DialogState* Dialog::GetState(unsigned int index) -{ - if (index >= TopLevelCount) { - return NULL; - } - return initialStates[index]; -} - -void Dialog::FreeDialogState(DialogState* ds) -{ - for (unsigned int i = 0; i < ds->transitionsCount; i++) { - DialogTransition *trans = ds->transitions[i]; - for (size_t j = 0; j < trans->actions.size(); ++j) - trans->actions[j]->Release(); - if (trans->condition) - delete trans->condition; - delete( trans ); - } - free( ds->transitions ); - if (ds->condition) { - delete ds->condition; - } - delete( ds ); -} - -int Dialog::FindFirstState(Scriptable* target) -{ - for (unsigned int i = 0; i < TopLevelCount; i++) { - Condition *cond = GetState( Order[i] )->condition; - if (cond && cond->Evaluate(target)) { - return Order[i]; - } - } - return -1; -} - -int Dialog::FindRandomState(Scriptable* target) -{ - unsigned int i; - unsigned int max = TopLevelCount; - if (!max) return -1; - unsigned int pick = rand()%max; - for (i=pick; i < max; i++) { - Condition *cond = GetState(i)->condition; - if (cond && cond->Evaluate(target)) { - return i; - } - } - for (i=0; i < pick; i++) { - Condition *cond = GetState(i)->condition; - if (cond && cond->Evaluate(target)) { - return i; - } - } - return -1; -} diff --git a/project/jni/application/gemrb/gemrb/core/Dialog.h b/project/jni/application/gemrb/gemrb/core/Dialog.h deleted file mode 100644 index 2b7e921c3..000000000 --- a/project/jni/application/gemrb/gemrb/core/Dialog.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef DIALOG_H -#define DIALOG_H - -#include "exports.h" -#include "globals.h" - -#include - -#define IE_DLG_TR_TEXT 0x01 -#define IE_DLG_TR_TRIGGER 0x02 -#define IE_DLG_TR_ACTION 0x04 -#define IE_DLG_TR_FINAL 0x08 -#define IE_DLG_TR_JOURNAL 0x10 -#define IE_DLG_UNSOLVED 0x40 -#define IE_DLG_SOLVED 0x100 -#define IE_DLG_QUEST_GROUP 0x4000 // this is a GemRB extension - -class Condition; -class Action; - -struct DialogTransition { - ieDword Flags; - ieStrRef textStrRef; - ieStrRef journalStrRef; - Condition* condition; - std::vector actions; - ieResRef Dialog; - ieDword stateIndex; -}; - -struct DialogState { - ieStrRef StrRef; - DialogTransition** transitions; - unsigned int transitionsCount; - Condition* condition; - unsigned int weight; -}; - -class GEM_EXPORT Dialog { -public: - Dialog(void); - ~Dialog(void); -private: - void FreeDialogState(DialogState* ds); -public: - void AddState(DialogState* ds); - DialogState* GetState(unsigned int index); - int FindFirstState(Scriptable* target); - int FindRandomState(Scriptable* target); - - void Release() - { - delete this; - } -public: - ieResRef ResRef; - ieDword Flags; //freeze flags (bg2) - unsigned int TopLevelCount; - ieDword* Order; - DialogState** initialStates; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp b/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp deleted file mode 100644 index c2877defb..000000000 --- a/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp +++ /dev/null @@ -1,487 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "DialogHandler.h" - -#include "strrefs.h" - -#include "DialogMgr.h" -#include "DisplayMessage.h" -#include "Game.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "PluginMgr.h" -#include "ScriptEngine.h" -#include "TableMgr.h" -#include "Video.h" -#include "GameScript/GameScript.h" -#include "GUI/GameControl.h" -#include "GUI/TextArea.h" - -//translate section values (journal, solved, unsolved, user) -static int sectionMap[4]={4,1,2,0}; -static const int bg2Sections[4]={4,1,2,0}; -static const int noSections[4]={0,0,0,0}; - -DialogHandler::DialogHandler(void) -{ - dlg = NULL; - targetID = 0; - originalTargetID = 0; - speakerID = 0; - if (core->HasFeature(GF_JOURNAL_HAS_SECTIONS) ) { - memcpy(sectionMap, bg2Sections, sizeof(sectionMap) ); - } else { - memcpy(sectionMap, noSections, sizeof(sectionMap) ); - } -} - -DialogHandler::~DialogHandler(void) -{ - if (dlg) { - delete dlg; - } -} - -//Try to start dialogue between two actors (one of them could be inanimate) -bool DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgref) -{ - if (dlg) { - delete dlg; - dlg = NULL; - } - - PluginHolder dm(IE_DLG_CLASS_ID); - dm->Open(gamedata->GetResource(dlgref, IE_DLG_CLASS_ID)); - dlg = dm->GetDialog(); - - if (!dlg) { - printMessage("GameControl", "Cannot start dialog: %s\n", LIGHT_RED, dlgref); - return false; - } - - strnlwrcpy(dlg->ResRef, dlgref, 8); //this isn't handled by GetDialog??? - - //target is here because it could be changed when a dialog runs onto - //and external link, we need to find the new target (whose dialog was - //linked to) - - Actor *oldTarget = GetActorByGlobalID(targetID); - speakerID = spk->GetGlobalID(); - targetID = tgt->GetGlobalID(); - if (!originalTargetID) originalTargetID = tgt->GetGlobalID(); - if (tgt->Type==ST_ACTOR) { - Actor *tar = (Actor *) tgt; - // TODO: verify - spk->LastTalker=targetID; - tar->LastTalker=speakerID; - tar->SetCircleSize(); - } - if (oldTarget) oldTarget->SetCircleSize(); - - GameControl *gc = core->GetGameControl(); - - if (!gc) - return false; - - //check if we are already in dialog - if (gc->GetDialogueFlags()&DF_IN_DIALOG) { - return true; - } - - int si = dlg->FindFirstState( tgt ); - if (si < 0) { - return false; - } - - //we need GUI for dialogs - //but the guiscript must be in control here - //gc->UnhideGUI(); - - //no exploring while in dialogue - gc->SetScreenFlags(/*SF_GUIENABLED|*/SF_DISABLEMOUSE|SF_LOCKSCROLL, BM_OR); - gc->SetDialogueFlags(DF_IN_DIALOG, BM_OR); - - if (tgt->Type==ST_ACTOR) { - Actor *tar = (Actor *) tgt; - tar->DialogInterrupt(); - } - - //allow mouse selection from dialog (even though screen is locked) - Video *video = core->GetVideoDriver(); - Region vp = video->GetViewport(); - video->SetMouseEnabled(true); - core->timer->SetMoveViewPort( tgt->Pos.x, tgt->Pos.y, 0, true ); - video->MoveViewportTo( tgt->Pos.x-vp.w/2, tgt->Pos.y-vp.h/2 ); - //there are 3 bits, if they are all unset, the dialog freezes scripts - if (!(dlg->Flags&7) ) { - gc->SetDialogueFlags(DF_FREEZE_SCRIPTS, BM_OR); - } - //opening control size to maximum, enabling dialog window - //but the guiscript must be in control here - //core->GetGame()->SetControlStatus(CS_HIDEGUI, BM_NAND); - //core->GetGame()->SetControlStatus(CS_DIALOG, BM_OR); - //core->SetEventFlag(EF_PORTRAIT); - return true; -} - -/*try to break will only try to break it, false means unconditional stop*/ -void DialogHandler::EndDialog(bool try_to_break) -{ - if (try_to_break && (core->GetGameControl()->GetDialogueFlags()&DF_UNBREAKABLE) ) { - return; - } - - Actor *tmp = GetSpeaker(); - if (tmp) { - tmp->LeaveDialog(); - } - speakerID = 0; - Scriptable *tmp2 = GetTarget(); - if (tmp2 && tmp2->Type == ST_ACTOR) { - tmp = (Actor *)tmp2; - } else { - tmp = NULL; - } - if (tmp) { - tmp->LeaveDialog(); - } - targetID = 0; - if (tmp) tmp->SetCircleSize(); - originalTargetID = 0; - ds = NULL; - if (dlg) { - delete dlg; - dlg = NULL; - } - // FIXME: it's not so nice having this here, but things call EndDialog directly :( - core->GetGUIScriptEngine()->RunFunction( "GUIWORLD", "DialogEnded" ); - //restoring original size - core->GetGame()->SetControlStatus(CS_DIALOG, BM_NAND); - core->GetGameControl()->SetScreenFlags(SF_DISABLEMOUSE|SF_LOCKSCROLL, BM_NAND); - core->GetGameControl()->SetDialogueFlags(0, BM_SET); - core->SetEventFlag(EF_PORTRAIT); -} - - -void DialogHandler::DialogChoose(unsigned int choose) -{ - TextArea* ta = core->GetMessageTextArea(); - if (!ta) { - printMessage("GameControl","Dialog aborted???",LIGHT_RED); - EndDialog(); - return; - } - - Actor *speaker = GetSpeaker(); - if (!speaker) { - printMessage("GameControl","Speaker gone???",LIGHT_RED); - EndDialog(); - return; - } - - Scriptable *target = GetTarget(); - if (!target) { - printMessage("GameControl","Target gone???",LIGHT_RED); - EndDialog(); - return; - } - Actor *tgt = NULL; - if (target->Type == ST_ACTOR) { - tgt = (Actor *)target; - } - - Video *video = core->GetVideoDriver(); - Region vp = video->GetViewport(); - video->SetMouseEnabled(true); - core->timer->SetMoveViewPort( target->Pos.x, target->Pos.y, 0, true ); - video->MoveViewportTo( target->Pos.x-vp.w/2, target->Pos.y-vp.h/2 ); - - if (choose == (unsigned int) -1) { - //increasing talkcount after top level condition was determined - - int si = dlg->FindFirstState( tgt ); - if (si<0) { - EndDialog(); - return; - } - - if (tgt) { - if (core->GetGameControl()->GetDialogueFlags()&DF_TALKCOUNT) { - core->GetGameControl()->SetDialogueFlags(DF_TALKCOUNT, BM_NAND); - tgt->TalkCount++; - } else if (core->GetGameControl()->GetDialogueFlags()&DF_INTERACT) { - core->GetGameControl()->SetDialogueFlags(DF_INTERACT, BM_NAND); - tgt->InteractCount++; - } - } - ds = dlg->GetState( si ); - } else { - if (ds->transitionsCount <= choose) { - return; - } - - DialogTransition* tr = ds->transitions[choose]; - - ta->PopMinRow(); - - if (tr->Flags&IE_DLG_TR_JOURNAL) { - int Section = 0; - if (tr->Flags&IE_DLG_UNSOLVED) { - Section |= 1; - } - if (tr->Flags&IE_DLG_SOLVED) { - Section |= 2; - } - if (core->GetGame()->AddJournalEntry(tr->journalStrRef, sectionMap[Section], tr->Flags>>16) ) { - displaymsg->DisplayConstantString(STR_JOURNALCHANGE,0xffff00); - char *string = core->GetString( tr->journalStrRef ); - //cutting off the strings at the first crlf - char *poi = strchr(string,'\n'); - if (poi) { - *poi='\0'; - } - displaymsg->DisplayString( string ); - free( string ); - } - } - - if (tr->textStrRef != 0xffffffff) { - //allow_zero is for PST (deionarra's text) - displaymsg->DisplayStringName( (int) (tr->textStrRef), 0x8080FF, speaker, IE_STR_SOUND|IE_STR_SPEECH|IE_STR_ALLOW_ZERO); - if (core->HasFeature( GF_DIALOGUE_SCROLLS )) { - ta->AppendText( "", -1 ); - } - } - - if (tr->actions.size()) { - // does this belong here? we must clear actions somewhere before - // we start executing them (otherwise queued actions interfere) - // executing actions directly does not work, because dialog - // needs to end before final actions are executed due to - // actions making new dialogs! - if (target->Type == ST_ACTOR) ((Movable *)target)->ClearPath(); // fuzzie added this - target->ClearActions(); - - // do not interrupt during dialog actions (needed for aerie.d polymorph block) - char buf[20]; - strcpy(buf, "SetInterrupt(FALSE)"); - target->AddAction( GenerateAction( buf ) ); - for (unsigned int i = 0; i < tr->actions.size(); i++) { - target->AddAction(tr->actions[i]); - } - strcpy(buf, "SetInterrupt(TRUE)"); - target->AddAction( GenerateAction( buf ) ); - } - - int final_dialog = tr->Flags & IE_DLG_TR_FINAL; - - if (final_dialog) { - ta->SetMinRow( false ); - EndDialog(); - } - - if (final_dialog) { - return; - } - - // avoid problems when dhjollde.dlg tries starting a cutscene in the middle of a dialog - // (it seems harmless doing it in non-HoW too, since other versions would just break in such a situation) - core->SetCutSceneMode( false ); - - //displaying dialog for selected option - int si = tr->stateIndex; - //follow external linkage, if required - if (tr->Dialog[0] && strnicmp( tr->Dialog, dlg->ResRef, 8 )) { - //target should be recalculated! - tgt = NULL; - if (originalTargetID) { - // always try original target first (sometimes there are multiple - // actors with the same dialog in an area, we want to pick the one - // we were talking to) - tgt = GetActorByGlobalID(originalTargetID); - if (tgt && strnicmp( tgt->GetDialog(GD_NORMAL), tr->Dialog, 8 ) != 0) { - tgt = NULL; - } - } - if (!tgt) { - // then just search the current area for an actor with the dialog - tgt = target->GetCurrentArea()->GetActorByDialog(tr->Dialog); - } - if (!tgt) { - // try searching for banter dialogue: the original engine seems to - // happily let you randomly switch between normal and banter dialogs - - // TODO: work out if this should go somewhere more central (such - // as GetActorByDialog), or if there's a less awful way to do this - // (we could cache the entries, for example) - // TODO: fix for ToB (see also the Interact action) - AutoTable pdtable("interdia"); - if (pdtable) { - int row = pdtable->FindTableValue( pdtable->GetColumnIndex("FILE"), tr->Dialog ); - tgt = target->GetCurrentArea()->GetActorByScriptName(pdtable->GetRowName(row)); - } - } - target = tgt; - if (!target) { - printMessage("Dialog","Can't redirect dialog\n",YELLOW); - ta->SetMinRow( false ); - EndDialog(); - return; - } - Actor *oldTarget = GetActorByGlobalID(targetID); - targetID = tgt->GetGlobalID(); - tgt->SetCircleSize(); - if (oldTarget) oldTarget->SetCircleSize(); - // we have to make a backup, tr->Dialog is freed - ieResRef tmpresref; - strnlwrcpy(tmpresref,tr->Dialog, 8); - /*if (target->GetInternalFlag()&IF_NOINT) { - // this whole check moved out of InitDialog by fuzzie, see comments - // for the IF_NOINT check in BeginDialog - displaymsg->DisplayConstantString(STR_TARGETBUSY,0xff0000); - ta->SetMinRow( false ); - EndDialog(); - return; - }*/ - if (!InitDialog( speaker, target, tmpresref)) { - // error was displayed by InitDialog - ta->SetMinRow( false ); - EndDialog(); - return; - } - } - ds = dlg->GetState( si ); - if (!ds) { - printMessage("Dialog","Can't find next dialog\n",YELLOW); - ta->SetMinRow( false ); - EndDialog(); - return; - } - } - //displaying npc text - displaymsg->DisplayStringName( ds->StrRef, 0x70FF70, target, IE_STR_SOUND|IE_STR_SPEECH); - //adding a gap between options and npc text - ta->AppendText("",-1); - int i; - int idx = 0; - ta->SetMinRow( true ); - //first looking for a 'continue' opportunity, the order is descending (a la IE) - unsigned int x = ds->transitionsCount; - while(x--) { - if (ds->transitions[x]->Flags & IE_DLG_TR_FINAL) { - continue; - } - if (ds->transitions[x]->textStrRef != 0xffffffff) { - continue; - } - if (ds->transitions[x]->Flags & IE_DLG_TR_TRIGGER) { - if (ds->transitions[x]->condition && - !ds->transitions[x]->condition->Evaluate(target)) { - continue; - } - } - core->GetDictionary()->SetAt("DialogOption",x); - core->GetGameControl()->SetDialogueFlags(DF_OPENCONTINUEWINDOW, BM_OR); - goto end_of_choose; - } - for (x = 0; x < ds->transitionsCount; x++) { - if (ds->transitions[x]->Flags & IE_DLG_TR_TRIGGER) { - if (ds->transitions[x]->condition && - !ds->transitions[x]->condition->Evaluate(target)) { - continue; - } - } - idx++; - if (ds->transitions[x]->textStrRef == 0xffffffff) { - //dialogchoose should be set to x - //it isn't important which END option was chosen, as it ends - core->GetDictionary()->SetAt("DialogOption",x); - core->GetGameControl()->SetDialogueFlags(DF_OPENENDWINDOW, BM_OR); - } else { - char *string = ( char * ) malloc( 40 ); - sprintf( string, "[s=%d,ffffff,ff0000]%d - [p]", x, idx ); - i = ta->AppendText( string, -1 ); - free( string ); - string = core->GetString( ds->transitions[x]->textStrRef ); - ta->AppendText( string, i ); - free( string ); - ta->AppendText( "[/p][/s]", i ); - } - } - // this happens if a trigger isn't implemented or the dialog is wrong - if (!idx) { - printMessage("Dialog", "There were no valid dialog options!\n", YELLOW); - core->GetGameControl()->SetDialogueFlags(DF_OPENENDWINDOW, BM_OR); - } -end_of_choose: - //padding the rows so our text will be at the top - if (core->HasFeature( GF_DIALOGUE_SCROLLS )) { - ta->AppendText( "", -1 ); - } - else { - ta->PadMinRow(); - } -} - -// TODO: duplicate of the one in GameControl -Actor *DialogHandler::GetActorByGlobalID(ieDword ID) -{ - if (!ID) - return NULL; - Game* game = core->GetGame(); - if (!game) - return NULL; - - Map* area = game->GetCurrentArea( ); - if (!area) - return NULL; - return area->GetActorByGlobalID(ID); -} - -Scriptable *DialogHandler::GetTarget() -{ - // TODO: area GetScriptableByGlobalID? - - if (!targetID) return NULL; - - Game *game = core->GetGame(); - if (!game) return NULL; - - Map *area = game->GetCurrentArea(); - if (!area) return NULL; - - Actor *actor = area->GetActorByGlobalID(targetID); - if (actor) return actor; - - Door *door = area->GetDoorByGlobalID(targetID); - if (door) return (Scriptable *)door; - Container *container = area->GetContainerByGlobalID(targetID); - if (container) return (Scriptable *)container; - InfoPoint *ip = area->GetInfoPointByGlobalID(targetID); - if (ip) return (Scriptable *)ip; - - return NULL; -} - -Actor *DialogHandler::GetSpeaker() -{ - return GetActorByGlobalID(speakerID); -} - diff --git a/project/jni/application/gemrb/gemrb/core/DialogHandler.h b/project/jni/application/gemrb/gemrb/core/DialogHandler.h deleted file mode 100644 index 8f80d147d..000000000 --- a/project/jni/application/gemrb/gemrb/core/DialogHandler.h +++ /dev/null @@ -1,51 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef DIALOGHANDLER_H -#define DIALOGHANDLER_H - -#include "exports.h" - -#include "Dialog.h" - -class GEM_EXPORT DialogHandler { -public: - DialogHandler(); - ~DialogHandler(); -private: - /** this function safely retrieves an Actor by ID */ - Actor *GetActorByGlobalID(ieDword ID); -private: - DialogState* ds; - Dialog* dlg; -public: - ieDword speakerID; - ieDword targetID; - ieDword originalTargetID; -public: - Scriptable *GetTarget(); - Actor *GetSpeaker(); - - bool InitDialog(Scriptable* speaker, Scriptable* target, const char* dlgref); - void EndDialog(bool try_to_break=false); - void DialogChoose(unsigned int choose); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/DialogMgr.cpp b/project/jni/application/gemrb/gemrb/core/DialogMgr.cpp deleted file mode 100644 index bc68aa544..000000000 --- a/project/jni/application/gemrb/gemrb/core/DialogMgr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "DialogMgr.h" - -DialogMgr::DialogMgr(void) -{ -} - -DialogMgr::~DialogMgr(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/DialogMgr.h b/project/jni/application/gemrb/gemrb/core/DialogMgr.h deleted file mode 100644 index be4128b31..000000000 --- a/project/jni/application/gemrb/gemrb/core/DialogMgr.h +++ /dev/null @@ -1,36 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef DIALOGMGR_H -#define DIALOGMGR_H - -#include "Dialog.h" -#include "Plugin.h" -#include "System/DataStream.h" - -class GEM_EXPORT DialogMgr : public Plugin { -public: - DialogMgr(void); - virtual ~DialogMgr(void); - virtual bool Open(DataStream* stream) = 0; - virtual Dialog* GetDialog() const = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp b/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp deleted file mode 100644 index 26b016f20..000000000 --- a/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/* GemRB - Infinity Engine Emulator -* Copyright (C) 2003-2005 The GemRB Project -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. - -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. - -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* -*/ - -#include "DisplayMessage.h" - -#include "strrefs.h" - -#include "Interface.h" -#include "TableMgr.h" -#include "GUI/Label.h" -#include "GUI/TextArea.h" -#include "Scriptable/Actor.h" - -GEM_EXPORT DisplayMessage * displaymsg; - -static int strref_table[STRREF_COUNT]; - -#define PALSIZE 8 -static Color ActorColor[PALSIZE]; -static const char* DisplayFormatName = "[color=%06X]%s - [/color][p][color=%06X]%s[/color][/p]"; -static const char* DisplayFormatAction = "[color=%06X]%s - [/color][p][color=%06X]%s %s[/color][/p]"; -static const char* DisplayFormat = "[/color][p][color=%06X]%s[/color][/p]"; -static const char* DisplayFormatValue = "[/color][p][color=%06X]%s: %d[/color][/p]"; -static const char* DisplayFormatNameString = "[color=%06X]%s - [/color][p][color=%06X]%s: %s[/color][/p]"; - -DisplayMessage::DisplayMessage(void) { - ReadStrrefs(); -} - -bool DisplayMessage::ReadStrrefs() -{ - int i; - memset(strref_table,-1,sizeof(strref_table) ); - AutoTable tab("strings"); - if (!tab) { - return false; - } - for(i=0;iQueryField(i,0)); - } - return true; -} - -void DisplayMessage::DisplayString(const char* Text, Scriptable *target) const -{ - Label *l = core->GetMessageLabel(); - if (l) { - l->SetText(Text); - } - TextArea *ta = core->GetMessageTextArea(); - if (ta) { - ta->AppendText( Text, -1 ); - } else { - if(target) { - char *tmp = strdup(Text); - - target->DisplayHeadText(tmp); - } - } -} - -ieStrRef DisplayMessage::GetStringReference(int stridx) const -{ - return strref_table[stridx]; -} - -bool DisplayMessage::HasStringReference(int stridx) const -{ - return strref_table[stridx] != -1; -} - -unsigned int DisplayMessage::GetSpeakerColor(const char *&name, const Scriptable *&speaker) const -{ - unsigned int speaker_color; - - if(!speaker) return 0; - switch (speaker->Type) { - case ST_ACTOR: - name = speaker->GetName(-1); - core->GetPalette( ((Actor *) speaker)->GetStat(IE_MAJOR_COLOR) & 0xFF, PALSIZE, ActorColor ); - speaker_color = (ActorColor[4].r<<16) | (ActorColor[4].g<<8) | ActorColor[4].b; - break; - case ST_TRIGGER: case ST_PROXIMITY: case ST_TRAVEL: - name = core->GetString( speaker->DialogName ); - speaker_color = 0xc0c0c0; - break; - default: - name = ""; - speaker_color = 0x800000; - break; - } - return speaker_color; -} - - -//simply displaying a constant string -void DisplayMessage::DisplayConstantString(int stridx, unsigned int color, Scriptable *target) const -{ - if (stridx<0) return; - char* text = core->GetString( strref_table[stridx], IE_STR_SOUND ); - DisplayString(text, color, target); - core->FreeString(text); -} - -void DisplayMessage::DisplayString(int stridx, unsigned int color, ieDword flags) const -{ - if (stridx<0) return; - char* text = core->GetString( stridx, flags); - DisplayString(text, color, NULL); - core->FreeString(text); -} - -void DisplayMessage::DisplayString(const char *text, unsigned int color, Scriptable *target) const -{ - if (!text) return; - int newlen = (int)(strlen( DisplayFormat) + strlen( text ) + 12); - char* newstr = ( char* ) malloc( newlen ); - snprintf( newstr, newlen, DisplayFormat, color, text ); - DisplayString( newstr, target ); - free( newstr ); -} - -// String format is -// blah : whatever -void DisplayMessage::DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const -{ - if (stridx<0) return; - char* text = core->GetString( strref_table[stridx], IE_STR_SOUND ); - int newlen = (int)(strlen( DisplayFormat ) + strlen( text ) + 28); - char* newstr = ( char* ) malloc( newlen ); - snprintf( newstr, newlen, DisplayFormatValue, color, text, (int) value ); - core->FreeString( text ); - DisplayString( newstr ); - free( newstr ); -} - -// String format is -// - blah blah : whatever -void DisplayMessage::DisplayConstantStringNameString(int stridx, unsigned int color, int stridx2, const Scriptable *actor) const -{ - unsigned int actor_color; - const char *name = 0; - - if (stridx<0) return; - actor_color = GetSpeakerColor(name, actor); - char* text = core->GetString( strref_table[stridx], IE_STR_SOUND ); - char* text2 = core->GetString( strref_table[stridx2], IE_STR_SOUND ); - int newlen = (int)(strlen( DisplayFormat ) + strlen(name) + strlen( text ) + strlen(text2) + 20); - char* newstr = ( char* ) malloc( newlen ); - if (strlen(text2)) { - snprintf( newstr, newlen, DisplayFormatNameString, actor_color, name, color, text, text2 ); - } else { - snprintf( newstr, newlen, DisplayFormatName, color, name, color, text ); - } - core->FreeString( text ); - core->FreeString( text2 ); - DisplayString( newstr ); - free( newstr ); -} - -// String format is -// - blah blah -void DisplayMessage::DisplayConstantStringName(int stridx, unsigned int color, const Scriptable *speaker) const -{ - if (stridx<0) return; - if(!speaker) return; - - char* text = core->GetString( strref_table[stridx], IE_STR_SOUND|IE_STR_SPEECH ); - DisplayStringName(text, color, speaker); - core->FreeString(text); -} - -// String format is -// - blah blah -void DisplayMessage::DisplayConstantStringAction(int stridx, unsigned int color, const Scriptable *attacker, const Scriptable *target) const -{ - unsigned int attacker_color; - const char *name1 = 0; - const char *name2 = 0; - - if (stridx<0) return; - - GetSpeakerColor(name2, target); - attacker_color = GetSpeakerColor(name1, attacker); - - char* text = core->GetString( strref_table[stridx], IE_STR_SOUND|IE_STR_SPEECH ); - int newlen = (int)(strlen( DisplayFormatAction ) + strlen( name1 ) + - + strlen( name2 ) + strlen( text ) + 18); - char* newstr = ( char* ) malloc( newlen ); - snprintf( newstr, newlen, DisplayFormatAction, attacker_color, name1, color, - text, name2); - core->FreeString( text ); - DisplayString( newstr ); - free( newstr ); -} - -void DisplayMessage::DisplayStringName(int stridx, unsigned int color, const Scriptable *speaker, ieDword flags) const -{ - if (stridx<0) return; - - char* text = core->GetString( stridx, flags); - DisplayStringName(text, color, speaker); - core->FreeString( text ); -} - -void DisplayMessage::DisplayStringName(const char *text, unsigned int color, const Scriptable *speaker) const -{ - unsigned int speaker_color; - const char *name = 0; - - if (!text) return; - speaker_color = GetSpeakerColor(name, speaker); - - //FIXME: what happens if there is no name? - if (name) { - int newlen = (int)(strlen( DisplayFormatName ) + strlen( name ) + - + strlen( text ) + 18); - char* newstr = ( char* ) malloc( newlen ); - snprintf( newstr, newlen, DisplayFormatName, speaker_color, name, color, text ); - DisplayString( newstr ); - free( newstr ); - } -} diff --git a/project/jni/application/gemrb/gemrb/core/DisplayMessage.h b/project/jni/application/gemrb/gemrb/core/DisplayMessage.h deleted file mode 100644 index 02a6d48ab..000000000 --- a/project/jni/application/gemrb/gemrb/core/DisplayMessage.h +++ /dev/null @@ -1,73 +0,0 @@ -/* GemRB - Infinity Engine Emulator -* Copyright (C) 2003-2005 The GemRB Project -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. - -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. - -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* -*/ - -/** - * @file DisplayMessage.h - * Declaration of the DisplayMessage class used for displaying messages in - * game message window - */ - -#ifndef DISPLAYMESSAGE_H -#define DISPLAYMESSAGE_H - -#include "exports.h" -#include "ie_types.h" - -#include - -class Scriptable; - -class GEM_EXPORT DisplayMessage -{ -private: - bool ReadStrrefs(); - -public: - DisplayMessage(void); - - /** returns a string reference from a string reference index constant */ - ieStrRef GetStringReference(int stridx) const; - /** returns true if a string reference for a string reference index constant exists */ - bool HasStringReference(int stridx) const; - /** returns the speaker's color and name */ - unsigned int GetSpeakerColor(const char *&name, const Scriptable *&speaker) const; - /** displays any string in the textarea */ - void DisplayString(const char *txt, Scriptable *speaker=NULL) const; - /** displays a string constant in the textarea */ - void DisplayConstantString(int stridx, unsigned int color, Scriptable *speaker=NULL) const; - /** displays actor name - action : parameter */ - void DisplayConstantStringNameString(int stridx, unsigned int color, int stridx2, const Scriptable *actor) const; - /** displays a string constant followed by a number in the textarea */ - void DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const; - /** displays a string constant in the textarea, starting with speaker's name */ - void DisplayConstantStringName(int stridx, unsigned int color, const Scriptable *speaker) const; - /** displays a string constant in the textarea, starting with actor, and ending with target */ - void DisplayConstantStringAction(int stridx, unsigned int color, const Scriptable *actor, const Scriptable *target) const; - /** displays a string in the textarea */ - void DisplayString(int stridx, unsigned int color, ieDword flags) const; - void DisplayString(const char *text, unsigned int color, Scriptable *target) const; - /** displays a string in the textarea, starting with speaker's name */ - void DisplayStringName(int stridx, unsigned int color, const Scriptable *speaker, ieDword flags) const; - void DisplayStringName(const char *text, unsigned int color, const Scriptable *speaker) const; -}; - -extern GEM_EXPORT DisplayMessage * displaymsg; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Effect.h b/project/jni/application/gemrb/gemrb/core/Effect.h deleted file mode 100644 index 400c6bcbd..000000000 --- a/project/jni/application/gemrb/gemrb/core/Effect.h +++ /dev/null @@ -1,139 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Effect.h - * Declares Effect class implementing spell and spell-like effects - * and related defines - */ - -#ifndef EFFECT_H -#define EFFECT_H - -#include "ie_types.h" - -#include "Region.h" - -class Actor; - -//local variables in creatures are stored in fake opcodes -#define FAKE_VARIABLE_OPCODE 187 -#define FAKE_VARIABLE_MARKER 1 - -// Effect target types -#define FX_TARGET_UNKNOWN 0 -#define FX_TARGET_SELF 1 -#define FX_TARGET_PRESET 2 -#define FX_TARGET_PARTY 3 -#define FX_TARGET_ALL 4 -#define FX_TARGET_ALL_BUT_PARTY 5 -#define FX_TARGET_OWN_SIDE 6 -#define FX_TARGET_OTHER_SIDE 7 -#define FX_TARGET_ALL_BUT_SELF 8 -#define FX_TARGET_ORIGINAL 9 - -// Effect duration/timing types -#define FX_DURATION_INSTANT_LIMITED 0 -#define FX_DURATION_INSTANT_PERMANENT 1 -#define FX_DURATION_INSTANT_WHILE_EQUIPPED 2 -#define FX_DURATION_DELAY_LIMITED 3 //this contains a relative onset time (delay) also used as duration, transforms to 6 when applied -#define FX_DURATION_DELAY_PERMANENT 4 //this transforms to 9 (i guess) -#define FX_DURATION_DELAY_UNSAVED 5 //this transforms to 8 -#define FX_DURATION_DELAY_LIMITED_PENDING 6 //this contains an absolute onset time and a duration -#define FX_DURATION_AFTER_EXPIRES 7 //this is a delayed non permanent effect (resolves to JUST_EXPIRED) -#define FX_DURATION_PERMANENT_UNSAVED 8 -#define FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES 9//this is a special permanent -#define FX_DURATION_JUST_EXPIRED 10 -#define MAX_TIMING_MODE 11 -#define FX_DURATION_ABSOLUTE 0x1000 - -// Effect resistance types -#define FX_NO_RESIST_NO_DISPEL 0 -#define FX_CAN_RESIST_CAN_DISPEL 1 -//#define FX_CAN_RESIST_NO_DISPEL 2 //same as 0 (not resistable, not dispellable) -#define FX_NO_RESIST_CAN_DISPEL 3 -#define FX_CAN_DISPEL 1 -#define FX_CAN_RESIST 3 - -/** - * @class Effect - * Structure holding information about single spell or spell-like effect. - */ - -// the same as ITMFeature and SPLFeature -struct Effect { - ieDword Opcode; - ieDword Target; - ieDword Power; - ieDword Parameter1; - ieDword Parameter2; - ieWord TimingMode; //0x1000 -- no need of conversion - ieWord unknown2; - ieDword Resistance; - ieDword Duration; - ieWord Probability1; - ieWord Probability2; - //keep these four in one bunch, VariableName will - //spread across them - ieResRef Resource; - ieResRef Resource2; //vvc in a lot of effects - ieResRef Resource3; - ieResRef Resource4; - ieDword DiceThrown; - ieDword DiceSides; - ieDword SavingThrowType; - ieDword SavingThrowBonus; - ieWord IsVariable; - ieWord IsSaveForHalfDamage; - - // EFF V2.0 fields: - ieDword PrimaryType; //school - ieDword MinAffectedLevel; - ieDword MaxAffectedLevel; - ieDword Parameter3; - ieDword Parameter4; - ieDword PosX, PosY; - ieDword SourceType; //1-item, 2-spell - ieResRef Source; - ieDword SourceFlags; - ieDword Projectile; //9c - ieDwordSigned InventorySlot; //a0 - //Original engine had a VariableName here, but it is stored in the resource fields - ieDword CasterLevel; //c4 in both - ieDword FirstApply; //c8 in bg2, cc in iwd2 - ieDword SecondaryType; - ieDword SecondaryDelay; //still not sure about this - ieDword CasterID; //10c in bg2 (not saved?) - // These are not in the IE files, but are our precomputed values - ieDword random_value; -public: - //don't modify position in case it was already set - void SetPosition(const Point &p) { - if(PosX==0xffffffff && PosY==0xffffffff) { - PosX=p.x; - PosY=p.y; - } - } -}; - -// FIXME: what about area spells? They can have map & coordinates as target -//void AddEffect(Effect* fx, Actor* self, Actor* pretarget); - -#endif // ! EFFECT_H diff --git a/project/jni/application/gemrb/gemrb/core/EffectMgr.cpp b/project/jni/application/gemrb/gemrb/core/EffectMgr.cpp deleted file mode 100644 index 7ca50f42e..000000000 --- a/project/jni/application/gemrb/gemrb/core/EffectMgr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "EffectMgr.h" - -EffectMgr::EffectMgr(void) -{ -} - -EffectMgr::~EffectMgr(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/EffectMgr.h b/project/jni/application/gemrb/gemrb/core/EffectMgr.h deleted file mode 100644 index 689651c55..000000000 --- a/project/jni/application/gemrb/gemrb/core/EffectMgr.h +++ /dev/null @@ -1,56 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file EffectMgr.h - * Declares EffectMgr class, loader for Effect objects - * @author The GemRB Project - */ - - -#ifndef EFFECTMGR_H -#define EFFECTMGR_H - -#include "Effect.h" -#include "Plugin.h" -#include "System/DataStream.h" - -/** - * @class EffectMgr - * Abstract loader for Effect objects - */ - -class GEM_EXPORT EffectMgr : public Plugin { -public: - EffectMgr(void); - virtual ~EffectMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; - - /** Fills fx with Effect data loaded from the stream */ - virtual Effect* GetEffect(Effect *fx) = 0; - /** Fills fx with Effect v1 data loaded from the stream*/ - virtual Effect* GetEffectV1(Effect *fx) = 0; - /** Fills fx with Effect v2.0 data loaded from the stream*/ - virtual Effect* GetEffectV20(Effect *fx) = 0; - /** Fills the stream with Effect v2 data loaded from the effect*/ - virtual void PutEffectV2(DataStream *stream, const Effect *fx) = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp b/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp deleted file mode 100644 index 878ee02c5..000000000 --- a/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp +++ /dev/null @@ -1,1960 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "EffectQueue.h" - -#include "DisplayMessage.h" -#include "Effect.h" -#include "Game.h" -#include "Interface.h" -#include "Map.h" -#include "SymbolMgr.h" -#include "Scriptable/Actor.h" -#include "Spell.h" //needs for the source flags bitfield -#include "TableMgr.h" - -#include - -static struct { - const char* Name; - EffectFunction Function; - int Strref; - int Flags; -} Opcodes[MAX_EFFECTS]; - -static int initialized = 0; -static EffectDesc *effectnames = NULL; -static int effectnames_count = 0; -static int pstflags = false; - -bool EffectQueue::match_ids(Actor *target, int table, ieDword value) -{ - if( value == 0) { - return true; - } - - int a, stat; - - switch (table) { - case 2: //EA - stat = IE_EA; break; - case 3: //GENERAL - //this is a hack to support dead only projectiles in PST - //if it interferes with something feel free to remove - if (value==GEN_DEAD) { - if (target->GetStat(IE_STATE_ID)&STATE_DEAD) { - return true; - } - } - stat = IE_GENERAL; break; - case 4: //RACE - stat = IE_RACE; break; - case 5: //CLASS - stat = IE_CLASS; break; - case 6: //SPECIFIC - stat = IE_SPECIFIC; break; - case 7: //GENDER - stat = IE_SEX; break; - case 8: //ALIGNMENT - stat = target->GetStat(IE_ALIGNMENT); - a = value&15; - if( a) { - if( a != ( stat & 15 )) { - return false; - } - } - a = value & 0xf0; - if( a) { - if( a != ( stat & 0xf0 )) { - return false; - } - } - return true; - default: - return false; - } - if( target->GetStat(stat)==value) { - return true; - } - return false; -} - -static const bool fx_instant[MAX_TIMING_MODE]={true,true,true,false,false,false,false,false,true,true,true}; - -static inline bool IsInstant(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return false; - return fx_instant[timingmode]; -} - -static const bool fx_equipped[MAX_TIMING_MODE]={false,false,true,false,false,true,false,false,true,false,false}; - -static inline bool IsEquipped(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return false; - return fx_equipped[timingmode]; -} - -// 0 1 2 3 4 5 6 7 8 9 10 -static const bool fx_relative[MAX_TIMING_MODE]={true,false,false,true,true,true,false,false,false,false,false}; - -static inline bool NeedPrepare(ieWord timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return false; - return fx_relative[timingmode]; -} - -#define INVALID -1 -#define PERMANENT 0 -#define DELAYED 1 -#define DURATION 2 - -static const int fx_prepared[MAX_TIMING_MODE]={DURATION,PERMANENT,PERMANENT,DELAYED, //0-3 -DELAYED,DELAYED,DELAYED,DELAYED,PERMANENT,PERMANENT,PERMANENT}; //4-7 - -static inline int DelayType(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return INVALID; - return fx_prepared[timingmode]; -} - -//which effects are removable -static const bool fx_removable[MAX_TIMING_MODE]={true,true,false,true,true,false,true,true,false,false,true}; - -static inline int IsRemovable(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return INVALID; - return fx_removable[timingmode]; -} - -//change the timing method after the effect triggered -static const ieByte fx_triggered[MAX_TIMING_MODE]={FX_DURATION_JUST_EXPIRED,FX_DURATION_INSTANT_PERMANENT,//0,1 -FX_DURATION_INSTANT_WHILE_EQUIPPED,FX_DURATION_DELAY_LIMITED_PENDING,//2,3 -FX_DURATION_AFTER_EXPIRES,FX_DURATION_PERMANENT_UNSAVED, //4,5 -FX_DURATION_INSTANT_LIMITED,FX_DURATION_JUST_EXPIRED,FX_DURATION_PERMANENT_UNSAVED,//6,8 -FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES,FX_DURATION_JUST_EXPIRED};//9,10 - -//change the timing method for effect that should trigger after this effect expired -static const ieDword fx_to_delayed[]={FX_DURATION_JUST_EXPIRED,FX_DURATION_JUST_EXPIRED, -FX_DURATION_PERMANENT_UNSAVED,FX_DURATION_DELAY_LIMITED_PENDING, -FX_DURATION_AFTER_EXPIRES,FX_DURATION_PERMANENT_UNSAVED, //4,5 -FX_DURATION_JUST_EXPIRED,FX_DURATION_JUST_EXPIRED,FX_DURATION_JUST_EXPIRED,//6,8 -FX_DURATION_JUST_EXPIRED,FX_DURATION_JUST_EXPIRED};//9,10 - -static inline ieByte TriggeredEffect(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return false; - return fx_triggered[timingmode]; -} - -static int compare_effects(const void *a, const void *b) -{ - return stricmp(((EffectRef *) a)->Name,((EffectRef *) b)->Name); -} - -static int find_effect(const void *a, const void *b) -{ - return stricmp((const char *) a,((const EffectRef *) b)->Name); -} - -static EffectDesc* FindEffect(const char* effectname) -{ - if( !effectname || !effectnames) { - return NULL; - } - void *tmp = bsearch(effectname, effectnames, effectnames_count, sizeof(EffectDesc), find_effect); - if( !tmp) { - printMessage("EffectQueue", "Couldn't assign effect: %s\n", YELLOW, effectname); - } - return (EffectDesc *) tmp; -} - -static EffectRef fx_protection_from_display_string_ref = { "Protection:String", -1 }; - -static inline void ResolveEffectRef(EffectRef &effect_reference) -{ - if( effect_reference.opcode==-1) { - EffectDesc* ref = FindEffect(effect_reference.Name); - if( ref && ref->opcode>=0) { - effect_reference.opcode = ref->opcode; - return; - } - effect_reference.opcode = -2; - } -} - -bool Init_EffectQueue() -{ - int i; - - if( initialized) { - return true; - } - pstflags = !!core->HasFeature(GF_PST_STATE_FLAGS); - - memset( Opcodes, 0, sizeof( Opcodes ) ); - for(i=0;iLoadSymbol( "effects" ); - if( eT < 0) { - printMessage( "EffectQueue","A critical scripting file is missing!\n",LIGHT_RED ); - return false; - } - Holder effectsTable = core->GetSymbol( eT ); - if( !effectsTable) { - printMessage( "EffectQueue","A critical scripting file is damaged!\n",LIGHT_RED ); - return false; - } - - for (i = 0; i < MAX_EFFECTS; i++) { - const char* effectname = effectsTable->GetValue( i ); - if( efftextTable) { - int row = efftextTable->GetRowCount(); - while (row--) { - const char* ret = efftextTable->GetRowName( row ); - long val; - if( valid_number( ret, val ) && (i == val) ) { - Opcodes[i].Strref = atoi( efftextTable->QueryField( row, 1 ) ); - } - } - } - - EffectDesc* poi = FindEffect( effectname ); - if( poi != NULL) { - Opcodes[i].Function = poi->Function; - Opcodes[i].Name = poi->Name; - Opcodes[i].Flags = poi->Flags; - //reverse linking opcode number - //using this unused field - if( (poi->opcode!=-1) && effectname[0]!='*') { - error("EffectQueue", "Clashing Opcodes FN: %d vs. %d, %s\n", i, poi->opcode, effectname); - } - poi->opcode = i; - } - //print("-------- FN: %d, %s\n", i, effectname); - } - core->DelSymbol( eT ); - - return true; -} - -void EffectQueue_ReleaseMemory() -{ - if( effectnames) { - free (effectnames); - } - effectnames_count = 0; - effectnames = NULL; -} - -void EffectQueue_RegisterOpcodes(int count, const EffectDesc* opcodes) -{ - if( ! effectnames) { - effectnames = (EffectDesc*) malloc( (count+1) * sizeof( EffectDesc ) ); - } else { - effectnames = (EffectDesc*) realloc( effectnames, (effectnames_count + count + 1) * sizeof( EffectDesc ) ); - } - - memcpy( effectnames + effectnames_count, opcodes, count * sizeof( EffectDesc )); - effectnames_count += count; - effectnames[effectnames_count].Name = NULL; - //if we merge two effect lists, then we need to sort their effect tables - //actually, we might always want to sort this list, so there is no - //need to do it manually (sorted table is needed if we use bsearch) - qsort(effectnames, effectnames_count, sizeof(EffectDesc), compare_effects); -} - -EffectQueue::EffectQueue() -{ - Owner = NULL; -} - -EffectQueue::~EffectQueue() -{ - std::list< Effect* >::iterator f; - - for ( f = effects.begin(); f != effects.end(); f++ ) { - delete (*f); - } -} - -Effect *EffectQueue::CreateEffect(ieDword opcode, ieDword param1, ieDword param2, ieWord timing) -{ - if( opcode==0xffffffff) { - return NULL; - } - Effect *fx = new Effect(); - if( !fx) { - return NULL; - } - memset(fx,0,sizeof(Effect)); - fx->Target = FX_TARGET_SELF; - fx->Opcode = opcode; - //probability2 is the low number (by effectqueue 331) - fx->Probability1 = 100; - fx->Parameter1 = param1; - fx->Parameter2 = param2; - fx->TimingMode = timing; - fx->PosX = 0xffffffff; - fx->PosY = 0xffffffff; - return fx; -} - -//return the count of effects with matching parameters -//useful for effects where there is no separate stat to see -ieDword EffectQueue::CountEffects(EffectRef &effect_reference, ieDword param1, ieDword param2, const char *resource) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return 0; - } - return CountEffects(effect_reference.opcode, param1, param2, resource); -} - -//Change the location of an existing effect -//this is used when some external code needs to adjust the effect's location -//used when the gui sets the effect's final target -void EffectQueue::ModifyEffectPoint(EffectRef &effect_reference, ieDword x, ieDword y) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return; - } - ModifyEffectPoint(effect_reference.opcode, x, y); -} - -Effect *EffectQueue::CreateEffect(EffectRef &effect_reference, ieDword param1, ieDword param2, ieWord timing) -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return NULL; - } - return CreateEffect(effect_reference.opcode, param1, param2, timing); -} - -//copies the whole effectqueue (area projectiles use it) -EffectQueue *EffectQueue::CopySelf() const -{ - EffectQueue *effects; - - effects = new EffectQueue(); - std::list< Effect* >::const_iterator fxit = GetFirstEffect(); - Effect *fx; - - while( (fx = GetNextEffect(fxit))) { - effects->AddEffect(fx, false); - } - effects->SetOwner(GetOwner()); - return effects; -} - -//create a new effect with most of the characteristics of the old effect -//only opcode and parameters are changed -//This is used mostly inside effects, when an effect needs to spawn -//other effects with the same coordinates, source, duration, etc. -Effect *EffectQueue::CreateEffectCopy(Effect *oldfx, ieDword opcode, ieDword param1, ieDword param2) -{ - if( opcode==0xffffffff) { - return NULL; - } - Effect *fx = new Effect(); - if( !fx) { - return NULL; - } - memcpy(fx,oldfx,sizeof(Effect) ); - fx->Opcode=opcode; - fx->Parameter1=param1; - fx->Parameter2=param2; - return fx; -} - -Effect *EffectQueue::CreateEffectCopy(Effect *oldfx, EffectRef &effect_reference, ieDword param1, ieDword param2) -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return NULL; - } - return CreateEffectCopy(oldfx, effect_reference.opcode, param1, param2); -} - -static EffectRef fx_unsummon_creature_ref = { "UnsummonCreature", -1 }; - -Effect *EffectQueue::CreateUnsummonEffect(Effect *fx) -{ - Effect *newfx = NULL; - if( (fx->TimingMode&0xff) == FX_DURATION_INSTANT_LIMITED) { - newfx = CreateEffectCopy(fx, fx_unsummon_creature_ref, 0, 0); - newfx->TimingMode = FX_DURATION_DELAY_PERMANENT; - if( newfx->Resource3[0]) { - strnuprcpy(newfx->Resource,newfx->Resource3, sizeof(ieResRef)-1 ); - } else { - strnuprcpy(newfx->Resource,"SPGFLSH1", sizeof(ieResRef)-1 ); - } - if( fx->TimingMode == FX_DURATION_ABSOLUTE) { - //unprepare duration - newfx->Duration = (newfx->Duration-core->GetGame()->GameTime)/AI_UPDATE_TIME; - } - } - - return newfx; -} - -void EffectQueue::AddEffect(Effect* fx, bool insert) -{ - Effect* new_fx = new Effect; - memcpy( new_fx, fx, sizeof( Effect ) ); - if( insert) { - effects.insert( effects.begin(), new_fx ); - } else { - effects.push_back( new_fx ); - } -} - -//This method can remove an effect described by a pointer to it, or -//an exact matching effect -bool EffectQueue::RemoveEffect(Effect* fx) -{ - int invariant_size = offsetof( Effect, random_value ); - - for (std::list< Effect* >::iterator f = effects.begin(); f != effects.end(); f++ ) { - Effect* fx2 = *f; - - if( (fx==fx2) || !memcmp( fx, fx2, invariant_size)) { - delete fx2; - effects.erase( f ); - return true; - } - } - return false; -} - -//this is where we reapply all effects when loading a saved game -//The effects are already in the fxqueue of the target -void EffectQueue::ApplyAllEffects(Actor* target) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - ApplyEffect( target, *f, 0 ); - } -} - -void EffectQueue::Cleanup() -{ - std::list< Effect* >::iterator f; - - for ( f = effects.begin(); f != effects.end(); ) { - if( (*f)->TimingMode == FX_DURATION_JUST_EXPIRED) { - delete *f; - effects.erase(f++); - } else { - f++; - } - } -} - -//Handle the target flag when the effect is applied first -int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const Point &dest) const -{ - int i; - Game *game; - Map *map; - int flg; - ieDword spec = 0; - Actor *st = (self && (self->Type==ST_ACTOR)) ?(Actor *) self:NULL; - Effect* new_fx; - - switch (fx->Target) { - case FX_TARGET_ORIGINAL: - fx->SetPosition(self->Pos); - - flg = ApplyEffect( st, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - if( st) { - st->fxqueue.AddEffect( fx, flg==FX_INSERT ); - } - } - break; - case FX_TARGET_SELF: - fx->SetPosition(dest); - - flg = ApplyEffect( st, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - if( st) { - st->fxqueue.AddEffect( fx, flg==FX_INSERT ); - } - } - break; - - case FX_TARGET_ALL_BUT_SELF: - new_fx = new Effect; - map=self->GetCurrentArea(); - i= map->GetActorCount(true); - while(i--) { - Actor* actor = map->GetActor( i, true ); - //don't pick ourselves - if( st==actor) { - continue; - } - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - - case FX_TARGET_OWN_SIDE: - if( !st || st->InParty) { - goto all_party; - } - map = self->GetCurrentArea(); - spec = st->GetStat(IE_SPECIFIC); - - new_fx = new Effect; - //GetActorCount(false) returns all nonparty critters - i = map->GetActorCount(false); - while(i--) { - Actor* actor = map->GetActor( i, false ); - if( actor->GetStat(IE_SPECIFIC)!=spec) { - continue; - } - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - case FX_TARGET_OTHER_SIDE: - if( !pretarget || pretarget->InParty) { - goto all_party; - } - map = self->GetCurrentArea(); - spec = pretarget->GetStat(IE_SPECIFIC); - - new_fx = new Effect; - //GetActorCount(false) returns all nonparty critters - i = map->GetActorCount(false); - while(i--) { - Actor* actor = map->GetActor( i, false ); - if( actor->GetStat(IE_SPECIFIC)!=spec) { - continue; - } - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - //GetActorCount can now return all nonparty critters - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - case FX_TARGET_PRESET: - fx->SetPosition(pretarget->Pos); - - flg = ApplyEffect( pretarget, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - if( pretarget) { - pretarget->fxqueue.AddEffect( fx, flg==FX_INSERT ); - } - } - break; - - case FX_TARGET_PARTY: -all_party: - new_fx = new Effect; - game = core->GetGame(); - i = game->GetPartySize(false); - while(i--) { - Actor* actor = game->GetPC( i, false ); - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - - case FX_TARGET_ALL: - new_fx = new Effect; - map = self->GetCurrentArea(); - i = map->GetActorCount(true); - while(i--) { - Actor* actor = map->GetActor( i, true ); - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - - case FX_TARGET_ALL_BUT_PARTY: - new_fx = new Effect; - map = self->GetCurrentArea(); - i = map->GetActorCount(false); - while(i--) { - Actor* actor = map->GetActor( i, false ); - memcpy( new_fx, fx, sizeof( Effect ) ); - new_fx->SetPosition(actor->Pos); - - flg = ApplyEffect( actor, new_fx, 1 ); - //GetActorCount can now return all nonparty critters - if( new_fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( new_fx, flg==FX_INSERT ); - } - } - delete new_fx; - flg = FX_APPLIED; - break; - - case FX_TARGET_UNKNOWN: - default: - print( "Unknown FX target type: %d\n", fx->Target); - flg = FX_ABORT; - break; - } - - return flg; -} - -//this is where effects from spells first get in touch with the target -//the effects are currently NOT in the target's fxqueue, those that stick -//will get copied (hence the fxqueue.AddEffect call) -//if this returns FX_NOT_APPLIED, then the whole stack was resisted -//or expired -int EffectQueue::AddAllEffects(Actor* target, const Point &destination) const -{ - int res = FX_NOT_APPLIED; - // pre-roll dice for fx needing them and stow them in the effect - ieDword random_value = core->Roll( 1, 100, -1 ); - - if( target) { - target->RollSaves(); - } - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - //handle resistances and saving throws here - (*f)->random_value = random_value; - //if applyeffect returns true, we stop adding the future effects - //this is to simulate iwd2's on the fly spell resistance - - int tmp = AddEffect(*f, Owner, target, destination); - //lets try without Owner, any crash? - //If yes, then try to fix the individual effect - //If you use target for Owner here, the wand in chateau irenicus will work - //the same way as Imoen's monster summoning, which is a BAD THING (TM) - //int tmp = AddEffect(*f, Owner?Owner:target, target, destination); - if( tmp == FX_ABORT) { - res = FX_NOT_APPLIED; - break; - } - if( tmp != FX_NOT_APPLIED) { - res = FX_APPLIED; - } - } - return res; -} - -//resisted effect based on level -static inline bool check_level(Actor *target, Effect *fx) -{ - //skip non level based effects - //check if an effect has no level based resistance, but instead the dice sizes/count - //adjusts Parameter1 (like a damage causing effect) - if( Opcodes[fx->Opcode].Flags & EFFECT_DICED ) { - //add the caster level to the dice count - if (fx->IsVariable) { - fx->DiceThrown+=fx->CasterLevel; - } - fx->Parameter1 = DICE_ROLL((signed)fx->Parameter1); - //this is a hack for PST style diced effects - if( core->HasFeature(GF_SAVE_FOR_HALF) ) { - if( memcmp(fx->Resource,"NEG",4) ) { - fx->IsSaveForHalfDamage=1; - } - } else { - if( (fx->Parameter2&3)==3) { - fx->IsSaveForHalfDamage=1; - } - } - return false; - } - //there is no level based resistance, but Parameter1 cannot be precalculated - //these effects use the Dice fields in a special way - if( Opcodes[fx->Opcode].Flags & EFFECT_NO_LEVEL_CHECK ) { - return false; - } - - if( !target) { - return false; - } - if(fx->Target == FX_TARGET_SELF) { - return false; - } - - ieDword level = (ieDword) target->GetXPLevel( true ); - //return true if resisted - if (fx->MinAffectedLevel > 0 || fx->MaxAffectedLevel > 0) { - if (level < fx->MinAffectedLevel || level > fx->MaxAffectedLevel) { - return true; - } - } - return false; -} - -//roll for the effect probability, there is a high and a low treshold, the d100 -//roll should hit in the middle -static inline bool check_probability(Effect* fx) -{ - //watch for this, probability1 is the high number - //probability2 is the low number - //random value is 0-99 - if( fx->random_value<=fx->Probability2 || fx->random_value>fx->Probability1) { - return false; - } - return true; -} - -//immunity effects -static EffectRef fx_level_immunity_ref = { "Protection:Spelllevel", -1 }; -static EffectRef fx_opcode_immunity_ref = { "Protection:Opcode", -1 }; //bg2 -static EffectRef fx_opcode_immunity2_ref = { "Protection:Opcode2", -1 };//iwd -static EffectRef fx_spell_immunity_ref = { "Protection:Spell", -1 }; //bg2 -static EffectRef fx_spell_immunity2_ref = { "Protection:Spell2", -1 };//iwd -static EffectRef fx_store_spell_sequencer_ref = { "Sequencer:Store", -1 }; //bg2, works against sequencers -static EffectRef fx_school_immunity_ref = { "Protection:School", -1 }; -static EffectRef fx_secondary_type_immunity_ref = { "Protection:SecondaryType", -1 }; - -//decrementing immunity effects -static EffectRef fx_level_immunity_dec_ref = { "Protection:SpellLevelDec", -1 }; -static EffectRef fx_spell_immunity_dec_ref = { "Protection:SpellDec", -1 }; -static EffectRef fx_school_immunity_dec_ref = { "Protection:SchoolDec", -1 }; -static EffectRef fx_secondary_type_immunity_dec_ref = { "Protection:SecondaryTypeDec", -1 }; - -//bounce effects -static EffectRef fx_level_bounce_ref = { "Bounce:SpellLevel", -1 }; -//static EffectRef fx_opcode_bounce_ref = { "Bounce:Opcode", -1 }; -static EffectRef fx_spell_bounce_ref = { "Bounce:Spell", -1 }; -static EffectRef fx_school_bounce_ref = { "Bounce:School", -1 }; -static EffectRef fx_secondary_type_bounce_ref = { "Bounce:SecondaryType", -1 }; - -//decrementing bounce effects -static EffectRef fx_level_bounce_dec_ref = { "Bounce:SpellLevelDec", -1 }; -static EffectRef fx_spell_bounce_dec_ref = { "Bounce:SpellDec", -1 }; -static EffectRef fx_school_bounce_dec_ref = { "Bounce:SchoolDec", -1 }; -static EffectRef fx_secondary_type_bounce_dec_ref = { "Bounce:SecondaryTypeDec", -1 }; - -//spelltrap (multiple decrementing immunity) -static EffectRef fx_spelltrap = { "SpellTrap", -1 }; - -//this is for whole spell immunity/bounce -static inline void DecreaseEffect(Effect *efx) -{ - efx->Parameter1--; - if( (int) efx->Parameter1<1) { - //don't remove effects directly!!! - efx->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//lower decreasing immunities/bounces -static int check_type(Actor* actor, Effect* fx) -{ - //the protective effect (if any) - Effect *efx; - - ieDword bounce = actor->GetStat(IE_BOUNCE); - - //immunity checks -/*opcode immunity is in the per opcode checks - if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity_ref, fx->Opcode) ) { - return 0; - } - if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity2_ref, fx->Opcode) ) { - return 0; - } -*/ - //spell level immunity - if(fx->Power && actor->fxqueue.HasEffectWithParamPair(fx_level_immunity_ref, fx->Power, 0) ) { - return 0; - } - - //source immunity (spell name) - //if source is unspecified, don't resist it - if( fx->Source[0]) { - if( actor->fxqueue.HasEffectWithResource(fx_spell_immunity_ref, fx->Source) ) { - return 0; - } - if( actor->fxqueue.HasEffectWithResource(fx_spell_immunity2_ref, fx->Source) ) { - return 0; - } - if (actor->fxqueue.HasEffectWithResource(fx_store_spell_sequencer_ref, fx->Source) ) { - return 0; - } - } - - //primary type immunity (school) - if( fx->PrimaryType) { - if( actor->fxqueue.HasEffectWithParam(fx_school_immunity_ref, fx->PrimaryType)) { - return 0; - } - } - - //secondary type immunity (usage) - if( fx->SecondaryType) { - if( actor->fxqueue.HasEffectWithParam(fx_secondary_type_immunity_ref, fx->SecondaryType) ) { - return 0; - } - } - - //decrementing immunity checks - //decrementing level immunity - efx = actor->fxqueue.HasEffectWithParamPair(fx_level_immunity_dec_ref, fx->Power, 0); - if( efx ) { - DecreaseEffect(efx); - return 0; - } - - //decrementing spell immunity - if( fx->Source[0]) { - efx = actor->fxqueue.HasEffectWithResource(fx_spell_immunity_dec_ref, fx->Source); - if( efx) { - DecreaseEffect(efx); - return 0; - } - } - //decrementing primary type immunity (school) - if( fx->PrimaryType) { - efx = actor->fxqueue.HasEffectWithParam(fx_school_immunity_dec_ref, fx->PrimaryType); - if( efx) { - DecreaseEffect(efx); - return 0; - } - } - - //decrementing secondary type immunity (usage) - if( fx->SecondaryType) { - efx = actor->fxqueue.HasEffectWithParam(fx_secondary_type_immunity_dec_ref, fx->SecondaryType); - if( efx) { - DecreaseEffect(efx); - return 0; - } - } - - //spelltrap (absorb) - //FIXME: - //if the spelltrap effect already absorbed enough levels - //but still didn't get removed, it will absorb levels it shouldn't - //it will also absorb multiple spells in a single round - efx=actor->fxqueue.HasEffectWithParamPair(fx_spelltrap, 0, fx->Power); - if( efx) { - //storing the absorbed spell level - efx->Parameter3+=fx->Power; - //instead of a single effect, they had to create an effect for each level - //HOW DAMN LAME - //if decrease needs the spell level, use fx->Power here - actor->fxqueue.DecreaseParam1OfEffect(fx_spelltrap, 1); - //efx->Parameter1--; - return 0; - } - - //bounce checks - if( (bounce&BNC_LEVEL) && actor->fxqueue.HasEffectWithParamPair(fx_level_bounce_ref, fx->Power, 0) ) { - return 0; - } - - if( fx->Source[0] && (bounce&BNC_RESOURCE) && actor->fxqueue.HasEffectWithResource(fx_spell_bounce_ref, fx->Source) ) { - return -1; - } - - if( fx->PrimaryType && (bounce&BNC_SCHOOL) ) { - if( actor->fxqueue.HasEffectWithParam(fx_school_bounce_ref, fx->PrimaryType)) { - return -1; - } - } - - if( fx->SecondaryType && (bounce&BNC_SECTYPE) ) { - if( actor->fxqueue.HasEffectWithParam(fx_secondary_type_bounce_ref, fx->SecondaryType)) { - return -1; - } - } - //decrementing bounce checks - - //level decrementing bounce check - if( (bounce&BNC_LEVEL_DEC)) { - efx=actor->fxqueue.HasEffectWithParamPair(fx_level_bounce_dec_ref, fx->Power, 0); - if( efx) { - DecreaseEffect(efx); - return -1; - } - } - - if( fx->Source[0] && (bounce&BNC_RESOURCE_DEC)) { - efx=actor->fxqueue.HasEffectWithResource(fx_spell_bounce_dec_ref, fx->Resource); - if( efx) { - DecreaseEffect(efx); - return -1; - } - } - - if( fx->PrimaryType && (bounce&BNC_SCHOOL_DEC) ) { - efx=actor->fxqueue.HasEffectWithParam(fx_school_bounce_dec_ref, fx->PrimaryType); - if( efx) { - DecreaseEffect(efx); - return -1; - } - } - - if( fx->SecondaryType && (bounce&BNC_SECTYPE_DEC) ) { - efx=actor->fxqueue.HasEffectWithParam(fx_secondary_type_bounce_dec_ref, fx->SecondaryType); - if( efx) { - DecreaseEffect(efx); - return -1; - } - } - - return 1; -} - -//check resistances, saving throws -static bool check_resistance(Actor* actor, Effect* fx) -{ - if( !actor) { - return false; - } - - //opcode immunity - if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity_ref, fx->Opcode) ) { - print ("immune to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); - return true; - } - if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity2_ref, fx->Opcode) ) { - print ("immune2 to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); - return true; - } - -/* opcode bouncing isn't implemented? - //opcode bouncing - if( actor->fxqueue.HasEffectWithParam(fx_opcode_bounce_ref, fx->Opcode) ) { - return false; - } -*/ - - //not resistable (no saves either?) - if( fx->Resistance != FX_CAN_RESIST_CAN_DISPEL) { - return false; - } - - if (pstflags && (actor->GetSafeStat(IE_STATE_ID) & (STATE_ANTIMAGIC) ) ) { - return false; - } - - //don't resist self - bool selective_mr = core->HasFeature(GF_SELECTIVE_MAGIC_RES); - if (fx->Target==FX_TARGET_SELF) { - if (selective_mr) { - return false; - } - } - - //magic immunity - ieDword val = actor->GetStat(IE_RESISTMAGIC); - if( (signed) fx->random_value < (signed) val) { - // when using biased magic resistance non-hostile spells aren't resisted - if ((selective_mr && (fx->SourceFlags&SF_HOSTILE)) || !selective_mr) { - print ("effect resisted: %s\n", (char*) Opcodes[fx->Opcode].Name); - return true; - } - } - - //saving throws - bool saved = false; - for (int i=0;i<5;i++) { - if( fx->SavingThrowType&(1<GetSavingThrow(i, fx->SavingThrowBonus); - if( saved) { - break; - } - } - } - if( saved) { - if( fx->IsSaveForHalfDamage) { - fx->Parameter1/=2; - } else { - print ("%s saved against effect: %s\n", actor->GetName(1), (char*) Opcodes[fx->Opcode].Name); - return true; - } - } - return false; -} - -// this function is called two different ways -// when FirstApply is set, then the effect isn't stuck on the target -// this happens when a new effect comes in contact with the target. -// if the effect returns FX_DURATION_JUST_EXPIRED then it won't stick -// when first_apply is unset, the effect is already on the target -// this happens on load time too! -// returns FX_NOT_APPLIED if the process shouldn't be calling applyeffect anymore -// returns FX_ABORT if the whole spell this effect is in should be aborted -// it will disable all future effects of same source (only on first apply) - -int EffectQueue::ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieDword resistance) const -{ - //print( "FX 0x%02x: %s(%d, %d)\n", fx->Opcode, effectnames[fx->Opcode].Name, fx->Parameter1, fx->Parameter2 ); - if( fx->Opcode >= MAX_EFFECTS) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - return FX_NOT_APPLIED; - } - - ieDword GameTime = core->GetGame()->GameTime; - - fx->FirstApply=first_apply; - if( first_apply) { - if (Owner) - fx->CasterID = Owner->GetGlobalID(); - if( (fx->PosX==0xffffffff) && (fx->PosY==0xffffffff)) { - fx->PosX = target->Pos.x; - fx->PosY = target->Pos.y; - } - - //gemrb specific, stat based chance - if ((fx->Probability2 == 100) && Owner && (Owner->Type==ST_ACTOR) ) { - fx->Probability2 = 0; - fx->Probability1 = ((Actor *) Owner)->GetSafeStat(fx->Probability1); - } - - if (resistance) { - //the effect didn't pass the probability check - if( !check_probability(fx) ) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - return FX_NOT_APPLIED; - } - - //the effect didn't pass the target level check - if( check_level(target, fx) ) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - return FX_NOT_APPLIED; - } - - //the effect didn't pass the resistance check - if( check_resistance(target, fx) ) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - return FX_NOT_APPLIED; - } - } - - //Same as in items and spells - if (fx->SourceFlags & SF_HOSTILE) { - if (target && (target != Owner) && Owner && (Owner->Type==ST_ACTOR) ) { - target->AttackedBy((Actor *) Owner); - } - } - - if( NeedPrepare(fx->TimingMode) ) { - //save delay for later - fx->SecondaryDelay = fx->Duration; - if( fx->TimingMode == FX_DURATION_INSTANT_LIMITED) { - fx->TimingMode = FX_DURATION_ABSOLUTE; - } - PrepareDuration(fx); - } - } - //check if the effect has triggered or expired - switch (DelayType(fx->TimingMode&0xff) ) { - case DELAYED: - if( fx->Duration>GameTime) { - return FX_NOT_APPLIED; - } - //effect triggered - //delayed duration (3) - if( NeedPrepare(fx->TimingMode) ) { - //prepare for delayed duration effects - fx->Duration = fx->SecondaryDelay; - PrepareDuration(fx); - } - fx->TimingMode=TriggeredEffect(fx->TimingMode); - break; - case DURATION: - if( fx->Duration<=GameTime) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - //add a return here, if 0 duration effects shouldn't work - } - break; - //permanent effect (so there is no warning) - case PERMANENT: - break; - //this shouldn't happen - default: - error("EffectQueue", "Unknown delay type: %d (from %d)\n", DelayType(fx->TimingMode&0xff), fx->TimingMode); - } - - EffectFunction fn = 0; - if( fx->OpcodeOpcode].Function; - if (!(target || (Opcodes[fx->Opcode].Flags & EFFECT_NO_ACTOR))) { - print("targetless opcode without EFFECT_NO_ACTOR: %d, skipping\n", fx->Opcode); - return FX_NOT_APPLIED; - } - } - int res = FX_ABORT; - if( fn) { - if( target && first_apply ) { - if( !target->fxqueue.HasEffectWithParamPair(fx_protection_from_display_string_ref, fx->Parameter1, 0) ) { - displaymsg->DisplayStringName( Opcodes[fx->Opcode].Strref, 0xf0f0f0, - target, IE_STR_SOUND); - } - } - - res=fn( Owner, target, fx ); - - //if there is no owner, we assume it is the target - switch( res ) { - case FX_APPLIED: - //normal effect with duration - break; - case FX_NOT_APPLIED: - //instant effect, pending removal - //for example, a damage effect - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - break; - case FX_INSERT: - //put this effect in the beginning of the queue - //all known insert effects are 'permanent' too - //that is the AC effect only - //actually, permanent effects seem to be - //inserted by the game engine too - case FX_PERMANENT: - //don't stick around if it was executed permanently - //for example, a permanent strength modifier effect - if( fx->TimingMode == FX_DURATION_INSTANT_PERMANENT ) { - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - } - break; - case FX_ABORT: - break; - default: - abort(); - } - } else { - //effect not found, it is going to be discarded - fx->TimingMode = FX_DURATION_JUST_EXPIRED; - } - return res; -} - -// looks for opcode with param2 - -#define MATCH_OPCODE() if((*f)->Opcode!=opcode) { continue; } - -// useful for: remove equipped item -#define MATCH_SLOTCODE() if((*f)->InventorySlot!=slotcode) { continue; } - -// useful for: remove projectile type -#define MATCH_PROJECTILE() if((*f)->Projectile!=projectile) { continue; } - -static const bool fx_live[MAX_TIMING_MODE]={true,true,true,false,false,false,false,false,true,true,false}; -static inline bool IsLive(ieByte timingmode) -{ - if( timingmode>=MAX_TIMING_MODE) return false; - return fx_live[timingmode]; -} - -#define MATCH_LIVE_FX() if(!IsLive((*f)->TimingMode)) { continue; } -#define MATCH_PARAM1() if((*f)->Parameter1!=param1) { continue; } -#define MATCH_PARAM2() if((*f)->Parameter2!=param2) { continue; } -#define MATCH_RESOURCE() if( strnicmp( (*f)->Resource, resource, 8) ) { continue; } -#define MATCH_SOURCE() if( strnicmp( (*f)->Source, Removed, 8) ) { continue; } -#define MATCH_TIMING() if( (*f)->TimingMode!=timing) { continue; } - -//call this from an applied effect, after it returns, these effects -//will be killed along with it -void EffectQueue::RemoveAllEffects(ieDword opcode) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//removes all equipping effects that match slotcode -void EffectQueue::RemoveEquippingEffects(ieDwordSigned slotcode) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - if( !IsEquipped((*f)->TimingMode)) continue; - MATCH_SLOTCODE(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//removes all effects that match projectile -void EffectQueue::RemoveAllEffectsWithProjectile(ieDword projectile) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_PROJECTILE(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//remove effects belonging to a given spell -void EffectQueue::RemoveAllEffects(const ieResRef Removed) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_LIVE_FX(); - MATCH_SOURCE(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//remove effects belonging to a given spell, but only if they match timing method x -void EffectQueue::RemoveAllEffects(const ieResRef Removed, ieByte timing) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_TIMING(); - MATCH_SOURCE(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//this will modify effect reference -void EffectQueue::RemoveAllEffects(EffectRef &effect_reference) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return; - } - RemoveAllEffects(effect_reference.opcode); -} - -//Removes all effects with a matching resource field -void EffectQueue::RemoveAllEffectsWithResource(ieDword opcode, const ieResRef resource) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_RESOURCE(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -void EffectQueue::RemoveAllEffectsWithResource(EffectRef &effect_reference, const ieResRef resource) const -{ - ResolveEffectRef(effect_reference); - RemoveAllEffectsWithResource(effect_reference.opcode, resource); -} - -//This method could be used to remove stat modifiers that would lower a stat -//(works only if a higher stat means good for the target) -void EffectQueue::RemoveAllDetrimentalEffects(ieDword opcode, ieDword current) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - switch((*f)->Parameter2) { - case 0:case 3: - if( ((signed) (*f)->Parameter1)>=0) continue; - break; - case 1:case 4: - if( ((signed) (*f)->Parameter1)>=(signed) current) continue; - break; - case 2:case 5: - if( ((signed) (*f)->Parameter1)>=100) continue; - break; - default: - break; - } - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//Removes all effects with a matching param2 -//param2 is usually an effect's subclass (quality) while param1 is more like quantity. -//So opcode+param2 usually pinpoints an effect better when not all effects of a given -//opcode need to be removed (see removal of portrait icon) -void EffectQueue::RemoveAllEffectsWithParam(ieDword opcode, ieDword param2) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_PARAM2(); - - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } -} - -//this function is called by FakeEffectExpiryCheck -//probably also called by rest -void EffectQueue::RemoveExpiredEffects(ieDword futuretime) const -{ - ieDword GameTime = core->GetGame()->GameTime; - if( GameTime+futuretime*AI_UPDATE_TIME::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - //FIXME: how this method handles delayed effects??? - //it should remove them as well, i think - if( DelayType( ((*f)->TimingMode) )!=PERMANENT ) { - if( (*f)->Duration<=GameTime) { - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } - } - } -} - -//this effect will expire all effects that are not truly permanent -//which i call permanent after death (iesdp calls it permanent after bonuses) -void EffectQueue::RemoveAllNonPermanentEffects() const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - if( IsRemovable((*f)->TimingMode) ) { - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - } - } -} - -//this will modify effect reference - -void EffectQueue::RemoveAllDetrimentalEffects(EffectRef &effect_reference, ieDword current) const -{ - ResolveEffectRef(effect_reference); - RemoveAllDetrimentalEffects(effect_reference.opcode, current); -} - -void EffectQueue::RemoveAllEffectsWithParam(EffectRef &effect_reference, ieDword param2) const -{ - ResolveEffectRef(effect_reference); - RemoveAllEffectsWithParam(effect_reference.opcode, param2); -} - -//remove certain levels of effects, possibly matching school/secondary type -//this method removes whole spells (tied together by their source) -//FIXME: probably this isn't perfect -void EffectQueue::RemoveLevelEffects(ieResRef &Removed, ieDword level, ieDword Flags, ieDword match) const -{ - Removed[0]=0; - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - if( (*f)->Power>level) { - continue; - } - - if( Removed[0]) { - MATCH_SOURCE(); - } - if( Flags&RL_MATCHSCHOOL) { - if( (*f)->PrimaryType!=match) { - continue; - } - } - if( Flags&RL_MATCHSECTYPE) { - if( (*f)->SecondaryType!=match) { - continue; - } - } - //if dispellable was not set, or the effect is dispellable - //then remove it - if( Flags&RL_DISPELLABLE) { - if( !((*f)->Resistance&FX_CAN_DISPEL)) { - continue; - } - } - (*f)->TimingMode = FX_DURATION_JUST_EXPIRED; - if( Flags&RL_REMOVEFIRST) { - memcpy(Removed,(*f)->Source, sizeof(Removed)); - } - } -} - -Effect *EffectQueue::HasOpcode(ieDword opcode) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - - return (*f); - } - return NULL; -} - -Effect *EffectQueue::HasEffect(EffectRef &effect_reference) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return NULL; - } - return HasOpcode(effect_reference.opcode); -} - -Effect *EffectQueue::HasOpcodeWithParam(ieDword opcode, ieDword param2) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_PARAM2(); - - return (*f); - } - return NULL; -} - -Effect *EffectQueue::HasEffectWithParam(EffectRef &effect_reference, ieDword param2) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return NULL; - } - return HasOpcodeWithParam(effect_reference.opcode, param2); -} - -//looks for opcode with pairs of parameters (useful for protection against creature, extra damage or extra thac0 against creature) -//generally an IDS targeting - -Effect *EffectQueue::HasOpcodeWithParamPair(ieDword opcode, ieDword param1, ieDword param2) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_PARAM2(); - //0 is always accepted as first parameter - if( param1) { - MATCH_PARAM1(); - } - - return (*f); - } - return NULL; -} - -Effect *EffectQueue::HasEffectWithParamPair(EffectRef &effect_reference, ieDword param1, ieDword param2) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return NULL; - } - return HasOpcodeWithParamPair(effect_reference.opcode, param1, param2); -} - -// sums all the values of the specific damage bonus effects of the passed "damage type" -int EffectQueue::SpecificDamageBonus(ieDword opcode, ieDword param2) const -{ - int bonus = 0; - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_PARAM2(); - bonus += (signed) (*f)->Parameter1; - } - return bonus; -} - -static EffectRef fx_damage_bonus_modifier_ref = { "DamageBonusModifier", -1 }; -int EffectQueue::SpecificDamageBonus(ieDword damage_type) const -{ - ResolveEffectRef(fx_damage_bonus_modifier_ref); - if(fx_damage_bonus_modifier_ref.opcode < 0) { - return 0; - } - return SpecificDamageBonus(fx_damage_bonus_modifier_ref.opcode, damage_type); -} - -//this could be used for stoneskins and mirror images as well -void EffectQueue::DecreaseParam1OfEffect(ieDword opcode, ieDword amount) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - ieDword value = (*f)->Parameter1; - if( value>amount) value-=amount; - else value = 0; - (*f)->Parameter1=value; - } -} - -void EffectQueue::DecreaseParam1OfEffect(EffectRef &effect_reference, ieDword amount) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return; - } - DecreaseParam1OfEffect(effect_reference.opcode, amount); -} - - -//this function does IDS targeting for effects (extra damage/thac0 against creature) -static const int ids_stats[7]={IE_EA, IE_GENERAL, IE_RACE, IE_CLASS, IE_SPECIFIC, IE_SEX, IE_ALIGNMENT}; - -int EffectQueue::BonusAgainstCreature(ieDword opcode, Actor *actor) const -{ - int sum = 0; - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - if( (*f)->Parameter1) { - ieDword ids = (*f)->Parameter2; - if( ids<2 || ids>8) { - ids=2; - } - ieDword param1 = actor->GetStat(ids_stats[ids-2]); - MATCH_PARAM1(); - } - int val = (int) (*f)->Parameter3; - if( !val) val = 2; - sum += val; - } - return sum; -} - -int EffectQueue::BonusAgainstCreature(EffectRef &effect_reference, Actor *actor) const -{ - ResolveEffectRef(effect_reference); - if( effect_reference.opcode<0) { - return 0; - } - return BonusAgainstCreature(effect_reference.opcode, actor); -} - -bool EffectQueue::WeaponImmunity(ieDword opcode, int enchantment, ieDword weapontype) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - // - int magic = (int) (*f)->Parameter1; - ieDword mask = (*f)->Parameter3; - ieDword value = (*f)->Parameter4; - if( magic==0) { - if( enchantment) continue; - } else if( magic>0) { - if( enchantment>magic) continue; - } - - if( (weapontype&mask) != value) { - continue; - } - return true; - } - return false; -} - -static EffectRef fx_weapon_immunity_ref = { "Protection:Weapons", -1 }; - -bool EffectQueue::WeaponImmunity(int enchantment, ieDword weapontype) const -{ - ResolveEffectRef(fx_weapon_immunity_ref); - if( fx_weapon_immunity_ref.opcode<0) { - return 0; - } - return WeaponImmunity(fx_weapon_immunity_ref.opcode, enchantment, weapontype); -} - -void EffectQueue::AddWeaponEffects(EffectQueue *fxqueue, EffectRef &fx_ref) const -{ - ResolveEffectRef(fx_ref); - if( fx_ref.opcode<0) { - return; - } - - ieDword opcode = fx_ref.opcode; - Point p(-1,-1); - - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - // - Effect *fx = core->GetEffect( (*f)->Resource, (*f)->Power, p); - if (!fx) continue; - fx->Target = FX_TARGET_PRESET; - fxqueue->AddEffect(fx, true); - } -} - -/* no longer needed, use IE_CASTING stat -static EffectRef fx_disable_spellcasting_ref = { "DisableCasting", -1 }; -int EffectQueue::DisabledSpellcasting(int types) const -{ - ResolveEffectRef(fx_disable_spellcasting_ref); - if( fx_disable_spellcasting_ref.opcode < 0) { - return 0; - } - - unsigned int spelltype_mask = 0; - bool iwd2 = !!core->HasFeature(GF_ENHANCED_EFFECTS); - ieDword opcode = fx_disable_spellcasting_ref.opcode; - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - - if (iwd2) { - switch((*f)->Parameter2) { - case 0: // all - spelltype_mask |= 7; - break; - case 1: // mage and cleric - spelltype_mask |= 3; - break; - case 2: // mage - spelltype_mask |= 2; - break; - case 3: // cleric - spelltype_mask |= 1; - break; - case 4: // innate - spelltype_mask |= 4; - break; - } - } else { - switch((*f)->Parameter2) { - case 0: // mage - spelltype_mask |= 2; - break; - case 1: // cleric - spelltype_mask |= 1; - break; - case 2: // innate - spelltype_mask |= 4; - break; - } - } - } - return spelltype_mask & types; -} -*/ - -//useful for immunity vs spell, can't use item, etc. -Effect *EffectQueue::HasOpcodeWithResource(ieDword opcode, const ieResRef resource) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_RESOURCE(); - - return (*f); - } - return NULL; -} - -Effect *EffectQueue::HasEffectWithResource(EffectRef &effect_reference, const ieResRef resource) const -{ - ResolveEffectRef(effect_reference); - return HasOpcodeWithResource(effect_reference.opcode, resource); -} - -//used in contingency/sequencer code (cannot have the same contingency twice) -Effect *EffectQueue::HasOpcodeWithSource(ieDword opcode, const ieResRef Removed) const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - MATCH_LIVE_FX(); - MATCH_SOURCE(); - - return (*f); - } - return NULL; -} - -Effect *EffectQueue::HasEffectWithSource(EffectRef &effect_reference, const ieResRef resource) const -{ - ResolveEffectRef(effect_reference); - return HasOpcodeWithSource(effect_reference.opcode, resource); -} - -bool EffectQueue::HasAnyDispellableEffect() const -{ - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - if( (*f)->Resistance&FX_CAN_DISPEL) { - return true; - } - } - return false; -} - -void EffectQueue::dump() const -{ - print( "EFFECT QUEUE:\n" ); - int i = 0; - std::list< Effect* >::const_iterator f; - for ( f = effects.begin(); f != effects.end(); f++ ) { - Effect* fx = *f; - if( fx) { - char *Name = NULL; - if( fx->Opcode < MAX_EFFECTS) - Name = (char*) Opcodes[fx->Opcode].Name; - - print( " %2d: 0x%02x: %s (%d, %d) S:%s\n", i++, fx->Opcode, Name, fx->Parameter1, fx->Parameter2, fx->Source ); - } - } -} -/* -Effect *EffectQueue::GetEffect(ieDword idx) const -{ - if( effects.size()<=idx) { - return NULL; - } - return effects[idx]; -} -*/ - -//returns true if the effect supports simplified duration -bool EffectQueue::HasDuration(Effect *fx) -{ - switch(fx->TimingMode) { - case FX_DURATION_INSTANT_LIMITED: //simple duration - case FX_DURATION_DELAY_LIMITED: //delayed duration - case FX_DURATION_DELAY_PERMANENT: //simple delayed - return true; - } - return false; -} - -static EffectRef fx_variable_ref = { "Variable:StoreLocalVariable", -1 }; - -//returns true if the effect must be saved -bool EffectQueue::Persistent(Effect* fx) -{ - // local variable effects self-destruct if they were processed already - // but if they weren't processed, e.g. in a global actor, we must save them - // TODO: do we really need to special-case this? leaving it for now - fuzzie - if( fx->Opcode==(ieDword) ResolveEffect(fx_variable_ref)) { - return true; - } - - switch (fx->TimingMode) { - //normal equipping fx of items - case FX_DURATION_INSTANT_WHILE_EQUIPPED: - //delayed effect not saved - case FX_DURATION_DELAY_UNSAVED: - //permanent effect not saved - case FX_DURATION_PERMANENT_UNSAVED: - //just expired effect - case FX_DURATION_JUST_EXPIRED: - return false; - } - return true; -} - -//alter the color effect in case the item is equipped in the shield slot -void EffectQueue::HackColorEffects(Actor *Owner, Effect *fx) -{ - if( fx->InventorySlot!=Owner->inventory.GetShieldSlot()) return; - - unsigned int gradienttype = fx->Parameter2 & 0xF0; - if( gradienttype == 0x10) { - gradienttype = 0x20; // off-hand - fx->Parameter2 &= ~0xF0; - fx->Parameter2 |= gradienttype; - } -} - -//iterate through saved effects -const Effect *EffectQueue::GetNextSavedEffect(std::list< Effect* >::const_iterator &f) const -{ - while(f!=effects.end()) { - Effect *effect = *f; - f++; - if( Persistent(effect)) { - return effect; - } - } - return NULL; -} - -Effect *EffectQueue::GetNextEffect(std::list< Effect* >::const_iterator &f) const -{ - if( f!=effects.end()) return *f++; - return NULL; -} - -ieDword EffectQueue::CountEffects(ieDword opcode, ieDword param1, ieDword param2, const char *resource) const -{ - ieDword cnt = 0; - - std::list< Effect* >::const_iterator f; - - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - if( param1!=0xffffffff) - MATCH_PARAM1(); - if( param2!=0xffffffff) - MATCH_PARAM2(); - if( resource) { - MATCH_RESOURCE(); - } - cnt++; - } - return cnt; -} - -void EffectQueue::ModifyEffectPoint(ieDword opcode, ieDword x, ieDword y) const -{ - std::list< Effect* >::const_iterator f; - - for ( f = effects.begin(); f != effects.end(); f++ ) { - MATCH_OPCODE(); - (*f)->PosX=x; - (*f)->PosY=y; - (*f)->Parameter3=0; - return; - } -} - -//count effects that get saved -ieDword EffectQueue::GetSavedEffectsCount() const -{ - ieDword cnt = 0; - - std::list< Effect* >::const_iterator f; - - for ( f = effects.begin(); f != effects.end(); f++ ) { - Effect* fx = *f; - if( Persistent(fx)) - cnt++; - } - return cnt; -} - -void EffectQueue::TransformToDelay(ieByte &TimingMode) -{ - if( TimingModeImmuneToProjectile(fx->Projectile)) return 0; - - //don't resist item projectile payloads based on spell school, bounce, etc. - if( fx->InventorySlot) { - return 1; - } - - //check level resistances - //check specific spell immunity - //check school/sectype immunity - return check_type(target, fx); - } - return 0; -} - -void EffectQueue::AffectAllInRange(Map *map, const Point &pos, int idstype, int idsvalue, - unsigned int range, Actor *except) -{ - int cnt = map->GetActorCount(true); - while(cnt--) { - Actor *actor = map->GetActor(cnt,true); - if( except==actor) { - continue; - } - //distance - if( Distance(pos, actor)>range) { - continue; - } - //ids targeting - if( !match_ids(actor, idstype, idsvalue)) { - continue; - } - //line of sight - if( !map->IsVisible(actor->Pos, pos)) { - continue; - } - AddAllEffects(actor, actor->Pos); - } -} - diff --git a/project/jni/application/gemrb/gemrb/core/EffectQueue.h b/project/jni/application/gemrb/gemrb/core/EffectQueue.h deleted file mode 100644 index 0f4aed862..000000000 --- a/project/jni/application/gemrb/gemrb/core/EffectQueue.h +++ /dev/null @@ -1,314 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file EffectQueue.h - * Declares EffectQueue class holding and processing all spell effects - * on a single Actor - * @author The GemRB Project - */ - -#ifndef EFFECTQUEUE_H -#define EFFECTQUEUE_H - -#include "exports.h" - -#include "Effect.h" -#include "Region.h" - -#include -#include - -class Actor; -class Map; -class Scriptable; - -/** Maximum number of different Effect opcodes */ -#define MAX_EFFECTS 512 - -///** if the effect returns this, stop adding any other effect */ -#define FX_ABORT 0 -/** these effects don't stick around if used as permanent, - * in that case they modify a base stat like charisma modifier */ -#define FX_PERMANENT 2 -/** these effects never stick around, use them for instant effects like damage */ -#define FX_NOT_APPLIED 3 -/** these effects always stick around when applied as permanent or duration */ -#define FX_APPLIED 1 -///** insert the effect instead of push back */ -#define FX_INSERT 4 - -//remove level effects flags -#define RL_DISPELLABLE 1 //only dispellables -#define RL_MATCHSCHOOL 2 //match school -#define RL_MATCHSECTYPE 4 //match secondary type -#define RL_REMOVEFIRST 8 //remove only one spell (could be more effects) - -//bouncing immunities -#define BNC_PROJECTILE 1 -#define BNC_OPCODE 2 -#define BNC_LEVEL 4 -#define BNC_SCHOOL 8 -#define BNC_SECTYPE 0x10 -#define BNC_RESOURCE 0x20 -#define BNC_PROJECTILE_DEC 0x100 -#define BNC_OPCODE_DEC 0x200 -#define BNC_LEVEL_DEC 0x400 -#define BNC_SCHOOL_DEC 0x800 -#define BNC_SECTYPE_DEC 0x1000 -#define BNC_RESOURCE_DEC 0x2000 - -//normal immunities -#define IMM_PROJECTILE 1 -#define IMM_OPCODE 2 -#define IMM_LEVEL 4 -#define IMM_SCHOOL 8 -#define IMM_SECTYPE 16 -#define IMM_RESOURCE 32 -#define IMM_PROJECTILE_DEC 0x100 -#define IMM_OPCODE_DEC 0x200 -#define IMM_LEVEL_DEC 0x400 -#define IMM_SCHOOL_DEC 0x800 -#define IMM_SECTYPE_DEC 0x1000 -#define IMM_RESOURCE_DEC 0x2000 - -// FIXME: Dice roll should be probably done just once, e.g. when equipping -// the item, not each time the fx are applied -// the dice values are actually level limits, except in 3 hp modifier functions -// the damage function is an instant (the other 2 functions might be tricky with random values) -//#define DICE_ROLL(max_val) ((fx->DiceThrown && fx->DiceSides) ? ((max_val >=0) ? (MIN( core->Roll( fx->DiceThrown, fx->DiceSides, 0 ), max_val )) : (MAX( core->Roll( fx->DiceThrown, fx->DiceSides, 0 ), max_val ))) : max_val) - -//sometimes damage doesn't comply with the calculated value -#define DICE_ROLL(adjustment) (core->Roll( fx->DiceThrown, fx->DiceSides, adjustment) ) - -// You will need to get GameTime somehow to use this macro -#define PrepareDuration(fx) fx->Duration = (fx->Duration*AI_UPDATE_TIME + GameTime) - -//return the caster object -#define GetCasterObject() (core->GetGame()->GetActorByGlobalID(fx->CasterID)) - -// often used stat modifications, usually Parameter2 types 0, 1 and 2 -//these macros should work differently in permanent mode (modify base too) -#define STAT_GET(stat) (target->Modified[ stat ]) -#define STAT_ADD(stat, mod) target->SetStat( stat, STAT_GET( stat ) + ( mod ), 0 ) -#define STAT_SUB(stat, mod) target->SetStat( stat, STAT_GET( stat ) - ( mod ), 0 ) -#define STAT_BIT_OR(stat, mod) target->SetStat( stat, STAT_GET( stat ) | ( mod ), 0 ) -#define STAT_SET(stat, mod) target->SetStat( stat, ( mod ), 0 ) -#define STAT_SET_PCF(stat, mod) target->SetStat( stat, ( mod ), 1 ) -#define STAT_BIT_OR_PCF(stat, mod) target->SetStat( stat, STAT_GET( stat ) | ( mod ), 1 ) -#define STAT_MUL(stat, mod) target->SetStat( stat, STAT_GET(stat) * ( mod ) / 100, 0 ) -//if an effect sticks around -#define STATE_CURE( mod ) target->Modified[ IE_STATE_ID ] &= ~(ieDword) ( mod ) -#define STATE_SET( mod ) target->Modified[ IE_STATE_ID ] |= (ieDword) ( mod ) -#define EXTSTATE_SET( mod ) target->Modified[ IE_EXTSTATE_ID ] |= (ieDword) ( mod ) -#define STATE_GET( mod ) (target->Modified[ IE_STATE_ID ] & (ieDword) ( mod ) ) -#define EXTSTATE_GET( mod ) (target->Modified[ IE_EXTSTATE_ID ] & (ieDword) ( mod ) ) -#define STAT_MOD( stat ) target->NewStat(stat, fx->Parameter1, fx->Parameter2) -#define STAT_MOD_VAR( stat, mod ) target->NewStat(stat, ( mod ) , fx->Parameter2 ) -#define BASE_GET(stat) (target->BaseStats[ stat ]) -#define BASE_SET(stat, mod) target->SetBase( stat, ( mod ) ) -#define BASE_ADD(stat, mod) target->SetBase( stat, BASE_GET(stat)+ ( mod ) ) -#define BASE_SUB(stat, mod) target->SetBase( stat, BASE_GET(stat)- ( mod ) ) -#define BASE_MUL(stat, mod) target->SetBase( stat, BASE_GET(stat)* ( mod ) / 100 ) -#define BASE_MOD(stat) target->NewBase( stat, fx->Parameter1, fx->Parameter2) -#define BASE_MOD_VAR(stat, mod) target->NewBase( stat, (mod), fx->Parameter2 ) -//if an effect doesn't stick (and has permanent until cured effect) then -//it has to modify the base stat (which is saved) -//also use this one if the effect starts a cure effect automatically -#define BASE_STATE_SET( mod ) target->SetBaseBit( IE_STATE_ID, ( mod ), true ) -#define BASE_STATE_CURE( mod ) target->SetBaseBit( IE_STATE_ID, ( mod ), false ) - -/** Prototype of a function implementing a particular Effect opcode */ -typedef int (* EffectFunction)(Scriptable*, Actor*, Effect*); - - -/** Cached Effect -> opcode mapping */ -struct EffectRef { - const char* Name; - int opcode; -}; - -/** Links Effect name to a function implementing the effect */ -struct EffectDesc { - const char* Name; - EffectFunction Function; - int Flags; - int opcode; -}; - -enum EffectFlags { - EFFECT_NORMAL = 0, - EFFECT_DICED = 1, - EFFECT_NO_LEVEL_CHECK = 2, - EFFECT_NO_ACTOR = 4 -}; - -/** Initializes table of available spell Effects used by all the queues. */ -/** The available effects should already be registered by the effect plugins */ -bool Init_EffectQueue(); - -/** Registers opcodes implemented by an effect plugin */ -void EffectQueue_RegisterOpcodes(int count, const EffectDesc *opcodes); - -/** release effect list when Interface is destroyed */ -void EffectQueue_ReleaseMemory(); - -/** Check if opcode is for an effect that takes a color slot as parameter. */ -bool IsColorslotEffect(int opcode); - -/** - * @class EffectQueue - * Class holding and processing spell Effects on a single Actor - */ - -class GEM_EXPORT EffectQueue { -private: - /** List of Effects applied on the Actor */ - std::list< Effect* > effects; - /** Actor which is target of the Effects */ - Scriptable* Owner; - -public: - EffectQueue(); - virtual ~EffectQueue(); - - /** Sets Actor which is affected by these effects */ - void SetOwner(Scriptable* act) { Owner = act; } - /** Returns Actor affected by these effects */ - Scriptable* GetOwner() const { return Owner; } - - /** adds an effect to the queue, it could also insert it if flagged so - * fx should be freed by the caller - */ - void AddEffect(Effect* fx, bool insert=false); - /** Adds an Effect to the queue, subject to level and other checks. - * Returns FX_ABORT is unsuccessful. fx is just a reference, AddEffect() - * will malloc its own copy */ - int AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const Point &dest) const; - /** Removes first Effect matching fx from the queue. - * Effects are matched based on their contents */ - bool RemoveEffect(Effect* fx); - - int AddAllEffects(Actor* target, const Point &dest) const; - void ApplyAllEffects(Actor* target) const; - /** remove effects marked for removal */ - void Cleanup(); - - /* directly removes effects with specified opcode, use effect_reference when you can */ - void RemoveAllEffects(ieDword opcode) const; - void RemoveAllEffectsWithResource(ieDword opcode, const ieResRef resource) const; - - /* removes any effects (delayed or not) which were using projectile */ - void RemoveAllEffectsWithProjectile(ieDword projectile) const; - - /* removes equipping effects with specified inventory slot code */ - void RemoveEquippingEffects(ieDwordSigned slotcode) const; - - /* removes all effects of a given spell */ - void RemoveAllEffects(const ieResRef Removed) const; - void RemoveAllEffects(const ieResRef Removed, ieByte timing) const; - /* removes all effects of type */ - void RemoveAllEffects(EffectRef &effect_reference) const; - /* removes expired or to be expired effects */ - void RemoveExpiredEffects(ieDword futuretime) const; - /* removes all effects except timing mode 9 */ - void RemoveAllNonPermanentEffects() const; - void RemoveAllDetrimentalEffects(EffectRef &effect_reference, ieDword current) const; - void RemoveAllEffectsWithParam(EffectRef &effect_reference, ieDword param2) const; - void RemoveAllEffectsWithResource(EffectRef &effect_reference, const ieResRef resource) const; - void RemoveLevelEffects(ieResRef &Removed, ieDword level, ieDword flags, ieDword match) const; - - /* returns true if the timing method supports simplified duration */ - static bool HasDuration(Effect *fx); - /* returns true if the effect should be saved */ - static bool Persistent(Effect* fx); - /* returns next saved effect, increases index */ - std::list< Effect* >::const_iterator GetFirstEffect() const - { - return effects.begin(); - } - const Effect *GetNextSavedEffect(std::list< Effect* >::const_iterator &f) const; - Effect *GetNextEffect(std::list< Effect* >::const_iterator &f) const; - ieDword CountEffects(EffectRef &effect_reference, ieDword param1, ieDword param2, const char *ResRef) const; - void ModifyEffectPoint(EffectRef &effect_reference, ieDword x, ieDword y) const; - /* returns the number of saved effects */ - ieDword GetSavedEffectsCount() const; - size_t GetEffectsCount() const { return effects.size(); } - /* this method hacks the offhand weapon color effects */ - static void HackColorEffects(Actor *Owner, Effect *fx); - static Effect *CreateEffect(EffectRef &effect_reference, ieDword param1, ieDword param2, ieWord timing); - EffectQueue *CopySelf() const; - static Effect *CreateEffectCopy(Effect *oldfx, EffectRef &effect_reference, ieDword param1, ieDword param2); - static Effect *CreateUnsummonEffect(Effect *fx); - //locating opcodes - Effect *HasEffect(EffectRef &effect_reference) const; - Effect *HasEffectWithParam(EffectRef &effect_reference, ieDword param2) const; - Effect *HasEffectWithParamPair(EffectRef &effect_reference, ieDword param1, ieDword param2) const; - Effect *HasEffectWithResource(EffectRef &effect_reference, const ieResRef resource) const; - Effect *HasEffectWithSource(EffectRef &effect_reference, const ieResRef source) const; - void DecreaseParam1OfEffect(EffectRef &effect_reference, ieDword amount) const; - int SpecificDamageBonus(ieDword damage_type) const; - bool HasAnyDispellableEffect() const; - //transforming timing modes - static void TransformToDelay(ieByte &TimingMode); - //getting summarised effects - int BonusAgainstCreature(EffectRef &effect_reference, Actor *actor) const; - //getting weapon immunity flag - bool WeaponImmunity(int enchantment, ieDword weapontype) const; - //melee and ranged effects - void AddWeaponEffects(EffectQueue *fxqueue, EffectRef &fx_ref) const; - // checks if spells of type "types" are disabled (usually by armor) - // returns a bitfield of disabled spelltypes - // it is no longer used - //int DisabledSpellcasting(int types) const; - - // returns -1 if bounced, 0 if resisted, 1 if accepted spell - int CheckImmunity(Actor *target) const; - // apply this effectqueue on all actors matching ids targeting - // from pos, in range (no cone size yet) - void AffectAllInRange(Map *map, const Point &pos, int idstype, int idsvalue, unsigned int range, Actor *except); - /** Lists contents of the queue on a terminal for debugging */ - void dump() const; - //resolve effect - static int ResolveEffect(EffectRef &effect_reference); - static bool match_ids(Actor *target, int table, ieDword value); - /** returns true if the process should abort applying a stack of effects */ - int ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieDword resistance=1) const; -private: - /** counts effects of specific opcode, parameters and resource */ - ieDword CountEffects(ieDword opcode, ieDword param1, ieDword param2, const char *ResRef) const; - void ModifyEffectPoint(ieDword opcode, ieDword x, ieDword y) const; - //use the effect reference style calls from outside - static Effect *CreateEffect(ieDword opcode, ieDword param1, ieDword param2, ieWord timing); - static Effect *CreateEffectCopy(Effect *oldfx, ieDword opcode, ieDword param1, ieDword param2); - void RemoveAllDetrimentalEffects(ieDword opcode, ieDword current) const; - void RemoveAllEffectsWithParam(ieDword opcode, ieDword param2) const; - Effect *HasOpcode(ieDword opcode) const; - Effect *HasOpcodeWithParam(ieDword opcode, ieDword param2) const; - Effect *HasOpcodeWithParamPair(ieDword opcode, ieDword param1, ieDword param2) const; - Effect *HasOpcodeWithResource(ieDword opcode, const ieResRef resource) const; - Effect *HasOpcodeWithSource(ieDword opcode, const ieResRef source) const; - void DecreaseParam1OfEffect(ieDword opcode, ieDword amount) const; - int SpecificDamageBonus(ieDword opcode, ieDword param2) const; - int BonusAgainstCreature(ieDword opcode, Actor *actor) const; - bool WeaponImmunity(ieDword opcode, int enchantment, ieDword weapontype) const; -}; - -#endif // ! EFFECTQUEUE_H diff --git a/project/jni/application/gemrb/gemrb/core/Factory.cpp b/project/jni/application/gemrb/gemrb/core/Factory.cpp deleted file mode 100644 index 797c4a09d..000000000 --- a/project/jni/application/gemrb/gemrb/core/Factory.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "Factory.h" - -#include "win32def.h" - -#include - -Factory::Factory(void) -{ -} - -Factory::~Factory(void) -{ - for (unsigned int i = 0; i < fobjects.size(); i++) { - delete( fobjects[i] ); - } -} - -void Factory::AddFactoryObject(FactoryObject* fobject) -{ - fobjects.push_back( fobject ); -} - -int Factory::IsLoaded(const char* ResRef, SClass_ID type) const -{ - for (unsigned int i = 0; i < fobjects.size(); i++) { - if (fobjects[i]->SuperClassID == type) { - if (strnicmp( fobjects[i]->ResRef, ResRef, 8 ) == 0) { - return i; - } - } - } - return -1; -} - -FactoryObject* Factory::GetFactoryObject(int pos) const -{ - return fobjects[pos]; -} - -void Factory::FreeObjects(void) -{ - for (unsigned int i = 0; i < fobjects.size(); i++) { - delete( fobjects[i] ); - } -} diff --git a/project/jni/application/gemrb/gemrb/core/Factory.h b/project/jni/application/gemrb/gemrb/core/Factory.h deleted file mode 100644 index d6c1c09e3..000000000 --- a/project/jni/application/gemrb/gemrb/core/Factory.h +++ /dev/null @@ -1,42 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef FACTORY_H -#define FACTORY_H - -#include "exports.h" -#include "globals.h" - -#include "AnimationFactory.h" -#include "FactoryObject.h" - -class GEM_EXPORT Factory { -private: - std::vector< FactoryObject*> fobjects; -public: - Factory(void); - ~Factory(void); - void AddFactoryObject(FactoryObject* fobject); - int IsLoaded(const char* ResRef, SClass_ID type) const; - FactoryObject* GetFactoryObject(int pos) const; - void FreeObjects(void); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/FactoryObject.cpp b/project/jni/application/gemrb/gemrb/core/FactoryObject.cpp deleted file mode 100644 index 8c0da9bae..000000000 --- a/project/jni/application/gemrb/gemrb/core/FactoryObject.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "FactoryObject.h" - -#include "win32def.h" - -FactoryObject::FactoryObject(const char* name, SClass_ID SuperClassID) -{ - strnlwrcpy( ResRef, name, 8 ); - this->SuperClassID = SuperClassID; -} - -FactoryObject::~FactoryObject(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/FactoryObject.h b/project/jni/application/gemrb/gemrb/core/FactoryObject.h deleted file mode 100644 index a1189c6eb..000000000 --- a/project/jni/application/gemrb/gemrb/core/FactoryObject.h +++ /dev/null @@ -1,35 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef FACTORYOBJECT_H -#define FACTORYOBJECT_H - -#include "exports.h" -#include "globals.h" - -class GEM_EXPORT FactoryObject { -public: - SClass_ID SuperClassID; - ieResRef ResRef; - FactoryObject(const char* ResRef, SClass_ID SuperClassID); - virtual ~FactoryObject(void); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/FileCache.cpp b/project/jni/application/gemrb/gemrb/core/FileCache.cpp deleted file mode 100644 index 3da6ea27a..000000000 --- a/project/jni/application/gemrb/gemrb/core/FileCache.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "FileCache.h" - -#include "Compressor.h" -#include "Interface.h" -#include "PluginMgr.h" -#include "System/FileStream.h" -#include "System/VFS.h" - -DataStream* CacheCompressedStream(DataStream *stream, const char* filename, int length, bool overwrite) -{ - if (!core->IsAvailable(PLUGIN_COMPRESSION_ZLIB)) { - print( "No Compression Manager Available.\nCannot Load Compressed File.\n" ); - return NULL; - } - - char fname[_MAX_PATH]; - ExtractFileFromPath(fname, filename); - char path[_MAX_PATH]; - PathJoin(path, core->CachePath, fname, NULL); - - if (overwrite || !file_exists(path)) { - FileStream out; - if (!out.Create(path)) { - printMessage("FileCache", "Cannot write %s.\n", RED, path); - return NULL; - } - - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - if (comp->Decompress(&out, stream, length) != GEM_OK) - return NULL; - } else { - stream->Seek(length, GEM_CURRENT_POS); - } - return FileStream::OpenFile(path); -} - -DataStream* CacheFile(const char* path) -{ - if (!core->GameOnCD) - return FileStream::OpenFile(path); - - char filename[_MAX_PATH]; - char cachedfile[_MAX_PATH]; - ExtractFileFromPath(filename, path); - PathJoin(cachedfile, core->CachePath, filename, NULL); - - if (!file_exists(cachedfile)) { // File was not found in cache - FileStream* src = FileStream::OpenFile(path); - FileStream* dest = FileStream::OpenFile(cachedfile); - if (!src || !dest) { - error("Cache", "CachedFile failed to write to cached file '%s' (from '%s')\n", cachedfile, path); - } - - size_t blockSize = 1024 * 1000; - char buff[1024 * 1000]; - do { - if (blockSize > src->Remains()) - blockSize = src->Remains(); - size_t len = src->Read(buff, blockSize); - size_t c = dest->Write(buff, len); - if (c != len) { - error("Cache", "CacheFile failed to write to cached file '%s' (from '%s')\n", cachedfile, path); - } - } while (src->Remains()); - delete src; - delete dest; - } - return FileStream::OpenFile(cachedfile); -} diff --git a/project/jni/application/gemrb/gemrb/core/FileCache.h b/project/jni/application/gemrb/gemrb/core/FileCache.h deleted file mode 100644 index 1345a4aa1..000000000 --- a/project/jni/application/gemrb/gemrb/core/FileCache.h +++ /dev/null @@ -1,27 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef FILECACHE_H -#define FILECACHE_H - -#include "System/DataStream.h" - -GEM_EXPORT DataStream* CacheCompressedStream(DataStream *stream, const char* filename, int length = 0, bool overwrite = false); -GEM_EXPORT DataStream* CacheFile(const char* path); - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Font.cpp b/project/jni/application/gemrb/gemrb/core/Font.cpp deleted file mode 100644 index 7cb1bec4a..000000000 --- a/project/jni/application/gemrb/gemrb/core/Font.cpp +++ /dev/null @@ -1,579 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -//This class represents game fonts. Fonts are special .bam files. -//Each cycle stands for a letter. - -#include "Font.h" - -#include "win32def.h" - -#include "GameData.h" -#include "Interface.h" -#include "Palette.h" -#include "Sprite2D.h" -#include "Video.h" - -#include - -unsigned int lastX = 0; - -#define PARAGRAPH_START_X 5; - -static const Color black = {0, 0, 0, 0}; - -inline size_t mystrlen(const char* string) -{ - if (!string) { - return ( size_t ) 0; - } - const char* tmp = string; - size_t count = 0; - while (*tmp != 0) { - if (( ( unsigned char ) * tmp ) >= 0xf0) { - tmp += 3; - count += 3; - } - count++; - tmp++; - } - return count; -} - -Font::Font(int w, int h, Palette* pal) -{ - lastX = 0; - count = 0; - FirstChar = 0; - sprBuffer = 0; - - width = w; - height = h; - tmpPixels = (unsigned char*)malloc(width*height); - - memset( xPos, 0, sizeof( xPos) ); - memset( yPos, 0, sizeof( yPos) ); - - pal->IncRef(); - palette = pal; - maxHeight = h; -} - -Font::~Font(void) -{ - Video *video = core->GetVideoDriver(); - gamedata->FreePalette( palette ); - video->FreeSprite( sprBuffer ); -} - -void Font::FinalizeSprite(bool cK, int index) -{ - sprBuffer = core->GetVideoDriver()->CreateSprite8( width, height, 8, tmpPixels, palette ? palette->col : 0, cK, index ); - tmpPixels = 0; -} - -void Font::AddChar(unsigned char* spr, int w, int h, short xPos, short yPos) -{ - if (!spr) { - size[count].x = 0; - size[count].y = 0; - size[count].w = 0; - size[count].h = 0; - this->xPos[count] = 0; - this->yPos[count] = 0; - count++; - return; - } - unsigned char * currPtr = tmpPixels + lastX; - unsigned char * srcPtr = ( unsigned char * ) spr; - for (int y = 0; y < h; y++) { - memcpy( currPtr, srcPtr, w ); - srcPtr += w; - currPtr += width; - } - size[count].x = lastX; - size[count].y = 0; - size[count].w = w; - size[count].h = h; - this->xPos[count] = xPos; - this->yPos[count] = yPos; - count++; - lastX += w; -} - -void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, - Palette* hicolor, unsigned char Alignment, Font* initials, - Sprite2D* cursor, unsigned int curpos, bool NoColor) const -{ - bool enablecap=false; - int capital = 0; - if (initials) - { - capital=1; - enablecap=true; - } - int initials_rows = 0; - int initials_x = 0; - - unsigned int psx = PARAGRAPH_START_X; - Palette *pal = hicolor; - if (!pal) { - pal = palette; - } - if (startrow) enablecap=false; - - if (initials==this) { - enablecap=false; - } - - sprBuffer->SetPalette( pal ); - size_t len = strlen( ( char* ) string ); - char* tmp = ( char* ) malloc( len + 1 ); - memcpy( tmp, ( char * ) string, len + 1 ); - SetupString( tmp, rgn.w, NoColor, initials, enablecap ); - int ystep = 0; - if (Alignment & IE_FONT_SINGLE_LINE) { - for (size_t i = 0; i < len; i++) { - int height = yPos[( unsigned char ) tmp[i] - 1]; - if (ystep < height) - ystep = height; - } - } else { - ystep = size[1].h; - } - if (!ystep) ystep = maxHeight; - int x = psx, y = ystep; - int w = CalcStringWidth( tmp, NoColor ); - if (Alignment & IE_FONT_ALIGN_CENTER) { - x = ( rgn.w - w) / 2; - } else if (Alignment & IE_FONT_ALIGN_RIGHT) { - x = ( rgn.w - w ); - } - if (Alignment & IE_FONT_ALIGN_MIDDLE) { - int h = 0; - for (size_t i = 0; i <= len; i++) { - if (( tmp[i] == 0 ) || ( tmp[i] == '\n' )) - h++; - } - h = h * ystep; - y += ( rgn.h - h ) / 2; - } else if (Alignment & IE_FONT_ALIGN_BOTTOM) { - int h = 1; - for (size_t i = 0; i <= len; i++) { - if (( tmp[i] == 0 ) || ( tmp[i] == '\n' )) - h++; - } - h = h * ystep; - y += ( rgn.h - h ); - } else if (Alignment & IE_FONT_ALIGN_TOP) { - y += 5; - } - - Video* video = core->GetVideoDriver(); - int row = 0; - for (size_t i = 0; i < len; i++) { - if (( ( unsigned char ) tmp[i] ) == '[' && !NoColor) { - i++; - char tag[256]; - tag[0]=0; - - for (int k = 0; k < 256 && i=startrow) ) { - enablecap=true; - } - continue; - } - - - if (strnicmp( tag, "color=", 6 ) == 0) { - unsigned int r,g,b; - if (sscanf( tag, "color=%02X%02X%02X", &r, &g, &b ) != 3) - continue; - const Color c = {(unsigned char) r,(unsigned char)g, (unsigned char)b, 0}; - Palette* newPal = core->CreatePalette( c, palette->back ); - sprBuffer->SetPalette( newPal ); - gamedata->FreePalette( newPal ); - continue; - } - if (stricmp( tag, "/color" ) == 0) { - sprBuffer->SetPalette( pal ); - continue; - } - - if (stricmp( "p", tag ) == 0) { - psx = x; - continue; - } - if (stricmp( "/p", tag ) == 0) { - psx = PARAGRAPH_START_X; - } - continue; - } - - if (row < startrow) { - if (tmp[i] == 0) { - row++; - } - continue; - } - if (( tmp[i] == 0 ) || ( tmp[i] == '\n' )) { - y += ystep; - x = psx; - int w = CalcStringWidth( &tmp[i + 1], NoColor ); - if (initials_rows > 0) { - initials_rows--; - x += initials_x; - w += initials_x; - } - if (Alignment & IE_FONT_ALIGN_CENTER) { - x = ( rgn.w - w ) / 2; - } else if (Alignment & IE_FONT_ALIGN_RIGHT) { - x = ( rgn.w - w ); - } - continue; - } - unsigned char currChar = ( unsigned char ) tmp[i] - 1; - if (initials && capital && enablecap) { - x = initials->PrintInitial( x, y, rgn, currChar ); - initials_x = x; - - //how many more lines to be indented (one was already indented) - initials_rows = (initials->maxHeight-1)/maxHeight; - enablecap = false; - continue; - } - video->BlitSpriteRegion( sprBuffer, size[currChar], - x + rgn.x, y + rgn.y - yPos[currChar], true, &rgn ); - if (cursor && ( i == curpos )) { - video->BlitSprite( cursor, x + rgn.x, - y + rgn.y, true, &rgn ); - } - x += size[currChar].w; - } - if (cursor && ( curpos == len )) { - video->BlitSprite( cursor, x + rgn.x, - y + rgn.y, true, &rgn ); - } - free( tmp ); -} - -void Font::Print(Region rgn, const unsigned char* string, Palette* hicolor, - unsigned char Alignment, bool anchor, Font* initials, - Sprite2D* cursor, unsigned int curpos, bool NoColor) const -{ - Print(rgn, rgn, string, hicolor, Alignment, anchor, initials, cursor, curpos, NoColor); -} - -void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, - Palette* hicolor, unsigned char Alignment, bool anchor, Font* initials, - Sprite2D* cursor, unsigned int curpos, bool NoColor) const -{ - bool enablecap=false; - int capital = 0; - if (initials) - { - capital=1; - enablecap=true; - } - - unsigned int psx = PARAGRAPH_START_X; - Palette* pal = hicolor; - if (!pal) { - pal = palette; - } - if (initials==this) { - initials = NULL; - } - - sprBuffer->SetPalette( pal ); - size_t len = strlen( ( char* ) string ); - char* tmp = ( char* ) malloc( len + 1 ); - memcpy( tmp, ( char * ) string, len + 1 ); - while (len > 0 && (tmp[len - 1] == '\n' || tmp[len - 1] == '\r')) { - // ignore trailing newlines - tmp[len - 1] = 0; - len--; - } - - SetupString( tmp, rgn.w, NoColor, initials, capital ); - int ystep = 0; - if (Alignment & IE_FONT_SINGLE_LINE) { - - for (size_t i = 0; i < len; i++) { - if (tmp[i] == 0) continue; - int height = yPos[( unsigned char ) tmp[i] - 1]; - if (ystep < height) - ystep = height; - } - } else { - ystep = size[1].h; - } - if (!ystep) ystep = maxHeight; - int x = psx, y = ystep; - Video* video = core->GetVideoDriver(); - - if (Alignment & IE_FONT_ALIGN_CENTER) { - int w = CalcStringWidth( tmp, NoColor ); - x = ( rgn.w - w ) / 2; - } else if (Alignment & IE_FONT_ALIGN_RIGHT) { - int w = CalcStringWidth( tmp, NoColor ); - x = ( rgn.w - w ); - } - - if (Alignment & IE_FONT_ALIGN_MIDDLE) { - int h = 0; - for (size_t i = 0; i <= len; i++) { - if (tmp[i] == 0) - h++; - } - h = h * ystep; - y += ( rgn.h - h ) / 2; - } else if (Alignment & IE_FONT_ALIGN_BOTTOM) { - int h = 1; - for (size_t i = 0; i <= len; i++) { - if (tmp[i] == 0) - h++; - } - h = h * ystep; - y += ( rgn.h - h ); - } else if (Alignment & IE_FONT_ALIGN_TOP) { - y += 5; - } - for (size_t i = 0; i < len; i++) { - if (( ( unsigned char ) tmp[i] ) == '[' && !NoColor) { - i++; - char tag[256]; - tag[0]=0; - for (int k = 0; k < 256 && iCreatePalette( c, palette->back ); - sprBuffer->SetPalette( newPal ); - gamedata->FreePalette( newPal ); - continue; - } - if (stricmp( tag, "/color" ) == 0) { - sprBuffer->SetPalette( pal ); - continue; - } - if (stricmp( "p", tag ) == 0) { - psx = x; - continue; - } - if (stricmp( "/p", tag ) == 0) { - psx = PARAGRAPH_START_X; - continue; - } - continue; - } - - if (tmp[i] == 0) { - y += ystep; - x = psx; - int w = CalcStringWidth( &tmp[i + 1], NoColor ); - if (Alignment & IE_FONT_ALIGN_CENTER) { - x = ( rgn.w - w ) / 2; - } else if (Alignment & IE_FONT_ALIGN_RIGHT) { - x = ( rgn.w - w ); - } - continue; - } - unsigned char currChar = ( unsigned char ) tmp[i] - 1; - if (initials && capital) { - x = initials->PrintInitial( x, y, rgn, currChar ); - enablecap=false; - continue; - } - video->BlitSpriteRegion( sprBuffer, size[currChar], - x + rgn.x, y + rgn.y - yPos[currChar], - anchor, &cliprgn ); - if (cursor && ( curpos == i )) - video->BlitSprite( cursor, x + rgn.x, y + rgn.y, anchor, &cliprgn ); - x += size[currChar].w; - } - if (cursor && ( curpos == len )) { - video->BlitSprite( cursor, x + rgn.x, y + rgn.y, anchor, &cliprgn ); - } - free( tmp ); -} - -int Font::PrintInitial(int x, int y, const Region &rgn, unsigned char currChar) const -{ - Video *video = core->GetVideoDriver(); - video->BlitSpriteRegion( sprBuffer, size[currChar], - x + rgn.x, y + rgn.y - yPos[currChar], true, &rgn ); - x += size[currChar].w; - return x; -} - -int Font::CalcStringWidth(const char* string, bool NoColor) const -{ - size_t ret = 0, len = strlen( string ); - for (size_t i = 0; i < len; i++) { - if (( ( unsigned char ) string[i] ) == '[' && !NoColor) { - while(i width) { - // we wrapped, force a new line somewhere - if (!endword && ( x == psx )) - lastpos = ( int ) pos; - else - string[lastpos] = 0; - x = psx; - if (initials_rows > 0) { - initials_rows--; - x += initials_x; - } - } - if (string[pos] == 0) { - continue; - } - endword = false; - if (string[pos] == '\r') - string[pos] = ' '; - if (string[pos] == '\n') { - // force a new line here - string[pos] = 0; - x = psx; - wx = 0; - if (initials_rows > 0) { - initials_rows--; - x += initials_x; - } - lastpos = ( int ) pos; - endword = true; - continue; - } - if (( ( unsigned char ) string[pos] ) == '[' && !NoColor) { - pos++; - if (pos>=len) - break; - char tag[256]; - int k = 0; - for (k = 0; k < 256; k++) { - if (string[pos] == ']') { - tag[k] = 0; - break; - } - tag[k] = string[pos++]; - } - if (strnicmp( tag, "capital=",8)==0) { - int capital = 0; - sscanf( tag, "capital=%d", &capital); - if (capital) { - enablecap=true; - } - continue; - } - if (stricmp( "p", tag ) == 0) { - psx = x; - continue; - } - if (stricmp( "/p", tag ) == 0) { - psx = PARAGRAPH_START_X; - continue; - } - continue; - } - - if (string[pos] && string[pos] != ' ') { - string[pos] = ( unsigned char ) (string[pos] - FirstChar); - } - - wx += size[( unsigned char ) string[pos] - 1].w; - if (initials && enablecap) { - wx += initials->size[(unsigned char) string[pos] - 1].w; - enablecap=false; - initials_x = wx; - //how many more lines to be indented (one was already indented) - initials_rows = (initials->maxHeight-1)/maxHeight; - continue; - } - if (( string[pos] == ' ' ) || ( string[pos] == '-' )) { - x += wx; - wx = 0; - lastpos = ( int ) pos; - endword = true; - } - } -} - -Palette* Font::GetPalette() const -{ - assert(palette); - palette->IncRef(); - return palette; -} - -void Font::SetPalette(Palette* pal) -{ - if (palette) palette->Release(); - pal->IncRef(); - palette = pal; -} - -void Font::SetFirstChar( unsigned char first) -{ - FirstChar = first; -} diff --git a/project/jni/application/gemrb/gemrb/core/Font.h b/project/jni/application/gemrb/gemrb/core/Font.h deleted file mode 100644 index df2f06f38..000000000 --- a/project/jni/application/gemrb/gemrb/core/Font.h +++ /dev/null @@ -1,112 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Font.h - * Declares Font, class for manipulating images serving as fonts - * @author The GemRB Project - */ - -#ifndef FONT_H -#define FONT_H - -#include "globals.h" -#include "exports.h" - -#include - -class Palette; -class Sprite2D; - -struct StringList { - Sprite2D*** strings; - unsigned int* heights; - unsigned int* lengths; - int StringCount; - int starty; - int curx; - int cury; -}; - -#define IE_FONT_ALIGN_LEFT 0x00 -#define IE_FONT_ALIGN_CENTER 0x01 -#define IE_FONT_ALIGN_RIGHT 0x02 -#define IE_FONT_ALIGN_BOTTOM 0x04 -#define IE_FONT_ALIGN_TOP 0x10 //Single-Line and Multi-Line Text -#define IE_FONT_ALIGN_MIDDLE 0x20 //Only for single line Text -#define IE_FONT_SINGLE_LINE 0x40 - -/** - * @class Font - * Class for using and manipulating images serving as fonts - */ - -class GEM_EXPORT Font { -private: - int count; - Palette* palette; - Sprite2D* sprBuffer; - unsigned char FirstChar; - - short xPos[256]; - short yPos[256]; - - // For the temporary bitmap - unsigned char* tmpPixels; - unsigned int width, height; -public: - /** ResRef of the Font image */ - ieResRef ResRef; - int maxHeight; - Region size[256]; -public: - Font(int w, int h, Palette* palette); - ~Font(void); - void AddChar(unsigned char* spr, int w, int h, short xPos, short yPos); - /** Call this after adding all characters */ - void FinalizeSprite(bool cK, int index); - - void Print(Region cliprgn, Region rgn, const unsigned char* string, - Palette* color, unsigned char Alignment, bool anchor = false, - Font* initials = NULL, Sprite2D* cursor = NULL, - unsigned int curpos = 0, bool NoColor = false) const; - void Print(Region rgn, const unsigned char* string, Palette* color, - unsigned char Alignment, bool anchor = false, - Font* initials = NULL, Sprite2D* cursor = NULL, - unsigned int curpos = 0, bool NoColor = false) const; - void PrintFromLine(int startrow, Region rgn, const unsigned char* string, - Palette* color, unsigned char Alignment, - Font* initials = NULL, Sprite2D* cursor = NULL, - unsigned int curpos = 0, bool NoColor = false) const; - - Palette* GetPalette() const; - void SetPalette(Palette* pal); - /** Returns width of the string rendered in this font in pixels */ - int CalcStringWidth(const char* string, bool NoColor = false) const; - void SetupString(char* string, unsigned int width, bool NoColor = false, Font *initials = NULL, bool enablecap = false) const; - /** Sets ASCII code of the first character in the font. - * (it allows remapping numeric fonts from \000 to '0') */ - void SetFirstChar(unsigned char first); - -private: - int PrintInitial(int x, int y, const Region &rgn, unsigned char currChar) const; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp deleted file mode 100644 index c2d4efa17..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp +++ /dev/null @@ -1,728 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Button.h" - -#include "GUI/GameControl.h" -#include "GUI/EventMgr.h" -#include "GUI/ScrollBar.h" -#include "GUI/Window.h" - -#include "defsounds.h" -#include "win32def.h" - -#include "GameData.h" -#include "Interface.h" -#include "Palette.h" -#include "Variables.h" -#include "Video.h" - -Button::Button() -{ - Unpressed = Pressed = Selected = Disabled = NULL; - State = IE_GUI_BUTTON_UNPRESSED; - ResetEventHandler( ButtonOnPress ); - ResetEventHandler( ButtonOnDoublePress ); - ResetEventHandler( ButtonOnShiftPress ); - ResetEventHandler( ButtonOnRightPress ); - ResetEventHandler( ButtonOnDragDrop ); - ResetEventHandler( ButtonOnDrag ); - ResetEventHandler( MouseEnterButton ); - ResetEventHandler( MouseLeaveButton ); - ResetEventHandler( MouseOverButton ); - //Text = ( char * ) calloc( 64, sizeof(char) ); - Text = NULL; - hasText = false; - font = core->GetButtonFont(); - normal_palette = NULL; - disabled_palette = font->GetPalette()->Copy(); - for (int i = 0; i < 256; i++) { - disabled_palette->col[i].r = ( disabled_palette->col[i].r * 2 ) / 3; - disabled_palette->col[i].g = ( disabled_palette->col[i].g * 2 ) / 3; - disabled_palette->col[i].b = ( disabled_palette->col[i].b * 2 ) / 3; - } - Flags = IE_GUI_BUTTON_NORMAL; - ToggleState = false; - Picture = NULL; - Clipping = 1.0; - memset(&SourceRGB,0,sizeof(SourceRGB)); - memset(&DestRGB,0,sizeof(DestRGB)); - memset( borders, 0, sizeof( borders )); - starttime = 0; - Anchor.null(); -} -Button::~Button() -{ - Video* video = core->GetVideoDriver(); - video->FreeSprite( Disabled ); - video->FreeSprite( Selected ); - video->FreeSprite( Pressed ); - video->FreeSprite( Unpressed ); - video->FreeSprite( Picture ); - ClearPictureList(); - if (Text) { - free( Text ); - } - gamedata->FreePalette( normal_palette); - gamedata->FreePalette( disabled_palette); -} -/** Sets the 'type' Image of the Button to 'img'. -'type' may assume the following values: -- IE_GUI_BUTTON_UNPRESSED -- IE_GUI_BUTTON_PRESSED -- IE_GUI_BUTTON_SELECTED -- IE_GUI_BUTTON_DISABLED */ -void Button::SetImage(unsigned char type, Sprite2D* img) -{ - switch (type) { - case IE_GUI_BUTTON_UNPRESSED: - case IE_GUI_BUTTON_LOCKED: - case IE_GUI_BUTTON_LOCKED_PRESSED: - core->GetVideoDriver()->FreeSprite( Unpressed ); - Unpressed = img; - break; - - case IE_GUI_BUTTON_SECOND: - case IE_GUI_BUTTON_PRESSED: - core->GetVideoDriver()->FreeSprite( Pressed ); - Pressed = img; - break; - - case IE_GUI_BUTTON_SELECTED: - core->GetVideoDriver()->FreeSprite( Selected ); - Selected = img; - break; - - case IE_GUI_BUTTON_DISABLED: - case IE_GUI_BUTTON_THIRD: - core->GetVideoDriver()->FreeSprite( Disabled ); - Disabled = img; - break; - } - Changed = true; -} - -/** make SourceRGB go closer to DestRGB */ -void Button::CloseUpColor() -{ - if (!starttime) return; - //using the realtime timer, because i don't want to - //handle Game at this point - unsigned long newtime; - - Changed = true; - newtime = GetTickCount(); - if (newtimeFlags&WF_FLOAT) ) { - return; - } - Changed = false; - if (XPos == 65535 || Width == 0) { - return; - } - - Video * video = core->GetVideoDriver(); - - // Button image - if (!( Flags & IE_GUI_BUTTON_NO_IMAGE )) { - Sprite2D* Image = NULL; - - switch (State) { - case IE_GUI_BUTTON_UNPRESSED: - case IE_GUI_BUTTON_LOCKED: - case IE_GUI_BUTTON_LOCKED_PRESSED: - Image = Unpressed; - break; - - case IE_GUI_BUTTON_SECOND: - case IE_GUI_BUTTON_PRESSED: - Image = Pressed; - if (! Image) - Image = Unpressed; - break; - - case IE_GUI_BUTTON_SELECTED: - Image = Selected; - if (! Image) - Image = Unpressed; - break; - - case IE_GUI_BUTTON_DISABLED: - case IE_GUI_BUTTON_THIRD: - Image = Disabled; - if (! Image) - Image = Unpressed; - break; - } - if (Image) { - // FIXME: maybe it's useless... - int xOffs = ( Width / 2 ) - ( Image->Width / 2 ); - int yOffs = ( Height / 2 ) - ( Image->Height / 2 ); - - video->BlitSprite( Image, x + XPos + xOffs, y + YPos + yOffs, true ); - } - } - - if (State == IE_GUI_BUTTON_PRESSED) { - //shift the writing/border a bit - x+= 2; - y+= 2; - } - - // Button picture - if (Picture && (Flags & IE_GUI_BUTTON_PICTURE) ) { - // Picture is drawn centered - int xOffs = ( Width / 2 ) - ( Picture->Width / 2 ); - int yOffs = ( Height / 2 ) - ( Picture->Height / 2 ); - if (Flags & IE_GUI_BUTTON_HORIZONTAL) { - xOffs += x + XPos + Picture->XPos; - yOffs += y + YPos + Picture->YPos; - video->BlitSprite( Picture, xOffs, yOffs, true ); - Region r = Region( xOffs, yOffs + (int) (Picture->Height * Clipping), Picture->Width, (int) (Picture->Height*(1.0 - Clipping)) ); - video->DrawRect( r, SourceRGB, true ); - // do NOT uncomment this, you can't change Changed or invalidate things from - // the middle of Window::DrawWindow() -- it needs moving to somewhere else - //CloseUpColor(); - } - else { - Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(Picture->Width * Clipping), Picture->Height ); - video->BlitSprite( Picture, x + XPos + xOffs + Picture->XPos, y + YPos + yOffs + Picture->YPos, true, &r ); - } - } - - // Composite pictures (paperdolls/description icons) - if (!PictureList.empty() && (Flags & IE_GUI_BUTTON_PICTURE) ) { - std::list::iterator iter = PictureList.begin(); - int xOffs = 0, yOffs = 0; - if (Flags & IE_GUI_BUTTON_CENTER_PICTURES) { - // Center the hotspots of all pictures - xOffs = Width/2; - yOffs = Height/2; - } else if (Flags & IE_GUI_BUTTON_BG1_PAPERDOLL) { - // Display as-is - xOffs = 0; - yOffs = 0; - } else { - // Center the first picture, and align the rest to that - xOffs = Width/2 - (*iter)->Width/2 + (*iter)->XPos; - yOffs = Height/2 - (*iter)->Height/2 + (*iter)->YPos; - } - - for (; iter != PictureList.end(); ++iter) { - video->BlitSprite( *iter, x + XPos + xOffs, y + YPos + yOffs, true ); - } - } - - // Button picture - if (AnimPicture) { - int xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); - int yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); - Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(AnimPicture->Width * Clipping), AnimPicture->Height ); - - if (Flags & IE_GUI_BUTTON_CENTER_PICTURES) { - video->BlitSprite( AnimPicture, x + XPos + xOffs + AnimPicture->XPos, y + YPos + yOffs + AnimPicture->YPos, true, &r ); - } else { - video->BlitSprite( AnimPicture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); - } - } - - // Button label - if (hasText && ! ( Flags & IE_GUI_BUTTON_NO_TEXT )) { - Palette* ppoi = normal_palette; - int align = 0; - - if (State == IE_GUI_BUTTON_DISABLED) - ppoi = disabled_palette; - // FIXME: hopefully there's no button which sinks when selected - // AND has text label - //else if (State == IE_GUI_BUTTON_PRESSED || State == IE_GUI_BUTTON_SELECTED) { - - if (Flags & IE_GUI_BUTTON_ALIGN_LEFT) - align |= IE_FONT_ALIGN_LEFT; - else if (Flags & IE_GUI_BUTTON_ALIGN_RIGHT) - align |= IE_FONT_ALIGN_RIGHT; - else - align |= IE_FONT_ALIGN_CENTER; - - if (Flags & IE_GUI_BUTTON_ALIGN_TOP) - align |= IE_FONT_ALIGN_TOP; - else if (Flags & IE_GUI_BUTTON_ALIGN_BOTTOM) - align |= IE_FONT_ALIGN_BOTTOM; - else - align |= IE_FONT_ALIGN_MIDDLE; - - if (! (Flags & IE_GUI_BUTTON_MULTILINE)) { - align |= IE_FONT_SINGLE_LINE; - } - font->Print( Region( x + XPos, y + YPos, Width - 2, Height - 2), - ( unsigned char * ) Text, ppoi, - (ieByte) align, true ); - } - - if (! (Flags&IE_GUI_BUTTON_NO_IMAGE)) { - for (int i = 0; i < MAX_NUM_BORDERS; i++) { - ButtonBorder *fr = &borders[i]; - if (! fr->enabled) continue; - - Region r = Region( x + XPos + fr->dx1, y + YPos + fr->dy1, Width - (fr->dx1 + fr->dx2 + 1), Height - (fr->dy1 + fr->dy2 + 1) ); - video->DrawRect( r, fr->color, fr->filled ); - } - } -} -/** Sets the Button State */ -void Button::SetState(unsigned char state) -{ - if (state > IE_GUI_BUTTON_LOCKED_PRESSED) {// If wrong value inserted - return; - } - if (State != state) { - Changed = true; - State = state; - } -} -void Button::SetBorder(int index, int dx1, int dy1, int dx2, int dy2, const Color &color, bool enabled, bool filled) -{ - if (index >= MAX_NUM_BORDERS) - return; - - ButtonBorder *fr = &borders[index]; - fr->dx1 = dx1; - fr->dy1 = dy1; - fr->dx2 = dx2; - fr->dy2 = dy2; - fr->color = color; - fr->enabled = enabled; - fr->filled = filled; - Changed = true; -} - -void Button::EnableBorder(int index, bool enabled) -{ - if (index >= MAX_NUM_BORDERS) - return; - - if (borders[index].enabled != enabled) { - borders[index].enabled = enabled; - Changed = true; - } -} - -void Button::SetFont(Font* newfont) -{ - font = newfont; -} -/** Handling The default button (enter) */ -void Button::OnSpecialKeyPress(unsigned char Key) -{ - if (State != IE_GUI_BUTTON_DISABLED && State != IE_GUI_BUTTON_LOCKED) { - if (Key == GEM_RETURN) { - if (Flags & IE_GUI_BUTTON_DEFAULT ) { - RunEventHandler( ButtonOnPress ); - return; - } - } - else if (Key == GEM_ESCAPE) { - if (Flags & IE_GUI_BUTTON_CANCEL ) { - RunEventHandler( ButtonOnPress ); - return; - } - } - } - Control::OnSpecialKeyPress(Key); -} - -/** Mouse Button Down */ -void Button::OnMouseDown(unsigned short x, unsigned short y, - unsigned short Button, unsigned short Mod) -{ - if (State == IE_GUI_BUTTON_DISABLED) { - Control::OnMouseDown(x,y,Button,Mod); - return; - } - - if (core->GetDraggedItem () && !ButtonOnDragDrop) { - Control::OnMouseDown(x,y,Button,Mod); - return; - } - - ScrollBar* scrlbr = (ScrollBar*) sb; - if (!scrlbr) { - Control *ctrl = Owner->GetScrollControl(); - if (ctrl && (ctrl->ControlType == IE_GUI_SCROLLBAR)) { - scrlbr = (ScrollBar *) ctrl; - } - } - - //Button == 1 means Left Mouse Button - switch(Button&GEM_MB_NORMAL) { - case GEM_MB_ACTION: - // We use absolute screen position here, so drag_start - // remains valid even after window/control is moved - drag_start.x = Owner->XPos + XPos + x; - drag_start.y = Owner->YPos + YPos + y; - - if (State == IE_GUI_BUTTON_LOCKED) { - SetState( IE_GUI_BUTTON_LOCKED_PRESSED ); - return; - } - SetState( IE_GUI_BUTTON_PRESSED ); - if (Flags & IE_GUI_BUTTON_SOUND) { - core->PlaySound( DS_BUTTON_PRESSED ); - } - if ((Button & GEM_MB_DOUBLECLICK) && ButtonOnDoublePress) { - RunEventHandler( ButtonOnDoublePress ); - printMessage("Button","Doubleclick detected\n",GREEN); - } - break; - case GEM_MB_SCRLUP: - if (scrlbr) { - scrlbr->ScrollUp(); - core->RedrawAll(); - } - break; - case GEM_MB_SCRLDOWN: - if (scrlbr) { - scrlbr->ScrollDown(); - core->RedrawAll(); - } - break; - } -} -/** Mouse Button Up */ -void Button::OnMouseUp(unsigned short x, unsigned short y, - unsigned short Button, unsigned short Mod) -{ - if (State == IE_GUI_BUTTON_DISABLED) { - return; - } - - //what was just dropped? - int dragtype = 0; - if (core->GetDraggedItem ()) dragtype=1; - if (core->GetDraggedPortrait ()) dragtype=2; - - //if something was dropped, but it isn't handled here: it didn't happen - if (dragtype && !ButtonOnDragDrop) - return; - - switch (State) { - case IE_GUI_BUTTON_PRESSED: - if (ToggleState) { - SetState( IE_GUI_BUTTON_SELECTED ); - } else { - SetState( IE_GUI_BUTTON_UNPRESSED ); - } - break; - case IE_GUI_BUTTON_LOCKED_PRESSED: - SetState( IE_GUI_BUTTON_LOCKED ); - break; - } - - //in case of dragged/dropped portraits, allow the event to happen even - //when we are out of bound - if (dragtype!=2) { - if (( x >= Width ) || ( y >= Height )) { - return; - } - } - if (Flags & IE_GUI_BUTTON_CHECKBOX) { - //checkbox - ToggleState = !ToggleState; - if (ToggleState) - SetState( IE_GUI_BUTTON_SELECTED ); - else - SetState( IE_GUI_BUTTON_UNPRESSED ); - if (VarName[0] != 0) { - ieDword tmp = 0; - core->GetDictionary()->Lookup( VarName, tmp ); - tmp ^= Value; - core->GetDictionary()->SetAt( VarName, tmp ); - Owner->RedrawControls( VarName, tmp ); - } - } else { - if (Flags & IE_GUI_BUTTON_RADIOBUTTON) { - //radio button - ToggleState = true; - SetState( IE_GUI_BUTTON_SELECTED ); - } - if (VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Value ); - Owner->RedrawControls( VarName, Value ); - } - } - - switch (dragtype) { - case 1: - RunEventHandler( ButtonOnDragDrop ); - return; - case 2: - RunEventHandler( ButtonOnDragDropPortrait ); - return; - } - - if ((Button&GEM_MB_NORMAL) == GEM_MB_ACTION) { - if ((Mod & GEM_MOD_SHIFT) && ButtonOnShiftPress) - RunEventHandler( ButtonOnShiftPress ); - else - RunEventHandler( ButtonOnPress ); - } else { - if (Button == GEM_MB_MENU && ButtonOnRightPress) - RunEventHandler( ButtonOnRightPress ); - } -} - -void Button::OnMouseOver(unsigned short x, unsigned short y) -{ - Owner->Cursor = IE_CURSOR_NORMAL; - if (State == IE_GUI_BUTTON_DISABLED) { - return; - } - - if ( RunEventHandler( MouseOverButton )) { - //event handler destructed this object - return; - } - - //well, no more flags for buttons, and the portraits we can perform action on - //are in fact 'draggable multiline pictures' (with image) - if ((Flags & IE_GUI_BUTTON_DISABLED_P) == IE_GUI_BUTTON_PORTRAIT) { - GameControl *gc = core->GetGameControl(); - if (gc) { - Owner->Cursor = gc->GetDefaultCursor(); - } - } - - if (State == IE_GUI_BUTTON_LOCKED) { - return; - } - - //portrait buttons are draggable and locked - if ((Flags & IE_GUI_BUTTON_DRAGGABLE) && - (State == IE_GUI_BUTTON_PRESSED || State ==IE_GUI_BUTTON_LOCKED_PRESSED)) { - // We use absolute screen position here, so drag_start - // remains valid even after window/control is moved - int dx = Owner->XPos + XPos + x - drag_start.x; - int dy = Owner->YPos + YPos + y - drag_start.y; - core->GetDictionary()->SetAt( "DragX", dx ); - core->GetDictionary()->SetAt( "DragY", dy ); - drag_start.x = (ieWord) (drag_start.x + dx); - drag_start.y = (ieWord) (drag_start.y + dy); - RunEventHandler( ButtonOnDrag ); - } -} - -void Button::OnMouseEnter(unsigned short /*x*/, unsigned short /*y*/) -{ - if (State == IE_GUI_BUTTON_DISABLED) { - return; - } - - if (MouseEnterButton !=0 && VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Value ); - } - - RunEventHandler( MouseEnterButton ); -} - -void Button::OnMouseLeave(unsigned short /*x*/, unsigned short /*y*/) -{ - if (State == IE_GUI_BUTTON_DISABLED) { - return; - } - - if (MouseLeaveButton !=0 && VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Value ); - } - - RunEventHandler( MouseLeaveButton ); -} - - -/** Sets the Text of the current control */ -void Button::SetText(const char* string) -{ - free(Text); - Text = NULL; - if (string == NULL) { - hasText = false; - } else if (string[0] == 0) { - hasText = false; - } else { - Text = strndup( string, 255 ); - if (Flags&IE_GUI_BUTTON_LOWERCASE) - strlwr( Text ); - else if (Flags&IE_GUI_BUTTON_CAPS) - strupr( Text ); - hasText = true; - } - Changed = true; -} - -/** Set Event Handler */ -bool Button::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_BUTTON_ON_PRESS: - ButtonOnPress = handler; - break; - case IE_GUI_MOUSE_OVER_BUTTON: - MouseOverButton = handler; - break; - case IE_GUI_MOUSE_ENTER_BUTTON: - MouseEnterButton = handler; - break; - case IE_GUI_MOUSE_LEAVE_BUTTON: - MouseLeaveButton = handler; - break; - case IE_GUI_BUTTON_ON_SHIFT_PRESS: - ButtonOnShiftPress = handler; - break; - case IE_GUI_BUTTON_ON_RIGHT_PRESS: - ButtonOnRightPress = handler; - break; - case IE_GUI_BUTTON_ON_DRAG_DROP: - ButtonOnDragDrop = handler; - break; - case IE_GUI_BUTTON_ON_DRAG_DROP_PORTRAIT: - ButtonOnDragDropPortrait = handler; - break; - case IE_GUI_BUTTON_ON_DRAG: - ButtonOnDrag = handler; - break; - case IE_GUI_BUTTON_ON_DOUBLE_PRESS: - ButtonOnDoublePress = handler; - break; - default: - return false; - } - - return true; -} - -/** Redraws a button from a given radio button group */ -void Button::RedrawButton(const char* VariableName, unsigned int Sum) -{ - if (strnicmp( VarName, VariableName, MAX_VARIABLE_LENGTH )) { - return; - } - if (State == IE_GUI_BUTTON_DISABLED) { - return; - } - if (Flags & IE_GUI_BUTTON_RADIOBUTTON) { - ToggleState = ( Sum == Value ); - } //radio button, exact value - else if (Flags & IE_GUI_BUTTON_CHECKBOX) { - ToggleState = !!( Sum & Value ); - } //checkbox, bitvalue - else { - return; - } //other buttons, nothing to redraw - if (ToggleState) { - SetState(IE_GUI_BUTTON_SELECTED); - } else { - SetState(IE_GUI_BUTTON_UNPRESSED); - } -} -/** Sets the Picture */ -void Button::SetPicture(Sprite2D* newpic) -{ - core->GetVideoDriver()->FreeSprite( Picture ); - ClearPictureList(); - Picture = newpic; - Changed = true; - Flags |= IE_GUI_BUTTON_PICTURE; - Owner->Invalidate(); -} - -/** Clears the list of Pictures */ -void Button::ClearPictureList() -{ - Video* video = core->GetVideoDriver(); - for (std::list::iterator iter = PictureList.begin(); - iter != PictureList.end(); ++iter) - video->FreeSprite( *iter ); - PictureList.clear(); - Changed = true; - Owner->Invalidate(); -} - -/** Add picture to the end of the list of Pictures */ -void Button::StackPicture(Sprite2D* Picture) -{ - PictureList.push_back(Picture); - Changed = true; - Flags |= IE_GUI_BUTTON_PICTURE; - Owner->Invalidate(); -} - -bool Button::IsPixelTransparent(unsigned short x, unsigned short y) -{ - // some buttons have hollow Image frame filled w/ Picture - // some buttons in BG2 are text only (if BAM == 'GUICTRL') - if (Picture || PictureList.size() || ! Unpressed) return false; - return Unpressed->IsPixelTransparent(x, y); -} - -// Set palette used for drawing button label in normal state -void Button::SetTextColor(const Color &fore, const Color &back) -{ - gamedata->FreePalette( normal_palette ); - normal_palette = core->CreatePalette( fore, back ); - Changed = true; -} - -void Button::SetHorizontalOverlay(double clip, const Color &src, const Color &dest) -{ - if ((Clipping>clip) || !(Flags&IE_GUI_BUTTON_HORIZONTAL) ) { - Flags |= IE_GUI_BUTTON_HORIZONTAL; - SourceRGB=src; - DestRGB=dest; - starttime = GetTickCount(); - starttime += 40; - } - Clipping = clip; - Changed = true; -} - -void Button::SetAnchor(ieWord x, ieWord y) -{ - Anchor = Point(x,y); -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Button.h b/project/jni/application/gemrb/gemrb/core/GUI/Button.h deleted file mode 100644 index 35c6cf2a1..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Button.h +++ /dev/null @@ -1,219 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Button.h - * Declares Button widget, for displaying buttons in the GUI - * @author GemRB Development Team - */ - - -#ifndef BUTTON_H -#define BUTTON_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include "Font.h" -#include "Sprite2D.h" - -#include - -class Palette; - -// NOTE: keep these synchronized with GUIDefines.py!!! -#define IE_GUI_BUTTON_UNPRESSED 0 -#define IE_GUI_BUTTON_PRESSED 1 -#define IE_GUI_BUTTON_SELECTED 2 -#define IE_GUI_BUTTON_DISABLED 3 -// Like DISABLED, but processes MouseOver events and draws UNPRESSED bitmap -#define IE_GUI_BUTTON_LOCKED 4 -// Draws the disabled bitmap, but otherwise works like unpressed -#define IE_GUI_BUTTON_THIRD 5 -#define IE_GUI_BUTTON_SECOND 6 -#define IE_GUI_BUTTON_LOCKED_PRESSED 7 //all the same as LOCKED - -#define IE_GUI_BUTTON_NO_IMAGE 0x00000001 // don't draw image (BAM) -#define IE_GUI_BUTTON_PICTURE 0x00000002 // draw picture (BMP, MOS, ...) -#define IE_GUI_BUTTON_SOUND 0x00000004 -#define IE_GUI_BUTTON_ALT_SOUND 0x00000008 -#define IE_GUI_BUTTON_CHECKBOX 0x00000010 // or radio button -#define IE_GUI_BUTTON_RADIOBUTTON 0x00000020 // sticks in a state -#define IE_GUI_BUTTON_DEFAULT 0x00000040 // enter key triggers it -#define IE_GUI_BUTTON_ANIMATED 0x00000080 - -//these bits are hardcoded in the .chu structure -#define IE_GUI_BUTTON_ALIGN_LEFT 0x00000100 -#define IE_GUI_BUTTON_ALIGN_RIGHT 0x00000200 -#define IE_GUI_BUTTON_ALIGN_TOP 0x00000400 -#define IE_GUI_BUTTON_ALIGN_BOTTOM 0x00000800 -#define IE_GUI_BUTTON_ANCHOR 0x00001000 //not implemented yet -#define IE_GUI_BUTTON_LOWERCASE 0x00002000 -#define IE_GUI_BUTTON_MULTILINE 0x00004000 // don't set the single line flag -//end of hardcoded part -#define IE_GUI_BUTTON_DRAGGABLE 0x00008000 -#define IE_GUI_BUTTON_NO_TEXT 0x00010000 // don't draw button label -#define IE_GUI_BUTTON_PLAYRANDOM 0x00020000 -#define IE_GUI_BUTTON_PLAYONCE 0x00040000 - -#define IE_GUI_BUTTON_CENTER_PICTURES 0x00080000 // center button's PictureList -#define IE_GUI_BUTTON_BG1_PAPERDOLL 0x00100000 // BG1-style paperdoll PictureList -#define IE_GUI_BUTTON_HORIZONTAL 0x00200000 // horizontal clipping of overlay -#define IE_GUI_BUTTON_CANCEL 0x00400000 // cancel key triggers it -#define IE_GUI_BUTTON_CAPS 0x00800000 // convert text to uppercase - -//composite button flags -#define IE_GUI_BUTTON_NORMAL 0x00000004 // default button, doesn't stick -#define IE_GUI_BUTTON_PORTRAIT 0x0000c002 // portrait -#define IE_GUI_BUTTON_DISABLED_P 0x0000c003 // disabled portrait - -// !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_BUTTON_ON_PRESS 0x00000000 -#define IE_GUI_MOUSE_OVER_BUTTON 0x00000001 -#define IE_GUI_MOUSE_ENTER_BUTTON 0x00000002 -#define IE_GUI_MOUSE_LEAVE_BUTTON 0x00000003 -#define IE_GUI_BUTTON_ON_SHIFT_PRESS 0x00000004 -#define IE_GUI_BUTTON_ON_RIGHT_PRESS 0x00000005 -#define IE_GUI_BUTTON_ON_DRAG_DROP 0x00000006 -#define IE_GUI_BUTTON_ON_DRAG_DROP_PORTRAIT 0x00000007 -#define IE_GUI_BUTTON_ON_DRAG 0x00000008 -#define IE_GUI_BUTTON_ON_DOUBLE_PRESS 0x00000009 - -/** Border/frame settings for a button */ -struct ButtonBorder { - int dx1; - int dy1; - int dx2; - int dy2; - Color color; - bool filled; - bool enabled; -}; - -#define MAX_NUM_BORDERS 3 - - -/** - * @class Button - * Button widget, used mainly for buttons, but also for PixMaps (static images) - * or for Toggle Buttons. - */ - -class GEM_EXPORT Button : public Control { -public: - Button(); - ~Button(); - /** Sets the 'type' Image of the Button to 'img'. - 'type' may assume the following values: - - IE_GUI_BUTTON_UNPRESSED - - IE_GUI_BUTTON_PRESSED - - IE_GUI_BUTTON_SELECTED - - IE_GUI_BUTTON_DISABLED */ - void SetImage(unsigned char type, Sprite2D* img); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Sets the Button State */ - void SetState(unsigned char state); - /** Sets the Text of the current control */ - void SetText(const char* string); - /** Sets the Picture */ - void SetPicture(Sprite2D* Picture); - /** Clears the list of Pictures */ - void ClearPictureList(); - /** Add picture to the end of the list of Pictures */ - void StackPicture(Sprite2D* Picture); - /** Sets border/frame parameters */ - void SetBorder(int index, int dx1, int dy1, int dx2, int dy2, const Color &color, bool enabled = false, bool filled = false); - /** Sets horizontal overlay, used in portrait hp overlay */ - void SetHorizontalOverlay(double clip, const Color &src, const Color &dest); - /** Sets font used for drawing button label */ - void SetFont(Font* newfont); - /** Enables or disables specified border/frame */ - void EnableBorder(int index, bool enabled); -public: // Public Events - /** Mouse Enter */ - void OnMouseEnter(unsigned short x, unsigned short y); - /** Mouse Leave */ - void OnMouseLeave(unsigned short x, unsigned short y); - /** Mouse Over */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** A special key has been pressed */ - void OnSpecialKeyPress(unsigned char Key); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** Button Pressed Event Script Function Name */ - EventHandler ButtonOnPress; - EventHandler ButtonOnShiftPress; - EventHandler ButtonOnRightPress; - EventHandler ButtonOnDoublePress; - EventHandler ButtonOnDragDrop; - EventHandler ButtonOnDragDropPortrait; - EventHandler ButtonOnDrag; - EventHandler MouseEnterButton; - EventHandler MouseLeaveButton; - EventHandler MouseOverButton; - /** Refreshes the button from a radio group */ - void RedrawButton(const char* VariableName, unsigned int Sum); - /** Set palette used for drawing button label in normal state. */ - void SetTextColor(const Color &fore, const Color &back); - /** Sets percent (0-1.0) of width for clipping picture */ - void SetPictureClipping(double clip) { Clipping = clip; } - void SetAnchor(ieWord x, ieWord y); -private: // Private attributes - char* Text; - bool hasText; - Font* font; - bool ToggleState; - Palette* normal_palette; - Palette* disabled_palette; - /** Button Unpressed Image */ - Sprite2D* Unpressed; - /** Button Pressed Image */ - Sprite2D* Pressed; - /** Button Selected Image */ - Sprite2D* Selected; - /** Button Disabled Image */ - Sprite2D* Disabled; - /** Pictures to Apply when the hasPicture flag is set */ - Sprite2D* Picture; - /** If non-empty, list of Pictures to draw when hasPicture is set */ - std::list PictureList; - /** The current state of the Button */ - unsigned char State; - double Clipping; - Point drag_start; - /** HP Bar over portraits */ - unsigned long starttime; - Color SourceRGB, DestRGB; - Point Anchor; - /** frame settings */ - ButtonBorder borders[MAX_NUM_BORDERS]; - bool IsPixelTransparent (unsigned short x, unsigned short y); - void CloseUpColor(); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Console.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Console.cpp deleted file mode 100644 index ba602847f..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Console.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Console.h" - -#include "win32def.h" - -#include "GameData.h" -#include "Interface.h" -#include "Palette.h" -#include "ScriptEngine.h" -#include "Video.h" -#include "GUI/EventMgr.h" - -Console::Console(void) -{ - Cursor = NULL; - Back = NULL; - max = 128; - Buffer = ( unsigned char * ) malloc( max ); - Buffer[0] = 0; - for(size_t i=0;iGetVideoDriver(); - - gamedata->FreePalette( palette ); - video->FreeSprite( Cursor ); -} - -/** Draws the Console on the Output Display */ -void Console::Draw(unsigned short x, unsigned short y) -{ - if (Back) { - core->GetVideoDriver()->BlitSprite( Back, 0, y, true ); - } - Color black = { - 0x00, 0x00, 0x00, 0xff - }; - Region r( x + XPos, y + YPos, Width, Height ); - core->GetVideoDriver()->DrawRect( r, black ); - font->Print( r, Buffer, palette, - IE_FONT_ALIGN_LEFT | IE_FONT_ALIGN_MIDDLE, true, NULL, - Cursor, CurPos, true ); -} -/** Set Font */ -void Console::SetFont(Font* f) -{ - if (f != NULL) { - font = f; - } -} -/** Set Cursor */ -void Console::SetCursor(Sprite2D* cur) -{ - if (cur != NULL) { - Cursor = cur; - } -} -/** Set BackGround */ -void Console::SetBackGround(Sprite2D* back) -{ - //if 'back' is NULL then no BackGround will be drawn - Back = back; -} -/** Sets the Text of the current control */ -void Console::SetText(const char* string) -{ - strncpy( ( char * ) Buffer, string, max ); -} -/** Key Press Event */ -void Console::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) -{ - if (Key >= 0x20) { - size_t len = strlen( ( char* ) Buffer ); - if (len + 1 < max) { - for (size_t i = len; i > CurPos; i--) { - Buffer[i] = Buffer[i - 1]; - } - Buffer[CurPos++] = Key; - Buffer[len + 1] = 0; - } - } -} -/** Special Key Press */ -void Console::OnSpecialKeyPress(unsigned char Key) -{ - size_t len; - - switch (Key) { - case GEM_BACKSP: - if (CurPos != 0) { - size_t len = strlen( ( const char * ) Buffer ); - for (size_t i = CurPos; i < len; i++) { - Buffer[i - 1] = Buffer[i]; - } - Buffer[len - 1] = 0; - CurPos--; - } - break; - case GEM_HOME: - CurPos = 0; - break; - case GEM_END: - CurPos = (unsigned short) strlen( (const char * ) Buffer); - break; - case GEM_UP: - HistoryBack(); - break; - case GEM_DOWN: - HistoryForward(); - break; - case GEM_LEFT: - if (CurPos > 0) - CurPos--; - break; - case GEM_RIGHT: - len = strlen( ( const char * ) Buffer ); - if (CurPos < len) { - CurPos++; - } - break; - case GEM_DELETE: - len = strlen( ( const char * ) Buffer ); - if (CurPos < len) { - for (size_t i = CurPos; i < len; i++) { - Buffer[i] = Buffer[i + 1]; - } - } - break; - case GEM_RETURN: - core->GetGUIScriptEngine()->ExecString( ( char* ) Buffer ); - HistoryAdd(false); - Buffer[0] = 0; - CurPos = 0; - HistPos = 0; - Changed = true; - break; - } -} - -//ctrl-up -void Console::HistoryBack() -{ - HistoryAdd(false); - if (HistPos < HistMax-1 && Buffer[0]) { - HistPos++; - } - memcpy(Buffer, History[HistPos], max); - CurPos = (unsigned short) strlen ((const char *) Buffer); -} - -//ctrl-down -void Console::HistoryForward() -{ - HistoryAdd(false); - if (HistPos == 0) { - Buffer[0]=0; - CurPos=0; - return; - } - HistPos--; - memcpy(Buffer, History[HistPos], max); - CurPos = (unsigned short) strlen ((const char *) Buffer); -} - -void Console::HistoryAdd(bool force) -{ - int i; - - if (!force && !Buffer[0]) - return; - for (i=0;i0; i--) { - memcpy(History[i], History[i-1], max); - } - } - memcpy(History[0], Buffer, max); - if (HistMax -#include - -Control::Control() -{ - hasFocus = false; - Changed = true; - InHandler = false; - VarName[0] = 0; - Value = 0; - Flags = 0; - Tooltip = NULL; - Owner = NULL; - XPos = 0; - YPos = 0; - - sb = NULL; - animation = NULL; - AnimPicture = NULL; - ControlType = IE_GUI_INVALID; -} - -Control::~Control() -{ - if (InHandler) { - printMessage("Control","Destroying control inside event handler, crash may occur!\n", LIGHT_RED); - } - core->DisplayTooltip( 0, 0, NULL ); - free (Tooltip); - - delete animation; - - core->GetVideoDriver()->FreeSprite(AnimPicture); -} - -/** Sets the Tooltip text of the current control */ -int Control::SetTooltip(const char* string) -{ - free(Tooltip); - - if ((string == NULL) || (string[0] == 0)) { - Tooltip = NULL; - } else { - Tooltip = strdup (string); - } - Changed = true; - return 0; -} - -/** Sets the tooltip to be displayed on the screen now */ -void Control::DisplayTooltip() -{ - if (Tooltip) - core->DisplayTooltip( Owner->XPos + XPos + Width / 2, Owner->YPos + YPos + Height / 2, this ); - else - core->DisplayTooltip( 0, 0, NULL ); -} - -void Control::ResetEventHandler(EventHandler handler) -{ - handler = NULL; -} - -void Control::SetText(const char* /*string*/) -{ -} - -int Control::RunEventHandler(EventHandler handler) -{ - if (InHandler) { - printMessage("Control","Nested event handlers are not supported!\n", YELLOW); - return -1; - } - if (handler) { - Window *wnd = Owner; - if (!wnd) { - return -1; - } - unsigned short WID = wnd->WindowID; - unsigned short ID = (unsigned short) ControlID; - InHandler = true; - handler->call(); - if (!core->IsValidWindow(WID,wnd) ) { - printMessage ("Control","Owner window destructed!\n", LIGHT_RED); - return -1; - } - if (!wnd->IsValidControl(ID,this) ) { - printMessage ("Control","Control destructed!\n", LIGHT_RED); - return -1; - } - InHandler = false; - } - return 0; -} - -/** Key Press Event */ -void Control::OnKeyPress(unsigned char /*Key*/, unsigned short /*Mod*/) -{ - //print("OnKeyPress: CtrlID = 0x%08X, Key = %c (0x%02hX)\n", (unsigned int) ControlID, Key, Key); -} - -/** Key Release Event */ -void Control::OnKeyRelease(unsigned char /*Key*/, unsigned short /*Mod*/) -{ - //print( "OnKeyRelease: CtrlID = 0x%08X, Key = %c (0x%02hX)\n", (unsigned int) ControlID, Key, Key ); -} - -/** Mouse Enter Event */ -void Control::OnMouseEnter(unsigned short /*x*/, unsigned short /*y*/) -{ -// print("OnMouseEnter: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, y); -} - -/** Mouse Leave Event */ -void Control::OnMouseLeave(unsigned short /*x*/, unsigned short /*y*/) -{ -// print("OnMouseLeave: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, y); -} - -/** Mouse Over Event */ -void Control::OnMouseOver(unsigned short /*x*/, unsigned short /*y*/) -{ - //print("OnMouseOver: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, y); -} - -/** Mouse Button Down */ -void Control::OnMouseDown(unsigned short x, unsigned short y, - unsigned short Button, unsigned short Mod) -{ - if (Button == GEM_MB_SCRLUP || Button == GEM_MB_SCRLDOWN) { - Control *ctrl = Owner->GetScrollControl(); - if (ctrl && (ctrl!=this)) { - ctrl->OnMouseDown(x,y,Button,Mod); - } - } -} - -/** Mouse Button Up */ -void Control::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned short /*Button*/, unsigned short /*Mod*/) -{ - //print("OnMouseUp: CtrlID = 0x%08X, x = %hd, y = %hd, Button = %d, Mos = %hd\n", (unsigned int) ControlID, x, y, Button, Mod); -} - -/** Special Key Press */ -void Control::OnSpecialKeyPress(unsigned char Key) -{ - if (Key == GEM_UP || Key == GEM_DOWN) { - Control *ctrl = Owner->GetScrollControl(); - if (ctrl && (ctrl!=this)) { - ctrl->OnSpecialKeyPress(Key); - } - } -} - -/** Sets the Display Flags */ -int Control::SetFlags(int arg_flags, int opcode) -{ - if ((arg_flags >>24) != ControlType) - return -2; - switch (opcode) { - case BM_SET: - Flags = arg_flags; //set - break; - case BM_AND: - Flags &= arg_flags; - break; - case BM_OR: - Flags |= arg_flags; //turn on - break; - case BM_XOR: - Flags ^= arg_flags; - break; - case BM_NAND: - Flags &= ~arg_flags;//turn off - break; - default: - return -1; - } - Changed = true; - Owner->Invalidate(); - return 0; -} - -void Control::SetAnimPicture(Sprite2D* newpic) -{ - core->GetVideoDriver()->FreeSprite(AnimPicture); - AnimPicture = newpic; - //apparently this is needed too, so the artifacts are not visible - if (Owner->Visible==WINDOW_VISIBLE) { - Changed = true; - Owner->InvalidateForControl(this); - } -} - -/** Sets the Scroll Bar Pointer. If 'ptr' is NULL no Scroll Bar will be linked - to this Control. */ -int Control::SetScrollBar(Control* ptr) -{ - if (ptr && (ptr->ControlType!=IE_GUI_SCROLLBAR)) { - ptr = NULL; - printMessage("Control","Attached control is not a ScrollBar!\n",YELLOW); - return -1; - } - sb = ptr; - Changed = true; - if (ptr) return 1; - return 0; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Control.h b/project/jni/application/gemrb/gemrb/core/GUI/Control.h deleted file mode 100644 index bfd6862d0..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Control.h +++ /dev/null @@ -1,149 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Control.h - * Declares Control, root class for all widgets except of windows - */ - -#ifndef CONTROL_H -#define CONTROL_H - -#define IE_GUI_BUTTON 0 -#define IE_GUI_PROGRESSBAR 1 //gemrb extension -#define IE_GUI_SLIDER 2 -#define IE_GUI_EDIT 3 -#define IE_GUI_TEXTAREA 5 -#define IE_GUI_LABEL 6 -#define IE_GUI_SCROLLBAR 7 -#define IE_GUI_WORLDMAP 8 // gemrb extension -#define IE_GUI_MAP 9 // gemrb extension -#define IE_GUI_GAMECONTROL 128 -#define IE_GUI_INVALID 255 - -#define IE_GUI_CONTROL_FOCUSED 0x80 - -//this is in the control ID -#define IGNORE_CONTROL 0x10000000 - -#include "RGBAColor.h" -#include "exports.h" -#include "ie_types.h" -#include "win32def.h" - -#include "Callback.h" - -class ControlAnimation; -class Sprite2D; -class Window; - -/** - * @class Control - * Basic Control Object, also called widget or GUI element. Parent class for Labels, Buttons, etc. - * Every GUI element except of a Window is a descendant of this class. - */ - -class GEM_EXPORT Control { -public: - Control(); - virtual ~Control(); - /** Draws the Control on the Output Display */ - virtual void Draw(unsigned short x, unsigned short y) = 0; - /** Sets the Text of the current control */ - virtual void SetText(const char* string); - /** Sets the Tooltip text of the current control */ - int SetTooltip(const char* string); - /** Displays the tooltip text, Worldmap handles this differently */ - virtual void DisplayTooltip(); - /** Variable length is 40-1 (zero terminator) */ - char VarName[MAX_VARIABLE_LENGTH]; - /** the value of the control to add to the variable */ - ieDword Value; - /** various flags based on the control type */ - ieDword Flags; - ControlAnimation* animation; - Sprite2D* AnimPicture; - -public: // Public attributes - /** Defines the Control ID Number used for GUI Scripting */ - ieDword ControlID; - /** X position of control relative to containing window */ - ieWord XPos; - /** Y position of control relative to containing window */ - ieWord YPos; - /** Width of control */ - ieWord Width; - /** Height of control */ - ieWord Height; - /** Type of control */ - ieByte ControlType; - /** Text to display as a tooltip when the mouse cursor hovers - * for some time over the control */ - char* Tooltip; - /** Focused Control */ - bool hasFocus; - /** If true, control is redrawn during next call to gc->DrawWindows. - * Then it's set back to false. */ - bool Changed; - /** True if we are currently in an event handler */ - bool InHandler; - /** Owner Window */ - Window* Owner; - /** Attached Scroll Bar Pointer*/ - Control* sb; -public: //Events - /** Reset/init event handler */ - void ResetEventHandler(EventHandler handler); - /** Returns the Owner */ - Window *GetOwner() const { return Owner; } - /** Set the Flags */ - int SetFlags(int arg_flags, int opcode); - /** Set handler for specified event. Override in child classes */ - virtual bool SetEvent(int eventType, EventHandler handler) = 0; - /** Run specified handler, it may return error code */ - int RunEventHandler(EventHandler handler); - /** Key Press Event */ - virtual void OnKeyPress(unsigned char Key, unsigned short Mod); - /** Key Release Event */ - virtual void OnKeyRelease(unsigned char Key, unsigned short Mod); - /** Mouse Enter Event */ - virtual void OnMouseEnter(unsigned short x, unsigned short y); - /** Mouse Leave Event */ - virtual void OnMouseLeave(unsigned short x, unsigned short y); - /** Mouse Over Event */ - virtual void OnMouseOver(unsigned short x, unsigned short y); - /** Mouse Button Down */ - virtual void OnMouseDown(unsigned short x, unsigned short y, - unsigned short Button, unsigned short Mod); - /** Mouse Button Up */ - virtual void OnMouseUp(unsigned short x, unsigned short y, - unsigned short Button, unsigned short Mod); - /** Special Key Press */ - virtual void OnSpecialKeyPress(unsigned char Key); - virtual bool IsPixelTransparent(unsigned short /*x*/, unsigned short /*y*/) { - return false; - } - /** Sets the animation picture ref */ - void SetAnimPicture(Sprite2D* Picture); - /** Sets the Scroll Bar Pointer */ - int SetScrollBar(Control* ptr); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp deleted file mode 100644 index bae164a47..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp +++ /dev/null @@ -1,440 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/EventMgr.h" - -#include "GUI/GameControl.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Video.h" -#include "GUI/Window.h" - -EventMgr::EventMgr(void) -{ - last_win_focused = NULL; - // Last window focused for mouse events (eg, with a click). Used to determine MouseUp events - last_win_mousefocused = NULL; - // Last window we were over. Used to determine MouseEnter and MouseLeave events - last_win_over = NULL; - MButtons = 0; - dc_x = 0; - dc_y = 0; - dc_time = 0; - dc_delay = 250; - rk_delay = 250; - rk_flags = GEM_RK_DISABLE; -} - -EventMgr::~EventMgr(void) -{ -} - -void EventMgr::SetOnTop(int Index) -{ - std::vector< int>::iterator t; - for (t = topwin.begin(); t != topwin.end(); ++t) { - if (( *t ) == Index) { - topwin.erase( t ); - break; - } - } - if (topwin.size() != 0) { - topwin.insert( topwin.begin(), Index ); - } else { - topwin.push_back( Index ); - } -} - -void EventMgr::SetDefaultFocus(Window *win) -{ - if (!last_win_focused) { - last_win_focused = win; - last_win_focused->SetFocused(last_win_focused->GetControl(0)); - } - last_win_over = NULL; -} - -/** Adds a Window to the Event Manager */ -void EventMgr::AddWindow(Window* win) -{ - unsigned int i; - - if (win == NULL) { - return; - } - bool found = false; - for (i = 0; i < windows.size(); i++) { - if (windows[i] == win) { - goto ok; - } - if(windows[i]==NULL) { - windows[i] = win; -ok: - SetOnTop( i ); - found = true; - break; - } - } - if (!found) { - windows.push_back( win ); - if (windows.size() == 1) - topwin.push_back( 0 ); - else - SetOnTop( ( int ) windows.size() - 1 ); - } - SetDefaultFocus(win); -} -/** Frees and Removes all the Windows in the Array */ -void EventMgr::Clear() -{ - topwin.clear(); - windows.clear(); - last_win_focused = NULL; - last_win_mousefocused = NULL; - last_win_over = NULL; -} - -/** Remove a Window from the array */ -void EventMgr::DelWindow(Window *win) -//unsigned short WindowID, const char *WindowPack) -{ - if (last_win_focused == win) { - last_win_focused = NULL; - } - if (last_win_mousefocused == win) { - last_win_mousefocused = NULL; - } - if (last_win_over == win) { - last_win_over = NULL; - } - - if (windows.size() == 0) { - return; - } - int pos = -1; - std::vector< Window*>::iterator m; - for (m = windows.begin(); m != windows.end(); ++m) { - pos++; - if ( (*m) == win) { - (*m) = NULL; - std::vector< int>::iterator t; - for (t = topwin.begin(); t != topwin.end(); ++t) { - if ( (*t) == pos) { - topwin.erase( t ); - return; - } - } - printMessage("EventManager","Couldn't find window",YELLOW); - } - } -} - -/** BroadCast Mouse Move Event */ -void EventMgr::MouseMove(unsigned short x, unsigned short y) -{ - if (windows.size() == 0) { - return; - } - if (!last_win_focused) { - return; - } - GameControl *gc = core->GetGameControl(); - if (gc) { - // for scrolling - gc->OnGlobalMouseMove(x, y); - } - std::vector< int>::iterator t; - std::vector< Window*>::iterator m; - for (t = topwin.begin(); t != topwin.end(); ++t) { - m = windows.begin(); - m += ( *t ); - Window *win = *m; - if (win == NULL) - continue; - if (!win->Visible) - continue; - if (( win->XPos <= x ) && ( win->YPos <= y )) { - //Maybe we are on the window, let's check - if (( win->XPos + win->Width >= x ) && - ( win->YPos + win->Height >= y )) { - //Yes, we are on the Window - //Let's check if we have a Control under the Mouse Pointer - Control* ctrl = win->GetControl( x, y, true ); - //look for the low priority flagged controls (mostly static labels) - if (ctrl == NULL) { - ctrl = win->GetControl( x, y, false ); - } - if (win != last_win_over || ctrl != win->GetOver()) { - // Remove tooltip if mouse moved to different control - core->DisplayTooltip( 0, 0, NULL ); - if (last_win_over) { - last_win_over->OnMouseLeave( x, y ); - } - last_win_over = win; - win->OnMouseEnter( x, y, ctrl ); - } - if (ctrl != NULL) { - win->OnMouseOver( x, y ); - } - RefreshCursor(win->Cursor); - return; - } - } - //stop going further - if (( *m )->Visible == WINDOW_FRONT) - break; - } - core->DisplayTooltip( 0, 0, NULL ); -} - -void EventMgr::RefreshCursor(int idx) -{ - Video *video = core->GetVideoDriver(); - if (idx&IE_CURSOR_GRAY) { - video->SetMouseGrayed(true); - } else { - video->SetMouseGrayed(false); - } - idx &= IE_CURSOR_MASK; - video->SetCursor( core->Cursors[idx], core->Cursors[idx ^ 1] ); -} - -bool EventMgr::ClickMatch(unsigned short x, unsigned short y, unsigned long thisTime) -{ - if (dc_x+10x+10) return false; - if (dc_y+10y+10) return false; - if (dc_time::iterator t; - std::vector< Window*>::iterator m; - Control *ctrl; - unsigned long thisTime; - - thisTime = GetTickCount(); - if (ClickMatch(x, y, thisTime)) { - Button |= GEM_MB_DOUBLECLICK; - dc_x = 0; - dc_y = 0; - dc_time = 0; - } else { - dc_x = x; - dc_y = y; - dc_time = thisTime+dc_delay; - } - MButtons |= Button; - for (t = topwin.begin(); t != topwin.end(); ++t) { - m = windows.begin(); - m += ( *t ); - if (( *m ) == NULL) - continue; - if (!( *m )->Visible) - continue; - if (( ( *m )->XPos <= x ) && ( ( *m )->YPos <= y )) { - //Maybe we are on the window, let's check - if (( ( *m )->XPos + ( *m )->Width >= x ) && - ( ( *m )->YPos + ( *m )->Height >= y )) { - //Yes, we are on the Window - //Let's check if we have a Control under the Mouse Pointer - ctrl = ( *m )->GetControl( x, y, true ); - if (!ctrl) { - ctrl = ( *m )->GetControl( x, y, false); - } - last_win_mousefocused = *m; - if (ctrl != NULL) { - last_win_mousefocused->SetMouseFocused( ctrl ); - ctrl->OnMouseDown( x - last_win_mousefocused->XPos - ctrl->XPos, y - last_win_mousefocused->YPos - ctrl->YPos, Button, Mod ); - return; - } - } - } - if (( *m )->Visible == WINDOW_FRONT) //stop looking further - break; - } - - if ((Button == GEM_MB_SCRLUP || Button == GEM_MB_SCRLDOWN) && last_win_mousefocused) { - ctrl = last_win_mousefocused->GetScrollControl(); - if (ctrl) { - ctrl->OnMouseDown( x - last_win_mousefocused->XPos - ctrl->XPos, y - last_win_mousefocused->YPos - ctrl->YPos, Button, Mod ); - } - } - - if (last_win_mousefocused) { - last_win_mousefocused->SetMouseFocused(NULL); - } -} -/** BroadCast Mouse Up Event */ -void EventMgr::MouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod) -{ - MButtons &= ~Button; - if (last_win_mousefocused == NULL) return; - Control *last_ctrl_mousefocused = last_win_mousefocused->GetMouseFocus(); - if (last_ctrl_mousefocused == NULL) return; - last_ctrl_mousefocused->OnMouseUp( x - last_win_mousefocused->XPos - last_ctrl_mousefocused->XPos, - y - last_win_mousefocused->YPos - last_ctrl_mousefocused->YPos, Button, Mod ); -} - -/** BroadCast Mouse Idle Event */ -void EventMgr::MouseIdle(unsigned long /*time*/) -{ - if (last_win_over == NULL) return; - Control *ctrl = last_win_over->GetOver(); - if (ctrl == NULL) return; - ctrl->DisplayTooltip(); -} - -/** BroadCast Key Press Event */ -void EventMgr::KeyPress(unsigned char Key, unsigned short Mod) -{ - if (last_win_focused == NULL) return; - Control *ctrl = last_win_focused->GetFocus(); - if (ctrl == NULL) return; - ctrl->OnKeyPress( Key, Mod ); -} -/** BroadCast Key Release Event */ -void EventMgr::KeyRelease(unsigned char Key, unsigned short Mod) -{ - if (last_win_focused == NULL) return; - Control *ctrl = last_win_focused->GetFocus(); - if (Key == GEM_GRAB) { - core->GetVideoDriver()->ToggleGrabInput(); - return; - } - if (ctrl == NULL) return; - ctrl->OnKeyRelease( Key, Mod ); -} - -/** Special Key Press Event */ -void EventMgr::OnSpecialKeyPress(unsigned char Key) -{ - if (!last_win_focused) { - return; - } - Control *ctrl = NULL; - - // tab shows tooltips - if (Key == GEM_TAB) { - if (last_win_over != NULL) { - Control *ctrl = last_win_over->GetOver(); - if (ctrl != NULL) { - ctrl->DisplayTooltip(); - } - } - } - //the default control will get only GEM_RETURN - else if (Key == GEM_RETURN) { - ctrl = last_win_focused->GetDefaultControl(0); - } - //the default cancel control will get only GEM_ESCAPE - else if (Key == GEM_ESCAPE) { - ctrl = last_win_focused->GetDefaultControl(1); - } - - //if there was no default button set, then the current focus will get it - if (!ctrl) { - ctrl = last_win_focused->GetFocus(); - } - //if one is under focus, use the default scroll focus - if (!ctrl) { - if (Key == GEM_UP || Key == GEM_DOWN) { - ctrl = last_win_focused->GetScrollControl(); - } - } - if (ctrl) { - switch (ctrl->ControlType) { - //scrollbars will receive only mousewheel events - case IE_GUI_SCROLLBAR: - if (Key != GEM_UP && Key != GEM_DOWN) { - return; - } - break; - //buttons will receive only GEM_RETURN - case IE_GUI_BUTTON: - if (Key != GEM_RETURN && Key!=GEM_ESCAPE) { - return; - } - break; - case IE_GUI_GAMECONTROL: - //gamecontrols will receive all special keys - break; - case IE_GUI_EDIT: - case IE_GUI_TEXTAREA: - //editboxes and textareas will receive all special keys - break; - default: - //other controls don't receive any - return; - } - ctrl->OnSpecialKeyPress( Key ); - } -} - -void EventMgr::SetFocused(Window *win, Control *ctrl) -{ - last_win_focused = win; - last_win_focused->SetFocused(ctrl); - //this is to refresh changing mouse cursors should the focus change) - int x,y; - core->GetVideoDriver()->GetMousePos(x,y); - MouseMove((unsigned short) x, (unsigned short) y); -} - -void EventMgr::SetDCDelay(unsigned long t) -{ - dc_delay = t; -} - -void EventMgr::SetRKDelay(unsigned long t) -{ - rk_delay = t; -} - -unsigned long EventMgr::GetRKDelay() -{ - if (rk_flags&GEM_RK_DISABLE) return (unsigned long) ~0; - if (rk_flags&GEM_RK_DOUBLESPEED) return rk_delay/2; - if (rk_flags&GEM_RK_QUADRUPLESPEED) return rk_delay/4; - return rk_delay; -} - -unsigned long EventMgr::SetRKFlags(unsigned long arg, unsigned int op) -{ - unsigned long tmp = rk_flags; - switch (op) { - case BM_SET: tmp = arg; break; - case BM_OR: tmp |= arg; break; - case BM_NAND: tmp &= ~arg; break; - case BM_XOR: tmp ^= arg; break; - case BM_AND: tmp &= arg; break; - default: tmp = 0; break; - } - rk_flags=tmp; - return rk_flags; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h deleted file mode 100644 index 938525c2e..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h +++ /dev/null @@ -1,141 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file EventMgr.h - * Declares EventMgr, class distributing events from input devices to GUI windows - * @author The GemRB Project - */ - - -#ifndef EVENTMGR_H -#define EVENTMGR_H - -#include "exports.h" - -#include - -class Control; -class Window; - -#define GEM_LEFT 0x81 -#define GEM_RIGHT 0x82 -#define GEM_UP 0x83 -#define GEM_DOWN 0x84 -#define GEM_DELETE 0x85 -#define GEM_RETURN 0x86 -#define GEM_BACKSP 0x87 -#define GEM_TAB 0x88 -#define GEM_ALT 0x89 -#define GEM_HOME 0x8a -#define GEM_END 0x8b -#define GEM_ESCAPE 0x8c -#define GEM_PGUP 0x8d -#define GEM_PGDOWN 0x8e -#define GEM_GRAB 0x8f - - -#define GEM_MOD_SHIFT 1 -#define GEM_MOD_CTRL 2 -#define GEM_MOD_ALT 4 - -#define GEM_MOUSEOUT 128 - -// Mouse buttons -#define GEM_MB_ACTION 1 -#define GEM_MB_MENU 4 -#define GEM_MB_SCRLUP 8 -#define GEM_MB_SCRLDOWN 16 - -#define GEM_MB_NORMAL 255 -#define GEM_MB_DOUBLECLICK 256 - -#define GEM_RK_DOUBLESPEED 1 -#define GEM_RK_DISABLE 2 -#define GEM_RK_QUADRUPLESPEED 4 - -/** - * @class EventMgr - * Class distributing events from input devices to GUI windows. - * The events are pumped into instance of this class from a Video driver plugin - */ - -class GEM_EXPORT EventMgr { -private: - std::vector< Window*> windows; - std::vector< int> topwin; - - unsigned short dc_x, dc_y; - unsigned long dc_time, dc_delay; - unsigned long rk_delay, rk_flags; -public: - EventMgr(void); - ~EventMgr(void); - /** Adds a Window to the Event Manager */ - void AddWindow(Window* win); - /** Removes a Window from the Event chain */ - //void DelWindow(unsigned short WindowID, const char *WindowPack); - void DelWindow(Window* win); - /** Frees and Removes all the Windows in the Array */ - void Clear(); - /** Call this to change the cursor (moving over windows will change it back) */ - void RefreshCursor(int idx); - /** BroadCast Mouse Move Event */ - void MouseMove(unsigned short x, unsigned short y); - /** BroadCast Mouse Move Event */ - void MouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** BroadCast Mouse Move Event */ - void MouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** BroadCast Mouse Idle Event */ - void MouseIdle(unsigned long time); - /** BroadCast Key Press Event */ - void KeyPress(unsigned char Key, unsigned short Mod); - /** BroadCast Key Release Event */ - void KeyRelease(unsigned char Key, unsigned short Mod); - /** Special Ket Press Event */ - void OnSpecialKeyPress(unsigned char Key); - /** Sets focus to the control of the window */ - void SetFocused(Window *win, Control *ctrl); - /** Sets mouse event focus to the control of the window */ - void SetMouseFocused(Window *win, Control *ctrl); - /** Sets the maximum accepted doubleclick delay */ - void SetDCDelay(unsigned long t); - void SetRKDelay(unsigned long t); - unsigned long GetRKDelay(); - unsigned long SetRKFlags(unsigned long arg, unsigned int op); - - /** Mask of which Mouse Buttons are pressed */ - unsigned char MButtons; -private: - /** Last Window focused */ - Window* last_win_focused; - /** Last Window mouse event focused */ - Window* last_win_mousefocused; - /** Last Window under Mouse Pointer*/ - Window* last_win_over; - /** Sets a Window on the Top of the Window Queue */ - void SetDefaultFocus(Window *win); - void SetOnTop(int Index); - bool ClickMatch(unsigned short x, unsigned short y, unsigned long thisTime); -}; - -#endif // ! EVENTMGR_H diff --git a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp deleted file mode 100644 index dafdd4b31..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp +++ /dev/null @@ -1,2841 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "GUI/GameControl.h" - -#include "strrefs.h" -#include "win32def.h" - -#include "DialogHandler.h" -#include "DisplayMessage.h" -#include "Effect.h" -#include "Font.h" -#include "Game.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "ImageMgr.h" -#include "Interface.h" -#include "Item.h" -#include "KeyMap.h" -#include "PathFinder.h" -#include "SaveGameIterator.h" -#include "ScriptEngine.h" -#include "TableMgr.h" -#include "TextArea.h" -#include "TileMap.h" -#include "Video.h" -#include "damages.h" -#include "GameScript/GSUtils.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" -#include "Scriptable/Container.h" -#include "Scriptable/Door.h" -#include "Scriptable/InfoPoint.h" - -#include - -#define DEBUG_SHOW_INFOPOINTS 0x01 -#define DEBUG_SHOW_CONTAINERS 0x02 -#define DEBUG_SHOW_DOORS DEBUG_SHOW_CONTAINERS -#define DEBUG_SHOW_LIGHTMAP 0x08 - -#define SCROLL_BORDER 5 - -static const Color cyan = { - 0x00, 0xff, 0xff, 0xff -}; -static const Color red = { - 0xff, 0x00, 0x00, 0xff -}; -static const Color magenta = { - 0xff, 0x00, 0xff, 0xff -}; -static const Color green = { - 0x00, 0xff, 0x00, 0xff -}; -/* -static Color white = { - 0xff, 0xff, 0xff, 0xff -}; -*/ -static const Color black = { - 0x00, 0x00, 0x00, 0xff -}; -static const Color blue = { - 0x00, 0x00, 0xff, 0x80 -}; -static const Color gray = { - 0x80, 0x80, 0x80, 0xff -}; - -//Animation* effect; - -#define FORMATIONSIZE 10 -typedef Point formation_type[FORMATIONSIZE]; -ieDword formationcount; -static formation_type *formations=NULL; -static bool mqs = false; -static ieResRef TestSpell="SPWI207"; - -//If one of the actors has tracking on, the gamecontrol needs to display -//arrow markers on the edges to point at detected monsters -//tracterID is the tracker actor's global ID -//distance is the detection distance -void GameControl::SetTracker(Actor *actor, ieDword dist) -{ - trackerID = actor->GetGlobalID(); - distance = dist; -} - -//Multiple Quick saves is an experimental GemRB feature. -//multiple quick saves are kept, their age is determined by the slot -//number. There is an algorithm which keeps about log2(n) slots alive. -//The algorithm is implemented in SaveGameIterator -void GameControl::MultipleQuickSaves(int arg) -{ - mqs=arg==1; -} - -GameControl::GameControl(void) -{ - if (!formations) { - ReadFormations(); - } - //this is the default action, individual actors should have one too - //at this moment we use only this - //maybe we don't even need it - Changed = true; - spellCount = 0; - user = NULL; - lastActorID = 0; - trackerID = 0; - distance = 0; - MouseIsDown = false; - DrawSelectionRect = false; - overDoor = NULL; - overContainer = NULL; - overInfoPoint = NULL; - drawPath = NULL; - pfs.null(); - lastCursor = IE_CURSOR_NORMAL; - moveX = moveY = 0; - scrolling = false; - touchScrollAreasEnabled = false; - numScrollCursor = 0; - DebugFlags = 0; - AIUpdateCounter = 1; - EnableRunning = true; //make this a game flag if you wish - ieDword tmp=0; - - ResetTargetMode(); - - core->GetDictionary()->Lookup("Center",tmp); - if (tmp) { - ScreenFlags=SF_ALWAYSCENTER|SF_CENTERONACTOR; - } else { - ScreenFlags = SF_CENTERONACTOR; - } - core->GetDictionary()->Lookup("TouchScrollAreas",tmp); - if (tmp) { - touchScrollAreasEnabled = true; - touched = false; - scrollAreasWidth = 32; - } - LeftCount = 0; - BottomCount = 0; - RightCount = 0; - TopCount = 0; - DialogueFlags = 0; - dialoghandler = new DialogHandler(); - DisplayText = NULL; -} - -//TODO: -//There could be a custom formation which is saved in the save game -//alternatively, all formations could be saved in some compatible way -//so it doesn't cause problems with the original engine -void GameControl::ReadFormations() -{ - unsigned int i,j; - AutoTable tab("formatio"); - if (!tab) { - // fallback - formationcount = 1; - formations = (formation_type *) calloc(1,sizeof(formation_type) ); - return; - } - formationcount = tab->GetRowCount(); - formations = (formation_type *) calloc(formationcount, sizeof(formation_type)); - for(i=0; iQueryField(i,j*2)); - formations[i][j].x=k; - k=(short) atoi(tab->QueryField(i,j*2+1)); - formations[i][j].y=k; - } - } -} - -//returns a single point offset for a formation -//formation: the formation type -//pos: the actor's slot ID -Point GameControl::GetFormationOffset(ieDword formation, ieDword pos) -{ - if (formation>=formationcount) formation = 0; - if (pos>=FORMATIONSIZE) pos=FORMATIONSIZE-1; - return formations[formation][pos]; -} - -//Moves an actor to a new position, keeping the current formation -//WARNING: don't pass p as a reference because it gets modified -void GameControl::MoveToPointFormation(Actor *actor, unsigned int pos, Point src, Point p) -{ - Map* map = actor->GetCurrentArea() ; - - int formation=core->GetGame()->GetFormation(); - if (pos>=FORMATIONSIZE) pos=FORMATIONSIZE-1; - - // calculate angle - double angle; - double xdiff = src.x - p.x; - double ydiff = src.y - p.y; - if (ydiff == 0) { - if (xdiff > 0) { - angle = M_PI_2; - } else { - angle = -M_PI_2; - } - } else { - angle = atan(xdiff/ydiff); - if (ydiff < 0) angle += M_PI; - } - - // calculate new coordinates by rotating formation around (0,0) - double newx = -formations[formation][pos].x * cos(angle) + formations[formation][pos].y * sin(angle); - double newy = formations[formation][pos].x * sin(angle) + formations[formation][pos].y * cos(angle); - p.x += (int)newx; - p.y += (int)newy; - - if (p.x < 0) p.x = 8; - if (p.y < 0) p.y = 8; - if (p.x > map->GetWidth()*16) p.x = map->GetWidth()*16 - 8; - if (p.y > map->GetHeight()*12) p.y = map->GetHeight()*12 - 8; - - if(map->GetCursor(p) == IE_CURSOR_BLOCKED) { - //we can't get there --> adjust position - p.x/=16; - p.y/=12; - map->AdjustPosition(p); - p.x*=16; - p.y*=12; - } - CreateMovement(actor, p); -} - -void GameControl::Center(unsigned short x, unsigned short y) -{ - Video *video = core->GetVideoDriver(); - Region Viewport = video->GetViewport(); - Viewport.x += x - Viewport.w / 2; - Viewport.y += y - Viewport.h / 2; - core->timer->SetMoveViewPort( Viewport.x, Viewport.y, 0, false ); - video->MoveViewportTo( Viewport.x, Viewport.y ); -} - -// generate an action to do the actual movement -// only PST supports RunToPoint -void GameControl::CreateMovement(Actor *actor, const Point &p) -{ - char Tmp[256]; - - Action *action = NULL; - if (DoubleClick && EnableRunning) { - sprintf( Tmp, "RunToPoint([%d.%d])", p.x, p.y ); - action = GenerateAction( Tmp ); - //if it didn't work don't insist - if (!action) - EnableRunning = false; - } - if (!action) { - sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); - action = GenerateAction( Tmp ); - } - - actor->AddAction( action ); - // force action so that we get target recticles immediately - // FIXME - actor->ProcessActions(); -} - -GameControl::~GameControl(void) -{ - //releasing the viewport of GameControl - core->GetVideoDriver()->SetViewport( 0,0,0,0 ); - if (formations) { - free( formations ); - formations = NULL; - } - delete dialoghandler; - if (DisplayText) { - core->FreeString(DisplayText); - } -} - -//Autosave was triggered by the GUI -void GameControl::AutoSave() -{ - core->GetSaveGameIterator()->CreateSaveGame(0, false); -} - -//QuickSave was triggered by the GUI -//mqs is the 'multiple quick saves' flag -void GameControl::QuickSave() -{ - core->GetSaveGameIterator()->CreateSaveGame(1, mqs == 1); -} - -// ArrowSprite cycles -// 321 -// 4 0 -// 567 - -#define D_LEFT 1 -#define D_UP 2 -#define D_RIGHT 4 -#define D_BOTTOM 8 -// Direction Bits -// 326 -// 1 4 -// 98c - -static const int arrow_orientations[16]={ -// 0 1 2 3 4 5 6 7 8 9 a b c d e f - -1, 4, 2, 3, 0,-1, 1,-1, 6, 5,-1,-1, 7,-1,-1,-1 -}; - -//Draws arrow markers along the edge of the game window -//WARNING:don't use reference for point, because it is altered -void GameControl::DrawArrowMarker(const Region &screen, Point p, const Region &viewport) -{ - Video* video = core->GetVideoDriver(); - - //p.x-=viewport.x; - //p.y-=viewport.y; - ieDword draw = 0; - if (p.xGetScrollCursorSprite(0,0); - - tmp = spr->Width; - //tmp = core->ArrowSprites[0]->Width; - - if (p.x>viewport.x+viewport.w-tmp) { - p.x=viewport.x+viewport.w;//-tmp; - draw |= D_RIGHT; - } - - tmp = spr->Height; - //tmp = core->ArrowSprites[0]->Height; - - if (p.y>viewport.y+viewport.h-tmp) { - p.y=viewport.y+viewport.h;//-tmp; - draw |= D_BOTTOM; - } - if (arrow_orientations[draw]>=0) { - video->BlitGameSprite( core->GetScrollCursorSprite(arrow_orientations[draw], 0), p.x+screen.x, p.y+screen.y, 0, black, NULL); - } -} - -/** Draws the Control on the Output Display */ -void GameControl::Draw(unsigned short x, unsigned short y) -{ - bool update_scripts = !(DialogueFlags & DF_FREEZE_SCRIPTS); - - Game* game = core->GetGame(); - if (!game) - return; - - if (((short) Width) <=0 || ((short) Height) <= 0) { - return; - } - - if (Owner->Visible!=WINDOW_VISIBLE) { - return; - } - - Region screen( x + XPos, y + YPos, Width, Height ); - Map *area = core->GetGame()->GetCurrentArea(); - Video* video = core->GetVideoDriver(); - if (!area) { - video->DrawRect( screen, blue, true ); - return; - } - - Region viewport = video->GetViewport(); - if (moveX || moveY) { - viewport.x += moveX; - viewport.y += moveY; - Point mapsize = area->TMap->GetMapSize(); - if ( viewport.x < 0 )//if we are at top of the map - viewport.x = 0; - else if ( (viewport.x + viewport.w) >= mapsize.x) //if we are at the bottom - viewport.x = mapsize.x - viewport.w; - - if ( viewport.y < 0 ) //if we are at the left of the map - viewport.y = 0; - else if ( (viewport.y + viewport.h ) >= mapsize.y ) //if we are at the right - viewport.y = mapsize.y - viewport.h; - - // override any existing viewport moves which may be in progress - core->timer->SetMoveViewPort( viewport.x, viewport.y, 0, false ); - // move it directly ourselves, since we might be paused - video->MoveViewportTo( viewport.x, viewport.y ); - } - video->DrawRect( screen, black, true ); - - // setup outlines - InfoPoint *i; - unsigned int idx; - for (idx = 0; (i = area->TMap->GetInfoPoint( idx )); idx++) { - i->Highlight = false; - if (overInfoPoint == i && target_mode) { - if (i->VisibleTrap(0)) { - i->outlineColor = green; - i->Highlight = true; - continue; - } - } - if (i->VisibleTrap(DebugFlags & DEBUG_SHOW_INFOPOINTS)) { - i->outlineColor = red; // traps - } else if (DebugFlags & DEBUG_SHOW_INFOPOINTS) { - i->outlineColor = blue; // debug infopoints - } else { - continue; - } - i->Highlight = true; - } - - Door *d; - for (idx = 0; (d = area->TMap->GetDoor( idx )); idx++) { - d->Highlight = false; - if (overDoor == d) { - if (target_mode) { - if (d->Visible() && (d->VisibleTrap(0) || (d->Flags & DOOR_LOCKED))) { - // only highlight targettable doors - d->outlineColor = green; - d->Highlight = true; - continue; - } - } else if (!(d->Flags & DOOR_SECRET)) { - // mouse over, not in target mode, no secret door - d->outlineColor = cyan; - d->Highlight = true; - continue; - } - } - if (d->VisibleTrap(0)) { - d->outlineColor = red; // traps - } else if (d->Flags & DOOR_SECRET) { - if (DebugFlags & DEBUG_SHOW_DOORS || d->Flags & DOOR_FOUND) { - d->outlineColor = magenta; // found hidden door - } else { - // secret door is invisible - continue; - } - } else if (DebugFlags & DEBUG_SHOW_DOORS) { - d->outlineColor = cyan; // debug doors - } else { - continue; - } - d->Highlight = true; - } - - Container *c; - for (idx = 0; (c = area->TMap->GetContainer( idx )); idx++) { - c->Highlight = false; - if (overContainer == c && target_mode) { - if (c->VisibleTrap(0) || (c->Flags & CONT_LOCKED)) { - // only highlight targettable containers - c->outlineColor = green; - c->Highlight = true; - continue; - } - } else if (overContainer == c) { - // mouse over, not in target mode - c->outlineColor = cyan; - c->Highlight = true; - continue; - } - if (c->VisibleTrap(0)) { - c->outlineColor = red; // traps - } else if (DebugFlags & DEBUG_SHOW_CONTAINERS) { - c->outlineColor = cyan; // debug containers - } else { - continue; - } - c->Highlight = true; - } - - //drawmap should be here so it updates fog of war - area->DrawMap( screen ); - game->DrawWeather(screen, update_scripts); - - if (trackerID) { - Actor *actor = area->GetActorByGlobalID(trackerID); - - if (actor) { - Actor **monsters = area->GetAllActorsInRadius(actor->Pos, GA_NO_DEAD|GA_NO_LOS, distance); - - int i = 0; - while(monsters[i]) { - Actor *target = monsters[i++]; - if (target->InParty) continue; - if (target->GetStat(IE_NOTRACKING)) continue; - DrawArrowMarker(screen, target->Pos, viewport); - } - delete monsters; - } else { - trackerID = 0; - } - } - - if (ScreenFlags & SF_DISABLEMOUSE) - return; - Point p(lastMouseX, lastMouseY); - video->ConvertToGame( p.x, p.y ); - - // Draw selection rect - if (DrawSelectionRect) { - CalculateSelection( p ); - video->DrawRect( SelectionRect, green, false, true ); - } - - // Show wallpolygons - if (DebugFlags & DEBUG_SHOW_INFOPOINTS) { - - unsigned int count = area->GetWallCount(); - for (unsigned int i = 0; i < count; ++i) { - Wall_Polygon* poly = area->GetWallGroup(i); - if (!poly) continue; - // yellow - Color c; - c.r = 0x7F; - c.g = 0x7F; - c.b = 0; - c.a = 0; - //if polygon is disabled, make it grey - if (poly->wall_flag&WF_DISABLED) { - c.b = 0x7F; - } - - video->DrawPolyline( poly, c, true ); - } - } - - // Draw path - if (drawPath) { - PathNode* node = drawPath; - while (true) { - Point p( ( node-> x*16) + 8, ( node->y*12 ) + 6 ); - if (!node->Parent) { - video->DrawCircle( p.x, p.y, 2, red ); - } else { - short oldX = ( node->Parent-> x*16) + 8, oldY = ( node->Parent->y*12 ) + 6; - video->DrawLine( oldX, oldY, p.x, p.y, green ); - } - if (!node->Next) { - video->DrawCircle( p.x, p.y, 2, green ); - break; - } - node = node->Next; - } - } - - // Draw lightmap - if (DebugFlags & DEBUG_SHOW_LIGHTMAP) { - Sprite2D* spr = area->LightMap->GetSprite2D(); - video->BlitSprite( spr, 0, 0, true ); - video->FreeSprite( spr ); - Region point( p.x / 16, p.y / 12, 2, 2 ); - video->DrawRect( point, red ); - } - - if (core->HasFeature(GF_ONSCREEN_TEXT) && DisplayText) { - core->GetFont(1)->Print(screen, (unsigned char *)DisplayText, core->InfoTextPalette, IE_FONT_ALIGN_CENTER | IE_FONT_ALIGN_MIDDLE, true); - if (update_scripts) { - // just replicating original engine behaviour - if (DisplayTextTime == 0) { - SetDisplayText((char *)NULL, 0); - } else { - DisplayTextTime--; - } - } - } - - if (touchScrollAreasEnabled) { - if (moveY < 0 && scrolling) - video->DrawLine(screen.x+4, screen.y+scrollAreasWidth, screen.w+screen.x-4, screen.y+scrollAreasWidth, red); - else - video->DrawLine(screen.x+4, screen.y+scrollAreasWidth, screen.w+screen.x-4, screen.y+scrollAreasWidth, gray); - if (moveY > 0 && scrolling) - video->DrawLine(screen.x+4, screen.h-scrollAreasWidth, screen.w+screen.x-4, screen.h-scrollAreasWidth, red); - else - video->DrawLine(screen.x+4, screen.h-scrollAreasWidth, screen.w+screen.x-4, screen.h-scrollAreasWidth, gray); - if (moveX < 0 && scrolling) - video->DrawLine(screen.x+scrollAreasWidth, screen.y+4, screen.x+scrollAreasWidth, screen.h+screen.y-4, red); - else - video->DrawLine(screen.x+scrollAreasWidth, screen.y+4, screen.x+scrollAreasWidth, screen.h+screen.y-4, gray); - if (moveX > 0 && scrolling) - video->DrawLine(screen.w+screen.x-scrollAreasWidth, screen.y+4, screen.w+screen.x-scrollAreasWidth, screen.h-4, red); - else - video->DrawLine(screen.w+screen.x-scrollAreasWidth, screen.y+4, screen.w+screen.x-scrollAreasWidth, screen.h-4, gray); - } -} - -/** Key Press Event */ -void GameControl::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) -{ - if (DialogueFlags&DF_IN_DIALOG) { - return; - } - unsigned int i, pc; - Game* game = core->GetGame(); - if (!game) return; - - switch (Key) { - case '0': - game->SelectActor( NULL, false, SELECT_NORMAL ); - i = game->GetPartySize(false)/2+1; - while(i--) { - SelectActor(i, true); - } - break; - case '-': - game->SelectActor( NULL, true, SELECT_NORMAL ); - i = game->GetPartySize(false)/2+1; - while(i--) { - SelectActor(i, false); - } - break; - case '=': - SelectActor(-1); - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - SelectActor(Key-'0'); - break; - case '7': // 1 & 2 - case '8': // 3 & 4 - case '9': // 5 & 6 - game->SelectActor( NULL, false, SELECT_NORMAL ); - i = game->GetPartySize(false); - pc = 2*(Key - '6')-1; - if (pc >= i) { - SelectActor(i, true); - break; - } - SelectActor(pc, true); - SelectActor(pc+1, true); - break; -#ifdef ANDROID - case 'c': // show containers in ANDROID, GEM_ALT is not possible to use - DebugFlags |= DEBUG_SHOW_CONTAINERS; - return; -#endif - default: - core->GetGame()->SetHotKey(toupper(Key)); - break; - } -} - -//Select (or deselect) a new actor (or actors) -void GameControl::SelectActor(int whom, int type) -{ - Game* game = core->GetGame(); - if (whom==-1) { - game->SelectActor( NULL, true, SELECT_NORMAL ); - return; - } - - /* doesn't fall through here */ - Actor* actor = game->FindPC( whom ); - if (!actor) - return; - - if (type==0) { - game->SelectActor( actor, false, SELECT_NORMAL ); - return; - } - if (type==1) { - game->SelectActor( actor, true, SELECT_NORMAL ); - return; - } - - bool was_selected = actor->IsSelected(); - if (game->SelectActor( actor, true, SELECT_REPLACE )) - if (was_selected || (ScreenFlags & SF_ALWAYSCENTER)) { - ScreenFlags |= SF_CENTERONACTOR; - } -} - -//Effect for the ctrl-r cheatkey (resurrect) -static EffectRef heal_ref = { "CurrentHPModifier", -1 }; -static EffectRef damage_ref = { "Damage", -1 }; - -/** Key Release Event */ -void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) -{ - unsigned int i; - Game* game = core->GetGame(); - - if (!game) - return; - - if (DialogueFlags&DF_IN_DIALOG) { - if (Mod) return; - switch(Key) { - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - TextArea *ta = core->GetMessageTextArea(); - if (ta) { - ta->OnKeyPress(Key,Mod); - } - } - break; - } - return; - } - //cheatkeys with ctrl- - if (Mod & GEM_MOD_CTRL) { - if (!core->CheatEnabled()) { - return; - } - Map* area = game->GetCurrentArea( ); - if (!area) - return; - Actor *lastActor = area->GetActorByGlobalID(lastActorID); - Point p(lastMouseX, lastMouseY); - core->GetVideoDriver()->ConvertToGame( p.x, p.y ); - switch (Key) { - case 'f': //toggle full screen mode - core->GetVideoDriver()->ToggleFullscreenMode(); - break; - case 'd': //disarm a trap - if (overInfoPoint) { - overInfoPoint->DetectTrap(256); - } - if (overContainer) { - if (overContainer->Trapped && - !( overContainer->TrapDetected )) { - overContainer->TrapDetected = 1; - } - } - if (overDoor) { - if (overDoor->Trapped && - !( overDoor->TrapDetected )) { - overDoor->TrapDetected = 1; - } - } - break; - case 'l': //play an animation (vvc/bam) over an actor - //the original engine was able to swap through all animations - if (lastActor) { - lastActor->AddAnimation("S056ICBL", 0, 0, 0); - } - break; - - case 'c': //force cast a hardcoded spell - //caster is the last selected actor - //target is the door/actor currently under the pointer - if (game->selected.size() > 0) { - Actor *src = game->selected[0]; - Scriptable *target = lastActor; - if (overDoor) { - target = overDoor; - } - if (target) { - src->CastSpell( TestSpell, target, false ); - if (src->LastTarget) { - src->CastSpellEnd(0); - } else { - src->CastSpellPointEnd(0); - } - } - } - break; - - case 'b': //draw a path to the target (pathfinder debug) - //You need to select an origin with ctrl-o first - if (drawPath) { - PathNode* nextNode = drawPath->Next; - PathNode* thisNode = drawPath; - while (true) { - delete( thisNode ); - thisNode = nextNode; - if (!thisNode) - break; - nextNode = thisNode->Next; - } - } - drawPath = core->GetGame()->GetCurrentArea()->FindPath( pfs, p, lastActor?lastActor->size:1 ); - - break; - - case 'o': //set up the origin for the pathfinder - // origin - pfs.x = lastMouseX; - pfs.y = lastMouseY; - core->GetVideoDriver()->ConvertToGame( pfs.x, pfs.y ); - break; - case 'a': //switches through the avatar animations - if (lastActor) { - lastActor->GetNextAnimation(); - } - break; - case 's': //switches through the stance animations - if (lastActor) { - lastActor->GetNextStance(); - } - break; - case 'j': //teleports the selected actors - for (i = 0; i < game->selected.size(); i++) { - Actor* actor = game->selected[i]; - MoveBetweenAreasCore(actor, core->GetGame()->CurrentArea, p, -1, true); - } - break; - - case 'm': //prints a debug dump (ctrl-m in the original game too) - if (!lastActor) { - lastActor = area->GetActor( p, GA_DEFAULT); - } - if (!lastActor) { - // ValidTarget never returns immobile targets, making debugging a nightmare - // so if we don't have an actor, we make really really sure by checking manually - unsigned int count = area->GetActorCount(true); - while (count--) { - Actor *actor = area->GetActor(count, true); - if (actor->IsOver(p)) { - actor->DebugDump(); - } - } - } - if (lastActor) { - lastActor->DebugDump(); - break; - } - if (overDoor) { - overDoor->DebugDump(); - break; - } - if (overContainer) { - overContainer->DebugDump(); - break; - } - if (overInfoPoint) { - overInfoPoint->DebugDump(); - break; - } - core->GetGame()->GetCurrentArea()->DebugDump(Mod & GEM_MOD_SHIFT); - break; - case 'v': //marks some of the map visited (random vision distance) - area->ExploreMapChunk( p, rand()%30, 1 ); - break; - case 'w': // consolidates found ground piles under the pointed pc - area->MoveVisibleGroundPiles(p); - break; - case 'x': // shows coordinates on the map - print( "%s [%d.%d]\n", area->GetScriptName(), p.x, p.y ); - break; - case 'g'://shows loaded areas and other game information - game->DebugDump(); - break; - case 'i'://interact trigger (from the original game) - if (!lastActor) { - lastActor = area->GetActor( p, GA_DEFAULT); - } - if (lastActor && !(lastActor->GetStat(IE_MC_FLAGS)&MC_EXPORTABLE)) { - Actor *target; - int i = game->GetPartySize(true); - if(i<2) break; - i=rand()%i; - do - { - target = game->GetPC(i, true); - if(target==lastActor) continue; - if(target->GetStat(IE_MC_FLAGS)&MC_EXPORTABLE) continue; - - char Tmp[40]; - snprintf(Tmp,sizeof(Tmp),"Interact(\"%s\")",target->GetScriptName() ); - lastActor->AddAction(GenerateAction(Tmp)); - break; - } - while(i--); - } - break; - case 'r'://resurrects actor - if (!lastActor) { - lastActor = area->GetActor( p, GA_DEFAULT); - } - if (lastActor) { - Effect *fx = EffectQueue::CreateEffect(heal_ref, lastActor->GetStat(IE_MAXHITPOINTS), 0x30001, FX_DURATION_INSTANT_PERMANENT); - if (fx) { - core->ApplyEffect(fx, lastActor, lastActor); - } - } - break; - case 't'://advances time - // 7200 (one day) /24 (hours) == 300 - game->AdvanceTime(300*AI_UPDATE_TIME); - //refresh gui here once we got it - break; - - case 'q': //joins actor to the party - if (lastActor && !lastActor->InParty) { - lastActor->ClearActions(); - lastActor->ClearPath(); - char Tmp[40]; - strncpy(Tmp,"JoinParty()",sizeof(Tmp) ); - lastActor->AddAction( GenerateAction(Tmp) ); - } - break; - case 'p': //center on actor - ScreenFlags|=SF_CENTERONACTOR; - ScreenFlags^=SF_ALWAYSCENTER; - break; - case 'k': //kicks out actor - if (lastActor && lastActor->InParty) { - lastActor->ClearActions(); - lastActor->ClearPath(); - char Tmp[40]; - strncpy(Tmp,"LeaveParty()",sizeof(Tmp) ); - lastActor->AddAction( GenerateAction(Tmp) ); - } - break; - case 'y': //kills actor or all enemies - if (Mod & GEM_MOD_SHIFT) { - // mwahaha! - Effect *newfx; - newfx = EffectQueue::CreateEffect(damage_ref, 300, DAMAGE_MAGIC<<16, FX_DURATION_INSTANT_PERMANENT); - Actor *victim; - for (int i = area->GetActorCount(0)-1; i >= 0; i--) { - victim = area->GetActor(i, 0); - if (victim->Modified[IE_EA] == EA_ENEMY) { - core->ApplyEffect(newfx, victim, victim); - } - } - delete newfx; - } else { - if (lastActor) { - //using action so the actor is killed - //correctly (synchronisation) - lastActor->ClearActions(); - lastActor->ClearPath(); - - Effect *newfx; - newfx = EffectQueue::CreateEffect(damage_ref, 300, DAMAGE_MAGIC<<16, FX_DURATION_INSTANT_PERMANENT); - core->ApplyEffect(newfx, lastActor, lastActor); - if (! (lastActor->GetInternalFlag() & IF_REALLYDIED)) { - newfx = EffectQueue::CreateEffect(damage_ref, 300, DAMAGE_ACID<<16, FX_DURATION_INSTANT_PERMANENT); - core->ApplyEffect(newfx, lastActor, lastActor); - newfx = EffectQueue::CreateEffect(damage_ref, 300, DAMAGE_CRUSHING<<16, FX_DURATION_INSTANT_PERMANENT); - core->ApplyEffect(newfx, lastActor, lastActor); - } - delete newfx; - } else if (overContainer) { - overContainer->SetContainerLocked(0); - } else if (overDoor) { - overDoor->SetDoorLocked(0,0); - } - } - break; - case 'z': //shift through the avatar animations backward - if (lastActor) { - lastActor->GetPrevAnimation(); - } - break; - case '1': //change paperdoll armour level - if (! lastActor) - break; - lastActor->NewStat(IE_ARMOR_TYPE,1,MOD_ADDITIVE); - break; - case '4': //show all traps and infopoints - DebugFlags ^= DEBUG_SHOW_INFOPOINTS; - print("Show traps and infopoints %s\n", DebugFlags & DEBUG_SHOW_INFOPOINTS ? "ON" : "OFF"); - break; - case '6': //show the lightmap - DebugFlags ^= DEBUG_SHOW_LIGHTMAP; - print("Show lightmap %s\n", DebugFlags & DEBUG_SHOW_LIGHTMAP ? "ON" : "OFF"); - break; - case '7': //toggles fog of war - core->FogOfWar ^= FOG_DRAWFOG; - print("Show Fog-Of-War: %s\n", core->FogOfWar & FOG_DRAWFOG ? "ON" : "OFF"); - break; - case '8': //show searchmap over area - core->FogOfWar ^= FOG_DRAWSEARCHMAP; - print("Show searchmap %s\n", core->FogOfWar & FOG_DRAWSEARCHMAP ? "ON" : "OFF"); - break; - default: - print( "KeyRelease:%d - %d\n", Key, Mod ); - break; - } - return; //return from cheatkeys - } - switch (Key) { - case 'h': //hard pause - if (DialogueFlags & DF_FREEZE_SCRIPTS) break; - //fallthrough - case ' ': //soft pause - DialogueFlags ^= DF_FREEZE_SCRIPTS; - if (DialogueFlags&DF_FREEZE_SCRIPTS) { - displaymsg->DisplayConstantString(STR_PAUSED,0xff0000); - SetDisplayText(STR_PAUSED, 0); // time 0 = removed instantly on unpause - } else { - displaymsg->DisplayConstantString(STR_UNPAUSED,0xff0000); - } - break; -/* - case 'm': - core->GetGUIScriptEngine()->RunFunction("GUIMA","OpenMapWindow"); - break; - case 'j': - core->GetGUIScriptEngine()->RunFunction("GUIJRNL","OpenJournalWindow"); - break; - case 'i': - core->GetGUIScriptEngine()->RunFunction("GUIINV","OpenInventoryWindow"); - break; - case 'r': - core->GetGUIScriptEngine()->RunFunction("GUIREC","OpenRecordsWindow"); - break; - case 'p': - core->GetGUIScriptEngine()->RunFunction("GUIPR","OpenPriestWindow"); - break; - case 'w': - core->GetGUIScriptEngine()->RunFunction("GUIMG","OpenMageWindow"); - break; -*/ - case 'q': //quicksave - QuickSave(); - break; - case GEM_ALT: //alt key (shows containers) -#ifdef ANDROID - case 'c': // show containers in ANDROID, GEM_ALT is not possible to use -#endif - DebugFlags &= ~DEBUG_SHOW_CONTAINERS; - break; - default: - core->GetKeyMap()->ResolveKey(Key,0); - break; - } -} - -void GameControl::DisplayTooltip() { - Game* game = core->GetGame(); - if (game) { - Map* area = game->GetCurrentArea( ); - if (area) { - Actor *actor = area->GetActorByGlobalID(lastActorID); - if (actor && (actor->GetStat(IE_STATE_ID)&STATE_DEAD || actor->GetInternalFlag()&IF_REALLYDIED)) { - // no tooltips for dead actors! - actor->SetOver( false ); - lastActorID = 0; - actor = NULL; - } - - if (actor) { - char *name = actor->GetName(-1); - int hp = actor->GetStat(IE_HITPOINTS); - int maxhp = actor->GetStat(IE_MAXHITPOINTS); - - char buffer[100]; - if (!core->TooltipBack) { - // single-line tooltips without background (PS:T) - if (actor->InParty) { - snprintf(buffer, 100, "%s: %d/%d", name, hp, maxhp); - } else { - snprintf(buffer, 100, "%s", name); - } - } else { - // a guess at a neutral check - bool neutral = actor->GetStat(IE_EA) == EA_NEUTRAL; - // test for an injured string being present for this game - int strindex = displaymsg->GetStringReference(STR_UNINJURED); - // normal tooltips - if (actor->InParty) { - // in party: display hp - snprintf(buffer, 100, "%s\n%d/%d", name, hp, maxhp); - } else if (neutral) { - // neutral: display name only - snprintf(buffer, 100, "%s", name); - } else if (strindex == -1) { - // non-neutral, not in party, no injured strings: display hp - snprintf(buffer, 100, "%s\n%d/%d", name, hp, maxhp); - } else { - // non-neutral, not in party: display injured string - int strindex; - char *injuredstring = NULL; - // these boundaries are just a guess - if (hp == maxhp) { - strindex = STR_UNINJURED; - } else if (hp > (maxhp*3)/4) { - strindex = STR_INJURED1; - } else if (hp > maxhp/2) { - strindex = STR_INJURED2; - } else if (hp > maxhp/3) { - strindex = STR_INJURED3; - } else { - strindex = STR_INJURED4; - } - strindex = displaymsg->GetStringReference(strindex); - if (strindex != -1) { - injuredstring = core->GetString(strindex, 0); - } - - if (!injuredstring) { - // eek, where did the string go? - snprintf(buffer, 100, "%s\n%d/%d", name, hp, maxhp); - } else { - snprintf(buffer, 100, "%s\n%s", name, injuredstring); - free(injuredstring); - } - } - } - - Point p = actor->Pos; - core->GetVideoDriver()->ConvertToScreen( p.x, p.y ); - p.x += Owner->XPos + XPos; - p.y += Owner->YPos + YPos; - - // hack to position text above PS:T actors - if (!core->TooltipBack) p.y -= actor->size*50; - - // we should probably cope better with moving actors - SetTooltip(buffer); - core->DisplayTooltip(p.x, p.y, this); - return; - } - } - } - - SetTooltip(NULL); - core->DisplayTooltip(0, 0, NULL); - return; -} - -//returns the appropriate cursor over an active region (trap, infopoint, travel region) -int GameControl::GetCursorOverInfoPoint(InfoPoint *overInfoPoint) const -{ - if (target_mode == TARGET_MODE_PICK) { - if (overInfoPoint->VisibleTrap(0)) { - return IE_CURSOR_TRAP; - } - - return IE_CURSOR_STEALTH|IE_CURSOR_GRAY; - } - // traps always display a walk cursor? - if (overInfoPoint->Type == ST_PROXIMITY) { - return IE_CURSOR_WALK; - } - return overInfoPoint->Cursor; -} - -//returns the appropriate cursor over a door -int GameControl::GetCursorOverDoor(Door *overDoor) const -{ - if (!overDoor->Visible()) { - if (target_mode == TARGET_MODE_NONE) { - return IE_CURSOR_BLOCKED; - } else { - return lastCursor|IE_CURSOR_GRAY; - } - } - if (target_mode == TARGET_MODE_PICK) { - if (overDoor->VisibleTrap(0)) { - return IE_CURSOR_TRAP; - } - if (overDoor->Flags & DOOR_LOCKED) { - return IE_CURSOR_LOCK; - } - - return IE_CURSOR_STEALTH|IE_CURSOR_GRAY; - } - return overDoor->Cursor; -} - -//returns the appropriate cursor over a container (or pile) -int GameControl::GetCursorOverContainer(Container *overContainer) const -{ - if (target_mode == TARGET_MODE_PICK) { - if (overContainer->VisibleTrap(0)) { - return IE_CURSOR_TRAP; - } - if (overContainer->Flags & CONT_LOCKED) { - return IE_CURSOR_LOCK2; - } - - return IE_CURSOR_STEALTH|IE_CURSOR_GRAY; - } - return IE_CURSOR_TAKE; -} - -int GameControl::GetDefaultCursor() const -{ - switch(target_mode) { - case TARGET_MODE_TALK: - return IE_CURSOR_TALK; - case TARGET_MODE_ATTACK: - return IE_CURSOR_ATTACK; - case TARGET_MODE_CAST: - return IE_CURSOR_CAST; - case TARGET_MODE_DEFEND: - return IE_CURSOR_DEFEND; - case TARGET_MODE_PICK: - return IE_CURSOR_PICK; - } - return IE_CURSOR_NORMAL; -} - -/** Mouse Over Event */ -void GameControl::OnMouseOver(unsigned short x, unsigned short y) -{ - if (ScreenFlags & SF_DISABLEMOUSE) { - return; - } - - if (touchScrollAreasEnabled) { - int mousescrollspd = core->GetMouseScrollSpeed(); - Region region; - Map* map; - Point mapsize; - Region viewport = core->GetVideoDriver()->GetViewport(); - moveX = 0; - moveY = 0; - // Top scroll area - region=Region(XPos, YPos, Width, YPos+scrollAreasWidth); - if (region.PointInside(x, y)) { - // Check for end of map area - if (viewport.y > 0) - moveY = -mousescrollspd; - } - // Bottom scroll area - region=Region(XPos, Height-scrollAreasWidth, Width, Height); - if (region.PointInside(x, y)) { - // Check for end of map area - map = core->GetGame()->GetCurrentArea(); - if (map != NULL) { - mapsize = map->TMap->GetMapSize(); - if((viewport.y + viewport.h) < mapsize.y) - moveY = mousescrollspd; - } - } - // Left scroll area - region=Region(XPos, YPos, XPos+scrollAreasWidth, Height); - if (region.PointInside(x, y)) { - // Check for end of map area - if(viewport.x > 0) - moveX = -mousescrollspd; - } - // Right scroll area - region=Region(Width-scrollAreasWidth, YPos, Width, Height); - if (region.PointInside(x, y)) { - // Check for end of map area - map = core->GetGame()->GetCurrentArea(); - if (map != NULL) { - mapsize = map->TMap->GetMapSize(); - if((viewport.x + viewport.w) < mapsize.x) - moveX = mousescrollspd; - } - } - if ((moveX != 0 || moveY != 0) && touched) { - scrolling = true; - return; - } else { - moveX = 0; - moveY = 0; - scrolling = false; - Video* video = core->GetVideoDriver(); - video->SetDragCursor(NULL); - } - } - - lastMouseX = x; - lastMouseY = y; - Point p( x,y ); - core->GetVideoDriver()->ConvertToGame( p.x, p.y ); - if (MouseIsDown && ( !DrawSelectionRect )) { - if (( abs( p.x - StartX ) > 5 ) || ( abs( p.y - StartY ) > 5 )) { - DrawSelectionRect = true; - } - } - Game* game = core->GetGame(); - if (!game) return; - Map* area = game->GetCurrentArea( ); - if (!area) return; - int nextCursor = area->GetCursor( p ); - //make the invisible area really invisible - if (nextCursor == IE_CURSOR_INVALID) { - Owner->Cursor = IE_CURSOR_BLOCKED; - lastCursor = IE_CURSOR_BLOCKED; - return; - } - - overInfoPoint = area->TMap->GetInfoPoint( p, true ); - if (overInfoPoint) { - //nextCursor = overInfoPoint->Cursor; - nextCursor = GetCursorOverInfoPoint(overInfoPoint); - } - - if (overDoor) { - overDoor->Highlight = false; - } - if (overContainer) { - overContainer->Highlight = false; - } - Actor *lastActor = area->GetActorByGlobalID(lastActorID); - if (lastActor) { - lastActor->SetOver( false ); - } - - overDoor = area->TMap->GetDoor( p ); - overContainer = area->TMap->GetContainer( p ); - - if (!DrawSelectionRect) { - if (overDoor) { - nextCursor = GetCursorOverDoor(overDoor); - } - - if (overContainer) { - nextCursor = GetCursorOverContainer(overContainer); - } - - Actor *prevActor = lastActor; - lastActor = area->GetActor( p, target_types); - if (lastActor != prevActor) { - // we store prevActor so we can remove the tooltip on actor change - // (maybe we should be checking this and actor movements every frame?) - SetTooltip(NULL); - core->DisplayTooltip(0, 0, this); - } - - if ((target_types & GA_NO_SELF) && lastActor ) { - if (lastActor == core->GetFirstSelectedActor()) { - lastActor=NULL; - } - } - - if (lastActor) { - lastActorID = lastActor->GetGlobalID(); - lastActor->SetOver( true ); - ieDword type = lastActor->GetStat(IE_EA); - if (type >= EA_EVILCUTOFF || type == EA_GOODBUTRED) { - nextCursor = IE_CURSOR_ATTACK; - } else if ( type > EA_CHARMED ) { - nextCursor = IE_CURSOR_TALK; - //don't let the pc to talk to frozen/stoned creatures - ieDword state = lastActor->GetStat(IE_STATE_ID); - if (state & STATE_CANTMOVE) { - nextCursor |= IE_CURSOR_GRAY; - } - } else { - nextCursor = IE_CURSOR_NORMAL; - } - } else { - lastActorID = 0; - } - - if (target_mode == TARGET_MODE_TALK) { - nextCursor = IE_CURSOR_TALK; - if (!lastActor) { - nextCursor |= IE_CURSOR_GRAY; - } else { - //don't let the pc to talk to frozen/stoned creatures - ieDword state = lastActor->GetStat(IE_STATE_ID); - if (state & STATE_CANTMOVE) { - nextCursor |= IE_CURSOR_GRAY; - } - } - } else if (target_mode == TARGET_MODE_ATTACK) { - nextCursor = IE_CURSOR_ATTACK; - if (overDoor) { - if (!overDoor->Visible()) { - nextCursor |= IE_CURSOR_GRAY; - } - } else if (!lastActor && !overContainer) { - nextCursor |= IE_CURSOR_GRAY; - } - } else if (target_mode == TARGET_MODE_CAST) { - nextCursor = IE_CURSOR_CAST; - //point is always valid - if (!(target_types & GA_POINT)) { - if(!lastActor) { - nextCursor |= IE_CURSOR_GRAY; - } - } - } else if (target_mode == TARGET_MODE_DEFEND) { - nextCursor = IE_CURSOR_DEFEND; - if(!lastActor) { - nextCursor |= IE_CURSOR_GRAY; - } - } else if (target_mode == TARGET_MODE_PICK) { - if (lastActor) { - nextCursor = IE_CURSOR_PICK; - } else { - if (!overContainer && !overDoor && !overInfoPoint) { - nextCursor = IE_CURSOR_STEALTH|IE_CURSOR_GRAY; - } - } - goto end_function; - } - - if (lastActor) { - switch (lastActor->GetStat(IE_EA)) { - case EA_EVILCUTOFF: - case EA_GOODCUTOFF: - break; - - case EA_PC: - case EA_FAMILIAR: - case EA_ALLY: - case EA_CONTROLLED: - case EA_CHARMED: - case EA_EVILBUTGREEN: - if (target_types & GA_NO_ENEMY) - nextCursor^=1; - break; - - case EA_ENEMY: - case EA_GOODBUTRED: - if (target_types & GA_NO_ALLY) - nextCursor^=1; - break; - default: - if (!(target_types & GA_NO_NEUTRAL)) - nextCursor^=1; - break; - } - } - } -end_function: - if (lastCursor != nextCursor) { - Owner->Cursor = nextCursor; - lastCursor = (unsigned char) nextCursor; - } -} - -/** Global Mouse Move Event */ -void GameControl::OnGlobalMouseMove(unsigned short x, unsigned short y) -{ - if (ScreenFlags & SF_DISABLEMOUSE) { - return; - } - - if (Owner->Visible!=WINDOW_VISIBLE) { - return; - } - - if (!touchScrollAreasEnabled) { - int mousescrollspd = core->GetMouseScrollSpeed(); - - if (x <= SCROLL_BORDER) - moveX = -mousescrollspd; - else { - if (x >= ( core->Width - SCROLL_BORDER )) - moveX = mousescrollspd; - else - moveX = 0; - } - if (y <= SCROLL_BORDER) - moveY = -mousescrollspd; - else { - if (y >= ( core->Height - SCROLL_BORDER )) - moveY = mousescrollspd; - else - moveY = 0; - } - - if (moveX != 0 || moveY != 0) { - scrolling = true; - } else if (scrolling) { - scrolling = false; - - Video* video = core->GetVideoDriver(); - video->SetDragCursor(NULL); - } - } -} - -void GameControl::UpdateScrolling() { - if (!scrolling) return; - - int mousescrollspd = core->GetMouseScrollSpeed(); // TODO: why check against this value and not +/-? - Video* video = core->GetVideoDriver(); - - if (moveX == mousescrollspd && moveY == 0) { // right - video->SetDragCursor(core->GetScrollCursorSprite(0,numScrollCursor)); - } else if (moveX == mousescrollspd && moveY == -mousescrollspd) { // upper right - video->SetDragCursor(core->GetScrollCursorSprite(1,numScrollCursor)); - } else if (moveX == 0 && moveY == -mousescrollspd) { // up - video->SetDragCursor(core->GetScrollCursorSprite(2,numScrollCursor)); - } else if (moveX == -mousescrollspd && moveY == -mousescrollspd) { // upper left - video->SetDragCursor(core->GetScrollCursorSprite(3,numScrollCursor)); - } else if (moveX == -mousescrollspd && moveY == 0) { // left - video->SetDragCursor(core->GetScrollCursorSprite(4,numScrollCursor)); - } else if (moveX == -mousescrollspd && moveY == mousescrollspd) { // bottom left - video->SetDragCursor(core->GetScrollCursorSprite(5,numScrollCursor)); - } else if (moveX == 0 && moveY == mousescrollspd) { // bottom - video->SetDragCursor(core->GetScrollCursorSprite(6,numScrollCursor)); - } else if (moveX == mousescrollspd && moveY == mousescrollspd) { // bottom right - video->SetDragCursor(core->GetScrollCursorSprite(7,numScrollCursor)); - } - - numScrollCursor = (numScrollCursor+1) % 15; -} - -//generate action code for source actor to try to attack a target -void GameControl::TryToAttack(Actor *source, Actor *tgt) -{ - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); - source->AddAction( GenerateActionDirect( Tmp, tgt) ); -} - -//generate action code for source actor to try to defend a target -void GameControl::TryToDefend(Actor *source, Actor *tgt) -{ - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - strncpy(Tmp,"NIDSpecial4()",sizeof(Tmp) ); - source->AddAction( GenerateActionDirect( Tmp, tgt) ); -} - -//generate action code for source actor to try to pick pockets of a target -//The -1 flag is a placeholder for dynamic target IDs -void GameControl::TryToPick(Actor *source, Actor *tgt) -{ - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - strncpy(Tmp,"PickPockets([-1])", sizeof(Tmp) ); - source->AddAction( GenerateActionDirect( Tmp, tgt) ); -} - -//generate action code for source actor to try to pick a lock/disable trap on a door -void GameControl::TryToPick(Actor *source, Door *tgt) -{ - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - if (tgt->Trapped && tgt->TrapDetected) { - strncpy(Tmp, "RemoveTraps([-1])", sizeof(Tmp) ); - } else { - strncpy(Tmp, "PickLock([-1])", sizeof(Tmp) ); - } - source->AddAction( GenerateActionDirect( Tmp, tgt ) ); -} - -//generate action code for source actor to try to pick a lock/disable trap on a container -void GameControl::TryToPick(Actor *source, Container *tgt) -{ - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - if (tgt->Trapped && tgt->TrapDetected) { - strncpy(Tmp, "RemoveTraps([-1])", sizeof(Tmp) ); - } else { - strncpy(Tmp, "PickLock([-1])", sizeof(Tmp) ); - } - source->AddAction( GenerateActionDirect( Tmp, tgt ) ); -} - -//generate action code for source actor to try to disable trap (only trap type active regions) -void GameControl::TryToDisarm(Actor *source, InfoPoint *tgt) -{ - if (tgt->Type!=ST_PROXIMITY) return; - - char Tmp[40]; - - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - strncpy(Tmp, "RemoveTraps([-1])", sizeof(Tmp) ); - source->AddAction( GenerateActionDirect( Tmp, tgt ) ); -} - -//generate action code for source actor to use item/cast spell on a point -void GameControl::TryToCast(Actor *source, const Point &tgt) -{ - char Tmp[40]; - - if (!spellCount) { - ResetTargetMode(); - return; //not casting or using an own item - } - source->ClearPath(); - source->ClearActions(); - - spellCount--; - if (spellOrItem>=0) { - if (spellIndex<0) { - strncpy(Tmp, "SpellPointNoDec(\"\",[0.0])", sizeof(Tmp) ); - } else { - strncpy(Tmp, "SpellPoint(\"\",[0.0])", sizeof(Tmp) ); - } - } else { - //using item on target - strncpy(Tmp, "UseItemPoint(\"\",[0,0],0)", sizeof(Tmp) ); - } - Action* action = GenerateAction( Tmp ); - action->pointParameter=tgt; - if (spellOrItem>=0) { - if (spellIndex<0) { - sprintf(action->string0Parameter,"%.8s",spellName); - } else { - CREMemorizedSpell *si; - //spell casting at target - si = source->spellbook.GetMemorizedSpell(spellOrItem, spellSlot, spellIndex); - if (!si) { - ResetTargetMode(); - return; - } - sprintf(action->string0Parameter,"%.8s",si->SpellResRef); - } - } else { - action->int0Parameter = spellSlot; - action->int1Parameter = spellIndex; - } - source->AddAction( action ); - if (!spellCount) { - ResetTargetMode(); - } -} - -//generate action code for source actor to use item/cast spell on another actor -void GameControl::TryToCast(Actor *source, Actor *tgt) -{ - char Tmp[40]; - - if (!spellCount) { - ResetTargetMode(); - return; //not casting or using an own item - } - source->ClearPath(); - source->ClearActions(); - - spellCount--; - if (spellOrItem>=0) { - if (spellIndex<0) { - sprintf(Tmp, "NIDSpecial7()"); - } else { - sprintf(Tmp, "NIDSpecial6()"); - } - } else { - //using item on target - sprintf(Tmp, "NIDSpecial5()"); - } - Action* action = GenerateActionDirect( Tmp, tgt); - if (spellOrItem>=0) { - if (spellIndex<0) { - sprintf(action->string0Parameter,"%.8s",spellName); - } else { - CREMemorizedSpell *si; - //spell casting at target - si = source->spellbook.GetMemorizedSpell(spellOrItem, spellSlot, spellIndex); - if (!si) { - ResetTargetMode(); - return; - } - sprintf(action->string0Parameter,"%.8s",si->SpellResRef); - } - } else { - action->int0Parameter = spellSlot; - action->int1Parameter = spellIndex; - } - source->AddAction( action ); - if (!spellCount) { - ResetTargetMode(); - } -} - -//generate action code for source actor to use talk to target actor -void GameControl::TryToTalk(Actor *source, Actor *tgt) -{ - char Tmp[40]; - - //Nidspecial1 is just an unused action existing in all games - //(non interactive demo) - //i found no fitting action which would emulate this kind of - //dialog initation - source->ClearPath(); - source->ClearActions(); - source->SetModal(MS_NONE); - strncpy(Tmp,"NIDSpecial1()",sizeof(Tmp) ); - dialoghandler->targetID = tgt->GetGlobalID(); //this is a hack, but not so deadly - source->AddAction( GenerateActionDirect( Tmp, tgt) ); -} - -//generate action code for actor appropriate for the target mode when the target is a container -void GameControl::HandleContainer(Container *container, Actor *actor) -{ - char Tmp[256]; - - if ((target_mode == TARGET_MODE_CAST) && spellCount) { - //we'll get the container back from the coordinates - TryToCast(actor, container->Pos); - //Do not reset target_mode, TryToCast does it for us!! - return; - } - - core->SetEventFlag(EF_RESETTARGET); - - if (target_mode == TARGET_MODE_ATTACK) { - actor->ClearPath(); - actor->ClearActions(); - snprintf(Tmp, sizeof(Tmp), "BashDoor(\"%s\")", container->GetScriptName()); - actor->AddAction(GenerateAction(Tmp)); - return; - } - - if (target_mode == TARGET_MODE_PICK) { - TryToPick(actor, container); - return; - } - - actor->ClearPath(); - actor->ClearActions(); - strncpy(Tmp,"UseContainer()",sizeof(Tmp) ); - core->SetCurrentContainer( actor, container); - actor->AddAction( GenerateAction( Tmp) ); -} - -//generate action code for actor appropriate for the target mode when the target is a door -void GameControl::HandleDoor(Door *door, Actor *actor) -{ - char Tmp[256]; - - if ((target_mode == TARGET_MODE_CAST) && spellCount) { - //we'll get the door back from the coordinates - Point *p = door->toOpen; - Point *otherp = door->toOpen+1; - if (Distance(*p,actor)>Distance(*otherp,actor)) { - p=otherp; - } - TryToCast(actor, *p); - return; - } - - core->SetEventFlag(EF_RESETTARGET); - - if (target_mode == TARGET_MODE_ATTACK) { - actor->ClearPath(); - actor->ClearActions(); - snprintf(Tmp, sizeof(Tmp), "BashDoor(\"%s\")", door->GetScriptName()); - actor->AddAction(GenerateAction(Tmp)); - return; - } - - if (target_mode == TARGET_MODE_PICK) { - TryToPick(actor, door); - return; - } - - actor->ClearPath(); - actor->ClearActions(); - actor->TargetDoor = door->GetGlobalID(); - // internal gemrb toggle door action hack - should we use UseDoor instead? - sprintf( Tmp, "NIDSpecial9()" ); - actor->AddAction( GenerateAction( Tmp) ); -} - -//generate action code for actor appropriate for the target mode when the target is an active region (infopoint, trap or travel) -bool GameControl::HandleActiveRegion(InfoPoint *trap, Actor * actor, Point &p) -{ - if ((target_mode == TARGET_MODE_CAST) && spellCount) { - //we'll get the active region from the coordinates (if needed) - TryToCast(actor, p); - //don't bother with this region further - return true; - } - if (target_mode == TARGET_MODE_PICK) { - TryToDisarm(actor, trap); - return true; - } - - switch(trap->Type) { - case ST_TRAVEL: - trap->AddTrigger(TriggerEntry(trigger_clicked, actor->GetGlobalID())); - // exit usage is handled by caller for now - // actor->UseExit(trap->GetGlobalID()); - return false; - case ST_TRIGGER: - //the importer shouldn't load the script - //if it is unallowed anyway (though - //deactivated scripts could be reactivated) - //only the 'trapped' flag should be honoured - //there. Here we have to check on the - //reset trap and deactivated flags - if (trap->Scripts[0]) { - if (!(trap->Flags&TRAP_DEACTIVATED) ) { - trap->AddTrigger(TriggerEntry(trigger_clicked, actor->GetGlobalID())); - //directly feeding the event, even if there are actions in the queue - //trap->Scripts[0]->Update(); - // FIXME - trap->ExecuteScript(1); - trap->ProcessActions(); - } - } else { - if (trap->overHeadText) { - if (trap->textDisplaying != 1) { - trap->textDisplaying = 1; - trap->timeStartDisplaying = core->GetGame()->Ticks; - DisplayString( trap ); - } - } - } - if (trap->Flags&TRAP_USEPOINT) { - //overriding the target point - p = trap->UsePoint; - return false; - } - return true; - default:; - } - return false; -} -/** Mouse Button Down */ -void GameControl::OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short /*Mod*/) -{ - if (ScreenFlags&SF_DISABLEMOUSE) - return; - - short px=x; - short py=y; - DoubleClick = false; - switch(Button) - { - case GEM_MB_SCRLUP: - OnSpecialKeyPress(GEM_UP); - break; - case GEM_MB_SCRLDOWN: - OnSpecialKeyPress(GEM_DOWN); - break; - case GEM_MB_ACTION|GEM_MB_DOUBLECLICK: - DoubleClick = true; - case GEM_MB_ACTION: - core->GetVideoDriver()->ConvertToGame( px, py ); - MouseIsDown = true; - SelectionRect.x = px; - SelectionRect.y = py; - StartX = px; - StartY = py; - SelectionRect.w = 0; - SelectionRect.h = 0; - if (touchScrollAreasEnabled) touched=true; - } -} - -/** Mouse Button Up */ -void GameControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short /*Mod*/) -{ - unsigned int i; - char Tmp[256]; - - if (ScreenFlags & SF_DISABLEMOUSE) { - return; - } - //heh, i found no better place - core->CloseCurrentContainer(); - - MouseIsDown = false; - Point p(x,y); - core->GetVideoDriver()->ConvertToGame( p.x, p.y ); - Game* game = core->GetGame(); - if (!game) return; - Map* area = game->GetCurrentArea( ); - if (!area) return; - - if (touchScrollAreasEnabled) { - touched=false; - if (scrolling) { - moveX = 0; - moveY = 0; - scrolling=false; - Video* video = core->GetVideoDriver(); - video->SetDragCursor(NULL); - if (DrawSelectionRect) { - Actor** ab; - unsigned int count = area->GetActorInRect( ab, SelectionRect,true ); - if (count != 0) { - for (i = 0; i < highlighted.size(); i++) - highlighted[i]->SetOver( false ); - highlighted.clear(); - game->SelectActor( NULL, false, SELECT_NORMAL ); - for (i = 0; i < count; i++) { - // FIXME: should call handler only once - game->SelectActor( ab[i], true, SELECT_NORMAL ); - } - } - free( ab ); - DrawSelectionRect = false; - } - return; - } - } - if (DrawSelectionRect) { - Actor** ab; - unsigned int count = area->GetActorInRect( ab, SelectionRect,true ); - if (count != 0) { - for (i = 0; i < highlighted.size(); i++) - highlighted[i]->SetOver( false ); - highlighted.clear(); - game->SelectActor( NULL, false, SELECT_NORMAL ); - for (i = 0; i < count; i++) { - // FIXME: should call handler only once - game->SelectActor( ab[i], true, SELECT_NORMAL ); - } - } - free( ab ); - DrawSelectionRect = false; - return; - } - - //hidden actors are not selectable by clicking on them - Actor* actor = area->GetActor( p, GA_DEFAULT /*| GA_NO_DEAD */| GA_NO_HIDDEN | target_types); - if (Button == GEM_MB_MENU) { - if (actor) { - //from GSUtils - DisplayStringCore(actor, VB_SELECT+core->Roll(1,3,-1), DS_CONST|DS_CONSOLE); - return; - } - core->GetDictionary()->SetAt( "MenuX", x ); - core->GetDictionary()->SetAt( "MenuY", y ); - core->GetGUIScriptEngine()->RunFunction( "GUICommon", "OpenFloatMenuWindow" ); - return; - } - - if (Button != GEM_MB_ACTION) { - return; - } - - if (!game->selected.size()) { - //TODO: this is a hack, we need some restructuring here - //handling the special case when no one was selected, and - //the player clicks on a partymember - if (actor && (actor->GetStat(IE_EA)GetFirstSelectedPC(false); - if (!pc) { - //this could be a non-PC - pc = game->selected[0]; - } - if (!actor) { - //add a check if you don't want some random monster handle doors and such - if (overDoor) { - HandleDoor(overDoor, pc); - return; - } - if (overContainer) { - HandleContainer(overContainer, pc); - return; - } - if (overInfoPoint) { - if (overInfoPoint->Type==ST_TRAVEL) { - int i = game->selected.size(); - ieDword exitID = overInfoPoint->GetGlobalID(); - while(i--) { - game->selected[i]->UseExit(exitID); - } - } - if (HandleActiveRegion(overInfoPoint, pc, p)) { - core->SetEventFlag(EF_RESETTARGET); - return; - } - } - - //just a single actor, no formation - if (game->selected.size()==1) { - //the player is using an item or spell on the ground - if ((target_mode == TARGET_MODE_CAST) && spellCount) { - if (target_types & GA_POINT) { - TryToCast(pc, p); - } - return; - } - - pc->ClearPath(); - pc->ClearActions(); - CreateMovement(pc, p); - if (DoubleClick) Center(x,y); - //p is a searchmap travel region - if ( pc->GetCurrentArea()->GetCursor(p) == IE_CURSOR_TRAVEL) { - sprintf( Tmp, "NIDSpecial2()" ); - pc->AddAction( GenerateAction( Tmp) ); - } - return; - } - - // construct a sorted party - // TODO: this is still ugly, help? - std::vector party; - // first, from the actual party - int max = game->GetPartySize(false); - for(int idx = 1; idx<=max; idx++) { - Actor *act = game->FindPC(idx); - if(act->IsSelected()) { - party.push_back(act); - } - } - for (i = 0; i < game->selected.size(); i++) { - Actor *act = game->selected[i]; - if (!act->InParty) { - party.push_back(act); - } - } - - //party formation movement - Point src = party[0]->Pos; - for(i = 0; i < party.size(); i++) { - actor = party[i]; - actor->ClearPath(); - actor->ClearActions(); - MoveToPointFormation(actor, i, src, p); - } - if (DoubleClick) Center(x,y); - - //p is a searchmap travel region - if ( party[0]->GetCurrentArea()->GetCursor(p) == IE_CURSOR_TRAVEL) { - sprintf( Tmp, "NIDSpecial2()" ); - party[0]->AddAction( GenerateAction( Tmp) ); - } - return; - } - if (!actor) return; - - //we got an actor past this point - if (target_mode == TARGET_MODE_NONE) { - DisplayStringCore(actor, VB_SELECT+core->Roll(1,3,-1), DS_CONST|DS_CONSOLE); - } - - PerformActionOn(actor); -} - -void GameControl::PerformActionOn(Actor *actor) -{ - Game* game = core->GetGame(); - unsigned int i; - - //determining the type of the clicked actor - ieDword type; - - type = actor->GetStat(IE_EA); - if ( type >= EA_EVILCUTOFF || type == EA_GOODBUTRED ) { - type = ACT_ATTACK; //hostile - } else if ( type > EA_CHARMED ) { - type = ACT_TALK; //neutral - } else { - type = ACT_NONE; //party - } - - if (target_mode == TARGET_MODE_ATTACK) { - type = ACT_ATTACK; - } else if (target_mode == TARGET_MODE_TALK) { - type = ACT_TALK; - } else if (target_mode == TARGET_MODE_CAST) { - type = ACT_CAST; - } else if (target_mode == TARGET_MODE_DEFEND) { - type = ACT_DEFEND; - } else if (target_mode == TARGET_MODE_PICK) { - type = ACT_THIEVING; - } - - if (type != ACT_NONE) { - if(!actor->ValidTarget(target_types)) { - return; - } - } - - //we shouldn't zero this for two reasons in case of spell or item - //1. there could be multiple targets - //2. the target mode is important - if (!(target_mode == TARGET_MODE_CAST) || !spellCount) { - ResetTargetMode(); - } - - switch (type) { - case ACT_NONE: //none - if (!actor->ValidTarget(GA_SELECT)) { - return; - } - - if (actor->InParty) - SelectActor( actor->InParty ); - else if (actor->GetStat(IE_EA) <= EA_CHARMED) { - /*let's select charmed/summoned creatures - EA_CHARMED is the maximum value known atm*/ - core->GetGame()->SelectActor(actor, true, SELECT_REPLACE); - } - break; - case ACT_TALK: - if (!actor->ValidTarget(GA_TALK)) { - return; - } - - //talk (first selected talks) - if (game->selected.size()) { - //if we are in PST modify this to NO! - Actor *source; - if (core->HasFeature(GF_PROTAGONIST_TALKS) ) { - source = game->GetPC(0, false); //protagonist - } else { - source = core->GetFirstSelectedPC(false); - } - // only party members can start conversations - if (source) { - TryToTalk(source, actor); - } - } - break; - case ACT_ATTACK: - //all of them attacks the red circled actor - for(i=0;iselected.size();i++) { - TryToAttack(game->selected[i], actor); - } - break; - case ACT_CAST: //cast on target or use item on target - if (game->selected.size()==1) { - Actor *source; - source = core->GetFirstSelectedActor(); - if(source) { - TryToCast(source, actor); - } - } - break; - case ACT_DEFEND: - for(i=0;iselected.size();i++) { - TryToDefend(game->selected[i], actor); - } - break; - case ACT_THIEVING: - if (game->selected.size()==1) { - Actor *source; - source = core->GetFirstSelectedActor(); - if(source) { - TryToPick(source, actor); - } - } - break; - } -} - -//sets target mode, and resets the cursor -void GameControl::SetTargetMode(int mode) { - int x,y; - - target_mode = mode; - //This hack is to refresh the mouse cursor - core->GetVideoDriver()->GetMousePos(x,y); - //calling into the videodriver to set the mouseposition won't work - core->GetEventMgr()->MouseMove(x,y); -} - -void GameControl::ResetTargetMode() { - target_types = GA_NO_DEAD|GA_NO_HIDDEN; - SetTargetMode(TARGET_MODE_NONE); -} - -void GameControl::UpdateTargetMode() { - SetTargetMode(target_mode); -} - -/** Special Key Press */ -void GameControl::OnSpecialKeyPress(unsigned char Key) -{ - if (DialogueFlags&DF_IN_DIALOG) { - switch(Key) { - case GEM_RETURN: - //simulating the continue/end button pressed - core->GetGUIScriptEngine()->RunFunction("GUIWORLD", "CloseContinueWindow"); - break; - } - return; //don't accept keys in dialog - } - Region Viewport = core->GetVideoDriver()->GetViewport(); - Game *game = core->GetGame(); - if (!game) return; - Map *map = game->GetCurrentArea(); - if (!map) return; - - Point mapsize = map->TMap->GetMapSize(); - int partysize = game->GetPartySize(false); - int pm; - char tmpstr[10]; - - switch (Key) { - case GEM_LEFT: - if (Viewport.x > 63) - Viewport.x -= 64; - else - Viewport.x = 0; - break; - case GEM_UP: - if (Viewport.y > 63) - Viewport.y -= 64; - else - Viewport.y = 0; - break; - case GEM_DOWN: - if (Viewport.y + Viewport.h + 64 < mapsize.y) - Viewport.y += 64; - else { - Viewport.y = mapsize.y - Viewport.h; - if (Viewport.y<0) Viewport.y=0; - } - break; - case GEM_RIGHT: - if (Viewport.x + Viewport.w + 64 < mapsize.x) - Viewport.x += 64; - else { - Viewport.x = mapsize.x - Viewport.w; - if (Viewport.x<0) Viewport.x=0; - } - break; - case GEM_ALT: - DebugFlags |= DEBUG_SHOW_CONTAINERS; - return; - case GEM_TAB: - // show partymember hp/maxhp as overhead text - for (pm=0; pm < partysize; pm++) { - Actor *pc = game->GetPC(pm, true); - if (!pc) continue; - //sucks but this is set in different places - if (pc->GetStat(IE_MC_FLAGS) & MC_HIDE_HP) continue; - if (pc->GetStat(IE_EXTSTATE_ID) & EXTSTATE_NO_HP) continue; - memset(tmpstr, 0, 10); - snprintf(tmpstr, 10, "%d/%d", pc->Modified[IE_HITPOINTS], pc->Modified[IE_MAXHITPOINTS]); - pc->DisplayHeadText(strdup(tmpstr)); - } - return; - case GEM_MOUSEOUT: - moveX = 0; - moveY = 0; - return; - case GEM_ESCAPE: - core->GetGUIScriptEngine()->RunFunction("GUICommonWindows", "EmptyControls"); - core->SetEventFlag(EF_ACTION); - return; - case GEM_PGUP: - core->GetGUIScriptEngine()->RunFunction("CommonWindow","OnIncreaseSize"); - return; - case GEM_PGDOWN: - core->GetGUIScriptEngine()->RunFunction("CommonWindow","OnDecreaseSize"); - return; - default: - return; - } - if (ScreenFlags & SF_LOCKSCROLL) { - moveX = 0; - moveY = 0; - } else { - // override any existing viewport moves which may be in progress - core->timer->SetMoveViewPort( Viewport.x, Viewport.y, 0, false ); - // move it directly ourselves, since we might be paused - core->GetVideoDriver()->MoveViewportTo( Viewport.x, Viewport.y ); - } -} - -void GameControl::CalculateSelection(const Point &p) -{ - unsigned int i; - - Game* game = core->GetGame(); - Map* area = game->GetCurrentArea( ); - if (DrawSelectionRect) { - if (p.x < StartX) { - SelectionRect.w = StartX - p.x; - SelectionRect.x = p.x; - } else { - SelectionRect.x = StartX; - SelectionRect.w = p.x - StartX; - } - if (p.y < StartY) { - SelectionRect.h = StartY - p.y; - SelectionRect.y = p.y; - } else { - SelectionRect.y = StartY; - SelectionRect.h = p.y - StartY; - } - Actor** ab; - unsigned int count = area->GetActorInRect( ab, SelectionRect,true ); - for (i = 0; i < highlighted.size(); i++) - highlighted[i]->SetOver( false ); - highlighted.clear(); - if (count != 0) { - for (i = 0; i < count; i++) { - ab[i]->SetOver( true ); - highlighted.push_back( ab[i] ); - } - } - free( ab ); - } else { - Actor* actor = area->GetActor( p, GA_DEFAULT | GA_SELECT | GA_NO_DEAD | GA_NO_ENEMY); - SetLastActor( actor, area->GetActorByGlobalID(lastActorID) ); -/* - Actor *lastActor = area->GetActorByGlobalID(lastActorID); - if (lastActor) - lastActor->SetOver( false ); - if (!actor) { - lastActorID = 0; - } else { - lastActorID = actor->globalID; - actor->SetOver( true ); - } -*/ - } -} - -void GameControl::SetLastActor(Actor *actor, Actor *prevActor) -{ - if (prevActor) - prevActor->SetOver( false ); - if (!actor) { - lastActorID = 0; - } else { - lastActorID = actor->GetGlobalID(); - actor->SetOver( true ); - } -} - -void GameControl::SetCutSceneMode(bool active) -{ - if (active) { - ScreenFlags |= (SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); - moveX = 0; - moveY = 0; - } else { - ScreenFlags &= ~(SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); - } -} - -//Change game window geometries when a new window gets deactivated -void GameControl::HandleWindowHide(const char *WindowName, const char *WindowPosition) -{ - Variables* dict = core->GetDictionary(); - ieDword index; - - if (dict->Lookup( WindowName, index )) { - if (index != (ieDword) -1) { - Window* w = core->GetWindow( (unsigned short) index ); - if (w) { - core->SetVisible( (unsigned short) index, WINDOW_INVISIBLE ); - if (dict->Lookup( WindowPosition, index )) { - ResizeDel( w, index ); - } - return; - } - printMessage("GameControl", "Invalid Window Index: %s:%u\n", LIGHT_RED, - WindowName, index); - } - } -} - -//Hide all other windows on the GUI (gamecontrol is not hidden by this) -int GameControl::HideGUI() -{ - //hidegui is in effect - if (!(ScreenFlags&SF_GUIENABLED) ) { - return 0; - } - //no gamecontrol visible - if (Owner->Visible == WINDOW_INVISIBLE ) { - return 0; - } - ScreenFlags &=~SF_GUIENABLED; - HandleWindowHide("PortraitWindow", "PortraitPosition"); - HandleWindowHide("OtherWindow", "OtherPosition"); - HandleWindowHide("TopWindow", "TopPosition"); - HandleWindowHide("OptionsWindow", "OptionsPosition"); - HandleWindowHide("MessageWindow", "MessagePosition"); - HandleWindowHide("ActionsWindow", "ActionsPosition"); - //FloatWindow doesn't affect gamecontrol, so it is special - Variables* dict = core->GetDictionary(); - ieDword index; - - if (dict->Lookup( "FloatWindow", index )) { - if (index != (ieDword) -1) { - core->SetVisible( (unsigned short) index, WINDOW_INVISIBLE ); - } - } - core->GetVideoDriver()->SetViewport( Owner->XPos, Owner->YPos, Width, Height ); - return 1; -} - -//Change game window geometries when a new window gets activated -void GameControl::HandleWindowReveal(const char *WindowName, const char *WindowPosition) -{ - Variables* dict = core->GetDictionary(); - ieDword index; - - if (dict->Lookup( WindowName, index )) { - if (index != (ieDword) -1) { - Window* w = core->GetWindow( (unsigned short) index ); - if (w) { - core->SetVisible( (unsigned short) index, WINDOW_VISIBLE ); - if (dict->Lookup( WindowPosition, index )) { - ResizeAdd( w, index ); - } - return; - } - printMessage("GameControl", "Invalid Window Index %s:%u\n", LIGHT_RED, - WindowName, index); - } - } -} - -//Reveal all windows on the GUI (including this one) -int GameControl::UnhideGUI() -{ - if (ScreenFlags&SF_GUIENABLED) { - return 0; - } - - ScreenFlags |= SF_GUIENABLED; - // Unhide the gamecontrol window - core->SetVisible( 0, WINDOW_VISIBLE ); - - HandleWindowReveal("ActionsWindow", "ActionsPosition"); - HandleWindowReveal("MessageWindow", "MessagePosition"); - HandleWindowReveal("OptionsWindow", "OptionsPosition"); - HandleWindowReveal("TopWindow", "TopPosition"); - HandleWindowReveal("OtherWindow", "OtherPosition"); - HandleWindowReveal("PortraitWindow", "PortraitPosition"); - //the floatwindow is a special case - Variables* dict = core->GetDictionary(); - ieDword index; - - if (dict->Lookup( "FloatWindow", index )) { - if (index != (ieDword) -1) { - Window* fw = core->GetWindow( (unsigned short) index ); - if (fw) { - core->SetVisible( (unsigned short) index, WINDOW_VISIBLE ); - fw->Flags |=WF_FLOAT; - core->SetOnTop( index ); - } - } - } - core->GetVideoDriver()->SetViewport( Owner->XPos, Owner->YPos, Width, Height ); - return 1; -} - -//a window got removed, so the GameControl gets enlarged -void GameControl::ResizeDel(Window* win, int type) -{ - switch (type) { - case 0: //Left - if (LeftCount!=1) { - printMessage("GameControl","More than one left window!\n",LIGHT_RED); - } - LeftCount--; - if (!LeftCount) { - Owner->XPos -= win->Width; - Owner->Width += win->Width; - Width = Owner->Width; - } - break; - - case 1: //Bottom - if (BottomCount!=1) { - printMessage("GameControl","More than one bottom window!\n",LIGHT_RED); - } - BottomCount--; - if (!BottomCount) { - Owner->Height += win->Height; - Height = Owner->Height; - } - break; - - case 2: //Right - if (RightCount!=1) { - printMessage("GameControl","More than one right window!\n",LIGHT_RED); - } - RightCount--; - if (!RightCount) { - Owner->Width += win->Width; - Width = Owner->Width; - } - break; - - case 3: //Top - if (TopCount!=1) { - printMessage("GameControl","More than one top window!\n",LIGHT_RED); - } - TopCount--; - if (!TopCount) { - Owner->YPos -= win->Height; - Owner->Height += win->Height; - Height = Owner->Height; - } - break; - - case 4: //BottomAdded - BottomCount--; - Owner->Height += win->Height; - Height = Owner->Height; - break; - case 5: //Inactivating - BottomCount--; - Owner->Height += win->Height; - Height = Owner->Height; - break; - } -} - -//a window got added, so the GameControl gets shrunk -//Owner is the GameControl's window -//GameControl is the only control on that window -void GameControl::ResizeAdd(Window* win, int type) -{ - switch (type) { - case 0: //Left - LeftCount++; - if (LeftCount == 1) { - Owner->XPos += win->Width; - Owner->Width -= win->Width; - Width = Owner->Width; - } - break; - - case 1: //Bottom - BottomCount++; - if (BottomCount == 1) { - Owner->Height -= win->Height; - Height = Owner->Height; - } - break; - - case 2: //Right - RightCount++; - if (RightCount == 1) { - Owner->Width -= win->Width; - Width = Owner->Width; - } - break; - - case 3: //Top - TopCount++; - if (TopCount == 1) { - Owner->YPos += win->Height; - Owner->Height -= win->Height; - Height = Owner->Height; - } - break; - - case 4: //BottomAdded - BottomCount++; - Owner->Height -= win->Height; - Height = Owner->Height; - break; - - case 5: //Inactivating - BottomCount++; - Owner->Height -= win->Height; - Height = 0; - } -} - -//Create an overhead text over an arbitrary point -void GameControl::DisplayString(const Point &p, const char *Text) -{ - Scriptable* scr = new Scriptable( ST_TRIGGER ); - scr->overHeadText = (char *) Text; - scr->textDisplaying = 1; - scr->timeStartDisplaying = 0; - scr->Pos = p; -} - -//Create an overhead text over a scriptable target -//Multiple texts are possible, as this code copies the text to a new object -void GameControl::DisplayString(Scriptable* target) -{ - Scriptable* scr = new Scriptable( ST_TRIGGER ); - scr->overHeadText = strdup( target->overHeadText ); -/* strdup should work here, we use it elsewhere - size_t len = strlen( target->overHeadText ) + 1; - scr->overHeadText = ( char * ) malloc( len ); - strcpy( scr->overHeadText, target->overHeadText ); -*/ - scr->textDisplaying = 1; - scr->timeStartDisplaying = target->timeStartDisplaying; - scr->Pos = target->Pos; -} - -/** changes displayed map to the currently selected PC */ -void GameControl::ChangeMap(Actor *pc, bool forced) -{ - //swap in the area of the actor - Game* game = core->GetGame(); - if (forced || (pc && stricmp( pc->Area, game->CurrentArea) != 0) ) { - dialoghandler->EndDialog(); - overInfoPoint = NULL; - overContainer = NULL; - overDoor = NULL; - /*this is loadmap, because we need the index, not the pointer*/ - char *areaname = game->CurrentArea; - if (pc) { - areaname = pc->Area; - } - game->GetMap( areaname, true ); - ScreenFlags|=SF_CENTERONACTOR; - } - //center on first selected actor - Video *video = core->GetVideoDriver(); - Region vp = video->GetViewport(); - if (ScreenFlags&SF_CENTERONACTOR) { - core->timer->SetMoveViewPort( pc->Pos.x, pc->Pos.y, 0, true ); - video->MoveViewportTo( pc->Pos.x-vp.w/2, pc->Pos.y-vp.h/2 ); - ScreenFlags&=~SF_CENTERONACTOR; - } -} - -void GameControl::SetScreenFlags(int value, int mode) -{ - switch(mode) { - case BM_OR: ScreenFlags|=value; break; - case BM_NAND: ScreenFlags&=~value; break; - case BM_SET: ScreenFlags=value; break; - case BM_AND: ScreenFlags&=value; break; - case BM_XOR: ScreenFlags^=value; break; - } -} - -void GameControl::SetDialogueFlags(int value, int mode) -{ - switch(mode) { - case BM_OR: DialogueFlags|=value; break; - case BM_NAND: DialogueFlags&=~value; break; - case BM_SET: DialogueFlags=value; break; - case BM_AND: DialogueFlags&=value; break; - case BM_XOR: DialogueFlags^=value; break; - } -} - -//copies a screenshot into a sprite -Sprite2D* GameControl::GetScreenshot(bool show_gui) -{ - Sprite2D* screenshot; - if (show_gui) { - screenshot = core->GetVideoDriver()->GetScreenshot( Region( 0, 0, 0, 0) ); - } else { - int hf = HideGUI (); - Draw (0, 0); - screenshot = core->GetVideoDriver()->GetScreenshot( Region( 0, 0, 0, 0 ) ); - if (hf) { - UnhideGUI (); - } - core->DrawWindows (); - } - - return screenshot; -} - -//copies a downscaled screenshot into a sprite for save game preview -Sprite2D* GameControl::GetPreview() -{ - // We get preview by first taking a screenshot of quintuple size of the preview control size (a few pixels bigger only in pst), - // centered in the display. This is to get a decent picture for - // higher screen resolutions. - // FIXME: how do orig games solve that? - Video* video = core->GetVideoDriver(); - int w = video->GetWidth(); - int h = video->GetHeight(); - int x = (w - 640) / 2; - int y = (h - 405) / 2; - - if (x < 0) { - x = 0; - } else { - w = 515; - } - - if (y < 0) { - y = 0; - } else { - h = 385; - } - - if (!x) - y = 0; - - Draw (0, 0); - Sprite2D *screenshot = video->GetScreenshot( Region(x, y, w, h) ); - core->DrawWindows(); - - Sprite2D* preview = video->SpriteScaleDown ( screenshot, 5 ); - video->FreeSprite( screenshot ); - return preview; -} - - -/** - * Returns PC portrait for a currently running game - */ -Sprite2D* GameControl::GetPortraitPreview(int pcslot) -{ - /** Portrait shrink ratio */ - // FIXME: this is just a random PST specific trait - // you can make it less random with a new feature bit - int ratio = (core->HasFeature( GF_ONE_BYTE_ANIMID )) ? 1 : 2; - - Video *video = core->GetVideoDriver(); - - Actor *actor = core->GetGame()->GetPC( pcslot, false ); - if (! actor) { - return NULL; - } - ResourceHolder im(actor->GetPortrait(true)); - if (! im) { - return NULL; - } - - Sprite2D* img = im->GetSprite2D(); - - if (ratio == 1) - return img; - - Sprite2D* img_scaled = video->SpriteScaleDown( img, ratio ); - video->FreeSprite( img ); - - return img_scaled; -} - -Actor *GameControl::GetActorByGlobalID(ieDword globalID) -{ - if (!globalID) - return NULL; - Game* game = core->GetGame(); - if (!game) - return NULL; - - Map* area = game->GetCurrentArea( ); - if (!area) - return NULL; - return - area->GetActorByGlobalID(globalID); -} - -Actor *GameControl::GetLastActor() -{ - return GetActorByGlobalID(lastActorID); -} - -//Set up an item use which needs targeting -//Slot is an inventory slot -//header is the used item extended header -//u is the user -//target type is a bunch of GetActor flags that alter valid targets -//cnt is the number of different targets (usually 1) -void GameControl::SetupItemUse(int slot, int header, Actor *u, int targettype, int cnt) -{ - memset(spellName, 0, sizeof(ieResRef)); - spellOrItem = -1; - spellUser = u; - spellSlot = slot; - spellIndex = header; - //item use also uses the casting icon, this might be changed in some custom game? - SetTargetMode(TARGET_MODE_CAST); - target_types = targettype; - spellCount = cnt; -} - -//Set up spell casting which needs targeting -//type is the spell's type -//level is the caster level -//idx is the spell's number -//u is the caster -//target type is a bunch of GetActor flags that alter valid targets -//cnt is the number of different targets (usually 1) -void GameControl::SetupCasting(ieResRef spellname, int type, int level, int idx, Actor *u, int targettype, int cnt) -{ - memcpy(spellName, spellname, sizeof(ieResRef)); - spellOrItem = type; - spellUser = u; - spellSlot = level; - spellIndex = idx; - SetTargetMode(TARGET_MODE_CAST); - target_types = targettype; - spellCount = cnt; -} - -//another method inherited from Control which has no use here -bool GameControl::SetEvent(int /*eventType*/, EventHandler /*handler*/) -{ - return false; -} - -void GameControl::SetDisplayText(char *text, unsigned int time) -{ - if (DisplayText) { - core->FreeString(DisplayText); - } - DisplayTextTime = time; - DisplayText = text; -} - -void GameControl::SetDisplayText(ieStrRef text, unsigned int time) -{ - SetDisplayText(core->GetString(displaymsg->GetStringReference(text), 0), time); -} - diff --git a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h deleted file mode 100644 index 8e5bf14cc..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h +++ /dev/null @@ -1,258 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -/** - * @file GameControl.h - * Declares GameControl widget which is responsible for displaying areas, - * interacting with PCs, NPCs and the rest of the game world. - * @author The GemRB Project - */ - -#ifndef GAMECONTROL_H -#define GAMECONTROL_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include "Dialog.h" -#include "Interface.h" -#include "Map.h" - -class GameControl; -class Window; -class DialogHandler; - -//dialog flags -#define DF_IN_DIALOG 1 -#define DF_TALKCOUNT 2 -#define DF_UNBREAKABLE 4 -#define DF_FREEZE_SCRIPTS 8 -#define DF_INTERACT 16 -#define DF_IN_CONTAINER 32 -#define DF_OPENCONTINUEWINDOW 64 -#define DF_OPENENDWINDOW 128 - -//screen flags -// !!! Keep these synchronized with GUIDefines.py !!! -#define SF_DISABLEMOUSE 1 //no mouse cursor -#define SF_CENTERONACTOR 2 // -#define SF_ALWAYSCENTER 4 -#define SF_GUIENABLED 8 // -#define SF_LOCKSCROLL 16 //don't scroll -#define SF_CUTSCENE 32 //don't push new actions onto the action queue -#define SF_TRACKING 64 //draw blue arrows on the edge for creatures - -// target modes and types -// !!! Keep these synchronized with GUIDefines.py !!! -#define TARGET_MODE_NONE 0 -#define TARGET_MODE_TALK 1 -#define TARGET_MODE_ATTACK 2 -#define TARGET_MODE_CAST 3 -#define TARGET_MODE_DEFEND 4 -#define TARGET_MODE_PICK 5 - -/* -#define TARGET_SELECT 16 -#define TARGET_NO_DEAD 32 -#define TARGET_POINT 64 -#define TARGET_NO_HIDDEN 128 -#define TARGET_TYPE_NONE 0x000 -#define TARGET_NO_ALLY 0x100 //0x100 -#define TARGET_NO_ENEMY 0x200 //0x200 -#define TARGET_NO_NEUTRAL 0x400 -#define TARGET_NO_SELF 0x800 -#define TARGET_TYPE_ALL 0 //(TARGET_TYPE_ALLY | TARGET_TYPE_ENEMY | TARGET_TYPE_NEUTRAL) -*/ - -/** - * @class GameControl - * Widget displaying areas, where most of the game 'happens'. - * It allows for interacting with PCs, NPCs and the rest of the world. - * It's also a very core part of GemRB, as some processes are driven from it. - * It's always assigned Control index 0. - */ - -class GEM_EXPORT GameControl : public Control { -public: - GameControl(void); - ~GameControl(void); -public: - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Sets multiple quicksaves flag*/ - static void MultipleQuickSaves(int arg); - void SetTracker(Actor *actor, ieDword dist); -private: - ieDword lastActorID; - ieDword trackerID; - ieDword distance; //tracking distance - std::vector< Actor*> highlighted; - bool DrawSelectionRect; - bool MouseIsDown; - bool DoubleClick; - Region SelectionRect; - short StartX, StartY; - //int action; - - // following variables used for touch scroll areas - bool touchScrollAreasEnabled; // true, if scroll areas enabled - bool touched; // true, if player touched screen (left button down and hold) - unsigned int scrollAreasWidth; // scroll areas width - -public: - Door* overDoor; - Container* overContainer; - InfoPoint* overInfoPoint; - - // allow targetting allies, enemies and/or neutrals (bitmask) - int target_types; -private: - // currently selected targetting type, such as talk, attack, cast, ... - // private to enforce proper cursor changes - int target_mode; - unsigned char lastCursor; - short moveX, moveY; - int numScrollCursor; - bool scrolling; - unsigned short lastMouseX, lastMouseY; - int DebugFlags; - Point pfs; - PathNode* drawPath; - unsigned long AIUpdateCounter; - int ScreenFlags; - int DialogueFlags; - char *DisplayText; - unsigned int DisplayTextTime; - bool EnableRunning; -public: //Events - /** Key Press Event */ - void OnKeyPress(unsigned char Key, unsigned short Mod); - /** Key Release Event */ - void OnKeyRelease(unsigned char Key, unsigned short Mod); - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Global Mouse Move Event */ - void OnGlobalMouseMove(unsigned short x, unsigned short y); - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Special Key Press */ - void OnSpecialKeyPress(unsigned char Key); - void DisplayTooltip(); - void UpdateScrolling(); - void SetTargetMode(int mode); - int GetTargetMode() { return target_mode; } - void SetScreenFlags(int value, int mode); - void SetDialogueFlags(int value, int mode); - int GetScreenFlags() { return ScreenFlags; } - int GetDialogueFlags() { return DialogueFlags; } - /** this function is called from the area when autosave is needed */ - void AutoSave(); - void SetDisplayText(char *text, unsigned int time); - void SetDisplayText(ieStrRef text, unsigned int time); - /* centers viewport to the points specified */ - void Center(unsigned short x, unsigned short y); -private: - /** this function is called when the user presses 'q' (or equivalent) */ - void QuickSave(); - /** this function safely retrieves an Actor by ID */ - Actor *GetActorByGlobalID(ieDword ID); - void CalculateSelection(const Point &p); - void ResizeDel(Window* win, int type); - void ResizeAdd(Window* win, int type); - void HandleWindowHide(const char *WindowName, const char *WindowPosition); - void HandleWindowReveal(const char *WindowName, const char *WindowPosition); - void ReadFormations(); - /** Draws an arrow on the edge of the screen based on the point (points at offscreen actors) */ - void DrawArrowMarker(const Region &screen, Point p, const Region &viewport); - -private: - unsigned char LeftCount, BottomCount, RightCount, TopCount; - Actor *user; //the user of item or spell -public: - DialogHandler *dialoghandler; - //the name of the spell to cast - ieResRef spellName; - //using spell or item - int spellOrItem; // -1 = item, otherwise the spell type - //the user of spell or item - Actor *spellUser; - int spellSlot, spellIndex; //or inventorySlot/itemHeader - int spellCount; //multiple targeting -public: - /** Selects one or all PC */ - void SelectActor(int whom, int type = -1); - void SetLastActor(Actor *actor, Actor *prevActor); - void SetCutSceneMode(bool active); - int HideGUI(); - int UnhideGUI(); - void TryToAttack(Actor *source, Actor *target); - void TryToCast(Actor *source, const Point &p); - void TryToCast(Actor *source, Actor *target); - void TryToDefend(Actor *source, Actor *target); - void TryToTalk(Actor *source, Actor *target); - void TryToPick(Actor *source, Actor *tgt); - void TryToPick(Actor *source, Door *tgt); - void TryToPick(Actor *source, Container *tgt); - void TryToDisarm(Actor *source, InfoPoint *tgt); - void PerformActionOn(Actor *actor); - void ResetTargetMode(); - void UpdateTargetMode(); - - // returns the default cursor fitting the targeting mode - int GetDefaultCursor() const; - //containers - int GetCursorOverContainer(Container *overContainer) const; - void HandleContainer(Container *container, Actor *actor); - //doors - int GetCursorOverDoor(Door *overDoor) const; - void HandleDoor(Door *door, Actor *actor); - //infopoints - int GetCursorOverInfoPoint(InfoPoint *overInfoPoint) const; - bool HandleActiveRegion(InfoPoint *trap, Actor *actor, Point &p); - - Point GetFormationOffset(ieDword formation, ieDword pos); - void MoveToPointFormation(Actor *actor, unsigned int pos, Point src, Point p); - /** calls MoveToPoint or RunToPoint */ - void CreateMovement(Actor *actor, const Point &p); - /** Displays a string over an object */ - void DisplayString(Scriptable* target); - /** Displays a string on screen */ - void DisplayString(const Point &p, const char *Text); - Actor *GetLastActor(); - /** changes map to the current PC */ - void ChangeMap(Actor *pc, bool forced); - /** Returns game screenshot, with or without GUI controls */ - Sprite2D* GetScreenshot( bool show_gui = 0 ); - /** Returns current area preview for saving a game */ - Sprite2D* GetPreview(); - /** Returns PC portrait for a currently running game */ - Sprite2D* GetPortraitPreview(int pcslot); - /** Sets up targeting with spells or items */ - void SetupItemUse(int slot, int header, Actor *actor, int targettype, int cnt); - /** Page is the spell type + spell level info */ - void SetupCasting(ieResRef spellname, int type, int level, int slot, Actor *actor, int targettype, int cnt); - bool SetEvent(int eventType, EventHandler handler); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp deleted file mode 100644 index 6579e61f3..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Label.h" - -#include "win32def.h" - -#include "GameData.h" -#include "Interface.h" -#include "Palette.h" -#include "Sprite2D.h" -#include "Variables.h" -#include "Video.h" -#include "GUI/Window.h" - -Label::Label(Font* font) -{ - this->font = font; - Buffer = NULL; - useRGB = false; - ResetEventHandler( LabelOnPress ); - - Alignment = IE_FONT_ALIGN_CENTER|IE_FONT_ALIGN_MIDDLE; - palette = NULL; -} -Label::~Label() -{ - gamedata->FreePalette( palette ); - if (Buffer) { - free( Buffer ); - } -} -/** Draws the Control on the Output Display */ -void Label::Draw(unsigned short x, unsigned short y) -{ - if (!Changed && !(Owner->Flags&WF_FLOAT)) { - return; - } - Changed = false; - if (XPos == 65535) { - return; - } - if (font && Buffer) { - font->Print( Region( this->XPos + x, this->YPos + y, - this->Width, this->Height ), ( unsigned char * ) Buffer, - useRGB?palette:NULL, - Alignment | IE_FONT_SINGLE_LINE, true ); - } - - if (AnimPicture) { - int xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); - int yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); - Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(AnimPicture->Width), AnimPicture->Height ); - core->GetVideoDriver()->BlitSprite( AnimPicture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); - } - -} -/** This function sets the actual Label Text */ -void Label::SetText(const char* string) -{ - if (Buffer ) - free( Buffer ); - if (Alignment == IE_FONT_ALIGN_CENTER) { - if (core->HasFeature( GF_LOWER_LABEL_TEXT )) { - int len = strlen(string); - Buffer = (char *) malloc( len+1 ); - strnlwrcpy( Buffer, string, len ); - } - else { - Buffer = strdup( string ); - } - } - else { - Buffer = strdup( string ); - } - if (!palette) { - Color white = {0xff, 0xff, 0xff, 0x00}, black = {0x00, 0x00, 0x00, 0x00}; - SetColor(white, black); - } - if (Owner) { - Owner->Invalidate(); - } -} -/** Sets the Foreground Font Color */ -void Label::SetColor(Color col, Color bac) -{ - gamedata->FreePalette( palette ); - palette = core->CreatePalette( col, bac ); - Changed = true; -} - -void Label::SetAlignment(unsigned char Alignment) -{ - this->Alignment = Alignment; - if (Alignment == IE_FONT_ALIGN_CENTER) { - if (core->HasFeature( GF_LOWER_LABEL_TEXT )) { - strlwr( Buffer ); - } - } - Changed = true; -} - -void Label::OnMouseUp(unsigned short x, unsigned short y, - unsigned short /*Button*/, unsigned short /*Mod*/) -{ - //print( "Label::OnMouseUp\n" ); - if (( x <= Width ) && ( y <= Height )) { - if (VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Value ); - } - if (LabelOnPress) { - RunEventHandler( LabelOnPress ); - } - } -} - -bool Label::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_LABEL_ON_PRESS: - LabelOnPress = handler; - break; - default: - return false; - } - - return true; -} - -/** Simply returns the pointer to the text, don't modify it! */ -const char* Label::QueryText() const -{ - return ( const char * ) Buffer; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Label.h b/project/jni/application/gemrb/gemrb/core/GUI/Label.h deleted file mode 100644 index 20ef5f9fc..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Label.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Label.h - * Declares Label widget for displaying static texts - * @author GemRB Developement Team - */ - -#ifndef LABEL_H -#define LABEL_H - -#include "GUI/Control.h" - -#include "RGBAColor.h" -#include "exports.h" - -#include "Font.h" - -class Palette; - -// !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_LABEL_ON_PRESS 0x06000000 - -/** - * @class Label - * Label widget for displaying static texts in the GUI - */ - -class GEM_EXPORT Label : public Control { -public: - Label(Font* font); - ~Label(); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** This function sets the actual Label Text */ - void SetText(const char* string); - /** Sets the Foreground Font Color */ - void SetColor(Color col, Color bac); - /** Sets the Alignment of Text */ - void SetAlignment(unsigned char Alignment); - /** Simply returns the pointer to the text, don't modify it! */ - const char* QueryText() const; - - /** Mouse Button Down */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** Use the RGB Color for the Font */ - bool useRGB; - /** OnPress Scripted Event Function Name */ - EventHandler LabelOnPress; -private: // Private attributes - /** Text String Buffer */ - char* Buffer; - /** Font for Text Writing */ - Font* font; - /** Foreground & Background Colors */ - Palette* palette; - - /** Alignment Variable */ - unsigned char Alignment; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp deleted file mode 100644 index 459c438e4..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp +++ /dev/null @@ -1,540 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "GUI/MapControl.h" - -#include "win32def.h" - -#include "Game.h" -#include "GlobalTimer.h" -#include "Interface.h" -#include "Map.h" -#include "Sprite2D.h" -#include "Video.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" -#include "Scriptable/Actor.h" - -#define MAP_NO_NOTES 0 -#define MAP_VIEW_NOTES 1 -#define MAP_SET_NOTE 2 -#define MAP_REVEAL 3 - -// Ratio between pixel sizes of an Area (Big map) and a Small map - -static int MAP_DIV = 3; -static int MAP_MULT = 32; - -typedef enum {black=0, gray, violet, green, orange, red, blue, darkblue, darkgreen} colorcode; - -Color colors[]={ - { 0x00, 0x00, 0x00, 0xff }, //black - { 0x60, 0x60, 0x60, 0xff }, //gray - { 0xa0, 0x00, 0xa0, 0xff }, //violet - { 0x00, 0xff, 0x00, 0xff }, //green - { 0xff, 0xff, 0x00, 0xff }, //orange - { 0xff, 0x00, 0x00, 0xff }, //red - { 0x00, 0x00, 0xff, 0xff }, //blue - { 0x00, 0x00, 0x80, 0xff }, //darkblue - { 0x00, 0x80, 0x00, 0xff } //darkgreen -}; - -#define MAP_TO_SCREENX(x) (XWin + XPos + XCenter - ScrollX + (x)) -#define MAP_TO_SCREENY(y) (YWin + YPos + YCenter - ScrollY + (y)) -// Omit [XY]Pos, since these macros are used in OnMouseDown(x, y), and x, y is -// already relative to control [XY]Pos there -#define SCREEN_TO_MAPX(x) ((x) - XCenter + ScrollX) -#define SCREEN_TO_MAPY(y) ((y) - YCenter + ScrollY) - -#define GAME_TO_SCREENX(x) MAP_TO_SCREENX((int)((x) * MAP_DIV / MAP_MULT)) -#define GAME_TO_SCREENY(y) MAP_TO_SCREENY((int)((y) * MAP_DIV / MAP_MULT)) - -#define SCREEN_TO_GAMEX(x) (SCREEN_TO_MAPX(x) * MAP_MULT / MAP_DIV) -#define SCREEN_TO_GAMEY(y) (SCREEN_TO_MAPY(y) * MAP_MULT / MAP_DIV) - -MapControl::MapControl(void) -{ - if (core->HasFeature(GF_IWD_MAP_DIMENSIONS) ) { - MAP_DIV=4; - MAP_MULT=32; - } else { - MAP_DIV=3; - MAP_MULT=32; - } - - LinkedLabel = NULL; - ScrollX = 0; - ScrollY = 0; - NotePosX = 0; - NotePosY = 0; - mouseIsDown = false; - mouseIsDragging = false; - Changed = true; - convertToGame = true; - memset(Flag,0,sizeof(Flag) ); - - // initialize var and event callback to no-ops - VarName[0] = 0; - ResetEventHandler( MapControlOnPress ); - ResetEventHandler( MapControlOnRightPress ); - ResetEventHandler( MapControlOnDoublePress ); - - MyMap = core->GetGame()->GetCurrentArea(); - if (MyMap->SmallMap) { - MapMOS = MyMap->SmallMap; - MapMOS->acquire(); - } else - MapMOS = NULL; -} - -MapControl::~MapControl(void) -{ - Video *video = core->GetVideoDriver(); - - if (MapMOS) { - video->FreeSprite(MapMOS); - } - for(int i=0;i<8;i++) { - if (Flag[i]) { - video->FreeSprite(Flag[i]); - } - } -} - -// Draw fog on the small bitmap -void MapControl::DrawFog(unsigned short XWin, unsigned short YWin) -{ - Video *video = core->GetVideoDriver(); - - Region old_clip; - video->GetClipRect(old_clip); - - Region r( XWin + XPos, YWin + YPos, Width, Height ); - video->SetClipRect(&r); - - // FIXME: this is ugly, the knowledge of Map and ExploredMask - // sizes should be in Map.cpp - int w = MyMap->GetWidth() / 2; - int h = MyMap->GetHeight() / 2; - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - Point p( (short) (MAP_MULT * x), (short) (MAP_MULT * y) ); - bool visible = MyMap->IsVisible( p, true ); - if (! visible) { - Region rgn = Region ( MAP_TO_SCREENX(MAP_DIV * x), MAP_TO_SCREENY(MAP_DIV * y), MAP_DIV, MAP_DIV ); - video->DrawRect( rgn, colors[black] ); - } - } - } - - video->SetClipRect(&old_clip); -} - -// To be called after changes in control's or screen geometry -void MapControl::Realize() -{ - // FIXME: ugly!! How to get area size in pixels? - //Map *map = core->GetGame()->GetCurrentMap(); - //MapWidth = map->GetWidth(); - //MapHeight = map->GetHeight(); - - if (MapMOS) { - MapWidth = (short) MapMOS->Width; - MapHeight = (short) MapMOS->Height; - } else { - MapWidth = 0; - MapHeight = 0; - } - - // FIXME: ugly hack! What is the actual viewport size? - ViewWidth = (short) (core->Width * MAP_DIV / MAP_MULT); - ViewHeight = (short) (core->Height * MAP_DIV / MAP_MULT); - - XCenter = (short) (Width - MapWidth ) / 2; - YCenter = (short) (Height - MapHeight ) / 2; - if (XCenter < 0) XCenter = 0; - if (YCenter < 0) YCenter = 0; -} - -void MapControl::RedrawMapControl(const char *VariableName, unsigned int Sum) -{ - if (strnicmp( VarName, VariableName, MAX_VARIABLE_LENGTH )) { - return; - } - Value = Sum; - Changed = true; -} - -/** Draws the Control on the Output Display */ -void MapControl::Draw(unsigned short XWin, unsigned short YWin) -{ - if (!Width || !Height) { - return; - } - if (Owner->Visible!=WINDOW_VISIBLE) { - return; - } - - if (Changed) { - Realize(); - Changed = false; - } - - // we're going to paint over labels/etc, so they need to repaint! - bool seen_this = false; - unsigned int i; - for (i = 0; i < Owner->GetControlCount(); i++) { - Control *ctrl = Owner->GetControl(i); - if (!ctrl) continue; - - // we could try working out which controls overlap, - // but the later controls are cheap to paint.. - if (ctrl == this) { seen_this = true; continue; } - if (!seen_this) continue; - - ctrl->Changed = true; - } - - Video* video = core->GetVideoDriver(); - Region r( XWin + XPos, YWin + YPos, Width, Height ); - - if (MapMOS) { - video->BlitSprite( MapMOS, MAP_TO_SCREENX(0), MAP_TO_SCREENY(0), true, &r ); - } - - if (core->FogOfWar&FOG_DRAWFOG) - DrawFog(XWin, YWin); - - Region vp = video->GetViewport(); - - vp.x = GAME_TO_SCREENX(vp.x); - vp.y = GAME_TO_SCREENY(vp.y); - vp.w = ViewWidth; - vp.h = ViewHeight; - - if ((vp.x + vp.w) >= MAP_TO_SCREENX( Width )) - vp.w = MAP_TO_SCREENX( Width ) - vp.x; - if ((vp.y + vp.h) >= MAP_TO_SCREENY( Height )) - vp.h = MAP_TO_SCREENY( Height ) - vp.y; - - video->DrawRect( vp, colors[green], false, false ); - - // Draw PCs' ellipses - Game *game = core->GetGame(); - i = game->GetPartySize(true); - while (i--) { - Actor* actor = game->GetPC( i, true ); - if (MyMap->HasActor(actor) ) { - video->DrawEllipse( (short) GAME_TO_SCREENX(actor->Pos.x), (short) GAME_TO_SCREENY(actor->Pos.y), 3, 2, actor->Selected ? colors[green] : colors[darkgreen], false ); - } - } - // Draw Map notes, could be turned off in bg2 - // we use the common control value to handle it, because then we - // don't need another interface - if (Value!=MAP_NO_NOTES) { - i = MyMap -> GetMapNoteCount(); - while (i--) { - MapNote * mn = MyMap -> GetMapNote(i); - Sprite2D *anim = Flag[mn->color&7]; - Point pos = mn->Pos; - if (convertToGame) { - vp.x = GAME_TO_SCREENX(mn->Pos.x); - vp.y = GAME_TO_SCREENY(mn->Pos.y); - } else { //pst style - vp.x = MAP_TO_SCREENX(mn->Pos.x); - vp.y = MAP_TO_SCREENY(mn->Pos.y); - pos.x = pos.x * MAP_MULT / MAP_DIV; - pos.y = pos.y * MAP_MULT / MAP_DIV; - } - - //Skip unexplored map notes - bool visible = MyMap->IsVisible( pos, true ); - if (!visible) - continue; - - if (anim) { - video->BlitSprite( anim, vp.x - anim->Width/2, vp.y - anim->Height/2, true, &r ); - } else { - video->DrawEllipse( (short) vp.x, (short) vp.y, 6, 5, colors[mn->color&7], false ); - } - } - } -} - -/** Key Press Event */ -void MapControl::OnKeyPress(unsigned char /*Key*/, unsigned short /*Mod*/) -{ -} - -/** Key Release Event */ -void MapControl::OnKeyRelease(unsigned char Key, unsigned short Mod) -{ - switch (Key) { - case '\t': - //not GEM_TAB - print( "TAB released\n" ); - return; - case 'f': - if (Mod & GEM_MOD_CTRL) - core->GetVideoDriver()->ToggleFullscreenMode(); - break; - default: - break; - } - if (!core->CheatEnabled()) { - return; - } -} -/** Mouse Over Event */ -void MapControl::OnMouseOver(unsigned short x, unsigned short y) -{ - if (mouseIsDown) { - ScrollX -= x - lastMouseX; - ScrollY -= y - lastMouseY; - - if (ScrollX > MapWidth - Width) - ScrollX = MapWidth - Width; - if (ScrollY > MapHeight - Height) - ScrollY = MapHeight - Height; - if (ScrollX < 0) - ScrollX = 0; - if (ScrollY < 0) - ScrollY = 0; - } - - if (mouseIsDragging) { - ViewHandle(x,y); - } - - lastMouseX = x; - lastMouseY = y; - - switch (Value) { - case MAP_REVEAL: //for farsee effect - Owner->Cursor = IE_CURSOR_CAST; - break; - case MAP_SET_NOTE: - Owner->Cursor = IE_CURSOR_GRAB; - break; - default: - Owner->Cursor = IE_CURSOR_NORMAL; - break; - } - - if (Value == MAP_VIEW_NOTES || Value == MAP_SET_NOTE || Value == MAP_REVEAL) { - Point mp; - unsigned int dist; - - if (convertToGame) { - mp.x = (short) SCREEN_TO_GAMEX(x); - mp.y = (short) SCREEN_TO_GAMEY(y); - dist = 100; - } else { - mp.x = (short) SCREEN_TO_MAPX(x); - mp.y = (short) SCREEN_TO_MAPY(y); - dist = 16; - } - int i = MyMap -> GetMapNoteCount(); - while (i--) { - MapNote * mn = MyMap -> GetMapNote(i); - if (Distance(mp, mn->Pos)SetText( mn->text ); - } - NotePosX = mn->Pos.x; - NotePosY = mn->Pos.y; - return; - } - } - NotePosX = mp.x; - NotePosY = mp.y; - } - if (LinkedLabel) { - LinkedLabel->SetText( "" ); - } -} - -/** Mouse Leave Event */ -void MapControl::OnMouseLeave(unsigned short /*x*/, unsigned short /*y*/) -{ - Owner->Cursor = IE_CURSOR_NORMAL; -} - -void MapControl::ClickHandle(unsigned short Button) -{ - core->GetDictionary()->SetAt( "MapControlX", NotePosX ); - core->GetDictionary()->SetAt( "MapControlY", NotePosY ); - switch(Button&GEM_MB_NORMAL) { - case GEM_MB_ACTION: - if (Button&GEM_MB_DOUBLECLICK) { - RunEventHandler( MapControlOnDoublePress ); - } else { - RunEventHandler( MapControlOnPress ); - } - break; - case GEM_MB_MENU: - RunEventHandler( MapControlOnRightPress ); - break; - default: - break; - } -} - -void MapControl::ViewHandle(unsigned short x, unsigned short y) -{ - short xp = (short) (SCREEN_TO_MAPX(x) - ViewWidth / 2); - short yp = (short) (SCREEN_TO_MAPY(y) - ViewHeight / 2); - - if (xp + ViewWidth > MapWidth) xp = MapWidth - ViewWidth; - if (yp + ViewHeight > MapHeight) yp = MapHeight - ViewHeight; - if (xp < 0) xp = 0; - if (yp < 0) yp = 0; - - // clear any previously scheduled moves and then do it asap, so it works while paused - unsigned int vpx = xp * MAP_MULT / MAP_DIV; - unsigned int vpy = yp * MAP_MULT / MAP_DIV; - core->timer->SetMoveViewPort( vpx, vpy, 0, false ); - core->GetVideoDriver()->MoveViewportTo( vpx, vpy ); -} - -/** Mouse Button Down */ -void MapControl::OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short /*Mod*/) -{ - switch((unsigned char) Button) { - case GEM_MB_SCRLUP: - OnSpecialKeyPress(GEM_UP); - return; - case GEM_MB_SCRLDOWN: - OnSpecialKeyPress(GEM_DOWN); - return; - case GEM_MB_ACTION: - if (Button & GEM_MB_DOUBLECLICK) { - ClickHandle(Button); - } - break; - default: - break; - } - - mouseIsDown = true; - short xp = (short) (SCREEN_TO_GAMEX(x)); - short yp = (short) (SCREEN_TO_GAMEY(y)); - Region vp = core->GetVideoDriver()->GetViewport(); - vp.w = vp.x+ViewWidth*MAP_MULT/MAP_DIV; - vp.h = vp.y+ViewHeight*MAP_MULT/MAP_DIV; - if ((xp>vp.x) && (xpvp.y) && (yp MapWidth - Width) - ScrollX = MapWidth - Width; - if (ScrollY > MapHeight - Height) - ScrollY = MapHeight - Height; - if (ScrollX < 0) - ScrollX = 0; - if (ScrollY < 0) - ScrollY = 0; -} - -bool MapControl::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_MAP_ON_PRESS: - MapControlOnPress = handler; - break; - case IE_GUI_MAP_ON_RIGHT_PRESS: - MapControlOnRightPress = handler; - break; - case IE_GUI_MAP_ON_DOUBLE_PRESS: - MapControlOnDoublePress = handler; - break; - default: - return false; - } - - return true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h deleted file mode 100644 index 44ecec887..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h +++ /dev/null @@ -1,108 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file MapControl.h - * Declares MapControl, widget for displaying current area map - */ - -class MapControl; - -#ifndef MAPCONTROL_H -#define MAPCONTROL_H - -#include "GUI/Control.h" - -#include "exports.h" -#include "Interface.h" - -// !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_MAP_ON_PRESS 0x09000000 -#define IE_GUI_MAP_ON_RIGHT_PRESS 0x09000005 -#define IE_GUI_MAP_ON_DOUBLE_PRESS 0x09000008 - - -/** - * @class MapControl - * Widget displaying current area map, with a viewport rectangle - * and PCs' ground circles - */ - -class GEM_EXPORT MapControl : public Control { -public: - int ScrollX, ScrollY; - int NotePosX, NotePosY; - unsigned short lastMouseX, lastMouseY; - bool mouseIsDown; - bool mouseIsDragging; - bool convertToGame; - // Small map bitmap - Sprite2D* MapMOS; - // current map - Map *MyMap; - // map flags - Sprite2D *Flag[8]; - // The MapControl can set the text of this label directly - Control *LinkedLabel; - // Size of big map (area) in pixels - short MapWidth, MapHeight; - // Size of area viewport. FIXME: hack! - short ViewWidth, ViewHeight; - short XCenter, YCenter; - EventHandler MapControlOnPress; - EventHandler MapControlOnRightPress; - EventHandler MapControlOnDoublePress; - - MapControl(void); - ~MapControl(void); - /** redraws the control after its associated variable has changed */ - void RedrawMapControl(const char *VariableName, unsigned int Sum); - /** Draws the Control on the Output Display */ - void Draw(unsigned short XWin, unsigned short YWin); - void DrawFog(unsigned short XWin, unsigned short YWin); - /** Compute parameters after changes in control's or screen geometry */ - void Realize(); - - /** Key Press Event */ - void OnKeyPress(unsigned char Key, unsigned short Mod); - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Mouse Leave Event */ - void OnMouseLeave(unsigned short x, unsigned short y); - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Key Release Event */ - void OnKeyRelease(unsigned char Key, unsigned short Mod); - /** Special Key Press */ - void OnSpecialKeyPress(unsigned char Key); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); -private: - /** Call event handler on click */ - void ClickHandle(unsigned short Button); - /** Move viewport */ - void ViewHandle(unsigned short x, unsigned short y); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp deleted file mode 100644 index 1c09586d1..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Progressbar.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Video.h" -#include "GUI/Window.h" - -#include - -Progressbar::Progressbar( unsigned short KnobStepsCount, bool Clear) -{ - BackGround = NULL; - BackGround2 = NULL; - this->Clear = Clear; - this->KnobStepsCount = KnobStepsCount; - PBarAnim = NULL; - PBarCap = NULL; - KnobXPos = KnobYPos = 0; - CapXPos = CapYPos = 0; - ResetEventHandler( EndReached ); -} - -Progressbar::~Progressbar() -{ - if (!Clear) { - return; - } - core->GetVideoDriver()->FreeSprite( BackGround ); - core->GetVideoDriver()->FreeSprite( BackGround2 ); - delete PBarAnim; - core->GetVideoDriver()->FreeSprite( PBarCap ); -} - -/** Draws the Control on the Output Display */ -void Progressbar::Draw(unsigned short x, unsigned short y) -{ - //it is unlikely that a floating window is above us, but... - if (!Changed && !(Owner->Flags&WF_FLOAT) ) { - return; - } - Changed = false; - if (XPos == 65535) { - return; - } - Sprite2D *bcksprite; - - if((Value >= 100) && KnobStepsCount && BackGround2) { - bcksprite=BackGround2; //animated progbar end stage - } - else { - bcksprite=BackGround; - } - if (bcksprite) { - Region r( x + XPos, y + YPos, Width, Height ); - core->GetVideoDriver()->BlitSprite( bcksprite, - x + XPos, y + YPos, true, &r ); - if( bcksprite==BackGround2) { - return; //done for animated progbar - } - } - - unsigned int Count; - - if(!KnobStepsCount) { - //linear progressbar (pst, iwd) - int w = BackGround2->Width; - int h = BackGround2->Height; - //this is the PST/IWD specific part - Count = Value*w/100; - Region r( x + XPos + KnobXPos, y + YPos + KnobYPos, Count, h ); - core->GetVideoDriver()->BlitSprite( BackGround2, - r.x, r.y, true, &r ); - - core->GetVideoDriver()->BlitSprite( PBarCap, - x+XPos+CapXPos+Count-PBarCap->Width, y+YPos+CapYPos, true ); - return; - } - - //animated progressbar (bg2) - Count=Value*KnobStepsCount/100; - for(unsigned int i=0; iGetFrame(i); - core->GetVideoDriver()->BlitSprite( Knob, x , y , true ); - } -} - -/** Returns the actual Progressbar Position */ -unsigned int Progressbar::GetPosition() -{ - return Value; -} - -/** Sets the actual Progressbar Position trimming to the Max and Min Values */ -void Progressbar::SetPosition(unsigned int pos) -{ - if(pos>100) pos=100; - if (Value == pos) - return; - Value = pos; - Changed = true; -} - -void Progressbar::RedrawProgressbar(const char* VariableName, int Sum) -{ - if (strnicmp( VarName, VariableName, MAX_VARIABLE_LENGTH )) { - return; - } - SetPosition((unsigned int) Sum); - if((Value==100) && Changed) - RunEventHandler( EndReached ); -} - -/** Sets the selected image */ -void Progressbar::SetImage(Sprite2D* img, Sprite2D* img2) -{ - if (BackGround && Clear) - core->GetVideoDriver()->FreeSprite( BackGround ); - BackGround = img; - if (BackGround2 && Clear) - core->GetVideoDriver()->FreeSprite( BackGround2 ); - BackGround2 = img2; - Changed = true; -} - -void Progressbar::SetBarCap(Sprite2D* img3) -{ - core->GetVideoDriver()->FreeSprite( PBarCap ); - PBarCap = img3; -} - -void Progressbar::SetAnimation(Animation *arg) -{ - delete PBarAnim; - PBarAnim = arg; -} - -void Progressbar::SetSliderPos(int x, int y, int x2, int y2) -{ - KnobXPos=x; - KnobYPos=y; - CapXPos=x2; - CapYPos=y2; -} - -bool Progressbar::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_PROGRESS_END_REACHED: - EndReached = handler; - break; - default: - return false; - } - - return true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h deleted file mode 100644 index 6a777c42f..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h +++ /dev/null @@ -1,87 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2005 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Progressbar.h - * Declares Progressbar widget for displaying progress of loading and saving games - */ - -#ifndef PROGRESSBAR_H -#define PROGRESSBAR_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include "Animation.h" -#include "Sprite2D.h" - -// !!! Keep in sync with GUIDefines.py !!! -#define IE_GUI_PROGRESS_END_REACHED 0x01000000 - - -/** - * @class Progressbar - * Widget for displaying progressbars, mainly on loading/saving screens - */ - -class GEM_EXPORT Progressbar : public Control { -public: - Progressbar(unsigned short KnobStepsCount, bool Clear = false); - ~Progressbar(); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Returns the actual Progressbar Position */ - unsigned int GetPosition(); - /** Sets the actual Progressbar Position trimming to the Max and Min Values */ - void SetPosition(unsigned int pos); - /** Sets the background images */ - void SetImage(Sprite2D * img, Sprite2D * img2); - /** Sets a bam resource for progressbar */ - void SetAnimation(Animation *arg); - /** Sets a mos resource for progressbar cap */ - void SetBarCap(Sprite2D *img3); - /** Sets the mos coordinates for the progressbar filler mos/cap */ - void SetSliderPos(int x, int y, int x2, int y2); - /** Redraws a progressbar which is associated with VariableName */ - void RedrawProgressbar(const char *VariableName, int Sum); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - -private: // Private attributes - /** BackGround Images. If smaller than the Control Size, the image will be tiled. */ - Sprite2D * BackGround; - Sprite2D * BackGround2; //mos resource for the filling of the bar - /** Knob Steps Count */ - unsigned int KnobStepsCount; - int KnobXPos, KnobYPos; //relative coordinates for Background2 - int CapXPos, CapYPos; //relative coordinates for PBarCap - /** If true, on deletion the Progressbar will destroy the associated images */ - bool Clear; - /** The bam cycle whose frames work as a progressbar (animated progressbar) */ - Animation *PBarAnim; - /** The most for the progressbar cap (linear progressbar) */ - Sprite2D *PBarCap; -public: - /** EndReached Scripted Event Function Name */ - EventHandler EndReached; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp deleted file mode 100644 index 3893c684f..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/ScrollBar.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Variables.h" -#include "Video.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" - -ScrollBar::ScrollBar(void) -{ - Pos = 0; - Value = 10; - State = 0; - ResetEventHandler( ScrollBarOnChange ); - ta = NULL; - for(int i=0;iGetVideoDriver(); - for(int i=0;iFreeSprite(Frames[i]); - } - } -} - -/** Sets a new position, relays the change to an associated textarea and calls - any existing GUI OnChange callback */ -void ScrollBar::SetPos(int NewPos) -{ - if (Pos && ( Pos == NewPos )) { - return; - } - Changed = true; - Pos = (ieWord) NewPos; - if (ta) { - TextArea* t = ( TextArea* ) ta; - t->SetRow( Pos ); - } - if (VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Pos ); - } - RunEventHandler( ScrollBarOnChange ); -} - -/** Refreshes the ScrollBar according to a guiscript variable */ -void ScrollBar::RedrawScrollBar(const char* Variable, int Sum) -{ - if (strnicmp( VarName, Variable, MAX_VARIABLE_LENGTH )) { - return; - } - SetPos( Sum ); -} - -/** Mousewheel support */ -void ScrollBar::ScrollUp() -{ - if (Pos > 0) { - SetPos( Pos - 1 ); - } -} - -/** Mousewheel support */ -void ScrollBar::ScrollDown() -{ - if ( (ieDword) Pos + 1 < Value ) { - SetPos( Pos + 1 ); - } -} - -/** Draws the ScrollBar control */ -void ScrollBar::Draw(unsigned short x, unsigned short y) -{ - if (!Changed && !(Owner->Flags&WF_FLOAT) ) { - return; - } - Changed = false; - if (XPos == 65535) { - return; - } - int upMy = Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Height; - int doMy = Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Height; - unsigned int domy = (Height - doMy); - - unsigned short slmy = ( unsigned short ) - ( upMy + - ( Pos * ( ( domy - Frames[IE_GUI_SCROLLBAR_SLIDER]->Height - upMy ) / - ( double ) ( Value < 2 ? 1 : Value - 1 ) ) ) ); - unsigned short slx = ( unsigned short ) ((Width - Frames[IE_GUI_SCROLLBAR_SLIDER]->Width) / 2 ); - - if (( State & UP_PRESS ) != 0) { - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_UP_PRESSED], - x + XPos, y + YPos, true ); - } else { - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED], - x + XPos, y + YPos, true ); - } - int maxy = y + YPos + Height - - Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Height; - int stepy = Frames[IE_GUI_SCROLLBAR_TROUGH]->Height; - Region rgn( x + XPos, y + YPos + upMy, Width, domy - upMy); - for (int dy = y + YPos + upMy; dy < maxy; dy += stepy) { - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_TROUGH], - x + XPos + ( ( Width / 2 ) - - Frames[IE_GUI_SCROLLBAR_TROUGH]->Width / 2 ), - dy, true, &rgn ); - } - if (( State & DOWN_PRESS ) != 0) { - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_DOWN_PRESSED], - x + XPos, maxy, true ); - } else { - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED], - x + XPos, maxy, true ); - } - core->GetVideoDriver()->BlitSprite( Frames[IE_GUI_SCROLLBAR_SLIDER], - x + XPos + slx + Frames[IE_GUI_SCROLLBAR_SLIDER]->XPos, - y + YPos + slmy + Frames[IE_GUI_SCROLLBAR_SLIDER]->YPos, - true ); -} - -/** Sets a ScrollBar GUI resource */ -void ScrollBar::SetImage(unsigned char type, Sprite2D* img) -{ - if (type >= SB_RES_COUNT) { - return; - } - if (Frames[type]) { - core->GetVideoDriver()->FreeSprite(Frames[type]); - } - Frames[type] = img; - Changed = true; -} - -/** Mouse Button Down */ -void ScrollBar::OnMouseDown(unsigned short x, unsigned short y, - unsigned short Button, unsigned short /*Mod*/) -{ - //removing the double click flag, use a more sophisticated method - //if it is needed later - Button&=GEM_MB_NORMAL; - if (Button==GEM_MB_SCRLUP) { - ScrollUp(); - return; - } - if (Button==GEM_MB_SCRLDOWN) { - ScrollDown(); - return; - } - - core->RedrawAll(); - - unsigned short upMx = (unsigned short) Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Width; - unsigned short upMy = (unsigned short) Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Height; - unsigned short domy = (unsigned short) (Height - Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Height); - unsigned short slheight = domy - upMy; - unsigned short refheight = (unsigned short) (slheight - Frames[IE_GUI_SCROLLBAR_SLIDER]->Height); - double step = refheight / (double) ( Value < 2 ? 1 : Value - 1 ); - unsigned short ymax = upMy + refheight; - unsigned short ymy = y - upMy; - unsigned short doMx = (unsigned short) Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Width; - unsigned short slMx = (unsigned short) Frames[IE_GUI_SCROLLBAR_SLIDER]->Width; - unsigned short slmy = (unsigned short) (upMy + Pos * step); - unsigned short slMy = (unsigned short) (slmy + Frames[IE_GUI_SCROLLBAR_SLIDER]->Height); - if (( x <= upMx ) && ( y <= upMy )) { - if (Pos > 0) - SetPos( Pos - 1 ); - State |= UP_PRESS; - return; - } - if (y >= domy) { - if (( x <= doMx ) && ( y <= Height )) { - if ( (ieDword) Pos + 1 < Value ) - SetPos( Pos + 1 ); - State |= DOWN_PRESS; - return; - } - } - if (y >= slmy) { - if (( x <= slMx ) && ( y <= slMy )) { - State |= SLIDER_GRAB; - return; - } - } - if (y <= upMy) { - SetPos( 0 ); - return; - } - if (y >= ymax) { - SetPos( Value - 1 ); - return; - } - unsigned short befst = ( unsigned short ) ( ymy / step ); - unsigned short aftst = befst + 1; - if (( ymy - ( befst * step ) ) < ( ( aftst * step ) - ymy )) { - SetPos( befst ); - } else { - SetPos( aftst ); - } -} - -/** Mouse Button Up */ -void ScrollBar::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned short /*Button*/, unsigned short /*Mod*/) -{ - Changed = true; - State = 0; -} - -/** Mouse Over Event */ -void ScrollBar::OnMouseOver(unsigned short /*x*/, unsigned short y) -{ - if (( State & SLIDER_GRAB ) != 0) { - core->RedrawAll(); - unsigned short upMy =(unsigned short) Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Height; - unsigned short domy = (unsigned short) (Height - Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Height); - unsigned short slheight = domy - upMy; - unsigned short refheight = (unsigned short) (slheight - Frames[IE_GUI_SCROLLBAR_SLIDER]->Height); - double step = refheight / ( double ) ( Value < 2 ? 1 : Value - 1 ); - unsigned short yzero = (unsigned short) (upMy + Frames[IE_GUI_SCROLLBAR_SLIDER]->Height / 2 ); - unsigned short ymax = yzero + refheight; - unsigned short ymy = y - yzero; - if (y <= yzero) { - SetPos( 0 ); - return; - } - if (y >= ymax) { - SetPos( Value - 1 ); - return; - } - unsigned short befst = ( unsigned short ) ( ymy / step ); - unsigned short aftst = befst + 1; - if (( ymy - ( befst * step ) ) < ( ( aftst * step ) - ymy )) { - if (befst > Value ) - SetPos( befst ); - } else { - if (aftst < Value ) - SetPos( aftst ); - } - } -} - -/** Sets the Maximum Value of the ScrollBar */ -void ScrollBar::SetMax(unsigned short Max) -{ - Value = Max; - if (Max == 0) { - SetPos( 0 ); - } else if (Pos >= Max) { - SetPos( Max - 1 ); - } -} - -/** Sets the ScrollBarOnChange event (guiscript callback) */ -bool ScrollBar::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_SCROLLBAR_ON_CHANGE: - ScrollBarOnChange = handler; - break; - default: - return false; - } - - return true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h deleted file mode 100644 index 3effd49c2..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h +++ /dev/null @@ -1,101 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file ScrollBar.h - * Declares ScrollBar widget for paging in long text windows. - * This does not include scales and sliders, which are of Slider class. - * @author The GemRB Project - */ - -#ifndef SCROLLBAR_H -#define SCROLLBAR_H - -#include "GUI/Control.h" -#include "GUI/TextArea.h" - -#include "exports.h" - -#include "Sprite2D.h" - -// !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_SCROLLBAR_ON_CHANGE 0x07000000 - -#define IE_GUI_SCROLLBAR_DEFAULT 0x00000040 // mousewheel triggers it - -#define IE_GUI_SCROLLBAR_UP_UNPRESSED 0 -#define IE_GUI_SCROLLBAR_UP_PRESSED 1 -#define IE_GUI_SCROLLBAR_DOWN_UNPRESSED 2 -#define IE_GUI_SCROLLBAR_DOWN_PRESSED 3 -#define IE_GUI_SCROLLBAR_TROUGH 4 -#define IE_GUI_SCROLLBAR_SLIDER 5 - -#define UP_PRESS 0x0001 -#define DOWN_PRESS 0x0010 -#define SLIDER_GRAB 0x0100 - -/** - * @class ScrollBar - * Widget displaying scrollbars for paging in long text windows - */ - -#define SB_RES_COUNT 6 - -class GEM_EXPORT ScrollBar : public Control { -public: - ScrollBar(void); - ~ScrollBar(void); - /**sets position, updates associated stuff */ - void SetPos(int NewPos); - void ScrollUp(); - void ScrollDown(); - /**redraws scrollbar if associated with VarName */ - void RedrawScrollBar(const char* VarName, int Sum); - /**/ - void Draw(unsigned short x, unsigned short y); -private: //Private attributes - /** Images for drawing the Scroll Bar */ - Sprite2D* Frames[SB_RES_COUNT]; - /** Cursor Position */ - unsigned short Pos; - /** Scroll Bar Status */ - unsigned short State; -public: - void SetImage(unsigned char type, Sprite2D* img); - /** Sets the Maximum Value of the ScrollBar */ - void SetMax(unsigned short Max); - /** TextArea Associated Control */ - Control* ta; -public: // Public Events - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** OnChange Scripted Event Function Name */ - EventHandler ScrollBarOnChange; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp deleted file mode 100644 index d9e24e2dd..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp +++ /dev/null @@ -1,291 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Slider.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Variables.h" -#include "Video.h" -#include "GUI/Window.h" - -#include - -Slider::Slider(short KnobXPos, short KnobYPos, short KnobStep, - unsigned short KnobStepsCount, bool Clear) -{ - this->KnobXPos = KnobXPos; - this->KnobYPos = KnobYPos; - this->KnobStep = KnobStep; - this->KnobStepsCount = KnobStepsCount; - Knob = NULL; - GrabbedKnob = NULL; - BackGround = NULL; - this->Clear = Clear; - ResetEventHandler( SliderOnChange ); - State = IE_GUI_SLIDER_KNOB; - Pos = 0; - Value = 1; -} - -Slider::~Slider() -{ - if (!Clear) { - return; - } - if (Knob) { - core->GetVideoDriver()->FreeSprite( Knob ); - } - if (GrabbedKnob) { - core->GetVideoDriver()->FreeSprite( GrabbedKnob ); - } - if (BackGround) { - core->GetVideoDriver()->FreeSprite( BackGround ); - } -} - -/** Draws the Control on the Output Display */ -void Slider::Draw(unsigned short x, unsigned short y) -{ - if (!Changed && !(Owner->Flags&WF_FLOAT) ) { - return; - } - Changed = false; - if (XPos == 65535) { - return; - } - Region r( x + XPos, y + YPos, Width, Height ); - if (BackGround) { - if (( BackGround->Width < Width ) || ( BackGround->Height < Height )) { - core->GetVideoDriver()->BlitTiled( r, BackGround, true ); - } else { - core->GetVideoDriver()->BlitSprite( BackGround, x + XPos, y + YPos, true, &r ); - } - } - switch (State) { - case IE_GUI_SLIDER_KNOB: - core->GetVideoDriver()->BlitSprite( Knob, - x + XPos + KnobXPos + ( Pos * KnobStep ), - y + YPos + KnobYPos, true ); - break; - - case IE_GUI_SLIDER_GRABBEDKNOB: - core->GetVideoDriver()->BlitSprite( GrabbedKnob, - x + XPos + KnobXPos + ( Pos * KnobStep ), - y + YPos + KnobYPos, true ); - break; - } -} - -/** Returns the actual Slider Position */ -unsigned int Slider::GetPosition() -{ - return Pos; -} - -/** Sets the actual Slider Position trimming to the Max and Min Values */ -void Slider::SetPosition(unsigned int pos) -{ - if (pos <= KnobStepsCount) { - Pos = pos; - } - if (VarName[0] != 0) { - if (!Value) - Value = 1; - core->GetDictionary()->SetAt( VarName, pos * Value ); - } - Changed = true; -} - -/** Redraws a slider which is associated with VariableName */ -void Slider::RedrawSlider(const char* VariableName, int Sum) -{ - if (strnicmp( VarName, VariableName, MAX_VARIABLE_LENGTH )) { - return; - } - if (!Value) { - Value = 1; - } - Sum /= Value; - if (Sum <= KnobStepsCount) { - Pos = Sum; - } - Changed = true; -} - -/** Sets the selected image */ -void Slider::SetImage(unsigned char type, Sprite2D* img) -{ - switch (type) { - case IE_GUI_SLIDER_KNOB: - if (Knob && Clear) - core->GetVideoDriver()->FreeSprite( Knob ); - Knob = img; - break; - - case IE_GUI_SLIDER_GRABBEDKNOB: - if (GrabbedKnob && Clear) - core->GetVideoDriver()->FreeSprite( GrabbedKnob ); - GrabbedKnob = img; - break; - - case IE_GUI_SLIDER_BACKGROUND: - if (BackGround && Clear) - core->GetVideoDriver()->FreeSprite( BackGround ); - BackGround = img; - break; - } - Changed = true; -} - -/** Mouse Button Down */ -void Slider::OnMouseDown(unsigned short x, unsigned short y, unsigned short /*Button*/, - unsigned short /*Mod*/) -{ - Changed = true; - unsigned int oldPos = Pos; - int mx = (KnobXPos + ( Pos * KnobStep ) - Knob->XPos); - int my = (KnobYPos - Knob->YPos); - int Mx = (mx + Knob->Width); - int My = (my + Knob->Height); - - if (( x >= mx ) && ( y >= my )) { - if (( x <= Mx ) && ( y <= My )) { - State = IE_GUI_SLIDER_GRABBEDKNOB; - } else { - int mx = KnobXPos; - int xmx = x - mx; - if (x < mx) { - SetPosition( 0 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - int befst = xmx / KnobStep; - if (befst >= KnobStepsCount) { - SetPosition( KnobStepsCount - 1 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - int aftst = befst + KnobStep; - if (( xmx - ( befst * KnobStep ) ) < - ( ( aftst * KnobStep ) - xmx )) { - SetPosition( befst ); - } else { - SetPosition( aftst ); - } - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - } - } else { - int mx = KnobXPos; - int xmx = x - mx; - if (x < mx) { - SetPosition( 0 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - int befst = xmx / KnobStep; - if (befst >= KnobStepsCount) { - SetPosition( KnobStepsCount - 1 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - int aftst = befst + KnobStep; - if (( xmx - ( befst * KnobStep ) ) < ( ( aftst * KnobStep ) - xmx )) { - SetPosition( befst ); - } else { - SetPosition( aftst ); - } - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - } -} - -/** Mouse Button Up */ -void Slider::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, unsigned short /*Button*/, - unsigned short /*Mod*/) -{ - if (State != IE_GUI_SLIDER_KNOB) { - Changed = true; - } - State = IE_GUI_SLIDER_KNOB; -} - -/** Mouse Over Event */ -void Slider::OnMouseOver(unsigned short x, unsigned short /*y*/) -{ - Changed = true; - unsigned int oldPos = Pos; - if (State == IE_GUI_SLIDER_GRABBEDKNOB) { - int mx = KnobXPos; - int xmx = x - mx; - if (x < mx) { - SetPosition( 0 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - int befst = xmx / KnobStep; - if (befst >= KnobStepsCount) { - SetPosition( KnobStepsCount - 1 ); - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - return; - } - short aftst = befst + KnobStep; - if (( xmx - ( befst * KnobStep ) ) < ( ( aftst * KnobStep ) - xmx )) { - SetPosition( befst ); - } else { - SetPosition( aftst ); - } - if (oldPos != Pos) { - RunEventHandler( SliderOnChange ); - } - } -} - -/** Sets the slider change event */ -bool Slider::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_SLIDER_ON_CHANGE: - SliderOnChange = handler; - break; - default: - return false; - } - - return true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Slider.h b/project/jni/application/gemrb/gemrb/core/GUI/Slider.h deleted file mode 100644 index 30636082a..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Slider.h +++ /dev/null @@ -1,104 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Slider.h - * Declares Slider widget for displaying scales and sliders for setting - * numerical values - * @author The GemRB Project - */ - -#ifndef SLIDER_H -#define SLIDER_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include "Sprite2D.h" - -// !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_SLIDER_ON_CHANGE 0x02000000 - - -#define IE_GUI_SLIDER_KNOB 0 -#define IE_GUI_SLIDER_GRABBEDKNOB 1 -#define IE_GUI_SLIDER_BACKGROUND 2 - -/** - * @class Slider - * Widget displaying sliders or scales for inputting numerical values - * with a limited range - */ - -class GEM_EXPORT Slider : public Control { -public: - Slider(short KnobXPos, short KnobYPos, short KnobStep, unsigned short KnobStepsCount, bool Clear = false); - ~Slider(); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Returns the actual Slider Position */ - unsigned int GetPosition(); - /** Sets the actual Slider Position trimming to the Max and Min Values */ - void SetPosition(unsigned int pos); - /** Sets the selected image */ - void SetImage(unsigned char type, Sprite2D * img); - /** Sets the State of the Slider */ - void SetState(int arg) { State=(unsigned char) arg; } - /** Redraws a slider which is associated with VariableName */ - void RedrawSlider(const char *VariableName, int Sum); - -private: // Private attributes - /** BackGround Image. If smaller than the Control Size, the image will be tiled. */ - Sprite2D * BackGround; - /** Knob Image */ - Sprite2D * Knob; - /** Grabbed Knob Image */ - Sprite2D * GrabbedKnob; - /** Knob Starting X Position */ - short KnobXPos; - /** Knob Starting Y Position */ - short KnobYPos; - /** Knob Step Size */ - short KnobStep; - /** Knob Steps Count */ - unsigned short KnobStepsCount; - /** If true, on deletion the Slider will destroy the associated images */ - bool Clear; - /** Actual Knob Status */ - unsigned char State; - /** Slider Position Value */ - unsigned int Pos; -public: // Public Events - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** OnChange Scripted Event Function Name */ - EventHandler SliderOnChange; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp deleted file mode 100644 index 9f97eef79..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp +++ /dev/null @@ -1,983 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/TextArea.h" - -#include "GUI/GameControl.h" - -#include "win32def.h" - -#include "Audio.h" -#include "DialogHandler.h" -#include "GameData.h" -#include "ImageMgr.h" -#include "Interface.h" -#include "Palette.h" -#include "Variables.h" -#include "Video.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" -#include "Scriptable/Actor.h" - -#include -#include - -TextArea::TextArea(Color hitextcolor, Color initcolor, Color lowtextcolor) -{ - keeplines = 100; - rows = 0; - startrow = 0; - minrow = 0; - Cursor = NULL; - CurPos = 0; - CurLine = 0; - seltext = -1; - Value = 0xffffffff; - ResetEventHandler( TextAreaOnChange ); - ResetEventHandler( TextAreaOutOfText ); - PortraitResRef[0]=0; - palette = core->CreatePalette( hitextcolor, lowtextcolor ); - initpalette = core->CreatePalette( initcolor, lowtextcolor ); - Color tmp = { - hitextcolor.b, hitextcolor.g, hitextcolor.r, 0 - }; - selected = core->CreatePalette( tmp, lowtextcolor ); - tmp.r = 255; - tmp.g = 152; - tmp.b = 102; - lineselpal = core->CreatePalette( tmp, lowtextcolor ); - InternalFlags = 1; - //Drop Capitals means initials on! - core->GetDictionary()->Lookup("Drop Capitals", InternalFlags); - if (InternalFlags) { - InternalFlags = TA_INITIALS; - } -} - -TextArea::~TextArea(void) -{ - gamedata->FreePalette( palette ); - gamedata->FreePalette( initpalette ); - gamedata->FreePalette( selected ); - gamedata->FreePalette( lineselpal ); - core->GetVideoDriver()->FreeSprite( Cursor ); - for (size_t i = 0; i < lines.size(); i++) { - free( lines[i] ); - } -} - -void TextArea::RefreshSprite(const char *portrait) -{ - if (AnimPicture) { - if (!strnicmp(PortraitResRef, portrait, 8) ) { - return; - } - SetAnimPicture(NULL); - } - strnlwrcpy(PortraitResRef, portrait, 8); - if (!strnicmp(PortraitResRef, "none", 8) ) { - return; - } - ResourceHolder im(PortraitResRef); - if (im == NULL) { - return; - } - - SetAnimPicture ( im->GetSprite2D() ); -} - -void TextArea::Draw(unsigned short x, unsigned short y) -{ - /** Don't come back recursively */ - if (InternalFlags&TA_BITEMYTAIL) { - return; - } - int tx=x+XPos; - int ty=y+YPos; - Region clip( tx, ty, Width, Height ); - Video *video = core->GetVideoDriver(); - - if (Flags&IE_GUI_TEXTAREA_SPEAKER) { - if (AnimPicture) { - video->BlitSprite(AnimPicture, tx,ty, true, &clip); - clip.x+=AnimPicture->Width; - clip.w-=AnimPicture->Width; - } - } - - //this might look better in GlobalTimer - //or you might want to change the animated button to work like this - if (Flags &IE_GUI_TEXTAREA_SMOOTHSCROLL) - { - unsigned long thisTime; - - thisTime = GetTickCount(); - if (thisTime>starttime) { - starttime = thisTime+ticks; - smooth--; - while (smooth<=0) { - smooth+=ftext->maxHeight; - if (startrowInvalidate(); - InternalFlags |= TA_BITEMYTAIL; - Owner->DrawWindow(); - InternalFlags &= ~TA_BITEMYTAIL; - } - } - - if (!Changed && !(Owner->Flags&WF_FLOAT) ) { - return; - } - Changed = false; - - if (XPos == 65535) { - return; - } - size_t linesize = lines.size(); - if (linesize == 0) { - return; - } - - //smooth vertical scrolling up - if (Flags & IE_GUI_TEXTAREA_SMOOTHSCROLL) { - clip.y+=smooth; - clip.h-=smooth; - } - - //if textarea is 'selectable' it actually means, it is a listbox - //in this case the selected value equals the line number - //if it is 'not selectable' it can still have selectable lines - //but then it is like the dialog window in the main game screen: - //the selected value is encoded into the line - if (!(Flags & IE_GUI_TEXTAREA_SELECTABLE) ) { - char* Buffer = (char *) malloc( 1 ); - Buffer[0] = 0; - int len = 0; - int lastlen = 0; - for (size_t i = 0; i < linesize; i++) { - if (strnicmp( "[s=", lines[i], 3 ) == 0) { - int tlen; - unsigned long idx, acolor, bcolor; - char* rest; - idx = strtoul( lines[i] + 3, &rest, 0 ); - if (*rest != ',') - goto notmatched; - acolor = strtoul( rest + 1, &rest, 16 ); - if (*rest != ',') - goto notmatched; - bcolor = strtoul( rest + 1, &rest, 16 ); - if (*rest != ']') - goto notmatched; - tlen = (int)(strstr( rest + 1, "[/s]" ) - rest - 1); - if (tlen < 0) - goto notmatched; - len += tlen + 23; - Buffer = (char *) realloc( Buffer, len + 2 ); - if (seltext == (int) i) { - sprintf( Buffer + lastlen, "[color=%6.6lX]%.*s[/color]", - acolor, tlen, rest + 1 ); - } else { - sprintf( Buffer + lastlen, "[color=%6.6lX]%.*s[/color]", - bcolor, tlen, rest + 1 ); - } - } else { - notmatched: - len += ( int ) strlen( lines[i] ) + 1; - Buffer = (char *) realloc( Buffer, len + 2 ); - memcpy( &Buffer[lastlen], lines[i], len - lastlen ); - } - lastlen = len; - if (i != linesize - 1) { - Buffer[lastlen - 1] = '\n'; - Buffer[lastlen] = 0; - } - } - video->SetClipRect( &clip ); - - int pos; - - if (startrow==CurLine) { - pos = CurPos; - } else { - pos = -1; - } - ftext->PrintFromLine( startrow, clip, - ( unsigned char * ) Buffer, palette, - IE_FONT_ALIGN_LEFT, finit, Cursor, pos ); - free( Buffer ); - video->SetClipRect( NULL ); - //streaming text - if (linesize>50) { - //the buffer is filled enough - return; - } - if (core->GetAudioDrv()->IsSpeaking() ) { - //the narrator is still talking - return; - } - if (RunEventHandler( TextAreaOutOfText )) { - return; - } - if (linesize==lines.size()) { - ResetEventHandler( TextAreaOutOfText ); - return; - } - AppendText("\n",-1); - return; - } - // normal scrolling textarea - int rc = 0; - int sr = startrow; - unsigned int i; - int yl; - for (i = 0; i < linesize; i++) { - if (rc + lrows[i] <= sr) { - rc += lrows[i]; - continue; - } - sr -= rc; - Palette* pal = NULL; - if (seltext == (int) i) - pal = selected; - else if (Value == i) - pal = lineselpal; - else - pal = palette; - ftext->PrintFromLine( sr, clip, - ( unsigned char * ) lines[i], pal, - IE_FONT_ALIGN_LEFT, finit, NULL ); - yl = ftext->size[1].h*(lrows[i]-sr); - clip.y+=yl; - clip.h-=yl; - break; - } - for (i++; i < linesize; i++) { - Palette* pal = NULL; - if (seltext == (int) i) - pal = selected; - else if (Value == i) - pal = lineselpal; - else - pal = palette; - ftext->Print( clip, ( unsigned char * ) lines[i], pal, - IE_FONT_ALIGN_LEFT, true ); - yl = ftext->size[1].h*lrows[i]; - clip.y+=yl; - clip.h-=yl; - - } -} -/** Sets the Scroll Bar Pointer. If 'ptr' is NULL no Scroll Bar will be linked - to this Text Area Control. */ -int TextArea::SetScrollBar(Control* ptr) -{ - int ret = Control::SetScrollBar(ptr); - CalcRowCount(); - return ret; -} - -/** Sets the Actual Text */ -void TextArea::SetText(const char* text) -{ - if (!text[0]) { - Clear(); - } - - int newlen = ( int ) strlen( text ); - - if (lines.size() == 0) { - char* str = (char *) malloc( newlen + 1 ); - memcpy( str, text, newlen + 1 ); - lines.push_back( str ); - lrows.push_back( 0 ); - } else { - lines[0] = (char *) realloc( lines[0], newlen + 1 ); - memcpy( lines[0], text, newlen + 1 ); - } - CurPos = newlen; - CurLine = lines.size()-1; - UpdateControls(); -} - -void TextArea::SetMinRow(bool enable) -{ - if (enable) { - minrow = (int) lines.size(); - } else { - minrow = 0; - } - Changed = true; -} - -//drop lines scrolled out at the top. -//keeplines is the number of lines that should still be -//preserved (for scrollback history) -void TextArea::DiscardLines() -{ - if (rows<=keeplines) { - return; - } - int drop = rows-keeplines; - PopLines(drop, true); -} - -static char *note_const = NULL; -static const char inserted_crap[]="[/color][color=ffffff]"; -#define CRAPLENGTH sizeof(inserted_crap)-1 - -void TextArea::SetNoteString(const char *s) -{ - free(note_const); - if (s) { - note_const = (char *) malloc(strlen(s)+5); - sprintf(note_const, "\r\n\r\n%s", s); - } -} - -/** Appends a String to the current Text */ -int TextArea::AppendText(const char* text, int pos) -{ - int ret = 0; - if (pos >= ( int ) lines.size()) { - return -1; - } - int newlen = ( int ) strlen( text ); - - if (pos == -1) { - const char *note = NULL; - if (note_const) { - note = strstr(text,note_const); - } - char *str; - if (NULL == note) { - str = (char *) malloc( newlen +1 ); - memcpy(str, text, newlen+1); - } - else { - unsigned int notepos = (unsigned int) (note - text); - str = (char *) malloc( newlen + CRAPLENGTH+1 ); - memcpy(str,text,notepos); - memcpy(str+notepos,inserted_crap,CRAPLENGTH); - memcpy(str+notepos+CRAPLENGTH, text+notepos, newlen-notepos+1); - } - lines.push_back( str ); - lrows.push_back( 0 ); - ret =(int) (lines.size() - 1); - } else { - int mylen = ( int ) strlen( lines[pos] ); - - lines[pos] = (char *) realloc( lines[pos], mylen + newlen + 1 ); - memcpy( lines[pos]+mylen, text, newlen + 1 ); - ret = pos; - } - - //if the textarea is not a listbox, then discard scrolled out - //lines - if (Flags&IE_GUI_TEXTAREA_HISTORY) { - DiscardLines(); - } - - UpdateControls(); - return ret; -} - -/** Deletes last or first `count' lines */ -/** Probably not too optimal for many lines, but it isn't used */ -/** for many lines */ -void TextArea::PopLines(unsigned int count, bool top) -{ - if (count > lines.size()) { - count = (unsigned int) lines.size(); - } - - while (count > 0 ) { - if (top) { - int tmp = lrows.front(); - if (minrow || (startrowmaxHeight ); - else - pos = 0; - if (pos < 0) - pos = 0; - bar->SetPos( pos ); - } else { - if (Flags & IE_GUI_TEXTAREA_AUTOSCROLL) { - pos = rows - ( ( Height - 5 ) / ftext->maxHeight ); - SetRow(pos); - } - } - core->RedrawAll(); -} - -/** Sets the Fonts */ -void TextArea::SetFonts(Font* init, Font* text) -{ - finit = init; - ftext = text; - Changed = true; -} - -/** Key Press Event */ -void TextArea::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) -{ - if (Flags & IE_GUI_TEXTAREA_EDITABLE) { - if (Key >= 0x20) { - Owner->Invalidate(); - Changed = true; - int len = GetRowLength(CurLine); - //print("len: %d Before: %s\n",len, lines[CurLine]); - lines[CurLine] = (char *) realloc( lines[CurLine], len + 2 ); - for (int i = len; i > CurPos; i--) { - lines[CurLine][i] = lines[CurLine][i - 1]; - } - lines[CurLine][CurPos] = Key; - lines[CurLine][len + 1] = 0; - CurPos++; - //print("pos: %d After: %s\n",CurPos, lines[CurLine]); - CalcRowCount(); - RunEventHandler( TextAreaOnChange ); - } - return; - } - - //Selectable=false for dialogs, rather unintuitive, but fact - if ((Flags & IE_GUI_TEXTAREA_SELECTABLE) || ( Key < '1' ) || ( Key > '9' )) - return; - GameControl *gc = core->GetGameControl(); - if (gc && (gc->GetDialogueFlags()&DF_IN_DIALOG) ) { - Changed = true; - seltext=minrow-1; - if ((unsigned int) seltext>=lines.size()) { - return; - } - for(int i=0;i=lines.size()) { - return; - } - } - while (strnicmp( lines[seltext], "[s=", 3 ) != 0 ); - } - int idx=-1; - sscanf( lines[seltext], "[s=%d,", &idx); - if (idx==-1) { - //this kills this object, don't use any more data! - gc->dialoghandler->EndDialog(); - return; - } - gc->dialoghandler->DialogChoose( idx ); - } -} - -/** Special Key Press */ -void TextArea::OnSpecialKeyPress(unsigned char Key) -{ - int len; - int i; - - if (!(Flags&IE_GUI_TEXTAREA_EDITABLE)) { - return; - } - Owner->Invalidate(); - Changed = true; - switch (Key) { - case GEM_HOME: - CurPos = 0; - CurLine = 0; - break; - case GEM_UP: - if (CurLine) { - CurLine--; - } - break; - case GEM_DOWN: - if (CurLine 0) { - CurPos--; - } else { - if (CurLine) { - CurLine--; - CurPos = GetRowLength(CurLine); - } - } - break; - case GEM_RIGHT: - len = GetRowLength(CurLine); - if (CurPos < len) { - CurPos++; - } else { - if(CurLine=len) { - //TODO: merge next line - break; - } - lines[CurLine] = (char *) realloc( lines[CurLine], len ); - for (i = CurPos; i < len; i++) { - lines[CurLine][i] = lines[CurLine][i + 1]; - } - //print("pos: %d After: %s\n",CurPos, lines[CurLine]); - break; - case GEM_BACKSP: - len = GetRowLength(CurLine); - if (CurPos != 0) { - //print("len: %d Before: %s\n",len, lines[CurLine]); - if (len<1) { - break; - } - lines[CurLine] = (char *) realloc( lines[CurLine], len ); - for (i = CurPos; i < len; i++) { - lines[CurLine][i - 1] = lines[CurLine][i]; - } - lines[CurLine][len - 1] = 0; - CurPos--; - //print("pos: %d After: %s\n",CurPos, lines[CurLine]); - } else { - if (CurLine) { - //TODO: merge lines - int oldline = CurLine; - CurLine--; - int old = GetRowLength(CurLine); - //print("len: %d Before: %s\n",old, lines[CurLine]); - //print("len: %d Before: %s\n",len, lines[oldline]); - lines[CurLine] = (char *) realloc (lines[CurLine], len+old); - memcpy(lines[CurLine]+old, lines[oldline],len); - free(lines[oldline]); - lines[CurLine][old+len]=0; - lines.erase(lines.begin()+oldline); - lrows.erase(lrows.begin()+oldline); - CurPos = old; - //print("pos: %d len: %d After: %s\n",CurPos, GetRowLength(CurLine), lines[CurLine]); - } - } - break; - case GEM_RETURN: - //add an empty line after CurLine - //print("pos: %d Before: %s\n",CurPos, lines[CurLine]); - lrows.insert(lrows.begin()+CurLine, 0); - len = GetRowLength(CurLine); - //copy the text after the cursor into the new line - char *str = (char *) malloc(len-CurPos+2); - memcpy(str, lines[CurLine]+CurPos, len-CurPos+1); - str[len-CurPos+1] = 0; - lines.insert(lines.begin()+CurLine+1, str); - //truncate the current line - lines[CurLine] = (char *) realloc (lines[CurLine], CurPos+1); - lines[CurLine][CurPos]=0; - //move cursor to next line beginning - CurLine++; - CurPos=0; - //print("len: %d After: %s\n",GetRowLength(CurLine-1), lines[CurLine-1]); - //print("len: %d After: %s\n",GetRowLength(CurLine), lines[CurLine]); - break; - } - CalcRowCount(); - RunEventHandler( TextAreaOnChange ); -} - -/** Returns Row count */ -int TextArea::GetRowCount() -{ - return ( int ) lines.size(); -} - -int TextArea::GetRowLength(unsigned int row) -{ - if (lines.size()<=row) { - return 0; - } - //this is just roughly the line size, escape sequences need to be removed - return strlen( lines[row] ); -} - -int TextArea::GetVisibleRowCount() -{ - return (Height-5) / ftext->maxHeight; -} - -/** Returns top index */ -int TextArea::GetTopIndex() -{ - return startrow; -} - -/** Set Starting Row */ -void TextArea::SetRow(int row) -{ - if (row < rows) { - startrow = row; - } - Changed = true; -} - -void TextArea::CalcRowCount() -{ - int tr; - int w = Width; - - if (Flags&IE_GUI_TEXTAREA_SPEAKER) { - const char *portrait = NULL; - Actor *actor = NULL; - GameControl *gc = core->GetGameControl(); - if (gc) { - Scriptable *target = gc->dialoghandler->GetTarget(); - if (target && target->Type == ST_ACTOR) { - actor = (Actor *)target; - } - } - if (actor) { - portrait = actor->GetPortrait(1); - } - if (portrait) { - RefreshSprite(portrait); - } - if (AnimPicture) { - w-=AnimPicture->Width; - } - } - - rows = 0; - if (lines.size() != 0) { - for (size_t i = 0; i < lines.size(); i++) { -// rows++; - tr = 0; - int len = ( int ) strlen( lines[i] ); - char* tmp = (char *) malloc( len + 1 ); - memcpy( tmp, lines[i], len + 1 ); - ftext->SetupString( tmp, w ); - for (int p = 0; p <= len; p++) { - if (( ( unsigned char ) tmp[p] ) == '[') { - p++; - //char tag[256]; - int k = 0; - for (k = 0; k < 256; k++) { - if (tmp[p] == ']') { - //tag[k] = 0; - break; - } - p++; - //tag[k] = tmp[p++]; - } - - continue; - } - if (tmp[p] == 0) { -// if (p != len) -// rows++; - tr++; - } - } - lrows[i] = tr; - rows += tr; - free( tmp ); - } - } - - if (lines.size()) - { - if (CurLine>=lines.size()) { - CurLine=lines.size()-1; - } - w = strlen(lines[CurLine]); - if (CurPos>w) { - CurPos = w; - } - } else { - CurLine=0; - CurPos=0; - } - - if (!sb) { - return; - } - ScrollBar* bar = ( ScrollBar* ) sb; - tr = rows - Height/ftext->size[1].h + 1; - if (tr<0) { - tr = 0; - } - bar->SetMax( (ieWord) tr ); -} -/** Mouse Over Event */ -void TextArea::OnMouseOver(unsigned short /*x*/, unsigned short y) -{ - int height = ftext->maxHeight; //size[1].h; - int r = y / height; - int row = 0; - - for (size_t i = 0; i < lines.size(); i++) { - row += lrows[i]; - if (r < ( row - startrow )) { - if (seltext != (int) i) - core->RedrawAll(); - seltext = ( int ) i; - //print("CtrlId = 0x%08lx, seltext = %d, rows = %d, row = %d, r = %d\n", ControlID, i, rows, row, r); - return; - } - } - if (seltext != -1) { - core->RedrawAll(); - } - seltext = -1; - //print("CtrlId = 0x%08lx, seltext = %d, rows %d, row %d, r = %d\n", ControlID, seltext, rows, row, r); -} - -/** Mouse Button Up */ -void TextArea::OnMouseUp(unsigned short x, unsigned short y, unsigned short /*Button*/, - unsigned short /*Mod*/) -{ - if (( x <= Width ) && ( y <= ( Height - 5 ) ) && ( seltext != -1 )) { - Value = (unsigned int) seltext; - Changed = true; - if (strnicmp( lines[seltext], "[s=", 3 ) == 0) { - if (minrow > seltext) - return; - int idx; - sscanf( lines[seltext], "[s=%d,", &idx ); - GameControl* gc = core->GetGameControl(); - if (gc && (gc->GetDialogueFlags()&DF_IN_DIALOG) ) { - if (idx==-1) { - //this kills this object, don't use any more data! - gc->dialoghandler->EndDialog(); - return; - } - gc->dialoghandler->DialogChoose( idx ); - return; - } - } - } - - if (VarName[0] != 0) { - core->GetDictionary()->SetAt( VarName, Value ); - } - RunEventHandler( TextAreaOnChange ); -} - -void TextArea::SetText(const std::vector& text) -{ - Clear(); - for (size_t i = 0; i < text.size(); i++) { - int newlen = strlen(text[i]); - char* str = (char *) malloc(newlen + 1); - memcpy(str, text[i], newlen + 1); - lines.push_back(str); - lrows.push_back(0); - CurPos = newlen; - } - CurLine = lines.size() - 1; - UpdateControls(); -} - -/** Copies the current TextArea content to another TextArea control */ -void TextArea::CopyTo(TextArea *ta) -{ - ta->SetText(lines); -} - -void TextArea::RedrawTextArea(const char* VariableName, unsigned int Sum) -{ - if (strnicmp( VarName, VariableName, MAX_VARIABLE_LENGTH )) { - return; - } - Value = Sum; - Changed = true; -} - -void TextArea::SelectText(const char *select) -{ - int i = lines.size(); - while(i--) { - if (!stricmp(lines[i], select) ) { - CurLine = i; - if (sb) { - ScrollBar* bar = ( ScrollBar* ) sb; - bar->SetPos( i ); - } else { - SetRow( i ); - } - RedrawTextArea( VarName, i); - CalcRowCount(); - Owner->Invalidate(); - core->RedrawAll(); - break; - } - } -} - -const char* TextArea::QueryText() -{ - if ( Valuegap - //minrow -2 ->npc text - while (i>=minrow-2 && i>=0) { - row+=lrows[i]; - i--; - } - row = GetVisibleRowCount()-row; - while (row>0) { - AppendText("",-1); - row--; - } -} - -void TextArea::SetPreservedRow(int arg) -{ - keeplines=arg; - Flags |= IE_GUI_TEXTAREA_HISTORY; -} - -void TextArea::Clear() -{ - for (size_t i = 0; i < lines.size(); i++) { - free( lines[i] ); - } - lines.clear(); - lrows.clear(); - rows = 0; -} - -//setting up the textarea for smooth scrolling, the first -//TEXTAREA_OUTOFTEXT callback is called automatically -void TextArea::SetupScroll(unsigned long tck) -{ - SetPreservedRow(0); - smooth = ftext->maxHeight; - startrow = 0; - ticks = tck; - //clearing the textarea - Clear(); - unsigned int i = (unsigned int) (Height/smooth); - while (i--) { - char *str = (char *) malloc(1); - str[0]=0; - lines.push_back(str); - lrows.push_back(0); - } - i = (unsigned int) lines.size(); - Flags |= IE_GUI_TEXTAREA_SMOOTHSCROLL; - starttime = GetTickCount(); - if (RunEventHandler( TextAreaOutOfText )) { - //event handler destructed this object? - return; - } - if (i==lines.size()) { - ResetEventHandler( TextAreaOutOfText ); - return; - } - //recalculates rows - AppendText("\n",-1); -} - -void TextArea::OnMouseDown(unsigned short /*x*/, unsigned short /*y*/, unsigned short Button, - unsigned short /*Mod*/) -{ - - ScrollBar* scrlbr = (ScrollBar*) sb; - - if (!scrlbr) { - Control *ctrl = Owner->GetScrollControl(); - if (ctrl && (ctrl->ControlType == IE_GUI_SCROLLBAR)) { - scrlbr = (ScrollBar *) ctrl; - } - } - if (scrlbr) { - switch(Button) { - case GEM_MB_SCRLUP: - scrlbr->ScrollUp(); - core->RedrawAll(); - break; - case GEM_MB_SCRLDOWN: - scrlbr->ScrollDown(); - core->RedrawAll(); - break; - } - } -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h deleted file mode 100644 index fe42f3d2c..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h +++ /dev/null @@ -1,179 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file TextArea.h - * Declares TextArea widget for displaying long paragraphs of text - * @author The GemRB Project - */ - -#ifndef TEXTAREA_H -#define TEXTAREA_H - -#include "GUI/Control.h" -#include "GUI/ScrollBar.h" - -#include "RGBAColor.h" -#include "exports.h" - -#include "Font.h" - -// Keep these synchronized with GUIDefines.py -// 0x05 is the control type of TextArea -#define IE_GUI_TEXTAREA_ON_CHANGE 0x05000000 -#define IE_GUI_TEXTAREA_OUT_OF_TEXT 0x05000001 - -// TextArea flags, keep these in sync too -// the control type is intentionally left out -#define IE_GUI_TEXTAREA_SELECTABLE 1 -#define IE_GUI_TEXTAREA_AUTOSCROLL 2 -#define IE_GUI_TEXTAREA_SMOOTHSCROLL 4 -#define IE_GUI_TEXTAREA_HISTORY 8 -#define IE_GUI_TEXTAREA_SPEAKER 16 -#define IE_GUI_TEXTAREA_ALT_FONT 32 //this one disables drop capitals -#define IE_GUI_TEXTAREA_EDITABLE 64 - -// internal flags -#define TA_INITIALS 1 -#define TA_BITEMYTAIL 2 - -/** - * @class TextArea - * Widget capable of displaying long paragraphs of text. - * It is usually scrolled with a ScrollBar widget - */ - -class GEM_EXPORT TextArea : public Control { -public: - TextArea(Color hitextcolor, Color initcolor, Color lowtextcolor); - ~TextArea(void); - /** global configuration */ - static void SetNoteString(const char *s); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Set the TextArea value to the line number containing the string parameter */ - void SelectText(const char *select); - /** Sets the Actual Text */ - void SetText(const char* text); - /** Sets text */ - void SetText(const std::vector& text); - /** Clears the textarea */ - void Clear(); - /** Discards scrolled out lines from the textarea */ - /** preserving 'keeplines' lines for scroll back history */ - void DiscardLines(); - /** Appends a String to the current Text */ - int AppendText(const char* text, int pos = 0); - /** Deletes `count' lines (either last or top lines)*/ - void PopLines(unsigned int count, bool top = false); - /** Deletes last lines up to current 'minrow' */ - void PopMinRow() - { - PopLines((unsigned int) (lines.size()-minrow)); - } - /** adds empty lines so minrow will be the uppermost visible row */ - void PadMinRow(); - /** Sets up scrolling, tck is the scrolling speed */ - void SetupScroll(unsigned long tck); - /** Sets the Fonts */ - void SetFonts(Font* init, Font* text); - /** Returns Number of Rows */ - int GetRowCount(); - /** Returns the length of a Row */ - int GetRowLength(unsigned int row); - /** Returns Number of Visible Rows */ - int GetVisibleRowCount(); - /** Returns Starting Row */ - int GetTopIndex(); - /** Set Starting Row */ - void SetRow(int row); - /** Sets preserved lines */ - void SetPreservedRow(int arg); - /** Set Selectable */ - void SetSelectable(bool val); - /** Set Minimum Selectable Row (to the current ceiling) */ - void SetMinRow(bool enable); - /** Copies the current TextArea content to another TextArea control */ - void CopyTo(TextArea* ta); - /** Returns the selected text */ - const char* QueryText(); - /** Marks textarea for redraw with a new value */ - void RedrawTextArea(const char* VariableName, unsigned int Sum); - int SetScrollBar(Control *ptr); -private: // Private attributes - std::vector< char*> lines; - std::vector< int> lrows; - int seltext; - /** minimum selectable row */ - int minrow; - /** lines to be kept even if scrolled out */ - int keeplines; - /** vertical offset for smooth scrolling */ - int smooth; - /** timer for scrolling */ - unsigned long starttime; - /** timer ticks for scrolling (speed) */ - unsigned long ticks; - /** Number of Text Rows */ - int rows; - /** Starting Row */ - int startrow; - /** Text Colors */ - Palette* palette; - Palette* initpalette; - Palette* selected; - Palette* lineselpal; - /** a hack for smooth windows, drop capitals */ - ieDword InternalFlags; - /** Fonts */ - Font* finit, * ftext; - ieResRef PortraitResRef; - - /** Text Editing Cursor Sprite */ - Sprite2D* Cursor; - unsigned short CurPos, CurLine; - -private: //internal functions - void CalcRowCount(); - void UpdateControls(); - void RefreshSprite(const char *portrait); - -public: //Events - /** Key Press Event */ - void OnKeyPress(unsigned char Key, unsigned short Mod); - /** Special Key Press */ - void OnSpecialKeyPress(unsigned char Key); - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse button down*/ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** OnChange Scripted Event Function Name */ - EventHandler TextAreaOnChange; - /** OutOfText Scripted Event Function Name */ - EventHandler TextAreaOutOfText; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp deleted file mode 100644 index 00a884dcc..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - - -#include "GUI/TextEdit.h" - -#include "GameData.h" -#include "Interface.h" -#include "Palette.h" -#include "Video.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" - -#if TARGET_OS_IPHONE -# include "SDL_uikitkeyboard.h" -#endif - -TextEdit::TextEdit(unsigned short maxLength, unsigned short px, unsigned short py) -{ - max = maxLength; - FontPosX = px; - FontPosY = py; - Buffer = ( unsigned char * ) malloc( max + 1 ); - font = NULL; - Cursor = NULL; - Back = NULL; - CurPos = 0; - Buffer[0] = 0; - ResetEventHandler( EditOnChange ); - ResetEventHandler( EditOnDone ); - ResetEventHandler( EditOnCancel ); - Color white = {0xff, 0xff, 0xff, 0x00}, black = {0x00, 0x00, 0x00, 0x00}; - //Original engine values - //Color white = {0xc8, 0xc8, 0xc8, 0x00}, black = {0x3c, 0x3c, 0x3c, 0x00}; - palette = core->CreatePalette( white, black ); -} - -TextEdit::~TextEdit(void) -{ - Video *video = core->GetVideoDriver(); - gamedata->FreePalette( palette ); - free( Buffer ); - video->FreeSprite( Back ); - video->FreeSprite( Cursor ); -} - -/** Draws the Control on the Output Display */ -void TextEdit::Draw(unsigned short x, unsigned short y) -{ - if (!Changed && !(Owner->Flags&WF_FLOAT)) { - return; - } - Changed = false; - if (Back) { - core->GetVideoDriver()->BlitSprite( Back, x + XPos, y + YPos, true ); - - } - if (!font) - return; - - //The aligning of textedit fields is done by absolute positioning (FontPosX, FontPosY) - if (hasFocus) { -#if TARGET_OS_IPHONE - SDL_iPhoneKeyboardShow(SDL_GetWindowFromID(1)); -#endif - font->Print( Region( x + XPos + FontPosX, y + YPos + FontPosY, Width, Height ), Buffer, - palette, IE_FONT_ALIGN_LEFT | IE_FONT_ALIGN_TOP, - true, NULL, Cursor, CurPos ); - } else { - font->Print( Region( x + XPos + FontPosX, y + YPos + FontPosY, Width, Height ), Buffer, - palette, IE_FONT_ALIGN_LEFT | IE_FONT_ALIGN_TOP, true ); - } -} - -/** Set Font */ -void TextEdit::SetFont(Font* f) -{ - if (f != NULL) { - font = f; - Changed = true; - return; - } - printMessage("TextEdit","Invalid font set!\n", LIGHT_RED); -} - -Font *TextEdit::GetFont() { return font; } - -/** Set Cursor */ -void TextEdit::SetCursor(Sprite2D* cur) -{ - core->GetVideoDriver()->FreeSprite( Cursor ); - if (cur != NULL) { - Cursor = cur; - } - Changed = true; -} - -/** Set BackGround */ -void TextEdit::SetBackGround(Sprite2D* back) -{ - //if 'back' is NULL then no BackGround will be drawn - if (Back) - core->GetVideoDriver()->FreeSprite(Back); - Back = back; - Changed = true; -} - -/** Key Press Event */ -void TextEdit::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) -{ - if (Key >= 0x20) { - if (Value && ( (Key<'0') || (Key>'9') ) ) - return; - Owner->Invalidate(); - Changed = true; - int len = ( int ) strlen( ( char* ) Buffer ); - if (len + 1 < max) { - for (int i = len; i > CurPos; i--) { - Buffer[i] = Buffer[i - 1]; - } - Buffer[CurPos] = Key; - Buffer[len + 1] = 0; - CurPos++; - } - RunEventHandler( EditOnChange ); - } -} -/** Special Key Press */ -void TextEdit::OnSpecialKeyPress(unsigned char Key) -{ - int len; - - Owner->Invalidate(); - Changed = true; - switch (Key) { - case GEM_HOME: - CurPos = 0; - break; - case GEM_END: - CurPos = (ieWord) strlen( (char * ) Buffer); - break; - case GEM_LEFT: - if (CurPos > 0) - CurPos--; - break; - case GEM_RIGHT: - len = ( int ) strlen( ( char * ) Buffer ); - if (CurPos < len) { - CurPos++; - } - break; - case GEM_DELETE: - len = ( int ) strlen( ( char * ) Buffer ); - if (CurPos < len) { - for (int i = CurPos; i < len; i++) { - Buffer[i] = Buffer[i + 1]; - } - } - break; - case GEM_BACKSP: - if (CurPos != 0) { - int len = ( int ) strlen( ( char* ) Buffer ); - for (int i = CurPos; i < len; i++) { - Buffer[i - 1] = Buffer[i]; - } - Buffer[len - 1] = 0; - CurPos--; - } - break; - case GEM_RETURN: - RunEventHandler( EditOnDone ); - return; - - } - RunEventHandler( EditOnChange ); -} - -/** Sets the Text of the current control */ -void TextEdit::SetText(const char* string) -{ - strncpy( ( char * ) Buffer, string, max ); - Buffer[max]=0; - CurPos = (ieWord) strlen((char *) Buffer); - if (Owner) { - Owner->Invalidate(); - } -} - -void TextEdit::SetBufferLength(ieWord buflen) -{ - if(buflen<1) return; - if(buflen!=max) { - Buffer = (unsigned char *) realloc(Buffer, buflen+1); - max=(ieWord) buflen; - Buffer[max]=0; - } -} - -/** Simply returns the pointer to the text, don't modify it! */ -const char* TextEdit::QueryText() -{ - return ( const char * ) Buffer; -} - -bool TextEdit::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_EDIT_ON_CHANGE: - EditOnChange = handler; - break; - case IE_GUI_EDIT_ON_DONE: - EditOnDone = handler; - break; - case IE_GUI_EDIT_ON_CANCEL: - EditOnCancel = handler; - break; - default: - return false; - } - - return true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h deleted file mode 100644 index 697b3062c..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h +++ /dev/null @@ -1,101 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file TextEdit.h - * Declares TextEdit widget for displaying single line text input field - * @author The GemRB Project - */ - -#ifndef TEXTEDIT_H -#define TEXTEDIT_H - -#include "GUI/Control.h" - -#include "RGBAColor.h" -#include "exports.h" - -#include "Font.h" - -class Palette; - -// !!! Keep these synchronized with GUIDefines.py -#define IE_GUI_EDIT_ON_CHANGE 0x03000000 -#define IE_GUI_EDIT_ON_DONE 0x03000001 -#define IE_GUI_EDIT_ON_CANCEL 0x03000002 - -//this is stored in 'Value' of Control class -#define IE_GUI_EDIT_NUMBER 1 - -/** - * @class TextEdit - * Widget displaying single line text input field - */ - -class GEM_EXPORT TextEdit : public Control { -public: - TextEdit(unsigned short maxLength, unsigned short x, unsigned short y); - ~TextEdit(void); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Set Font */ - void SetFont(Font* f); - Font *GetFont(); - /** Set Cursor */ - void SetCursor(Sprite2D* cur); - /** Set BackGround */ - void SetBackGround(Sprite2D* back); - /** Sets the Text of the current control */ - void SetText(const char* string); - /** Sets the Text of the current control */ - const char* QueryText(); - /** Sets the buffer length */ - void SetBufferLength(ieWord buflen); -private: - /** Text Editing Cursor Sprite */ - Sprite2D* Cursor; - /** Text Font */ - Font* font; - /** Background */ - Sprite2D* Back; - /** Max Edit Text Length */ - unsigned short max; - /** Client area position */ - unsigned short FontPosX, FontPosY; - /** Text Buffer */ - unsigned char* Buffer; - /** Cursor Position */ - unsigned short CurPos; - /** Color Palette */ - Palette* palette; -public: //Events - /** Key Press Event */ - void OnKeyPress(unsigned char Key, unsigned short Mod); - /** Special Key Press */ - void OnSpecialKeyPress(unsigned char Key); - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); - /** OnChange Scripted Event Function Name */ - EventHandler EditOnChange; - EventHandler EditOnDone; - EventHandler EditOnCancel; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp deleted file mode 100644 index 504bc1e19..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GUI/Window.h" - -#include "GUI/Button.h" -#include "GUI/Control.h" -#include "GUI/MapControl.h" -#include "GUI/Progressbar.h" -#include "GUI/ScrollBar.h" -#include "GUI/Slider.h" - -#include "win32def.h" - -#include "Interface.h" -#include "Video.h" - -Window::Window(unsigned short WindowID, unsigned short XPos, - unsigned short YPos, unsigned short Width, unsigned short Height) -{ - this->WindowID = WindowID; - this->XPos = XPos; - this->YPos = YPos; - this->Width = Width; - this->Height = Height; - this->BackGround = NULL; - lastC = NULL; - lastFocus = NULL; - lastMouseFocus = NULL; - lastOver = NULL; - Visible = WINDOW_INVISIBLE; - Flags = WF_CHANGED; - Cursor = IE_CURSOR_NORMAL; - DefaultControl[0] = -1; - DefaultControl[1] = -1; - ScrollControl = -1; -} - -Window::~Window() -{ - std::vector< Control*>::iterator m = Controls.begin(); - while (Controls.size() != 0) { - Control* ctrl = ( *m ); - delete ctrl; - Controls.erase( m ); - m = Controls.begin(); - } - core->GetVideoDriver()->FreeSprite( BackGround ); - BackGround = NULL; -} -/** Add a Control in the Window */ -void Window::AddControl(Control* ctrl) -{ - if (ctrl == NULL) { - return; - } - ctrl->Owner = this; - for (size_t i = 0; i < Controls.size(); i++) { - if (Controls[i]->ControlID == ctrl->ControlID) { - delete( Controls[i] ); - Controls[i] = ctrl; - Invalidate(); - return; - } - } - Controls.push_back( ctrl ); - Invalidate(); -} -/** Set the Window's BackGround Image. If 'img' is NULL, no background will be set. If the 'clean' parameter is true (default is false) the old background image will be deleted. */ -void Window::SetBackGround(Sprite2D* img, bool clean) -{ - if (clean && BackGround) { - core->GetVideoDriver()->FreeSprite( this->BackGround ); - } - BackGround = img; - Invalidate(); -} -/** This function Draws the Window on the Output Screen */ -void Window::DrawWindow() -{ - Video* video = core->GetVideoDriver(); - Region clip( XPos, YPos, Width, Height ); - //Frame && Changed - if ( (Flags & (WF_FRAME|WF_CHANGED) )== (WF_FRAME|WF_CHANGED) ) { - Region screen( 0, 0, core->Width, core->Height ); - video->SetClipRect( NULL ); - //removed this? - Color black = { 0, 0, 0, 255 }; - video->DrawRect( screen, black ); - if (core->WindowFrames[0]) - video->BlitSprite( core->WindowFrames[0], 0, 0, true ); - if (core->WindowFrames[1]) - video->BlitSprite( core->WindowFrames[1], core->Width - core->WindowFrames[1]->Width, 0, true ); - if (core->WindowFrames[2]) - video->BlitSprite( core->WindowFrames[2], (core->Width - core->WindowFrames[2]->Width) / 2, 0, true ); - if (core->WindowFrames[3]) - video->BlitSprite( core->WindowFrames[3], (core->Width - core->WindowFrames[3]->Width) / 2, core->Height - core->WindowFrames[3]->Height, true ); - } else if (clip_regions.size()) { - // clip drawing (we only do Background right now) for InvalidateForControl - for (unsigned int i = 0; i < clip_regions.size(); i++) { - Region to_clip = clip_regions[i]; - to_clip.x += XPos; - to_clip.y += YPos; - video->SetClipRect(&to_clip); - if (BackGround) { - video->BlitSprite( BackGround, XPos, YPos, true ); - } - } - } - clip_regions.clear(); - video->SetClipRect( &clip ); - //Float || Changed - if (BackGround && (Flags & (WF_FLOAT|WF_CHANGED) ) ) { - video->BlitSprite( BackGround, XPos, YPos, true ); - } - std::vector< Control*>::iterator m; - for (m = Controls.begin(); m != Controls.end(); ++m) { - ( *m )->Draw( XPos, YPos ); - } - if ( (Flags&WF_CHANGED) && (Visible == WINDOW_GRAYED) ) { - Color black = { 0, 0, 0, 128 }; - video->DrawRect(clip, black); - } - video->SetClipRect( NULL ); - Flags &= ~WF_CHANGED; -} - -/** Set window frame used to fill screen on higher resolutions*/ -void Window::SetFrame() -{ - if ( (Width < core->Width) || (Height < core->Height) ) { - Flags|=WF_FRAME; - } - Invalidate(); -} - -/** Returns the Control at X,Y Coordinates */ -Control* Window::GetControl(unsigned short x, unsigned short y, bool ignore) -{ - Control* ctrl = NULL; - - //Check if we are still on the last control - if (( lastC != NULL )) { - if (( XPos + lastC->XPos <= x ) - && ( YPos + lastC->YPos <= y ) - && ( XPos + lastC->XPos + lastC->Width >= x ) - && ( YPos + lastC->YPos + lastC->Height >= y ) - && ! lastC->IsPixelTransparent (x - XPos - lastC->XPos, y - YPos - lastC->YPos)) { - //Yes, we are on the last returned Control - return lastC; - } - } - std::vector< Control*>::const_iterator m; - for (m = Controls.begin(); m != Controls.end(); m++) { - if (ignore && (*m)->ControlID&IGNORE_CONTROL) { - continue; - } - if (( XPos + ( *m )->XPos <= x ) - && ( YPos + ( *m )->YPos <= y ) - && ( XPos + ( *m )->XPos + ( *m )->Width >= x ) - && ( YPos + ( *m )->YPos + ( *m )->Height >= y ) - && ! ( *m )->IsPixelTransparent (x - XPos - ( *m )->XPos, y - YPos - ( *m )->YPos)) { - ctrl = *m; - break; - } - } - lastC = ctrl; - return ctrl; -} - -Control* Window::GetOver() const -{ - return lastOver; -} - -Control* Window::GetFocus() const -{ - return lastFocus; -} - -Control* Window::GetMouseFocus() const -{ - return lastMouseFocus; -} - -/** Sets 'ctrl' as Focused */ -void Window::SetFocused(Control* ctrl) -{ - if (lastFocus != NULL) { - lastFocus->hasFocus = false; - lastFocus->Changed = true; - } - lastFocus = ctrl; - if (ctrl != NULL) { - lastFocus->hasFocus = true; - lastFocus->Changed = true; - } -} - -/** Sets 'ctrl' as Mouse Focused */ -void Window::SetMouseFocused(Control* ctrl) -{ - if (lastMouseFocus != NULL) { - lastMouseFocus->Changed = true; - } - lastMouseFocus = ctrl; - if (ctrl != NULL) { - lastMouseFocus->Changed = true; - } -} - -unsigned int Window::GetControlCount() const -{ - return Controls.size(); -} - -Control* Window::GetControl(unsigned short i) const -{ - if (i < Controls.size()) { - return Controls[i]; - } - return NULL; -} - -bool Window::IsValidControl(unsigned short ID, Control *ctrl) const -{ - size_t i = Controls.size(); - while (i--) { - if (Controls[i]==ctrl) { - return ctrl->ControlID==ID; - } - } - return false; -} - -void Window::DelControl(unsigned short i) -{ - if (i < Controls.size() ) { - Control *ctrl = Controls[i]; - if (ctrl==lastC) { - lastC=NULL; - } - if (ctrl==lastOver) { - lastOver=NULL; - } - if (ctrl==lastFocus) { - lastFocus=NULL; - } - if (ctrl==lastMouseFocus) { - lastMouseFocus=NULL; - } - delete ctrl; - Controls.erase(Controls.begin()+i); - } - Invalidate(); -} - -Control* Window::GetDefaultControl(unsigned int ctrltype) const -{ - if (!Controls.size()) { - return NULL; - } - if (ctrltype>=2) { - return NULL; - } - return GetControl( (ieWord) DefaultControl[ctrltype] ); -} - -Control* Window::GetScrollControl() const -{ - if (!Controls.size()) { - return NULL; - } - return GetControl( (ieWord) ScrollControl ); -} - -void Window::release(void) -{ - Visible = WINDOW_INVALID; - lastC = NULL; - lastFocus = NULL; - lastMouseFocus = NULL; - lastOver = NULL; -} - -/** Redraw all the Window */ -void Window::Invalidate() -{ - DefaultControl[0] = -1; - DefaultControl[1] = -1; - ScrollControl = -1; - for (unsigned int i = 0; i < Controls.size(); i++) { - if (!Controls[i]) { - continue; - } - Controls[i]->Changed = true; - switch (Controls[i]->ControlType) { - case IE_GUI_SCROLLBAR: - if ((ScrollControl == -1) || (Controls[i]->Flags & IE_GUI_SCROLLBAR_DEFAULT)) - ScrollControl = i; - break; - case IE_GUI_BUTTON: - if (( Controls[i]->Flags & IE_GUI_BUTTON_DEFAULT )) { - DefaultControl[0] = i; - } - if (( Controls[i]->Flags & IE_GUI_BUTTON_CANCEL )) { - DefaultControl[1] = i; - } - break; - //falling through - case IE_GUI_GAMECONTROL: - DefaultControl[0] = i; - DefaultControl[1] = i; - break; - default: ; - } - } - Flags |= WF_CHANGED; -} - -/** Redraw enough to update the specified Control */ -void Window::InvalidateForControl(Control *ctrl) { - // TODO: for this to be general-purpose, we should mark anything inside this - // region with Changed, and also do mass Invalidate() if we overlap with - // another window, but for now this just clips the *background*, see DrawWindow() - clip_regions.push_back( Region(ctrl->XPos, ctrl->YPos, ctrl->Width, ctrl->Height) ); -} - -void Window::RedrawControls(const char* VarName, unsigned int Sum) -{ - for (unsigned int i = 0; i < Controls.size(); i++) { - switch (Controls[i]->ControlType) { - case IE_GUI_MAP: - { - MapControl *mc = ( MapControl* ) (Controls[i]); - mc->RedrawMapControl( VarName, Sum ); - break; - } - case IE_GUI_BUTTON: - { - Button* bt = ( Button* ) ( Controls[i] ); - bt->RedrawButton( VarName, Sum ); - break; - } - case IE_GUI_TEXTAREA: - { - TextArea* pb = ( TextArea* ) ( Controls[i] ); - pb->RedrawTextArea( VarName, Sum ); - break; - } - case IE_GUI_PROGRESSBAR: - { - Progressbar* pb = ( Progressbar* ) ( Controls[i] ); - pb->RedrawProgressbar( VarName, Sum ); - break; - } - case IE_GUI_SLIDER: - { - Slider* sl = ( Slider* ) ( Controls[i] ); - sl->RedrawSlider( VarName, Sum ); - break; - } - case IE_GUI_SCROLLBAR: - { - ScrollBar* sb = ( ScrollBar* ) ( Controls[i] ); - sb->RedrawScrollBar( VarName, Sum ); - break; - } - } - } -} - -/** Searches for a ScrollBar and a TextArea to link them */ -void Window::Link(unsigned short SBID, unsigned short TAID) -{ - ScrollBar* sb = NULL; - TextArea* ta = NULL; - std::vector< Control*>::iterator m; - for (m = Controls.begin(); m != Controls.end(); m++) { - if (( *m )->Owner != this) - continue; - if (( *m )->ControlType == IE_GUI_SCROLLBAR) { - if (( *m )->ControlID == SBID) { - sb = ( ScrollBar * ) ( *m ); - if (ta != NULL) - break; - } - } else if (( *m )->ControlType == IE_GUI_TEXTAREA) { - if (( *m )->ControlID == TAID) { - ta = ( TextArea * ) ( *m ); - if (sb != NULL) - break; - } - } - } - if (sb && ta) { - sb->ta = ta; - ta->SetScrollBar( sb ); - } -} - -void Window::OnMouseEnter(unsigned short x, unsigned short y, Control *ctrl) -{ - lastOver = ctrl; - if (!lastOver) { - return; - } - lastOver->OnMouseEnter( x - XPos - lastOver->XPos, y - YPos - lastOver->YPos ); -} - -void Window::OnMouseLeave(unsigned short x, unsigned short y) -{ - if (!lastOver) { - return; - } - lastOver->OnMouseLeave( x - XPos - lastOver->XPos, y - YPos - lastOver->YPos ); - lastOver = NULL; -} - -void Window::OnMouseOver(unsigned short x, unsigned short y) -{ - if (!lastOver) { - return; - } - lastOver->OnMouseOver( x - XPos - lastOver->XPos, y - YPos - lastOver->YPos ); -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Window.h b/project/jni/application/gemrb/gemrb/core/GUI/Window.h deleted file mode 100644 index 450bc05cf..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/Window.h +++ /dev/null @@ -1,188 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Window.h - * Declares Window, class serving as a container for Control/widget objects - * and displaying windows in GUI - * @author The GemRB Project - */ - -#ifndef WINDOW_H -#define WINDOW_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include - -class Sprite2D; - -// Window Flags -#define WF_CHANGED 1 //window changed -#define WF_FRAME 2 //window has frame -#define WF_FLOAT 4 //floating window -#define WF_CHILD 8 //if invalidated, it invalidates all windows on top of it - -// Window position anchors (actually flags for WindowSetPos()) -// !!! Keep these synchronized with GUIDefines.py !!! -#define WINDOW_TOPLEFT 0x00 -#define WINDOW_CENTER 0x01 -#define WINDOW_ABSCENTER 0x02 -#define WINDOW_RELATIVE 0x04 -#define WINDOW_SCALE 0x08 -#define WINDOW_BOUNDED 0x10 - -// IE specific cursor types - -#define IE_CURSOR_INVALID -1 -#define IE_CURSOR_NORMAL 0 -#define IE_CURSOR_TAKE 2 //over pile type containers -#define IE_CURSOR_WALK 4 -#define IE_CURSOR_BLOCKED 6 -#define IE_CURSOR_USE 8 //never hardcoded -#define IE_CURSOR_WAIT 10 //hourglass -#define IE_CURSOR_ATTACK 12 -#define IE_CURSOR_SWAP 14 //dragging portraits -#define IE_CURSOR_DEFEND 16 -#define IE_CURSOR_TALK 18 -#define IE_CURSOR_CAST 20 //targeting with non weapon -#define IE_CURSOR_INFO 22 //never hardcoded -#define IE_CURSOR_LOCK 24 //locked door -#define IE_CURSOR_LOCK2 26 //locked container -#define IE_CURSOR_STAIR 28 //never hardcoded -#define IE_CURSOR_DOOR 30 //doors -#define IE_CURSOR_CHEST 32 -#define IE_CURSOR_TRAVEL 34 -#define IE_CURSOR_STEALTH 36 -#define IE_CURSOR_TRAP 38 -#define IE_CURSOR_PICK 40 //pickpocket -#define IE_CURSOR_PASS 42 //never hardcoded -#define IE_CURSOR_GRAB 44 -#define IE_CURSOR_WAY 46 //waypoint (not in PST) -#define IE_CURSOR_INFO2 46 //PST -#define IE_CURSOR_PORTAL 48 //PST -#define IE_CURSOR_STAIR2 50 //PST -#define IE_CURSOR_EXTRA 52 //PST - -#define IE_CURSOR_MASK 127 -#define IE_CURSOR_GRAY 128 -/** - * @class Window - * Class serving as a container for Control/widget objects - * and displaying windows in GUI. - */ - -class GEM_EXPORT Window { -public: - Window(unsigned short WindowID, unsigned short XPos, unsigned short YPos, - unsigned short Width, unsigned short Height); - ~Window(); - /** Set the Window's BackGround Image. - * If 'img' is NULL, no background will be set. If the 'clean' parameter is true (default is false) the old background image will be deleted. */ - void SetBackGround(Sprite2D* img, bool clean = false); - /** Add a Control in the Window */ - void AddControl(Control* ctrl); - /** This function Draws the Window on the Output Screen */ - void DrawWindow(); - /** Set window frame used to fill screen on higher resolutions*/ - void SetFrame(); - /** Returns the Control at X,Y Coordinates */ - Control* GetControl(unsigned short x, unsigned short y, bool ignore=0); - /** Returns the Control by Index */ - Control* GetControl(unsigned short i) const; - /** Returns the number of Controls */ - unsigned int GetControlCount() const; - /** Returns true if ctrl is valid and ctrl->ControlID is ID */ - bool IsValidControl(unsigned short ID, Control *ctrl) const; - /** Deletes the xth. Control */ - void DelControl(unsigned short i); - /** Returns the Default Control which may be a button/gamecontrol atm */ - Control* GetDefaultControl(unsigned int ctrltype) const; - /** Returns the Control which should get mouse scroll events */ - Control* GetScrollControl() const; - /** Sets 'ctrl' as currently under mouse */ - void SetOver(Control* ctrl); - /** Returns last control under mouse */ - Control* GetOver() const; - /** Sets 'ctrl' as Focused */ - void SetFocused(Control* ctrl); - /** Sets 'ctrl' as mouse event Focused */ - void SetMouseFocused(Control* ctrl); - /** Returns last focused control */ - Control* GetFocus() const; - /** Returns last mouse event focused control */ - Control* GetMouseFocus() const; - /** Redraw all the Window */ - void Invalidate(); - /** Redraw enough to update the specified Control */ - void InvalidateForControl(Control *ctrl); - /** Redraw controls of the same group */ - void RedrawControls(const char* VarName, unsigned int Sum); - /** Links a scrollbar to a text area */ - void Link(unsigned short SBID, unsigned short TAID); - /** Mouse entered a new control's rectangle */ - void OnMouseEnter(unsigned short x, unsigned short y, Control *ctrl); - /** Mouse left the current control */ - void OnMouseLeave(unsigned short x, unsigned short y); - /** Mouse is over the current control */ - void OnMouseOver(unsigned short x, unsigned short y); -public: //Public attributes - /** WinPack */ - char WindowPack[10]; - /** Window ID */ - unsigned short WindowID; - /** X Position */ - unsigned short XPos; - /** Y Position */ - unsigned short YPos; - /** Width */ - unsigned short Width; - /** Height */ - unsigned short Height; - /** Visible value: deleted, invisible, visible, grayed */ - signed char Visible; //-1,0,1,2 - /** Window flags: Changed, Floating, Framed, Child */ - int Flags; - int Cursor; - int DefaultControl[2]; //default enter and cancel - int ScrollControl; -private: // Private attributes - /** BackGround Image. No BackGround if this variable is NULL. */ - Sprite2D* BackGround; - /** Controls Array */ - std::vector< Control*> Controls; - /** Last Control returned by GetControl */ - Control* lastC; - /** Last Focused Control */ - Control* lastFocus; - /** Last mouse event Focused Control */ - Control* lastMouseFocus; - /** Last Control under mouse */ - Control* lastOver; - /** Regions which need to be redrawn */ - std::vector< Region> clip_regions; - -public: - void release(void); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp deleted file mode 100644 index f13b74aa7..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "GUI/WorldMapControl.h" - -#include "win32def.h" - -#include "Font.h" -#include "Game.h" -#include "GameData.h" -#include "Interface.h" -#include "Video.h" -#include "WorldMap.h" -#include "GUI/EventMgr.h" -#include "GUI/Window.h" - -#define MAP_TO_SCREENX(x) XWin + XPos - ScrollX + (x) -#define MAP_TO_SCREENY(y) YWin + YPos - ScrollY + (y) - -WorldMapControl::WorldMapControl(const char *font, int direction) -{ - ScrollX = 0; - ScrollY = 0; - MouseIsDown = false; - Changed = true; - Area = NULL; - Value = direction; - Game* game = core->GetGame(); - WorldMap* worldmap = core->GetWorldMap(); - strncpy(currentArea, game->CurrentArea, 8); - int entry = core->GetAreaAlias(currentArea); - if (entry >= 0) { - WMPAreaEntry *m = worldmap->GetEntry(entry); - strncpy(currentArea, m->AreaResRef, 8); - } - - //if there is no trivial area, look harder - if (!worldmap->GetArea(currentArea, (unsigned int &) entry) && - core->HasFeature(GF_FLEXIBLE_WMAP) ) { - WMPAreaEntry *m = worldmap->FindNearestEntry(currentArea, (unsigned int &) entry); - if (m) { - strncpy(currentArea, m->AreaResRef, 8); - } - } - - //this also updates visible locations - worldmap->CalculateDistances(currentArea, Value); - - // alpha bit is unfortunately ignored - if (font[0]) { - ftext = core->GetFont(font); - } else { - ftext = NULL; - } - - // initialize label colors - // NOTE: it would be better to initialize these colors from - // some 2da file - Color normal = { 0xf0, 0xf0, 0xf0, 0xff }; - Color selected = { 0xf0, 0x80, 0x80, 0xff }; - Color notvisited = { 0x80, 0x80, 0xf0, 0xff }; - Color black = { 0x00, 0x00, 0x00, 0x00 }; - - pal_normal = core->CreatePalette ( normal, black ); - pal_selected = core->CreatePalette ( selected, black ); - pal_notvisited = core->CreatePalette ( notvisited, black ); - - - ResetEventHandler( WorldMapControlOnPress ); - ResetEventHandler( WorldMapControlOnEnter ); -} - -WorldMapControl::~WorldMapControl(void) -{ - //Video *video = core->GetVideoDriver(); - - gamedata->FreePalette( pal_normal ); - gamedata->FreePalette( pal_selected ); - gamedata->FreePalette( pal_notvisited ); -} - -/** Draws the Control on the Output Display */ -void WorldMapControl::Draw(unsigned short XWin, unsigned short YWin) -{ - WorldMap* worldmap = core->GetWorldMap(); - if (!Width || !Height) { - return; - } - if(!Changed) - return; - Changed = false; - Video* video = core->GetVideoDriver(); - Region r( XWin+XPos, YWin+YPos, Width, Height ); - Region clipbackup; - video->GetClipRect(clipbackup); - video->SetClipRect(&r); - video->BlitSprite( worldmap->GetMapMOS(), MAP_TO_SCREENX(0), MAP_TO_SCREENY(0), true, &r ); - - unsigned int i; - unsigned int ec = worldmap->GetEntryCount(); - for(i=0;iGetEntry(i); - if (! (m->GetAreaStatus() & WMP_ENTRY_VISIBLE)) continue; - - int xOffs = MAP_TO_SCREENX(m->X); - int yOffs = MAP_TO_SCREENY(m->Y); - Sprite2D* icon = m->GetMapIcon(worldmap->bam); - if( icon ) { - video->BlitSprite( icon, xOffs, yOffs, true, &r ); - video->FreeSprite( icon ); - } - - if (AnimPicture && !strnicmp(m->AreaResRef, currentArea, 8) ) { - core->GetVideoDriver()->BlitSprite( AnimPicture, xOffs, yOffs, true, &r ); - } - } - - // Draw WMP entry labels - if (ftext==NULL) { - video->SetClipRect(&clipbackup); - return; - } - for(i=0;iGetEntry(i); - if (! (m->GetAreaStatus() & WMP_ENTRY_VISIBLE)) continue; - Sprite2D *icon=m->GetMapIcon(worldmap->bam); - int h=0,w=0,xpos=0,ypos=0; - if (icon) { - h=icon->Height; - w=icon->Width; - xpos=icon->XPos; - ypos=icon->YPos; - video->FreeSprite( icon ); - } - - Region r2 = Region( MAP_TO_SCREENX(m->X-xpos), MAP_TO_SCREENY(m->Y-ypos), w, h ); - if (!m->GetCaption()) - continue; - - int tw = ftext->CalcStringWidth( m->GetCaption() ) + 5; - int th = ftext->maxHeight; - - Palette* text_pal = pal_normal; - - if (Area == m) { - text_pal = pal_selected; - } else { - if (! (m->GetAreaStatus() & WMP_ENTRY_VISITED)) { - text_pal = pal_notvisited; - } - } - - ftext->Print( Region( r2.x + (r2.w - tw)/2, r2.y + r2.h, tw, th ), - ( const unsigned char * ) m->GetCaption(), text_pal, 0, true ); - } - video->SetClipRect(&clipbackup); -} - -/** Key Release Event */ -void WorldMapControl::OnKeyRelease(unsigned char Key, unsigned short Mod) -{ - switch (Key) { - case 'f': - if (Mod & GEM_MOD_CTRL) - core->GetVideoDriver()->ToggleFullscreenMode(); - break; - default: - break; - } -} -void WorldMapControl::AdjustScrolling(short x, short y) -{ - WorldMap* worldmap = core->GetWorldMap(); - if (x || y) { - ScrollX += x; - ScrollY += y; - } else { - //center worldmap on current area - unsigned entry; - - WMPAreaEntry *m = worldmap->GetArea(currentArea,entry); - if (m) { - ScrollX = m->X - Width/2; - ScrollY = m->Y - Height/2; - } - } - Sprite2D *MapMOS = worldmap->GetMapMOS(); - if (ScrollX > MapMOS->Width - Width) - ScrollX = MapMOS->Width - Width; - if (ScrollY > MapMOS->Height - Height) - ScrollY = MapMOS->Height - Height; - if (ScrollX < 0) - ScrollX = 0; - if (ScrollY < 0) - ScrollY = 0; - Changed = true; - Area = NULL; -} - -/** Mouse Over Event */ -void WorldMapControl::OnMouseOver(unsigned short x, unsigned short y) -{ - WorldMap* worldmap = core->GetWorldMap(); - lastCursor = IE_CURSOR_GRAB; - - if (MouseIsDown) { - AdjustScrolling(lastMouseX-x, lastMouseY-y); - } - - lastMouseX = x; - lastMouseY = y; - - if (Value!=(ieDword) -1) { - x =(ieWord) (x + ScrollX); - y =(ieWord) (y + ScrollY); - - WMPAreaEntry *oldArea = Area; - Area = NULL; - - unsigned int i; - unsigned int ec = worldmap->GetEntryCount(); - for (i=0;iGetEntry(i); - - if ( (ae->GetAreaStatus() & WMP_ENTRY_WALKABLE)!=WMP_ENTRY_WALKABLE) { - continue; //invisible or inaccessible - } - if (!strnicmp(ae->AreaResRef, currentArea, 8) ) { - continue; //current area - } - - Sprite2D *icon=ae->GetMapIcon(worldmap->bam); - int h=0,w=0; - if (icon) { - h=icon->Height; - w=icon->Width; - core->GetVideoDriver()->FreeSprite( icon ); - } - if (ftext && ae->GetCaption()) { - int tw = ftext->CalcStringWidth( ae->GetCaption() ) + 5; - int th = ftext->maxHeight; - if(hX > x) continue; - if (ae->X + w < x) continue; - if (ae->Y > y) continue; - if (ae->Y + h < y) continue; - lastCursor = IE_CURSOR_NORMAL; - Area=ae; - if(oldArea!=ae) { - RunEventHandler(WorldMapControlOnEnter); - } - break; - } - } - - Owner->Cursor = lastCursor; -} - -/** Sets the tooltip to be displayed on the screen now */ -void WorldMapControl::DisplayTooltip() -{ - if (Area) { - int x = Owner->XPos+XPos+lastMouseX; - int y = Owner->YPos+YPos+lastMouseY-50; - core->DisplayTooltip( x, y, this ); - } else { - core->DisplayTooltip( 0, 0, NULL ); - } -} - -/** Mouse Leave Event */ -void WorldMapControl::OnMouseLeave(unsigned short /*x*/, unsigned short /*y*/) -{ - Owner->Cursor = IE_CURSOR_NORMAL; - Area = NULL; -} - -/** Mouse Button Down */ -void WorldMapControl::OnMouseDown(unsigned short x, unsigned short y, - unsigned short Button, unsigned short /*Mod*/) -{ - switch(Button) { - case GEM_MB_ACTION: - MouseIsDown = true; - lastMouseX = x; - lastMouseY = y; - break; - case GEM_MB_SCRLUP: - OnSpecialKeyPress(GEM_UP); - break; - case GEM_MB_SCRLDOWN: - OnSpecialKeyPress(GEM_DOWN); - break; - } -} -/** Mouse Button Up */ -void WorldMapControl::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned short Button, unsigned short /*Mod*/) -{ - if (Button != GEM_MB_ACTION) { - return; - } - MouseIsDown = false; - if (lastCursor==IE_CURSOR_NORMAL) { - RunEventHandler( WorldMapControlOnPress ); - } -} - -/** Special Key Press */ -void WorldMapControl::OnSpecialKeyPress(unsigned char Key) -{ - WorldMap* worldmap = core->GetWorldMap(); - switch (Key) { - case GEM_LEFT: - ScrollX -= 64; - break; - case GEM_UP: - ScrollY -= 64; - break; - case GEM_RIGHT: - ScrollX += 64; - break; - case GEM_DOWN: - ScrollY += 64; - break; - case GEM_ALT: - print( "ALT pressed\n" ); - break; - case GEM_TAB: - print( "TAB pressed\n" ); - break; - } - - Sprite2D *MapMOS = worldmap->GetMapMOS(); - if (ScrollX > MapMOS->Width - Width) - ScrollX = MapMOS->Width - Width; - if (ScrollY > MapMOS->Height - Height) - ScrollY = MapMOS->Height - Height; - if (ScrollX < 0) - ScrollX = 0; - if (ScrollY < 0) - ScrollY = 0; -} - -bool WorldMapControl::SetEvent(int eventType, EventHandler handler) -{ - Changed = true; - - switch (eventType) { - case IE_GUI_WORLDMAP_ON_PRESS: - WorldMapControlOnPress = handler; - break; - case IE_GUI_MOUSE_ENTER_WORLDMAP: - WorldMapControlOnEnter = handler; - break; - default: - return false; - } - - return true; -} - -void WorldMapControl::SetColor(int which, Color color) -{ - Palette* pal; - // FIXME: clearly it can cause palettes to be re-created several times, - // because setting background color creates all palettes anew. - switch (which) { - case IE_GUI_WMAP_COLOR_BACKGROUND: - pal = core->CreatePalette( pal_normal->front, color ); - gamedata->FreePalette( pal_normal ); - pal_normal = pal; - pal = core->CreatePalette( pal_selected->front, color ); - gamedata->FreePalette( pal_selected ); - pal_selected = pal; - pal = core->CreatePalette( pal_notvisited->front, color ); - gamedata->FreePalette( pal_notvisited ); - pal_notvisited = pal; - break; - case IE_GUI_WMAP_COLOR_NORMAL: - pal = core->CreatePalette( color, pal_normal->back ); - gamedata->FreePalette( pal_normal ); - pal_normal = pal; - break; - case IE_GUI_WMAP_COLOR_SELECTED: - pal = core->CreatePalette( color, pal_selected->back ); - gamedata->FreePalette( pal_selected ); - pal_selected = pal; - break; - case IE_GUI_WMAP_COLOR_NOTVISITED: - pal = core->CreatePalette( color, pal_notvisited->back ); - gamedata->FreePalette( pal_notvisited ); - pal_notvisited = pal; - break; - default: - break; - } - - Changed = true; -} diff --git a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h deleted file mode 100644 index e0c08ad7c..000000000 --- a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h +++ /dev/null @@ -1,114 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file WorldMapControl.h - * Declares WorldMapControl, widget for displaying world map - */ - - -#ifndef WORLDMAPCONTROL_H -#define WORLDMAPCONTROL_H - -#include "GUI/Control.h" - -#include "exports.h" - -#include "Dialog.h" -#include "Interface.h" - -class Palette; -class WMPAreaEntry; -class WorldMapControl; - -// !!! Keep these synchronized with GUIDefines.py !!! -/** Which label color is set with SetColor() */ -#define IE_GUI_WMAP_COLOR_BACKGROUND 0 -#define IE_GUI_WMAP_COLOR_NORMAL 1 -#define IE_GUI_WMAP_COLOR_SELECTED 2 -#define IE_GUI_WMAP_COLOR_NOTVISITED 3 - - -/** - * @class WorldMapControl - * Widget displaying "world" map, with particular locations and possibly - * allowing travelling between areas. - */ - -#define IE_GUI_WORLDMAP_ON_PRESS 0x08000000 -#define IE_GUI_MOUSE_ENTER_WORLDMAP 0x08000002 - -class GEM_EXPORT WorldMapControl : public Control { -public: - WorldMapControl(const char *fontname, int direction); - ~WorldMapControl(void); - - /** Allows modification of the scrolling factor from outside */ - void AdjustScrolling(short x, short y); - /** Draws the Control on the Output Display */ - void Draw(unsigned short x, unsigned short y); - /** Sets the exit direction (we need this to calculate distances) */ - void SetDirection(int direction); - /** Set color for one type of area labels */ - void SetColor(int which, Color color); - int ScrollX, ScrollY; - unsigned short lastMouseX, lastMouseY; - bool MouseIsDown; - /** pointer to last pointed area */ - WMPAreaEntry *Area; - /** Set handler for specified event */ - bool SetEvent(int eventType, EventHandler handler); -private: - //font for printing area names - Font* ftext; - //mouse cursor - unsigned char lastCursor; - //current area - ieResRef currentArea; - /** Label color of a visited area */ - Palette *pal_normal; - /** Label color of a currently selected area */ - Palette *pal_selected; - /** Label color of a not yet visited area */ - Palette *pal_notvisited; - /** guiscript Event when button pressed */ - EventHandler WorldMapControlOnPress; - /** guiscript Event when mouse is over a reachable area */ - EventHandler WorldMapControlOnEnter; - - /** Mouse Over Event */ - void OnMouseOver(unsigned short x, unsigned short y); - /** Mouse Leave Event */ - void OnMouseLeave(unsigned short x, unsigned short y); - /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, - unsigned short Mod); - /** Key Release Event */ - void OnKeyRelease(unsigned char Key, unsigned short Mod); - /** Special Key Press */ - void OnSpecialKeyPress(unsigned char Key); - /** DisplayTooltip */ - void DisplayTooltip(); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Game.cpp b/project/jni/application/gemrb/gemrb/core/Game.cpp deleted file mode 100644 index d9903603b..000000000 --- a/project/jni/application/gemrb/gemrb/core/Game.cpp +++ /dev/null @@ -1,1761 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2004 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -// This class represents the .gam (savegame) file in the engine - -#include "Game.h" - -#include "defsounds.h" -#include "strrefs.h" -#include "win32def.h" - -#include "DisplayMessage.h" -#include "GameData.h" -#include "Interface.h" -#include "IniSpawn.h" -#include "MapMgr.h" -#include "MusicMgr.h" -#include "Particles.h" -#include "PluginMgr.h" -#include "ScriptEngine.h" -#include "TableMgr.h" -#include "GameScript/GameScript.h" -#include "GUI/GameControl.h" -#include "System/DataStream.h" - -#define MAX_MAPS_LOADED 1 - -Game::Game(void) : Scriptable( ST_GLOBAL ) -{ - protagonist = PM_YES; //set it to 2 for iwd/iwd2 and 0 for pst - partysize = 6; - Ticks = 0; - version = 0; - Expansion = 0; - LoadMos[0] = 0; - SelectedSingle = 1; //the PC we are looking at (inventory, shop) - PartyGold = 0; - SetScript( core->GlobalScript, 0 ); - MapIndex = -1; - Reputation = 0; - ControlStatus = 0; - CombatCounter = 0; //stored here until we know better - StateOverrideTime = 0; - StateOverrideFlag = 0; - BanterBlockTime = 0; - BanterBlockFlag = 0; - WeatherBits = 0; - crtable = NULL; - kaputz = NULL; - beasts = NULL; - mazedata = NULL; - timestop_owner = NULL; - timestop_end = 0; - event_timer = 0; - event_handler = NULL; - weather = new Particles(200); - weather->SetRegion(0, 0, core->Width, core->Height); - LastScriptUpdate = 0; - - //loading master areas - AutoTable table; - if (table.load("mastarea")) { - int i = table->GetRowCount(); - mastarea.reserve(i); - while(i--) { - char *tmp = (char *) malloc(9); - strnuprcpy (tmp,table->QueryField(i,0),8); - mastarea.push_back( tmp ); - } - } - - //loading rest/daylight switching movies (only bg2 has them) - memset(restmovies,'*',sizeof(restmovies)); - memset(daymovies,'*',sizeof(restmovies)); - memset(nightmovies,'*',sizeof(restmovies)); - if (table.load("restmov")) { - for(int i=0;i<8;i++) { - strnuprcpy(restmovies[i],table->QueryField(i,0),8); - strnuprcpy(daymovies[i],table->QueryField(i,1),8); - strnuprcpy(nightmovies[i],table->QueryField(i,2),8); - } - } - - interval = 1000/AI_UPDATE_TIME; - hasInfra = false; - familiarBlock = false; - //FIXME:i'm not sure in this... - NoInterrupt(); -} - -Game::~Game(void) -{ - size_t i; - - delete weather; - for (i = 0; i < Maps.size(); i++) { - delete( Maps[i] ); - } - for (i = 0; i < PCs.size(); i++) { - delete ( PCs[i] ); - } - for (i = 0; i < NPCs.size(); i++) { - delete ( NPCs[i] ); - } - for (i = 0; i < mastarea.size(); i++) { - free ( mastarea[i] ); - } - - if (crtable) { - delete[] crtable; - } - - if (mazedata) { - free (mazedata); - } - if (kaputz) { - delete kaputz; - } - if (beasts) { - free (beasts); - } - i=Journals.size(); - while(i--) { - delete Journals[i]; - } - - i=savedpositions.size(); - while(i--) { - free (savedpositions[i]); - } - - i=planepositions.size(); - while(i--) { - free (planepositions[i]); - } -} - -static bool IsAlive(Actor *pc) -{ - if (pc->GetStat(IE_STATE_ID)&STATE_DEAD) { - return false; - } - return true; -} - -int Game::FindPlayer(unsigned int partyID) -{ - for (unsigned int slot=0; slotInParty==partyID) { - return slot; - } - } - return -1; -} - -Actor* Game::FindPC(unsigned int partyID) -{ - for (unsigned int slot=0; slotInParty==partyID) return PCs[slot]; - } - return NULL; -} - -Actor* Game::FindPC(const char *scriptingname) -{ - for (unsigned int slot=0; slotGetScriptName(),scriptingname,32)==0 ) { - return PCs[slot]; - } - } - return NULL; -} - -Actor* Game::FindNPC(unsigned int partyID) -{ - for (unsigned int slot=0; slotInParty==partyID) return NPCs[slot]; - } - return NULL; -} - -Actor* Game::FindNPC(const char *scriptingname) -{ - for (unsigned int slot=0; slotGetScriptName(),scriptingname,32)==0 ) - { - return NPCs[slot]; - } - } - return NULL; -} - -Actor *Game::GetGlobalActorByGlobalID(ieDword globalID) -{ - unsigned int slot; - - for (slot=0; slotGetGlobalID()==globalID ) { - return PCs[slot]; - } - } - for (slot=0; slotGetGlobalID()==globalID ) { - return NPCs[slot]; - } - } - return NULL; -} - -Actor* Game::GetPC(unsigned int slot, bool onlyalive) -{ - if (slot >= PCs.size()) { - return NULL; - } - if (onlyalive) { - unsigned int i=0; - while(i= PCs.size()) { - return -1; - } - if (!PCs[slot]) { - return -1; - } - SelectActor(PCs[slot], false, SELECT_NORMAL); - if (autoFree) { - delete( PCs[slot] ); - } - std::vector< Actor*>::iterator m = PCs.begin() + slot; - PCs.erase( m ); - return 0; -} - -int Game::DelNPC(unsigned int slot, bool autoFree) -{ - if (slot >= NPCs.size()) { - return -1; - } - if (!NPCs[slot]) { - return -1; - } - if (autoFree) { - delete( NPCs[slot] ); - } - std::vector< Actor*>::iterator m = NPCs.begin() + slot; - NPCs.erase( m ); - return 0; -} - -//i'm sure this could be faster -void Game::ConsolidateParty() -{ - int max = (int) PCs.size(); - std::vector< Actor*>::const_iterator m; - for (int i=1;i<=max;) { - if (FindPlayer(i)==-1) { - - for ( m = PCs.begin(); m != PCs.end(); ++m) { - if ( (*m)->InParty>i) { - (*m)->InParty--; - } - } - } else i++; - } - for ( m = PCs.begin(); m != PCs.end(); ++m) { - (*m)->RefreshEffects(NULL); - //TODO: how to set up bardsongs - (*m)->SetModalSpell((*m)->ModalState, 0); - } -} - -int Game::LeaveParty (Actor* actor) -{ - core->SetEventFlag(EF_PORTRAIT); - actor->CreateStats(); //create or update stats for leaving - actor->SetBase(IE_EXPLORE, 0); - - SelectActor(actor, false, SELECT_NORMAL); - int slot = InParty( actor ); - if (slot < 0) { - return slot; - } - std::vector< Actor*>::iterator m = PCs.begin() + slot; - PCs.erase( m ); - - ieDword id = actor->GetGlobalID(); - for ( m = PCs.begin(); m != PCs.end(); ++m) { - (*m)->PCStats->LastLeft = id; - if ( (*m)->InParty>actor->InParty) { - (*m)->InParty--; - } - } - //removing from party, but actor remains in 'game' - actor->SetPersistent(0); - NPCs.push_back( actor ); - - if (core->HasFeature( GF_HAS_DPLAYER )) { - actor->SetScript( "", SCR_DEFAULT ); - } - actor->SetBase( IE_EA, EA_NEUTRAL ); - return ( int ) NPCs.size() - 1; -} - -//determines if startpos.2da has rotation rows (it cannot have tutorial line) -bool Game::DetermineStartPosType(const TableMgr *strta) -{ - if ((strta->GetRowCount()>=6) && !stricmp(strta->GetRowName(4),"START_ROT" ) ) - { - return true; - } - return false; -} - -#define PMODE_COUNT 3 - -void Game::InitActorPos(Actor *actor) -{ - //start.2da row labels - const char *mode[PMODE_COUNT] = { "NORMAL", "TUTORIAL", "EXPANSION" }; - - unsigned int ip = (unsigned int) (actor->InParty-1); - AutoTable start("start"); - AutoTable strta("startpos"); - - if (!start || !strta) { - error("Game", "Game is missing character start data.\n"); - } - // 0 - single player, 1 - tutorial, 2 - expansion - ieDword playmode = 0; - core->GetDictionary()->Lookup( "PlayMode", playmode ); - - //Sometimes playmode is set to -1 (in pregenerate) - //normally execution shouldn't ever come here, but it actually does - //preventing problems by defaulting to the regular entry points - if (playmode>PMODE_COUNT) { - playmode = 0; - } - const char *xpos = start->QueryField(mode[playmode],"XPOS"); - const char *ypos = start->QueryField(mode[playmode],"YPOS"); - const char *area = start->QueryField(mode[playmode],"AREA"); - const char *rot = start->QueryField(mode[playmode],"ROT"); - - actor->Pos.x = actor->Destination.x = (short) atoi( strta->QueryField( strta->GetRowIndex(xpos), ip ) ); - actor->Pos.y = actor->Destination.y = (short) atoi( strta->QueryField( strta->GetRowIndex(ypos), ip ) ); - actor->SetOrientation( atoi( strta->QueryField( strta->GetRowIndex(rot), ip) ), false ); - - if (strta.load("startare")) { - strnlwrcpy(actor->Area, strta->QueryField( strta->GetRowIndex(area), 0 ), 8 ); - } else { - strnlwrcpy(actor->Area, CurrentArea, 8 ); - } -} - -int Game::JoinParty(Actor* actor, int join) -{ - core->SetEventFlag(EF_PORTRAIT); - actor->CreateStats(); //create stats if they didn't exist yet - actor->InitButtons(actor->GetStat(IE_CLASS), false); //init actor's buttons - actor->SetBase(IE_EXPLORE, 1); - if (join&JP_INITPOS) { - InitActorPos(actor); - } - int slot = InParty( actor ); - if (slot != -1) { - return slot; - } - size_t size = PCs.size(); - //set the lastjoined trigger - - if (join&JP_JOIN) { - //update kit abilities of actor - actor->ApplyKit(false); - //update the quickslots - actor->ReinitQuickSlots(); - //set the joining date - actor->PCStats->JoinDate = GameTime; - if (size) { - ieDword id = actor->GetGlobalID(); - for (size_t i=0;iPCStats->LastJoined = id; - } - } else { - Reputation = actor->GetStat(IE_REPUTATION); - } - } - slot = InStore( actor ); - if (slot >= 0) { - std::vector< Actor*>::iterator m = NPCs.begin() + slot; - NPCs.erase( m ); - } - - - PCs.push_back( actor ); - if (!actor->InParty) { - actor->InParty = (ieByte) (size+1); - } - - if (join&(JP_INITPOS|JP_SELECT)) { - actor->Selected = 0; // don't confuse SelectActor! - SelectActor(actor,true, SELECT_NORMAL); - } - - return ( int ) size; -} - -int Game::GetPartySize(bool onlyalive) const -{ - if (onlyalive) { - int count = 0; - for (unsigned int i = 0; i < PCs.size(); i++) { - if (!IsAlive(PCs[i])) { - continue; - } - count++; - } - return count; - } - return (int) PCs.size(); -} - -/* sends the hotkey trigger to all selected actors */ -void Game::SetHotKey(unsigned long Key) -{ - std::vector< Actor*>::const_iterator m; - - for ( m = selected.begin(); m != selected.end(); ++m) { - Actor *actor = *m; - - if (actor->IsSelected()) { - actor->AddTrigger(TriggerEntry(trigger_hotkey, (ieDword) Key)); - } - } -} - -bool Game::SelectPCSingle(int index) -{ - Actor* actor = FindPC( index ); - if (!actor || ! actor->ValidTarget( GA_NO_HIDDEN )) - return false; - - SelectedSingle = index; - return true; -} - -int Game::GetSelectedPCSingle() const -{ - return SelectedSingle; -} - -/* - * SelectActor() - handle (de)selecting actors. - * If selection was changed, runs "SelectionChanged" handler - * - * actor - either specific actor, or NULL for all - * select - whether actor(s) should be selected or deselected - * flags: - * SELECT_REPLACE - if true, deselect all other actors when selecting one - * SELECT_QUIET - do not run handler if selection was changed. Used for - * nested calls to SelectActor() - */ - -bool Game::SelectActor(Actor* actor, bool select, unsigned flags) -{ - std::vector< Actor*>::iterator m; - - // actor was not specified, which means all selectables should be (de)selected - if (! actor) { - for ( m = selected.begin(); m != selected.end(); ++m) { - (*m)->Select( false ); - (*m)->SetOver( false ); - } - selected.clear(); - - if (select) { - area->SelectActors(); -/* - for ( m = PCs.begin(); m != PCs.end(); ++m) { - if (! *m) { - continue; - } - SelectActor( *m, true, SELECT_QUIET ); - } -*/ - } - - if (! (flags & SELECT_QUIET)) { - core->SetEventFlag(EF_SELECTION); - } - Infravision(); - return true; - } - - // actor was specified, so we will work with him - if (select) { - if (! actor->ValidTarget( GA_SELECT | GA_NO_DEAD )) - return false; - - // deselect all actors first when exclusive - if (flags & SELECT_REPLACE) { - if (selected.size() == 1 && actor->IsSelected()) { - assert(selected[0] == actor); - // already the only selected actor - return true; - } - SelectActor( NULL, false, SELECT_QUIET ); - } else if (actor->IsSelected()) { - // already selected - return true; - } - - actor->Select( true ); - assert(actor->IsSelected()); - selected.push_back( actor ); - } else { - if (!actor->IsSelected()) { - // already not selected - return true; - - /*for ( m = selected.begin(); m != selected.end(); ++m) { - assert((*m) != actor); - } - return true;*/ - } - for ( m = selected.begin(); m != selected.end(); ++m) { - if ((*m) == actor) { - selected.erase( m ); - break; - } - } - actor->Select( false ); - assert(!actor->IsSelected()); - } - - if (! (flags & SELECT_QUIET)) { - core->SetEventFlag(EF_SELECTION); - } - Infravision(); - return true; -} - -// Gets average party level, of onlyalive is true, then counts only living PCs -int Game::GetPartyLevel(bool onlyalive) const -{ - int count = 0; - for (unsigned int i = 0; iGetStat(IE_STATE_ID)&STATE_DEAD) { - continue; - } - } - count += PCs[i]->GetXPLevel(0); - } - return count; -} - -// Returns map structure (ARE) if it is already loaded in memory -int Game::FindMap(const char *ResRef) -{ - int index = (int) Maps.size(); - while (index--) { - Map *map=Maps[index]; - if (strnicmp(ResRef, map->GetScriptName(), 8) == 0) { - return index; - } - } - return -1; -} - -Map* Game::GetMap(unsigned int index) const -{ - if (index >= Maps.size()) { - return NULL; - } - return Maps[index]; -} - -Map *Game::GetMap(const char *areaname, bool change) -{ - int index = LoadMap(areaname, change); - if (index >= 0) { - if (change) { - MapIndex = index; - area = GetMap(index); - memcpy (CurrentArea, areaname, 8); - area->SetupAmbients(); - //change the tileset if needed - area->ChangeMap(IsDay()); - ChangeSong(false, true); - Infravision(); - - //call area customization script for PST - //moved here because the current area is set here - ScriptEngine *sE = core->GetGUIScriptEngine(); - if (core->HasFeature(GF_AREA_OVERRIDE) && sE) { - //area ResRef is accessible by GemRB.GetGameString (STR_AREANAME) - sE->RunFunction("Maze", "CustomizeArea"); - } - - return area; - } - return GetMap(index); - } - return NULL; -} - -bool Game::MasterArea(const char *area) -{ - unsigned int i=(int) mastarea.size(); - while(i--) { - if (strnicmp(mastarea[i], area, 8) ) { - return true; - } - } - return false; -} - -void Game::SetMasterArea(const char *area) -{ - if (MasterArea(area) ) return; - char *tmp = (char *) malloc(9); - strnlwrcpy (tmp,area,8); - mastarea.push_back(tmp); -} - -int Game::AddMap(Map* map) -{ - if (MasterArea(map->GetScriptName()) ) { - Maps.insert(Maps.begin(), 1, map); - MapIndex++; - return 0; - } - unsigned int i = (unsigned int) Maps.size(); - Maps.push_back( map ); - return i; -} - -int Game::DelMap(unsigned int index, int forced) -{ -//this function should archive the area, and remove it only if the area -//contains no active actors (combat, partymembers, etc) - if (index >= Maps.size()) { - return -1; - } - Map *map = Maps[index]; - - if (MapIndex==(int) index) { //can't remove current map in any case - const char *name = map->GetScriptName(); - memcpy(AnotherArea, name, sizeof(AnotherArea) ); - return -1; - } - - - if (!map) { //this shouldn't happen, i guess - printMessage("Game","Erased NULL Map\n",YELLOW); - Maps.erase( Maps.begin()+index); - if (MapIndex>(int) index) { - MapIndex--; - } - return 1; - } - - if (forced || (Maps.size()>MAX_MAPS_LOADED) ) - { - //keep at least one master - const char *name = map->GetScriptName(); - if (MasterArea(name)) { - if(!AnotherArea[0]) { - memcpy(AnotherArea, name, sizeof(AnotherArea)); - if (!forced) { - return -1; - } - } - } - //this check must be the last, because - //after PurgeActors you cannot keep the - //area in memory - //Or the queues should be regenerated! - if (!map->CanFree()) - { - return 1; - } - //remove map from memory - core->SwapoutArea(Maps[index]); - delete( Maps[index] ); - Maps.erase( Maps.begin()+index); - //current map will be decreased - if (MapIndex>(int) index) { - MapIndex--; - } - return 1; - } - //didn't remove the map - return 0; -} - -/* Loads an area */ -int Game::LoadMap(const char* ResRef, bool loadscreen) -{ - unsigned int i; - Map *newMap; - PluginHolder mM(IE_ARE_CLASS_ID); - ScriptEngine *sE = core->GetGUIScriptEngine(); - - //this shouldn't happen - if (!mM) { - return -1; - } - - int index = FindMap(ResRef); - if (index>=0) { - return index; - } - - bool hide = false; - if (loadscreen && sE) { - hide = core->HideGCWindow(); - sE->RunFunction("LoadScreen", "StartLoadScreen"); - sE->RunFunction("LoadScreen", "SetLoadScreen"); - } - DataStream* ds = gamedata->GetResource( ResRef, IE_ARE_CLASS_ID ); - if (!ds) { - goto failedload; - } - if(!mM->Open(ds)) { - goto failedload; - } - newMap = mM->GetMap(ResRef, IsDay()); - if (!newMap) { - goto failedload; - } - - core->LoadProgress(100); - - for (i = 0; i < PCs.size(); i++) { - if (stricmp( PCs[i]->Area, ResRef ) == 0) { - newMap->AddActor( PCs[i] ); - } - } - for (i = 0; i < NPCs.size(); i++) { - if (stricmp( NPCs[i]->Area, ResRef ) == 0) { - newMap->AddActor( NPCs[i] ); - } - } - if (hide) { - core->UnhideGCWindow(); - } - return AddMap( newMap ); -failedload: - if (hide) - core->UnhideGCWindow(); - core->LoadProgress(100); - return -1; -} - -int Game::AddNPC(Actor* npc) -{ - int slot = InStore( npc ); //already an npc - if (slot != -1) { - return slot; - } - slot = InParty( npc ); - if (slot != -1) { - return -1; - } //can't add as npc already in party - npc->SetPersistent(0); - NPCs.push_back( npc ); - - return (int) NPCs.size() - 1; -} - -Actor* Game::GetNPC(unsigned int Index) -{ - if (Index >= NPCs.size()) { - return NULL; - } - return NPCs[Index]; -} - -void Game::SwapPCs(unsigned int Index1, unsigned int Index2) -{ - if (Index1 >= PCs.size()) { - return; - } - - if (Index2 >= PCs.size()) { - return; - } - int tmp = PCs[Index1]->InParty; - PCs[Index1]->InParty = PCs[Index2]->InParty; - PCs[Index2]->InParty = tmp; - //signal a change of the portrait window - core->SetEventFlag(EF_PORTRAIT | EF_SELECTION); -} - -void Game::DeleteJournalEntry(ieStrRef strref) -{ - size_t i=Journals.size(); - while(i--) { - if ((Journals[i]->Text==strref) || (strref==(ieStrRef) -1) ) { - delete Journals[i]; - Journals.erase(Journals.begin()+i); - } - } -} - -void Game::DeleteJournalGroup(int Group) -{ - size_t i=Journals.size(); - while(i--) { - if (Journals[i]->Group==(ieByte) Group) { - delete Journals[i]; - Journals.erase(Journals.begin()+i); - } - } -} -/* returns true if it modified or added a journal entry */ -bool Game::AddJournalEntry(ieStrRef strref, int Section, int Group) -{ - GAMJournalEntry *je = FindJournalEntry(strref); - if (je) { - //don't set this entry again in the same section - if (je->Section==Section) { - return false; - } - if ((Section == IE_GAM_QUEST_DONE) && Group) { - //removing all of this group and adding a new entry - DeleteJournalGroup(Group); - } else { - //modifying existing entry - je->Section = (ieByte) Section; - je->Group = (ieByte) Group; - ieDword chapter = 0; - locals->Lookup("CHAPTER", chapter); - je->Chapter = (ieByte) chapter; - je->GameTime = GameTime; - return true; - } - } - je = new GAMJournalEntry; - je->GameTime = GameTime; - ieDword chapter = 0; - locals->Lookup("CHAPTER", chapter); - je->Chapter = (ieByte) chapter; - je->unknown09 = 0; - je->Section = (ieByte) Section; - je->Group = (ieByte) Group; - je->Text = strref; - - Journals.push_back( je ); - return true; -} - -void Game::AddJournalEntry(GAMJournalEntry* entry) -{ - Journals.push_back( entry ); -} - -unsigned int Game::GetJournalCount() const -{ - return (unsigned int) Journals.size(); -} - -GAMJournalEntry* Game::FindJournalEntry(ieStrRef strref) -{ - unsigned int Index = (unsigned int) Journals.size(); - while(Index--) { - GAMJournalEntry *ret = Journals[Index]; - - if (ret->Text==strref) { - return ret; - } - } - - return NULL; -} - -GAMJournalEntry* Game::GetJournalEntry(unsigned int Index) -{ - if (Index >= Journals.size()) { - return NULL; - } - return Journals[Index]; -} - -unsigned int Game::GetSavedLocationCount() const -{ - return (unsigned int) savedpositions.size(); -} - -void Game::ClearSavedLocations() -{ - size_t i=savedpositions.size(); - while(i--) { - delete savedpositions[i]; - } - savedpositions.clear(); -} - -GAMLocationEntry* Game::GetSavedLocationEntry(unsigned int i) -{ - size_t current = savedpositions.size(); - if (i>=current) { - if (i>PCs.size()) { - return NULL; - } - savedpositions.resize(i+1); - while(current<=i) { - savedpositions[current++]=(GAMLocationEntry *) calloc(1, sizeof(GAMLocationEntry) ); - } - } - return savedpositions[i]; -} - -unsigned int Game::GetPlaneLocationCount() const -{ - return (unsigned int) planepositions.size(); -} - -void Game::ClearPlaneLocations() -{ - size_t i=planepositions.size(); - while(i--) { - delete planepositions[i]; - } - planepositions.clear(); -} - -GAMLocationEntry* Game::GetPlaneLocationEntry(unsigned int i) -{ - size_t current = planepositions.size(); - if (i>=current) { - if (i>PCs.size()) { - return NULL; - } - planepositions.resize(i+1); - while(current<=i) { - planepositions[current++]=(GAMLocationEntry *) calloc(1, sizeof(GAMLocationEntry) ); - } - } - return planepositions[i]; -} - -char *Game::GetFamiliar(unsigned int Index) -{ - return Familiars[Index]; -} - -//reading the challenge rating table for iwd2 (only when needed) -void Game::LoadCRTable() -{ - AutoTable table("moncrate"); - if (table.ok()) { - int maxrow = table->GetRowCount()-1; - crtable = new CRRow[MAX_LEVEL]; - for(int i=0;iGetColumnCount(row)-1; - for(int j=0;jQueryField(row,col) ); - } - } - } -} - -int Game::GetXPFromCR(int cr) -{ - if (!crtable) LoadCRTable(); - if (crtable) { - int level = GetPartyLevel(true); - if (cr>=MAX_CRLEVEL) { - cr=MAX_CRLEVEL-1; - } - print("Challenge Rating: %d, party level: %d ", cr, level); - return crtable[level][cr]; - } - printMessage("Game","Cannot find moncrate.2da!\n", LIGHT_RED); - return 0; -} - -void Game::ShareXP(int xp, int flags) -{ - int individual; - - if (flags&SX_CR) { - xp = GetXPFromCR(xp); - } - - if (flags&SX_DIVIDE) { - int PartySize = GetPartySize(true); //party size, only alive - if (PartySize<1) { - return; - } - individual = xp / PartySize; - } else { - individual = xp; - } - - if (!individual) { - return; - } - - if (xp>0) { - displaymsg->DisplayConstantStringValue( STR_GOTXP, 0xbcefbc, (ieDword) xp); //you have gained ... xp - } else { - displaymsg->DisplayConstantStringValue( STR_LOSTXP, 0xbcefbc, (ieDword) -xp); //you have lost ... xp - } - for (unsigned int i=0; iGetStat(IE_STATE_ID)&STATE_DEAD) { - continue; - } - PCs[i]->AddExperience(individual); - } -} - -bool Game::EveryoneStopped() const -{ - for (unsigned int i=0; iGetNextStep() ) return false; - } - return true; -} - -//canmove=true: if some PC can't move (or hostile), then this returns false -bool Game::EveryoneNearPoint(Map *area, const Point &p, int flags) const -{ - for (unsigned int i=0; iSelected) { - continue; - } - } - if (PCs[i]->GetStat(IE_STATE_ID)&STATE_DEAD) { - continue; - } - if (flags&ENP_CANMOVE) { - //someone is uncontrollable, can't move - if (PCs[i]->GetStat(IE_EA)>EA_GOODCUTOFF) { - return false; - } - - if (PCs[i]->GetStat(IE_STATE_ID)&STATE_CANTMOVE) { - return false; - } - } - if (PCs[i]->GetCurrentArea()!=area) { - return false; - } - if (Distance(p,PCs[i])>MAX_TRAVELING_DISTANCE) { - print("Actor %s is not near!\n", PCs[i]->LongName); - return false; - } - } - return true; -} - -//called when someone died -void Game::PartyMemberDied(Actor *actor) -{ - //this could be null, in some extreme cases... - Map *area = actor->GetCurrentArea(); - - for (unsigned int i=0; iGetStat(IE_STATE_ID)&STATE_DEAD) { - continue; - } - if (PCs[i]->GetCurrentArea()!=area) { - continue; - } - PCs[i]->ReactToDeath(actor->GetScriptName()); - } -} - -void Game::IncrementChapter() -{ - //chapter first set to 0 (prologue) - ieDword chapter = (ieDword) -1; - locals->Lookup("CHAPTER",chapter); - //increment chapter only if it exists - locals->SetAt("CHAPTER", chapter+1, core->HasFeature(GF_NO_NEW_VARIABLES) ); - //clear statistics - for (unsigned int i=0; iPCStats->IncrementChapter(); - } -} - -void Game::SetReputation(ieDword r) -{ - if (r<10) r=10; - else if (r>200) r=200; - if (Reputation>r) { - displaymsg->DisplayConstantStringValue(STR_LOSTREP,0xc0c000,(Reputation-r)/10); - } else if (ReputationDisplayConstantStringValue(STR_GOTREP,0xc0c000,(r-Reputation)/10); - } - Reputation = r; - for (unsigned int i=0; iSetBase(IE_REPUTATION, Reputation); - } -} - -void Game::SetControlStatus(int value, int mode) -{ - switch(mode) { - case BM_OR: ControlStatus|=value; break; - case BM_NAND: ControlStatus&=~value; break; - case BM_SET: ControlStatus=value; break; - case BM_AND: ControlStatus&=value; break; - case BM_XOR: ControlStatus^=value; break; - } - core->SetEventFlag(EF_CONTROL); -} - -void Game::AddGold(ieDword add) -{ - ieDword old; - - if (!add) { - return; - } - old = PartyGold; - PartyGold += add; - if (oldDisplayConstantStringValue( STR_GOTGOLD, 0xc0c000, PartyGold-old); - } else { - displaymsg->DisplayConstantStringValue( STR_LOSTGOLD, 0xc0c000, old-PartyGold); - } -} - -//later this could be more complicated -void Game::AdvanceTime(ieDword add) -{ - ieDword h = GameTime/(300*AI_UPDATE_TIME); - GameTime+=add; - if (h!=GameTime/(300*AI_UPDATE_TIME)) { - //asking for a new weather when the hour changes - WeatherBits&=~WB_HASWEATHER; - } - Ticks+=add*interval; - //change the tileset if needed - Map *map = GetCurrentArea(); - if (map && map->ChangeMap(IsDay())) { - //play the daylight transition movie appropriate for the area - //it is needed to play only when the area truly changed its tileset - //this is signalled by ChangeMap - int areatype = (area->AreaType&(AT_FOREST|AT_CITY|AT_DUNGEON))>>3; - ieResRef *res; - - printMessage("Game","Switching DayLight\n",GREEN); - if (IsDay()) { - res=&nightmovies[areatype]; - } else { - res=&daymovies[areatype]; - } - if (*res[0]!='*') { - core->PlayMovie(*res); - } - } -} - -//returns true if there are excess players in the team -bool Game::PartyOverflow() const -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - return false; - } - //don't start this screen when the gui is busy - if (gc->GetDialogueFlags() & (DF_IN_DIALOG|DF_IN_CONTAINER|DF_FREEZE_SCRIPTS) ) { - return false; - } - if (!partysize) { - return false; - } - return (PCs.size()>partysize); -} - -bool Game::AnyPCInCombat() const -{ - if (!CombatCounter) { - return false; - } - - return true; -} - -//returns true if the protagonist (or the whole party died) -bool Game::EveryoneDead() const -{ - //if there are no PCs, then we assume everyone dead - if (!PCs.size() ) { - return true; - } - if (protagonist==PM_NO) { - Actor *nameless = PCs[0]; - if (nameless->GetStat(IE_STATE_ID)&STATE_NOSAVE) { - if (area->INISpawn) { - area->INISpawn->RespawnNameless(); - } - } - return false; - } - // if protagonist died - if (protagonist==PM_YES) { - if (PCs[0]->GetStat(IE_STATE_ID)&STATE_NOSAVE) { - return true; - } - return false; - } - //protagonist == 2 - for (unsigned int i=0; iGetStat(IE_STATE_ID)&STATE_NOSAVE) ) { - return false; - } - } - return true; -} - -//runs all area scripts - -void Game::UpdateScripts() -{ - Update(); - size_t idx; - - PartyAttack = false; - - for (idx=0;idxUpdateScripts(); - } - - if (PartyAttack) { - //ChangeSong will set the battlesong only if CombatCounter is nonzero - CombatCounter=150; - ChangeSong(false, true); - } else { - if (CombatCounter) { - CombatCounter--; - //Change song if combatcounter went down to 0 - if (!CombatCounter) { - ChangeSong(false, false); - } - } - } - - if (StateOverrideTime) - StateOverrideTime--; - if (BanterBlockTime) - BanterBlockTime--; - - if (Maps.size()>MAX_MAPS_LOADED) { - idx = Maps.size(); - - //starting from 0, so we see the most recent master area first - for(unsigned int i=0;iGetMusicMgr()->IsPlaying()) { - ChangeSong(false,false); - } - - //this is used only for the death delay so far - if (event_handler) { - if (!event_timer) { - event_handler->call(); - event_handler = NULL; - } - event_timer--; - } - - if (EveryoneDead()) { - //don't check it any more - protagonist = PM_NO; - core->GetGUIScriptEngine()->RunFunction("GUIWORLD", "DeathWindow"); - return; - } - - if (PartyOverflow()) { - partysize = 0; - core->GetGUIScriptEngine()->RunFunction("GUIWORLD", "OpenReformPartyWindow"); - return; - } -} - -void Game::SetTimedEvent(EventHandler func, int count) -{ - event_timer = count; - event_handler = func; -} - -void Game::SetProtagonistMode(int mode) -{ - protagonist = mode; -} - -void Game::SetPartySize(int size) -{ - // 0 size means no party size control - if (size<0) { - return; - } - partysize = (size_t) size; -} - -//Get the area dependent rest movie -ieResRef *Game::GetDream(Map *area) -{ - //select dream based on area - int daynight = IsDay(); - if (area->Dream[daynight][0]) { - return area->Dream+daynight; - } - int dream = (area->AreaType&(AT_FOREST|AT_CITY|AT_DUNGEON))>>3; - return restmovies+dream; -} - -//Start dream cutscenes for player1 -void Game::PlayerDream() -{ - Scriptable *Sender = GetPC(0,true); - if (!Sender) return; - - GameScript* gs = new GameScript( "player1d", Sender,0,0 ); - gs->Update(); - delete( gs ); -} - -//noareacheck = no random encounters -//dream = 0 - based on area non-0 - select from list -//-1 no dream -//hp is how much hp the rest will heal -void Game::RestParty(int checks, int dream, int hp) -{ - if (!(checks&REST_NOMOVE) ) { - if (!EveryoneStopped()) { - return; - } - } - Actor *leader = GetPC(0, true); - if (!leader) { - return; - } - - Map *area = leader->GetCurrentArea(); - //we let them rest if someone is paralyzed, but the others gather around - if (!(checks&REST_NOSCATTER) ) { - if (!EveryoneNearPoint( area, leader->Pos, 0 ) ) { - //party too scattered - displaymsg->DisplayConstantString( STR_SCATTERED, 0xff0000 ); - return; - } - } - - if (!(checks&REST_NOCRITTER) ) { - //don't allow resting while in combat - if (AnyPCInCombat()) { - displaymsg->DisplayConstantString( STR_CANTRESTMONS, 0xff0000 ); - return; - } - //don't allow resting if hostiles are nearby - if (area->AnyEnemyNearPoint(leader->Pos)) { - displaymsg->DisplayConstantString( STR_CANTRESTMONS, 0xff0000 ); - return; - } - } - - //rest check, if PartyRested should be set, area should return true - //area should advance gametime too (so partial rest is possible) - int hours = 8; - if (!(checks&REST_NOAREA) ) { - //you cannot rest here - if (area->AreaFlags&1) { - displaymsg->DisplayConstantString( STR_MAYNOTREST, 0xff0000 ); - return; - } - //you may not rest here, find an inn - if (!(area->AreaType&(AT_OUTDOOR|AT_FOREST|AT_DUNGEON|AT_CAN_REST) )) - { - displaymsg->DisplayConstantString( STR_MAYNOTREST, 0xff0000 ); - return; - } - //area encounters - if(area->Rest( leader->Pos, 8, (GameTime/AI_UPDATE_TIME)%7200/3600) ) { - return; - } - } - AdvanceTime(2400*AI_UPDATE_TIME); - - int i = GetPartySize(true); // party size, only alive - - while (i--) { - Actor *tar = GetPC(i, true); - tar->ClearPath(); - tar->ClearActions(); - tar->SetModal(MS_NONE, 0); - //if hp = 0, then healing will be complete - tar->Heal(hp); - //removes fatigue, recharges spells - tar->Rest(0); - tar->PartyRested(); - } - - //movie and cutscene dreams - if (dream>=0) { - //cutscene dreams - if (gamedata->Exists("player1d",IE_BCS_CLASS_ID, true)) - PlayerDream(); - - //select dream based on area - ieResRef *movie; - if (dream==0 || dream>7) { - movie = GetDream(area); - } else { - movie = restmovies+dream; - } - if (*movie[0]!='*') { - core->PlayMovie(*movie); - } - } - - //set partyrested flags - PartyRested(); - area->PartyRested(); - core->SetEventFlag(EF_ACTION); - - //restindex will be -1 in the case of PST - //FIXME: I don't quite see why we can't sumply use the same strings.2da entry - //It seems we could reduce complexity here, and free up 2-3 string slots too - int restindex = displaymsg->GetStringReference(STR_REST); - int strindex; - char* tmpstr = NULL; - - core->GetTokenDictionary()->SetAtCopy("HOUR", hours); - if (restindex != -1) { - strindex = displaymsg->GetStringReference(STR_HOURS); - } else { - strindex = displaymsg->GetStringReference(STR_PST_HOURS); - restindex = displaymsg->GetStringReference(STR_PST_REST); - } - - //this would be bad - if (strindex == -1 || restindex == -1) return; - tmpstr = core->GetString(strindex, 0); - //as would this - if (!tmpstr) return; - - core->GetTokenDictionary()->SetAtCopy("DURATION", tmpstr); - core->FreeString(tmpstr); - displaymsg->DisplayString(restindex, 0xffffff, 0); -} - -//timestop effect -void Game::TimeStop(Actor* owner, ieDword end) -{ - timestop_owner=owner; - timestop_end=end; -} - -// check if the passed actor is a victim of timestop -bool Game::TimeStoppedFor(const Actor* target) -{ - if (!timestop_owner) { - return false; - } - if (target == timestop_owner || target->GetStat(IE_DISABLETIMESTOP)) { - return false; - } - return true; -} - -//recalculate the party's infravision state -void Game::Infravision() -{ - hasInfra = false; - Map *map = GetCurrentArea(); - if (!map) return; - for(size_t i=0;iGetCurrentArea()!=map) continue; - //Group infravision overrides this??? - if (!actor->Selected) continue; - if (actor->GetStat(IE_STATE_ID) & STATE_INFRA) { - hasInfra = true; - return; - } - } -} - -//returns the colour which should be applied onto the whole game area viewport -//this is based on timestop, dream area, weather, daytime - -static const Color DreamTint={0xf0,0xe0,0xd0,0x10}; //light brown scale -static const Color NightTint={0x80,0x80,0xe0,0x40}; //dark, bluish -static const Color DuskTint={0xe0,0x80,0x80,0x40}; //dark, reddish -static const Color FogTint={0xff,0xff,0xff,0x40}; //whitish -static const Color DarkTint={0x80,0x80,0xe0,0x10}; //slightly dark bluish - -const Color *Game::GetGlobalTint() const -{ - Map *map = GetCurrentArea(); - if (!map) return NULL; - if (map->AreaFlags&AF_DREAM) { - return &DreamTint; - } - if ((map->AreaType&(AT_OUTDOOR|AT_DAYNIGHT|AT_EXTENDED_NIGHT)) == (AT_OUTDOOR|AT_DAYNIGHT) ) { - //get daytime colour - ieDword daynight = ((GameTime/AI_UPDATE_TIME)%7200/300); - if (daynight<2 || daynight>22) { - return &NightTint; - } - if (daynight>20 || daynight<4) { - return &DuskTint; - } - } - if ((map->AreaType&(AT_OUTDOOR|AT_WEATHER)) == (AT_OUTDOOR|AT_WEATHER)) { - //get weather tint - if (WeatherBits&WB_RAIN) { - return &DarkTint; - } - if (WeatherBits&WB_FOG) { - return &FogTint; - } - } - - return NULL; -} - -bool Game::IsDay() -{ - ieDword daynight = ((GameTime/AI_UPDATE_TIME)%7200/300); - if(daynight<4 || daynight>20) { - return false; - } - return true; -} - -void Game::ChangeSong(bool always, bool force) -{ - int Song; - - if (CombatCounter) { - //battlesong - Song = SONG_BATTLE; - } else { - //will select SONG_DAY or SONG_NIGHT - Song = (GameTime/AI_UPDATE_TIME)%7200/3600; - } - //area may override the song played (stick in battlemusic) - //always transition gracefully with ChangeSong - //force just means, we schedule the song for later, if currently - //is playing - area->PlayAreaSong( Song, always, force ); -} - -/* this method redraws weather. If update is false, - then the weather particles won't change (game paused) -*/ -void Game::DrawWeather(const Region &screen, bool update) -{ - if (!weather) { - return; - } - if (!area->HasWeather()) { - return; - } - - weather->Draw( screen ); - if (!update) { - return; - } - - if (!(WeatherBits & (WB_RAIN|WB_SNOW)) ) { - if (weather->GetPhase() == P_GROW) { - weather->SetPhase(P_FADE); - } - } - //if (GameTime&1) { - int drawn = weather->Update(); - if (drawn) { - WeatherBits &= ~WB_START; - } - //} - - if (WeatherBits&WB_HASWEATHER) { - return; - } - StartRainOrSnow(true, area->GetWeather()); -} - -/* sets the weather type */ -void Game::StartRainOrSnow(bool conditional, int w) -{ - if (conditional && (w & (WB_RAIN|WB_SNOW)) ) { - if (WeatherBits & (WB_RAIN | WB_SNOW) ) - return; - } - // whatever was responsible for calling this, we now have some set weather - WeatherBits = w | WB_HASWEATHER; - if (w & WB_LIGHTNING) { - if (WeatherBits&WB_START) { - //already raining - if (GameTime&1) { - core->PlaySound(DS_LIGHTNING1); - } else { - core->PlaySound(DS_LIGHTNING2); - } - } else { - //start raining (far) - core->PlaySound(DS_LIGHTNING3); - } - } - if (w&WB_SNOW) { - core->PlaySound(DS_SNOW); - weather->SetType(SP_TYPE_POINT, SP_PATH_FLIT, SP_SPAWN_SOME); - weather->SetPhase(P_GROW); - weather->SetColor(SPARK_COLOR_WHITE); - return; - } - if (w&WB_RAIN) { - core->PlaySound(DS_RAIN); - weather->SetType(SP_TYPE_LINE, SP_PATH_RAIN, SP_SPAWN_SOME); - weather->SetPhase(P_GROW); - weather->SetColor(SPARK_COLOR_STONE); - return; - } - weather->SetPhase(P_FADE); -} - -void Game::SetExpansion(ieDword value) -{ - if (Expansion>=value) { - return; - } - Expansion = value; - - switch(Expansion) { - default: - core->SetEventFlag(EF_EXPANSION); - break; - //TODO: move this hardcoded hack to the scripts - case 5: - core->GetDictionary()->SetAt( "PlayMode", 2 ); - - int i = GetPartySize(false); - while(i--) { - Actor *actor = GetPC(i, false); - InitActorPos(actor); - } - } -} - -void Game::DebugDump() -{ - size_t idx; - - print("Currently loaded areas:\n"); - for(idx=0;idxGetScriptName()); - } - print("Current area: %s Previous area: %s\n", CurrentArea, PreviousArea); - print("Global script: %s\n", Scripts[0]->GetName()); - print("CombatCounter: %d\n", (int) CombatCounter); - - print("Party size: %d\n", (int) PCs.size()); - for(idx=0;idxShortName, actor->InParty, actor->Selected?"x":"-"); - } -} - -Actor *Game::GetActorByGlobalID(ieDword globalID) -{ - size_t mc = GetLoadedMapCount(); - while(mc--) { - Map *map = GetMap(mc); - Actor *actor = map->GetActorByGlobalID(globalID); - if (actor) return actor; - } - return GetGlobalActorByGlobalID(globalID); -} - -ieByte *Game::AllocateMazeData() -{ - if (mazedata) { - free(mazedata); - } - mazedata = (ieByte*)malloc(MAZE_DATA_SIZE); - return mazedata; -} - -bool Game::IsTimestopActive() -{ - return timestop_end > GameTime; -} diff --git a/project/jni/application/gemrb/gemrb/core/Game.h b/project/jni/application/gemrb/gemrb/core/Game.h deleted file mode 100644 index 851d28d72..000000000 --- a/project/jni/application/gemrb/gemrb/core/Game.h +++ /dev/null @@ -1,482 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Game.h - * Declares Game class, object representing current game state. - * @author The GemRB Project - */ - - -class Game; - -#ifndef GAME_H -#define GAME_H - -#include "exports.h" -#include "ie_types.h" - -#include "Callback.h" -#include "Scriptable/Scriptable.h" -#include "Scriptable/PCStatStruct.h" -#include "Variables.h" - -#include - -class Actor; -class Map; -class Particles; -class TableMgr; - -//the size of the bestiary register -#define BESTIARY_SIZE 260 - -//ShareXP flags -#define SX_DIVIDE 1 //divide XP among team members -#define SX_CR 2 //use challenge rating resolution - -//joinparty flags -#define JP_JOIN 1 //refresh join time -#define JP_INITPOS 2 //init startpos -#define JP_SELECT 4 //select the actor after joining - -//protagonist mode -#define PM_NO 0 //no death checks -#define PM_YES 1 //if protagonist dies, game over -#define PM_TEAM 2 //if team dies, game over - -// Flags bits for SelectActor() -// !!! Keep these synchronized with GUIDefines.py !!! -#define SELECT_NORMAL 0x00 -#define SELECT_REPLACE 0x01 // when selecting actor, deselect all others -#define SELECT_QUIET 0x02 // do not run handler when changing selection - -// Flags bits for EveryoneNearPoint() -#define ENP_CANMOVE 1 // also check if the PC can move -#define ENP_ONLYSELECT 2 // check only selected PC - -// GUI Control Status flags (saved in game) -#define CS_PARTY_AI 1 //enable party AI -#define CS_MEDIUM 2 //medium dialog -#define CS_LARGE 6 //large dialog, both bits set -#define CS_DIALOGSIZEMASK 6 -#define CS_DIALOG 8 //dialog is running -#define CS_HIDEGUI 16 //hide all gui -#define CS_ACTION 32 //hide action pane -#define CS_PORTRAIT 64 //hide portrait pane -#define CS_MAPNOTES 128 //hide mapnotes - -//Weather bits -#define WB_NORMAL 0 -#define WB_RAIN 1 -#define WB_SNOW 2 -#define WB_FOG 3 -#define WB_MASK 7 -#define WB_LIGHTNING 8 -#define WB_HASWEATHER 0x40 -#define WB_START 0x80 - -//Rest flags -#define REST_NOAREA 1 //no area check -#define REST_NOSCATTER 2 //no scatter check -#define REST_NOMOVE 4 //no movement check -#define REST_NOCRITTER 8 //no hostiles check - -//Song types (hardcoded) -#define SONG_DAY 0 -#define SONG_NIGHT 1 -#define SONG_BATTLE 3 - -/** - * @struct PCStruct - * Information about party member. - */ - -struct PCStruct { - ieWord Selected; - ieWord PartyOrder; - ieDword OffsetToCRE; - ieDword CRESize; - ieResRef CREResRef; - ieDword Orientation; - ieResRef Area; - ieWord XPos; - ieWord YPos; - ieWord ViewXPos; - ieWord ViewYPos; - ieWord ModalState; - ieWord Happiness; - ieDword Interact[MAX_INTERACT]; - ieWord QuickWeaponSlot[MAX_QUICKWEAPONSLOT]; - ieWord QuickWeaponHeader[MAX_QUICKWEAPONSLOT]; - ieResRef QuickSpellResRef[MAX_QSLOTS]; - ieWord QuickItemSlot[MAX_QUICKITEMSLOT]; - ieWord QuickItemHeader[MAX_QUICKITEMSLOT]; - char Name[32]; - ieDword TalkCount; - ieByte QSlots[GUIBT_COUNT]; - ieByte QuickSpellClass[MAX_QSLOTS]; -}; - -#define IE_GAM_JOURNAL 0 -#define IE_GAM_QUEST_UNSOLVED 1 -#define IE_GAM_QUEST_DONE 2 -#define IE_GAM_JOURNAL_USER 3 - -/** - * @struct GAMJournalEntry - * Single entry in a journal - */ - -struct GAMJournalEntry { - ieStrRef Text; - ieDword GameTime; // in game time seconds - ieByte Chapter; - ieByte unknown09; - ieByte Section; - ieByte Group; // this is a GemRB extension -}; - -// Saved location of party member. -struct GAMLocationEntry { - ieResRef AreaResRef; - Point Pos; -}; - -//pst maze data structures (TODO: create a separate class?) -struct maze_entry { - ieDword override; - ieDword accessible; - ieDword valid; - ieDword trapped; - ieDword traptype; - ieWord walls; - ieDword visited; -}; - -struct maze_header { - ieDword maze_sizex, maze_sizey; - ieDword pos1x, pos1y; //nordom's position - ieDword pos2x, pos2y; //main hall position - ieDword pos3x, pos3y; //foyer entrance - ieDword pos4x, pos4y; //unknown - ieDword trapcount; //based on map size - ieDword initialized; //set to 1 - ieDword unknown2c; //unknown - ieDword unknown30; //unknown -}; - -#define MAZE_ENTRY_SIZE sizeof(maze_entry) -#define MAZE_HEADER_SIZE sizeof(maze_header) -#define MAZE_MAX_DIM 8 -#define MAZE_ENTRY_COUNT (MAZE_MAX_DIM*MAZE_MAX_DIM) -#define MAZE_DATA_SIZE (MAZE_ENTRY_COUNT*MAZE_ENTRY_SIZE+MAZE_HEADER_SIZE) -#define MAZE_DATA_SIZE_HARDCODED 1720 - -//maze header indices -#define MH_POS1X 0 -#define MH_POS1Y 1 -#define MH_POS2X 2 -#define MH_POS2Y 3 -#define MH_POS3X 4 -#define MH_POS3Y 5 -#define MH_POS4X 6 -#define MH_POS4Y 7 -#define MH_TRAPCOUNT 8 -#define MH_INITED 9 -#define MH_UNKNOWN2C 10 -#define MH_UNKNOWN30 11 - -//maze entry indices -#define ME_OVERRIDE 0 -#define ME_VALID 1 -#define ME_ACCESSIBLE 2 -#define ME_TRAP 3 -#define ME_WALLS 4 -#define ME_VISITED 5 - -//ME_WALL bitfields -#define WALL_SOUTH 1 -#define WALL_NORTH 2 -#define WALL_EAST 4 -#define WALL_WEST 8 - -#define MAX_CRLEVEL 32 - -typedef int CRRow[MAX_CRLEVEL]; - -/** - * @class Game - * Object representing current game state, mostly party. - */ - -class GEM_EXPORT Game : public Scriptable { -public: - Game(void); - ~Game(void); -private: - std::vector< Actor*> PCs; - std::vector< Actor*> NPCs; - std::vector< Map*> Maps; - std::vector< GAMJournalEntry*> Journals; - std::vector< GAMLocationEntry*> savedpositions; - std::vector< GAMLocationEntry*> planepositions; - std::vector< char*> mastarea; - CRRow *crtable; - ieResRef restmovies[8]; - ieResRef daymovies[8]; - ieResRef nightmovies[8]; - int MapIndex; -public: - std::vector< Actor*> selected; - int version; - Variables* kaputz; - ieByte* beasts; - ieByte* mazedata; //only in PST - ieResRef Familiars[9]; - ieDword CombatCounter; - ieDword StateOverrideFlag, StateOverrideTime; - ieDword BanterBlockFlag, BanterBlockTime; - - /** Index of PC selected in non-walking environment (shops, inventory...) */ - int SelectedSingle; - /** 0 if the protagonist's death doesn't cause game over */ - /** 1 if the protagonist's death causes game over */ - /** 2 if no check is needed (pst) */ - int protagonist; - /** if party size exceeds this amount, a callback will be called */ - size_t partysize; - ieDword Ticks; - ieDword interval; // 1000/AI_UPDATE (a tenth of a round in ms) - ieDword GameTime; - ieDword LastScriptUpdate; // GameTime at which UpdateScripts last ran - ieDword RealTime; - ieWord WhichFormation; - ieWord Formations[5]; - ieDword PartyGold; - ieWord NpcInParty; - ieWord WeatherBits; - ieDword Unknown48; //still unknown - ieDword Reputation; - ieDword ControlStatus; // used in bg2, iwd (where you can switch panes off) - ieDword Expansion; // mostly used by BG2. IWD games set it to 3 on newgame - ieResRef AnotherArea; - ieResRef CurrentArea; - ieResRef PreviousArea; //move here if the worldmap exit is illegal? - ieResRef LoadMos; - Actor *timestop_owner; - ieDword timestop_end; - Particles *weather; - int event_timer; - EventHandler event_handler; //like in Control - bool hasInfra; - bool familiarBlock; - bool PartyAttack; -private: - /** reads the challenge rating table */ - void LoadCRTable(); -public: - /** Returns the PC's slot count for partyID */ - int FindPlayer(unsigned int partyID); - /** Returns actor by slot */ - Actor* GetPC(unsigned int slot, bool onlyalive); - /** Finds an actor in party by party ID, returns Actor, if not there, returns NULL*/ - Actor* FindPC(unsigned int partyID); - Actor* FindNPC(unsigned int partyID); - /** Finds a global actor by global ID */ - Actor* GetGlobalActorByGlobalID(ieDword globalID); - /** Finds an actor in party, returns slot, if not there, returns -1*/ - int InParty(Actor* pc) const; - /** Finds an actor in store, returns slot, if not there, returns -1*/ - int InStore(Actor* pc) const; - /** Finds an actor in party by scripting name*/ - Actor* FindPC(const char *deathvar); - /** Finds an actor in store by scripting name*/ - Actor* FindNPC(const char *deathvar); - /** Sets the area and position of the actor to the starting position */ - void InitActorPos(Actor *actor); - /** Joins party */ - int JoinParty(Actor* pc, int join=JP_JOIN); - /** Return current party size */ - int GetPartySize(bool onlyalive) const; - /** Returns the npcs count */ - int GetNPCCount() const { return (int)NPCs.size(); } - /** Sends the hotkey trigger to all selected pcs */ - void SetHotKey(unsigned long Key); - /** Select PC for non-walking environment (shops, inventory, ...) */ - bool SelectPCSingle(int index); - /** Get index of selected PC for non-walking env (shops, inventory, ...) */ - int GetSelectedPCSingle() const; - /** (De)selects actor. */ - bool SelectActor( Actor* actor, bool select, unsigned flags ); - - /** Return current party level count for xp calculations */ - int GetPartyLevel(bool onlyalive) const; - /** Reassigns inparty numbers, call it after party creation */ - void ConsolidateParty(); - /** Removes actor from party (if in there) */ - int LeaveParty(Actor* pc); - /** Returns slot*/ - int DelPC(unsigned int slot, bool autoFree = false); - int DelNPC(unsigned int slot, bool autoFree = false); - /** Returns map in index */ - Map* GetMap(unsigned int index) const; - /** Returns a map from area name, loads it if needed - * use it for the biggest safety, change = true will change the current map */ - Map* GetMap(const char *areaname, bool change); - /** Returns slot of the map if found */ - int FindMap(const char *ResRef); - int AddMap(Map* map); - /** Determine if area is master area*/ - bool MasterArea(const char *area); - /** Dynamically adding an area to master areas*/ - void SetMasterArea(const char *area); - /** Returns slot of the map, if it was already loaded, - * don't load it again, set changepf == true, - * if you want to change the pathfinder too. */ - int LoadMap(const char* ResRef, bool loadscreen); - int DelMap(unsigned int index, int forced = 0); - int AddNPC(Actor* npc); - Actor* GetNPC(unsigned int Index); - void SwapPCs(unsigned int Index1, unsigned int Index2); - bool IsDay(); - - //journal entries - /** Deletes one or all journal entries if strref is -1 */ - void DeleteJournalEntry(ieStrRef strref); - /** Delete entries of the same group */ - void DeleteJournalGroup(int Group); - /** Adds a journal entry from dialog data. - * Time and chapter are calculated on the fly - * Returns false if the entry already exists */ - bool AddJournalEntry(ieStrRef strref, int section, int group); - /** Adds a journal entry while loading the .gam structure */ - void AddJournalEntry(GAMJournalEntry* entry); - unsigned int GetJournalCount() const; - GAMJournalEntry* FindJournalEntry(ieStrRef strref); - GAMJournalEntry* GetJournalEntry(unsigned int Index); - - //saved locations - unsigned int GetSavedLocationCount() const; - void ClearSavedLocations(); - GAMLocationEntry* GetSavedLocationEntry(unsigned int Index); - - //plane locations - unsigned int GetPlaneLocationCount() const; - void ClearPlaneLocations(); - GAMLocationEntry* GetPlaneLocationEntry(unsigned int Index); - - char *GetFamiliar(unsigned int Index); - - bool IsBeastKnown(unsigned int Index) const { - if (!beasts) { - return false; - } - if (Index>=BESTIARY_SIZE) { - return false; - } - return beasts[Index] != 0; - } - void SetBeastKnown(unsigned int Index) { - if (!beasts) { - return; - } - if (Index>=BESTIARY_SIZE) { - return; - } - beasts[Index] = 1; - } - ieWord GetFormation() const { - if (WhichFormation>4) { - return 0; - } - return Formations[WhichFormation]; - } - - /** converts challenge rating to xp */ - int GetXPFromCR(int cr); - /** shares XP among all party members */ - void ShareXP(int XP, int flags); - /** returns true if we should start the party overflow window */ - bool PartyOverflow() const; - /** returns true if any pc is attacker or being attacked */ - bool AnyPCInCombat() const; - /** returns true if the party death condition is true */ - bool EveryoneDead() const; - /** returns true if no one moves */ - bool EveryoneStopped() const; - bool EveryoneNearPoint(Map *map, const Point &p, int flags) const; - /** a party member just died now */ - void PartyMemberDied(Actor *); - /** Increments chapter variable and refreshes kill stats */ - void IncrementChapter(); - /** Sets party reputation */ - void SetReputation(ieDword r); - /** Sets the gamescreen control status (pane states, dialog textarea size) */ - void SetControlStatus(int value, int operation); - /** Sets party size (1-32000) */ - void SetPartySize(int value); - /** Sets a guiscript function to happen after x AI cycles have elapsed */ - void SetTimedEvent(EventHandler func, int count); - /** Sets protagonist mode to 0-none,1-protagonist,2-team */ - void SetProtagonistMode(int value); - void StartRainOrSnow(bool conditional, int weather); - size_t GetLoadedMapCount() const { return Maps.size(); } - /** Adds or removes gold */ - void AddGold(ieDword add); - /** Adds ticks to game time */ - void AdvanceTime(ieDword add); - /** Runs the script engine on the global script and the area scripts - areas run scripts on door, infopoint, container, actors too */ - void UpdateScripts(); - /** runs area functionality, sets partyrested trigger */ - void RestParty(int checks, int dream, int hp); - /** timestop effect initiated by actor */ - void TimeStop(Actor *actor, ieDword end); - /** check if the passed actor is a victim of timestop */ - bool TimeStoppedFor(const Actor* target=NULL); - /** updates the infravision info */ - void Infravision(); - /** gets the colour which should be applied over the game area, - may return NULL */ - const Color *GetGlobalTint() const; - /** returns true if party has infravision */ - bool PartyHasInfravision() const { return hasInfra; } - /** draw weather */ - void DrawWeather(const Region &screen, bool update); - /** updates current area music */ - void ChangeSong(bool always = true, bool force = true); - /** sets expansion mode */ - void SetExpansion(ieDword value); - /** Dumps information about the object */ - void DebugDump(); - /** Finds an actor by global ID */ - Actor *GetActorByGlobalID(ieDword objectID); - /** Allocates maze data */ - ieByte *AllocateMazeData(); - /** Checks if any timestop effects are active */ - bool IsTimestopActive(); -private: - bool DetermineStartPosType(const TableMgr *strta); - ieResRef *GetDream(Map *area); - void PlayerDream(); -}; - -#endif // ! GAME_H diff --git a/project/jni/application/gemrb/gemrb/core/GameData.cpp b/project/jni/application/gemrb/gemrb/core/GameData.cpp deleted file mode 100644 index f4c82b53f..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameData.cpp +++ /dev/null @@ -1,549 +0,0 @@ -/* GemRB - Infinity Engine Emulator -* Copyright (C) 2003-2005 The GemRB Project -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. - -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. - -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* -*/ - -#include "GameData.h" - -#include "globals.h" - -#include "ActorMgr.h" -#include "AnimationMgr.h" -#include "Cache.h" -#include "CharAnimations.h" -#include "Effect.h" -#include "EffectMgr.h" -#include "Factory.h" -#include "Game.h" -#include "ImageFactory.h" -#include "ImageMgr.h" -#include "Interface.h" -#include "Item.h" -#include "ItemMgr.h" -#include "PluginMgr.h" -#include "ResourceDesc.h" -#include "ScriptedAnimation.h" -#include "Spell.h" -#include "SpellMgr.h" -#include "StoreMgr.h" -#include "Scriptable/Actor.h" -#include "System/FileStream.h" - -#include - -static void ReleaseItem(void *poi) -{ - delete ((Item *) poi); -} - -static void ReleaseSpell(void *poi) -{ - delete ((Spell *) poi); -} - -static void ReleaseEffect(void *poi) -{ - delete ((Effect *) poi); -} - -static void ReleasePalette(void *poi) -{ - //we allow nulls, but we shouldn't release them - if (!poi) return; - //as long as palette has its own refcount, this should be Release - ((Palette *) poi)->Release(); -} - -GEM_EXPORT GameData* gamedata; - -GameData::GameData() -{ - factory = new Factory(); -} - -GameData::~GameData() -{ - delete factory; -} - -void GameData::ClearCaches() -{ - ItemCache.RemoveAll(ReleaseItem); - SpellCache.RemoveAll(ReleaseSpell); - EffectCache.RemoveAll(ReleaseEffect); - PaletteCache.RemoveAll(ReleasePalette); -} - -Actor *GameData::GetCreature(const char* ResRef, unsigned int PartySlot) -{ - DataStream* ds = GetResource( ResRef, IE_CRE_CLASS_ID ); - if (!ds) - return 0; - - PluginHolder actormgr(IE_CRE_CLASS_ID); - if (!actormgr->Open(ds)) { - return 0; - } - Actor* actor = actormgr->GetActor(PartySlot); - return actor; -} - -int GameData::LoadCreature(const char* ResRef, unsigned int PartySlot, bool character, int VersionOverride) -{ - DataStream *stream; - - Actor* actor; - if (character) { - char nPath[_MAX_PATH], fName[16]; - snprintf( fName, sizeof(fName), "%s.chr", ResRef); - PathJoin( nPath, core->GamePath, "characters", fName, NULL ); - stream = FileStream::OpenFile(nPath); - PluginHolder actormgr(IE_CRE_CLASS_ID); - if (!actormgr->Open(stream)) { - return -1; - } - actor = actormgr->GetActor(PartySlot); - } else { - actor = GetCreature(ResRef, PartySlot); - } - - if ( !actor ) { - return -1; - } - - if (VersionOverride != -1) { - actor->version = VersionOverride; - } - - //both fields are of length 9, make this sure! - memcpy(actor->Area, core->GetGame()->CurrentArea, sizeof(actor->Area) ); - if (actor->BaseStats[IE_STATE_ID] & STATE_DEAD) { - actor->SetStance( IE_ANI_TWITCH ); - } else { - actor->SetStance( IE_ANI_AWAKE ); - } - actor->SetOrientation( 0, false ); - - if ( PartySlot != 0 ) { - return core->GetGame()->JoinParty( actor, JP_JOIN|JP_INITPOS ); - } - else { - return core->GetGame()->AddNPC( actor ); - } -} - -/** Loads a 2DA Table, returns -1 on error or the Table Index on success */ -int GameData::LoadTable(const ieResRef ResRef) -{ - int ind = GetTableIndex( ResRef ); - if (ind != -1) { - tables[ind].refcount++; - return ind; - } - //print("(%s) Table not found... Loading from file\n", ResRef); - DataStream* str = GetResource( ResRef, IE_2DA_CLASS_ID ); - if (!str) { - return -1; - } - PluginHolder tm(IE_2DA_CLASS_ID); - if (!tm) { - delete str; - return -1; - } - if (!tm->Open(str)) { - return -1; - } - Table t; - t.refcount = 1; - strncpy( t.ResRef, ResRef, 8 ); - t.tm = tm; - ind = -1; - for (size_t i = 0; i < tables.size(); i++) { - if (tables[i].refcount == 0) { - ind = ( int ) i; - break; - } - } - if (ind != -1) { - tables[ind] = t; - return ind; - } - tables.push_back( t ); - return ( int ) tables.size() - 1; -} -/** Gets the index of a loaded table, returns -1 on error */ -int GameData::GetTableIndex(const char* ResRef) const -{ - for (size_t i = 0; i < tables.size(); i++) { - if (tables[i].refcount == 0) - continue; - if (strnicmp( tables[i].ResRef, ResRef, 8 ) == 0) - return ( int ) i; - } - return -1; -} -/** Gets a Loaded Table by its index, returns NULL on error */ -Holder GameData::GetTable(unsigned int index) const -{ - if (index >= tables.size()) { - return NULL; - } - if (tables[index].refcount == 0) { - return NULL; - } - return tables[index].tm; -} - -/** Frees a Loaded Table, returns false on error, true on success */ -bool GameData::DelTable(unsigned int index) -{ - if (index==0xffffffff) { - tables.clear(); - return true; - } - if (index >= tables.size()) { - return false; - } - if (tables[index].refcount == 0) { - return false; - } - tables[index].refcount--; - if (tables[index].refcount == 0) - if (tables[index].tm) - tables[index].tm.release(); - return true; -} - -Palette *GameData::GetPalette(const ieResRef resname) -{ - Palette *palette = (Palette *) PaletteCache.GetResource(resname); - if (palette) { - return palette; - } - //additional hack for allowing NULL's - if (PaletteCache.RefCount(resname)!=-1) { - return NULL; - } - ResourceHolder im(resname); - if (im == NULL) { - PaletteCache.SetAt(resname, NULL); - return NULL; - } - - palette = new Palette(); - im->GetPalette(256,palette->col); - palette->named=true; - PaletteCache.SetAt(resname, (void *) palette); - return palette; -} - -void GameData::FreePalette(Palette *&pal, const ieResRef name) -{ - int res; - - if (!pal) { - return; - } - if (!name || !name[0]) { - if(pal->named) { - error("GameData", "Palette is supposed to be named, but got no name!\n"); - } else { - pal->Release(); - pal=NULL; - } - return; - } - if (!pal->named) { - error("GameData", "Unnamed palette, it should be %s!\n", name); - } - res=PaletteCache.DecRef((void *) pal, name, true); - if (res<0) { - error("Core", "Corrupted Palette cache encountered (reference count went below zero), Palette name is: %.8s\n", name); - } - if (!res) { - pal->Release(); - } - pal = NULL; -} - -Item* GameData::GetItem(const ieResRef resname) -{ - Item *item = (Item *) ItemCache.GetResource(resname); - if (item) { - return item; - } - DataStream* str = GetResource( resname, IE_ITM_CLASS_ID ); - PluginHolder sm(IE_ITM_CLASS_ID); - if (!sm) { - delete ( str ); - return NULL; - } - if (!sm->Open(str)) { - return NULL; - } - - item = new Item(); - //this is required for storing the 'source' - strnlwrcpy(item->Name, resname, 8); - sm->GetItem( item ); - if (item == NULL) { - return NULL; - } - - ItemCache.SetAt(resname, (void *) item); - return item; -} - -//you can supply name for faster access -void GameData::FreeItem(Item const *itm, const ieResRef name, bool free) -{ - int res; - - res=ItemCache.DecRef((void *) itm, name, free); - if (res<0) { - error("Core", "Corrupted Item cache encountered (reference count went below zero), Item name is: %.8s\n", name); - } - if (res) return; - if (free) delete itm; -} - -Spell* GameData::GetSpell(const ieResRef resname, bool silent) -{ - Spell *spell = (Spell *) SpellCache.GetResource(resname); - if (spell) { - return spell; - } - DataStream* str = GetResource( resname, IE_SPL_CLASS_ID, silent ); - PluginHolder sm(IE_SPL_CLASS_ID); - if (!sm) { - delete ( str ); - return NULL; - } - if (!sm->Open(str)) { - return NULL; - } - - spell = new Spell(); - //this is required for storing the 'source' - strnlwrcpy(spell->Name, resname, 8); - sm->GetSpell( spell, silent ); - if (spell == NULL) { - return NULL; - } - - SpellCache.SetAt(resname, (void *) spell); - return spell; -} - -void GameData::FreeSpell(Spell *spl, const ieResRef name, bool free) -{ - int res; - - res=SpellCache.DecRef((void *) spl, name, free); - if (res<0) { - printMessage("Core", "Corrupted Spell cache encountered (reference count went below zero), Spell name is: %.8s or %.8s\n", LIGHT_RED, - name, spl->Name); - abort(); - } - if (res) return; - if (free) delete spl; -} - -Effect* GameData::GetEffect(const ieResRef resname) -{ - Effect *effect = (Effect *) EffectCache.GetResource(resname); - if (effect) { - return effect; - } - DataStream* str = GetResource( resname, IE_EFF_CLASS_ID ); - PluginHolder em(IE_EFF_CLASS_ID); - if (!em) { - delete ( str ); - return NULL; - } - if (!em->Open(str)) { - return NULL; - } - - effect = em->GetEffect(new Effect() ); - if (effect == NULL) { - return NULL; - } - - EffectCache.SetAt(resname, (void *) effect); - return effect; -} - -void GameData::FreeEffect(Effect *eff, const ieResRef name, bool free) -{ - int res; - - res=EffectCache.DecRef((void *) eff, name, free); - if (res<0) { - error("Core", "Corrupted Effect cache encountered (reference count went below zero), Effect name is: %.8s\n", name); - } - if (res) return; - if (free) delete eff; -} - -//if the default setup doesn't fit for an animation -//create a vvc for it! -ScriptedAnimation* GameData::GetScriptedAnimation( const char *effect, bool doublehint) -{ - ScriptedAnimation *ret = NULL; - - if (Exists( effect, IE_VVC_CLASS_ID, true ) ) { - DataStream *ds = GetResource( effect, IE_VVC_CLASS_ID ); - ret = new ScriptedAnimation(ds); - } else { - AnimationFactory *af = (AnimationFactory *) - GetFactoryResource( effect, IE_BAM_CLASS_ID, IE_NORMAL ); - if (af) { - ret = new ScriptedAnimation(); - ret->LoadAnimationFactory( af, doublehint?2:0); - } - } - if (ret) { - strnlwrcpy(ret->ResName, effect, 8); - } - return ret; -} - -// Return single BAM frame as a sprite. Use if you want one frame only, -// otherwise it's not efficient -Sprite2D* GameData::GetBAMSprite(const ieResRef ResRef, int cycle, int frame) -{ - Sprite2D *tspr; - AnimationFactory* af = ( AnimationFactory* ) - GetFactoryResource( ResRef, IE_BAM_CLASS_ID, IE_NORMAL ); - if (!af) return 0; - if (cycle == -1) - tspr = af->GetFrameWithoutCycle( (unsigned short) frame ); - else - tspr = af->GetFrame( (unsigned short) frame, (unsigned char) cycle ); - return tspr; -} - -void* GameData::GetFactoryResource(const char* resname, SClass_ID type, - unsigned char mode, bool silent) -{ - int fobjindex = factory->IsLoaded(resname,type); - // already cached - if ( fobjindex != -1) - return factory->GetFactoryObject( fobjindex ); - - // empty resref - if (!strcmp(resname, "")) - return NULL; - - switch (type) { - case IE_BAM_CLASS_ID: - { - DataStream* ret = GetResource( resname, type, silent ); - if (ret) { - PluginHolder ani(IE_BAM_CLASS_ID); - if (!ani) - return NULL; - if (!ani->Open(ret)) - return NULL; - AnimationFactory* af = ani->GetAnimationFactory( resname, mode ); - factory->AddFactoryObject( af ); - return af; - } - return NULL; - } - case IE_BMP_CLASS_ID: - { - ResourceHolder img(resname); - if (img) { - ImageFactory* fact = img->GetImageFactory( resname ); - factory->AddFactoryObject( fact ); - return fact; - } - - return NULL; - } - default: - print( "\n" ); - printMessage("KEYImporter", "%s files are not supported.\n", WHITE, - core->TypeExt(type)); - return NULL; - } -} - -Store* GameData::GetStore(const ieResRef ResRef) -{ - StoreMap::iterator it = stores.find(ResRef); - if (it != stores.end()) { - return it->second; - } - - DataStream* str = gamedata->GetResource(ResRef, IE_STO_CLASS_ID); - PluginHolder sm(IE_STO_CLASS_ID); - if (sm == NULL) { - delete ( str ); - return NULL; - } - if (!sm->Open(str)) { - return NULL; - } - - Store* store = sm->GetStore(new Store()); - if (store == NULL) { - return NULL; - } - strnlwrcpy(store->Name, ResRef, 8); - // The key needs to last as long as the store, - // so use the one we just copied. - stores[store->Name] = store; - return store; -} - -void GameData::SaveStore(Store* store) -{ - if (!store) - return; - StoreMap::iterator it = stores.find(store->Name); - if (it == stores.end()) { - error("GameData", "Saving a store that wasn't cached."); - } - - PluginHolder sm(IE_STO_CLASS_ID); - if (sm == NULL) { - error("GameData", "Can't save store to cache."); - } - - FileStream str; - - if (!str.Create(store->Name, IE_STO_CLASS_ID)) { - error("GameData", "Can't create file while saving store."); - } - if (!sm->PutStore(&str, store)) { - error("GameData", "Error saving store."); - } - - stores.erase(it); - delete store; -} - -void GameData::SaveAllStores() -{ - while (!stores.empty()) { - SaveStore(stores.begin()->second); - } -} diff --git a/project/jni/application/gemrb/gemrb/core/GameData.h b/project/jni/application/gemrb/gemrb/core/GameData.h deleted file mode 100644 index 30c9aaf68..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameData.h +++ /dev/null @@ -1,138 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef GAMEDATA_H -#define GAMEDATA_H - -#include "SClassID.h" -#include "exports.h" -#include "ie_types.h" -#include "iless.h" - -#include "Cache.h" -#include "Holder.h" -#include "ResourceManager.h" - -#include -#include - -#ifdef _MSC_VER // No SFINAE -#include "TableMgr.h" -#endif - -class Actor; -struct Effect; -class Factory; -class Item; -class Palette; -class ScriptedAnimation; -class Spell; -class Sprite2D; -class TableMgr; -class Store; - -struct Table { - Holder tm; - char ResRef[8]; - unsigned int refcount; -}; - -class GEM_EXPORT GameData : public ResourceManager -{ -public: - GameData(); - ~GameData(); - - void ClearCaches(); - - /** Returns actor */ - Actor *GetCreature(const char *ResRef, unsigned int PartySlot=0); - /** Returns a PC index, by loading a creature */ - int LoadCreature(const char *ResRef, unsigned int PartySlot, bool character=false, int VersionOverride=-1); - - - // 2DA table functions. - // (See also the AutoTable class) - - /** Loads a 2DA Table, returns -1 on error or the Table Index on success */ - int LoadTable(const char * ResRef); - /** Gets the index of a loaded table, returns -1 on error */ - int GetTableIndex(const char * ResRef) const; - /** Gets a Loaded Table by its index, returns NULL on error */ - Holder GetTable(unsigned int index) const; - /** Frees a Loaded Table, returns false on error, true on success */ - bool DelTable(unsigned int index); - - Palette* GetPalette(const ieResRef resname); - void FreePalette(Palette *&pal, const ieResRef name=NULL); - - Item* GetItem(const ieResRef resname); - void FreeItem(Item const *itm, const ieResRef name, bool free=false); - Spell* GetSpell(const ieResRef resname, bool silent=false); - void FreeSpell(Spell *spl, const ieResRef name, bool free=false); - Effect* GetEffect(const ieResRef resname); - void FreeEffect(Effect *eff, const ieResRef name, bool free=false); - - /** creates a vvc/bam animation object at point */ - ScriptedAnimation* GetScriptedAnimation( const char *ResRef, bool doublehint); - - /** returns a single sprite (not cached) from a BAM resource */ - Sprite2D* GetBAMSprite(const ieResRef ResRef, int cycle, int frame); - - /** returns factory resource, currently works only with animations */ - void* GetFactoryResource(const char* resname, SClass_ID type, - unsigned char mode = IE_NORMAL, bool silent=false); - - Store* GetStore(const ieResRef ResRef); - /// Saves a store to the cache and frees it. - void SaveStore(Store* store); - /// Saves all stores in the cache - void SaveAllStores(); -private: - Cache ItemCache; - Cache SpellCache; - Cache EffectCache; - Cache PaletteCache; - Factory* factory; - std::vector tables; - typedef std::map StoreMap; - StoreMap stores; -}; - -extern GEM_EXPORT GameData * gamedata; - -template -class ResourceHolder : public Holder -{ -public: - ResourceHolder() - { - } - ResourceHolder(const char* resname) - : Holder(static_cast(gamedata->GetResource(resname,&T::ID))) - { - } - ResourceHolder(const char* resname, const ResourceManager& manager, bool silent = false) - : Holder(static_cast(manager.GetResource(resname,&T::ID,silent))) - { - } -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp deleted file mode 100644 index 89c11ddf6..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp +++ /dev/null @@ -1,7243 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/GameScript.h" - -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" - -#include "win32def.h" - -#include "AmbientMgr.h" -#include "Audio.h" -#include "CharAnimations.h" -#include "DataFileMgr.h" -#include "DialogHandler.h" -#include "DisplayMessage.h" -#include "Game.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "IniSpawn.h" -#include "Item.h" -#include "Map.h" -#include "MusicMgr.h" -#include "SaveGameIterator.h" -#include "ScriptEngine.h" -#include "TileMap.h" -#include "Video.h" -#include "WorldMap.h" -#include "GUI/GameControl.h" -#include "GUI/EventMgr.h" -#include "Scriptable/Container.h" -#include "Scriptable/Door.h" -#include "Scriptable/InfoPoint.h" - -//------------------------------------------------------------ -// Action Functions -//------------------------------------------------------------- - -void GameScript::SetExtendedNight(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - //sets the 'can rest other' bit - if (parameters->int0Parameter) { - map->AreaType|=AT_EXTENDED_NIGHT; - } else { - map->AreaType&=~AT_EXTENDED_NIGHT; - } -} - -void GameScript::SetAreaRestFlag(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - //sets the 'can rest other' bit - if (parameters->int0Parameter) { - map->AreaType|=AT_CAN_REST; - } else { - map->AreaType&=~AT_CAN_REST; - } -} - -void GameScript::AddAreaFlag(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->AreaFlags|=parameters->int0Parameter; -} - -void GameScript::RemoveAreaFlag(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->AreaFlags&=~parameters->int0Parameter; -} - -void GameScript::SetAreaFlags(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - ieDword value = map->AreaFlags; - HandleBitMod( value, parameters->int0Parameter, parameters->int1Parameter); - map->AreaFlags=value; -} - -void GameScript::AddAreaType(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->AreaType|=parameters->int0Parameter; -} - -void GameScript::RemoveAreaType(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->AreaType&=~parameters->int0Parameter; -} - -void GameScript::NoActionAtAll(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - //thats all :) -} - -// this action stops modal actions, so... -void GameScript::NoAction(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetModal( MS_NONE); -} - -void GameScript::SG(Scriptable* Sender, Action* parameters) -{ - SetVariable( Sender, parameters->string0Parameter, "GLOBAL", parameters->int0Parameter ); -} - -void GameScript::SetGlobal(Scriptable* Sender, Action* parameters) -{ - SetVariable( Sender, parameters->string0Parameter, parameters->int0Parameter ); -} - -void GameScript::SetGlobalRandom(Scriptable* Sender, Action* parameters) -{ - int max=parameters->int1Parameter-parameters->int0Parameter+1; - if (max>0) { - SetVariable( Sender, parameters->string0Parameter, RandomNumValue%max+parameters->int0Parameter ); - } else { - SetVariable( Sender, parameters->string0Parameter, 0); - } -} - -void GameScript::StartTimer(Scriptable* Sender, Action* parameters) -{ - Sender->StartTimer(parameters->int0Parameter, parameters->int1Parameter); -} - -void GameScript::StartRandomTimer(Scriptable* Sender, Action* parameters) -{ - ieDword value = core->Roll(1, parameters->int2Parameter-parameters->int1Parameter, parameters->int2Parameter-1); - Sender->StartTimer(parameters->int0Parameter, value); -} - -void GameScript::SetGlobalTimer(Scriptable* Sender, Action* parameters) -{ - ieDword mytime; - - mytime=core->GetGame()->GameTime; //gametime (should increase it) - SetVariable( Sender, parameters->string0Parameter, - parameters->int0Parameter*AI_UPDATE_TIME + mytime); -} - -void GameScript::SetGlobalTimerRandom(Scriptable* Sender, Action* parameters) -{ - ieDword mytime; - int random; - - //This works both ways in the original engine - if (parameters->int1Parameter>parameters->int0Parameter) { - random = parameters->int1Parameter-parameters->int0Parameter+1; - //random cannot be 0, its minimal value is 1 - random = RandomNumValue % random + parameters->int0Parameter; - } else { - random = parameters->int0Parameter-parameters->int1Parameter+1; - random = RandomNumValue % random + parameters->int1Parameter; - } - mytime=core->GetGame()->GameTime; //gametime (should increase it) - SetVariable( Sender, parameters->string0Parameter, random*AI_UPDATE_TIME + mytime); -} - -void GameScript::SetGlobalTimerOnce(Scriptable* Sender, Action* parameters) -{ - ieDword mytime = CheckVariable( Sender, parameters->string0Parameter ); - if (mytime != 0) { - return; - } - mytime=core->GetGame()->GameTime; //gametime (should increase it) - SetVariable( Sender, parameters->string0Parameter, - parameters->int0Parameter*AI_UPDATE_TIME + mytime); -} - -void GameScript::RealSetGlobalTimer(Scriptable* Sender, Action* parameters) -{ - ieDword mytime=core->GetGame()->RealTime; - - SetVariable( Sender, parameters->string0Parameter, - parameters->int0Parameter*AI_UPDATE_TIME + mytime); -} - -void GameScript::ChangeAllegiance(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_EA, parameters->int0Parameter ); -} - -void GameScript::ChangeGeneral(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_GENERAL, parameters->int0Parameter ); -} - -void GameScript::ChangeRace(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_RACE, parameters->int0Parameter ); -} - -void GameScript::ChangeClass(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_CLASS, parameters->int0Parameter ); -} - -void GameScript::SetNamelessClass(Scriptable* /*Sender*/, Action* parameters) -{ - //same as Protagonist - Actor* actor = core->GetGame()->GetPC(0, false); - actor->SetBase( IE_CLASS, parameters->int0Parameter ); -} - -void GameScript::SetNamelessDisguise(Scriptable* Sender, Action* parameters) -{ - SetVariable(Sender, "APPEARANCE", "GLOBAL", parameters->int0Parameter); - core->SetEventFlag(EF_UPDATEANIM); -} - -void GameScript::ChangeSpecifics(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_SPECIFIC, parameters->int0Parameter ); -} - -void GameScript::PermanentStatChange(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - ieDword value; - switch (parameters->int1Parameter) { - case 1: - value = actor->GetBase(parameters->int0Parameter); - value-= parameters->int2Parameter; - break; - case 2: - value = actor->GetBase(parameters->int0Parameter); - value+= parameters->int2Parameter; - break; - case 3: - default: //no idea what happens - value = parameters->int2Parameter; - break; - } - actor->SetBase( parameters->int0Parameter, value); -} - -void GameScript::ChangeStat(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - ieDword value = parameters->int1Parameter; - if (parameters->int2Parameter==1) { - value+=actor->GetBase(parameters->int0Parameter); - } - actor->SetBase( parameters->int0Parameter, value); -} - -void GameScript::ChangeStatGlobal(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - ieDword value = (ieDword) CheckVariable( Sender, parameters->string0Parameter, parameters->string1Parameter ); - Actor* actor = ( Actor* ) scr; - if (parameters->int1Parameter==1) { - value+=actor->GetBase(parameters->int0Parameter); - } - actor->SetBase( parameters->int0Parameter, value); -} - -void GameScript::ChangeGender(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_SEX, parameters->int0Parameter ); -} - -void GameScript::ChangeAlignment(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_ALIGNMENT, parameters->int0Parameter ); -} - -void GameScript::SetFaction(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_FACTION, parameters->int0Parameter ); -} - -void GameScript::SetHP(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_HITPOINTS, parameters->int0Parameter ); -} - -void GameScript::SetHPPercent(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->NewBase( IE_HITPOINTS, parameters->int0Parameter, MOD_PERCENT); -} - -void GameScript::AddHP(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->NewBase(IE_HITPOINTS, parameters->int0Parameter, MOD_ADDITIVE); -} - -//this works on an object (pst) -//but can also work on actor itself (gemrb) -void GameScript::SetTeam(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - actor->SetBase( IE_TEAM, parameters->int0Parameter ); -} - -//this works on an object (gemrb) -//or on Myself if object isn't given (iwd2) -void GameScript::SetTeamBit(Scriptable* Sender, Action* parameters) -{ - Scriptable *scr = Sender; - if (parameters->objects[1]) { - scr=GetActorFromObject( Sender, parameters->objects[1] ); - } - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) scr; - if (parameters->int1Parameter) { - actor->SetBase( IE_TEAM, actor->GetStat(IE_TEAM) | parameters->int0Parameter ); - } else { - actor->SetBase( IE_TEAM, actor->GetStat(IE_TEAM) & ~parameters->int0Parameter ); - } -} - -void GameScript::TriggerActivation(Scriptable* Sender, Action* parameters) -{ - Scriptable* ip; - - if (!parameters->objects[1]) { - ip=Sender; - } else { - ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); - } - if (!ip || (ip->Type!=ST_TRIGGER && ip->Type!=ST_TRAVEL && ip->Type!=ST_PROXIMITY)) { - print("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); - return; - } - InfoPoint *trigger = (InfoPoint *) ip; - if ( parameters->int0Parameter != 0 ) { - trigger->Flags &= ~TRAP_DEACTIVATED; - } else { - trigger->Flags |= TRAP_DEACTIVATED; - } -} - -void GameScript::FadeToColor(Scriptable* Sender, Action* parameters) -{ - core->timer->SetFadeToColor( parameters->pointParameter.x ); -// Sender->SetWait( parameters->pointParameter.x ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::FadeFromColor(Scriptable* Sender, Action* parameters) -{ - core->timer->SetFadeFromColor( parameters->pointParameter.x ); -// Sender->SetWait( parameters->pointParameter.x ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::FadeToAndFromColor(Scriptable* Sender, Action* parameters) -{ - core->timer->SetFadeToColor( parameters->pointParameter.x ); - core->timer->SetFadeFromColor( parameters->pointParameter.x ); -// Sender->SetWait( parameters->pointParameter.x<<1 ); //multiply by 2 - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::JumpToPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* ab = ( Actor* ) Sender; - ab->SetPosition( parameters->pointParameter, true ); -} - -void GameScript::JumpToPointInstant(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* ab = ( Actor* ) tar; - ab->SetPosition( parameters->pointParameter, true ); -} - -/** instant jump to location saved in stats */ -/** default subject is the current actor */ -void GameScript::JumpToSavedLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor *actor = (Actor *) tar; - Point p((short) actor->GetStat(IE_SAVEDXPOS), (short) actor->GetStat(IE_SAVEDYPOS) ); - actor->SetPosition(p, true ); - actor->SetOrientation( actor->GetStat(IE_SAVEDFACE), false ); -} - -void GameScript::JumpToObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - - if (!tar) { - return; - } - const Map *map = tar->GetCurrentArea(); - - if (map) { - if (parameters->string0Parameter[0]) { - CreateVisualEffectCore(Sender, Sender->Pos, parameters->string0Parameter, 0); - } - MoveBetweenAreasCore( (Actor *) Sender, map->GetScriptName(), tar->Pos, -1, true); - } -} - -void GameScript::TeleportParty(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *tar = game->GetPC(i, false); - MoveBetweenAreasCore( tar, parameters->string0Parameter, - parameters->pointParameter, -1, true); - } -} - -//5 is the ToB value, but it might be useful to have multiple expansions -void GameScript::MoveToExpansion(Scriptable* Sender, Action* parameters) -{ - Game *game = core->GetGame(); - - if (!parameters->int0Parameter) { - parameters->int0Parameter = 5; - } - game->SetExpansion(parameters->int0Parameter); - Sender->ReleaseCurrentAction(); -} - -//add some animation effects too? -void GameScript::ExitPocketPlane(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game *game = core->GetGame(); - for (int i = 0; i < game->GetPartySize(false); i++) { - Actor* act = game->GetPC( i, false ); - if (act) { - if (game->GetPlaneLocationCount() <= (unsigned int)i) { - // what are we meant to do here? - print("argh, couldn't restore party member %d!", i + 1); - continue; - } - GAMLocationEntry *gle = game->GetPlaneLocationEntry(i); - MoveBetweenAreasCore(act, gle->AreaResRef, gle->Pos, -1, true); - } - } - - // don't clear locations! -} - -//moves pcs and npcs from an area to another area -void GameScript::MoveGlobalsTo(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *tar = game->GetPC(i, false); - //if the actor isn't in the area, we don't care - if (strnicmp(tar->Area, parameters->string0Parameter,8) ) { - continue; - } - MoveBetweenAreasCore( tar, parameters->string1Parameter, - parameters->pointParameter, -1, true); - } - i = game->GetNPCCount(); - while (i--) { - Actor *tar = game->GetNPC(i); - //if the actor isn't in the area, we don't care - if (strnicmp(tar->Area, parameters->string0Parameter,8) ) { - continue; - } - MoveBetweenAreasCore( tar, parameters->string1Parameter, - parameters->pointParameter, -1, true); - } -} - -void GameScript::MoveGlobal(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - - MoveBetweenAreasCore( (Actor *) tar, parameters->string0Parameter, - parameters->pointParameter, -1, true); -} - -//we also allow moving to door, container -void GameScript::MoveGlobalObject(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Scriptable* to = GetActorFromObject( Sender, parameters->objects[2] ); - if (!to) { - return; - } - const Map *map = to->GetCurrentArea(); - - if (map) { - MoveBetweenAreasCore( (Actor *) tar, map->GetScriptName(), - to->Pos, -1, true); - } -} - -void GameScript::MoveGlobalObjectOffScreen(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Scriptable* to = GetActorFromObject( Sender, parameters->objects[2] ); - if (!to) { - return; - } - MoveBetweenAreasCore( (Actor *) tar, parameters->string0Parameter, - to->Pos, -1, false); -} - -//don't use offset from Sender -void GameScript::CreateCreature(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_CHECK_IMPASSABLE|CC_CHECK_OVERLAP|CC_SCRIPTNAME ); -} - -//another highly redundant action -void GameScript::CreateCreatureDoor(Scriptable* Sender, Action* parameters) -{ - //we hack this to death - strcpy(parameters->string1Parameter, "SPDIMNDR"); - CreateCreatureCore( Sender, parameters, CC_CHECK_IMPASSABLE|CC_CHECK_OVERLAP | CC_PLAY_ANIM ); -} - -//another highly redundant action -void GameScript::CreateCreatureObjectDoor(Scriptable* Sender, Action* parameters) -{ - //we hack this to death - strcpy(parameters->string1Parameter, "SPDIMNDR"); - CreateCreatureCore( Sender, parameters, CC_OBJECT | CC_CHECK_IMPASSABLE|CC_CHECK_OVERLAP | CC_PLAY_ANIM ); -} - -//don't use offset from Sender -void GameScript::CreateCreatureImpassable(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_CHECK_OVERLAP ); -} - -void GameScript::CreateCreatureImpassableAllowOverlap(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, 0 ); -} - -//use offset from Sender -void GameScript::CreateCreatureAtFeet(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_OFFSET | CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP); -} - -void GameScript::CreateCreatureOffScreen(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_OFFSCREEN | CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP ); -} - -//creates copy at actor, plays animation -void GameScript::CreateCreatureObjectCopy(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_OBJECT | CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP | CC_COPY | CC_PLAY_ANIM ); -} - -//creates copy at absolute point -void GameScript::CreateCreatureCopyPoint(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP | CC_COPY | CC_PLAY_ANIM ); -} - -//this is the same, object + offset -//using this for simple createcreatureobject, (0 offsets) -//createcreatureobjecteffect may have animation -void GameScript::CreateCreatureObjectOffset(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_OBJECT | CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP | CC_PLAY_ANIM); -} - -void GameScript::CreateCreatureObjectOffScreen(Scriptable* Sender, Action* parameters) -{ - CreateCreatureCore( Sender, parameters, CC_OFFSCREEN | CC_OBJECT | CC_CHECK_IMPASSABLE | CC_CHECK_OVERLAP ); -} - -//I think this simply removes the cursor and hides the gui without disabling scripts -//See Interface::SetCutSceneMode -void GameScript::SetCursorState(Scriptable* /*Sender*/, Action* parameters) -{ - int active = parameters->int0Parameter; - - Game *game = core->GetGame(); - if (active) { - game->ControlStatus |= CS_HIDEGUI; - } else { - game->ControlStatus &= ~CS_HIDEGUI; - } - core->SetEventFlag(EF_CONTROL); - core->GetVideoDriver()->SetMouseEnabled(!active); -} - -void GameScript::StartCutSceneMode(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->SetCutSceneMode( true ); -} - -void GameScript::EndCutSceneMode(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->SetCutSceneMode( false ); -} - -void GameScript::StartCutScene(Scriptable* Sender, Action* parameters) -{ - GameScript* gs = new GameScript( parameters->string0Parameter, Sender ); - gs->EvaluateAllBlocks(); - delete( gs ); -} - -void GameScript::CutSceneID(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - // shouldn't get called - printMessage("GameScript","CutSceneID was called!\n",YELLOW); -} - -void GameScript::Enemy(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetBase( IE_EA, EA_ENEMY ); -} - -void GameScript::Ally(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetBase( IE_EA, EA_ALLY ); -} - -/** GemRB extension: you can replace baldur.bcs */ -void GameScript::ChangeAIScript(Scriptable* Sender, Action* parameters) -{ - if (parameters->int0Parameter>=MAX_SCRIPTS) { - return; - } - //clearing the queue, and checking script level was intentionally removed - Sender->SetScript( parameters->string0Parameter, parameters->int0Parameter, false ); -} - -void GameScript::ForceAIScript(Scriptable* Sender, Action* parameters) -{ - if (parameters->int0Parameter>=MAX_SCRIPTS) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - //clearing the queue, and checking script level was intentionally removed - actor->SetScript( parameters->string0Parameter, parameters->int0Parameter, false ); -} - -void GameScript::SetPlayerSound(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->StrRefs[parameters->int0Parameter]=parameters->int1Parameter; -} - -//this one works only on real actors, they got constants -void GameScript::VerbalConstantHead(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - DisplayStringCore( tar, parameters->int0Parameter, DS_HEAD|DS_CONSOLE|DS_CONST); -} - -void GameScript::VerbalConstant(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - DisplayStringCore( tar, parameters->int0Parameter, DS_CONSOLE|DS_CONST); -} - -//bg2 - variable -void GameScript::SaveLocation(Scriptable* Sender, Action* parameters) -{ - ieDword value = parameters->pointParameter.asDword(); - if (!parameters->string0Parameter[0]) { - strcpy(parameters->string0Parameter,"LOCALSsavedlocation"); - } - SetVariable(Sender, parameters->string0Parameter, value); -} - -//PST:has parameters, IWD2: no params -void GameScript::SetSavedLocation(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - //iwd2 - if (parameters->pointParameter.isnull()) { - actor->SetBase(IE_SAVEDXPOS, actor->Pos.x); - actor->SetBase(IE_SAVEDYPOS, actor->Pos.y); - actor->SetBase(IE_SAVEDFACE, actor->GetOrientation()); - return; - } - //pst - actor->SetBase(IE_SAVEDXPOS, parameters->pointParameter.x); - actor->SetBase(IE_SAVEDYPOS, parameters->pointParameter.y); - actor->SetBase(IE_SAVEDFACE, parameters->int0Parameter); -} -//IWD2, sets the homepoint int0,int1,int2 -void GameScript::SetSavedLocationPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetBase(IE_SAVEDXPOS, parameters->int0Parameter); - actor->SetBase(IE_SAVEDYPOS, parameters->int1Parameter); - actor->SetBase(IE_SAVEDFACE, parameters->int2Parameter); -} -//IWD2, sets the homepoint P -void GameScript::SetStartPos(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetBase(IE_SAVEDXPOS, parameters->pointParameter.x); - actor->SetBase(IE_SAVEDYPOS, parameters->pointParameter.y); - actor->SetBase(IE_SAVEDFACE, parameters->int0Parameter); -} - -void GameScript::SaveObjectLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - ieDword value = tar->Pos.asDword(); - if (!parameters->string0Parameter[0]) { - strcpy(parameters->string0Parameter,"LOCALSsavedlocation"); - } - SetVariable(Sender, parameters->string0Parameter, value); -} - -/** you may omit the string0Parameter, in this case this will be a */ -/** CreateCreatureAtSavedLocation */ -void GameScript::CreateCreatureAtLocation(Scriptable* Sender, Action* parameters) -{ - if (!parameters->string0Parameter[0]) { - strcpy(parameters->string0Parameter,"LOCALSsavedlocation"); - } - ieDword value = CheckVariable(Sender, parameters->string0Parameter); - parameters->pointParameter.y = (ieWord) (value & 0xffff); - parameters->pointParameter.x = (ieWord) (value >> 16); - CreateCreatureCore(Sender, parameters, CC_CHECK_IMPASSABLE|CC_STRING1); -} - -void GameScript::WaitRandom(Scriptable* Sender, Action* parameters) -{ - if (!Sender->CurrentActionState) { - int width = parameters->int1Parameter-parameters->int0Parameter; - if (width<2) { - width = parameters->int0Parameter; - } else { - width = rand() % width + parameters->int0Parameter; - } - Sender->CurrentActionState = width * AI_UPDATE_TIME; - } else { - Sender->CurrentActionState--; - } - - if (!Sender->CurrentActionState) { - Sender->ReleaseCurrentAction(); - } - - assert(Sender->CurrentActionState >= 0); -} - -void GameScript::Wait(Scriptable* Sender, Action* parameters) -{ - if (!Sender->CurrentActionState) { - Sender->CurrentActionState = parameters->int0Parameter * AI_UPDATE_TIME; - } else { - Sender->CurrentActionState--; - } - - if (!Sender->CurrentActionState) { - Sender->ReleaseCurrentAction(); - } - - assert(Sender->CurrentActionState >= 0); -} - -void GameScript::SmallWait(Scriptable* Sender, Action* parameters) -{ - if (!Sender->CurrentActionState) { - Sender->CurrentActionState = parameters->int0Parameter; - } else { - Sender->CurrentActionState--; - } - - if (!Sender->CurrentActionState) { - Sender->ReleaseCurrentAction(); - } - - assert(Sender->CurrentActionState >= 0); -} - -void GameScript::SmallWaitRandom(Scriptable* Sender, Action* parameters) -{ - if (!Sender->CurrentActionState) { - int random = parameters->int1Parameter - parameters->int0Parameter; - if (random<1) { - random = 1; - } - Sender->CurrentActionState = rand() % random + parameters->int0Parameter; - } else { - Sender->CurrentActionState--; - } - - if (!Sender->CurrentActionState) { - Sender->ReleaseCurrentAction(); - } - - assert(Sender->CurrentActionState >= 0); -} - -void GameScript::MoveViewPoint(Scriptable* Sender, Action* parameters) -{ - core->timer->SetMoveViewPort( parameters->pointParameter.x, parameters->pointParameter.y, parameters->int0Parameter<<1, true ); - Sender->SetWait(1); // todo, blocking? - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::MoveViewObject(Scriptable* Sender, Action* parameters) -{ - Scriptable * scr = GetActorFromObject( Sender, parameters->objects[1]); - if (!scr) { - Sender->ReleaseCurrentAction(); - return; - } - core->timer->SetMoveViewPort( scr->Pos.x, scr->Pos.y, parameters->int0Parameter<<1, true ); - Sender->SetWait(1); // todo, blocking? - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::AddWayPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - actor->AddWayPoint( parameters->pointParameter ); - // this is marked as AF_BLOCKING (and indeed AddWayPoint causes moves), - // but this probably needs more thought - Sender->ReleaseCurrentAction(); -} - -void GameScript::MoveToPointNoRecticle(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = ( Actor* ) Sender; - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, IF_NORECTICLE, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::MoveToPointNoInterrupt(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, IF_NOINT, 0 ); - } - // should we always force IF_NOINT here? - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - actor->Interrupt(); - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::RunToPointNoRecticle(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, IF_NORECTICLE|IF_RUNNING, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::RunToPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, IF_RUNNING, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -//movetopoint until timer is down or target reached -void GameScript::TimedMoveToPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - if (parameters->int0Parameter<=0) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) Sender; - - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, parameters->int1Parameter,0 ); - } - - //hopefully this hack will prevent lockups - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - return; - } - - //repeat movement... - if (parameters->int0Parameter>0) { - Action *newaction = ParamCopyNoOverride(parameters); - newaction->int0Parameter--; - actor->AddActionInFront(newaction); - Sender->SetWait(1); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::MoveToPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - - // try the actual move, if we are not already moving there - if (!actor->InMove() || actor->Destination != parameters->pointParameter) { - actor->WalkTo( parameters->pointParameter, 0 ); - } - - // give up if we can't move there (no path was found) - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -//bg2, jumps to saved location in variable -void GameScript::MoveToSavedLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Point p; - Actor* actor = ( Actor* ) tar; - ieDword value = (ieDword) CheckVariable( Sender, parameters->string0Parameter ); - p.fromDword(value); - actor->SetPosition(p, true ); - Sender->ReleaseCurrentAction(); -} -/** iwd2 returntosavedlocation (with stats) */ -/** pst returntosavedplace */ -/** use Sender as default subject */ -void GameScript::ReturnToSavedLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Actor* actor = ( Actor* ) tar; - Point p((short) actor->GetBase(IE_SAVEDXPOS),(short) actor->GetBase(IE_SAVEDYPOS) ); - if (p.isnull()) { - Sender->ReleaseCurrentAction(); - return; - } - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo( p, 0, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -//PST -void GameScript::RunToSavedLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Actor* actor = ( Actor* ) tar; - Point p((short) actor->GetBase(IE_SAVEDXPOS),(short) actor->GetBase(IE_SAVEDYPOS) ); - if (p.isnull()) { - Sender->ReleaseCurrentAction(); - return; - } - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo( p, IF_RUNNING, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -//iwd2 -void GameScript::ReturnToSavedLocationDelete(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Actor* actor = ( Actor* ) tar; - Point p((short) actor->GetBase(IE_SAVEDXPOS),(short) actor->GetBase(IE_SAVEDYPOS) ); - actor->SetBase(IE_SAVEDXPOS,0); - actor->SetBase(IE_SAVEDYPOS,0); - if (p.isnull()) { - Sender->ReleaseCurrentAction(); - return; - } - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo( p, 0, 0 ); - } - //what else? - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters) -{ - MoveToObjectCore(Sender, parameters, IF_NOINT, false); -} - -void GameScript::RunToObject(Scriptable* Sender, Action* parameters) -{ - MoveToObjectCore(Sender, parameters, IF_RUNNING, false); -} - -void GameScript::MoveToObject(Scriptable* Sender, Action* parameters) -{ - MoveToObjectCore(Sender, parameters, 0, false); -} - -void GameScript::MoveToObjectUntilSee(Scriptable* Sender, Action* parameters) -{ - MoveToObjectCore(Sender, parameters, 0, true); -} - -void GameScript::MoveToObjectFollow(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* target = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - //follow leader from a distance of 5 - //could also follow the leader with a point offset - if (target->Type==ST_ACTOR) { - actor->SetLeader( (Actor *) target, 5); - } - MoveNearerTo(Sender, target, MAX_OPERATING_DISTANCE); -} - -void GameScript::StorePartyLocation(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game *game = core->GetGame(); - for (int i = 0; i < game->GetPartySize(false); i++) { - Actor* act = game->GetPC( i, false ); - GAMLocationEntry *gle = game->GetSavedLocationEntry(i); - if (act && gle) { - gle->Pos = act->Pos; - memcpy(gle->AreaResRef, act->Area, 9); - } - } -} - -void GameScript::RestorePartyLocation(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game *game = core->GetGame(); - for (int i = 0; i < game->GetPartySize(false); i++) { - Actor* act = game->GetPC( i, false ); - if (act) { - if (game->GetSavedLocationCount() <= (unsigned int)i) { - // what are we meant to do here? - print("argh, couldn't restore party member %d!", i + 1); - continue; - } - GAMLocationEntry *gle = game->GetSavedLocationEntry(i); - MoveBetweenAreasCore(act, gle->AreaResRef, gle->Pos, -1, true); - } - } - - // presumably this is correct - game->ClearSavedLocations(); -} - -void GameScript::MoveToCenterOfScreen(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Region vp = core->GetVideoDriver()->GetViewport(); - Actor* actor = ( Actor* ) Sender; - Point p((short) (vp.x+vp.w/2), (short) (vp.y+vp.h/2) ); - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo( p, IF_NOINT, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::MoveToOffset(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - Point p(Sender->Pos.x+parameters->pointParameter.x, Sender->Pos.y+parameters->pointParameter.y); - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo( p, 0, 0 ); - } - if (!actor->InMove()) { - // we should probably instead keep retrying until we reach dest - Sender->ReleaseCurrentAction(); - } -} - -void GameScript::RunAwayFrom(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - //TODO: actor could use travel areas - // we should be using int0Parameter for the timing here, not distance - if (!actor->InMove()) { - // we should make sure our existing walk is a 'run away', or fix moving/path code - actor->RunAwayFrom( tar->Pos, parameters->int0Parameter, false); - } - - //repeat movement... - if (parameters->int0Parameter>0) { - Action *newaction = ParamCopyNoOverride(parameters); - newaction->int0Parameter--; - actor->AddActionInFront(newaction); - Sender->SetWait(1); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::RunAwayFromNoLeaveArea(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - // we should be using int0Parameter for the timing here, not distance - if (!actor->InMove()) { - // we should make sure our existing walk is a 'run away', or fix moving/path code - actor->RunAwayFrom( tar->Pos, parameters->int0Parameter, false); - } - - //repeat movement... - if (parameters->int0Parameter>0) { - Action *newaction = ParamCopyNoOverride(parameters); - newaction->int0Parameter--; - actor->AddActionInFront(newaction); - Sender->SetWait(1); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::RunAwayFromNoInterrupt(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //i believe being dead still interrupts this action - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - //actor->InternalFlags|=IF_NOINT; - actor->NoInterrupt(); - // we should be using int0Parameter for the timing here, not distance - if (!actor->InMove()) { - // we should make sure our existing walk is a 'run away', or fix moving/path code - actor->RunAwayFrom( tar->Pos, parameters->int0Parameter, false); - } - - //repeat movement... - if (parameters->int0Parameter>0) { - Action *newaction = ParamCopyNoOverride(parameters); - newaction->int0Parameter--; - actor->AddActionInFront(newaction); - Sender->SetWait(1); - } else { - actor->Interrupt(); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::RunAwayFromPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - // we should be using int0Parameter for the timing here, not distance? - if (!actor->InMove()) { - // we should make sure our existing walk is a 'run away', or fix moving/path code - actor->RunAwayFrom( parameters->pointParameter, parameters->int0Parameter, false); - } - - //repeat movement... - if (parameters->int0Parameter>0) { - Action *newaction = ParamCopyNoOverride(parameters); - newaction->int0Parameter--; - actor->AddActionInFront(newaction); - Sender->SetWait(1); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::DisplayStringNoName(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1]); - if (!target) { - target=Sender; - } - if (Sender->Type==ST_ACTOR) { - DisplayStringCore( target, parameters->int0Parameter, DS_CONSOLE|DS_NONAME); - } else { - DisplayStringCore( target, parameters->int0Parameter, DS_AREA|DS_NONAME); - } -} - -void GameScript::DisplayStringNoNameHead(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - } - - DisplayStringCore( target, parameters->int0Parameter, DS_HEAD|DS_CONSOLE|DS_NONAME); -} - -//display message over current script owner -void GameScript::DisplayMessage(Scriptable* Sender, Action* parameters) -{ - DisplayStringCore(Sender, parameters->int0Parameter, DS_CONSOLE ); -} - -//float message over target -void GameScript::DisplayStringHead(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); - } - - DisplayStringCore(target, parameters->int0Parameter, DS_CONSOLE|DS_HEAD|DS_SPEECH ); -} - -void GameScript::KillFloatMessage(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - } - target->DisplayHeadText(NULL); -} - -void GameScript::DisplayStringHeadOwner(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - if (actor->inventory.HasItem(parameters->string0Parameter,parameters->int0Parameter) ) { - DisplayStringCore(actor, parameters->int0Parameter, DS_CONSOLE|DS_HEAD ); - } - } -} - -void GameScript::FloatMessageFixed(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); - } - - DisplayStringCore(target, parameters->int0Parameter, DS_CONSOLE|DS_HEAD); -} - -void GameScript::FloatMessageFixedRnd(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); - } - - SrcVector *rndstr=LoadSrc(parameters->string0Parameter); - if (!rndstr) { - printMessage("GameScript","Cannot display resource!",LIGHT_RED); - return; - } - DisplayStringCore(target, rndstr->at(rand()%rndstr->size()), DS_CONSOLE|DS_HEAD); - FreeSrc(rndstr, parameters->string0Parameter); -} - -void GameScript::FloatMessageRnd(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - target=Sender; - print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); - } - - SrcVector *rndstr=LoadSrc(parameters->string0Parameter); - if (!rndstr) { - printMessage("GameScript","Cannot display resource!",LIGHT_RED); - return; - } - DisplayStringCore(target, rndstr->at(rand()%rndstr->size()), DS_CONSOLE|DS_HEAD); - FreeSrc(rndstr, parameters->string0Parameter); -} - -//apparently this should not display over head (for actors) -void GameScript::DisplayString(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1]); - if (!target) { - target=Sender; - } - if (Sender->Type==ST_ACTOR) { - DisplayStringCore( target, parameters->int0Parameter, DS_CONSOLE); - } else { - DisplayStringCore( target, parameters->int0Parameter, DS_AREA); - } -} - -//DisplayStringHead, but wait until done -void GameScript::DisplayStringWait(Scriptable* Sender, Action* parameters) -{ - if (Sender->CurrentActionState) { - // TODO: should probably store the actual time and wait for that, - // rather than this hack - if (!core->GetAudioDrv()->IsSpeaking()) { - Sender->ReleaseCurrentAction(); - } - return; - } - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1]); - if (!target) { - target=Sender; - } - DisplayStringCore( target, parameters->int0Parameter, DS_CONSOLE|DS_WAIT|DS_SPEECH|DS_HEAD); - Sender->CurrentActionState = 1; -} - -void GameScript::ForceFacing(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) tar; - actor->SetOrientation(parameters->int0Parameter, false); -} - -/* A -1 means random facing? */ -void GameScript::Face(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - if (parameters->int0Parameter==-1) { - actor->SetOrientation(core->Roll(1,MAX_ORIENT,-1), false); - } else { - actor->SetOrientation(parameters->int0Parameter, false); - } - actor->SetWait( 1 ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::FaceObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetOrientation( GetOrient( target->Pos, actor->Pos ), false); - actor->SetWait( 1 ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::FaceSavedLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); - if (!target || target->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) target; - ieDword value; - if (!parameters->string0Parameter[0]) { - strcpy(parameters->string0Parameter,"LOCALSsavedlocation"); - } - value = (ieDword) CheckVariable( target, parameters->string0Parameter ); - Point p; - p.fromDword(value); - - actor->SetOrientation ( GetOrient( p, actor->Pos ), false); - actor->SetWait( 1 ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -//pst and bg2 can play a song designated by index -//actually pst has some extra params not currently implemented -//switchplaylist implements fade by simply scheduling the next -//music after the currently running one -//FIXME: This code is similar to PlayAreaSong, consider refactoring -void GameScript::StartSong(Scriptable* /*Sender*/, Action* parameters) -{ - //the force play logic should be handled by SwitchPlayList - bool force; - char* poi = core->GetMusicPlaylist( parameters->int0Parameter ); - if (!poi) return; - - //if parameter is force, force the music, otherwise just schedule it for next - if (parameters->int1Parameter==1) { - force = true; - } else { - force = false; - } - int ret = core->GetMusicMgr()->SwitchPlayList( poi, force ); - if (ret) { - *poi = '*'; - } - if (parameters->int0Parameter == SONG_BATTLE) { - core->GetGame()->CombatCounter = 150; - } -} - -//starts the current area music (songtype is in int0Parameter) -//PlayAreaSong will set the CombatCounter to 150 if -//it is battlemusic (the Counter will tick back to 0) -void GameScript::StartMusic(Scriptable* Sender, Action* parameters) -{ - //don't break on bad values - if (parameters->int0Parameter>10) return; - Map *map = Sender->GetCurrentArea(); - if (!map) return; - bool force, restart; - - switch (parameters->int1Parameter) { - case 1: //force switch - force = true; - restart = true; - break; - case 3: //force switch, but wait for previous music to end gracefully - force = false; - restart = true; - break; - default: - force = false; - restart = false; - break; - } - map->PlayAreaSong(parameters->int0Parameter, restart, force); -} - -void GameScript::StartCombatCounter(Scriptable* Sender, Action* /*parameters*/) -{ - Map *map = Sender->GetCurrentArea(); - if (!map) return; - map->PlayAreaSong(3, 1, 1); -} - -/*iwd2 can set an areasong slot*/ -void GameScript::SetMusic(Scriptable* Sender, Action* parameters) -{ - //iwd2 allows setting all 10 slots, though, there is no evidence they are used - if (parameters->int0Parameter>10) return; - Map *map = Sender->GetCurrentArea(); - if (!map) return; - map->SongHeader.SongList[parameters->int0Parameter]=parameters->int1Parameter; -} - -//optional integer parameter (isSpeech) -void GameScript::PlaySound(Scriptable* Sender, Action* parameters) -{ - print( "PlaySound(%s)\n", parameters->string0Parameter ); - core->GetAudioDrv()->Play( parameters->string0Parameter, Sender->Pos.x, - Sender->Pos.y, parameters->int0Parameter ? GEM_SND_SPEECH : 0 ); -} - -void GameScript::PlaySoundPoint(Scriptable* /*Sender*/, Action* parameters) -{ - print( "PlaySound(%s)\n", parameters->string0Parameter ); - core->GetAudioDrv()->Play( parameters->string0Parameter, parameters->pointParameter.x, parameters->pointParameter.y ); -} - -void GameScript::PlaySoundNotRanged(Scriptable* /*Sender*/, Action* parameters) -{ - print( "PlaySound(%s)\n", parameters->string0Parameter ); - core->GetAudioDrv()->Play( parameters->string0Parameter, 0, 0); -} - -void GameScript::Continue(Scriptable* /*Sender*/, Action* /*parameters*/) -{ -} - -// creates area vvc at position of object -void GameScript::CreateVisualEffectObject(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - CreateVisualEffectCore(tar, tar->Pos, parameters->string0Parameter, parameters->int0Parameter); -} - -// creates sticky vvc on actor or normal animation on object -void GameScript::CreateVisualEffectObjectSticky(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type==ST_ACTOR) { - CreateVisualEffectCore((Actor *) tar, parameters->string0Parameter, parameters->int0Parameter); - } else { - CreateVisualEffectCore(tar, tar->Pos, parameters->string0Parameter, parameters->int0Parameter); - } -} - -// creates area effect at point -void GameScript::CreateVisualEffect(Scriptable* Sender, Action* parameters) -{ - CreateVisualEffectCore(Sender, parameters->pointParameter, parameters->string0Parameter, parameters->int0Parameter); -} - -void GameScript::DestroySelf(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Sender->ClearActions(); - Actor* actor = ( Actor* ) Sender; - actor->DestroySelf(); - //actor->InternalFlags |= IF_CLEANUP; -} - -void GameScript::ScreenShake(Scriptable* Sender, Action* parameters) -{ - if (parameters->int1Parameter) { //IWD2 has a different profile - core->timer->SetScreenShake( parameters->int1Parameter, - parameters->int2Parameter, parameters->int0Parameter ); - } else { - core->timer->SetScreenShake( parameters->pointParameter.x, - parameters->pointParameter.y, parameters->int0Parameter ); - } - Sender->SetWait( parameters->int0Parameter ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::UnhideGUI(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game* game = core->GetGame(); - game->SetControlStatus(CS_HIDEGUI, BM_NAND); -} - -void GameScript::HideGUI(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game* game = core->GetGame(); - game->SetControlStatus(CS_HIDEGUI, BM_OR); -} - -void GameScript::LockScroll(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - GameControl* gc = core->GetGameControl(); - if (gc) { - gc->SetScreenFlags(SF_LOCKSCROLL, BM_OR); - } -} - -void GameScript::UnlockScroll(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - GameControl* gc = core->GetGameControl(); - if (gc) { - gc->SetScreenFlags(SF_LOCKSCROLL, BM_NAND); - } -} - -//no string, increase talkcount, no interrupt -void GameScript::Dialogue(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_SOURCE | BD_TALKCOUNT | BD_CHECKDIST ); -} - -void GameScript::DialogueForceInterrupt(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_SOURCE | BD_TALKCOUNT | BD_INTERRUPT ); -} - -// not in IESDP but this one should affect ambients -void GameScript::SoundActivate(Scriptable* /*Sender*/, Action* parameters) -{ - AmbientMgr * ambientmgr = core->GetAudioDrv()->GetAmbientMgr(); - if (parameters->int0Parameter) { - ambientmgr->activate(parameters->objects[1]->objectName); - } else { - ambientmgr->deactivate(parameters->objects[1]->objectName); - } -} - -// according to IESDP this action is about animations -void GameScript::AmbientActivate(Scriptable* Sender, Action* parameters) -{ - AreaAnimation* anim = Sender->GetCurrentArea( )->GetAnimation( parameters->string0Parameter); - if (!anim) { - anim = Sender->GetCurrentArea( )->GetAnimation( parameters->objects[1]->objectName ); - } - if (!anim) { - print( "Script error: No Animation Named \"%s\" or \"%s\"\n", - parameters->string0Parameter,parameters->objects[1]->objectName ); - return; - } - if (parameters->int0Parameter) { - anim->Flags |= A_ANI_ACTIVE; - } else { - anim->Flags &= ~A_ANI_ACTIVE; - } -} - -void GameScript::ChangeTileState(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - int state = parameters->int0Parameter; - if(door) { - door->ToggleTiles(state); /* default is false for playsound */ - } -} - -void GameScript::StaticStart(Scriptable* Sender, Action* parameters) -{ - AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); - if (!anim) { - print( "Script error: No Animation Named \"%s\"\n", - parameters->objects[1]->objectName ); - return; - } - anim->Flags &=~A_ANI_PLAYONCE; -} - -void GameScript::StaticStop(Scriptable* Sender, Action* parameters) -{ - AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); - if (!anim) { - print( "Script error: No Animation Named \"%s\"\n", - parameters->objects[1]->objectName ); - return; - } - anim->Flags |= A_ANI_PLAYONCE; -} - -void GameScript::StaticPalette(Scriptable* Sender, Action* parameters) -{ - AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); - if (!anim) { - print( "Script error: No Animation Named \"%s\"\n", - parameters->objects[1]->objectName ); - return; - } - anim->SetPalette( parameters->string0Parameter ); -} - -//this is a special case of PlaySequence (with wait time, not for area anims) -void GameScript::PlaySequenceTimed(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar; - if (parameters->objects[1]) { - tar = GetActorFromObject( Sender, parameters->objects[1] ); - } else { - tar=Sender; - } - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->SetStance( parameters->int0Parameter ); - int delay = parameters->int1Parameter || 1; - actor->SetWait( delay ); -} - -//waitanimation: waiting while animation of target is of a certain type -void GameScript::WaitAnimation(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - tar=Sender; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStance()!=parameters->int0Parameter) { - Sender->ReleaseCurrentAction(); - return; - } -} - -// PlaySequence without object parameter defaults to Sender -void GameScript::PlaySequence(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar; - if (parameters->objects[1]) { - tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - //could be an animation - AreaAnimation* anim = Sender->GetCurrentArea( )->GetAnimation( parameters->objects[1]->objectName); - if (anim) { - //set animation's cycle to parameters->int0Parameter; - anim->sequence=parameters->int0Parameter; - anim->frame=0; - //what else to be done??? - anim->InitAnimation(); - } - return; - } - - } else { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->SetStance( parameters->int0Parameter ); -} - -//same as PlaySequence, but the value comes from a variable -//ToDo: create a PlaySequenceCore in GSUtils -void GameScript::PlaySequenceGlobal(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar; - ieDword value; - - value = (ieDword) CheckVariable( Sender, parameters->string0Parameter ); - - if (parameters->objects[1]) { - tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - //could be an animation - AreaAnimation* anim = Sender->GetCurrentArea( )->GetAnimation( parameters->objects[1]->objectName); - if (anim) { - //set animation's cycle to value; - anim->sequence=value; - anim->frame=0; - //what else to be done??? - anim->InitAnimation(); - } - return; - } - - } else { - tar = Sender; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->SetStance( value ); -} - -void GameScript::SetDialogue(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) Sender; - target->SetDialog( parameters->string0Parameter ); -} - -void GameScript::ChangeDialogue(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - target->SetDialog( parameters->string0Parameter ); -} - -//string0, no interrupt, talkcount increased -void GameScript::StartDialogue(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_STRING0 | BD_TALKCOUNT | BD_SETDIALOG ); -} - -//string0, no interrupt, talkcount increased, don't set default -//optionally item name is used -void GameScript::StartDialogueOverride(Scriptable* Sender, Action* parameters) -{ - int flags = BD_STRING0 | BD_TALKCOUNT; - - if (parameters->int2Parameter) { - flags|=BD_ITEM; - } - BeginDialog( Sender, parameters, flags ); -} - -//string0, no interrupt, talkcount increased, don't set default -//optionally item name is used -void GameScript::StartDialogueOverrideInterrupt(Scriptable* Sender, - Action* parameters) -{ - int flags = BD_STRING0 | BD_TALKCOUNT | BD_INTERRUPT; - - if (parameters->int2Parameter) { - flags|=BD_ITEM; - } - BeginDialog( Sender, parameters, flags ); -} - -//start talking to oneself -void GameScript::PlayerDialogue(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_RESERVED | BD_OWN ); -} - -//we hijack this action for the player initiated dialogue -void GameScript::NIDSpecial1(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_INTERRUPT | BD_TARGET /*| BD_NUMERIC*/ | BD_TALKCOUNT | BD_CHECKDIST ); -} - -void GameScript::NIDSpecial2(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Game *game=core->GetGame(); - if (!game->EveryoneStopped() ) { - //wait for a while - Sender->SetWait( 1 * AI_UPDATE_TIME ); - return; - } - Actor *actor = (Actor *) Sender; - if (!game->EveryoneNearPoint(actor->GetCurrentArea(), actor->Pos, true) ) { - //we abort the command, everyone should be here - Sender->ReleaseCurrentAction(); - return; - } - //travel direction passed to guiscript - int direction = Sender->GetCurrentArea()->WhichEdge(actor->Pos); - print("Travel direction returned: %d\n", direction); - if (direction==-1) { - Sender->ReleaseCurrentAction(); - return; - } - core->GetDictionary()->SetAt("Travel", (ieDword) direction); - core->GetGUIScriptEngine()->RunFunction( "GUIMA", "OpenWorldMapWindow" ); - //sorry, i have absolutely no idea when i should do this :) - Sender->ReleaseCurrentAction(); -} - -void GameScript::StartDialogueInterrupt(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, - BD_STRING0 | BD_INTERRUPT | BD_TALKCOUNT | BD_SETDIALOG ); -} - -//No string, flags:0 -void GameScript::StartDialogueNoSet(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_TALKCOUNT | BD_SOURCE ); -} - -void GameScript::StartDialogueNoSetInterrupt(Scriptable* Sender, - Action* parameters) -{ - BeginDialog( Sender, parameters, BD_TALKCOUNT | BD_SOURCE | BD_INTERRUPT ); -} - -//no talkcount, using banter dialogs -//probably banter dialogs are random, like rumours! -//no, they aren't, but they increase interactcount -void GameScript::Interact(Scriptable* Sender, Action* parameters) -{ - BeginDialog( Sender, parameters, BD_INTERACT | BD_NOEMPTY ); -} - -static unsigned int FindNearPoint(Scriptable* Sender, Point *&p1, Point *&p2) -{ - unsigned int distance1 = Distance(*p1, Sender); - unsigned int distance2 = Distance(*p2, Sender); - if (distance1 <= distance2) { - return distance1; - } else { - Point *tmp = p1; - p1 = p2; - p2 = tmp; - return distance2; - } -} - -//this is an immediate action without checking Sender -void GameScript::DetectSecretDoor(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - if (door->Flags & DOOR_SECRET) { - door->Flags |= DOOR_FOUND; - } -} - -//this is an immediate action without checking Sender -void GameScript::Lock(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - switch (tar->Type) { - case ST_DOOR: - ((Door *)tar)->SetDoorLocked(true, true); - break; - case ST_CONTAINER: - ((Container *)tar)->SetContainerLocked(true); - break; - default: - return; - } -} - -void GameScript::Unlock(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - switch (tar->Type) { - case ST_DOOR: - ((Door *)tar)->SetDoorLocked(false, true); - break; - case ST_CONTAINER: - ((Container *)tar)->SetContainerLocked(false); - break; - default: - return; - } -} - -void GameScript::SetDoorLocked(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - door->SetDoorLocked( parameters->int0Parameter!=0, false); -} - -void GameScript::SetDoorFlag(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - ieDword flag = parameters->int0Parameter; - - //these are special flags - if (flag&DOOR_LOCKED) { - flag&=~DOOR_LOCKED; - door->SetDoorLocked(parameters->int1Parameter!=0, false); - } - if (flag&DOOR_OPEN) { - flag&=~DOOR_OPEN; - door->SetDoorOpen(parameters->int1Parameter!=0, false, 0); - } - - if (parameters->int1Parameter) { - door->Flags|=flag; - } else { - door->Flags&=~flag; - } -} - -void GameScript::RemoveTraps(Scriptable* Sender, Action* parameters) -{ - //only actors may try to pick a lock - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - unsigned int distance; - Point *p, *otherp; - Door *door = NULL; - Container *container = NULL; - InfoPoint *trigger = NULL; - ScriptableType type = tar->Type; - ieDword flags; - - switch (type) { - case ST_DOOR: - door = ( Door* ) tar; - if (door->IsOpen()) { - //door is already open - Sender->ReleaseCurrentAction(); - return; - } - p = door->toOpen; - otherp = door->toOpen+1; - distance = FindNearPoint( Sender, p, otherp); - flags = door->Trapped && door->TrapDetected; - break; - case ST_CONTAINER: - container = (Container *) tar; - p = &container->Pos; - otherp = p; - distance = Distance(*p, Sender); - flags = container->Trapped && container->TrapDetected; - break; - case ST_PROXIMITY: - trigger = (InfoPoint *) tar; - // this point is incorrect! will cause actor to enter trap - // need to find a point using trigger->outline - p = &trigger->Pos; - otherp = p; - distance = Distance(tar, Sender); - flags = trigger->Trapped && trigger->TrapDetected && trigger->CanDetectTrap(); - break; - default: - Sender->ReleaseCurrentAction(); - return; - } - Actor * actor = (Actor *) Sender; - actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); - if (distance <= MAX_OPERATING_DISTANCE) { - if (flags) { - switch(type) { - case ST_DOOR: - door->TryDisarm(actor); - break; - case ST_CONTAINER: - container->TryDisarm(actor); - break; - case ST_PROXIMITY: - trigger->TryDisarm(actor); - break; - default: - //not gonna happen! - assert(false); - } - } else { - //no trap here - //displaymsg->DisplayString(STR_NOT_TRAPPED); - } - } else { - MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); - return; - } - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); -} - -void GameScript::PickLock(Scriptable* Sender, Action* parameters) -{ - //only actors may try to pick a lock - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - unsigned int distance; - Point *p, *otherp; - Door *door = NULL; - Container *container = NULL; - ScriptableType type = tar->Type; - ieDword flags; - - switch (type) { - case ST_DOOR: - door = ( Door* ) tar; - if (door->IsOpen()) { - //door is already open - Sender->ReleaseCurrentAction(); - return; - } - p = door->toOpen; - otherp = door->toOpen+1; - distance = FindNearPoint( Sender, p, otherp); - flags = door->Flags&DOOR_LOCKED; - break; - case ST_CONTAINER: - container = (Container *) tar; - p = &container->Pos; - otherp = p; - distance = Distance(*p, Sender); - flags = container->Flags&CONT_LOCKED; - break; - default: - Sender->ReleaseCurrentAction(); - return; - } - Actor * actor = (Actor *) Sender; - actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); - if (distance <= MAX_OPERATING_DISTANCE) { - if (flags) { - if (type==ST_DOOR) { - door->TryPickLock(actor); - } else { - container->TryPickLock(actor); - } - } else { - //notlocked - //displaymsg->DisplayString(STR_NOT_LOCKED); - } - } else { - MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); - return; - } - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); -} - -void GameScript::OpenDoor(Scriptable* Sender, Action* parameters) { - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - // no idea if this is right, or whether OpenDoor/CloseDoor should allow opening - // of all doors, or some doors, or whether it should still check for non-actors - if (Sender->Type == ST_ACTOR) { - Actor *actor = (Actor *)Sender; - actor->SetModal(MS_NONE); - if (!door->TryUnlock(actor)) { - return; - } - } - //if not an actor opens, it don't play sound - door->SetDoorOpen( true, (Sender->Type == ST_ACTOR), 0 ); - Sender->ReleaseCurrentAction(); -} - -void GameScript::CloseDoor(Scriptable* Sender, Action* parameters) { - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - // see comments in OpenDoor above - if (Sender->Type == ST_ACTOR) { - Actor *actor = (Actor *)Sender; - if (!door->TryUnlock(actor)) { - return; - } - } - //if not an actor closes, it don't play sound - door->SetDoorOpen( false, (Sender->Type == ST_ACTOR), 0 ); - Sender->ReleaseCurrentAction(); -} - -void GameScript::ToggleDoor(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) Sender; - actor->SetModal(MS_NONE); - - Door* door = actor->GetCurrentArea()->GetDoorByGlobalID(actor->TargetDoor); - if (!door) { - Sender->ReleaseCurrentAction(); - return; - } - unsigned int distance; - Point *p = door->toOpen; - Point *otherp = door->toOpen+1; - distance = FindNearPoint( Sender, p, otherp); - if (distance <= MAX_OPERATING_DISTANCE) { - actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); - if (!door->TryUnlock(actor)) { - displaymsg->DisplayConstantString(STR_DOORLOCKED,0xd7d7be,door); - //playsound unsuccessful opening of door - if(door->IsOpen()) - core->PlaySound(DS_CLOSE_FAIL); - else - core->PlaySound(DS_OPEN_FAIL); - Sender->ReleaseCurrentAction(); - actor->TargetDoor = 0; - return; //don't open door - } - - // should we be triggering the trap on close? - door->TriggerTrap(0, actor->GetGlobalID()); - door->SetDoorOpen( !door->IsOpen(), true, actor->GetGlobalID() ); - } else { - MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); - return; - } - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); - actor->TargetDoor = 0; -} - -void GameScript::ContainerEnable(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_CONTAINER) { - return; - } - Container *cnt = (Container *) tar; - if (parameters->int0Parameter) { - cnt->Flags&=~CONT_DISABLED; - } else { - cnt->Flags|=CONT_DISABLED; - } -} - -void GameScript::MoveBetweenAreas(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - if (parameters->string1Parameter[0]) { - CreateVisualEffectCore(Sender, Sender->Pos, parameters->string1Parameter, 0); - } - MoveBetweenAreasCore((Actor *) Sender, parameters->string0Parameter, - parameters->pointParameter, parameters->int0Parameter, true); -} - -//spell is depleted, casting time is calculated, interruptible -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::Spell(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - //resolve spellname - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } - - if (Sender->CurrentActionState) { - if (Sender->LastTarget) { - //if target was set, fire spell - Sender->CastSpellEnd(0); - } else if(!Sender->LastTargetPos.isempty()) { - //the target was converted to a point - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "Spell lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - //parse target - int seeflag; - unsigned int dist = GetSpellDistance(spellres, Sender); - if (dist == 0xffffffff) { - seeflag = 0; - } else { - seeflag = GA_NO_DEAD; - } - - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1], seeflag ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - - if(Sender->Type==ST_ACTOR) { - Actor *act = (Actor *) Sender; - - //move near to target - if (dist != 0xffffffff) { - if (PersonalDistance(tar, Sender) > dist || !Sender->GetCurrentArea()->IsVisible(Sender->Pos, tar->Pos)) { - MoveNearerTo(Sender,tar,dist); - return; - } - } - - //face target - if (tar != Sender) { - act->SetOrientation( GetOrient( tar->Pos, act->Pos ), false ); - } - - //stop doing anything else - act->SetModal(MS_NONE); - } - Sender->CurrentActionState = 1; - int duration = Sender->CastSpell( spellres, tar, true ); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//spell is depleted, casting time is calculated, interruptible -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::SpellPoint(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - //resolve spellname - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } - - if (Sender->CurrentActionState) { - if(!Sender->LastTargetPos.isempty()) { - //if target was set, fire spell - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "SpellPoint lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - if(Sender->Type==ST_ACTOR) { - unsigned int dist = GetSpellDistance(spellres, Sender); - - Actor *act = (Actor *) Sender; - //move near to target - if (PersonalDistance(parameters->pointParameter, Sender) > dist || !Sender->GetCurrentArea()->IsVisible(Sender->Pos, parameters->pointParameter)) { - MoveNearerTo(Sender,parameters->pointParameter,dist, 0); - return; - } - - //face target - act->SetOrientation( GetOrient( parameters->pointParameter, act->Pos ), false ); - //stop doing anything else - act->SetModal(MS_NONE); - } - - Sender->CurrentActionState = 1; - int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, true ); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//spell is not depleted (doesn't need to be memorised or known) -//casting time is calculated, interruptible -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::SpellNoDec(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - //resolve spellname - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - if (Sender->CurrentActionState) { - if (Sender->LastTarget) { - //if target was set, fire spell - Sender->CastSpellEnd(0); - } else if(!Sender->LastTargetPos.isempty()) { - //the target was converted to a point - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "SpellNoDec lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - //parse target - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - - //face target - if (Sender->Type==ST_ACTOR) { - Actor *act = (Actor *) Sender; - if (tar != Sender) { - act->SetOrientation( GetOrient( tar->Pos, act->Pos ), false ); - } - - //stop doing anything else - act->SetModal(MS_NONE); - } - Sender->CurrentActionState = 1; - int duration = Sender->CastSpell( spellres, tar, false ); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//spell is not depleted (doesn't need to be memorised or known) -//casting time is calculated, interruptible -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::SpellPointNoDec(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - //resolve spellname - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - if (Sender->CurrentActionState) { - if(!Sender->LastTargetPos.isempty()) { - //if target was set, fire spell - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "SpellPointNoDec lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - //face target - if (Sender->Type==ST_ACTOR) { - Actor *act = (Actor *) Sender; - act->SetOrientation( GetOrient( parameters->pointParameter, act->Pos ), false ); - - //stop doing anything else - act->SetModal(MS_NONE); - } - - Sender->CurrentActionState = 1; - int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, false ); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//spell is not depleted (doesn't need to be memorised or known) -//casting time is calculated, not interruptable -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::ForceSpell(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - //resolve spellname - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - if (Sender->CurrentActionState) { - if (Sender->LastTarget) { - //if target was set, fire spell - Sender->CastSpellEnd(0); - } else if(!Sender->LastTargetPos.isempty()) { - //the target was converted to a point - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "ForceSpell lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - //parse target - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - - //face target - if (Sender->Type==ST_ACTOR) { - Actor *act = (Actor *) Sender; - if (tar != Sender) { - act->SetOrientation( GetOrient( tar->Pos, act->Pos ), false ); - } - - //stop doing anything else - act->SetModal(MS_NONE); - } - Sender->CurrentActionState = 1; - int duration = Sender->CastSpell (spellres, tar, false); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//spell is not depleted (doesn't need to be memorised or known) -//casting time is calculated, not interruptable -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::ForceSpellPoint(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - if (Sender->CurrentActionState) { - if(!Sender->LastTargetPos.isempty()) { - //if target was set, fire spell - Sender->CastSpellPointEnd(0); - } else { - printMessage("GameScript", "ForceSpellPoint lost target somewhere!", LIGHT_RED); - } - Sender->ReleaseCurrentAction(); - return; - } - - //face target - if (Sender->Type==ST_ACTOR) { - Actor *act = (Actor *) Sender; - act->SetOrientation( GetOrient( parameters->pointParameter, act->Pos ), false ); - - //stop doing anything else - act->SetModal(MS_NONE); - } - - Sender->CurrentActionState = 1; - int duration = Sender->CastSpellPoint (spellres, parameters->pointParameter, false); - if (duration != -1) Sender->SetWait(duration); - - //if target was set, feed action back - if (Sender->LastTargetPos.isempty()) { - Sender->ReleaseCurrentAction(); - } -} - -//ForceSpell with zero casting time -//zero casting time, no depletion, not interruptable -//FIXME The caster must meet the level requirements as set in the spell file -//FIXME The spell level is taken as parameter2 in some cases (FIXED) -void GameScript::ReallyForceSpell(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - int level; - - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->Type == ST_ACTOR) { - Actor *actor = (Actor *) Sender; - if (tar != Sender) { - actor->SetOrientation( GetOrient( tar->Pos, actor->Pos ), false ); - } - actor->SetStance (IE_ANI_CONJURE); - } - Sender->CastSpell (spellres, tar, false, true); - if (parameters->string0Parameter[0]) { - level = parameters->int0Parameter; - } else { - level = parameters->int1Parameter; - } - if (tar->Type==ST_ACTOR) { - Sender->CastSpellEnd(level); - } else { - Sender->CastSpellPointEnd(level); - } - Sender->ReleaseCurrentAction(); -} - -//ForceSpellPoint with zero casting time -//zero casting time, no depletion (finish casting at point), not interruptable -//no CFB -//FIXME The caster must meet the level requirements as set in the spell file -void GameScript::ReallyForceSpellPoint(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - int level; - - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - //Sender->LastTargetPos=parameters->pointParameter; - if (Sender->Type == ST_ACTOR) { - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) Sender; - actor->SetOrientation( GetOrient( parameters->pointParameter, actor->Pos ), false ); - actor->SetStance (IE_ANI_CONJURE); - } - Sender->CastSpellPoint (spellres, parameters->pointParameter, false, true); - if (parameters->string0Parameter[0]) { - level = parameters->int0Parameter; - } else { - level = parameters->int1Parameter; - } - Sender->CastSpellPointEnd(level); - Sender->ReleaseCurrentAction(); -} - -// this differs from ReallyForceSpell that this one allows dead Sender casting -// zero casting time, no depletion -void GameScript::ReallyForceSpellDead(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - int level; - - if (!ResolveSpellName( spellres, parameters) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (!Sender->SpellResRef[0]) { - Sender->SetSpellResRef(spellres); - } - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - Sender->LastTargetPos=parameters->pointParameter; - - Sender->CastSpell (spellres, tar, false, true); - if (parameters->string0Parameter[0]) { - level = parameters->int0Parameter; - } else { - level = parameters->int1Parameter; - } - if (tar->Type==ST_ACTOR) { - Sender->CastSpellEnd(level); - } else { - Sender->CastSpellPointEnd(level); - } - Sender->ReleaseCurrentAction(); -} - -void GameScript::Deactivate(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - tar->Hide(); -} - -void GameScript::MakeGlobal(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) Sender; - core->GetGame()->AddNPC( act ); -} - -void GameScript::UnMakeGlobal(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) Sender; - int slot; - slot = core->GetGame()->InStore( act ); - if (slot >= 0) { - core->GetGame()->DelNPC( slot ); - } -} - -//this apparently doesn't check the gold, thus could be used from non actors -void GameScript::GivePartyGoldGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword gold = (ieDword) CheckVariable( Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (Sender->Type == ST_ACTOR) { - Actor* act = ( Actor* ) Sender; - ieDword mygold = act->GetStat(IE_GOLD); - if (mygold < gold) { - gold = mygold; - } - //will get saved, not adjusted - act->SetBase(IE_GOLD, act->GetBase(IE_GOLD)-gold); - } - core->GetGame()->AddGold(gold); -} - -void GameScript::CreatePartyGold(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->AddGold(parameters->int0Parameter); -} - -void GameScript::GivePartyGold(Scriptable* Sender, Action* parameters) -{ - ieDword gold = (ieDword) parameters->int0Parameter; - if (Sender->Type == ST_ACTOR) { - Actor* act = ( Actor* ) Sender; - ieDword mygold = act->GetStat(IE_GOLD); - if (mygold < gold) { - gold = mygold; - } - //will get saved, not adjusted - act->SetBase(IE_GOLD, act->GetBase(IE_GOLD)-gold); - } - core->GetGame()->AddGold(gold); -} - -void GameScript::DestroyPartyGold(Scriptable* /*Sender*/, Action* parameters) -{ - int gold = core->GetGame()->PartyGold; - if (gold>parameters->int0Parameter) { - gold=parameters->int0Parameter; - } - core->GetGame()->AddGold(-gold); -} - -void GameScript::TakePartyGold(Scriptable* Sender, Action* parameters) -{ - ieDword gold = core->GetGame()->PartyGold; - if (gold>(ieDword) parameters->int0Parameter) { - gold=(ieDword) parameters->int0Parameter; - } - core->GetGame()->AddGold((ieDword) -(int) gold); - if (Sender->Type == ST_ACTOR) { - Actor* act = ( Actor* ) Sender; - act->SetBase(IE_GOLD, act->GetBase(IE_GOLD)+gold); - } -} - -void GameScript::AddXPObject(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - int xp = parameters->int0Parameter; - if (displaymsg->HasStringReference(STR_GOTQUESTXP)) { - core->GetTokenDictionary()->SetAtCopy("EXPERIENCEAMOUNT", xp); - displaymsg->DisplayConstantStringName(STR_GOTQUESTXP, 0xbcefbc, actor); - } else { - displaymsg->DisplayConstantStringValue(STR_GOTXP, 0xbcefbc, (ieDword)xp); - } - actor->AddExperience(xp); -} - -void GameScript::AddXP2DA(Scriptable* /*Sender*/, Action* parameters) -{ - AutoTable xptable; - - if (core->HasFeature(GF_HAS_EXPTABLE) ) { - xptable.load("exptable"); - } else { - xptable.load("xplist"); - } - - if (parameters->int0Parameter>0) { - displaymsg->DisplayString(parameters->int0Parameter, 0x40f0f000,IE_STR_SOUND); - } - if (!xptable) { - printMessage("GameScript","Can't perform ADDXP2DA",LIGHT_RED); - return; - } - const char * xpvalue = xptable->QueryField( parameters->string0Parameter, "0" ); //level is unused - - if ( xpvalue[0]=='P' && xpvalue[1]=='_') { - //divide party xp - core->GetGame()->ShareXP(atoi(xpvalue+2), SX_DIVIDE ); - } else { - //give xp everyone - core->GetGame()->ShareXP(atoi(xpvalue), 0 ); - } -} - -void GameScript::AddExperienceParty(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->ShareXP(parameters->int0Parameter, SX_DIVIDE); -} - -//this needs moncrate.2da, but otherwise independent from GF_CHALLENGERATING -void GameScript::AddExperiencePartyCR(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->ShareXP(parameters->int0Parameter, SX_DIVIDE|SX_CR); -} - -void GameScript::AddExperiencePartyGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword xp = CheckVariable( Sender, parameters->string0Parameter, parameters->string1Parameter ); - core->GetGame()->ShareXP(xp, SX_DIVIDE); -} - -void GameScript::SetMoraleAI(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) Sender; - act->SetBase(IE_MORALE, parameters->int0Parameter); -} - -void GameScript::IncMoraleAI(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) Sender; - act->SetBase(IE_MORALE, parameters->int0Parameter+act->GetBase(IE_MORALE) ); -} - -void GameScript::MoraleSet(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) tar; - act->SetBase(IE_MORALEBREAK, parameters->int0Parameter); -} - -void GameScript::MoraleInc(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) tar; - act->SetBase(IE_MORALEBREAK, act->GetBase(IE_MORALEBREAK)+parameters->int0Parameter); -} - -void GameScript::MoraleDec(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) tar; - act->SetBase(IE_MORALEBREAK, act->GetBase(IE_MORALEBREAK)-parameters->int0Parameter); -} - -void GameScript::JoinParty(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - // make sure we're in the same area, otherwise Dynaheir joins when Minsc does - // but she's in another area and needs to be rescued first! - Actor* act = ( Actor* ) Sender; - Game *game = core->GetGame(); - if (act->GetCurrentArea() != game->GetCurrentArea()) { - return; - } - - /* calling this, so it is simpler to change */ - /* i'm not sure this is required here at all */ - SetBeenInPartyFlags(Sender, parameters); - act->SetBase( IE_EA, EA_PC ); - if (core->HasFeature( GF_HAS_DPLAYER )) { - /* we must reset various existing scripts */ - act->SetScript( "DEFAULT", AI_SCRIPT_LEVEL, true ); - act->SetScript( "", SCR_RACE, true ); - act->SetScript( "", SCR_GENERAL, true ); - act->SetScript( "DPLAYER2", SCR_DEFAULT, false ); - } - AutoTable pdtable("pdialog"); - if (pdtable) { - const char* scriptname = act->GetScriptName(); - ieResRef resref; - //set dialog only if we got a row - if (pdtable->GetRowIndex( scriptname ) != -1) { - strnlwrcpy(resref, pdtable->QueryField( scriptname, "JOIN_DIALOG_FILE"),8); - act->SetDialog( resref ); - } - } - game->JoinParty( act, JP_JOIN ); -} - -void GameScript::LeaveParty(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* act = ( Actor* ) Sender; - core->GetGame()->LeaveParty( act ); -} - -//HideCreature hides only the visuals of a creature -//(feet circle and avatar) -//the scripts of the creature are still running -//iwd2 stores this flag in the MC field -void GameScript::HideCreature(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->BaseStats[IE_AVATARREMOVAL]=parameters->int0Parameter; -} - -//i have absolutely no idea why this is needed when we have HideCreature -void GameScript::ForceHide(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - tar=Sender; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - actor->BaseStats[IE_AVATARREMOVAL]=1; -} - -void GameScript::Activate(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - // Deactivate hides, so this should unhide.. - //tar->Activate(); - tar->Unhide(); -} - -void GameScript::ForceLeaveAreaLUA(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - //the LoadMos ResRef may be empty - strncpy(core->GetGame()->LoadMos, parameters->string1Parameter,8); - MoveBetweenAreasCore( actor, parameters->string0Parameter, parameters->pointParameter, parameters->int0Parameter, true); -} - -void GameScript::LeaveAreaLUA(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - //the LoadMos ResRef may be empty - strncpy(core->GetGame()->LoadMos, parameters->string1Parameter,8); - MoveBetweenAreasCore( actor, parameters->string0Parameter, parameters->pointParameter, parameters->int0Parameter, true); -} - -//this is a blocking action, because we have to move to the Entry -void GameScript::LeaveAreaLUAEntry(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Game *game = core->GetGame(); - strncpy(game->LoadMos, parameters->string1Parameter,8); - Point p = GetEntryPoint(parameters->string0Parameter, parameters->string1Parameter); - if (p.isempty()) { - Sender->ReleaseCurrentAction(); - return; - } - parameters->pointParameter=p; - strcpy(parameters->string1Parameter, ""); - LeaveAreaLUA(Sender, parameters); - Sender->ReleaseCurrentAction(); -} - -void GameScript::LeaveAreaLUAPanic(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - strncpy(core->GetGame()->LoadMos, parameters->string1Parameter,8); - MoveBetweenAreasCore( actor, parameters->string0Parameter, parameters->pointParameter, parameters->int0Parameter, true); -} - -//this is a blocking action, because we have to move to the Entry -void GameScript::LeaveAreaLUAPanicEntry(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Game *game = core->GetGame(); - strncpy(game->LoadMos, parameters->string1Parameter,8); - Point p = GetEntryPoint(parameters->string0Parameter, parameters->string1Parameter); - if (p.isempty()) { - Sender->ReleaseCurrentAction(); - return; - } - parameters->pointParameter=p; - strcpy(parameters->string1Parameter, ""); - LeaveAreaLUAPanic(Sender, parameters); - Sender->ReleaseCurrentAction(); -} - -void GameScript::SetToken(Scriptable* /*Sender*/, Action* parameters) -{ - //SetAt takes a newly created reference (no need of free/copy) - char * str = core->GetString( parameters->int0Parameter); - core->GetTokenDictionary()->SetAt( parameters->string1Parameter, str); -} - -//Assigns a numeric variable to the token -void GameScript::SetTokenGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value = CheckVariable( Sender, parameters->string0Parameter ); - //using SetAtCopy because we need a copy of the value - core->GetTokenDictionary()->SetAtCopy( parameters->string1Parameter, value ); -} - -//Assigns the target object's name (not scriptname) to the token -void GameScript::SetTokenObject(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - core->GetTokenDictionary()->SetAtCopy( parameters->string0Parameter, actor->GetName(0) ); -} - -void GameScript::PlayDead(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - - actor->CurrentActionInterruptable = false; - if (!Sender->CurrentActionTicks && parameters->int0Parameter) { - // set countdown on first run - Sender->CurrentActionState = parameters->int0Parameter; - actor->SetStance( IE_ANI_DIE ); - } - if (Sender->CurrentActionState <= 0) { - actor->SetStance( IE_ANI_GET_UP ); - Sender->ReleaseCurrentAction(); - } - actor->CurrentActionState--; -} - -void GameScript::PlayDeadInterruptable(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - - if (!Sender->CurrentActionTicks && parameters->int0Parameter) { - // set countdown on first run - Sender->CurrentActionState = parameters->int0Parameter; - actor->SetStance( IE_ANI_DIE ); - } - if (Sender->CurrentActionState <= 0) { - actor->SetStance( IE_ANI_GET_UP ); - Sender->ReleaseCurrentAction(); - } - actor->CurrentActionState--; -} - -/* this may not be correct, just a placeholder you can fix */ -void GameScript::Swing(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetStance( IE_ANI_ATTACK ); - actor->SetWait( 1 ); -} - -/* this may not be correct, just a placeholder you can fix */ -void GameScript::SwingOnce(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetStance( IE_ANI_ATTACK ); - actor->SetWait( 1 ); -} - -void GameScript::Recoil(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetStance( IE_ANI_DAMAGE ); - actor->SetWait( 1 ); -} - -void GameScript::AnkhegEmerge(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - if (actor->GetStance()!=IE_ANI_EMERGE) { - actor->SetStance( IE_ANI_EMERGE ); - actor->SetWait( 1 ); - } -} - -void GameScript::AnkhegHide(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - if (actor->GetStance()!=IE_ANI_HIDE) { - actor->SetStance( IE_ANI_HIDE ); - actor->SetWait( 1 ); - } -} - -void GameScript::GlobalSetGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value = CheckVariable( Sender, parameters->string0Parameter ); - SetVariable( Sender, parameters->string1Parameter, value ); -} - -/* adding the second variable to the first, they must be GLOBAL */ -void GameScript::AddGlobals(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter, "GLOBAL"); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter, "GLOBAL"); - SetVariable( Sender, parameters->string0Parameter, "GLOBAL", value1 + value2 ); -} - -/* adding the second variable to the first, they could be area or locals */ -void GameScript::GlobalAddGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 + value2 ); -} - -/* adding the number to the global, they could be area or locals */ -void GameScript::IncrementGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value = CheckVariable( Sender, parameters->string0Parameter ); - SetVariable( Sender, parameters->string0Parameter, - value + parameters->int0Parameter ); -} - -/* adding the number to the global ONLY if the first global is zero */ -void GameScript::IncrementGlobalOnce(Scriptable* Sender, Action* parameters) -{ - ieDword value = CheckVariable( Sender, parameters->string0Parameter ); - if (value != 0) { - return; - } - value = CheckVariable( Sender, parameters->string1Parameter ); - SetVariable( Sender, parameters->string1Parameter, - value + parameters->int0Parameter ); -} - -void GameScript::GlobalSubGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 - value2 ); -} - -void GameScript::GlobalAndGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 && value2 ); -} - -void GameScript::GlobalOrGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 || value2 ); -} - -void GameScript::GlobalBOrGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 | value2 ); -} - -void GameScript::GlobalBAndGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 & value2 ); -} - -void GameScript::GlobalXorGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, - parameters->string1Parameter ); - SetVariable( Sender, parameters->string0Parameter, value1 ^ value2 ); -} - -void GameScript::GlobalBOr(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - SetVariable( Sender, parameters->string0Parameter, - value1 | parameters->int0Parameter ); -} - -void GameScript::GlobalBAnd(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - SetVariable( Sender, parameters->string0Parameter, - value1 & parameters->int0Parameter ); -} - -void GameScript::GlobalXor(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - SetVariable( Sender, parameters->string0Parameter, - value1 ^ parameters->int0Parameter ); -} - -void GameScript::GlobalMax(Scriptable* Sender, Action* parameters) -{ - long value1 = CheckVariable( Sender, parameters->string0Parameter ); - if (value1 > parameters->int0Parameter) { - SetVariable( Sender, parameters->string0Parameter, value1 ); - } -} - -void GameScript::GlobalMin(Scriptable* Sender, Action* parameters) -{ - long value1 = CheckVariable( Sender, parameters->string0Parameter ); - if (value1 < parameters->int0Parameter) { - SetVariable( Sender, parameters->string0Parameter, value1 ); - } -} - -void GameScript::BitClear(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - SetVariable( Sender, parameters->string0Parameter, - value1 & ~parameters->int0Parameter ); -} - -void GameScript::GlobalShL(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = parameters->int0Parameter; - if (value2 > 31) { - value1 = 0; - } else { - value1 <<= value2; - } - SetVariable( Sender, parameters->string0Parameter, value1 ); -} - -void GameScript::GlobalShR(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, - parameters->string0Parameter ); - ieDword value2 = parameters->int0Parameter; - if (value2 > 31) { - value1 = 0; - } else { - value1 >>= value2; - } - SetVariable( Sender, parameters->string0Parameter, value1 ); -} - -void GameScript::GlobalMaxGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter ); - if (value1 < value2) { - SetVariable( Sender, parameters->string0Parameter, value2 ); - } -} - -void GameScript::GlobalMinGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter ); - if (value1 > value2) { - SetVariable( Sender, parameters->string0Parameter, value2 ); - } -} - -void GameScript::GlobalShLGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter ); - if (value2 > 31) { - value1 = 0; - } else { - value1 <<= value2; - } - SetVariable( Sender, parameters->string0Parameter, value1 ); -} -void GameScript::GlobalShRGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter ); - if (value2 > 31) { - value1 = 0; - } else { - value1 >>= value2; - } - SetVariable( Sender, parameters->string0Parameter, value1 ); -} - -void GameScript::ClearAllActions(Scriptable* Sender, Action* /*parameters*/) -{ - Actor *except = NULL; - if (Sender->Type==ST_ACTOR) { - except = (Actor *) Sender; - } - Map *map = Sender->GetCurrentArea(); - ieDword gametime = core->GetGame()->GameTime; - int i = map->GetActorCount(true); - while(i--) { - Actor* act = map->GetActor(i,true); - if (act && act!=except) { - if (!act->ValidTarget(GA_NO_DEAD) ) { - continue; - } - //Do we need this??? - if (!act->Schedule(gametime, false) ) { - continue; - } - act->ClearActions(); - act->ClearPath(); - act->SetModal(MS_NONE); - } - } -} - -void GameScript::ClearActions(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = Sender; - if (parameters->objects[1]) { - tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - printMessage("GameScript","Couldn't find target for ClearActions!",YELLOW); - parameters->objects[1]->Dump(); - return; - } - } - tar->ClearActions(); - if (tar->Type==ST_ACTOR) { - Actor* act = (Actor *) tar; - act->ClearPath(); - //not sure about this - //act->SetModal(MS_NONE); - } -} - -void GameScript::SetNumTimesTalkedTo(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->TalkCount = parameters->int0Parameter; -} - -void GameScript::StartMovie(Scriptable* Sender, Action* parameters) -{ - core->PlayMovie( parameters->string0Parameter ); - Sender->ReleaseCurrentAction(); // should this be blocking? -} - -void GameScript::SetLeavePartyDialogFile(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - AutoTable pdtable("pdialog"); - Actor* act = ( Actor* ) Sender; - const char* scriptingname = act->GetScriptName(); - act->SetDialog( pdtable->QueryField( scriptingname, "POST_DIALOG_FILE" ) ); -} - -void GameScript::TextScreen(Scriptable* Sender, Action* parameters) -{ - strnlwrcpy(core->GetGame()->LoadMos, parameters->string0Parameter,8); - core->GetGUIScriptEngine()->RunFunction( "TextScreen", "StartTextScreen" ); - core->GetVideoDriver()->SetMouseEnabled(true); - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); // should this be blocking? -} - -void GameScript::IncrementChapter(Scriptable* Sender, Action* parameters) -{ - TextScreen(Sender, parameters); // textscreen will release blocking for us - core->GetGame()->IncrementChapter(); -} - -void GameScript::SetCriticalPathObject(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) tar; - if (parameters->int0Parameter) { - actor->SetMCFlag(MC_PLOT_CRITICAL, BM_OR); - } else { - actor->SetMCFlag(MC_PLOT_CRITICAL, BM_NAND); - } -} - -void GameScript::SetBeenInPartyFlags(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - //it is bit 15 of the multi-class flags (confirmed) - actor->SetMCFlag(MC_BEENINPARTY, BM_OR); -} - -/*iwd2 sets the high MC bits this way*/ -void GameScript::SetCreatureAreaFlag(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetMCFlag(parameters->int0Parameter, parameters->int1Parameter); -} - -//this will be a global change, fixme if it should be local -void GameScript::SetTextColor(Scriptable* /*Sender*/, Action* parameters) -{ - Color c; - memcpy(&c,¶meters->int0Parameter,4); - core->SetInfoTextColor(c); -} - -void GameScript::BitGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value = CheckVariable(Sender, parameters->string0Parameter ); - HandleBitMod( value, parameters->int0Parameter, parameters->int1Parameter); - SetVariable(Sender, parameters->string0Parameter, value); -} - -void GameScript::GlobalBitGlobal(Scriptable* Sender, Action* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter ); - HandleBitMod( value1, value2, parameters->int1Parameter); - SetVariable(Sender, parameters->string0Parameter, value1); -} - -void GameScript::SetVisualRange(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->SetBase(IE_VISUALRANGE,parameters->int0Parameter); -} - -void GameScript::MakeUnselectable(Scriptable* Sender, Action* parameters) -{ - Sender->UnselectableTimer=parameters->int0Parameter; - - //update color - if (Sender->Type != ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - if (parameters->int0Parameter) { - // flags may be wrong - core->GetGame()->SelectActor(actor, false, SELECT_QUIET); - } - - actor->SetCircleSize(); -} - -void GameScript::Debug(Scriptable* /*Sender*/, Action* parameters) -{ - InDebug=parameters->int0Parameter; - printMessage("GameScript","%s",YELLOW,parameters->string0Parameter); -} - -void GameScript::IncrementProficiency(Scriptable* Sender, Action* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>31) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - //start of the proficiency stats - target->SetBase(IE_PROFICIENCYBASTARDSWORD+idx, - target->GetBase(IE_PROFICIENCYBASTARDSWORD+idx)+parameters->int1Parameter); -} - -void GameScript::IncrementExtraProficiency(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - target->SetBase(IE_FREESLOTS, target->GetBase(IE_FREESLOTS)+parameters->int0Parameter); -} - -//the third parameter is a GemRB extension -void GameScript::AddJournalEntry(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->AddJournalEntry(parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); -} - -void GameScript::SetQuestDone(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - game->DeleteJournalEntry(parameters->int0Parameter); - game->AddJournalEntry(parameters->int0Parameter, IE_GAM_QUEST_DONE, parameters->int2Parameter); - -} - -void GameScript::RemoveJournalEntry(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->DeleteJournalEntry(parameters->int0Parameter); -} - -void GameScript::SetInternal(Scriptable* Sender, Action* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>15) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - //start of the internal stats - target->SetBase(IE_INTERNAL_0+idx, parameters->int1Parameter); -} - -void GameScript::IncInternal(Scriptable* Sender, Action* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>15) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - //start of the internal stats - target->SetBase(IE_INTERNAL_0+idx, - target->GetBase(IE_INTERNAL_0+idx)+parameters->int1Parameter); -} - -void GameScript::DestroyAllEquipment(Scriptable* Sender, Action* /*parameters*/) -{ - Inventory *inv=NULL; - - switch (Sender->Type) { - case ST_ACTOR: - inv = &(((Actor *) Sender)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) Sender)->inventory); - break; - default:; - } - if (inv) { - inv->DestroyItem("",0,(ieDword) ~0); //destroy any and all - } -} - -void GameScript::DestroyItem(Scriptable* Sender, Action* parameters) -{ - Inventory *inv=NULL; - - switch (Sender->Type) { - case ST_ACTOR: - inv = &(((Actor *) Sender)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) Sender)->inventory); - break; - default:; - } - if (inv) { - inv->DestroyItem(parameters->string0Parameter,0,1); //destroy one (even indestructible?) - } -} - -//negative destroygold creates gold -void GameScript::DestroyGold(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) - return; - Actor *act=(Actor *) Sender; - int max=(int) act->GetStat(IE_GOLD); - if (parameters->int0Parameter != 0) { - if (max>parameters->int0Parameter) { - max=parameters->int0Parameter; - } - } - act->SetBase(IE_GOLD, act->GetBase(IE_GOLD)-max); -} - -void GameScript::DestroyPartyItem(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - ieDword count; - if (parameters->int0Parameter) { - count=0; - } else { - count=1; - } - while (i--) { - Inventory *inv = &(game->GetPC( i,false )->inventory); - int res=inv->DestroyItem(parameters->string0Parameter,0,count); - if ( (count == 1) && res) { - break; - } - } -} - -/* this is a gemrb extension */ -void GameScript::DestroyPartyItemNum(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - ieDword count; - count = parameters->int0Parameter; - while (i--) { - Inventory *inv = &(game->GetPC( i,false )->inventory); - count -= inv->DestroyItem(parameters->string0Parameter,0,count); - if (!count ) { - break; - } - } -} - -void GameScript::DestroyAllDestructableEquipment(Scriptable* Sender, Action* /*parameters*/) -{ - Inventory *inv=NULL; - - switch (Sender->Type) { - case ST_ACTOR: - inv = &(((Actor *) Sender)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) Sender)->inventory); - break; - default:; - } - if (inv) { - inv->DestroyItem("", IE_INV_ITEM_DESTRUCTIBLE, (ieDword) ~0); - } -} - -void GameScript::SetApparentName(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - target->SetName(parameters->int0Parameter,1); -} - -void GameScript::SetRegularName(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - target->SetName(parameters->int0Parameter,2); -} - -/** this is a gemrb extension */ -void GameScript::UnloadArea(Scriptable* /*Sender*/, Action* parameters) -{ - int map=core->GetGame()->FindMap(parameters->string0Parameter); - if (map>=0) { - core->GetGame()->DelMap(map, parameters->int0Parameter); - } -} - -static EffectRef fx_death_ref = { "Death", -1 }; -void GameScript::Kill(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor* target = ( Actor* ) tar; - Effect *fx = EffectQueue::CreateEffect(fx_death_ref, 0, 0, FX_DURATION_INSTANT_PERMANENT); - target->fxqueue.AddEffect(fx, false); - delete fx; -} - -void GameScript::SetGabber(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - GameControl* gc = core->GetGameControl(); - if (gc->GetDialogueFlags()&DF_IN_DIALOG) { - gc->dialoghandler->speakerID = tar->GetGlobalID(); - } else { - printMessage("GameScript","Can't set gabber!",YELLOW); - } -} - -void GameScript::ReputationSet(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->SetReputation(parameters->int0Parameter*10); -} - -void GameScript::ReputationInc(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - game->SetReputation( (int) game->Reputation + parameters->int0Parameter*10); -} - -void GameScript::FullHeal(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - Actor *scr = (Actor *) tar; - //0 means full healing - //Heal() might contain curing of some conditions - //if FullHeal doesn't do that, replace this with a SetBase - //fullhealex might still be the curing action - scr->Heal(0); -} - -void GameScript::RemovePaladinHood(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->ApplyKit(true); - act->SetMCFlag(MC_FALLEN_PALADIN, BM_OR); - if (act->InParty) displaymsg->DisplayConstantStringName(STR_PALADIN_FALL, 0xbcefbc, act); -} - -void GameScript::RemoveRangerHood(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->ApplyKit(true); - act->SetMCFlag(MC_FALLEN_RANGER, BM_OR); - if (act->InParty) displaymsg->DisplayConstantStringName(STR_RANGER_FALL, 0xbcefbc, act); -} - -void GameScript::RegainPaladinHood(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->SetMCFlag(MC_FALLEN_PALADIN, BM_NAND); - act->ApplyKit(false); -} - -void GameScript::RegainRangerHood(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->SetMCFlag(MC_FALLEN_RANGER, BM_NAND); - act->ApplyKit(false); -} - -//transfering item from Sender to target, target must be an actor -//if target can't get it, it will be dropped at its feet -//a container or an actor can take an item from someone -void GameScript::GetItem(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - MoveItemCore(tar, Sender, parameters->string0Parameter,0,0); -} - -//getting one single item -void GameScript::TakePartyItem(Scriptable* Sender, Action* parameters) -{ - Game *game=core->GetGame(); - int i=game->GetPartySize(false); - while (i--) { - int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,IE_INV_ITEM_UNDROPPABLE,IE_INV_ITEM_UNSTEALABLE); - if (res!=MIC_NOITEM) return; - } -} - -//getting x single item -void GameScript::TakePartyItemNum(Scriptable* Sender, Action* parameters) -{ - int count = parameters->int0Parameter; - Game *game=core->GetGame(); - int i=game->GetPartySize(false); - while (i--) { - int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,IE_INV_ITEM_UNDROPPABLE, IE_INV_ITEM_UNSTEALABLE); - if (res == MIC_GOTITEM) { - i++; - count--; - } - if (!count) return; - } -} - -void GameScript::TakePartyItemRange(Scriptable* Sender, Action* parameters) -{ - Game *game=core->GetGame(); - int i=game->GetPartySize(false); - while (i--) { - Actor *ac = game->GetPC(i,false); - if (Distance(Sender, ac)string0Parameter,IE_INV_ITEM_UNDROPPABLE,IE_INV_ITEM_UNSTEALABLE)==MIC_GOTITEM) { } - } - } -} - -void GameScript::TakePartyItemAll(Scriptable* Sender, Action* parameters) -{ - Game *game=core->GetGame(); - int i=game->GetPartySize(false); - while (i--) { - while (MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,IE_INV_ITEM_UNDROPPABLE, IE_INV_ITEM_UNSTEALABLE)==MIC_GOTITEM) { } - } -} - -//an actor can 'give' an item to a container or another actor -void GameScript::GiveItem(Scriptable *Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - MoveItemCore(Sender, tar, parameters->string0Parameter,0,0); -} - -//this action creates an item in a container or a creature -//if there is an object it works as GiveItemCreate -//otherwise it creates the item on the Sender -void GameScript::CreateItem(Scriptable *Sender, Action* parameters) -{ - Scriptable* tar; - if (parameters->objects[1]) { - tar = GetActorFromObject( Sender, parameters->objects[1] ); - } else { - tar = Sender; - } - if (!tar) - return; - Inventory *myinv; - - switch(tar->Type) { - case ST_ACTOR: - myinv = &((Actor *) tar)->inventory; - break; - case ST_CONTAINER: - myinv = &((Container *) tar)->inventory; - break; - default: - return; - } - - CREItem *item = new CREItem(); - if (!CreateItemCore(item, parameters->string0Parameter, parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter)) { - delete item; - return; - } - if (tar->Type==ST_CONTAINER) { - myinv->AddItem(item); - } else { - if ( ASI_SUCCESS != myinv->AddSlotItem(item, SLOT_ONLYINVENTORY)) { - Map *map=tar->GetCurrentArea(); - // drop it at my feet - map->AddItemToLocation(tar->Pos, item); - if (((Actor *)tar)->InParty) displaymsg->DisplayConstantString(STR_INVFULL_ITEMDROP, 0xbcefbc); - } else { - if (((Actor *)tar)->InParty) displaymsg->DisplayConstantString(STR_GOTITEM, 0xbcefbc); - } - } -} - -void GameScript::CreateItemNumGlobal(Scriptable *Sender, Action* parameters) -{ - Inventory *myinv; - - switch(Sender->Type) { - case ST_ACTOR: - myinv = &((Actor *) Sender)->inventory; - break; - case ST_CONTAINER: - myinv = &((Container *) Sender)->inventory; - break; - default: - return; - } - int value = CheckVariable( Sender, parameters->string0Parameter ); - CREItem *item = new CREItem(); - if (!CreateItemCore(item, parameters->string1Parameter, value, 0, 0)) { - delete item; - return; - } - if (Sender->Type==ST_CONTAINER) { - myinv->AddItem(item); - } else { - if ( ASI_SUCCESS != myinv->AddSlotItem(item, SLOT_ONLYINVENTORY)) { - Map *map=Sender->GetCurrentArea(); - // drop it at my feet - map->AddItemToLocation(Sender->Pos, item); - if (((Actor *)Sender)->InParty) displaymsg->DisplayConstantString(STR_INVFULL_ITEMDROP, 0xbcefbc); - } else { - if (((Actor *)Sender)->InParty) displaymsg->DisplayConstantString(STR_GOTITEM, 0xbcefbc); - } - } -} - -void GameScript::TakeItemReplace(Scriptable *Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - return; - } - - Actor *scr = (Actor *) tar; - CREItem *item; - int slot = scr->inventory.RemoveItem(parameters->string1Parameter, IE_INV_ITEM_UNDROPPABLE, &item); - if (!item) { - item = new CREItem(); - } - if (!CreateItemCore(item, parameters->string0Parameter, -1, 0, 0)) { - delete item; - return; - } - if (ASI_SUCCESS != scr->inventory.AddSlotItem(item,slot)) { - Map *map = scr->GetCurrentArea(); - map->AddItemToLocation(Sender->Pos, item); - } -} - -//same as equipitem, but with additional slots parameter, and object to perform action -void GameScript::XEquipItem(Scriptable *Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) tar; - int slot = actor->inventory.FindItem(parameters->string0Parameter, 0); - if (slot<0) { - return; - } - actor->inventory.EquipItem(slot); - actor->ReinitQuickSlots(); -} - -//GemRB extension: if int1Parameter is nonzero, don't destroy existing items -void GameScript::FillSlot(Scriptable *Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - - CREItem *tmp = NULL; - Actor *actor = (Actor *) Sender; - int slot = parameters->int0Parameter; - - //free up target slot - tmp = actor->inventory.RemoveItem(slot); - - actor->inventory.TryEquipAll(slot); - - if (tmp) { - if (actor->inventory.HasItemInSlot("",slot) ) { - slot = SLOT_ONLYINVENTORY; - } - - //reequip original item - if(actor->inventory.AddSlotItem(tmp, slot)!=ASI_SUCCESS) { - delete tmp; - } - } -} - -//iwd2 also has a flag for unequip (it might collide with original!) -void GameScript::EquipItem(Scriptable *Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - int slot = actor->inventory.FindItem(parameters->string0Parameter, IE_INV_ITEM_UNDROPPABLE); - if (slot<0) { - return; - } - - int slot2; - - if (parameters->int0Parameter) { - //unequip item, and move it to the inventory - slot2 = SLOT_ONLYINVENTORY; - } else { - //equip item if possible - slot2 = SLOT_AUTOEQUIP; - } - CREItem *si = actor->inventory.RemoveItem(slot); - if (si) { - if (actor->inventory.AddSlotItem(si, slot2)==ASI_FAILED) { - Map *map = Sender->GetCurrentArea(); - if (map) { - //drop item at the feet of the character instead of destroying it - map->AddItemToLocation(Sender->Pos, si); - } else { - delete si; - } - } - } - actor->ReinitQuickSlots(); -} - -void GameScript::DropItem(Scriptable *Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - if (Distance(parameters->pointParameter, Sender) > 10) { - MoveNearerTo(Sender, parameters->pointParameter, 10,0); - return; - } - Actor *scr = (Actor *) Sender; - Map *map = Sender->GetCurrentArea(); - - if (parameters->string0Parameter[0]) { - //dropping location isn't exactly our place, this is why i didn't use a simple DropItem - scr->inventory.DropItemAtLocation(parameters->string0Parameter, -0, map, parameters->pointParameter); - } else { - //this should be converted from scripting slot to physical slot - scr->inventory.DropItemAtLocation(parameters->int0Parameter, 0, map, parameters->pointParameter); - } - - Sender->ReleaseCurrentAction(); -} - -void GameScript::DropInventory(Scriptable *Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - scr->DropItem("",0); -} - -//this should work on containers! -//using the same code for DropInventoryEXExclude -void GameScript::DropInventoryEX(Scriptable *Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - Inventory *inv = NULL; - switch (Sender->Type) { - case ST_ACTOR: - inv = &(((Actor *) tar)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) tar)->inventory); - break; - default:; - } - if (inv) { - int x = inv->GetSlotCount(); - Map *area = tar->GetCurrentArea(); - while(x--) { - if (parameters->string0Parameter[0]) { - const char *resref = inv->GetSlotItem(x)->ItemResRef; - if (!strnicmp(parameters->string0Parameter, resref, 8)) { - continue; - } - } - inv->DropItemAtLocation(x, 0, area, tar->Pos); - } - } -} - -void GameScript::GivePartyAllEquipment(Scriptable *Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Game *game = core->GetGame(); - // pick the first actor first - for (int i = 0; i < game->GetPartySize(false); i++) { - Actor *tar = game->GetPC(i,false); - //don't try to give self, it would be an infinite loop - if (tar==(Actor *) Sender) - continue; - while(MoveItemCore(Sender, tar, "",0,0)!=MIC_NOITEM) { } - } -} - -//This is unsure, Plunder could be just handling ground piles and not dead actors -void GameScript::Plunder(Scriptable *Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - - //you must be joking - if (tar==Sender) { - Sender->ReleaseCurrentAction(); - return; - } - - if (tar->Type == ST_ACTOR) { - Actor *scr = (Actor *) tar; - //can plunder only dead actors - if (! (scr->BaseStats[IE_STATE_ID]&STATE_DEAD) ) { - Sender->ReleaseCurrentAction(); - return; - } - } - if (PersonalDistance(Sender, tar)>MAX_OPERATING_DISTANCE ) { - MoveNearerTo(Sender, tar->Pos, MAX_OPERATING_DISTANCE,0); - return; - } - //move all movable item from the target to the Sender - //the rest will be dropped at the feet of Sender - while(MoveItemCore(tar, Sender, "",0,0)!=MIC_NOITEM) { } - Sender->ReleaseCurrentAction(); -} - -void GameScript::MoveInventory(Scriptable *Sender, Action* parameters) -{ - Scriptable* src = GetActorFromObject( Sender, parameters->objects[1] ); - if (!src || src->Type!=ST_ACTOR) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[2] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - //don't try to move to self, it would create infinite loop - if (src==tar) - return; - //move all movable item from the target to the Sender - //the rest will be dropped at the feet of Sender - while(MoveItemCore(src, tar, "",0,0)!=MIC_NOITEM) { } -} - -void GameScript::PickPockets(Scriptable *Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *snd = (Actor *) Sender; - Actor *scr = (Actor *) tar; - //for PP one must go REALLY close - Map *map=Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - if (PersonalDistance(Sender, tar)>10 ) { - MoveNearerTo(Sender, tar, 10); - return; - } - - if (scr->GetStat(IE_EA)>EA_EVILCUTOFF) { - displaymsg->DisplayConstantString(STR_PICKPOCKET_EVIL,0xffffff); - Sender->ReleaseCurrentAction(); - return; - } - - int skill = snd->GetStat(IE_PICKPOCKET); - int tgt = scr->GetStat(IE_PICKPOCKET); - //the original engine has no random here - if (tgt != 255) { - skill -= tgt; - //if you want original behaviour: remove this - skill += core->Roll(1,100, snd->GetStat(IE_LUCK) ); - } else { - skill = 0; - } - //and change this 50 to 0. - if (skill<50) { - //noticed attempt - displaymsg->DisplayConstantString(STR_PICKPOCKET_FAIL,0xffffff); - if (core->HasFeature(GF_STEAL_IS_ATTACK) ) { - tar->AddTrigger(TriggerEntry(trigger_attackedby, snd->GetGlobalID())); - tar->LastAttacker = snd->GetGlobalID(); // FIXME - } else { - //pickpocket failed trigger - tar->AddTrigger(TriggerEntry(trigger_pickpocketfailed, snd->GetGlobalID())); - } - Sender->ReleaseCurrentAction(); - return; - } - - int ret = MIC_NOITEM; - if ((RandomNumValue&3) || (scr->GetStat(IE_GOLD)<=0) ) { - int slot = scr->inventory.FindStealableItem(); - if (slot) { - CREItem *item = scr->inventory.RemoveItem(slot); - ret = snd->inventory.AddSlotItem(item, SLOT_ONLYINVENTORY); - if (ret!=ASI_SUCCESS) { - map->AddItemToLocation(snd->Pos, item); - ret = MIC_FULL; - } - } - } - - if (ret==MIC_NOITEM) { - int money=0; - //go for money too - if (scr->GetStat(IE_GOLD)>0) { - money=RandomNumValue%(scr->GetStat(IE_GOLD)+1); - } - if (!money) { - //no stuff to steal - displaymsg->DisplayConstantString(STR_PICKPOCKET_NONE,0xffffff); - Sender->ReleaseCurrentAction(); - return; - } - CREItem *item = new CREItem(); - if (!CreateItemCore(item, core->GoldResRef, money, 0, 0)) { - abort(); - } - if ( ASI_SUCCESS == snd->inventory.AddSlotItem(item, SLOT_ONLYINVENTORY)) { - scr->SetBase(IE_GOLD,scr->GetBase(IE_GOLD)-money); - } else { - // drop it at my feet - map->AddItemToLocation(Sender->Pos, item); - if (((Actor *)Sender)->InParty) displaymsg->DisplayConstantString(STR_INVFULL_ITEMDROP, 0xbcefbc); - Sender->ReleaseCurrentAction(); - return; - } - } - - displaymsg->DisplayConstantString(STR_PICKPOCKET_DONE,0xffffff); - DisplayStringCore(snd, VB_PP_SUCC, DS_CONSOLE|DS_CONST ); - Sender->ReleaseCurrentAction(); -} - -void GameScript::TakeItemList(Scriptable * Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - AutoTable tab(parameters->string0Parameter); - if (!tab) { - return; - } - - int rows = tab->GetRowCount(); - for (int i=0;iQueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - } -} - -void GameScript::TakeItemListParty(Scriptable * Sender, Action* parameters) -{ - AutoTable tab(parameters->string0Parameter); - if (!tab) { - return; - } - Game *game = core->GetGame(); - int rows = tab->GetRowCount(); - for (int i=0;iGetPartySize(false); - while (j--) { - Actor *tar = game->GetPC(j, false); - MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - } - } -} - -void GameScript::TakeItemListPartyNum(Scriptable * Sender, Action* parameters) -{ - AutoTable tab(parameters->string0Parameter); - if (!tab) { - return; - } - Game *game = core->GetGame(); - int rows = tab->GetRowCount(); - int count = parameters->int0Parameter; - for (int i=0;iGetPartySize(false); - while (j--) { - Actor *tar = game->GetPC(j, false); - int res=MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - if (res==MIC_GOTITEM) { - j++; - count--; - } - if (!count) break; - } - } - if (count == 1) { - // grant the default table item to the Sender in regular games - Action *params = new Action(true); - sprintf(params->string0Parameter, "%s", tab->QueryField(9999,9999)); - CreateItem(Sender, params); - delete params; - } -} - -//bg2 -void GameScript::SetRestEncounterProbabilityDay(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->RestHeader.DayChance = (ieWord) parameters->int0Parameter; -} - -void GameScript::SetRestEncounterProbabilityNight(Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->RestHeader.NightChance = (ieWord) parameters->int0Parameter; -} - -//iwd -void GameScript::SetRestEncounterChance(Scriptable * Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->RestHeader.DayChance = (ieWord) parameters->int0Parameter; - map->RestHeader.NightChance = (ieWord) parameters->int1Parameter; -} - -//easily hardcoded end sequence -void GameScript::EndCredits(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->PlayMovie("credits"); -} - -//easily hardcoded end sequence -void GameScript::ExpansionEndCredits(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->PlayMovie("ecredit"); -} - -//always quits game, but based on game it can play end animation, or display -//death text, etc -//this covers: -//QuitGame (play two of 3 movies in PST, display death screen with strref) -//EndGame (display death screen with strref) -void GameScript::QuitGame(Scriptable* Sender, Action* parameters) -{ - ClearAllActions(Sender, parameters); - core->GetDictionary()->SetAt("QuitGame1", (ieDword) parameters->int0Parameter); - core->GetDictionary()->SetAt("QuitGame2", (ieDword) parameters->int1Parameter); - core->GetDictionary()->SetAt("QuitGame3", (ieDword) parameters->int2Parameter); - core->SetNextScript("QuitGame"); -} - -//BG2 demo end, shows some pictures then goes to main screen -void GameScript::DemoEnd(Scriptable* Sender, Action* parameters) -{ - ClearAllActions(Sender, parameters); - core->GetDictionary()->SetAt("QuitGame1", (ieDword)0); - core->GetDictionary()->SetAt("QuitGame2", (ieDword)0); - core->GetDictionary()->SetAt("QuitGame3", (ieDword)-1); - core->SetNextScript("QuitGame"); -} - -void GameScript::StopMoving(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->ClearPath(); -} - -void GameScript::ApplyDamage(Scriptable* Sender, Action* parameters) -{ - Actor *damagee; - Actor *damager; - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - damagee = (Actor *) tar; - if (Sender->Type==ST_ACTOR) { - damager=(Actor *) Sender; - } else { - damager=damagee; - } - damagee->Damage(parameters->int0Parameter, parameters->int1Parameter, damager); -} - -void GameScript::ApplyDamagePercent(Scriptable* Sender, Action* parameters) -{ - Actor *damagee; - Actor *damager; - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - damagee = (Actor *) tar; - if (Sender->Type==ST_ACTOR) { - damager=(Actor *) Sender; - } else { - damager=damagee; - } - damagee->Damage(damagee->GetBase(IE_HITPOINTS)*parameters->int0Parameter/100, parameters->int1Parameter, damager); -} - -void GameScript::Damage(Scriptable* Sender, Action* parameters) -{ - Actor *damagee; - Actor *damager; - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - damagee = (Actor *) tar; - if (Sender->Type==ST_ACTOR) { - damager=(Actor *) Sender; - } else { - damager=damagee; - } - int damage = damagee->LuckyRoll( (parameters->int1Parameter>>12)&15, (parameters->int1Parameter>>4)&255, parameters->int1Parameter&15, LR_DAMAGELUCK, damager); - int type=MOD_ADDITIVE; - switch(parameters->int0Parameter) { - case 2: //raise - damage=-damage; - break; - case 3: //set - type=MOD_ABSOLUTE; - break; - case 4: // - type=MOD_PERCENT; - break; - } - damagee->Damage( damage, type, damager ); -} -/* -void GameScript::SetHomeLocation(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Movable *movable = (Movable *) tar; //not actor, though it is the only moveable - movable->Destination = parameters->pointParameter; - //no movement should be started here, i think -} -*/ - -void GameScript::SetMasterArea(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->SetMasterArea(parameters->string0Parameter); -} - -void GameScript::Berserk(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->SetBaseBit(IE_STATE_ID, STATE_BERSERK, true); - act->Panic(NULL, PANIC_BERSERK); -} - -void GameScript::Panic(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->Panic(NULL, PANIC_RANDOMWALK); -} - -/* as of now: removes panic and berserk */ -void GameScript::Calm(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->SetBaseBit(IE_STATE_ID, STATE_BERSERK|STATE_PANIC, false); -} - -void GameScript::RevealAreaOnMap(Scriptable* /*Sender*/, Action* parameters) -{ - WorldMap *worldmap = core->GetWorldMap(); - if (!worldmap) { - error("GameScript", "Can't find worldmap!\n"); - } - // WMP_ENTRY_ADJACENT because otherwise revealed bg2 areas are unreachable from city gates - worldmap->SetAreaStatus(parameters->string0Parameter, WMP_ENTRY_VISIBLE|WMP_ENTRY_ADJACENT, BM_OR); - displaymsg->DisplayConstantString(STR_WORLDMAPCHANGE, 0xc8ffc8); -} - -void GameScript::HideAreaOnMap( Scriptable* /*Sender*/, Action* parameters) -{ - WorldMap *worldmap = core->GetWorldMap(); - if (!worldmap) { - error("GameScript", "Can't find worldmap!\n"); - } - // WMP_ENTRY_ADJACENT because otherwise revealed bg2 areas are unreachable from city gates - worldmap->SetAreaStatus(parameters->string0Parameter, WMP_ENTRY_VISIBLE|WMP_ENTRY_ADJACENT, BM_NAND); -} - -void GameScript::SendTrigger(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar) { - return; - } - tar->AddTrigger(TriggerEntry(trigger_trigger, parameters->int0Parameter)); -} - -void GameScript::Shout( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - //according to IESDP silenced creatures cannot use shout - Actor *actor = (Actor *) Sender; - if (actor->GetStat( IE_STATE_ID) & STATE_SILENCED) { - return; - } - Map *map=Sender->GetCurrentArea(); - //max. shouting distance, please adjust it if you know better - map->Shout(actor, parameters->int0Parameter, MAX_TRAVELING_DISTANCE); -} - -void GameScript::GlobalShout( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - //according to IESDP silenced creatures cannot use shout - Actor *actor = (Actor *) Sender; - if (actor->GetStat( IE_STATE_ID) & STATE_SILENCED) { - return; - } - Map *map=Sender->GetCurrentArea(); - // 0 means unlimited shout distance - map->Shout(actor, parameters->int0Parameter, 0); -} - -void GameScript::Help( Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Map *map=Sender->GetCurrentArea(); - map->Shout((Actor *) Sender, 0, 40); -} - -void GameScript::GiveOrder(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (tar) { - tar->AddTrigger(TriggerEntry(trigger_receivedorder, Sender->GetGlobalID(), parameters->int0Parameter)); - } -} - -void GameScript::AddMapnote( Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - char *str = core->GetString( parameters->int0Parameter, 0); - map->AddMapNote(parameters->pointParameter, parameters->int1Parameter, str, parameters->int0Parameter); -} - -void GameScript::RemoveMapnote( Scriptable* Sender, Action* parameters) -{ - Map *map=Sender->GetCurrentArea(); - map->RemoveMapNote(parameters->pointParameter); -} - -void GameScript::AttackOneRound( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //using auto target! - Scriptable* tar; - /*if (!parameters->objects[1]) { - GameControl *gc = core->GetGameControl(); - tar = gc->GetTarget(); - } else {*/ - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - /*}*/ - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - if (!Sender->CurrentActionState) { - Sender->CurrentActionState = core->Time.round_size; - } - - AttackCore(Sender, tar, 0); - - if (Sender->CurrentActionState == 1) { - //this is the LastDisarmFailed field, but this is an actor - //Sender->LastTarget = 0; - Sender->ReleaseCurrentAction(); - } else { - Sender->CurrentActionState--; - } -} - -void GameScript::RunningAttackNoSound( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //using auto target! - Scriptable* tar; - /*if (!parameters->objects[1]) { - GameControl *gc = core->GetGameControl(); - tar = gc->GetTarget(); - } else {*/ - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - /*}*/ - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - AttackCore(Sender, tar, AC_NO_SOUND|AC_RUNNING); -} - -void GameScript::AttackNoSound( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //using auto target! - Scriptable* tar; - /*if (!parameters->objects[1]) { - GameControl *gc = core->GetGameControl(); - tar = gc->GetTarget(); - } else {*/ - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - /*}*/ - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - AttackCore(Sender, tar, AC_NO_SOUND); -} - -void GameScript::RunningAttack( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //using auto target! - Scriptable* tar; - /*if (!parameters->objects[1]) { - GameControl *gc = core->GetGameControl(); - tar = gc->GetTarget(); - } else {*/ - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - /*}*/ - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - AttackCore(Sender, tar, AC_RUNNING); -} - -void GameScript::Attack( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - //using auto target! - Scriptable* tar; - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) || tar == Sender) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - AttackCore(Sender, tar, 0); -} - -void GameScript::ForceAttack( Scriptable* Sender, Action* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!scr || scr->Type != ST_ACTOR) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[2], GA_NO_DEAD ); - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - return; - } - //this is a hack, we use a gui variable for our own hideous reasons? - if (tar->Type==ST_ACTOR) { - GameControl *gc = core->GetGameControl(); - if (gc) { - //saving the target object ID from the gui variable - char Tmp[40]; - strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); - scr->AddAction( GenerateActionDirect(Tmp, (Actor *) tar) ); - } - } else { - char Tmp[80]; - snprintf(Tmp, sizeof(Tmp), "BashDoor(%s)", tar->GetScriptName()); - scr->AddAction ( GenerateAction(Tmp) ); - } -} - -void GameScript::AttackReevaluate( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - if (!Sender->CurrentActionState) { - Sender->CurrentActionState = parameters->int0Parameter; - // TODO: reevaluate target (set CurrentActionTarget to 0) if we are not actively in combat - } - - Scriptable* tar; - tar = GetStoredActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar || (tar->Type != ST_ACTOR && tar->Type !=ST_DOOR && tar->Type !=ST_CONTAINER) ) { - Sender->ReleaseCurrentAction(); - return; - } - - //actor is already incapable of attack - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - Sender->ReleaseCurrentAction(); - return; - } - - AttackCore(Sender, tar, 0); - - Sender->CurrentActionState--; -} - -void GameScript::Explore( Scriptable* Sender, Action* /*parameters*/) -{ - Sender->GetCurrentArea( )->Explore(-1); -} - -void GameScript::UndoExplore( Scriptable* Sender, Action* /*parameters*/) -{ - Sender->GetCurrentArea( )->Explore(0); -} - -void GameScript::ExploreMapChunk( Scriptable* Sender, Action* parameters) -{ - Map *map = Sender->GetCurrentArea(); - /* - There is a mode flag in int1Parameter, but i don't know what is it, - our implementation uses it for LOS=1, or no LOS=0 - ExploreMapChunk will reveal both visibility/explored map, but the - visibility will fade in the next update cycle (which is quite frequent) - */ - map->ExploreMapChunk(parameters->pointParameter, parameters->int0Parameter, parameters->int1Parameter); -} - -void GameScript::StartStore( Scriptable* Sender, Action* parameters) -{ - if (core->GetCurrentStore() ) { - return; - } - core->SetCurrentStore( parameters->string0Parameter, Sender->GetGlobalID()); - core->SetEventFlag(EF_OPENSTORE); - //sorry, i have absolutely no idea when i should do this :) - Sender->ReleaseCurrentAction(); -} - -//The integer parameter is a GemRB extension, if set to 1, the player -//gains experience for learning the spell -void GameScript::AddSpecialAbility( Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->LearnSpell (parameters->string0Parameter, parameters->int0Parameter|LS_MEMO|LS_LEARN); - core->SetEventFlag(EF_ACTION); -} - -//actually this just depletes a spell, doesn't remove it from the book -//GemRB extension: the first/second int parameter can also make it removed -//from the spell memorization schedule (also from the spellbook) -void GameScript::RemoveSpell( Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - int type; - - if (Sender->Type!=ST_ACTOR) { - return; - } - if (!ResolveSpellName( spellres, parameters) ) { - return; - } - Actor *actor = (Actor *) Sender; - if (parameters->string0Parameter[0]) { - //the spell resref is in the string parameter - type = parameters->int0Parameter; - } else { - //the spell number is in the int0 parameter - type = parameters->int1Parameter; - } - if (type==2) { - //remove spell from both book and memorization - actor->spellbook.RemoveSpell(spellres); - return; - } - //type == 1 remove spell only from memorization - //type == 0 original behaviour: deplete only - actor->spellbook.UnmemorizeSpell(spellres, type); -} - -void GameScript::SetScriptName( Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - tar->SetScriptName(parameters->string0Parameter); -} - -//iwd2 -//advance time with a constant -//This is in seconds according to IESDP -void GameScript::AdvanceTime(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->AdvanceTime(parameters->int0Parameter*1000/AI_UPDATE_TIME); -} - -//advance at least one day, then stop at next day/dusk/night/morning -//oops, not TimeODay is used but Time (this means we got hours) -//i'm not sure if we should add a whole day either, needs more research -void GameScript::DayNight(Scriptable* /*Sender*/, Action* parameters) -{ - // first, calculate the current number of hours. - int padding = ((core->GetGame()->GameTime / AI_UPDATE_TIME) % 7200) / 300; - // then, calculate the offset (in hours) required to take us to the desired hour. - padding = (24 + parameters->int0Parameter - padding) % 24; - // then, advance one day (7200), plus the desired number of hours. - core->GetGame()->AdvanceTime(AI_UPDATE_TIME*(7200 + padding*300)); -} - -//implement pst style parameters: -//suggested dream - unused -//if suggested dream is 0, then area flags determine the 'movie' -//hp - number of hps healed -//renting - crashes pst, we simply ignore it -void GameScript::RestParty(Scriptable* Sender, Action* parameters) -{ - Game *game = core->GetGame(); - game->RestParty(REST_NOAREA|REST_NOMOVE|REST_NOCRITTER, parameters->int0Parameter, parameters->int1Parameter); - Sender->ReleaseCurrentAction(); -} - -//doesn't advance game time, just refreshes spells of target -//this is a non-blocking action -void GameScript::Rest(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->spellbook.ChargeAllSpells(); - //check if this should be a full heal - actor->Heal(0); - actor->fxqueue.RemoveExpiredEffects(0xffffffff); -} - -//doesn't advance game time (unsure), just refreshes spells of target -void GameScript::RestNoSpells(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - //check if this should be a full heal - actor->Heal(0); - actor->fxqueue.RemoveExpiredEffects(0xffffffff); -} - -//this is most likely advances time -void GameScript::RestUntilHealed(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->Heal(1); - //not sure if this should remove timed effects - //more like execute them hour by hour :> -} - -//iwd2 -//removes all delayed/duration/semi permanent effects (like a ctrl-r) -void GameScript::ClearPartyEffects(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *tar = game->GetPC(i, false); - tar->fxqueue.RemoveExpiredEffects(0xffffffff); - } -} - -//iwd2 removes effects from a single sprite -void GameScript::ClearSpriteEffects(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) tar; - actor->fxqueue.RemoveExpiredEffects(0xffffffff); -} - -//IWD2 special, can mark only actors, hope it is enough -void GameScript::MarkObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - //unsure, could mark dead objects? - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->LastMarked = tar->GetGlobalID(); - //if this doesn't modify LastSeen, then remove this line - actor->LastSeen = actor->LastMarked; -} - -void GameScript::MarkSpellAndObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor *me = (Actor *) Sender; - if (me->LastMarkedSpell) { - return; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1]); - Actor *actor = NULL; - if (tar->Type == ST_ACTOR) { - actor = (Actor *) tar; - } - - int flags = parameters->int0Parameter; - if (!(flags & MSO_IGNORE_NULL) && !actor) { - return; - } - if (!(flags & MSO_IGNORE_INVALID) && actor && actor->InvalidSpellTarget() ) { - return; - } - if (!(flags & MSO_IGNORE_SEE) && actor && !CanSee(Sender, actor, true, 0) ) { - return; - } - int len = strlen(parameters->string0Parameter); - // - if (len&3) { - return; - } - len/=4; - int max = len; - int pos; - if (flags & MSO_RANDOM_SPELL) { - pos = core->Roll(1,len,0); - } else { - pos = 0; - } - while(len--) { - char spl[5]; - - memcpy(spl, parameters->string0Parameter+pos*4, 4); - spl[4]=0; - int splnum = atoi(spl); - - if (!(flags & MSO_IGNORE_HAVE) && !me->spellbook.HaveSpell(splnum, 0) ) { - goto end_mso_loop; - } - int range; - if ((flags & MSO_IGNORE_RANGE) || !actor) { - range = 0; - } else { - range = Distance(me, actor); - } - if (!(flags & MSO_IGNORE_INVALID) && actor->InvalidSpellTarget(splnum, me, range)) { - goto end_mso_loop; - } - //mark spell and target - me->LastMarkedSpell = splnum; - me->LastMarked = actor->GetGlobalID(); - break; -end_mso_loop: - pos++; - if (pos==max) { - pos = 0; - } - } -} - -void GameScript::ForceMarkedSpell(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->LastMarkedSpell = parameters->int0Parameter; -} - -void GameScript::SetMarkedSpell(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - if (parameters->int0Parameter) { - if (actor->LastMarkedSpell) { - return; - } - if (!actor->spellbook.HaveSpell(parameters->int0Parameter, 0) ) { - return; - } - } - - //TODO: check if spell exists (not really important) - actor->LastMarkedSpell = parameters->int0Parameter; - return; -} - -void GameScript::SetDialogueRange(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetBase( IE_DIALOGRANGE, parameters->int0Parameter ); -} - -void GameScript::SetGlobalTint(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetVideoDriver()->SetFadeColor(parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); -} - -void GameScript::SetArmourLevel(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetBase( IE_ARMOR_TYPE, parameters->int0Parameter ); -} - -void GameScript::RandomWalk(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - actor->RandomWalk( true, false ); - Sender->ReleaseCurrentAction(); -} - -void GameScript::RandomRun(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - actor->RandomWalk( true, true ); - Sender->ReleaseCurrentAction(); -} - -void GameScript::RandomWalkContinuous(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - actor->RandomWalk( false, false ); -} - -void GameScript::RandomFly(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - int x = rand()&31; - if (x<10) { - actor->SetOrientation(actor->GetOrientation()-1, false); - } else if (x>20) { - actor->SetOrientation(actor->GetOrientation()+1, false); - } - //fly in this direction for 5 steps - actor->MoveLine(5, GL_PASS, actor->GetOrientation() ); - //readding the action to the end of the queue - //Sender->AddAction( parameters ); - //Sender->ReleaseCurrentAction(); -} - -//UseContainer uses the predefined target (like Nidspecial1 dialog hack) -void GameScript::UseContainer(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - if (core->InCutSceneMode()) { - //cannot use container in dialog or cutscene - Sender->ReleaseCurrentAction(); - return; - } - - Actor *actor = (Actor *)Sender; - Container *container = core->GetCurrentContainer(); - if (!container) { - printMessage("GameScript","No container selected!", YELLOW); - Sender->ReleaseCurrentAction(); - return; - } - - ieDword distance = PersonalDistance(Sender, container); - ieDword needed = MAX_OPERATING_DISTANCE; - if (container->Type==IE_CONTAINER_PILE) { - needed = 0; // less than a search square (width) - } - if (distance<=needed) - { - //check if the container is unlocked - if (!container->TryUnlock(actor)) { - //playsound can't open container - //display string, etc - displaymsg->DisplayConstantString(STR_CONTLOCKED,0xd7d7be,container); - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *)Sender; - actor->SetModal(MS_NONE); - container->TriggerTrap(0, actor->GetGlobalID()); - core->SetCurrentContainer(actor, container, true); - Sender->ReleaseCurrentAction(); - return; - } - MoveNearerTo(Sender, container, needed); -} - -//call the usecontainer action in target (not used) -void GameScript::ForceUseContainer(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); //why blocking??? - return; - } - char Tmp[256]; - sprintf( Tmp, "UseContainer()"); - Action *newaction = GenerateAction(Tmp); - tar->AddActionInFront(newaction); - Sender->ReleaseCurrentAction(); //why blocking??? -} - -//these actions directly manipulate a game variable (as the original engine) -void GameScript::SetMazeEasier(Scriptable* Sender, Action* /*parameters*/) -{ - int value = CheckVariable( Sender, "MAZEDIFFICULTY","GLOBAL"); - if (value>0) { - SetVariable(Sender, "MAZEDIFFICULTY", "GLOBAL", value-1); - } -} - -void GameScript::SetMazeHarder(Scriptable* Sender, Action* /*parameters*/) -{ - int value = CheckVariable( Sender, "MAZEDIFFICULTY","GLOBAL"); - if (value<2) { - SetVariable(Sender, "MAZEDIFFICULTY", "GLOBAL", value+1); - } -} - -void GameScript::GenerateMaze(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->SetEventFlag(EF_CREATEMAZE); -} - -void GameScript::FixEngineRoom(Scriptable* Sender, Action* /*parameters*/) -{ - int value = CheckVariable( Sender, "EnginInMaze","GLOBAL"); - if (value) { - SetVariable(Sender, "EnginInMaze", "GLOBAL", 0); - //this works only because the engine room exit depends only on the EnginInMaze variable - ScriptEngine *sE = core->GetGUIScriptEngine(); - sE->RunFunction("Maze", "CustomizeArea"); - } -} - -void GameScript::StartRainNow(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->GetGame()->StartRainOrSnow( false, WB_RAIN|WB_LIGHTNING); -} - -void GameScript::Weather(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - switch(parameters->int0Parameter & WB_FOG) { - case WB_NORMAL: - game->StartRainOrSnow( false, 0); - break; - case WB_RAIN: - game->StartRainOrSnow( true, WB_RAIN|WB_LIGHTNING); - break; - case WB_SNOW: - game->StartRainOrSnow( true, WB_SNOW); - break; - case WB_FOG: - game->StartRainOrSnow( true, WB_FOG); - break; - } -} - -void GameScript::CopyGroundPilesTo(Scriptable* Sender, Action* parameters) -{ - Map *map = Sender->GetCurrentArea(); - Map *othermap = core->GetGame()->GetMap( parameters->string0Parameter, false ); - if (!othermap) { - return; - } - map->CopyGroundPiles( othermap, parameters->pointParameter ); -} - -//iwd specific -void GameScript::PlayBardSong(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - //actually this one must use int0Parameter to set a bardsong - Actor *actor = (Actor *) Sender; - actor->SetModal( MS_BATTLESONG); -} - -void GameScript::BattleSong(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetModal( MS_BATTLESONG); -} - -void GameScript::FindTraps(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - actor->SetModal( MS_DETECTTRAPS); -} - -void GameScript::Hide(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - - if (actor->TryToHide()) { - actor->SetModal(MS_STEALTH); - } - //TODO: expiry isn't instant (skill based transition?) - -} - -void GameScript::Turn(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *) Sender; - - if (actor->Modified[IE_DISABLEDBUTTON] & (1<GetStat(IE_TURNUNDEADLEVEL); - if (skill < 1) return; - - actor->SetModal(MS_TURNUNDEAD); - -} - -void GameScript::TurnAMT(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) Sender; - actor->SetOrientation(actor->GetOrientation()+parameters->int0Parameter, true); - actor->SetWait( 1 ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::RandomTurn(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *actor = (Actor *) Sender; - actor->SetOrientation(rand() % MAX_ORIENT, true); - actor->SetWait( 1 ); - Sender->ReleaseCurrentAction(); // todo, blocking? -} - -void GameScript::AttachTransitionToDoor(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type != ST_DOOR) { - return; - } - Door* door = ( Door* ) tar; - strnspccpy(door->LinkedInfo, parameters->string0Parameter, 32); -} - -/*getting a handle of a temporary actor resource to copy its selected attributes*/ -void GameScript::ChangeAnimation(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - ChangeAnimationCore((Actor *) Sender, parameters->string0Parameter,1); -} - -void GameScript::ChangeAnimationNoEffect(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - ChangeAnimationCore((Actor *) Sender, parameters->string0Parameter,0); -} - -void GameScript::Polymorph(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - act->SetBase(IE_ANIMATION_ID, parameters->int0Parameter); -} - -void GameScript::PolymorphCopy(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - PolymorphCopyCore((Actor *) tar, (Actor *) Sender, false); -} - -/* according to IESDP this only copies the animation ID */ -void GameScript::PolymorphCopyBase(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *act = (Actor *) Sender; - Actor *actor = (Actor *) tar; - act->SetBase(IE_ANIMATION_ID, actor->GetBase(IE_ANIMATION_ID) ); -} - -void GameScript::ExportParty(Scriptable* /*Sender*/, Action* parameters) -{ - char FileName[_MAX_PATH]; - - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *actor = game->GetPC(i, false); - snprintf(FileName,_MAX_PATH,"%s%d",parameters->string0Parameter,i+1); - core->WriteCharacter(FileName, actor); - } - displaymsg->DisplayConstantString(STR_EXPORTED, 0xbcefbc); -} - -void GameScript::SaveGame(Scriptable* /*Sender*/, Action* parameters) -{ - if (core->HasFeature(GF_STRREF_SAVEGAME)) { - const char *basename = "Auto-Save"; - AutoTable tab("savegame"); - if (tab) { - basename = tab->QueryDefault(); - } - char * str = core->GetString( parameters->int0Parameter, IE_STR_STRREFOFF); - char FolderName[_MAX_PATH]; - snprintf (FolderName, sizeof(FolderName), "%s - %s", basename, str); - core->FreeString( str ); - - core->GetSaveGameIterator()->CreateSaveGame(core->GetSaveGameIterator()->GetSaveGame(FolderName), FolderName); - } else { - core->GetSaveGameIterator()->CreateSaveGame(parameters->int0Parameter); - } -} - -/*EscapeAreaMove(S:Area*,I:X*,I:Y*,I:Face*)*/ -void GameScript::EscapeArea(Scriptable* Sender, Action* parameters) -{ - if (InDebug&ID_ACTIONS) { - print("EscapeArea/EscapeAreaMove\n"); - } - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - Point p = Sender->Pos; - map->TMap->AdjustNearestTravel(p); - - if (parameters->string0Parameter[0]) { - Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); - } else { - EscapeAreaCore( Sender, p, parameters->string0Parameter, p, EA_DESTROY, parameters->int0Parameter ); - } - //EscapeAreaCore will do its ReleaseCurrentAction - //Sender->ReleaseCurrentAction(); -} - -void GameScript::EscapeAreaNoSee(Scriptable* Sender, Action* parameters) -{ - if (InDebug&ID_ACTIONS) { - print("EscapeAreaNoSee\n"); - } - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - Point p = Sender->Pos; - map->TMap->AdjustNearestTravel(p); - - if (parameters->string0Parameter[0]) { - Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); - } else { - EscapeAreaCore( Sender, p, parameters->string0Parameter, p, EA_DESTROY|EA_NOSEE, parameters->int0Parameter ); - } - //EscapeAreaCore will do its ReleaseCurrentAction - //Sender->ReleaseCurrentAction(); -} - -void GameScript::EscapeAreaDestroy(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - //find nearest exit - Point p = Sender->Pos; - map->TMap->AdjustNearestTravel(p); - //EscapeAreaCore will do its ReleaseCurrentAction - EscapeAreaCore( Sender, p, parameters->string0Parameter, p, EA_DESTROY, parameters->int0Parameter ); -} - -/*EscapeAreaObjectMove(S:Area*,I:X*,I:Y*,I:Face*)*/ -void GameScript::EscapeAreaObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - Point p = tar->Pos; - if (parameters->string0Parameter[0]) { - Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); - } else { - EscapeAreaCore( Sender, p, 0, p, EA_DESTROY, parameters->int0Parameter ); - } - //EscapeAreaCore will do its ReleaseCurrentAction -} - -//This one doesn't require the object to be seen? -//We don't have that feature yet, so this is the same as EscapeAreaObject -void GameScript::EscapeAreaObjectNoSee(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - Point p = tar->Pos; - Sender->SetWait(parameters->int0Parameter); - if (parameters->string0Parameter[0]) { - Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); - } else { - EscapeAreaCore( Sender, p, 0, p, EA_DESTROY|EA_NOSEE, parameters->int0Parameter ); - } - //EscapeAreaCore will do its ReleaseCurrentAction -} - -//takes first fitting item from container at feet, doesn't seem to be working in the original engines -void GameScript::PickUpItem(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - Map *map = scr->GetCurrentArea(); - Container *c = map->GetPile(scr->Pos); - if (!c) { //this shouldn't happen, but lets prepare for the worst - return; - } - - //the following part is coming from GUISCript.cpp with trivial changes - int Slot = c->inventory.FindItem(parameters->string0Parameter, 0); - if (Slot<0) { - return; - } - int res = core->CanMoveItem(c->inventory.GetSlotItem(Slot) ); - if (!res) { //cannot move - return; - } - CREItem *item = c->RemoveItem(Slot,0); - if (!item) { - return; - } - if (res!=-1 && scr->InParty) { //it is gold and we got the party pool! - goto item_is_gold; - } - res = scr->inventory.AddSlotItem(item, SLOT_ONLYINVENTORY); - if (res !=ASI_SUCCESS) { //putting it back - c->AddItem(item); - } - return; -item_is_gold: //we take gold! - if (scr->InParty) { - core->GetGame()->PartyGold += res; - //if you want message here then use - //core->GetGame()->AddGold(res); - } else { - scr->SetBase( IE_GOLD, scr->GetBase(IE_GOLD) + res ); - } - delete item; -} - -void GameScript::ChangeStoreMarkup(Scriptable* /*Sender*/, Action* parameters) -{ - bool has_current = false; - ieResRef current; - ieDword owner; - - Store *store = core->GetCurrentStore(); - if (!store) { - store = core->SetCurrentStore(parameters->string0Parameter, 0); - } else { - if (strnicmp(store->Name, parameters->string0Parameter, 8) ) { - //not the current store, we need some dirty hack - has_current = true; - strnlwrcpy(current, store->Name, 8); - owner = store->GetOwnerID(); - } - } - store->BuyMarkup = parameters->int0Parameter; - store->SellMarkup = parameters->int1Parameter; - //additional markup, is this depreciation??? - store->DepreciationRate = parameters->int2Parameter; - if (has_current) { - //setting back old store (this will save our current store) - core->SetCurrentStore(current, owner); - } -} - -void GameScript::SetEncounterProbability(Scriptable* /*Sender*/, Action* parameters) -{ - WorldMap *wmap = core->GetWorldMap(parameters->string0Parameter); - if (!wmap) { - //no such starting area - return; - } - WMPAreaLink *link = wmap->GetLink(parameters->string0Parameter, parameters->string1Parameter); - if (!link) { - return; - } - link->EncounterChance = parameters->int0Parameter; -} - -void GameScript::SpawnPtActivate(Scriptable* Sender, Action* parameters) -{ - if (parameters->objects[1]) { - Map *map = Sender->GetCurrentArea(); - Spawn *spawn = map->GetSpawn(parameters->objects[1]->objectName); - if (spawn) { - spawn->Enabled = 1; - } - } -} - -void GameScript::SpawnPtDeactivate(Scriptable* Sender, Action* parameters) -{ - if (parameters->objects[1]) { - Map *map = Sender->GetCurrentArea(); - Spawn *spawn = map->GetSpawn(parameters->objects[1]->objectName); - if (spawn) { - spawn->Enabled = 0; - } - } -} - -void GameScript::SpawnPtSpawn(Scriptable* Sender, Action* parameters) -{ - if (parameters->objects[1]) { - Map *map = Sender->GetCurrentArea(); - Spawn *spawn = map->GetSpawn(parameters->objects[1]->objectName); - if (spawn) { - spawn->Enabled = 1; //??? maybe use an unconditionality flag - map->TriggerSpawn(spawn); - } - } -} - -void GameScript::ApplySpell(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - - if (!ResolveSpellName( spellres, parameters) ) { - return; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - return; - } - if (tar->Type==ST_ACTOR) { - //apply spell on target -/* - Actor *owner; - - if (Sender->Type==ST_ACTOR) { - owner = (Actor *) Sender; - } else { - owner = (Actor *) tar; - } -*/ - //core->ApplySpell(spellres, (Actor *) tar, owner, parameters->int1Parameter); - core->ApplySpell(spellres, (Actor *) tar, Sender, parameters->int1Parameter); - } else { - //no idea about this one -/* - Actor *owner; - - if (Sender->Type==ST_ACTOR) { - owner = (Actor *) Sender; - } else { - owner = NULL; - } -*/ - //apply spell on point - Point d; - GetPositionFromScriptable(tar, d, false); - //core->ApplySpellPoint(spellres, tar->GetCurrentArea(), d, owner, parameters->int1Parameter); - core->ApplySpellPoint(spellres, tar->GetCurrentArea(), d, Sender, parameters->int1Parameter); - } -} - -void GameScript::ApplySpellPoint(Scriptable* Sender, Action* parameters) -{ - ieResRef spellres; - Actor *owner; - - if (!ResolveSpellName( spellres, parameters) ) { - return; - } - - if (Sender->Type==ST_ACTOR) { - owner = (Actor *) Sender; - } else { - owner = NULL; - } - core->ApplySpellPoint(spellres, Sender->GetCurrentArea(), parameters->pointParameter, owner, parameters->int1Parameter); -} - -//this is a gemrb extension -//sets a variable to the stat value -void GameScript::GetStat(Scriptable* Sender, Action* parameters) -{ - ieDword value; - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - value = 0; - } else { - Actor* actor = ( Actor* ) tar; - value = actor->GetStat( parameters->int0Parameter ); - } - SetVariable( Sender, parameters->string0Parameter, value ); -} - -void GameScript::BreakInstants(Scriptable* Sender, Action* /*parameters*/) -{ - //don't do anything, apparently the point of this action is to - //delay the execution of further actions to the next AI cycle - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); // this doesn't really need to block -} - -//an interesting improvement would be to pause game for a given duration -void GameScript::PauseGame(Scriptable* Sender, Action* /*parameters*/) -{ - GameControl *gc = core->GetGameControl(); - if (gc) { - gc->SetDialogueFlags(DF_FREEZE_SCRIPTS, BM_OR); - displaymsg->DisplayConstantString(STR_SCRIPTPAUSED,0xff0000); - } - // releasing this action allows actions to continue executing, - // so we force a wait - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); // does this need to block? -} - -void GameScript::SetNoOneOnTrigger(Scriptable* Sender, Action* parameters) -{ - Scriptable* ip; - - if (!parameters->objects[1]) { - ip=Sender; - } else { - ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); - } - if (!ip || (ip->Type!=ST_TRIGGER && ip->Type!=ST_TRAVEL && ip->Type!=ST_PROXIMITY)) { - print("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); - return; - } - // FIXME: what does this do? clear triggers? - /*ip->LastEntered = 0; - ip->LastTrigger = 0; - ip->LastTriggerObject = 0;*/ -} - -void GameScript::UseDoor(Scriptable* Sender, Action* parameters) -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - Sender->ReleaseCurrentAction(); - return; - } - - gc->ResetTargetMode(); - OpenDoor(Sender, parameters); - - Sender->ReleaseCurrentAction(); // this is blocking, OpenDoor is not -} - -//this will force bashing the door -void GameScript::BashDoor(Scriptable* Sender, Action* parameters) -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable *target = GetActorFromObject(Sender, parameters->objects[1]); - TileMap *tmap = Sender->GetCurrentArea()->TMap; - Door *door = NULL; - Container *container = NULL; - Point pos; - if (target->Type == ST_DOOR) { - // FIXME: actually it chooses from two possible points - pos = target->Pos; - door = tmap->GetDoorByPosition(pos); - } else if(target->Type == ST_CONTAINER) { - pos = target->Pos; - container = tmap->GetContainerByPosition(pos); - } else { - Sender->ReleaseCurrentAction(); - return; - } - - // TODO: "sets a field in the door/container to 1" - - if (SquaredPersonalDistance(pos, Sender) > MAX_OPERATING_DISTANCE*MAX_OPERATING_DISTANCE) { - MoveNearerTo(Sender, pos, MAX_OPERATING_DISTANCE, 0); - return; - } - - gc->SetTargetMode(TARGET_MODE_ATTACK); //for bashing doors too - - // try to bash it - if (door) { - door->TryBashLock((Actor *) Sender); - } else if (container) { - container->TryBashLock((Actor *) Sender); - } - - Sender->ReleaseCurrentAction(); -} - -//pst action -void GameScript::ActivatePortalCursor(Scriptable* Sender, Action* parameters) -{ - Scriptable* ip; - - if (!parameters->objects[1]) { - ip=Sender; - } else { - ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); - } - if (!ip) { - return; - } - if (ip->Type!=ST_PROXIMITY && ip->Type!=ST_TRAVEL) { - return; - } - InfoPoint *tar = (InfoPoint *) ip; - if (parameters->int0Parameter) { - tar->Trapped|=PORTAL_CURSOR; - } else { - tar->Trapped&=~PORTAL_CURSOR; - } -} - -//pst action -void GameScript::EnablePortalTravel(Scriptable* Sender, Action* parameters) -{ - Scriptable* ip; - - if (!parameters->objects[1]) { - ip=Sender; - } else { - ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); - } - if (!ip) { - return; - } - if (ip->Type!=ST_PROXIMITY && ip->Type!=ST_TRAVEL) { - return; - } - InfoPoint *tar = (InfoPoint *) ip; - if (parameters->int0Parameter) { - tar->Trapped|=PORTAL_TRAVEL; - } else { - tar->Trapped&=~PORTAL_TRAVEL; - } -} - -//unhardcoded iwd action (for the forge entrance change) -void GameScript::ChangeDestination(Scriptable* Sender, Action* parameters) -{ - InfoPoint *ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); - if (ip && (ip->Type==ST_TRAVEL) ) { - //alter the destination area, don't touch the entrance variable link - strnlwrcpy(ip->Destination, parameters->string0Parameter, sizeof(ieResRef)-1 ); - } -} - -void GameScript::MoveCursorPoint(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetVideoDriver()->MoveMouse(parameters->pointParameter.x, parameters->pointParameter.y); -} - -//false means, no talk -void GameScript::DialogueInterrupt(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - if ( parameters->int0Parameter != 0 ) { - actor->SetMCFlag(MC_NO_TALK, BM_NAND); - } else { - actor->SetMCFlag(MC_NO_TALK, BM_OR); - } -} - -void GameScript::EquipMostDamagingMelee(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->inventory.EquipBestWeapon(EQUIP_MELEE); -} - -void GameScript::EquipRanged(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->inventory.EquipBestWeapon(EQUIP_RANGED); -} - -//will equip best weapon regardless of range considerations -void GameScript::EquipWeapon(Scriptable* Sender, Action* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - actor->inventory.EquipBestWeapon(EQUIP_MELEE|EQUIP_RANGED); -} - -void GameScript::SetBestWeapon(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor* actor = ( Actor* ) Sender; - - Actor *target = (Actor *) tar; - if (PersonalDistance(actor,target)>(unsigned int) parameters->int0Parameter) { - actor->inventory.EquipBestWeapon(EQUIP_RANGED); - } else { - actor->inventory.EquipBestWeapon(EQUIP_MELEE); - } -} - -void GameScript::FakeEffectExpiryCheck(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *target = (Actor *) tar; - target->fxqueue.RemoveExpiredEffects(parameters->int0Parameter); -} - -void GameScript::SetInterrupt(Scriptable* Sender, Action* parameters) -{ - if (parameters->int0Parameter) { - Sender->Interrupt(); - } else { - Sender->NoInterrupt(); - } -} - -void GameScript::SelectWeaponAbility(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - int slot = parameters->int0Parameter; - int wslot = scr->inventory.GetWeaponSlot(); - //weapon - if (core->QuerySlotType(slot)&SLOT_WEAPON) { - slot-=wslot; - if (slot<0 || slot>=MAX_QUICKWEAPONSLOT) { - return; - } - scr->SetEquippedQuickSlot(slot, parameters->int1Parameter); - return; - } - //quick item - wslot = scr->inventory.GetQuickSlot(); - if (core->QuerySlotType(slot)&SLOT_ITEM) { - slot-=wslot; - if (slot<0 || slot>=MAX_QUICKITEMSLOT) { - return; - } - if (scr->PCStats) { - scr->PCStats->QuickItemHeaders[slot]=(ieWord) parameters->int1Parameter; - } - } -} - -void GameScript::UseItem(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *act = (Actor *) Sender; - int Slot; - ieDword header, flags; - ieResRef itemres; - - if (parameters->string0Parameter[0]) { - Slot = act->inventory.FindItem(parameters->string0Parameter, 0); - //this IS in the original game code (ability) - header = parameters->int0Parameter; - flags = parameters->int1Parameter; - } else { - Slot = parameters->int0Parameter; - //this is actually not in the original game code - header = parameters->int1Parameter; - flags = parameters->int2Parameter; - } - - if (Slot == -1) { - Sender->ReleaseCurrentAction(); - return; - } - - if (!ResolveItemName( itemres, act, Slot) ) { - Sender->ReleaseCurrentAction(); - return; - } - - unsigned int dist = GetItemDistance(itemres, header); - - if (PersonalDistance(tar->Pos, Sender) > dist) { - MoveNearerTo(Sender, tar, dist); - return; - } - - act->UseItem(Slot, header, tar, flags); - Sender->ReleaseCurrentAction(); -} - -void GameScript::UseItemPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Actor *act = (Actor *) Sender; - int Slot; - ieDword header; - ieResRef itemres; - ieDword flags; - - if (parameters->string0Parameter[0]) { - Slot = act->inventory.FindItem(parameters->string0Parameter, 0); - //this IS in the original game code (ability) - header = parameters->int0Parameter; - flags = parameters->int1Parameter; - } else { - Slot = parameters->int0Parameter; - //this is actually not in the original game code - header = parameters->int1Parameter; - flags = parameters->int2Parameter; - } - - if (Slot == -1) { - Sender->ReleaseCurrentAction(); - return; - } - - if (!ResolveItemName( itemres, act, Slot) ) { - Sender->ReleaseCurrentAction(); - return; - } - - unsigned int dist = GetItemDistance(itemres, header); - - if (PersonalDistance(parameters->pointParameter, Sender) > dist) { - MoveNearerTo(Sender, parameters->pointParameter, dist, 0); - return; - } - - act->UseItemPoint(Slot, header, parameters->pointParameter, flags); - Sender->ReleaseCurrentAction(); -} - -//addfeat will be able to remove feats too -//(the second int parameter is a bitmode) -void GameScript::AddFeat(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *)tar; - actor->SetFeat(parameters->int0Parameter, parameters->int1Parameter); -} - -void GameScript::MatchHP(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *)tar; - switch (parameters->int0Parameter) { - case 1: //sadly the hpflags are not the same as stats - actor->SetBase(IE_HITPOINTS,scr->GetBase(IE_HITPOINTS)); - break; - case 0: - actor->SetBase(IE_MAXHITPOINTS, scr->GetBase(IE_MAXHITPOINTS)); - break; - default: //this is gemrb extension - actor->SetBase(parameters->int0Parameter, scr->GetBase(parameters->int0Parameter)); - break; - } -} - -void GameScript::ChangeColor(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - ieDword stat = parameters->int0Parameter; - if (stat<9 || stat>14) { - return; - } - stat += IE_COLORS - 9; - scr->SetBase(stat, (scr->GetBase(stat)&~255)|(parameters->int1Parameter&255)); -} - -//removes previous kit, adds new -void GameScript::AddKit(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - //remove previous kit stuff - scr->ApplyKit(true); - //this adds the current level abilities - scr->SetBase(IE_KIT, parameters->int0Parameter); - scr->ApplyKit(false); -} - -//doesn't remove old kit -void GameScript::AddSuperKit(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Actor *scr = (Actor *) Sender; - scr->SetBase(IE_KIT, parameters->int0Parameter); - scr->ApplyKit(false); -} - -void GameScript::SetSelection(Scriptable* /*Sender*/, Action* parameters) -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - return; - } - gc->SelectActor(parameters->int0Parameter, parameters->int1Parameter); -} - -//this action is weird in the original game, because it overwrites ALL -//IDS stats. -//in this version, if a stat is set to 0, it won't change -//it will alter only the main IDS stats -void GameScript::ChangeAIType(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return; - } - Object *ob = parameters->objects[1]; - if (!ob) { - return; - } - Actor *scr = (Actor *) Sender; - for (int i=0;iobjectFields[i]; - if (!val) continue; - if (!strnicmp(ObjectIDSTableNames[i],"ea",8)) { - scr->SetBase(IE_EA, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"general",8)) { - scr->SetBase(IE_GENERAL, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"race",8)) { - scr->SetBase(IE_RACE, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"class",8)) { - scr->SetBase(IE_CLASS, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"gender",8)) { - scr->SetBase(IE_SEX, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"specific",8)) { - scr->SetBase(IE_SPECIFIC, val); - continue; - } - if (!strnicmp(ObjectIDSTableNames[i],"align",8)) { - scr->SetBase(IE_ALIGNMENT, val); - continue; - } - } -} - -//same as MoveToPoint, but not blocking -void GameScript::Leader(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - - char Tmp[256]; - - snprintf(Tmp, 256, "MoveToPoint([%d.%d])", parameters->pointParameter.x, parameters->pointParameter.y); - Action *newact = GenerateAction(Tmp); - Sender->AddAction(newact); -} - -//same as MoveToPointNoRecticle, but not blocking -void GameScript::Follow(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return; - } - - char Tmp[256]; - - snprintf(Tmp, 256, "MoveToPointNoRecticle([%d.%d])", parameters->pointParameter.x, parameters->pointParameter.y); - Action *newact = GenerateAction(Tmp); - Sender->AddAction(newact); -} - -void GameScript::FollowCreature(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - Actor *actor = (Actor *)tar; - scr->LastFollowed = actor->GetGlobalID(); - scr->FollowOffset.empty(); - if (!scr->InMove() || scr->Destination != actor->Pos) { - scr->WalkTo(actor->Pos, 0, 1); - } -} - -void GameScript::RunFollow(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - Actor *actor = (Actor *)tar; - scr->LastFollowed = actor->GetGlobalID(); - scr->FollowOffset.empty(); - if (!scr->InMove() || scr->Destination != actor->Pos) { - scr->WalkTo(actor->Pos, IF_RUNNING, 1); - } -} - -void GameScript::ProtectPoint(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - if (!scr->InMove() || scr->Destination != parameters->pointParameter) { - scr->WalkTo( parameters->pointParameter, 0, 1 ); - } - // we should handle 'Protect' here rather than just unblocking - Sender->ReleaseCurrentAction(); -} - -void GameScript::ProtectObject(Scriptable* Sender, Action* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - Actor *actor = (Actor *)tar; - scr->LastFollowed = actor->GetGlobalID(); - scr->LastProtectee = actor->GetGlobalID(); - actor->LastProtector = scr->GetGlobalID(); - //not exactly range - scr->FollowOffset.x = parameters->int0Parameter; - scr->FollowOffset.y = parameters->int0Parameter; - if (!scr->InMove() || scr->Destination != tar->Pos) { - scr->WalkTo( tar->Pos, 0, MAX_OPERATING_DISTANCE ); - } - // we should handle 'Protect' here rather than just unblocking - Sender->ReleaseCurrentAction(); -} - -//keeps following the object in formation -void GameScript::FollowObjectFormation(Scriptable* Sender, Action* parameters) -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - Actor *actor = (Actor *)tar; - scr->LastFollowed = actor->GetGlobalID(); - ieDword formation = parameters->int0Parameter; - ieDword pos = parameters->int1Parameter; - scr->FollowOffset = gc->GetFormationOffset(formation, pos); - if (!scr->InMove() || scr->Destination != tar->Pos) { - scr->WalkTo( tar->Pos, 0, 1 ); - } - Sender->ReleaseCurrentAction(); -} - -//walks to a specific offset of target (quite like movetoobject) -void GameScript::Formation(Scriptable* Sender, Action* parameters) -{ - GameControl *gc = core->GetGameControl(); - if (!gc) { - Sender->ReleaseCurrentAction(); - return; - } - if (Sender->Type!=ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); - return; - } - Actor *scr = (Actor *)Sender; - ieDword formation = parameters->int0Parameter; - ieDword pos = parameters->int1Parameter; - Point FollowOffset = gc->GetFormationOffset(formation, pos); - FollowOffset.x+=tar->Pos.x; - FollowOffset.y+=tar->Pos.y; - if (!scr->InMove() || scr->Destination != FollowOffset) { - scr->WalkTo( FollowOffset, 0, 1 ); - } -} - -void GameScript::TransformItem(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - TransformItemCore((Actor *)tar, parameters, true); -} - -void GameScript::TransformPartyItem(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *tar = game->GetPC(i, false); - TransformItemCore(tar, parameters, true); - } -} - -void GameScript::TransformItemAll(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - TransformItemCore((Actor *)tar, parameters, false); -} - -void GameScript::TransformPartyItemAll(Scriptable* /*Sender*/, Action* parameters) -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Actor *tar = game->GetPC(i, false); - TransformItemCore(tar, parameters, false); - } -} - -void GameScript::GeneratePartyMember(Scriptable* /*Sender*/, Action* parameters) -{ - AutoTable pcs("bios"); - if (!pcs) { - return; - } - const char* string = pcs->QueryField( parameters->int0Parameter, 0 ); - int pos = gamedata->LoadCreature(string,0,false); - if (pos<0) { - return; - } - Actor *actor = core->GetGame()->GetNPC(pos); - if (!actor) { - return; - } - actor->SetOrientation(parameters->int1Parameter, false); - actor->MoveTo(parameters->pointParameter); -} - -void GameScript::EnableFogDither(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->FogOfWar|=FOG_DRAWFOG; -} - -void GameScript::DisableFogDither(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->FogOfWar&=~FOG_DRAWFOG; -} - -void DeleteAllSpriteCovers() -{ - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while (i--) { - Selectable *tar = (Selectable *) game->GetPC(i, false); - tar->SetSpriteCover(NULL); - } -} - -void GameScript::EnableSpriteDither(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->FogOfWar&=~FOG_DITHERSPRITES; - DeleteAllSpriteCovers(); -} - -void GameScript::DisableSpriteDither(Scriptable* /*Sender*/, Action* /*parameters*/) -{ - core->FogOfWar|=~FOG_DITHERSPRITES; - DeleteAllSpriteCovers(); -} - -//the PST crew apparently loved hardcoding stuff -ieResRef RebusResRef={"DABUS1"}; - -void GameScript::FloatRebus(Scriptable* Sender, Action* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - Actor *actor = (Actor *)tar; - RebusResRef[5]=(char) core->Roll(1,5,'0'); - ScriptedAnimation *vvc = gamedata->GetScriptedAnimation(RebusResRef, 0); - if (vvc) { - //setting the height - vvc->ZPos=actor->size*20; - vvc->PlayOnce(); - //maybe this needs setting up some time - vvc->SetDefaultDuration(20); - actor->AddVVCell(vvc); - } -} - -void GameScript::IncrementKillStat(Scriptable* Sender, Action* parameters) -{ - DataFileMgr * ini = core->GetBeastsINI(); - if (!ini) { - return; - } - char key[5]; - sprintf(key,"%d", parameters->int0Parameter); - const char *variable = ini->GetKeyAsString( key, "killvar", NULL ); - if (!variable) { - return; - } - ieDword value = CheckVariable( Sender, variable, "GLOBAL" ) + 1; - SetVariable( Sender, variable, "GLOBAL", value ); -} - -void GameScript::SpellCastEffect(Scriptable* Sender, Action* parameters) -{ - Scriptable* src = GetActorFromObject( Sender, parameters->objects[1] ); - if (!src) { - return; - } - //TODO: finish this -} - -//this action plays a vvc animation over target -//we simply apply the appropriate opcode on the target (see iwdopcodes) -//the list of vvcs is in iwdshtab.2da -static EffectRef fx_iwd_visual_spell_hit_ref = { "IWDVisualSpellHit", -1 }; - -void GameScript::SpellHitEffectSprite(Scriptable* Sender, Action* parameters) -{ - Scriptable* src = GetActorFromObject( Sender, parameters->objects[1] ); - if (!src) { - return; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objects[2] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - int opcode = EffectQueue::ResolveEffect(fx_iwd_visual_spell_hit_ref); - Effect *fx = core->GetEffect(opcode); - if (!fx) { - //invalid effect name didn't resolve to opcode - return; - } - - //vvc type - fx->Parameter2 = parameters->int0Parameter; - //height (not sure if this is in the opcode, but seems acceptable) - fx->Parameter1 = parameters->int1Parameter; - fx->Probability1=100; - fx->TimingMode=FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES; - core->ApplyEffect(fx, (Actor *) tar, src); -} - -void GameScript::SpellHitEffectPoint(Scriptable* Sender, Action* parameters) -{ - Scriptable* src = GetActorFromObject( Sender, parameters->objects[1] ); - if (!src) { - return; - } - - int opcode = EffectQueue::ResolveEffect(fx_iwd_visual_spell_hit_ref); - Effect *fx = core->GetEffect(opcode); - if (!fx) { - //invalid effect name didn't resolve to opcode - return; - } - - //vvc type - fx->Parameter2 = parameters->int0Parameter; - //height (not sure if this is in the opcode, but seems acceptable) - fx->Parameter1 = parameters->int1Parameter; - fx->Probability1=100; - fx->TimingMode=FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES; - fx->PosX=parameters->pointParameter.x; - fx->PosY=parameters->pointParameter.y; - core->ApplyEffect(fx, NULL, src); -} - - -void GameScript::ClickLButtonObject(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); // this is blocking for some reason? - return; - } - ClickCore(Sender, tar->Pos, GEM_MB_ACTION, parameters->int0Parameter); -} - -void GameScript::ClickLButtonPoint(Scriptable* Sender, Action* parameters) -{ - ClickCore(Sender, parameters->pointParameter, GEM_MB_ACTION, parameters->int0Parameter); -} - -void GameScript::ClickRButtonObject(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); // this is blocking for some reason? - return; - } - ClickCore(Sender, tar->Pos, GEM_MB_MENU, parameters->int0Parameter); -} - -void GameScript::ClickRButtonPoint(Scriptable* Sender, Action* parameters) -{ - ClickCore(Sender, parameters->pointParameter, GEM_MB_MENU, parameters->int0Parameter); -} - -void GameScript::DoubleClickLButtonObject(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); // this is blocking for some reason? - return; - } - ClickCore(Sender, tar->Pos, GEM_MB_ACTION|GEM_MB_DOUBLECLICK, parameters->int0Parameter); -} - -void GameScript::DoubleClickLButtonPoint(Scriptable* Sender, Action* parameters) -{ - ClickCore(Sender, parameters->pointParameter, GEM_MB_ACTION|GEM_MB_DOUBLECLICK, parameters->int0Parameter); -} - -void GameScript::DoubleClickRButtonObject(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); - if (!tar) { - Sender->ReleaseCurrentAction(); // this is blocking for some reason? - return; - } - ClickCore(Sender, tar->Pos, GEM_MB_MENU|GEM_MB_DOUBLECLICK, parameters->int0Parameter); -} - -void GameScript::DoubleClickRButtonPoint(Scriptable* Sender, Action* parameters) -{ - ClickCore(Sender, parameters->pointParameter, GEM_MB_MENU|GEM_MB_DOUBLECLICK, parameters->int0Parameter); -} - -//Picks 5 lines from wish.2da -//Gets the 5 values (column is int0parameter) from the table. -//Sets the five wishpowerNN to 1, while resets the rest to 0. -//TODO: investigate what happens with * values -void GameScript::SetupWish(Scriptable* Sender, Action* parameters) -{ - SetupWishCore(Sender, parameters->int0Parameter, parameters->int1Parameter); -} - -//The same as the previous action, except that the column parameter comes from -//the target object's wisdom directly (this action is not used in the original) -void GameScript::SetupWishObject(Scriptable* Sender, Action* parameters) -{ - Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { - return; - } - SetupWishCore(Sender, ((Actor *)tar)->GetStat(IE_WIS), parameters->int0Parameter); -} - -//GemRB specific action -//Sets up multiple tokens randomly (one per 2da row) -//the row label column sets the token names -void GameScript::SetToken2DA(Scriptable* /*Sender*/, Action* parameters) -{ - int count; - int i,j; - ieVariable tokenname; - - AutoTable tm(parameters->string0Parameter); - if (!tm) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find %s.2da.\n", parameters->string0Parameter); - return; - } - - count = tm->GetRowCount(); - for(i=0;iRoll(1,tm->GetColumnCount(i),-1); - strnuprcpy(tokenname, tm->GetRowName(i), 32); - core->GetTokenDictionary()->SetAtCopy( tokenname, tm->QueryField(i, j) ); - } -} - -//this is a gemrb extension for scriptable tracks -void GameScript::SetTrackString(Scriptable* Sender, Action* parameters) -{ - Map *map = Sender->GetCurrentArea(); - if (!map) return; - map->SetTrackString(parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); -} - -void GameScript::StateOverrideFlag(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->StateOverrideFlag = parameters->int0Parameter; -} - -void GameScript::StateOverrideTime(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->StateOverrideTime = parameters->int0Parameter; -} - -void GameScript::BanterBlockFlag(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->BanterBlockFlag = parameters->int0Parameter; -} - -void GameScript::BanterBlockTime(Scriptable* /*Sender*/, Action* parameters) -{ - core->GetGame()->BanterBlockTime = parameters->int0Parameter; -} - -void GameScript::SetNamelessDeath(Scriptable* Sender, Action* parameters) -{ - ieResRef area; - - snprintf(area,8,"AR%04d", parameters->int0Parameter); - IniSpawn *sp = Sender->GetCurrentArea()->INISpawn; - if (!sp) { - return; - } - sp->SetNamelessDeath(area, parameters->pointParameter, parameters->int1Parameter); -} diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp deleted file mode 100644 index 26fa7fc43..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp +++ /dev/null @@ -1,2285 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2005 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" - -#include "strrefs.h" -#include "defsounds.h" - -#include "Audio.h" -#include "CharAnimations.h" -#include "DialogHandler.h" -#include "DisplayMessage.h" -#include "Game.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "Interface.h" -#include "Item.h" -#include "Map.h" -#include "Spell.h" -#include "StringMgr.h" -#include "TableMgr.h" -#include "TileMap.h" -#include "Video.h" -#include "GUI/GameControl.h" -#include "Scriptable/Container.h" -#include "Scriptable/Door.h" -#include "Scriptable/InfoPoint.h" - -#include - -//these tables will get freed by Core -Holder triggersTable; -Holder actionsTable; -Holder overrideActionsTable; -Holder objectsTable; -TriggerFunction triggers[MAX_TRIGGERS]; -ActionFunction actions[MAX_ACTIONS]; -short actionflags[MAX_ACTIONS]; -short triggerflags[MAX_TRIGGERS]; -ObjectFunction objects[MAX_OBJECTS]; -IDSFunction idtargets[MAX_OBJECT_FIELDS]; -Cache SrcCache; //cache for string resources (pst) -Cache BcsCache; //cache for scripts -int ObjectIDSCount = 7; -int MaxObjectNesting = 5; -bool HasAdditionalRect = false; -bool HasTriggerPoint = false; -//don't create new variables -bool NoCreate = false; -bool HasKaputz = false; -//released by ReleaseMemory -ieResRef *ObjectIDSTableNames; -int ObjectFieldsCount = 7; -int ExtraParametersCount = 0; -int InDebug = 0; -int happiness[3][20]; -int RandomNumValue; -// reaction modifiers (by reputation and charisma) -int rmodrep[20]; -int rmodchr[25]; -Gem_Polygon **polygons; - -void InitScriptTables() -{ - //initializing the happiness table - { - AutoTable tab("happy"); - if (tab) { - for (int alignment=0;alignment<3;alignment++) { - for (int reputation=0;reputation<20;reputation++) { - happiness[alignment][reputation]=strtol(tab->QueryField(reputation,alignment), NULL, 0); - } - } - } - } - - //initializing the reaction mod. reputation table - AutoTable rmr("rmodrep"); - if (rmr) { - for (int reputation=0; reputation<20; reputation++) { - rmodrep[reputation] = strtol(rmr->QueryField(0, reputation), NULL, 0); - } - } - - //initializing the reaction mod. charisma table - AutoTable rmc("rmodchr"); - if (rmc) { - for (int charisma=0; charisma<25; charisma++) { - rmodchr[charisma] = strtol(rmc->QueryField(0, charisma), NULL, 0); - } - } -} - -int GetReaction(Actor *target, Scriptable *Sender) -{ - int chr, rep, reaction; - chr = target->GetStat(IE_CHR)-1; - if (target->GetStat(IE_EA) == EA_PC) { - rep = core->GetGame()->Reputation/10; - } else { - rep = target->GetStat(IE_REPUTATION); - } - reaction = 10 + rmodrep[rep] + rmodchr[chr]; - - // add -4 penalty when dealing with racial enemies - if (Sender && target->GetRangerLevel() && Sender->Type == ST_ACTOR && target->IsRacialEnemy((Actor *)Sender)) { - reaction -= 4; - } - - return reaction; -} - -int GetHappiness(Scriptable* Sender, int reputation) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor* ab = ( Actor* ) Sender; - int alignment = ab->GetStat(IE_ALIGNMENT)&AL_GE_MASK; //good / evil - if (reputation > 200) { - reputation = 200; - } - return happiness[alignment][reputation/10-1]; -} - -int GetHPPercent(Scriptable* Sender) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor* ab = ( Actor* ) Sender; - int hp1 = ab->GetStat(IE_MAXHITPOINTS); - if (hp1<1) { - return 0; - } - int hp2 = ab->GetBase(IE_HITPOINTS); - if (hp2<1) { - return 0; - } - return hp2*100/hp1; -} - -void HandleBitMod(ieDword &value1, ieDword value2, int opcode) -{ - switch(opcode) { - case BM_AND: - value1 = ( value1& value2 ); - break; - case BM_OR: - value1 = ( value1| value2 ); - break; - case BM_XOR: - value1 = ( value1^ value2 ); - break; - case BM_NAND: //this is a GemRB extension - value1 = ( value1& ~value2 ); - break; - case BM_SET: //this is a GemRB extension - value1 = value2; - break; - } -} - -// SPIT is not in the original engine spec, it is reserved for the -// enchantable items feature -// 0 1 2 3 4 -static const char *spell_suffices[]={"SPIT","SPPR","SPWI","SPIN","SPCL"}; - -//this function handles the polymorphism of Spell[RES] actions -//it returns spellres -bool ResolveSpellName(ieResRef spellres, Action *parameters) -{ - if (parameters->string0Parameter[0]) { - strnlwrcpy(spellres, parameters->string0Parameter, 8); - } else { - //resolve spell - int type = parameters->int0Parameter/1000; - int spellid = parameters->int0Parameter%1000; - if (type>4) { - return false; - } - sprintf(spellres, "%s%03d", spell_suffices[type], spellid); - } - return gamedata->Exists(spellres, IE_SPL_CLASS_ID); -} - -void ResolveSpellName(ieResRef spellres, ieDword number) -{ - //resolve spell - unsigned int type = number/1000; - int spellid = number%1000; - if (type>4) { - type=0; - } - sprintf(spellres, "%s%03d", spell_suffices[type], spellid); -} - -ieDword ResolveSpellNumber(const ieResRef spellres) -{ - int i; - - for(i=0;i<5;i++) { - if(!strnicmp(spellres, spell_suffices[i], 4)) { - int n = -1; - sscanf(spellres+4,"%d", &n); - if (n<0) { - return 0xffffffff; - } - return i*1000+n; - } - } - return 0xffffffff; -} - -bool ResolveItemName(ieResRef itemres, Actor *act, ieDword Slot) -{ - CREItem *itm = act->inventory.GetSlotItem(Slot); - if(itm) { - strnlwrcpy(itemres, itm->ItemResRef, 8); - return gamedata->Exists(itemres, IE_ITM_CLASS_ID); - } - return false; -} - -bool StoreHasItemCore(const ieResRef storename, const ieResRef itemname) -{ - CREItem item; - - Store* store = gamedata->GetStore(storename); - if (!store) { - printMessage("GameScript","Store cannot be opened!\n", LIGHT_RED); - return false; - } - - bool ret = false; - //don't use triggers (pst style), it would be possible to create infinite loops - if (store->FindItem(itemname, false) != (unsigned int)-1) { - ret=true; - } - // Don't call gamedata->SaveStore, we don't change it, and it remains cached. - return ret; -} - -//don't pass this point by reference, it is subject to change -void ClickCore(Scriptable *Sender, Point point, int type, int speed) -{ - Map *map = Sender->GetCurrentArea(); - if (!map) { - Sender->ReleaseCurrentAction(); - return; - } - Point p=map->TMap->GetMapSize(); - if (!p.PointInside(point)) { - Sender->ReleaseCurrentAction(); - return; - } - Video *video = core->GetVideoDriver(); - GlobalTimer *timer = core->timer; - timer->SetMoveViewPort( point.x, point.y, speed, true ); - timer->DoStep(0); - if (timer->ViewportIsMoving()) { - Sender->AddActionInFront( Sender->GetCurrentAction() ); - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); - return; - } - - video->ConvertToScreen(point.x, point.y); - GameControl *win = core->GetGameControl(); - - point.x+=win->XPos; - point.y+=win->YPos; - video->MoveMouse(point.x, point.y); - video->ClickMouse(type); - Sender->ReleaseCurrentAction(); -} - -void TransformItemCore(Actor *actor, Action *parameters, bool onlyone) -{ - int i = actor->inventory.GetSlotCount(); - while(i--) { - CREItem *item = actor->inventory.GetSlotItem(i); - if (!item) { - continue; - } - if (strnicmp(item->ItemResRef, parameters->string0Parameter, 8) ) { - continue; - } - actor->inventory.SetSlotItemRes(parameters->string1Parameter,i,parameters->int0Parameter,parameters->int1Parameter,parameters->int2Parameter); - if (onlyone) { - break; - } - } -} - -//check if an inventory (container or actor) has item (could be recursive ?) -bool HasItemCore(Inventory *inventory, const ieResRef itemname, ieDword flags) -{ - if (inventory->HasItem(itemname, flags)) { - return true; - } - int i=inventory->GetSlotCount(); - while (i--) { - //maybe we could speed this up if we mark bag items with a flags bit - CREItem *itemslot = inventory->GetSlotItem(i); - if (!itemslot) - continue; - Item *item = gamedata->GetItem(itemslot->ItemResRef); - if (!item) - continue; - bool ret = false; - if (core->CanUseItemType(SLOT_BAG,item,NULL) ) { - //the store is the same as the item's name - ret = StoreHasItemCore(itemslot->ItemResRef, itemname); - } - gamedata->FreeItem(item, itemslot->ItemResRef); - if (ret) { - return true; - } - } - return false; -} - -void DisplayStringCore(Scriptable* Sender, int Strref, int flags) -{ - StringBlock sb; - char Sound[_MAX_PATH]; - - //no one hears you when you are in the Limbo! - if (!Sender->GetCurrentArea()) { - return; - } - - memset(&sb,0,sizeof(sb)); - Sound[0]=0; - print( "Displaying string on: %s\n", Sender->GetScriptName() ); - if (flags & DS_CONST) { - if (Sender->Type!=ST_ACTOR) { - printMessage("GameScript","Verbal constant not supported for non actors!\n", LIGHT_RED); - return; - } - Actor* actor = ( Actor* ) Sender; - if ((ieDword) Strref>=VCONST_COUNT) { - printMessage("GameScript","Invalid verbal constant!\n", LIGHT_RED); - return; - } - - int tmp=(int) actor->GetVerbalConstant(Strref); - if (tmp <= 0 || (actor->GetStat(IE_MC_FLAGS) & MC_EXPORTABLE)) { - //get soundset based string constant - actor->ResolveStringConstant( sb.Sound, (unsigned int) Strref); - if (actor->PCStats && actor->PCStats->SoundFolder[0]) { - snprintf(Sound, _MAX_PATH, "%s/%s", - actor->PCStats->SoundFolder, sb.Sound); - } else { - memcpy(Sound, sb.Sound, sizeof(ieResRef) ); - } - } - Strref = tmp; - - //display the verbal constants in the console - ieDword charactersubtitles = 0; - core->GetDictionary()->Lookup("Subtitles", charactersubtitles); - if (charactersubtitles) { - flags |= DS_CONSOLE; - } - } - - if ((Strref != -1) && !sb.Sound[0]) { - sb = core->strings->GetStringBlock( Strref ); - memcpy(Sound, sb.Sound, sizeof(ieResRef) ); - if (sb.text[0] && strcmp(sb.text," ") && (flags & DS_CONSOLE)) { - //can't play the sound here, we have to delay action - //and for that, we have to know how long the text takes - if(flags&DS_NONAME) { - displaymsg->DisplayString( sb.text ); - } else { - displaymsg->DisplayStringName( Strref, 0xf0f0f0, Sender, 0); - } - } - if (sb.text[0] && strcmp(sb.text," ") && (flags & (DS_HEAD | DS_AREA))) { - Sender->DisplayHeadText( sb.text ); - //don't free sb.text, it is residing in Sender - if (flags & DS_AREA) { - Sender->FixHeadTextPos(); - } - } else { - core->FreeString( sb.text ); - } - } - if (Sound[0] && !(flags&DS_SILENT) ) { - ieDword speech = GEM_SND_RELATIVE; //disable position - if (flags&DS_SPEECH) speech|=GEM_SND_SPEECH; - unsigned int len = 0; - core->GetAudioDrv()->Play( Sound,0,0,speech,&len ); - ieDword counter = ( AI_UPDATE_TIME * len ) / 1000; - if ((counter != 0) && (flags &DS_WAIT) ) - Sender->SetWait( counter ); - } -} - -int CanSee(Scriptable* Sender, Scriptable* target, bool range, int seeflag) -{ - Map *map; - - if (target->Type==ST_ACTOR) { - Actor *tar = (Actor *) target; - - if (!tar->ValidTarget(seeflag)) { - return 0; - } - } - - map = target->GetCurrentArea(); - //if (!(seeflag&GA_GLOBAL)) { - if (!map || map!=Sender->GetCurrentArea() ) { - return 0; - } - //} - - if (range) { - unsigned int dist; - - if (Sender->Type == ST_ACTOR) { - Actor* snd = ( Actor* ) Sender; - dist = snd->Modified[IE_VISUALRANGE]; - } else { - dist = 30; - } - - if (Distance(target->Pos, Sender->Pos) > dist * 15) { - return 0; - } - } - - return map->IsVisible(target->Pos, Sender->Pos); -} - -//non actors can see too (reducing function to LOS) -//non actors can be seen too (reducing function to LOS) -int SeeCore(Scriptable* Sender, Trigger* parameters, int justlos) -{ - //see dead - int flags; - - if (parameters->int0Parameter) { - flags = GA_DETECT; - } else { - flags = GA_NO_DEAD; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter, flags ); - /* don't set LastSeen if this isn't an actor */ - if (!tar) { - return 0; - } - //both are actors - if (CanSee(Sender, tar, true, flags) ) { - if (justlos) { - return 1; - } - if (Sender->Type==ST_ACTOR && tar->Type==ST_ACTOR) { - Actor* snd = ( Actor* ) Sender; - //additional checks for invisibility? - snd->LastSeen = tar->GetGlobalID(); - } - return 1; - } - return 0; -} - -//transfering item from Sender to target -//if target has no inventory, the item will be destructed -//if target can't get it, it will be dropped at its feet -int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags, int setflag) -{ - Inventory *myinv; - Map *map; - // track whether we are dealing with our party and need to display feedback - bool lostitem = false; - bool gotitem = false; - - if (!target) { - return MIC_INVALID; - } - map=Sender->GetCurrentArea(); - switch(Sender->Type) { - case ST_ACTOR: - myinv=&((Actor *) Sender)->inventory; - if (((Actor *)Sender)->InParty) lostitem = true; - break; - case ST_CONTAINER: - myinv=&((Container *) Sender)->inventory; - break; - default: - return MIC_INVALID; - } - CREItem *item; - myinv->RemoveItem(resref, flags, &item); - if (!item) { - // nothing was removed - return MIC_NOITEM; - } - - item->Flags|=setflag; - - switch(target->Type) { - case ST_ACTOR: - myinv=&((Actor *) target)->inventory; - if (((Actor *) target)->InParty) gotitem = true; - break; - case ST_CONTAINER: - myinv=&((Container *) target)->inventory; - break; - default: - myinv = NULL; - break; - } - if (!myinv) { - delete item; - if (lostitem) displaymsg->DisplayConstantString(STR_LOSTITEM, 0xbcefbc); - return MIC_GOTITEM; // actually it was lost, not gained - } - if ( myinv->AddSlotItem(item, SLOT_ONLYINVENTORY) !=ASI_SUCCESS) { - // drop it at my feet - map->AddItemToLocation(target->Pos, item); - if (gotitem) displaymsg->DisplayConstantString(STR_INVFULL_ITEMDROP, 0xbcefbc); - return MIC_FULL; - } - if (gotitem) displaymsg->DisplayConstantString(STR_GOTITEM, 0xbcefbc); - return MIC_GOTITEM; -} - -/*FIXME: what is 'base'*/ -void PolymorphCopyCore(Actor *src, Actor *tar, bool base) -{ - tar->SetBase(IE_ANIMATION_ID, src->GetStat(IE_ANIMATION_ID) ); - if (!base) { - tar->SetBase(IE_ARMOR_TYPE, src->GetStat(IE_ARMOR_TYPE) ); - for (int i=0;i<7;i++) { - tar->SetBase(IE_COLORS+i, src->GetStat(IE_COLORS+i) ); - } - } - tar->SetName(src->GetName(0),0); - tar->SetName(src->GetName(1),1); - //add more attribute copying -} - -void CreateCreatureCore(Scriptable* Sender, Action* parameters, int flags) -{ - Scriptable *tmp = GetActorFromObject( Sender, parameters->objects[1] ); - //if there is nothing to copy, don't spawn anything - if (flags & CC_COPY) { - if (!tmp || tmp->Type != ST_ACTOR) { - return; - } - } - - Actor* ab; - if (flags & CC_STRING1) { - ab = gamedata->GetCreature(parameters->string1Parameter); - } - else { - ab = gamedata->GetCreature(parameters->string0Parameter); - } - - if (!ab) { - printMessage("GameScript", "Failed to create creature! (missing creature file %s?)\n", LIGHT_RED, - parameters->string0Parameter); - // maybe this should abort()? - return; - } - - //iwd2 allows an optional scriptname to be set - //but bg2 doesn't have this feature - //this way it works for both games - if ((flags & CC_SCRIPTNAME) && parameters->string1Parameter[0]) { - ab->SetScriptName(parameters->string1Parameter); - } - - int radius; - Point pnt; - - radius=0; - switch (flags & CC_MASK) { - //creates creature just off the screen - case CC_OFFSCREEN: - { - Region vp = core->GetVideoDriver()->GetViewport(); - radius=vp.w/2; //actually it must be further divided by the tile size, hmm 16? - } - //falling through - case CC_OBJECT://use object + offset - if (tmp) Sender=tmp; - //falling through - case CC_OFFSET://use sender + offset - pnt.x = parameters->pointParameter.x+Sender->Pos.x; - pnt.y = parameters->pointParameter.y+Sender->Pos.y; - break; - default: //absolute point, but -1,-1 means AtFeet - pnt.x = parameters->pointParameter.x; - pnt.y = parameters->pointParameter.y; - if (pnt.isempty()) { - pnt.x = Sender->Pos.x; - pnt.y = Sender->Pos.y; - } - break; - } - - Map *map = Sender->GetCurrentArea(); - map->AddActor( ab ); - ab->SetPosition( pnt, flags&CC_CHECK_IMPASSABLE, radius ); - ab->SetOrientation(parameters->int0Parameter, false ); - - //if string1 is animation, then we can't use it for a DV too - if (flags & CC_PLAY_ANIM) { - CreateVisualEffectCore( ab, ab->Pos, parameters->string1Parameter, 1); - } else { - //setting the deathvariable if it exists (iwd2) - if (parameters->string1Parameter[0]) { - ab->SetScriptName(parameters->string1Parameter); - } - } - - if (flags & CC_COPY) { - PolymorphCopyCore ( (Actor *) tmp, ab, false); - } -} - -static ScriptedAnimation *GetVVCEffect(const char *effect, int iterations) -{ - if (effect[0]) { - ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(effect, false); - if (!vvc) { - printMessage("GameScript","Failed to create effect.",LIGHT_RED); - return NULL; - } - if (iterations) { - vvc->SetDefaultDuration( vvc->GetSequenceDuration(AI_UPDATE_TIME * iterations)); - } else { - vvc->PlayOnce(); - } - return vvc; - } - return NULL; -} - -void CreateVisualEffectCore(Actor *target, const char *effect, int iterations) -{ - ScriptedAnimation *vvc = GetVVCEffect(effect, iterations); - if (vvc) { - target->AddVVCell( vvc ); - } -} - -void CreateVisualEffectCore(Scriptable *Sender, const Point &position, const char *effect, int iterations) -{ - ScriptedAnimation *vvc = GetVVCEffect(effect, iterations); - if (vvc) { - vvc->XPos +=position.x; - vvc->YPos +=position.y; - Sender->GetCurrentArea( )->AddVVCell( vvc ); - } -} - -//this destroys the current actor and replaces it with another -void ChangeAnimationCore(Actor *src, const char *resref, bool effect) -{ - Actor *tar = gamedata->GetCreature(resref); - if (tar) { - Map *map = src->GetCurrentArea(); - map->AddActor( tar ); - Point pos = src->Pos; - tar->SetOrientation(src->GetOrientation(), false ); - // make sure to copy the HP, to avoid things like magically-healing trolls - tar->BaseStats[IE_HITPOINTS]=src->BaseStats[IE_HITPOINTS]; - src->DestroySelf(); - // can't SetPosition while the old actor is taking the spot - tar->SetPosition(pos, 1); - if (effect) { - CreateVisualEffectCore(tar, tar->Pos,"smokepuffeffect",1); - } - } -} - -void EscapeAreaCore(Scriptable* Sender, const Point &p, const char* area, const Point &enter, int flags, int wait) -{ - char Tmp[256]; - - if ( !p.isempty() && PersonalDistance(p, Sender)>MAX_OPERATING_DISTANCE) { - //MoveNearerTo will return 0, if the actor is in move - //it will return 1 (the fourth parameter) if the target is unreachable - if (!MoveNearerTo(Sender, p, MAX_OPERATING_DISTANCE,1) ) { - if (!Sender->InMove()) print("At least it said so...\n"); - return; - } - } - - if (flags &EA_DESTROY) { - //this must be put into a non-const variable - sprintf( Tmp, "DestroySelf()" ); - } else { - // last parameter is 'face', which should be passed from relevant action parameter.. - sprintf( Tmp, "MoveBetweenAreas(\"%s\",[%hd.%hd],%d)", area, enter.x, enter.y, 0 ); - } - printMessage("GSUtils", "Executing %s in EscapeAreaCore\n", WHITE, Tmp); - //drop this action, but add another (destroyself or movebetweenareas) - //between the arrival and the final escape, there should be a wait time - //that wait time could be handled here - if (wait) { - print("But wait a bit... (%d)\n", wait); - Sender->SetWait(wait); - } - Sender->ReleaseCurrentAction(); - Action * action = GenerateAction( Tmp); - Sender->AddActionInFront( action ); -} - -void GetTalkPositionFromScriptable(Scriptable* scr, Point &position) -{ - switch (scr->Type) { - case ST_AREA: case ST_GLOBAL: - position = scr->Pos; //fake - break; - case ST_ACTOR: - //if there are other moveables, put them here - position = ((Movable *) scr)->GetMostLikelyPosition(); - break; - case ST_TRIGGER: case ST_PROXIMITY: case ST_TRAVEL: - if (((InfoPoint *) scr)->Flags & TRAP_USEPOINT) { - position=((InfoPoint *) scr)->UsePoint; - break; - } - position=((InfoPoint *) scr)->TrapLaunch; - break; - case ST_DOOR: case ST_CONTAINER: - position=((Highlightable *) scr)->TrapLaunch; - break; - } -} - -void GetPositionFromScriptable(Scriptable* scr, Point &position, bool dest) -{ - if (!dest) { - position = scr->Pos; - return; - } - switch (scr->Type) { - case ST_AREA: case ST_GLOBAL: - position = scr->Pos; //fake - break; - case ST_ACTOR: - //if there are other moveables, put them here - position = ((Movable *) scr)->GetMostLikelyPosition(); - break; - case ST_TRIGGER: case ST_PROXIMITY: case ST_TRAVEL: - if (((InfoPoint *) scr)->Flags & TRAP_USEPOINT) { - position=((InfoPoint *) scr)->UsePoint; - break; - } - case ST_DOOR: case ST_CONTAINER: - position=((Highlightable *) scr)->TrapLaunch; - } -} - -int CheckInteract(const char *talker, const char *target) -{ - AutoTable interact("interact"); - if(!interact) - return 0; - const char *value = interact->QueryField(talker, target); - if(!value) - return 0; - switch(value[0]) { - case 's': - return I_SPECIAL; - case 'c': - return I_COMPLIMENT; - case 'i': - return I_INSULT; - } - return 0; -} - -static ieResRef PlayerDialogRes = "PLAYERx\0"; - -void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) -{ - Scriptable* tar, *scr; - int seeflag = GA_NO_DEAD; - - if (InDebug&ID_VARIABLES) { - print("BeginDialog core\n"); - } - if (Flags & BD_OWN) { - tar = GetStoredActorFromObject( Sender, parameters->objects[1], seeflag); - scr = tar; - } else { - tar = GetStoredActorFromObject( Sender, parameters->objects[1], seeflag); - scr = Sender; - } - if (!scr) { - printMessage("GameScript", "Speaker for dialog couldn't be found (Sender: %s, Type: %d) Flags:%d.\n", LIGHT_RED, - Sender->GetScriptName(), Sender->Type, Flags); - Sender->ReleaseCurrentAction(); - return; - } - - if (!tar || tar->Type!=ST_ACTOR) { - printMessage("GameScript", "Target for dialog couldn't be found (Sender: %s, Type: %d).\n", LIGHT_RED, - Sender->GetScriptName(), Sender->Type); - if (Sender->Type == ST_ACTOR) { - ((Actor *) Sender)->DebugDump(); - } - print ("Target object: "); - if (parameters->objects[1]) { - parameters->objects[1]->Dump(); - } else { - print("\n"); - } - Sender->ReleaseCurrentAction(); - return; - } - - Actor *speaker, *target; - - speaker = NULL; - target = (Actor *) tar; - if ((Flags & BD_CHECKDIST) && !CanSee(scr, target, false, seeflag) ) { - printMessage("GameScript", "CanSee returned false! Speaker (%s, type %d) and target are:\n", LIGHT_RED, - scr->GetScriptName(), scr->Type); - if (scr->Type == ST_ACTOR) { - ((Actor *) scr)->DebugDump(); - } - ((Actor *) tar)->DebugDump(); - Sender->ReleaseCurrentAction(); - return; - } - bool swap = false; - if (scr->Type==ST_ACTOR) { - speaker = (Actor *) scr; - if (speaker->GetStat(IE_STATE_ID)&STATE_DEAD) { - printMessage("GameScript"," ",LIGHT_RED); - print("Speaker is dead, cannot start dialogue. Speaker and target are:\n"); - speaker->DebugDump(); - target->DebugDump(); - Sender->ReleaseCurrentAction(); - return; - } - //DialogueRange is set in IWD - ieDword range = MAX_OPERATING_DISTANCE + speaker->GetBase(IE_DIALOGRANGE); - //making sure speaker is the protagonist, player, actor - if ( target->InParty == 1) swap = true; - else if ( speaker->InParty !=1 && target->InParty) swap = true; - //CHECKDIST works only for mobile scriptables - if (Flags&BD_CHECKDIST) { - if ( scr->GetCurrentArea()!=target->GetCurrentArea() || - PersonalDistance(scr, target)>range) { - MoveNearerTo(Sender, target, MAX_OPERATING_DISTANCE); - return; - } - } - } else { - //pst style dialog with trigger points - swap=true; - if (Flags&BD_CHECKDIST) { - Point TalkPos; - - if (target->InMove()) { - //waiting for target - Sender->AddActionInFront( Sender->GetCurrentAction() ); - Sender->ReleaseCurrentAction(); - Sender->SetWait(1); - return; - } - GetTalkPositionFromScriptable(scr, TalkPos); - if (PersonalDistance(TalkPos, target)>MAX_OPERATING_DISTANCE ) { - //try to force the target to come closer??? - GoNear(target, TalkPos); - Sender->AddActionInFront( Sender->GetCurrentAction() ); - Sender->ReleaseCurrentAction(); - Sender->SetWait(1); - return; - } - } - } - - GameControl* gc = core->GetGameControl(); - if (!gc) { - printMessage( "GameScript","Dialog cannot be initiated because there is no GameControl.", YELLOW ); - Sender->ReleaseCurrentAction(); - return; - } - //can't initiate dialog, because it is already there - if (gc->GetDialogueFlags()&DF_IN_DIALOG) { - if (Flags & BD_INTERRUPT) { - //break the current dialog if possible - gc->dialoghandler->EndDialog(true); - } - //check if we could manage to break it, not all dialogs are breakable! - if (gc->GetDialogueFlags()&DF_IN_DIALOG) { - printMessage( "GameScript","Dialog cannot be initiated because there is already one.", YELLOW ); - Sender->ReleaseCurrentAction(); - return; - } - } - - // starting a dialog ends cutscenes! - core->SetCutSceneMode(false); - - const char* Dialog = NULL; - AutoTable pdtable; - - switch (Flags & BD_LOCMASK) { - case BD_STRING0: - Dialog = parameters->string0Parameter; - if (Flags & BD_SETDIALOG) { - scr->SetDialog( Dialog ); - } - break; - case BD_SOURCE: - case BD_TARGET: - if (swap) Dialog = scr->GetDialog(); - else Dialog = target->GetDialog(GD_FEEDBACK); - break; - case BD_RESERVED: - //what if playerdialog was initiated from Player2? - PlayerDialogRes[5] = '1'; - Dialog = ( const char * ) PlayerDialogRes; - break; - case BD_INTERACT: //using the source for the dialog - const char* scriptingname = scr->GetScriptName(); - - /* use interact.2da for short, inlined dialogue */ - int type = CheckInteract(scriptingname, target->GetScriptName()); - if(type) { - //TODO increase interact counter in scr - speaker->Interact(type); - target->Response(type); - Sender->ReleaseCurrentAction(); - return; - } - /* banter dialogue */ - pdtable.load("interdia"); - //Dialog is a borrowed reference, we cannot free pdtable while it is being used - if (pdtable) { - Dialog = pdtable->QueryField( scriptingname, "FILE" ); - } - break; - } - - - //dialog is not meaningful - if (!Dialog || Dialog[0]=='*') { - Sender->ReleaseCurrentAction(); - return; - } - - //maybe we should remove the action queue, but i'm unsure - //no, we shouldn't even call this! - //Sender->ReleaseCurrentAction(); - - // moved this here from InitDialog, because InitDialog doesn't know which side is which - // post-swap (and non-actors always have IF_NOINT set) .. also added a check that it's - // actually busy doing something, for the same reason - if (target->GetInternalFlag()&IF_NOINT && (target->GetCurrentAction() || target->GetNextAction())) { - displaymsg->DisplayConstantString(STR_TARGETBUSY,0xff0000); - Sender->ReleaseCurrentAction(); - return; - } - - if (speaker!=target) { - if (swap) { - Scriptable *tmp = tar; - tar = scr; - scr = tmp; - } else { - if (!(Flags & BD_INTERRUPT)) { - // added CurrentAction as part of blocking action fixes - if (tar->GetCurrentAction() || tar->GetNextAction()) { - displaymsg->DisplayConstantString(STR_TARGETBUSY,0xff0000); - Sender->ReleaseCurrentAction(); - return; - } - } - } - } - - //don't clear target's actions, because a sequence like this will be broken: - //StartDialog([PC]); SetGlobal("Talked","LOCALS",1); - if (scr!=tar) { - if (scr->Type==ST_ACTOR) { - ((Actor *) scr)->SetOrientation(GetOrient( tar->Pos, scr->Pos), true); - } - if (tar->Type==ST_ACTOR) { - ((Actor *) tar)->SetOrientation(GetOrient( scr->Pos, tar->Pos), true); - } - } - - bool ret; - - if (Dialog[0]) { - //increasing NumTimesTalkedTo or NumTimesInteracted - if (Flags & BD_TALKCOUNT) { - gc->SetDialogueFlags(DF_TALKCOUNT, BM_OR); - } else if ((Flags & BD_LOCMASK) == BD_INTERACT) { - gc->SetDialogueFlags(DF_INTERACT, BM_OR); - } - - core->GetDictionary()->SetAt("DialogChoose",(ieDword) -1); - ret = gc->dialoghandler->InitDialog( scr, tar, Dialog); - } - else { - ret = false; - } - - Sender->ReleaseCurrentAction(); - - if (!ret) { - if (Flags & BD_NOEMPTY) { - return; - } - displaymsg->DisplayConstantStringName(STR_NOTHINGTOSAY,0xff0000,tar); - return; - } -} - -void MoveBetweenAreasCore(Actor* actor, const char *area, const Point &position, int face, bool adjust) -{ - printMessage("GameScript", "MoveBetweenAreas: %s to %s [%d.%d] face: %d\n", WHITE, - actor->GetName(0), area,position.x,position.y, face); - Map* map2; - Game* game = core->GetGame(); - if (area[0]) { //do we need to switch area? - Map* map1 = actor->GetCurrentArea(); - //we have to change the pathfinder - //to the target area if adjust==true - map2 = game->GetMap(area, false); - if ( map1!=map2 ) { - if (map1) { - map1->RemoveActor( actor ); - } - map2->AddActor( actor ); - } - } - actor->SetPosition(position, adjust); - if (face !=-1) { - actor->SetOrientation( face, false ); - } - // should this perhaps be a 'selected' check or similar instead? - if (actor->InParty) { - GameControl *gc=core->GetGameControl(); - gc->SetScreenFlags(SF_CENTERONACTOR,BM_OR); - game->ChangeSong(false, true); - } -} - -//repeat movement, until goal isn't reached -//if int0parameter is !=0, then it will try only x times -void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, bool untilsee) -{ - if (Sender->Type != ST_ACTOR) { - Sender->ReleaseCurrentAction(); - return; - } - Scriptable* target = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!target) { - Sender->ReleaseCurrentAction(); - return; - } - Actor* actor = ( Actor* ) Sender; - if (untilsee && CanSee(actor, target, true, 0) ) { - Sender->ReleaseCurrentAction(); - return; - } else { - if (PersonalDistance(actor, target)ReleaseCurrentAction(); - return; - } - } - if (!actor->InMove() || actor->Destination != target->Pos) { - actor->WalkTo( target->Pos, flags, 0 ); - } - //hopefully this hack will prevent lockups - if (!actor->InMove()) { - Sender->ReleaseCurrentAction(); - return; - } - - //repeat movement... - Action *newaction = ParamCopyNoOverride(parameters); - if (newaction->int0Parameter!=1) { - if (newaction->int0Parameter) { - newaction->int0Parameter--; - } - actor->AddActionInFront(newaction); - actor->SetWait(1); - } - - Sender->ReleaseCurrentAction(); -} - -bool CreateItemCore(CREItem *item, const char *resref, int a, int b, int c) -{ - //copy the whole resref, including the terminating zero - strnuprcpy(item->ItemResRef, resref, 8); - if (!core->ResolveRandomItem(item)) - return false; - if (a==-1) { - //use the default charge counts of the item - Item *origitem = gamedata->GetItem(item->ItemResRef); - if (origitem) { - for(int i=0;i<3;i++) { - ITMExtHeader *e = origitem->GetExtHeader(i); - item->Usages[i]=e?e->Charges:0; - } - gamedata->FreeItem(origitem, item->ItemResRef, false); - } - } else { - item->Usages[0]=(ieWord) a; - item->Usages[1]=(ieWord) b; - item->Usages[2]=(ieWord) c; - } - item->Flags=0; - return true; -} - -//It is possible to attack CONTAINERS/DOORS as well!!! -void AttackCore(Scriptable *Sender, Scriptable *target, int flags) -{ - //this is a dangerous cast, make sure actor is Actor * !!! - Actor *actor = (Actor *) Sender; - - WeaponInfo wi; - ITMExtHeader *header = NULL; - ITMExtHeader *hittingheader = NULL; - int tohit; - ieDword Flags; - int DamageBonus, CriticalBonus; - int speed, style; - - //bool leftorright = (bool) ((attacksperround-attackcount)&1); - bool leftorright = false; - Actor *tar = NULL; - ieDword targetID = 0; - if (target->Type==ST_ACTOR) { - tar = (Actor *) target; - targetID = tar->GetGlobalID(); - } - if (actor == tar) { - Sender->ReleaseCurrentAction(); - return; - } - - //will return false on any errors (eg, unusable weapon) - if (!actor->GetCombatDetails(tohit, leftorright, wi, header, hittingheader, Flags, DamageBonus, speed, CriticalBonus, style, tar)) { - actor->SetStance(IE_ANI_READY); - Sender->ReleaseCurrentAction(); - return; - } - - if (header) wi.range *= 10; - else wi.range = 0; - - if ( target->Type == ST_DOOR || target->Type == ST_CONTAINER) { - wi.range += 10; - } - if (!(flags&AC_NO_SOUND) ) { - if (actor->LastTarget != targetID) { - //play attack sound for party members - if (actor->InParty) { - //pick from all 5 possible verbal constants - actor->VerbalConstant(VB_ATTACK, 5); - //DisplayStringCore(Sender, VB_ATTACK, DS_CONSOLE|DS_CONST ); - } - //display attack message - displaymsg->DisplayConstantStringAction(STR_ACTION_ATTACK,0xf0f0f0, Sender, target); - } - } - //action performed - if(target->Type == ST_ACTOR) { - actor->SetTarget( target ); - } - if ( Sender->GetCurrentArea()!=target->GetCurrentArea() || - (PersonalDistance(Sender, target) > wi.range) || - (!Sender->GetCurrentArea()->IsVisible(Sender->Pos, target->Pos))) { - MoveNearerTo(Sender, target, wi.range); - return; - } else if (target->Type == ST_DOOR) { - //Forcing a lock does not launch the trap... - Door* door = (Door*) target; - if(door->Flags & DOOR_LOCKED) { - door->TryBashLock(actor); - } - Sender->ReleaseCurrentAction(); - return; - } else if (target->Type == ST_CONTAINER) { - Container* cont = (Container*) target; - if(cont->Flags & CONT_LOCKED) { - cont->TryBashLock(actor); - } - Sender->ReleaseCurrentAction(); - return; - } - - actor->PerformAttack(core->GetGame()->GameTime); -} - -//we need this because some special characters like _ or * are also accepted -inline bool ismysymbol(const char letter) -{ - if (letter==']') return false; - if (letter=='[') return false; - if (letter==')') return false; - if (letter=='(') return false; - if (letter=='.') return false; - if (letter==',') return false; - return true; -} - -//this function returns a value, symbol could be a numeric string or -//a symbol from idsname -static int GetIdsValue(const char *&symbol, const char *idsname) -{ - int idsfile=core->LoadSymbol(idsname); - Holder valHook = core->GetSymbol(idsfile); - if (!valHook) { - //FIXME:missing ids file!!! - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript", "Missing IDS file %s for symbol %s!\n", LIGHT_RED, - idsname, symbol); - } - return -1; - } - char *newsymbol; - int value=strtol(symbol, &newsymbol, 0); - if (symbol!=newsymbol) { - symbol=newsymbol; - return value; - } - char symbolname[64]; - int x; - for (x=0;ismysymbol(*symbol) && x<(int) sizeof(symbolname)-1;x++) { - symbolname[x]=*symbol; - symbol++; - } - symbolname[x]=0; - return valHook->GetValue(symbolname); -} - -static void ParseIdsTarget(const char *&src, Object *&object) -{ - for (int i=0;iobjectFields[i]=GetIdsValue(src, ObjectIDSTableNames[i]); - if (*src!='.') { - break; - } - src++; - } - src++; //skipping ] -} - -//this will skip to the next element in the prototype of an action/trigger -#define SKIP_ARGUMENT() while (*str && ( *str != ',' ) && ( *str != ')' )) str++ - -static void ParseObject(const char *&str,const char *&src, Object *&object) -{ - SKIP_ARGUMENT(); - object = new Object(); - switch (*src) { - case '"': - //Scriptable Name - src++; - int i; - for (i=0;i<(int) sizeof(object->objectName)-1 && *src && *src!='"';i++) - { - object->objectName[i] = *src; - src++; - } - object->objectName[i] = 0; - src++; - break; - case '[': - src++; //skipping [ - ParseIdsTarget(src, object); - break; - default: //nested object filters - int Nesting=0; - - while (NestingobjectFilters+1, object->objectFilters, (int) sizeof(int) *(MaxObjectNesting-1) ); - object->objectFilters[0]=GetIdsValue(src,"object"); - if (*src!='(') { - break; - } - src++; //skipping ( - if (*src==')') { - break; - } - Nesting++; - } - if (*src=='[') { - ParseIdsTarget(src, object); - } - src+=Nesting; //skipping ) - } -} - -/* this function was lifted from GenerateAction, to make it clearer */ -Action* GenerateActionCore(const char *src, const char *str, unsigned short actionID) -{ - Action *newAction = new Action(true); - newAction->actionID = actionID; - //this flag tells us to merge 2 consecutive strings together to get - //a variable (context+variablename) - int mergestrings = actionflags[newAction->actionID]&AF_MERGESTRINGS; - int objectCount = ( newAction->actionID == 1 ) ? 0 : 1; - int stringsCount = 0; - int intCount = 0; - if (actionflags[newAction->actionID]&AF_DIRECT) { - Object *tmp = new Object(); - tmp->objectFields[0] = -1; - //tmp->objectFields[1] = core->GetGameControl()->targetID; - newAction->objects[objectCount++] = tmp; - } - //Here is the Action; Now we need to evaluate the parameters, if any - if (*str!=')') while (*str) { - if (*(str+1)!=':') { - print("Warning, parser was sidetracked: %s\n",str); - } - switch (*str) { - default: - print("Invalid type: %s\n",str); - //str++; - delete newAction; - return NULL; - break; - - case 'p': //Point - SKIP_ARGUMENT(); - src++; //Skip [ - newAction->pointParameter.x = (short) strtol( src, (char **) &src, 10 ); - src++; //Skip . - newAction->pointParameter.y = (short) strtol( src, (char **) &src, 10 ); - src++; //Skip ] - break; - - case 'i': //Integer - { - //going to the variable name - while (*str != '*' && *str !=',' && *str != ')' ) { - str++; - } - int value; - if (*str=='*') { //there may be an IDS table - str++; - ieVariable idsTabName; - char* tmp = idsTabName; - while (( *str != ',' ) && ( *str != ')' )) { - *tmp = *str; - tmp++; - str++; - } - *tmp = 0; - if (idsTabName[0]) { - value = GetIdsValue(src, idsTabName); - } - else { - value = strtol( src, (char **) &src, 0); - } - } - else { //no IDS table - value = strtol( src, (char **) &src, 0); - } - if (!intCount) { - newAction->int0Parameter = value; - } else if (intCount == 1) { - newAction->int1Parameter = value; - } else { - newAction->int2Parameter = value; - } - intCount++; - } - break; - - case 'a': - //Action - { - SKIP_ARGUMENT(); - char action[257]; - int i = 0; - int openParenthesisCount = 0; - while (true) { - if (*src == ')') { - if (!openParenthesisCount) - break; - openParenthesisCount--; - } else { - if (*src == '(') { - openParenthesisCount++; - } else { - if (( *src == ',' ) && - !openParenthesisCount) - break; - } - } - action[i] = *src; - i++; - src++; - } - action[i] = 0; - Action* act = GenerateAction( action); - if (!act) { - delete newAction; - return NULL; - } - act->objects[0] = newAction->objects[0]; - newAction->objects[0] = NULL; //avoid freeing of object - delete newAction; //freeing action - newAction = act; - } - break; - - case 'o': //Object - if (objectCount==3) { - print("Invalid object count!\n"); - //abort(); - delete newAction; - return NULL; - } - ParseObject(str, src, newAction->objects[objectCount++]); - break; - - case 's': //String - { - SKIP_ARGUMENT(); - src++; - int i; - char* dst; - if (!stringsCount) { - dst = newAction->string0Parameter; - } else { - dst = newAction->string1Parameter; - } - //if there are 3 strings, the first 2 will be merged, - //the last one will be left alone - if (*str==')') { - mergestrings = 0; - } - //skipping the context part, which - //is to be readed later - if (mergestrings) { - for (i=0;i<6;i++) { - *dst++='*'; - } - } - else { - i=0; - } - //breaking on ',' in case of a monkey attack - //fixes bg1:melicamp.dlg, bg1:sharte.dlg - //if strings ever need a , inside, this is a FIXME - while (*src != '"' && *src !=',') { - if (*src == 0) { - delete newAction; - return NULL; - } - //sizeof(context+name) = 40 - if (i<40) { - *dst++ = (char) tolower(*src); - i++; - } - src++; - } - *dst = 0; - //reading the context part - if (mergestrings) { - str++; - if (*str!='s') { - print("Invalid mergestrings:%s\n",str); - //abort(); - delete newAction; - return NULL; - } - SKIP_ARGUMENT(); - if (!stringsCount) { - dst = newAction->string0Parameter; - } else { - dst = newAction->string1Parameter; - } - - //this works only if there are no spaces - if (*src++!='"' || *src++!=',' || *src++!='"') { - break; - } - //reading the context string - i=0; - while (*src != '"') { - if (*src == 0) { - delete newAction; - return NULL; - } - if (i++<6) { - *dst++ = (char) tolower(*src); - } - src++; - } - } - src++; //skipping " - stringsCount++; - } - break; - } - str++; - if (*src == ',' || *src==')') - src++; - } - return newAction; -} - -void GoNear(Scriptable *Sender, const Point &p) -{ - if (Sender->GetCurrentAction()) { - printMessage("GameScript","Target busy???\n",LIGHT_RED); - return; - } - char Tmp[256]; - sprintf( Tmp, "MoveToPoint([%hd.%hd])", p.x, p.y ); - Action * action = GenerateAction( Tmp); - Sender->AddActionInFront( action ); -} - -void MoveNearerTo(Scriptable *Sender, Scriptable *target, int distance) -{ - Point p; - Map *myarea, *hisarea; - - if (Sender->Type != ST_ACTOR) { - printMessage("GameScript","MoveNearerTo only works with actors\n",LIGHT_RED); - Sender->ReleaseCurrentAction(); - return; - } - - myarea = Sender->GetCurrentArea(); - hisarea = target->GetCurrentArea(); - if (hisarea && hisarea!=myarea) { - target = myarea->GetTileMap()->GetTravelTo(hisarea->GetScriptName()); - - if (!target) { - printMessage("GameScript", "MoveNearerTo failed to find an exit\n", YELLOW); - Sender->ReleaseCurrentAction(); - return; - } - ((Actor *) Sender)->UseExit(target->GetGlobalID()); - } else { - ((Actor *) Sender)->UseExit(0); - } - // we deliberately don't try GetLikelyPosition here for now, - // maybe a future idea if we have a better implementation - // (the old code used it - by passing true not 0 below - when target was a movable) - GetPositionFromScriptable(target, p, 0); - - // account for PersonalDistance (which caller uses, but pathfinder doesn't) - if (distance && Sender->Type == ST_ACTOR) { - distance += ((Actor *)Sender)->size*10; - } - if (distance && target->Type == ST_ACTOR) { - distance += ((Actor *)target)->size*10; - } - - MoveNearerTo(Sender, p, distance, 0); -} - -//It is not always good to release the current action if target is unreachable -//we should also raise the trigger TargetUnreachable (if this is an Attack, at least) -//i hacked only this low level function, didn't need the higher ones so far -int MoveNearerTo(Scriptable *Sender, const Point &p, int distance, int dont_release) -{ - if (Sender->Type != ST_ACTOR) { - printMessage("GameScript","MoveNearerTo only works with actors\n",LIGHT_RED); - Sender->ReleaseCurrentAction(); - return 0; - } - - //chasing is unbreakable - //TODO: is this true? - Sender->CurrentActionInterruptable = false; - - Actor *actor = (Actor *)Sender; - - if (!actor->InMove() || actor->Destination != p) { - actor->WalkTo(p, 0, distance); - } - - if (!actor->InMove()) { - //didn't release - if (dont_release) { - return dont_release; - } - // we can't walk any nearer to destination, give up - Sender->ReleaseCurrentAction(); - } - return 0; -} - -void FreeSrc(SrcVector *poi, const ieResRef key) -{ - int res = SrcCache.DecRef((void *) poi, key, true); - if (res<0) { - error("GameScript", "Corrupted Src cache encountered (reference count went below zero), Src name is: %.8s\n", key); - } - if (!res) { - delete poi; - } -} - -SrcVector *LoadSrc(const ieResRef resname) -{ - SrcVector *src = (SrcVector *) SrcCache.GetResource(resname); - if (src) { - return src; - } - DataStream* str = gamedata->GetResource( resname, IE_SRC_CLASS_ID ); - if ( !str) { - return NULL; - } - ieDword size=0; - str->ReadDword(&size); - src = new SrcVector(size); - SrcCache.SetAt( resname, (void *) src ); - while (size--) { - ieDword tmp; - str->ReadDword(&tmp); - src->at(size)=tmp; - str->ReadDword(&tmp); - } - delete ( str ); - return src; -} - -#define MEMCPY(a,b) memcpy((a),(b),sizeof(a) ) - -static Object *ObjectCopy(Object *object) -{ - if (!object) return NULL; - Object *newObject = new Object(); - MEMCPY( newObject->objectFields, object->objectFields ); - MEMCPY( newObject->objectFilters, object->objectFilters ); - MEMCPY( newObject->objectRect, object->objectRect ); - MEMCPY( newObject->objectName, object->objectName ); - return newObject; -} - -Action *ParamCopy(Action *parameters) -{ - Action *newAction = new Action(true); - newAction->actionID = parameters->actionID; - newAction->int0Parameter = parameters->int0Parameter; - newAction->int1Parameter = parameters->int1Parameter; - newAction->int2Parameter = parameters->int2Parameter; - newAction->pointParameter = parameters->pointParameter; - MEMCPY( newAction->string0Parameter, parameters->string0Parameter ); - MEMCPY( newAction->string1Parameter, parameters->string1Parameter ); - for (int c=0;c<3;c++) { - newAction->objects[c]= ObjectCopy( parameters->objects[c] ); - } - return newAction; -} - -Action *ParamCopyNoOverride(Action *parameters) -{ - Action *newAction = new Action(true); - newAction->actionID = parameters->actionID; - newAction->int0Parameter = parameters->int0Parameter; - newAction->int1Parameter = parameters->int1Parameter; - newAction->int2Parameter = parameters->int2Parameter; - newAction->pointParameter = parameters->pointParameter; - MEMCPY( newAction->string0Parameter, parameters->string0Parameter ); - MEMCPY( newAction->string1Parameter, parameters->string1Parameter ); - newAction->objects[0]= NULL; - newAction->objects[1]= ObjectCopy( parameters->objects[1] ); - newAction->objects[2]= ObjectCopy( parameters->objects[2] ); - return newAction; -} - -Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int negate) -{ - Trigger *newTrigger = new Trigger(); - newTrigger->triggerID = (unsigned short) triggersTable->GetValueIndex( trIndex )&0x3fff; - newTrigger->flags = (unsigned short) negate; - int mergestrings = triggerflags[newTrigger->triggerID]&TF_MERGESTRINGS; - int stringsCount = 0; - int intCount = 0; - //Here is the Trigger; Now we need to evaluate the parameters - if (*str!=')') while (*str) { - if (*(str+1)!=':') { - print("Warning, parser was sidetracked: %s\n",str); - } - switch (*str) { - default: - print("Invalid type: %s\n",str); - //str++; - delete newTrigger; - return NULL; - break; - - case 'p': //Point - SKIP_ARGUMENT(); - src++; //Skip [ - newTrigger->pointParameter.x = (short) strtol( src, (char **) &src, 10 ); - src++; //Skip . - newTrigger->pointParameter.y = (short) strtol( src, (char **) &src, 10 ); - src++; //Skip ] - break; - - case 'i': //Integer - { - //going to the variable name - while (*str != '*' && *str !=',' && *str != ')' ) { - str++; - } - int value; - if (*str=='*') { //there may be an IDS table - str++; - ieVariable idsTabName; - char* tmp = idsTabName; - while (( *str != ',' ) && ( *str != ')' )) { - *tmp = *str; - tmp++; - str++; - } - *tmp = 0; - if (idsTabName[0]) { - value = GetIdsValue(src, idsTabName); - } - else { - value = strtol( src, (char **) &src, 0); - } - } - else { //no IDS table - value = strtol( src, (char **) &src, 0); - } - if (!intCount) { - newTrigger->int0Parameter = value; - } else if (intCount == 1) { - newTrigger->int1Parameter = value; - } else { - newTrigger->int2Parameter = value; - } - intCount++; - } - break; - - case 'o': //Object - ParseObject(str, src, newTrigger->objectParameter); - break; - - case 's': //String - { - SKIP_ARGUMENT(); - src++; - int i; - char* dst; - if (!stringsCount) { - dst = newTrigger->string0Parameter; - } else { - dst = newTrigger->string1Parameter; - } - //skipping the context part, which - //is to be readed later - if (mergestrings) { - for (i=0;i<6;i++) { - *dst++='*'; - } - } - else { - i=0; - } - while (*src != '"') { - if (*src == 0) { - delete newTrigger; - return NULL; - } - - //sizeof(context+name) = 40 - if (i<40) { - *dst++ = (char) tolower(*src); - i++; - } - src++; - } - *dst = 0; - //reading the context part - if (mergestrings) { - str++; - if (*str!='s') { - print("Invalid mergestrings:%s\n",str); - //abort(); - delete newTrigger; - return NULL; - } - SKIP_ARGUMENT(); - if (!stringsCount) { - dst = newTrigger->string0Parameter; - } else { - dst = newTrigger->string1Parameter; - } - - //this works only if there are no spaces - if (*src++!='"' || *src++!=',' || *src++!='"') { - break; - } - //reading the context string - i=0; - while (*src != '"') { - if (*src == 0) { - delete newTrigger; - return NULL; - } - - if (i++<6) { - *dst++ = (char) tolower(*src); - } - src++; - } - } - src++; //skipping " - stringsCount++; - } - break; - } - str++; - if (*src == ',' || *src==')') - src++; - } - return newTrigger; -} - -void SetVariable(Scriptable* Sender, const char* VarName, const char* Context, ieDword value) -{ - char newVarName[8+33]; - - if (InDebug&ID_VARIABLES) { - print( "Setting variable(\"%s%s\", %d)\n", Context, - VarName, value ); - } - - strncpy( newVarName, Context, 6 ); - newVarName[6]=0; - if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { - Sender->GetCurrentArea()->locals->SetAt( VarName, value, NoCreate ); - return; - } - if (strnicmp( newVarName, "LOCALS", 6 ) == 0) { - Sender->locals->SetAt( VarName, value, NoCreate ); - return; - } - Game *game = core->GetGame(); - if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { - game->kaputz->SetAt( VarName, value ); - return; - } - - if (strnicmp(newVarName,"GLOBAL",6) ) { - Map *map=game->GetMap(game->FindMap(newVarName)); - if (map) { - map->locals->SetAt( VarName, value, NoCreate); - } - else if (InDebug&ID_VARIABLES) { - printMessage("GameScript", "Invalid variable %s %s in setvariable\n", YELLOW, - Context, VarName); - } - } - else { - game->locals->SetAt( VarName, ( ieDword ) value, NoCreate ); - } -} - -void SetVariable(Scriptable* Sender, const char* VarName, ieDword value) -{ - char newVarName[8]; - const char *poi; - - poi = &VarName[6]; - //some HoW triggers use a : to separate the scope from the variable name - if (*poi==':') { - poi++; - } - - if (InDebug&ID_VARIABLES) { - print( "Setting variable(\"%s\", %d)\n", VarName, value ); - } - strncpy( newVarName, VarName, 6 ); - newVarName[6]=0; - if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { - Sender->GetCurrentArea()->locals->SetAt( poi, value, NoCreate ); - return; - } - if (strnicmp( newVarName, "LOCALS", 6 ) == 0) { - Sender->locals->SetAt( poi, value, NoCreate ); - return; - } - Game *game = core->GetGame(); - if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { - game->kaputz->SetAt( poi, value, NoCreate ); - return; - } - if (strnicmp(newVarName,"GLOBAL",6) ) { - Map *map=game->GetMap(game->FindMap(newVarName)); - if (map) { - map->locals->SetAt( poi, value, NoCreate); - } - else if (InDebug&ID_VARIABLES) { - printMessage("GameScript", "Invalid variable %s in setvariable\n", YELLOW, - VarName); - } - } - else { - game->locals->SetAt( poi, ( ieDword ) value, NoCreate ); - } -} - -ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid) -{ - char newVarName[8]; - const char *poi; - ieDword value = 0; - - strncpy( newVarName, VarName, 6 ); - newVarName[6]=0; - poi = &VarName[6]; - //some HoW triggers use a : to separate the scope from the variable name - if (*poi==':') { - poi++; - } - - if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { - Sender->GetCurrentArea()->locals->Lookup( poi, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s: %d\n",VarName, value); - } - return value; - } - if (strnicmp( newVarName, "LOCALS", 6 ) == 0) { - Sender->locals->Lookup( poi, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s: %d\n",VarName, value); - } - return value; - } - Game *game = core->GetGame(); - if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { - game->kaputz->Lookup( poi, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s: %d\n",VarName, value); - } - return value; - } - if (strnicmp(newVarName,"GLOBAL",6) ) { - Map *map=game->GetMap(game->FindMap(newVarName)); - if (map) { - map->locals->Lookup( poi, value); - } else { - if (valid) { - *valid=false; - } - if (InDebug&ID_VARIABLES) { - printMessage("GameScript", "Invalid variable %s in checkvariable\n", YELLOW, - VarName); - } - } - } else { - game->locals->Lookup( poi, value ); - } - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s: %d\n",VarName, value); - } - return value; -} - -ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context, bool *valid) -{ - char newVarName[8]; - ieDword value = 0; - - strncpy(newVarName, Context, 6); - newVarName[6]=0; - if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { - Sender->GetCurrentArea()->locals->Lookup( VarName, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s%s: %d\n",Context, VarName, value); - } - return value; - } - if (strnicmp( newVarName, "LOCALS", 6 ) == 0) { - Sender->locals->Lookup( VarName, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s%s: %d\n",Context, VarName, value); - } - return value; - } - Game *game = core->GetGame(); - if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { - game->kaputz->Lookup( VarName, value ); - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s%s: %d\n",Context, VarName, value); - } - return value; - } - if (strnicmp(newVarName,"GLOBAL",6) ) { - Map *map=game->GetMap(game->FindMap(newVarName)); - if (map) { - map->locals->Lookup( VarName, value); - } else { - if (valid) { - *valid=false; - } - if (InDebug&ID_VARIABLES) { - printMessage("GameScript", "Invalid variable %s %s in checkvariable\n", YELLOW, - Context, VarName); - } - } - } else { - game->locals->Lookup( VarName, value ); - } - if (InDebug&ID_VARIABLES) { - print("CheckVariable %s%s: %d\n",Context, VarName, value); - } - return value; -} - -int DiffCore(ieDword a, ieDword b, int diffmode) -{ - switch (diffmode) { - case LESS_THAN: - if (ab) { - return 1; - } - break; - case GREATER_OR_EQUALS: - if (a>=b) { - return 1; - } - break; - case NOT_EQUALS: - if (a!=b) { - return 1; - } - break; - case BINARY_LESS_OR_EQUALS: - if ((a&b) == a) { - return 1; - } - break; - case BINARY_MORE: - if ((a&b) != a) { - return 1; - } - break; - case BINARY_MORE_OR_EQUALS: - if ((a&b) == b) { - return 1; - } - break; - case BINARY_LESS: - if ((a&b) != b) { - return 1; - } - break; - case BINARY_INTERSECT: - if (a&b) { - return 1; - } - break; - case BINARY_NOT_INTERSECT: - if (!(a&b)) { - return 1; - } - break; - default: //less or equals - if (a<=b) { - return 1; - } - break; - } - return 0; -} - -int GetGroup(Actor *actor) -{ - int type = 2; //neutral, has no enemies - if (actor->GetStat(IE_EA) <= EA_GOODCUTOFF) { - type = 1; //PC - } - if (actor->GetStat(IE_EA) >= EA_EVILCUTOFF) { - type = 0; - } - return type; -} - -Point GetEntryPoint(const char *areaname, const char *entryname) -{ - Point p; - - AutoTable tab("entries"); - if (!tab) { - return p; - } - const char *tmpstr = tab->QueryField(areaname, entryname); - int x=-1; - int y=-1; - sscanf(tmpstr, "%d.%d", &x, &y); - p.x=(short) x; - p.y=(short) y; - return p; -} - -/* returns a spell's casting distance, it depends on the caster (level), and targeting mode too - the used header is calculated from the caster level */ -unsigned int GetSpellDistance(const ieResRef spellres, Scriptable *Sender) -{ - unsigned int dist; - - Spell* spl = gamedata->GetSpell( spellres ); - if (!spl) { - printMessage("GameScript", "Spell couldn't be found:%.8s.\n", LIGHT_RED, spellres); - return 0; - } - dist = spl->GetCastingDistance(Sender); - //make possible special return values (like 0xffffffff means the spell doesn't need distance) - //this is used with special targeting mode (3) - if (dist>0xff000000) { - return dist; - } - - gamedata->FreeSpell(spl, spellres, false); - return dist*5; //FIXME: this empirical constant shouldn't be needed! -} - -/* returns an item's casting distance, it depends on the used header, and targeting mode too - the used header is explictly given */ -unsigned int GetItemDistance(const ieResRef itemres, int header) -{ - unsigned int dist; - - Item* itm = gamedata->GetItem( itemres ); - if (!itm) { - printMessage("GameScript", "Item couldn't be found:%.8s.\n", LIGHT_RED, itemres); - return 0; - } - dist=itm->GetCastingDistance(header); - //make possible special return values (like 0xffffffff means the item doesn't need distance) - //this is used with special targeting mode (3) - if (dist>0xff000000) { - return dist; - } - - gamedata->FreeItem(itm, itemres, false); - return dist*15; -} - -//read the wish 2da -void SetupWishCore(Scriptable *Sender, int column, int picks) -{ - int count; - ieVariable varname; - int *selects; - int i,j; - - //FIXME: find out what the original really used the picks parameter for - if (picks == 1) picks = 5; - - AutoTable tm("wish"); - if (!tm) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find wish.2da.\n"); - return; - } - - selects = (int *) malloc(picks*sizeof(int)); - count = tm->GetRowCount(); - - for(i=0;i<99;i++) { - snprintf(varname,32, "wishpower%02d", i); - if(CheckVariable(Sender, varname, "GLOBAL") ) { - SetVariable(Sender, varname, "GLOBAL", 0); - } - } - - if (countQueryField( selects[i], column-1 ) ); - snprintf(varname,32,"wishpower%02d", spnum); - SetVariable(Sender, varname, "GLOBAL",1); - } - free(selects); -} - -#define MAX_ISLAND_POLYGONS 10 - -//read a polygon 2da -Gem_Polygon *GetPolygon2DA(ieDword index) -{ - ieResRef resref; - - if (index>=MAX_ISLAND_POLYGONS) { - return NULL; - } - - if (!polygons) { - polygons = (Gem_Polygon **) calloc(MAX_ISLAND_POLYGONS, sizeof(Gem_Polygon *) ); - } - if (polygons[index]) { - return polygons[index]; - } - snprintf(resref, sizeof(ieResRef), "ISLAND%02d", index); - AutoTable tm(resref); - if (!tm) { - return NULL; - } - int cnt = tm->GetRowCount(); - if (!cnt) { - return NULL; - } - Point *p = new Point[cnt]; - - int i = cnt; - while(i--) { - p[i].x = atoi(tm->QueryField(i, 0)); - p[i].y = atoi(tm->QueryField(i, 1)); - } - - polygons[index] = new Gem_Polygon(p, cnt, NULL); - delete [] p; - return polygons[index]; -} - diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h deleted file mode 100644 index 1bcffd738..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h +++ /dev/null @@ -1,140 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ -#ifndef GSUTILS_H -#define GSUTILS_H - -#include "GameScript/GameScript.h" - -#include "defsounds.h" -#include "exports.h" -#include "strrefs.h" - -#include "Interface.h" - -//indebug flags -#define ID_REFERENCE 1 -#define ID_CUTSCENE 2 -#define ID_VARIABLES 4 -#define ID_ACTIONS 8 -#define ID_TRIGGERS 16 - -extern Holder triggersTable; -extern Holder actionsTable; -extern Holder overrideActionsTable; -extern Holder objectsTable; -extern TriggerFunction triggers[MAX_TRIGGERS]; -extern ActionFunction actions[MAX_ACTIONS]; -extern short actionflags[MAX_ACTIONS]; -extern short triggerflags[MAX_TRIGGERS]; -extern ObjectFunction objects[MAX_OBJECTS]; -extern IDSFunction idtargets[MAX_OBJECT_FIELDS]; -extern Cache SrcCache; //cache for string resources (pst) -extern Cache BcsCache; //cache for scripts -extern int ObjectIDSCount; -extern int MaxObjectNesting; -extern bool HasAdditionalRect; -extern bool HasTriggerPoint; -extern bool NoCreate; -extern bool HasKaputz; -extern ieResRef *ObjectIDSTableNames; -extern int ObjectFieldsCount; -extern int ExtraParametersCount; -extern int InDebug; -extern Gem_Polygon **polygons; - -#define MIC_INVALID -2 -#define MIC_FULL -1 -#define MIC_NOITEM 0 -#define MIC_GOTITEM 1 - -GEM_EXPORT int GetReaction(Actor *target, Scriptable *Sender); -int GetHappiness(Scriptable *Sender, int reputation); -int GetHPPercent(Scriptable *Sender); -bool StoreHasItemCore(const ieResRef storename, const ieResRef itemname); -bool HasItemCore(Inventory *inventory, const ieResRef itemname, ieDword flags); -void ClickCore(Scriptable *Sender, Point point, int type, int speed); -void TransformItemCore(Actor *actor, Action *parameters, bool onlyone); -void CreateVisualEffectCore(Actor *target, const char *effect, int iterations); -void CreateVisualEffectCore(Scriptable *Sender, const Point &position, const char *effect, int iterations); -void GetPositionFromScriptable(Scriptable* scr, Point &position, bool trap); -void BeginDialog(Scriptable* Sender, Action* parameters, int flags); -void ChangeAnimationCore(Actor *src, const char *resref, bool effect); -void PolymorphCopyCore(Actor *src, Actor *tar, bool base); -void CreateCreatureCore(Scriptable* Sender, Action* parameters, int flags); -int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags, int setflag); -void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, bool untilsee); -bool CreateItemCore(CREItem *item, const char *resref, int a, int b, int c); -void AttackCore(Scriptable *Sender, Scriptable *target, int flags); -void InitScriptTables(); -void HandleBitMod(ieDword &value1, ieDword value2, int opcode); -bool ResolveSpellName(ieResRef spellres, Action *parameter); -GEM_EXPORT void ResolveSpellName(ieResRef spellres, ieDword number); -GEM_EXPORT ieDword ResolveSpellNumber(const ieResRef spellres); -bool ResolveItemName(ieResRef itemres, Actor *act, ieDword Slot); -void EscapeAreaCore(Scriptable *Sender, const Point &p, const char *area, const Point &enter, int flags, int wait); -void GoNear(Scriptable *Sender, const Point &p); -void MoveNearerTo(Scriptable *Sender, Scriptable *target, int distance); -int MoveNearerTo(Scriptable *Sender, const Point &p, int distance, int no_release); - -#define NO_OPERATION -1 -#define LESS_OR_EQUALS 0 -//iwd2 diffmode with gemrb enhancements -#define EQUALS 1 -#define LESS_THAN 2 -#define GREATER_THAN 3 -#define GREATER_OR_EQUALS 4 -#define NOT_EQUALS 5 -#define BINARY_LESS_OR_EQUALS 6 //(left has only bits in right) -#define BINARY_MORE_OR_EQUALS 7 //(left has equal or more bits than right) -#define BINARY_INTERSECT 8 //(left and right has at least one common bit) -#define BINARY_NOT_INTERSECT 9 //(no common bits) -#define BINARY_MORE 10 //left has more bits than right -#define BINARY_LESS 11 //left has less bits than right - -GEM_EXPORT int GetGroup(Actor *actor); - -GEM_EXPORT void FreeSrc(SrcVector *poi, const ieResRef key); -GEM_EXPORT SrcVector *LoadSrc(const ieResRef resname); -Action *ParamCopy(Action *parameters); -Action *ParamCopyNoOverride(Action *parameters); -void SetVariable(Scriptable* Sender, const char* VarName, ieDword value); -Point GetEntryPoint(const char *areaname, const char *entryname); -//these are used from other plugins -GEM_EXPORT int CanSee(Scriptable* Sender, Scriptable* target, bool range, int nodead); -GEM_EXPORT int SeeCore(Scriptable* Sender, Trigger* parameters, int justlos); -GEM_EXPORT int DiffCore(ieDword a, ieDword b, int diffmode); -GEM_EXPORT void DisplayStringCore(Scriptable* Sender, int Strref, int flags); -GEM_EXPORT void SetVariable(Scriptable* Sender, const char* VarName, const char* Context, ieDword value); -GEM_EXPORT void MoveBetweenAreasCore(Actor* actor, const char *area, const Point &position, int face, bool adjust); -GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid = NULL); -GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context, bool *valid = NULL); -Action* GenerateActionCore(const char *src, const char *str, unsigned short actionID); -Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int negate); -unsigned int GetSpellDistance(const ieResRef spellres, Scriptable *Sender); -unsigned int GetItemDistance(const ieResRef itemres, int header); -void SetupWishCore(Scriptable *Sender, int column, int picks); -Gem_Polygon *GetPolygon2DA(ieDword index); - -inline int Bones(ieDword value) -{ - return core->Roll((value&0xf000)>>12, (value&0xff0)>>8, value&15); -} - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp deleted file mode 100644 index 55ea267fc..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp +++ /dev/null @@ -1,2357 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/GameScript.h" - -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" - -#include "win32def.h" - -#include "Game.h" -#include "GameData.h" -#include "Interface.h" -#include "PluginMgr.h" -#include "TableMgr.h" - -//debug flags -// 1 - cache -// 2 - cutscene ID -// 4 - globals -// 8 - action execution -//16 - trigger evaluation - -//Make this an ordered list, so we could use bsearch! -static const TriggerLink triggernames[] = { - {"actionlistempty", GameScript::ActionListEmpty, 0}, - {"actuallyincombat", GameScript::ActuallyInCombat, 0}, - {"acquired", GameScript::Acquired, 0}, - {"alignment", GameScript::Alignment, 0}, - {"allegiance", GameScript::Allegiance, 0}, - {"animstate", GameScript::AnimState, 0}, - {"anypconmap", GameScript::AnyPCOnMap, 0}, - {"anypcseesenemy", GameScript::AnyPCSeesEnemy, 0}, - {"areacheck", GameScript::AreaCheck, 0}, - {"areacheckobject", GameScript::AreaCheckObject, 0}, - {"areaflag", GameScript::AreaFlag, 0}, - {"arearestdisabled", GameScript::AreaRestDisabled, 0}, - {"areatype", GameScript::AreaType, 0}, - {"atlocation", GameScript::AtLocation, 0}, - {"assaltedby", GameScript::AttackedBy, 0},//pst - {"attackedby", GameScript::AttackedBy, 0}, - {"becamevisible", GameScript::BecameVisible, 0}, - {"bitcheck", GameScript::BitCheck,TF_MERGESTRINGS}, - {"bitcheckexact", GameScript::BitCheckExact,TF_MERGESTRINGS}, - {"bitglobal", GameScript::BitGlobal_Trigger,TF_MERGESTRINGS}, - {"breakingpoint", GameScript::BreakingPoint, 0}, - {"calanderday", GameScript::CalendarDay, 0}, //illiterate developers O_o - {"calendarday", GameScript::CalendarDay, 0}, - {"calanderdaygt", GameScript::CalendarDayGT, 0}, - {"calendardaygt", GameScript::CalendarDayGT, 0}, - {"calanderdaylt", GameScript::CalendarDayLT, 0}, - {"calendardaylt", GameScript::CalendarDayLT, 0}, - {"calledbyname", GameScript::CalledByName, 0}, //this is still a question - {"chargecount", GameScript::ChargeCount, 0}, - {"charname", GameScript::CharName, 0}, //not scripting name - {"checkareadifflevel", GameScript::DifficultyLT, 0},//iwd2 guess - {"checkdoorflags", GameScript::CheckDoorFlags, 0}, - {"checkpartyaveragelevel", GameScript::CheckPartyAverageLevel, 0}, - {"checkpartylevel", GameScript::CheckPartyLevel, 0}, - {"checkskill", GameScript::CheckSkill, 0}, - {"checkskillgt", GameScript::CheckSkillGT, 0}, - {"checkskilllt", GameScript::CheckSkillLT, 0}, - {"checkspellstate", GameScript::CheckSpellState, 0}, - {"checkstat", GameScript::CheckStat, 0}, - {"checkstatgt", GameScript::CheckStatGT, 0}, - {"checkstatlt", GameScript::CheckStatLT, 0}, - {"class", GameScript::Class, 0}, - {"classex", GameScript::ClassEx, 0}, //will return true for multis - {"classlevel", GameScript::ClassLevel, 0}, //pst - {"classlevelgt", GameScript::ClassLevelGT, 0}, - {"classlevellt", GameScript::ClassLevelLT, 0}, - {"clicked", GameScript::Clicked, 0}, - {"closed", GameScript::Closed, 0}, - {"combatcounter", GameScript::CombatCounter, 0}, - {"combatcountergt", GameScript::CombatCounterGT, 0}, - {"combatcounterlt", GameScript::CombatCounterLT, 0}, - {"contains", GameScript::Contains, 0}, - {"currentareais", GameScript::CurrentAreaIs, 0},//checks object - {"creaturehidden", GameScript::CreatureHidden, 0},//this is the engine level hiding feature, not the skill - {"creatureinarea", GameScript::AreaCheck, 0}, //pst, checks this object - {"damagetaken", GameScript::HPLost, 0}, - {"damagetakengt", GameScript::HPLostGT, 0}, - {"damagetakenlt", GameScript::HPLostLT, 0}, - {"dead", GameScript::Dead, 0}, - {"delay", GameScript::Delay, 0}, - {"detect", GameScript::Detect, 0}, //so far i see no difference - {"die", GameScript::Die, 0}, - {"died", GameScript::Died, 0}, - {"difficulty", GameScript::Difficulty, 0}, - {"difficultygt", GameScript::DifficultyGT, 0}, - {"difficultylt", GameScript::DifficultyLT, 0}, - {"disarmed", GameScript::Disarmed, 0}, - {"disarmfailed", GameScript::DisarmFailed, 0}, - {"entered", GameScript::Entered, 0}, - {"entirepartyonmap", GameScript::EntirePartyOnMap, 0}, - {"exists", GameScript::Exists, 0}, - {"extendedstatecheck", GameScript::ExtendedStateCheck, 0}, - {"extraproficiency", GameScript::ExtraProficiency, 0}, - {"extraproficiencygt", GameScript::ExtraProficiencyGT, 0}, - {"extraproficiencylt", GameScript::ExtraProficiencyLT, 0}, - {"faction", GameScript::Faction, 0}, - {"failedtoopen", GameScript::OpenFailed, 0}, - {"fallenpaladin", GameScript::FallenPaladin, 0}, - {"fallenranger", GameScript::FallenRanger, 0}, - {"false", GameScript::False, 0}, - {"forcemarkedspell", GameScript::ForceMarkedSpell_Trigger, 0}, - {"frame", GameScript::Frame, 0}, - {"g", GameScript::G_Trigger, 0}, - {"gender", GameScript::Gender, 0}, - {"general", GameScript::General, 0}, - {"ggt", GameScript::GGT_Trigger, 0}, - {"glt", GameScript::GLT_Trigger, 0}, - {"global", GameScript::Global,TF_MERGESTRINGS}, - {"globalandglobal", GameScript::GlobalAndGlobal_Trigger,TF_MERGESTRINGS}, - {"globalband", GameScript::BitCheck,TF_MERGESTRINGS}, - {"globalbandglobal", GameScript::GlobalBAndGlobal_Trigger,TF_MERGESTRINGS}, - {"globalbandglobalexact", GameScript::GlobalBAndGlobalExact,TF_MERGESTRINGS}, - {"globalbitglobal", GameScript::GlobalBitGlobal_Trigger,TF_MERGESTRINGS}, - {"globalequalsglobal", GameScript::GlobalsEqual,TF_MERGESTRINGS}, //this is the same - {"globalgt", GameScript::GlobalGT,TF_MERGESTRINGS}, - {"globalgtglobal", GameScript::GlobalGTGlobal,TF_MERGESTRINGS}, - {"globallt", GameScript::GlobalLT,TF_MERGESTRINGS}, - {"globalltglobal", GameScript::GlobalLTGlobal,TF_MERGESTRINGS}, - {"globalorglobal", GameScript::GlobalOrGlobal_Trigger,TF_MERGESTRINGS}, - {"globalsequal", GameScript::GlobalsEqual, 0}, - {"globalsgt", GameScript::GlobalsGT, 0}, - {"globalslt", GameScript::GlobalsLT, 0}, - {"globaltimerexact", GameScript::GlobalTimerExact, 0}, - {"globaltimerexpired", GameScript::GlobalTimerExpired, 0}, - {"globaltimernotexpired", GameScript::GlobalTimerNotExpired, 0}, - {"globaltimerstarted", GameScript::GlobalTimerStarted, 0}, - {"happiness", GameScript::Happiness, 0}, - {"happinessgt", GameScript::HappinessGT, 0}, - {"happinesslt", GameScript::HappinessLT, 0}, - {"harmlessclosed", GameScript::Closed, 0}, //pst, not sure - {"harmlessentered", GameScript::HarmlessEntered, 0}, //??? - {"harmlessopened", GameScript::Opened, 0}, //pst, not sure - {"hasbounceeffects", GameScript::HasBounceEffects, 0}, - {"hasimmunityeffects", GameScript::HasImmunityEffects, 0}, - {"hasinnateability", GameScript::HaveSpell, 0}, //these must be the same - {"hasitem", GameScript::HasItem, 0}, - {"hasitemequiped", GameScript::HasItemEquipped, 0}, //typo in bg2 - {"hasitemequipedreal", GameScript::HasItemEquipped, 0}, //not sure - {"hasitemequipped", GameScript::HasItemEquipped, 0}, - {"hasitemequippedreal", GameScript::HasItemEquipped, 0}, //not sure - {"hasiteminslot", GameScript::HasItemSlot, 0}, - {"hasitemslot", GameScript::HasItemSlot, 0}, - {"hasitemtypeslot", GameScript::HasItemTypeSlot, 0},//gemrb extension - {"hasweaponequiped", GameScript::HasWeaponEquipped, 0},//a typo again - {"hasweaponequipped", GameScript::HasWeaponEquipped, 0}, - {"haveanyspells", GameScript::HaveAnySpells, 0}, - {"havespell", GameScript::HaveSpell, 0}, //these must be the same - {"havespellparty", GameScript::HaveSpellParty, 0}, - {"havespellres", GameScript::HaveSpell, 0}, //they share the same ID - {"haveusableweaponequipped", GameScript::HaveUsableWeaponEquipped, 0}, - {"heard", GameScript::Heard, 0}, - {"help", GameScript::Help_Trigger, 0}, - {"helpex", GameScript::HelpEX, 0}, - {"hitby", GameScript::HitBy, 0}, - {"hotkey", GameScript::HotKey, 0}, - {"hp", GameScript::HP, 0}, - {"hpgt", GameScript::HPGT, 0}, - {"hplost", GameScript::HPLost, 0}, - {"hplostgt", GameScript::HPLostGT, 0}, - {"hplostlt", GameScript::HPLostLT, 0}, - {"hplt", GameScript::HPLT, 0}, - {"hppercent", GameScript::HPPercent, 0}, - {"hppercentgt", GameScript::HPPercentGT, 0}, - {"hppercentlt", GameScript::HPPercentLT, 0}, - {"inactivearea", GameScript::InActiveArea, 0}, - {"incutscenemode", GameScript::InCutSceneMode, 0}, - {"inline", GameScript::InLine, 0}, - {"inmyarea", GameScript::InMyArea, 0}, - {"inmygroup", GameScript::InMyGroup, 0}, - {"inparty", GameScript::InParty, 0}, - {"inpartyallowdead", GameScript::InPartyAllowDead, 0}, - {"inpartyslot", GameScript::InPartySlot, 0}, - {"internal", GameScript::Internal, 0}, - {"internalgt", GameScript::InternalGT, 0}, - {"internallt", GameScript::InternalLT, 0}, - {"interactingwith", GameScript::InteractingWith, 0}, - {"intrap", GameScript::InTrap, 0}, - {"inventoryfull", GameScript::InventoryFull, 0}, - {"inview", GameScript::LOS, 0}, //it seems the same, needs research - {"inwatcherskeep", GameScript::AreaStartsWith, 0}, - {"inweaponrange", GameScript::InWeaponRange, 0}, - {"isaclown", GameScript::IsAClown, 0}, - {"isactive", GameScript::IsActive, 0}, - {"isanimationid", GameScript::AnimationID, 0}, - {"iscreatureareaflag", GameScript::IsCreatureAreaFlag, 0}, - {"iscreaturehiddeninshadows", GameScript::IsCreatureHiddenInShadows, 0}, - {"isfacingobject", GameScript::IsFacingObject, 0}, - {"isfacingsavedrotation", GameScript::IsFacingSavedRotation, 0}, - {"isgabber", GameScript::IsGabber, 0}, - {"isheartoffurymodeon", GameScript::NightmareModeOn, 0}, - {"islocked", GameScript::IsLocked, 0}, - {"isextendednight", GameScript::IsExtendedNight, 0}, - {"ismarkedspell", GameScript::IsMarkedSpell, 0}, - {"isoverme", GameScript::IsOverMe, 0}, - {"ispathcriticalobject", GameScript::IsPathCriticalObject, 0}, - {"isplayernumber", GameScript::IsPlayerNumber, 0}, - {"isrotation", GameScript::IsRotation, 0}, - {"isscriptname", GameScript::CalledByName, 0}, //seems the same - {"isspelltargetvalid", GameScript::IsSpellTargetValid, 0}, - {"isteambiton", GameScript::IsTeamBitOn, 0}, - {"isvalidforpartydialog", GameScript::IsValidForPartyDialog, 0}, - {"isvalidforpartydialogue", GameScript::IsValidForPartyDialog, 0}, - {"isweaponranged", GameScript::IsWeaponRanged, 0}, - {"isweather", GameScript::IsWeather, 0}, //gemrb extension - {"itemisidentified", GameScript::ItemIsIdentified, 0}, - {"joins", GameScript::Joins, 0}, - {"killed", GameScript::Killed, 0}, - {"kit", GameScript::Kit, 0}, - {"knowspell", GameScript::KnowSpell, 0}, //gemrb specific - {"lastmarkedobject", GameScript::LastMarkedObject_Trigger, 0}, - {"lastpersontalkedto", GameScript::LastPersonTalkedTo, 0}, //pst - {"leaves", GameScript::Leaves, 0}, - {"level", GameScript::Level, 0}, - {"levelgt", GameScript::LevelGT, 0}, - {"levelinclass", GameScript::LevelInClass, 0}, //iwd2 - {"levelinclassgt", GameScript::LevelInClassGT, 0}, - {"levelinclasslt", GameScript::LevelInClassLT, 0}, - {"levellt", GameScript::LevelLT, 0}, - {"levelparty", GameScript::LevelParty, 0}, - {"levelpartygt", GameScript::LevelPartyGT, 0}, - {"levelpartylt", GameScript::LevelPartyLT, 0}, - {"localsequal", GameScript::LocalsEqual, 0}, - {"localsgt", GameScript::LocalsGT, 0}, - {"localslt", GameScript::LocalsLT, 0}, - {"los", GameScript::LOS, 0}, - {"modalstate", GameScript::ModalState, 0}, - {"morale", GameScript::Morale, 0}, - {"moralegt", GameScript::MoraleGT, 0}, - {"moralelt", GameScript::MoraleLT, 0}, - {"name", GameScript::CalledByName, 0}, //this is the same too? - {"namelessbitthedust", GameScript::NamelessBitTheDust, 0}, - {"nearbydialog", GameScript::NearbyDialog, 0}, - {"nearbydialogue", GameScript::NearbyDialog, 0}, - {"nearlocation", GameScript::NearLocation, 0}, - {"nearsavedlocation", GameScript::NearSavedLocation, 0}, - {"nightmaremodeon", GameScript::NightmareModeOn, 0}, - {"notstatecheck", GameScript::NotStateCheck, 0}, - {"nulldialog", GameScript::NullDialog, 0}, - {"nulldialogue", GameScript::NullDialog, 0}, - {"numcreature", GameScript::NumCreatures, 0}, - {"numcreaturegt", GameScript::NumCreaturesGT, 0}, - {"numcreaturelt", GameScript::NumCreaturesLT, 0}, - {"numcreaturesatmylevel", GameScript::NumCreaturesAtMyLevel, 0}, - {"numcreaturesgtmylevel", GameScript::NumCreaturesGTMyLevel, 0}, - {"numcreaturesltmylevel", GameScript::NumCreaturesLTMyLevel, 0}, - {"numcreaturevsparty", GameScript::NumCreatureVsParty, 0}, - {"numcreaturevspartygt", GameScript::NumCreatureVsPartyGT, 0}, - {"numcreaturevspartylt", GameScript::NumCreatureVsPartyLT, 0}, - {"numdead", GameScript::NumDead, 0}, - {"numdeadgt", GameScript::NumDeadGT, 0}, - {"numdeadlt", GameScript::NumDeadLT, 0}, - {"numinparty", GameScript::PartyCountEQ, 0}, - {"numinpartyalive", GameScript::PartyCountAliveEQ, 0}, - {"numinpartyalivegt", GameScript::PartyCountAliveGT, 0}, - {"numinpartyalivelt", GameScript::PartyCountAliveLT, 0}, - {"numinpartygt", GameScript::PartyCountGT, 0}, - {"numinpartylt", GameScript::PartyCountLT, 0}, - {"numitems", GameScript::NumItems, 0}, - {"numitemsgt", GameScript::NumItemsGT, 0}, - {"numitemslt", GameScript::NumItemsLT, 0}, - {"numitemsparty", GameScript::NumItemsParty, 0}, - {"numitemspartygt", GameScript::NumItemsPartyGT, 0}, - {"numitemspartylt", GameScript::NumItemsPartyLT, 0}, - {"numtimesinteracted", GameScript::NumTimesInteracted, 0}, - {"numtimesinteractedgt", GameScript::NumTimesInteractedGT, 0}, - {"numtimesinteractedlt", GameScript::NumTimesInteractedLT, 0}, - {"numtimesinteractedobject", GameScript::NumTimesInteractedObject, 0},//gemrb - {"numtimesinteractedobjectgt", GameScript::NumTimesInteractedObjectGT, 0},//gemrb - {"numtimesinteractedobjectlt", GameScript::NumTimesInteractedObjectLT, 0},//gemrb - {"numtimestalkedto", GameScript::NumTimesTalkedTo, 0}, - {"numtimestalkedtogt", GameScript::NumTimesTalkedToGT, 0}, - {"numtimestalkedtolt", GameScript::NumTimesTalkedToLT, 0}, - {"objectactionlistempty", GameScript::ObjectActionListEmpty, 0}, //same function - {"objitemcounteq", GameScript::NumItems, 0}, - {"objitemcountgt", GameScript::NumItemsGT, 0}, - {"objitemcountlt", GameScript::NumItemsLT, 0}, - {"oncreation", GameScript::OnCreation, 0}, - {"onisland", GameScript::OnIsland, 0}, - {"onscreen", GameScript::OnScreen, 0}, - {"opened", GameScript::Opened, 0}, - {"openfailed", GameScript::OpenFailed, 0}, - {"openstate", GameScript::OpenState, 0}, - {"or", GameScript::Or, 0}, - {"outofammo", GameScript::OutOfAmmo, 0}, - {"ownsfloatermessage", GameScript::OwnsFloaterMessage, 0}, - {"partycounteq", GameScript::PartyCountEQ, 0}, - {"partycountgt", GameScript::PartyCountGT, 0}, - {"partycountlt", GameScript::PartyCountLT, 0}, - {"partygold", GameScript::PartyGold, 0}, - {"partygoldgt", GameScript::PartyGoldGT, 0}, - {"partygoldlt", GameScript::PartyGoldLT, 0}, - {"partyhasitem", GameScript::PartyHasItem, 0}, - {"partyhasitemidentified", GameScript::PartyHasItemIdentified, 0}, - {"partyitemcounteq", GameScript::NumItemsParty, 0}, - {"partyitemcountgt", GameScript::NumItemsPartyGT, 0}, - {"partyitemcountlt", GameScript::NumItemsPartyLT, 0}, - {"partymemberdied", GameScript::PartyMemberDied, 0}, - {"partyrested", GameScript::PartyRested, 0}, - {"pccanseepoint", GameScript::PCCanSeePoint, 0}, - {"pcinstore", GameScript::PCInStore, 0}, - {"personalspacedistance", GameScript::PersonalSpaceDistance, 0}, - {"picklockfailed", GameScript::PickLockFailed, 0}, - {"pickpocketfailed", GameScript::PickpocketFailed, 0}, - {"proficiency", GameScript::Proficiency, 0}, - {"proficiencygt", GameScript::ProficiencyGT, 0}, - {"proficiencylt", GameScript::ProficiencyLT, 0}, - {"race", GameScript::Race, 0}, - {"randomnum", GameScript::RandomNum, 0}, - {"randomnumgt", GameScript::RandomNumGT, 0}, - {"randomnumlt", GameScript::RandomNumLT, 0}, - {"randomstatcheck", GameScript::RandomStatCheck, 0}, - {"range", GameScript::Range, 0}, - {"reaction", GameScript::Reaction, 0}, - {"reactiongt", GameScript::ReactionGT, 0}, - {"reactionlt", GameScript::ReactionLT, 0}, - {"realglobaltimerexact", GameScript::RealGlobalTimerExact, 0}, - {"realglobaltimerexpired", GameScript::RealGlobalTimerExpired, 0}, - {"realglobaltimernotexpired", GameScript::RealGlobalTimerNotExpired, 0}, - {"receivedorder", GameScript::ReceivedOrder, 0}, - {"reputation", GameScript::Reputation, 0}, - {"reputationgt", GameScript::ReputationGT, 0}, - {"reputationlt", GameScript::ReputationLT, 0}, - {"school", GameScript::School, 0}, //similar to kit - {"see", GameScript::See, 0}, - {"sequence", GameScript::Sequence, 0}, - {"setlastmarkedobject", GameScript::SetLastMarkedObject, 0}, - {"setmarkedspell", GameScript::SetMarkedSpell_Trigger, 0}, - {"specifics", GameScript::Specifics, 0}, - {"spellcast", GameScript::SpellCast, 0}, - {"spellcastinnate", GameScript::SpellCastInnate, 0}, - {"spellcastonme", GameScript::SpellCastOnMe, 0}, - {"spellcastpriest", GameScript::SpellCastPriest, 0}, - {"statecheck", GameScript::StateCheck, 0}, - {"stealfailed", GameScript::StealFailed, 0}, - {"storehasitem", GameScript::StoreHasItem, 0}, - {"stuffglobalrandom", GameScript::StuffGlobalRandom, 0},//hm, this is a trigger - {"subrace", GameScript::SubRace, 0}, - {"systemvariable", GameScript::SystemVariable_Trigger, 0}, //gemrb - {"targetunreachable", GameScript::TargetUnreachable, 0}, - {"team", GameScript::Team, 0}, - {"time", GameScript::Time, 0}, - {"timegt", GameScript::TimeGT, 0}, - {"timelt", GameScript::TimeLT, 0}, - {"timeofday", GameScript::TimeOfDay, 0}, - {"timeractive", GameScript::TimerActive, 0}, - {"timerexpired", GameScript::TimerExpired, 0}, - {"tookdamage", GameScript::TookDamage, 0}, - {"totalitemcnt", GameScript::TotalItemCnt, 0}, //iwd2 - {"totalitemcntexclude", GameScript::TotalItemCntExclude, 0}, //iwd2 - {"totalitemcntexcludegt", GameScript::TotalItemCntExcludeGT, 0}, //iwd2 - {"totalitemcntexcludelt", GameScript::TotalItemCntExcludeLT, 0}, //iwd2 - {"totalitemcntgt", GameScript::TotalItemCntGT, 0}, //iwd2 - {"totalitemcntlt", GameScript::TotalItemCntLT, 0}, //iwd2 - {"traptriggered", GameScript::TrapTriggered, 0}, - {"trigger", GameScript::TriggerTrigger, 0}, - {"triggerclick", GameScript::Clicked, 0}, //not sure - {"triggersetglobal", GameScript::TriggerSetGlobal,0}, //iwd2, but never used - {"true", GameScript::True, 0}, - {"turnedby", GameScript::TurnedBy, 0}, - {"unlocked", GameScript::Unlocked, 0}, - {"unselectablevariable", GameScript::UnselectableVariable, 0}, - {"unselectablevariablegt", GameScript::UnselectableVariableGT, 0}, - {"unselectablevariablelt", GameScript::UnselectableVariableLT, 0}, - {"unusable",GameScript::Unusable, 0}, - {"vacant",GameScript::Vacant, 0}, - {"walkedtotrigger", GameScript::WalkedToTrigger, 0}, - {"wasindialog", GameScript::WasInDialog, 0}, - {"xor", GameScript::Xor,TF_MERGESTRINGS}, - {"xp", GameScript::XP, 0}, - {"xpgt", GameScript::XPGT, 0}, - {"xplt", GameScript::XPLT, 0}, - { NULL,NULL,0} -}; - -//Make this an ordered list, so we could use bsearch! -static const ActionLink actionnames[] = { - {"actionoverride",NULL, AF_INVALID}, //will this function ever be reached - {"activate", GameScript::Activate, 0}, - {"activateportalcursor", GameScript::ActivatePortalCursor, 0}, - {"addareaflag", GameScript::AddAreaFlag, 0}, - {"addareatype", GameScript::AddAreaType, 0}, - {"addexperienceparty", GameScript::AddExperienceParty, 0}, - {"addexperiencepartycr", GameScript::AddExperiencePartyCR, 0}, - {"addexperiencepartyglobal", GameScript::AddExperiencePartyGlobal, 0}, - {"addfeat", GameScript::AddFeat, 0}, - {"addglobals", GameScript::AddGlobals, 0}, - {"addhp", GameScript::AddHP, 0}, - {"addjournalentry", GameScript::AddJournalEntry, 0}, - {"addkit", GameScript::AddKit, 0}, - {"addmapnote", GameScript::AddMapnote, 0}, - {"addpartyexperience", GameScript::AddExperienceParty, 0}, - {"addspecialability", GameScript::AddSpecialAbility, 0}, - {"addsuperkit", GameScript::AddSuperKit, 0}, - {"addwaypoint", GameScript::AddWayPoint,AF_BLOCKING}, - {"addxp2da", GameScript::AddXP2DA, 0}, - {"addxpobject", GameScript::AddXPObject, 0}, - {"addxpvar", GameScript::AddXP2DA, 0}, - {"advancetime", GameScript::AdvanceTime, 0}, - {"allowarearesting", GameScript::SetAreaRestFlag, 0},//iwd2 - {"ally", GameScript::Ally, 0}, - {"ambientactivate", GameScript::AmbientActivate, 0}, - {"ankhegemerge", GameScript::AnkhegEmerge, AF_ALIVE}, - {"ankheghide", GameScript::AnkhegHide, AF_ALIVE}, - {"applydamage", GameScript::ApplyDamage, 0}, - {"applydamagepercent", GameScript::ApplyDamagePercent, 0}, - {"applyspell", GameScript::ApplySpell, 0}, - {"applyspellpoint", GameScript::ApplySpellPoint, 0}, //gemrb extension - {"attachtransitiontodoor", GameScript::AttachTransitionToDoor, 0}, - {"attack", GameScript::Attack,AF_BLOCKING|AF_ALIVE}, - {"attacknosound", GameScript::AttackNoSound,AF_BLOCKING|AF_ALIVE}, //no sound yet anyway - {"attackoneround", GameScript::AttackOneRound,AF_BLOCKING|AF_ALIVE}, - {"attackreevaluate", GameScript::AttackReevaluate,AF_BLOCKING|AF_ALIVE}, - {"backstab", GameScript::Attack,AF_BLOCKING|AF_ALIVE},//actually hide+attack - {"banterblockflag", GameScript::BanterBlockFlag,0}, - {"banterblocktime", GameScript::BanterBlockTime,0}, - {"bashdoor", GameScript::BashDoor,AF_BLOCKING|AF_ALIVE}, //the same until we know better - {"battlesong", GameScript::BattleSong, AF_ALIVE}, - {"berserk", GameScript::Berserk, AF_ALIVE}, - {"bitclear", GameScript::BitClear,AF_MERGESTRINGS}, - {"bitglobal", GameScript::BitGlobal,AF_MERGESTRINGS}, - {"bitset", GameScript::GlobalBOr,AF_MERGESTRINGS}, //probably the same - {"breakinstants", GameScript::BreakInstants, AF_BLOCKING},//delay execution of instants to the next AI cycle??? - {"calllightning", GameScript::Kill, 0}, //TODO: call lightning projectile - {"calm", GameScript::Calm, 0}, - {"changeaiscript", GameScript::ChangeAIScript, 0}, - {"changeaitype", GameScript::ChangeAIType, 0}, - {"changealignment", GameScript::ChangeAlignment, 0}, - {"changeallegiance", GameScript::ChangeAllegiance, 0}, - {"changeanimation", GameScript::ChangeAnimation, 0}, - {"changeanimationnoeffect", GameScript::ChangeAnimationNoEffect, 0}, - {"changeclass", GameScript::ChangeClass, 0}, - {"changecolor", GameScript::ChangeColor, 0}, - {"changecurrentscript", GameScript::ChangeAIScript,AF_SCRIPTLEVEL}, - {"changedestination", GameScript::ChangeDestination,0}, //gemrb extension (iwd hack) - {"changedialog", GameScript::ChangeDialogue, 0}, - {"changedialogue", GameScript::ChangeDialogue, 0}, - {"changegender", GameScript::ChangeGender, 0}, - {"changegeneral", GameScript::ChangeGeneral, 0}, - {"changeenemyally", GameScript::ChangeAllegiance, 0}, //this is the same - {"changefaction", GameScript::SetFaction, 0}, //pst - {"changerace", GameScript::ChangeRace, 0}, - {"changespecifics", GameScript::ChangeSpecifics, 0}, - {"changestat", GameScript::ChangeStat, 0}, - {"changestatglobal", GameScript::ChangeStatGlobal, 0}, - {"changestoremarkup", GameScript::ChangeStoreMarkup, 0},//iwd2 - {"changeteam", GameScript::SetTeam, 0}, //pst - {"changetilestate", GameScript::ChangeTileState, 0}, //bg2 - {"chunkcreature", GameScript::Kill, 0}, //should be more graphical - {"clearactions", GameScript::ClearActions, 0}, - {"clearallactions", GameScript::ClearAllActions, 0}, - {"clearpartyeffects", GameScript::ClearPartyEffects, 0}, - {"clearspriteeffects", GameScript::ClearSpriteEffects, 0}, - {"clicklbuttonobject", GameScript::ClickLButtonObject, AF_BLOCKING}, - {"clicklbuttonpoint", GameScript::ClickLButtonPoint, AF_BLOCKING}, - {"clickrbuttonobject", GameScript::ClickLButtonObject, AF_BLOCKING}, - {"clickrbuttonpoint", GameScript::ClickLButtonPoint, AF_BLOCKING}, - {"closedoor", GameScript::CloseDoor,0}, - {"containerenable", GameScript::ContainerEnable, 0}, - {"continue", GameScript::Continue,AF_IMMEDIATE | AF_CONTINUE}, - {"copygroundpilesto", GameScript::CopyGroundPilesTo, 0}, - {"createcreature", GameScript::CreateCreature, 0}, //point is relative to Sender - {"createcreaturecopypoint", GameScript::CreateCreatureCopyPoint, 0}, //point is relative to Sender - {"createcreaturedoor", GameScript::CreateCreatureDoor, 0}, - {"createcreatureatfeet", GameScript::CreateCreatureAtFeet, 0}, - {"createcreatureatlocation", GameScript::CreateCreatureAtLocation, 0}, - {"createcreatureimpassable", GameScript::CreateCreatureImpassable, 0}, - {"createcreatureimpassableallowoverlap", GameScript::CreateCreatureImpassableAllowOverlap, 0}, - {"createcreatureobject", GameScript::CreateCreatureObjectOffset, 0}, //the same - {"createcreatureobjectcopy", GameScript::CreateCreatureObjectCopy, 0}, - {"createcreatureobjectcopyeffect", GameScript::CreateCreatureObjectCopy, 0}, //the same - {"createcreatureobjectdoor", GameScript::CreateCreatureObjectDoor, 0},//same as createcreatureobject, but with dimension door animation - {"createcreatureobjectoffscreen", GameScript::CreateCreatureObjectOffScreen, 0}, //same as createcreature object, but starts looking for a place far away from the player - {"createcreatureobjectoffset", GameScript::CreateCreatureObjectOffset, 0}, //the same - {"createcreatureoffscreen", GameScript::CreateCreatureOffScreen, 0}, - {"createitem", GameScript::CreateItem, 0}, - {"createitemglobal", GameScript::CreateItemNumGlobal, 0}, - {"createitemnumglobal", GameScript::CreateItemNumGlobal, 0}, - {"createpartygold", GameScript::CreatePartyGold, 0}, - {"createvisualeffect", GameScript::CreateVisualEffect, 0}, - {"createvisualeffectobject", GameScript::CreateVisualEffectObject, 0}, - {"createvisualeffectobjectSticky", GameScript::CreateVisualEffectObjectSticky, 0}, - {"cutsceneid", GameScript::CutSceneID,0}, - {"damage", GameScript::Damage, 0}, - {"daynight", GameScript::DayNight, 0}, - {"deactivate", GameScript::Deactivate, 0}, - {"debug", GameScript::Debug, 0}, - {"debugoutput", GameScript::Debug, 0}, - {"deletejournalentry", GameScript::RemoveJournalEntry, 0}, - {"demoend", GameScript::DemoEnd, 0}, //same for now - {"destroyalldestructableequipment", GameScript::DestroyAllDestructableEquipment, 0}, - {"destroyallequipment", GameScript::DestroyAllEquipment, 0}, - {"destroygold", GameScript::DestroyGold, 0}, - {"destroyitem", GameScript::DestroyItem, 0}, - {"destroypartygold", GameScript::DestroyPartyGold, 0}, - {"destroypartyitem", GameScript::DestroyPartyItem, 0}, - {"destroyself", GameScript::DestroySelf, 0}, - {"detectsecretdoor", GameScript::DetectSecretDoor, 0}, - {"dialog", GameScript::Dialogue,AF_BLOCKING}, - {"dialogforceinterrupt", GameScript::DialogueForceInterrupt,AF_BLOCKING}, - {"dialoginterrupt", GameScript::DialogueInterrupt,0}, - {"dialogue", GameScript::Dialogue,AF_BLOCKING}, - {"dialogueforceinterrupt", GameScript::DialogueForceInterrupt,AF_BLOCKING}, - {"dialogueinterrupt", GameScript::DialogueInterrupt,0}, - {"disablefogdither", GameScript::DisableFogDither, 0}, - {"disablespritedither", GameScript::DisableSpriteDither, 0}, - {"displaymessage", GameScript::DisplayMessage, 0}, - {"displaystring", GameScript::DisplayString, 0}, - {"displaystringhead", GameScript::DisplayStringHead, 0}, - {"displaystringheadowner", GameScript::DisplayStringHeadOwner, 0}, - {"displaystringheaddead", GameScript::DisplayStringHead, 0}, //same? - {"displaystringnoname", GameScript::DisplayStringNoName, 0}, - {"displaystringnonamehead", GameScript::DisplayStringNoNameHead, 0}, - {"displaystringwait", GameScript::DisplayStringWait,AF_BLOCKING}, - {"doubleclicklbuttonobject", GameScript::DoubleClickLButtonObject, AF_BLOCKING}, - {"doubleclicklbuttonpoint", GameScript::DoubleClickLButtonPoint, AF_BLOCKING}, - {"doubleclickrbuttonobject", GameScript::DoubleClickLButtonObject, AF_BLOCKING}, - {"doubleclickrbuttonpoint", GameScript::DoubleClickLButtonPoint, AF_BLOCKING}, - {"dropinventory", GameScript::DropInventory, 0}, - {"dropinventoryex", GameScript::DropInventoryEX, 0}, - {"dropinventoryexexclude", GameScript::DropInventoryEX, 0}, //same - {"dropitem", GameScript::DropItem, AF_BLOCKING}, - {"enablefogdither", GameScript::EnableFogDither, 0}, - {"enableportaltravel", GameScript::EnablePortalTravel, 0}, - {"enablespritedither", GameScript::EnableSpriteDither, 0}, - {"endcredits", GameScript::EndCredits, 0},//movie - {"endcutscenemode", GameScript::EndCutSceneMode, 0}, - {"endgame", GameScript::QuitGame, 0}, //ending in iwd2 - {"enemy", GameScript::Enemy, 0}, - {"equipitem", GameScript::EquipItem, 0}, - {"equipmostdamagingmelee",GameScript::EquipMostDamagingMelee,0}, - {"equipranged", GameScript::EquipRanged,0}, - {"equipweapon", GameScript::EquipWeapon,0}, - {"erasejournalentry", GameScript::RemoveJournalEntry, 0}, - {"escapearea", GameScript::EscapeArea, AF_BLOCKING}, - {"escapeareadestroy", GameScript::EscapeAreaDestroy, AF_BLOCKING}, - {"escapeareanosee", GameScript::EscapeAreaNoSee, AF_BLOCKING}, - {"escapeareaobject", GameScript::EscapeAreaObject, AF_BLOCKING}, - {"escapeareaobjectnosee", GameScript::EscapeAreaObjectNoSee, AF_BLOCKING}, - {"exitpocketplane", GameScript::ExitPocketPlane, 0}, - {"expansionendcredits", GameScript::QuitGame, 0},//ends game too - {"explore", GameScript::Explore, 0}, - {"exploremapchunk", GameScript::ExploreMapChunk, 0}, - {"exportparty", GameScript::ExportParty, 0}, - {"face", GameScript::Face,AF_BLOCKING}, - {"faceobject", GameScript::FaceObject, AF_BLOCKING}, - {"facesavedlocation", GameScript::FaceSavedLocation, AF_BLOCKING}, - {"fadefromblack", GameScript::FadeFromColor, AF_BLOCKING}, //probably the same - {"fadefromcolor", GameScript::FadeFromColor, AF_BLOCKING}, - {"fadetoandfromcolor", GameScript::FadeToAndFromColor, AF_BLOCKING}, - {"fadetoblack", GameScript::FadeToColor, AF_BLOCKING}, //probably the same - {"fadetocolor", GameScript::FadeToColor, AF_BLOCKING}, - {"fakeeffectexpirycheck", GameScript::FakeEffectExpiryCheck, 0}, - {"fillslot", GameScript::FillSlot, 0}, - {"finalsave", GameScript::SaveGame, 0}, //synonym - {"findtraps", GameScript::FindTraps, 0}, - {"fixengineroom", GameScript::FixEngineRoom, 0}, - {"floatmessage", GameScript::DisplayStringHead, 0}, - {"floatmessagefixed", GameScript::FloatMessageFixed, 0}, - {"floatmessagefixedrnd", GameScript::FloatMessageFixedRnd, 0}, - {"floatmessagernd", GameScript::FloatMessageRnd, 0}, - {"floatrebus", GameScript::FloatRebus, 0}, - {"follow", GameScript::Follow, AF_ALIVE}, - {"followcreature", GameScript::FollowCreature, AF_BLOCKING|AF_ALIVE}, //pst - {"followobjectformation", GameScript::FollowObjectFormation, AF_BLOCKING|AF_ALIVE}, - {"forceaiscript", GameScript::ForceAIScript, 0}, - {"forceattack", GameScript::ForceAttack, 0}, - {"forcefacing", GameScript::ForceFacing, 0}, - {"forcehide", GameScript::ForceHide, 0}, - {"forceleavearealua", GameScript::ForceLeaveAreaLUA, 0}, - {"forcemarkedspell", GameScript::ForceMarkedSpell, 0}, - {"forcespell", GameScript::ForceSpell, AF_BLOCKING}, - {"forcespellpoint", GameScript::ForceSpellPoint, AF_BLOCKING}, - {"forceusecontainer", GameScript::ForceUseContainer,AF_BLOCKING}, - {"formation", GameScript::Formation, AF_BLOCKING}, - {"fullheal", GameScript::FullHeal, 0}, - {"fullhealex", GameScript::FullHeal, 0}, //pst, not sure what's different - {"generatemodronmaze", GameScript::GenerateMaze, 0}, - {"generatepartymember", GameScript::GeneratePartyMember, 0}, - {"getitem", GameScript::GetItem, 0}, - {"getstat", GameScript::GetStat, 0}, //gemrb specific - {"giveexperience", GameScript::AddXPObject, 0}, - {"givegoldforce", GameScript::CreatePartyGold, 0}, //this is the same - {"giveitem", GameScript::GiveItem, 0}, - {"giveitemcreate", GameScript::CreateItem, 0}, //actually this is a targeted createitem - {"giveorder", GameScript::GiveOrder, 0}, - {"givepartyallequipment", GameScript::GivePartyAllEquipment, 0}, - {"givepartygold", GameScript::GivePartyGold, 0}, - {"givepartygoldglobal", GameScript::GivePartyGoldGlobal,0},//no mergestrings! - {"globaladdglobal", GameScript::GlobalAddGlobal,AF_MERGESTRINGS}, - {"globalandglobal", GameScript::GlobalAndGlobal,AF_MERGESTRINGS}, - {"globalband", GameScript::GlobalBAnd,AF_MERGESTRINGS}, - {"globalbandglobal", GameScript::GlobalBAndGlobal,AF_MERGESTRINGS}, - {"globalbitglobal", GameScript::GlobalBitGlobal, AF_MERGESTRINGS}, - {"globalbor", GameScript::GlobalBOr,AF_MERGESTRINGS}, - {"globalborglobal", GameScript::GlobalBOrGlobal,AF_MERGESTRINGS}, - {"globalmax", GameScript::GlobalMax,AF_MERGESTRINGS}, - {"globalmaxglobal", GameScript::GlobalMaxGlobal,AF_MERGESTRINGS}, - {"globalmin", GameScript::GlobalMin,AF_MERGESTRINGS}, - {"globalminglobal", GameScript::GlobalMinGlobal,AF_MERGESTRINGS}, - {"globalorglobal", GameScript::GlobalOrGlobal,AF_MERGESTRINGS}, - {"globalset", GameScript::SetGlobal,AF_MERGESTRINGS}, - {"globalsetglobal", GameScript::GlobalSetGlobal,AF_MERGESTRINGS}, - {"globalshl", GameScript::GlobalShL,AF_MERGESTRINGS}, - {"globalshlglobal", GameScript::GlobalShLGlobal,AF_MERGESTRINGS}, - {"globalshout", GameScript::GlobalShout, 0}, - {"globalshr", GameScript::GlobalShR,AF_MERGESTRINGS}, - {"globalshrglobal", GameScript::GlobalShRGlobal,AF_MERGESTRINGS}, - {"globalsubglobal", GameScript::GlobalSubGlobal,AF_MERGESTRINGS}, - {"globalxor", GameScript::GlobalXor,AF_MERGESTRINGS}, - {"globalxorglobal", GameScript::GlobalXorGlobal,AF_MERGESTRINGS}, - {"gotostartscreen", GameScript::QuitGame, 0},//ending - {"help", GameScript::Help, 0}, - {"hide", GameScript::Hide, 0}, - {"hideareaonmap", GameScript::HideAreaOnMap, 0}, - {"hidecreature", GameScript::HideCreature, 0}, - {"hidegui", GameScript::HideGUI, 0}, - {"incinternal", GameScript::IncInternal, 0}, //pst - {"incrementinternal", GameScript::IncInternal, 0},//iwd - {"incmoraleai", GameScript::IncMoraleAI, 0}, - {"incrementchapter", GameScript::IncrementChapter, AF_BLOCKING}, - {"incrementextraproficiency", GameScript::IncrementExtraProficiency, 0}, - {"incrementglobal", GameScript::IncrementGlobal,AF_MERGESTRINGS}, - {"incrementglobalonce", GameScript::IncrementGlobalOnce,AF_MERGESTRINGS}, - {"incrementkillstat", GameScript::IncrementKillStat, 0}, - {"incrementproficiency", GameScript::IncrementProficiency, 0}, - {"interact", GameScript::Interact, 0}, - {"joinparty", GameScript::JoinParty, 0}, //this action appears to be blocking in bg2 - {"journalentrydone", GameScript::SetQuestDone, 0}, - {"jumptoobject", GameScript::JumpToObject, 0}, - {"jumptopoint", GameScript::JumpToPoint, 0}, - {"jumptopointinstant", GameScript::JumpToPointInstant, 0}, - {"jumptosavedlocation", GameScript::JumpToSavedLocation, 0}, - {"kill", GameScript::Kill, 0}, - {"killfloatmessage", GameScript::KillFloatMessage, 0}, - {"leader", GameScript::Leader, AF_ALIVE}, - {"leavearea", GameScript::LeaveAreaLUA, 0}, //so far the same - {"leavearealua", GameScript::LeaveAreaLUA, 0}, - {"leavearealuaentry", GameScript::LeaveAreaLUAEntry,AF_BLOCKING}, - {"leavearealuapanic", GameScript::LeaveAreaLUAPanic, 0}, - {"leavearealuapanicentry", GameScript::LeaveAreaLUAPanicEntry,AF_BLOCKING}, - {"leaveparty", GameScript::LeaveParty, 0}, - {"lock", GameScript::Lock, 0},//key not checked at this time! - {"lockscroll", GameScript::LockScroll, 0}, - {"log", GameScript::Debug, 0}, //the same until we know better - {"makeglobal", GameScript::MakeGlobal, 0}, - {"makeunselectable", GameScript::MakeUnselectable, 0}, - {"markobject", GameScript::MarkObject, 0}, - {"markspellandobject", GameScript::MarkSpellAndObject, 0}, - {"moraledec", GameScript::MoraleDec, 0}, - {"moraleinc", GameScript::MoraleInc, 0}, - {"moraleset", GameScript::MoraleSet, 0}, - {"matchhp", GameScript::MatchHP, 0}, - {"movebetweenareas", GameScript::MoveBetweenAreas, 0}, - {"movebetweenareaseffect", GameScript::MoveBetweenAreas, 0}, - {"movecursorpoint", GameScript::MoveCursorPoint, 0},//immediate move - {"moveglobal", GameScript::MoveGlobal, 0}, - {"moveglobalobject", GameScript::MoveGlobalObject, 0}, - {"moveglobalobjectoffscreen", GameScript::MoveGlobalObjectOffScreen, 0}, - {"moveglobalsto", GameScript::MoveGlobalsTo, 0}, - {"transferinventory", GameScript::MoveInventory, 0}, - {"movetocenterofscreen", GameScript::MoveToCenterOfScreen,AF_BLOCKING}, - {"movetoexpansion", GameScript::MoveToExpansion,AF_BLOCKING}, - {"movetoobject", GameScript::MoveToObject,AF_BLOCKING|AF_ALIVE}, - {"movetoobjectfollow", GameScript::MoveToObjectFollow,AF_BLOCKING|AF_ALIVE}, - {"movetoobjectnointerrupt", GameScript::MoveToObjectNoInterrupt,AF_BLOCKING|AF_ALIVE}, - {"movetoobjectuntilsee", GameScript::MoveToObjectUntilSee,AF_BLOCKING|AF_ALIVE}, - {"movetooffset", GameScript::MoveToOffset,AF_BLOCKING|AF_ALIVE}, - {"movetopoint", GameScript::MoveToPoint,AF_BLOCKING|AF_ALIVE}, - {"movetopointnointerrupt", GameScript::MoveToPointNoInterrupt,AF_BLOCKING|AF_ALIVE}, - {"movetopointnorecticle", GameScript::MoveToPointNoRecticle,AF_BLOCKING|AF_ALIVE},//the same until we know better - {"movetosavedlocation", GameScript::MoveToSavedLocation,AF_MERGESTRINGS|AF_BLOCKING}, - //take care of the typo in the original bg2 action.ids - //FIXME: why doesn't this have MERGESTRINGS like the above entry? - {"movetosavedlocationn", GameScript::MoveToSavedLocation,AF_BLOCKING}, - {"moveviewobject", GameScript::MoveViewObject, AF_BLOCKING}, - {"moveviewpoint", GameScript::MoveViewPoint, AF_BLOCKING}, - {"moveviewpointuntildone", GameScript::MoveViewPoint, 0}, - {"nidspecial1", GameScript::NIDSpecial1,AF_BLOCKING|AF_DIRECT|AF_ALIVE},//we use this for dialogs, hack - {"nidspecial2", GameScript::NIDSpecial2,AF_BLOCKING},//we use this for worldmap, another hack - {"nidspecial3", GameScript::Attack,AF_BLOCKING|AF_DIRECT|AF_ALIVE},//this hack is for attacking preset target - {"nidspecial4", GameScript::ProtectObject,AF_BLOCKING|AF_DIRECT|AF_ALIVE}, - {"nidspecial5", GameScript::UseItem, AF_BLOCKING|AF_DIRECT|AF_ALIVE}, - {"nidspecial6", GameScript::Spell, AF_BLOCKING|AF_DIRECT|AF_ALIVE}, - {"nidspecial7", GameScript::SpellNoDec, AF_BLOCKING|AF_DIRECT|AF_ALIVE}, - //{"nidspecial8", GameScript::SpellPoint, AF_BLOCKING|AF_ALIVE}, //not needed - {"nidspecial9", GameScript::ToggleDoor, AF_BLOCKING},//another internal hack, maybe we should use UseDoor instead - {"noaction", GameScript::NoAction, 0}, - {"opendoor", GameScript::OpenDoor,0}, - {"panic", GameScript::Panic, AF_ALIVE}, - {"permanentstatchange", GameScript::PermanentStatChange, 0}, //pst - {"pausegame", GameScript::PauseGame, AF_BLOCKING}, //this is almost surely blocking - {"picklock", GameScript::PickLock,AF_BLOCKING}, - {"pickpockets", GameScript::PickPockets, AF_BLOCKING}, - {"pickupitem", GameScript::PickUpItem, 0}, - {"playbardsong", GameScript::PlayBardSong, AF_ALIVE}, - {"playdead", GameScript::PlayDead,AF_BLOCKING|AF_ALIVE}, - {"playdeadinterruptable", GameScript::PlayDeadInterruptable,AF_BLOCKING|AF_ALIVE}, - {"playerdialog", GameScript::PlayerDialogue,AF_BLOCKING}, - {"playerdialogue", GameScript::PlayerDialogue,AF_BLOCKING}, - {"playsequence", GameScript::PlaySequence, 0}, - {"playsequenceglobal", GameScript::PlaySequenceGlobal, 0}, //pst - {"playsequencetimed", GameScript::PlaySequenceTimed, 0},//pst - {"playsong", GameScript::StartSong, 0}, - {"playsound", GameScript::PlaySound, 0}, - {"playsoundnotranged", GameScript::PlaySoundNotRanged, 0}, - {"playsoundpoint", GameScript::PlaySoundPoint, 0}, - {"plunder", GameScript::Plunder,AF_BLOCKING|AF_ALIVE}, - {"polymorph", GameScript::Polymorph, 0}, - {"polymorphcopy", GameScript::PolymorphCopy, 0}, - {"polymorphcopybase", GameScript::PolymorphCopyBase, 0}, - {"protectobject", GameScript::ProtectObject, 0}, - {"protectpoint", GameScript::ProtectPoint, AF_BLOCKING}, - {"quitgame", GameScript::QuitGame, 0}, - {"randomfly", GameScript::RandomFly, AF_BLOCKING|AF_ALIVE}, - {"randomrun", GameScript::RandomRun, AF_BLOCKING|AF_ALIVE}, - {"randomturn", GameScript::RandomTurn, AF_BLOCKING}, - {"randomwalk", GameScript::RandomWalk, AF_BLOCKING|AF_ALIVE}, - {"randomwalkcontinuous", GameScript::RandomWalkContinuous, AF_BLOCKING|AF_ALIVE}, - {"realsetglobaltimer", GameScript::RealSetGlobalTimer,AF_MERGESTRINGS}, - {"reallyforcespell", GameScript::ReallyForceSpell, AF_BLOCKING}, - {"reallyforcespelldead", GameScript::ReallyForceSpellDead, AF_BLOCKING}, - {"reallyforcespelllevel", GameScript::ReallyForceSpell, AF_BLOCKING},//this is the same action - {"reallyforcespellpoint", GameScript::ReallyForceSpellPoint, AF_BLOCKING}, - {"recoil", GameScript::Recoil, AF_ALIVE}, - {"regainpaladinhood", GameScript::RegainPaladinHood, 0}, - {"regainrangerhood", GameScript::RegainRangerHood, 0}, - {"removeareaflag", GameScript::RemoveAreaFlag, 0}, - {"removeareatype", GameScript::RemoveAreaType, 0}, - {"removejournalentry", GameScript::RemoveJournalEntry, 0}, - {"removemapnote", GameScript::RemoveMapnote, 0}, - {"removepaladinhood", GameScript::RemovePaladinHood, 0}, - {"removerangerhood", GameScript::RemoveRangerHood, 0}, - {"removespell", GameScript::RemoveSpell, 0}, - {"removetraps", GameScript::RemoveTraps, AF_BLOCKING}, - {"reputationinc", GameScript::ReputationInc, 0}, - {"reputationset", GameScript::ReputationSet, 0}, - {"resetfogofwar", GameScript::UndoExplore, 0}, //pst - {"rest", GameScript::Rest, AF_ALIVE}, - {"restnospells", GameScript::RestNoSpells, 0}, - {"restorepartylocations", GameScript:: RestorePartyLocation, 0}, - {"restparty", GameScript::RestParty, 0}, - {"restuntilhealed", GameScript::RestUntilHealed, 0}, - //this is in iwd2, same as movetosavedlocation, but with stats - {"returntosavedlocation", GameScript::ReturnToSavedLocation, AF_BLOCKING|AF_ALIVE}, - {"returntosavedlocationdelete", GameScript::ReturnToSavedLocationDelete, AF_BLOCKING|AF_ALIVE}, - {"returntosavedplace", GameScript::ReturnToSavedLocation, AF_BLOCKING|AF_ALIVE}, - {"revealareaonmap", GameScript::RevealAreaOnMap, 0}, - {"runawayfrom", GameScript::RunAwayFrom,AF_BLOCKING|AF_ALIVE}, - {"runawayfromnointerrupt", GameScript::RunAwayFromNoInterrupt,AF_BLOCKING|AF_ALIVE}, - {"runawayfromnoleavearea", GameScript::RunAwayFromNoLeaveArea,AF_BLOCKING|AF_ALIVE}, - {"runawayfrompoint", GameScript::RunAwayFromPoint,AF_BLOCKING|AF_ALIVE}, - {"runfollow", GameScript::RunAwayFrom,AF_BLOCKING|AF_ALIVE}, - {"runningattack", GameScript::RunningAttack,AF_BLOCKING|AF_ALIVE}, - {"runningattacknosound", GameScript::RunningAttackNoSound,AF_BLOCKING|AF_ALIVE}, - {"runtoobject", GameScript::RunToObject,AF_BLOCKING|AF_ALIVE}, - {"runtopoint", GameScript::RunToPoint,AF_BLOCKING}, - {"runtopointnorecticle", GameScript::RunToPointNoRecticle,AF_BLOCKING|AF_ALIVE}, - {"runtosavedlocation", GameScript::RunToSavedLocation,AF_BLOCKING|AF_ALIVE}, - {"savegame", GameScript::SaveGame, 0}, - {"savelocation", GameScript::SaveLocation, 0}, - {"saveplace", GameScript::SaveLocation, 0}, - {"saveobjectlocation", GameScript::SaveObjectLocation, 0}, - {"screenshake", GameScript::ScreenShake,AF_BLOCKING}, - {"selectweaponability", GameScript::SelectWeaponAbility, 0}, - {"sendtrigger", GameScript::SendTrigger, 0}, - {"setanimstate", GameScript::PlaySequence, AF_ALIVE},//pst - {"setapparentnamestrref", GameScript::SetApparentName, 0}, - {"setareaflags", GameScript::SetAreaFlags, 0}, - {"setarearestflag", GameScript::SetAreaRestFlag, 0}, - {"setbeeninpartyflags", GameScript::SetBeenInPartyFlags, 0}, - {"setbestweapon", GameScript::SetBestWeapon, 0}, - {"setcorpseenabled", GameScript::AmbientActivate, 0},//another weird name - {"setcutsceneline", GameScript::SetCursorState, 0}, //same as next - {"setcursorstate", GameScript::SetCursorState, 0}, - {"setcreatureareaflag", GameScript::SetCreatureAreaFlag, 0}, - {"setcriticalpathobject", GameScript::SetCriticalPathObject, 0}, - {"setdialog", GameScript::SetDialogue,0}, - {"setdialogrange", GameScript::SetDialogueRange, 0}, - {"setdialogue", GameScript::SetDialogue,0}, - {"setdialoguerange", GameScript::SetDialogueRange, 0}, - {"setdoorflag", GameScript::SetDoorFlag,0}, - {"setdoorlocked", GameScript::SetDoorLocked,0}, - {"setencounterprobability", GameScript::SetEncounterProbability,0}, - {"setextendednight", GameScript::SetExtendedNight, 0}, - {"setfaction", GameScript::SetFaction, 0}, - {"setgabber", GameScript::SetGabber, 0}, - {"setglobal", GameScript::SetGlobal,AF_MERGESTRINGS}, - {"setglobalrandom", GameScript::SetGlobalRandom, AF_MERGESTRINGS}, - {"setglobaltimer", GameScript::SetGlobalTimer,AF_MERGESTRINGS}, - {"setglobaltimeronce", GameScript::SetGlobalTimerOnce,AF_MERGESTRINGS}, - {"setglobaltimerrandom", GameScript::SetGlobalTimerRandom,AF_MERGESTRINGS}, - {"setglobaltint", GameScript::SetGlobalTint, 0}, - {"sethomelocation", GameScript::SetSavedLocation, 0}, //bg2 - {"sethp", GameScript::SetHP, 0}, - {"sethppercent", GameScript::SetHPPercent, 0}, - {"setinternal", GameScript::SetInternal, 0}, - {"setinterrupt", GameScript::SetInterrupt, 0}, - {"setleavepartydialogfile", GameScript::SetLeavePartyDialogFile, 0}, - {"setleavepartydialoguefile", GameScript::SetLeavePartyDialogFile, 0}, - {"setmarkedspell", GameScript::SetMarkedSpell, 0}, - {"setmasterarea", GameScript::SetMasterArea, 0}, - {"setmazeeasier", GameScript::SetMazeEasier, 0}, //pst specific crap - {"setmazeharder", GameScript::SetMazeHarder, 0}, //pst specific crap - {"setmoraleai", GameScript::SetMoraleAI, 0}, - {"setmusic", GameScript::SetMusic, 0}, - {"setname", GameScript::SetApparentName, 0}, - {"setnamelessclass", GameScript::SetNamelessClass, 0}, - {"setnamelessdeath", GameScript::SetNamelessDeath, 0}, - {"setnamelessdisguise", GameScript::SetNamelessDisguise, 0}, - {"setnooneontrigger", GameScript::SetNoOneOnTrigger, 0}, - {"setnumtimestalkedto", GameScript::SetNumTimesTalkedTo, 0}, - {"setplayersound", GameScript::SetPlayerSound, 0}, - {"setquestdone", GameScript::SetQuestDone, 0}, - {"setregularnamestrref", GameScript::SetRegularName, 0}, - {"setrestencounterchance", GameScript::SetRestEncounterChance, 0}, - {"setrestencounterprobabilityday", GameScript::SetRestEncounterProbabilityDay, 0}, - {"setrestencounterprobabilitynight", GameScript::SetRestEncounterProbabilityNight, 0}, - {"setsavedlocation", GameScript::SetSavedLocation, 0}, - {"setsavedlocationpoint", GameScript::SetSavedLocationPoint, 0}, - {"setscriptname", GameScript::SetScriptName, 0}, - {"setselection", GameScript::SetSelection, 0}, - {"setsequence", GameScript::PlaySequence, 0}, //bg2 (only own) - {"setstartpos", GameScript::SetStartPos, 0}, - {"setteam", GameScript::SetTeam, 0}, - {"setteambit", GameScript::SetTeamBit, 0}, - {"settextcolor", GameScript::SetTextColor, 0}, - {"settrackstring", GameScript::SetTrackString, 0}, - {"settoken", GameScript::SetToken, 0}, - {"settoken2da", GameScript::SetToken2DA, 0}, //GemRB specific - {"settokenglobal", GameScript::SetTokenGlobal,AF_MERGESTRINGS}, - {"settokenobject", GameScript::SetTokenObject,0}, - {"setupwish", GameScript::SetupWish, 0}, - {"setupwishobject", GameScript::SetupWishObject, 0}, - {"setvisualrange", GameScript::SetVisualRange, 0}, - {"sg", GameScript::SG, 0}, - {"shout", GameScript::Shout, 0}, - {"sinisterpoof", GameScript::CreateVisualEffect, 0}, - {"smallwait", GameScript::SmallWait,AF_BLOCKING}, - {"smallwaitrandom", GameScript::SmallWaitRandom,AF_BLOCKING}, - {"soundactivate", GameScript::SoundActivate, 0}, - {"spawnptactivate", GameScript::SpawnPtActivate, 0}, - {"spawnptdeactivate", GameScript::SpawnPtDeactivate, 0}, - {"spawnptspawn", GameScript::SpawnPtSpawn, 0}, - {"spell", GameScript::Spell, AF_BLOCKING|AF_ALIVE}, - {"spellcasteffect", GameScript::SpellCastEffect, 0}, - {"spellhiteffectpoint", GameScript::SpellHitEffectPoint, 0}, - {"spellhiteffectsprite", GameScript::SpellHitEffectSprite, 0}, - {"spellnodec", GameScript::SpellNoDec, AF_BLOCKING|AF_ALIVE}, - {"spellpoint", GameScript::SpellPoint, AF_BLOCKING|AF_ALIVE}, - {"spellpointnodec", GameScript::SpellPointNoDec, AF_BLOCKING|AF_ALIVE}, - {"startcombatcounter", GameScript::StartCombatCounter, 0}, - {"startcutscene", GameScript::StartCutScene, 0}, - {"startcutsceneex", GameScript::StartCutScene, 0}, //pst (unknown) - {"startcutscenemode", GameScript::StartCutSceneMode, 0}, - {"startdialog", GameScript::StartDialogue,AF_BLOCKING}, - {"startdialoginterrupt", GameScript::StartDialogueInterrupt,AF_BLOCKING}, - {"startdialogue", GameScript::StartDialogue,AF_BLOCKING}, - {"startdialogueinterrupt", GameScript::StartDialogueInterrupt,AF_BLOCKING}, - {"startdialognoname", GameScript::StartDialogue,AF_BLOCKING}, - {"startdialognoset", GameScript::StartDialogueNoSet,AF_BLOCKING}, - {"startdialognosetinterrupt", GameScript::StartDialogueNoSetInterrupt,AF_BLOCKING}, - {"startdialogoverride", GameScript::StartDialogueOverride,AF_BLOCKING}, - {"startdialogoverrideinterrupt", GameScript::StartDialogueOverrideInterrupt,AF_BLOCKING}, - {"startdialoguenoname", GameScript::StartDialogue,AF_BLOCKING}, - {"startdialoguenoset", GameScript::StartDialogueNoSet,AF_BLOCKING}, - {"startdialoguenosetinterrupt", GameScript::StartDialogueNoSetInterrupt,AF_BLOCKING}, - {"startdialogueoverride", GameScript::StartDialogueOverride,AF_BLOCKING}, - {"startdialogueoverrideinterrupt", GameScript::StartDialogueOverrideInterrupt,AF_BLOCKING}, - {"startmovie", GameScript::StartMovie,AF_BLOCKING}, - {"startmusic", GameScript::StartMusic, 0}, - {"startrainnow", GameScript::StartRainNow, 0}, - {"startrandomtimer", GameScript::StartRandomTimer, 0}, - {"startsong", GameScript::StartSong, 0}, - {"startstore", GameScript::StartStore, 0}, - {"starttimer", GameScript::StartTimer, 0}, - {"stateoverrideflag", GameScript::StateOverrideFlag, 0}, - {"stateoverridetime", GameScript::StateOverrideTime, 0}, - {"staticpalette", GameScript::StaticPalette, 0}, - {"staticsequence", GameScript::PlaySequence, 0},//bg2 animation sequence - {"staticstart", GameScript::StaticStart, 0}, - {"staticstop", GameScript::StaticStop, 0}, - {"stickysinisterpoof", GameScript::CreateVisualEffectObjectSticky, 0}, - {"stopmoving", GameScript::StopMoving, 0}, - {"storepartylocations", GameScript::StorePartyLocation, 0}, - {"swing", GameScript::Swing, AF_ALIVE}, - {"swingonce", GameScript::SwingOnce, AF_ALIVE}, - {"takeitemlist", GameScript::TakeItemList, 0}, - {"takeitemlistparty", GameScript::TakeItemListParty, 0}, - {"takeitemlistpartynum", GameScript::TakeItemListPartyNum, 0}, - {"takeitemreplace", GameScript::TakeItemReplace, 0}, - {"takepartygold", GameScript::TakePartyGold, 0}, - {"takepartyitem", GameScript::TakePartyItem, 0}, - {"takepartyitemall", GameScript::TakePartyItemAll, 0}, - {"takepartyitemnum", GameScript::TakePartyItemNum, 0}, - {"takepartyitemrange", GameScript::TakePartyItemRange, 0}, - {"teleportparty", GameScript::TeleportParty, 0}, - {"textscreen", GameScript::TextScreen, AF_BLOCKING}, - {"timedmovetopoint", GameScript::TimedMoveToPoint,AF_BLOCKING|AF_ALIVE}, - {"tomsstringdisplayer", GameScript::DisplayMessage, 0}, - {"transformitem", GameScript::TransformItem, 0}, - {"transformitemall", GameScript::TransformItemAll, 0}, - {"transformpartyitem", GameScript::TransformPartyItem, 0}, - {"transformpartyitemall", GameScript::TransformPartyItemAll, 0}, - {"triggeractivation", GameScript::TriggerActivation, 0}, - {"triggerwalkto", GameScript::MoveToObject,AF_BLOCKING|AF_ALIVE}, //something like this - {"turn", GameScript::Turn, 0}, - {"turnamt", GameScript::TurnAMT, AF_BLOCKING}, //relative Face() - {"undoexplore", GameScript::UndoExplore, 0}, - {"unhidegui", GameScript::UnhideGUI, 0}, - {"unloadarea", GameScript::UnloadArea, 0}, - {"unlock", GameScript::Unlock, 0}, - {"unlockscroll", GameScript::UnlockScroll, 0}, - {"unmakeglobal", GameScript::UnMakeGlobal, 0}, //this is a GemRB extension - {"usecontainer", GameScript::UseContainer,AF_BLOCKING}, - {"usedoor", GameScript::UseDoor,AF_BLOCKING}, - {"useitem", GameScript::UseItem,AF_BLOCKING}, - {"useitempoint", GameScript::UseItemPoint,AF_BLOCKING}, - {"useitempointslot", GameScript::UseItemPoint,AF_BLOCKING}, - {"useitemslot", GameScript::UseItem,AF_BLOCKING}, - {"vequip",GameScript::SetArmourLevel, 0}, - {"verbalconstant", GameScript::VerbalConstant, 0}, - {"verbalconstanthead", GameScript::VerbalConstantHead, 0}, - {"wait", GameScript::Wait, AF_BLOCKING}, - {"waitanimation", GameScript::WaitAnimation,AF_BLOCKING},//iwd2 - {"waitrandom", GameScript::WaitRandom, AF_BLOCKING}, - {"weather", GameScript::Weather, 0}, - {"xequipitem", GameScript::XEquipItem, 0}, - { NULL,NULL, 0} -}; - -//Make this an ordered list, so we could use bsearch! -static const ObjectLink objectnames[] = { - {"bestac", GameScript::BestAC}, - {"eighthnearest", GameScript::EighthNearest}, - {"eighthnearestdoor", GameScript::EighthNearestDoor}, - {"eighthnearestenemyof", GameScript::EighthNearestEnemyOf}, - {"eighthnearestenemyoftype", GameScript::EighthNearestEnemyOfType}, - {"eighthnearestmygroupoftype", GameScript::EighthNearestEnemyOfType}, - {"eigthnearestenemyof", GameScript::EighthNearestEnemyOf}, //typo in iwd - {"eigthnearestenemyoftype", GameScript::EighthNearestEnemyOfType}, //bg2 - {"eigthnearestmygroupoftype", GameScript::EighthNearestEnemyOfType},//bg2 - {"farthest", GameScript::Farthest}, - {"farthestenemyof", GameScript::FarthestEnemyOf}, - {"fifthnearest", GameScript::FifthNearest}, - {"fifthnearestdoor", GameScript::FifthNearestDoor}, - {"fifthnearestenemyof", GameScript::FifthNearestEnemyOf}, - {"fifthnearestenemyoftype", GameScript::FifthNearestEnemyOfType}, - {"fifthnearestmygroupoftype", GameScript::FifthNearestEnemyOfType}, - {"fourthnearest", GameScript::FourthNearest}, - {"fourthnearestdoor", GameScript::FourthNearestDoor}, - {"fourthnearestenemyof", GameScript::FourthNearestEnemyOf}, - {"fourthnearestenemyoftype", GameScript::FourthNearestEnemyOfType}, - {"fourthnearestmygroupoftype", GameScript::FourthNearestEnemyOfType}, - {"gabber", GameScript::Gabber}, - {"groupof", GameScript::GroupOf}, - {"lastattackerof", GameScript::LastAttackerOf}, - {"lastcommandedby", GameScript::LastCommandedBy}, - {"lastheardby", GameScript::LastHeardBy}, - {"lasthelp", GameScript::LastHelp}, - {"lasthitter", GameScript::LastHitter}, - {"lastmarkedobject", GameScript::LastMarkedObject}, - {"lastseenby", GameScript::LastSeenBy}, - {"lastsummonerof", GameScript::LastSummonerOf}, - {"lasttalkedtoby", GameScript::LastTalkedToBy}, - {"lasttargetedby", GameScript::LastTargetedBy}, - {"lasttrigger", GameScript::LastTrigger}, - {"leaderof", GameScript::LeaderOf}, - {"leastdamagedof", GameScript::LeastDamagedOf}, - {"marked", GameScript::LastMarkedObject}, //pst - {"mostdamagedof", GameScript::MostDamagedOf}, - {"myself", GameScript::Myself}, - {"mytarget", GameScript::MyTarget},//see lasttargetedby(myself) - {"nearest", GameScript::Nearest}, //actually this seems broken in IE and resolve as Myself - {"nearestdoor", GameScript::NearestDoor}, - {"nearestenemyof", GameScript::NearestEnemyOf}, - {"nearestenemyoftype", GameScript::NearestEnemyOfType}, - {"nearestenemysummoned", GameScript::NearestEnemySummoned}, - {"nearestmygroupoftype", GameScript::NearestMyGroupOfType}, - {"nearestpc", GameScript::NearestPC}, - {"ninthnearest", GameScript::NinthNearest}, - {"ninthnearestdoor", GameScript::NinthNearestDoor}, - {"ninthnearestenemyof", GameScript::NinthNearestEnemyOf}, - {"ninthnearestenemyoftype", GameScript::NinthNearestEnemyOfType}, - {"ninthnearestmygroupoftype", GameScript::NinthNearestMyGroupOfType}, - {"nothing", GameScript::Nothing}, - {"player1", GameScript::Player1}, - {"player1fill", GameScript::Player1Fill}, - {"player2", GameScript::Player2}, - {"player2fill", GameScript::Player2Fill}, - {"player3", GameScript::Player3}, - {"player3fill", GameScript::Player3Fill}, - {"player4", GameScript::Player4}, - {"player4fill", GameScript::Player4Fill}, - {"player5", GameScript::Player5}, - {"player5fill", GameScript::Player5Fill}, - {"player6", GameScript::Player6}, - {"player6fill", GameScript::Player6Fill}, - {"player7", GameScript::Player7}, - {"player7fill", GameScript::Player7Fill}, - {"player8", GameScript::Player8}, - {"player8fill", GameScript::Player8Fill}, - {"protectedby", GameScript::ProtectedBy}, - {"protectorof", GameScript::ProtectorOf}, - {"protagonist", GameScript::Protagonist}, - {"secondnearest", GameScript::SecondNearest}, - {"secondnearestdoor", GameScript::SecondNearestDoor}, - {"secondnearestenemyof", GameScript::SecondNearestEnemyOf}, - {"secondnearestenemyoftype", GameScript::SecondNearestEnemyOfType}, - {"secondnearestmygroupoftype", GameScript::SecondNearestMyGroupOfType}, - {"selectedcharacter", GameScript::SelectedCharacter}, - {"seventhnearest", GameScript::SeventhNearest}, - {"seventhnearestdoor", GameScript::SeventhNearestDoor}, - {"seventhnearestenemyof", GameScript::SeventhNearestEnemyOf}, - {"seventhnearestenemyoftype", GameScript::SeventhNearestEnemyOfType}, - {"seventhnearestmygroupoftype", GameScript::SeventhNearestMyGroupOfType}, - {"sixthnearest", GameScript::SixthNearest}, - {"sixthnearestdoor", GameScript::SixthNearestDoor}, - {"sixthnearestenemyof", GameScript::SixthNearestEnemyOf}, - {"sixthnearestenemyoftype", GameScript::SixthNearestEnemyOfType}, - {"sixthnearestmygroupoftype", GameScript::SixthNearestMyGroupOfType}, - {"strongestof", GameScript::StrongestOf}, - {"strongestofmale", GameScript::StrongestOfMale}, - {"tenthnearest", GameScript::TenthNearest}, - {"tenthnearestdoor", GameScript::TenthNearestDoor}, - {"tenthnearestenemyof", GameScript::TenthNearestEnemyOf}, - {"tenthnearestenemyoftype", GameScript::TenthNearestEnemyOfType}, - {"tenthnearestmygroupoftype", GameScript::TenthNearestMyGroupOfType}, - {"thirdnearest", GameScript::ThirdNearest}, - {"thirdnearestdoor", GameScript::ThirdNearestDoor}, - {"thirdnearestenemyof", GameScript::ThirdNearestEnemyOf}, - {"thirdnearestenemyoftype", GameScript::ThirdNearestEnemyOfType}, - {"thirdnearestmygroupoftype", GameScript::ThirdNearestMyGroupOfType}, - {"weakestof", GameScript::WeakestOf}, - {"worstac", GameScript::WorstAC}, - { NULL,NULL} -}; - -static const IDSLink idsnames[] = { - {"align", GameScript::ID_Alignment}, - {"alignmen", GameScript::ID_Alignment}, - {"alignmnt", GameScript::ID_Alignment}, - {"class20", GameScript::ID_AVClass}, - {"class", GameScript::ID_Class}, - {"classmsk", GameScript::ID_ClassMask}, - {"ea", GameScript::ID_Allegiance}, - {"faction", GameScript::ID_Faction}, - {"gender", GameScript::ID_Gender}, - {"general", GameScript::ID_General}, - {"race", GameScript::ID_Race}, - {"specific", GameScript::ID_Specific}, - {"subrace", GameScript::ID_Subrace}, - {"team", GameScript::ID_Team}, - { NULL,NULL} -}; - -static const TriggerLink* FindTrigger(const char* triggername) -{ - if (!triggername) { - return NULL; - } - int len = strlench( triggername, '(' ); - for (int i = 0; triggernames[i].Name; i++) { - if (!strnicmp( triggernames[i].Name, triggername, len )) { - if (!triggernames[i].Name[len]) { - return triggernames + i; - } - } - } - return NULL; -} - -static const ActionLink* FindAction(const char* actionname) -{ - if (!actionname) { - return NULL; - } - int len = strlench( actionname, '(' ); - for (int i = 0; actionnames[i].Name; i++) { - if (!strnicmp( actionnames[i].Name, actionname, len )) { - if (!actionnames[i].Name[len]) { - return actionnames + i; - } - } - } - return NULL; -} - -static const ObjectLink* FindObject(const char* objectname) -{ - if (!objectname) { - return NULL; - } - int len = strlench( objectname, '(' ); - for (int i = 0; objectnames[i].Name; i++) { - if (!strnicmp( objectnames[i].Name, objectname, len )) { - if (!objectnames[i].Name[len]) { - return objectnames + i; - } - } - } - return NULL; -} - -static const IDSLink* FindIdentifier(const char* idsname) -{ - if (!idsname) { - return NULL; - } - int len = (int)strlen( idsname ); - for (int i = 0; idsnames[i].Name; i++) { - if (!strnicmp( idsnames[i].Name, idsname, len )) { - return idsnames + i; - } - } - - printMessage("GameScript", "Couldn't assign ids target: %.*s\n", YELLOW, - len, idsname ); - return NULL; -} - -void SetScriptDebugMode(int arg) -{ - InDebug=arg; -} - - - -/********************** Targets **********************************/ - -int Targets::Count() const -{ - return (int)objects.size(); -} - -targettype *Targets::RemoveTargetAt(targetlist::iterator &m) -{ - m=objects.erase(m); - if (m!=objects.end() ) { - return &(*m); - } - return NULL; -} - -const targettype *Targets::GetLastTarget(int Type) -{ - targetlist::const_iterator m = objects.end(); - while (m--!=objects.begin() ) { - if ( (Type==-1) || ((*m).actor->Type==Type) ) { - return &(*(m)); - } - } - return NULL; -} - -const targettype *Targets::GetFirstTarget(targetlist::iterator &m, int Type) -{ - m=objects.begin(); - while (m!=objects.end() ) { - if ( (Type!=-1) && ( (*m).actor->Type!=Type)) { - m++; - continue; - } - return &(*m); - } - return NULL; -} - -const targettype *Targets::GetNextTarget(targetlist::iterator &m, int Type) -{ - m++; - while (m!=objects.end() ) { - if ( (Type!=-1) && ( (*m).actor->Type!=Type)) { - m++; - continue; - } - return &(*m); - } - return NULL; -} - -Scriptable *Targets::GetTarget(unsigned int index, int Type) -{ - targetlist::iterator m = objects.begin(); - while(m!=objects.end() ) { - if ( (Type==-1) || ((*m).actor->Type==Type)) { - if (!index) { - return (*m).actor; - } - index--; - } - m++; - } - return NULL; -} - -//this stuff should be refined, dead actors are sometimes targetable by script? -void Targets::AddTarget(Scriptable* target, unsigned int distance, int ga_flags) -{ - if (!target) { - return; - } - - switch (target->Type) { - case ST_ACTOR: - //i don't know if unselectable actors are targetable by script - //if yes, then remove GA_SELECT - if (ga_flags) { - if (!((Actor *) target)->ValidTarget(ga_flags) ) { - return; - } - } - break; - case ST_GLOBAL: - // this doesn't seem a good idea to allow - return; - default: - break; - } - targettype Target = {target, distance}; - targetlist::iterator m; - for (m = objects.begin(); m != objects.end(); ++m) { - if ( (*m).distance>distance) { - objects.insert( m, Target); - return; - } - } - objects.push_back( Target ); -} - -void Targets::Clear() -{ - objects.clear(); -} - -/** releasing global memory */ -static void CleanupIEScript() -{ - triggersTable.release(); - actionsTable.release(); - objectsTable.release(); - overrideActionsTable.release(); - if (ObjectIDSTableNames) - free(ObjectIDSTableNames); - ObjectIDSTableNames = NULL; -} - -void printFunction(Holder table, int index) -{ - const char *str = table->GetStringIndex(index); - int value = table->GetValueIndex(index); - - int len = strchr(str,'(')-str; - if (len<0) { - print("%d %s\n", value, str); - } else { - print("%d %.*s\n", value, len, str); - } -} - -void InitializeIEScript() -{ - std::list missing_triggers; - std::list missing_actions; - std::list missing_objects; - std::list::iterator l; - - PluginMgr::Get()->RegisterCleanup(CleanupIEScript); - - NoCreate = core->HasFeature(GF_NO_NEW_VARIABLES); - HasKaputz = core->HasFeature(GF_HAS_KAPUTZ); - - InitScriptTables(); - int tT = core->LoadSymbol( "trigger" ); - int aT = core->LoadSymbol( "action" ); - int oT = core->LoadSymbol( "object" ); - int gaT = core->LoadSymbol( "gemact" ); - AutoTable objNameTable("script"); - if (tT < 0 || aT < 0 || oT < 0 || !objNameTable) { - error("GameScript", "A critical scripting file is missing!\n"); - } - triggersTable = core->GetSymbol( tT ); - actionsTable = core->GetSymbol( aT ); - objectsTable = core->GetSymbol( oT ); - overrideActionsTable = core->GetSymbol( gaT ); - if (!triggersTable || !actionsTable || !objectsTable || !objNameTable) { - error("GameScript", "A critical scripting file is damaged!\n"); - } - - int i; - - /* Loading Script Configuration Parameters */ - - ObjectIDSCount = atoi( objNameTable->QueryField() ); - if (ObjectIDSCount<0 || ObjectIDSCount>MAX_OBJECT_FIELDS) { - error("GameScript", "The IDS Count shouldn't be more than 10!\n"); - } - - ObjectIDSTableNames = (ieResRef *) malloc( sizeof(ieResRef) * ObjectIDSCount ); - for (i = 0; i < ObjectIDSCount; i++) { - const char *idsname; - idsname=objNameTable->QueryField( 0, i + 1 ); - const IDSLink *poi=FindIdentifier( idsname ); - if (poi==NULL) { - idtargets[i]=NULL; - } - else { - idtargets[i]=poi->Function; - } - strnlwrcpy(ObjectIDSTableNames[i], idsname, 8 ); - } - MaxObjectNesting = atoi( objNameTable->QueryField( 1 ) ); - if (MaxObjectNesting<0 || MaxObjectNesting>MAX_NESTING) { - error("GameScript", "The Object Nesting Count shouldn't be more than 5!\n"); - } - HasAdditionalRect = ( atoi( objNameTable->QueryField( 2 ) ) != 0 ); - ExtraParametersCount = atoi( objNameTable->QueryField( 3 ) ); - HasTriggerPoint = ( atoi( objNameTable->QueryField( 4 ) ) != 0 ); - ObjectFieldsCount = ObjectIDSCount - ExtraParametersCount; - - /* Initializing the Script Engine */ - - memset( triggers, 0, sizeof( triggers ) ); - memset( triggerflags, 0, sizeof( triggerflags ) ); - memset( actions, 0, sizeof( actions ) ); - memset( actionflags, 0, sizeof( actionflags ) ); - memset( objects, 0, sizeof( objects ) ); - - int j; - - j = triggersTable->GetSize(); - while (j--) { - i = triggersTable->GetValueIndex( j ); - const TriggerLink* poi = FindTrigger(triggersTable->GetStringIndex( j )); - - bool was_condition = (i & 0x4000); - i &= 0x3fff; - if (i >= MAX_TRIGGERS) { - printMessage("GameScript", "trigger %d (%s) is too high, ignoring\n", RED, - i, triggersTable->GetStringIndex( j ) ); - continue; - } - - if (triggers[i]) { - if (poi && triggers[i]!=poi->Function) { - printMessage("GameScript", "%s is in collision with ", YELLOW, - triggersTable->GetStringIndex( j ) ); - printFunction(triggersTable,triggersTable->FindValue(triggersTable->GetValueIndex( j ))); - } else { - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript", "%s is a synonym of ", WHITE, - triggersTable->GetStringIndex( j ) ); - printFunction(triggersTable,triggersTable->FindValue(triggersTable->GetValueIndex( j ))); - } - } - continue; //we already found an alternative - } - - if (poi == NULL) { - // missing trigger which might be resolved later - triggers[i] = NULL; - triggerflags[i] = 0; - missing_triggers.push_back(j); - continue; - } - triggers[i] = poi->Function; - triggerflags[i] = poi->Flags; - if (was_condition) - triggerflags[i] |= TF_CONDITION; - } - - for (l = missing_triggers.begin(); l!=missing_triggers.end();l++) { - j = *l; - // found later as a different name - int ii = triggersTable->GetValueIndex( j ) & 0x3fff; - if (ii >= MAX_TRIGGERS) { - continue; - } - - TriggerFunction f = triggers[ii]; - if (f) { - for (i = 0; triggernames[i].Name; i++) { - if (f == triggernames[i].Function) { - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript", "%s is a synonym of %s\n", WHITE, - triggersTable->GetStringIndex( j ), triggernames[i].Name ); - break; - } - } - } - continue; - } - - printMessage("GameScript","Couldn't assign function to trigger: ", YELLOW); - printFunction(triggersTable,j); - } - - j = actionsTable->GetSize(); - while (j--) { - i = actionsTable->GetValueIndex( j ); - if (i >= MAX_ACTIONS) { - printMessage("GameScript", "action %d (%s) is too high, ignoring\n", RED, - i, actionsTable->GetStringIndex( j ) ); - continue; - } - const ActionLink* poi = FindAction( actionsTable->GetStringIndex( j )); - if (actions[i]) { - if (poi && actions[i]!=poi->Function) { - printMessage("GameScript", "%s is in collision with ", YELLOW, - actionsTable->GetStringIndex( j ) ); - printFunction(actionsTable, actionsTable->FindValue(actionsTable->GetValueIndex(j))); -//->GetStringIndex(actionsTable->FindValue(actionsTable->GetValueIndex( j )) ) ); - } else { - if (InDebug&ID_ACTIONS) { - printMessage("GameScript", "%s is a synonym of ", WHITE, - actionsTable->GetStringIndex( j ) ); - printFunction(actionsTable, actionsTable->FindValue(actionsTable->GetValueIndex( j ))); -//actionsTable->GetStringIndex(actionsTable->FindValue(actionsTable->GetValueIndex( j )) ) ); - } - } - continue; //we already found an alternative - } - if (poi == NULL) { - actions[i] = NULL; - actionflags[i] = 0; - missing_actions.push_back(j); - continue; - } - actions[i] = poi->Function; - actionflags[i] = poi->Flags; - } - - if (overrideActionsTable) { - /* - * we add/replace some actions from gemact.ids - * right now you can't print or generate these actions! - */ - j = overrideActionsTable->GetSize(); - while (j--) { - i = overrideActionsTable->GetValueIndex( j ); - if (i >= MAX_ACTIONS) { - printMessage("GameScript", "action %d (%s) is too high, ignoring\n", RED, - i, overrideActionsTable->GetStringIndex( j ) ); - continue; - } - const ActionLink *poi = FindAction( overrideActionsTable->GetStringIndex( j )); - if (!poi) { - continue; - } - if (actions[i]) { - printMessage("GameScript", "%s overrides existing action ", WHITE, - overrideActionsTable->GetStringIndex( j ) ); - printFunction( actionsTable, actionsTable->FindValue(overrideActionsTable->GetValueIndex( j ))); - //printFunction( actionsTable->GetStringIndex(actionsTable->FindValue(overrideActionsTable->GetValueIndex( j )) ) ); - } - actions[i] = poi->Function; - actionflags[i] = poi->Flags; - } - } - - for (l = missing_actions.begin(); l!=missing_actions.end();l++) { - j = *l; - // found later as a different name - int ii = actionsTable->GetValueIndex( j ); - if (ii>=MAX_ACTIONS) { - continue; - } - - ActionFunction f = actions[ii]; - if (f) { - for (i = 0; actionnames[i].Name; i++) { - if (f == actionnames[i].Function) { - if (InDebug&ID_ACTIONS) { - printMessage("GameScript", "%s is a synonym of %s\n", WHITE, - actionsTable->GetStringIndex( j ), actionnames[i].Name ); - break; - } - } - } - continue; - } - printMessage("GameScript","Couldn't assign function to action: ", YELLOW); - printFunction(actionsTable,j); - //printFunction(actionsTable->GetStringIndex(j) ); - } - - j = objectsTable->GetSize(); - while (j--) { - i = objectsTable->GetValueIndex( j ); - if (i >= MAX_OBJECTS) { - printMessage("GameScript", "object %d (%s) is too high, ignoring\n", RED, - i, objectsTable->GetStringIndex( j ) ); - continue; - } - const ObjectLink* poi = FindObject( objectsTable->GetStringIndex( j )); - if (objects[i]) { - if (poi && objects[i]!=poi->Function) { - printMessage("GameScript", "%s is in collision with ", YELLOW, - objectsTable->GetStringIndex( j ) ); - printFunction(objectsTable,objectsTable->FindValue(objectsTable->GetValueIndex( j ))); - //printFunction(objectsTable->GetStringIndex(objectsTable->FindValue(objectsTable->GetValueIndex( j )) ) ); - } else { - printMessage("GameScript", "%s is a synonym of ", WHITE, - objectsTable->GetStringIndex( j ) ); - printFunction(objectsTable, objectsTable->FindValue(objectsTable->GetValueIndex( j ))); - //printFunction(objectsTable->GetStringIndex(objectsTable->FindValue(objectsTable->GetValueIndex( j )) ) ); - } - continue; - } - if (poi == NULL) { - objects[i] = NULL; - missing_objects.push_back(j); - } else { - objects[i] = poi->Function; - } - } - - for (l = missing_objects.begin(); l!=missing_objects.end();l++) { - j = *l; - // found later as a different name - int ii = objectsTable->GetValueIndex( j ); - if (ii>=MAX_ACTIONS) { - continue; - } - - ObjectFunction f = objects[ii]; - if (f) { - for (i = 0; objectnames[i].Name; i++) { - if (f == objectnames[i].Function) { - printMessage("GameScript", "%s is a synonym of %s\n", WHITE, - objectsTable->GetStringIndex( j ), objectnames[i].Name ); - break; - } - } - continue; - } - printMessage("GameScript","Couldn't assign function to object: ", YELLOW); - printFunction(objectsTable,j); - //printFunction(objectsTable->GetStringIndex(j) ); - } - - int instantTableIndex = core->LoadSymbol("instant"); - if (instantTableIndex < 0) { - error("GameScript", "Couldn't find instant symbols!\n"); - } - Holder instantTable = core->GetSymbol(instantTableIndex); - if (!instantTable) { - error("GameScript", "Couldn't load instant symbols!\n"); - } - j = instantTable->GetSize(); - while (j--) { - i = instantTable->GetValueIndex( j ); - if (i >= MAX_ACTIONS) { - printMessage("GameScript", "instant action %d (%s) is too high, ignoring\n", RED, - i, instantTable->GetStringIndex( j ) ); - continue; - } - if (!actions[i]) { - printMessage("GameScript", "instant action %d (%s) doesn't exist, ignoring\n", YELLOW, - i, instantTable->GetStringIndex( j ) ); - continue; - } - actionflags[i] |= AF_INSTANT; - } - - int savedTriggersIndex = core->LoadSymbol("svtriobj"); - if (savedTriggersIndex < 0) { - // leaving this as not strictly necessary, for now - printMessage("GameScript", "Couldn't find saved trigger symbols!\n", YELLOW); - } else { - Holder savedTriggersTable = core->GetSymbol(savedTriggersIndex); - if (!savedTriggersTable) { - error("GameScript", "Couldn't laod saved trigger symbols!\n"); - } - j = savedTriggersTable->GetSize(); - while (j--) { - i = savedTriggersTable->GetValueIndex( j ); - i &= 0x3fff; - if (i >= MAX_ACTIONS) { - printMessage("GameScript", "saved trigger %d (%s) is too high, ignoring\n", RED, - i, savedTriggersTable->GetStringIndex( j ) ); - continue; - } - if (!triggers[i]) { - printMessage("GameScript", "saved trigger %d (%s) doesn't exist, ignoring\n", YELLOW, - i, savedTriggersTable->GetStringIndex( j ) ); - continue; - } - triggerflags[i] |= TF_SAVED; - } - } -} - -/********************** GameScript *******************************/ -GameScript::GameScript(const ieResRef ResRef, Scriptable* MySelf, - int ScriptLevel, bool AIScript) - : MySelf(MySelf) -{ - scriptlevel = ScriptLevel; - lastAction = (unsigned int) ~0; - - strnlwrcpy( Name, ResRef, 8 ); - - script = CacheScript( Name, AIScript); -} - -GameScript::~GameScript(void) -{ - if (script) { - //set 3. parameter to true if you want instant free - //and possible death - if (InDebug&ID_REFERENCE) { - print("One instance of %s is dropped from %d.\n", Name, BcsCache.RefCount(Name) ); - } - int res = BcsCache.DecRef(script, Name, true); - - if (res<0) { - error("GameScript", "Corrupted Script cache encountered (reference count went below zero), Script name is: %.8s\n", Name); - } - if (!res) { - //print("Freeing script %s because its refcount has reached 0.\n", Name); - script->Release(); - } - script = NULL; - } -} - -Script* GameScript::CacheScript(ieResRef ResRef, bool AIScript) -{ - char line[10]; - - SClass_ID type = AIScript ? IE_BS_CLASS_ID : IE_BCS_CLASS_ID; - - Script *newScript = (Script *) BcsCache.GetResource(ResRef); - if ( newScript ) { - if (InDebug&ID_REFERENCE) { - print("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); - } - return newScript; - } - - DataStream* stream = gamedata->GetResource( ResRef, type ); - if (!stream) { - return NULL; - } - stream->ReadLine( line, 10 ); - if (strncmp( line, "SC", 2 ) != 0) { - printMessage( "GameScript","Not a Compiled Script file\n", YELLOW ); - delete( stream ); - return NULL; - } - newScript = new Script( ); - BcsCache.SetAt( ResRef, (void *) newScript ); - if (InDebug&ID_REFERENCE) { - print("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); - } - - while (true) { - ResponseBlock* rB = ReadResponseBlock( stream ); - if (!rB) - break; - newScript->responseBlocks.push_back( rB ); - stream->ReadLine( line, 10 ); - } - delete( stream ); - return newScript; -} - -static int ParseInt(const char*& src) -{ - char number[33]; - - char* tmp = number; - while (isdigit(*src) || *src=='-') { - *tmp = *src; - tmp++; - src++; - } - *tmp = 0; - if (*src) - src++; - return atoi( number ); -} - -static void ParseString(const char*& src, char* tmp) -{ - while (*src != '"' && *src) { - *tmp = *src; - tmp++; - src++; - } - *tmp = 0; - if (*src) - src++; -} - -static Object* DecodeObject(const char* line) -{ - int i; - const char *origline = line; // for debug below - - Object* oB = new Object(); - for (i = 0; i < ObjectFieldsCount; i++) { - oB->objectFields[i] = ParseInt( line ); - } - for (i = 0; i < MaxObjectNesting; i++) { - oB->objectFilters[i] = ParseInt( line ); - } - //iwd tolerates the missing rectangle, so we do so too - if (HasAdditionalRect && (*line=='[') ) { - line++; //Skip [ - for (i = 0; i < 4; i++) { - oB->objectRect[i] = ParseInt( line ); - } - if (*line == ' ') - line++; //Skip ] (not really... it skips a ' ' since the ] was skipped by the ParseInt function - } - if (*line == '"') - line++; //Skip " - ParseString( line, oB->objectName ); - if (*line == '"') - line++; //Skip " (the same as above) - //this seems to be needed too - if (ExtraParametersCount && *line) { - line++; - } - for (i = 0; i < ExtraParametersCount; i++) { - oB->objectFields[i + ObjectFieldsCount] = ParseInt( line ); - } - if (*line != 'O' || *(line + 1) != 'B') { - printMessage("GameScript", "Got confused parsing object line: %s\n", YELLOW, origline); - } - //let the object realize it has no future (in case of null objects) - if (oB->isNull()) { - oB->Release(); - return NULL; - } - return oB; -} - -static Trigger* ReadTrigger(DataStream* stream) -{ - char* line = ( char* ) malloc( 1024 ); - stream->ReadLine( line, 1024 ); - if (strncmp( line, "TR", 2 ) != 0) { - free( line ); - return NULL; - } - stream->ReadLine( line, 1024 ); - Trigger* tR = new Trigger(); - //this exists only in PST? - if (HasTriggerPoint) { - sscanf( line, "%hu %d %d %d %d [%hd,%hd] \"%[^\"]\" \"%[^\"]\" OB", - &tR->triggerID, &tR->int0Parameter, &tR->flags, - &tR->int1Parameter, &tR->int2Parameter, &tR->pointParameter.x, - &tR->pointParameter.y, tR->string0Parameter, tR->string1Parameter ); - } else { - sscanf( line, "%hu %d %d %d %d \"%[^\"]\" \"%[^\"]\" OB", - &tR->triggerID, &tR->int0Parameter, &tR->flags, - &tR->int1Parameter, &tR->int2Parameter, tR->string0Parameter, - tR->string1Parameter ); - } - strlwr(tR->string0Parameter); - strlwr(tR->string1Parameter); - tR->triggerID &= 0x3fff; - stream->ReadLine( line, 1024 ); - tR->objectParameter = DecodeObject( line ); - stream->ReadLine( line, 1024 ); - free( line ); - return tR; -} - -static Condition* ReadCondition(DataStream* stream) -{ - char line[10]; - - stream->ReadLine( line, 10 ); - if (strncmp( line, "CO", 2 ) != 0) { - return NULL; - } - Condition* cO = new Condition(); - while (true) { - Trigger* tR = ReadTrigger( stream ); - if (!tR) - break; - cO->triggers.push_back( tR ); - } - return cO; -} - -/* - * if you pass non-NULL parameters, continuing is set to whether we Continue()ed - * (should start false and be passed to next script's Update), - * and done is set to whether we processed a block without Continue() - */ -bool GameScript::Update(bool *continuing, bool *done) -{ - if (!MySelf) - return false; - - if (!script) - return false; - - //ieDword thisTime = core->GetGame()->Ticks; - //if (( thisTime - lastRunTime ) < scriptRunDelay) { - // return false; - //} - - //lastRunTime = thisTime; - - if(!(MySelf->GetInternalFlag()&IF_ACTIVE) ) { - return false; - } - - bool continueExecution = false; - if (continuing) continueExecution = *continuing; - - RandomNumValue=rand(); - for (size_t a = 0; a < script->responseBlocks.size(); a++) { - ResponseBlock* rB = script->responseBlocks[a]; - if (rB->condition->Evaluate(MySelf)) { - //if this isn't a continue-d block, we have to clear the queue - //we cannot clear the queue and cannot execute the new block - //if we already have stuff on the queue! - if (!continueExecution) { - if (MySelf->GetCurrentAction() || MySelf->GetNextAction()) { - if (MySelf->GetInternalFlag()&IF_NOINT) { - // we presumably don't want any further execution? - if (done) *done = true; - return false; - } - - if (lastAction==a) { - // we presumably don't want any further execution? - // this one is a bit more complicated, due to possible - // interactions with Continue() (lastAction here is always - // the first block encountered), needs more testing - //if (done) *done = true; - return false; - } - - //movetoobjectfollow would break if this isn't called - //(what is broken if it is here?) - MySelf->ClearActions(); - //IE even clears the path, shall we? - //yes we must :) - if (MySelf->Type == ST_ACTOR) { - ((Movable *)MySelf)->ClearPath(); - } - } - lastAction=a; - } - continueExecution = ( rB->responseSet->Execute(MySelf) != 0); - if (continuing) *continuing = continueExecution; - if (!continueExecution) { - if (done) *done = true; - return true; - } - } - } - return continueExecution; -} - -//IE simply takes the first action's object for cutscene object -//then adds these actions to its queue: -// SetInterrupt(false), , SetInterrupt(true) - -void GameScript::EvaluateAllBlocks() -{ - if (!MySelf || !(MySelf->GetInternalFlag()&IF_ACTIVE) ) { - return; - } - - if (!script) { - return; - } - -#ifdef GEMRB_CUTSCENES - // this is the (unused) more logical way of executing a cutscene, which - // evaluates conditions and doesn't just use the first response - for (size_t a = 0; a < script->responseBlocks.size(); a++) { - ResponseBlock* rB = script->responseBlocks[a]; - if (rB->Condition->Evaluate(MySelf)) { - // TODO: this no longer works since the cutscene changes - rB->Execute(MySelf); - } - } -#else - // this is the original IE behaviour: - // cutscenes don't evaluate conditions - they just choose the - // first response, take the object from the first action, - // and then add the actions to that object's queue. - for (size_t a = 0; a < script->responseBlocks.size(); a++) { - ResponseBlock* rB = script->responseBlocks[a]; - ResponseSet * rS = rB->responseSet; - if (rS->responses.size()) { - Response *response = rS->responses[0]; - if (response->actions.size()) { - Action *action = response->actions[0]; - Scriptable *target = GetActorFromObject(MySelf, action->objects[1]); - if (target) { - // TODO: sometimes SetInterrupt(false) and SetInterrupt(true) are added before/after? - rS->responses[0]->Execute(target); - // TODO: this will break blocking instants, if there are any - target->ReleaseCurrentAction(); - } else if ((InDebug&ID_CUTSCENE) || !action->objects[1]) { - printMessage("GameScript","Failed to find CutSceneID target!\n",YELLOW); - if (action->objects[1]) { - action->objects[1]->Dump(); - } - } - } - } - } -#endif -} - -ResponseBlock* GameScript::ReadResponseBlock(DataStream* stream) -{ - char line[10]; - - stream->ReadLine( line, 10 ); - if (strncmp( line, "CR", 2 ) != 0) { - return NULL; - } - ResponseBlock* rB = new ResponseBlock(); - rB->condition = ReadCondition( stream ); - rB->responseSet = ReadResponseSet( stream ); - return rB; -} - -ResponseSet* GameScript::ReadResponseSet(DataStream* stream) -{ - char line[10]; - - stream->ReadLine( line, 10 ); - if (strncmp( line, "RS", 2 ) != 0) { - return NULL; - } - ResponseSet* rS = new ResponseSet(); - while (true) { - Response* rE = ReadResponse( stream ); - if (!rE) - break; - rS->responses.push_back( rE ); - } - return rS; -} - -//this is the border of the GameScript object (all subsequent functions are library functions) -//we can't make this a library function, because scriptlevel is set here -Response* GameScript::ReadResponse(DataStream* stream) -{ - char* line = ( char* ) malloc( 1024 ); - stream->ReadLine( line, 1024 ); - if (strncmp( line, "RE", 2 ) != 0) { - free( line ); - return NULL; - } - Response* rE = new Response(); - rE->weight = 0; - stream->ReadLine( line, 1024 ); - char *poi; - rE->weight = (unsigned char)strtoul(line,&poi,10); - if (strncmp(poi,"AC",2)==0) - while (true) { - //not autofreed, because it is referenced by the Script - Action* aC = new Action(false); - stream->ReadLine( line, 1024 ); - aC->actionID = (unsigned short)strtoul(line, NULL,10); - for (int i = 0; i < 3; i++) { - stream->ReadLine( line, 1024 ); - Object* oB = DecodeObject( line ); - aC->objects[i] = oB; - if (i != 2) - stream->ReadLine( line, 1024 ); - } - stream->ReadLine( line, 1024 ); - sscanf( line, "%d %hd %hd %d %d\"%[^\"]\" \"%[^\"]\" AC", - &aC->int0Parameter, &aC->pointParameter.x, &aC->pointParameter.y, - &aC->int1Parameter, &aC->int2Parameter, aC->string0Parameter, - aC->string1Parameter ); - strlwr(aC->string0Parameter); - strlwr(aC->string1Parameter); - if (aC->actionID>=MAX_ACTIONS) { - aC->actionID=0; - printMessage("GameScript","Invalid script action ID!",LIGHT_RED); - } else { - if (actionflags[aC->actionID] & AF_SCRIPTLEVEL) { - aC->int0Parameter = scriptlevel; - } - } - rE->actions.push_back( aC ); - stream->ReadLine( line, 1024 ); - if (strncmp( line, "RE", 2 ) == 0) - break; - } - free( line ); - return rE; -} - -void GameScript::ExecuteString(Scriptable* Sender, char* String) -{ - if (String[0] == 0) { - return; - } - Action* act = GenerateAction( String ); - if (!act) { - return; - } - Sender->AddActionInFront(act); -} - -//This must return integer because Or(3) returns 3 -int GameScript::EvaluateString(Scriptable* Sender, char* String) -{ - if (String[0] == 0) { - return 0; - } - Trigger* tri = GenerateTrigger( String ); - if (tri) { - int ret = tri->Evaluate(Sender); - tri->Release(); - return ret; - } - return 0; -} - -bool Condition::Evaluate(Scriptable* Sender) -{ - int ORcount = 0; - unsigned int result = 0; - bool subresult = true; - - for (size_t i = 0; i < triggers.size(); i++) { - Trigger* tR = triggers[i]; - //do not evaluate triggers in an Or() block if one of them - //was already True() - if (!ORcount || !subresult) { - result = tR->Evaluate(Sender); - } - if (result > 1) { - //we started an Or() block - if (ORcount) { - printMessage( "GameScript","Unfinished OR block encountered!\n",YELLOW ); - } - ORcount = result; - subresult = false; - continue; - } - if (ORcount) { - subresult |= ( result != 0 ); - if (--ORcount) { - continue; - } - result = subresult; - } - if (!result) { - return 0; - } - } - if (ORcount) { - printMessage( "GameScript","Unfinished OR block encountered!\n",YELLOW ); - } - return 1; -} - -/* this may return more than a boolean, in case of Or(x) */ -int Trigger::Evaluate(Scriptable* Sender) -{ - if (!this) { - printMessage( "GameScript","Trigger evaluation fails due to NULL trigger.\n",LIGHT_RED ); - return 0; - } - TriggerFunction func = triggers[triggerID]; - const char *tmpstr=triggersTable->GetValue(triggerID); - if (!tmpstr) { - tmpstr=triggersTable->GetValue(triggerID|0x4000); - } - if (!func) { - triggers[triggerID] = GameScript::False; - printMessage("GameScript"," ",YELLOW); - print("Unhandled trigger code: 0x%04x %s\n", - triggerID, tmpstr ); - return 0; - } - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ",YELLOW); - print( "Executing trigger code: 0x%04x %s\n", - triggerID, tmpstr ); - } - int ret = func( Sender, this ); - if (flags & NEGATE_TRIGGER) { - return !ret; - } - return ret; -} - -int ResponseSet::Execute(Scriptable* Sender) -{ - size_t i; - - switch(responses.size()) { - case 0: - return 0; - case 1: - return responses[0]->Execute(Sender); - } - /*default*/ - int randWeight; - int maxWeight = 0; - - for (i = 0; i < responses.size(); i++) { - maxWeight += responses[i]->weight; - } - if (maxWeight) { - randWeight = rand() % maxWeight; - } - else { - randWeight = 0; - } - - for (i = 0; i < responses.size(); i++) { - Response* rE = responses[i]; - if (rE->weight > randWeight) { - return rE->Execute(Sender); - /* this break is only symbolic */ - break; - } - randWeight-=rE->weight; - } - return 0; -} - -//continue is effective only as the last action in the block -int Response::Execute(Scriptable* Sender) -{ - int ret = 0; // continue or not - for (size_t i = 0; i < actions.size(); i++) { - Action* aC = actions[i]; - switch (actionflags[aC->actionID] & AF_MASK) { - case AF_IMMEDIATE: - GameScript::ExecuteAction( Sender, aC ); - ret = 0; - break; - case AF_NONE: - Sender->AddAction( aC ); - ret = 0; - break; - case AF_CONTINUE: - case AF_MASK: - ret = 1; - break; - } - } - return ret; -} - -void PrintAction(int actionID) -{ - print("Action: %d %s\n", actionID , actionsTable->GetValue(actionID) ); -} - -void GameScript::ExecuteAction(Scriptable* Sender, Action* aC) -{ - int actionID = aC->actionID; - - if (aC->objects[0]) { - Scriptable *scr = GetActorFromObject(Sender, aC->objects[0]); - - aC->IncRef(); // if aC is us, we don't want it deleted! - Sender->ReleaseCurrentAction(); - - if (scr) { - if (InDebug&ID_ACTIONS) { - printMessage("GameScript", "Sender: %s-->override: %s\n", YELLOW, - Sender->GetScriptName(), scr->GetScriptName() ); - } - scr->ReleaseCurrentAction(); - scr->AddAction(ParamCopyNoOverride(aC)); - if (!(actionflags[actionID] & AF_INSTANT)) { - assert(scr->GetNextAction()); - // TODO: below was written before i added instants, this might be unnecessary now - - // there are plenty of places where it's vital that ActionOverride is not interrupted and if - // there are actions left on the queue after the release above, we can't instant-execute, - // so this is my best guess for now.. - scr->CurrentActionInterruptable = false; - } - } else { - printMessage("GameScript","Actionoverride failed for object: \n",LIGHT_RED); - aC->objects[0]->Dump(); - } - - aC->Release(); - return; - } - if (InDebug&ID_ACTIONS) { - printMessage("GameScript"," ",YELLOW); - PrintAction(actionID); - print("Sender: %s\n",Sender->GetScriptName() ); - } - ActionFunction func = actions[actionID]; - if (func) { - //turning off interruptable flag - //uninterruptable actions will set it back - if (Sender->Type==ST_ACTOR) { - Sender->Activate(); - if (actionflags[actionID]&AF_ALIVE) { - if (Sender->GetInternalFlag()&IF_STOPATTACK) { - printMessage("GameScript", "Aborted action due to death\n", YELLOW); - Sender->ReleaseCurrentAction(); - return; - } - } - } - func( Sender, aC ); - } else { - actions[actionID] = NoActionAtAll; - printMessage("GameScript", "Unknown ", YELLOW); - textcolor(YELLOW); - PrintAction(actionID); - Sender->ReleaseCurrentAction(); - textcolor(WHITE); - return; - } - - //don't bother with special flow control actions - if (actionflags[actionID] & AF_IMMEDIATE) { - //this action never entered the action queue, therefore shouldn't be freed - if (aC->GetRef()!=1) { - print("Immediate action got queued!\n"); - PrintAction(actionID); - abort(); - } - return; - } - - //Releasing nonblocking actions, blocking actions will release themselves - if (!( actionflags[actionID] & AF_BLOCKING )) { - Sender->ReleaseCurrentAction(); - //aC is invalid beyond this point, so we return! - return; - } -} - -Trigger* GenerateTrigger(char* String) -{ - strlwr( String ); - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript", "Compiling:%s\n", YELLOW, String); - } - int negate = 0; - if (*String == '!') { - String++; - negate = 1; - } - int len = strlench(String,'(')+1; //including ( - int i = triggersTable->FindString(String, len); - if (i<0) { - printMessage("GameScript", "Invalid scripting trigger: %s\n", LIGHT_RED, String); - return NULL; - } - char *src = String+len; - char *str = triggersTable->GetStringIndex( i )+len; - Trigger *trigger = GenerateTriggerCore(src, str, i, negate); - if (!trigger) { - printMessage("GameScript", "Malformed scripting trigger: %s\n", LIGHT_RED, String); - return NULL; - } - return trigger; -} - -Action* GenerateAction(char* String) -{ - strlwr( String ); - if (InDebug&ID_ACTIONS) { - printMessage("GameScript", "Compiling:%s\n", YELLOW, String); - } - int len = strlench(String,'(')+1; //including ( - char *src = String+len; - int i = -1; - char *str; - unsigned short actionID; - if (overrideActionsTable) { - i = overrideActionsTable->FindString(String, len); - if (i >= 0) { - str = overrideActionsTable->GetStringIndex( i )+len; - actionID = overrideActionsTable->GetValueIndex(i); - } - } - if (i<0) { - i = actionsTable->FindString(String, len); - if (i < 0) { - printMessage("GameScript", "Invalid scripting action: %s\n", LIGHT_RED, String); - return NULL; - } - str = actionsTable->GetStringIndex( i )+len; - actionID = actionsTable->GetValueIndex(i); - } - Action *action = GenerateActionCore( src, str, actionID); - if (!action) { - printMessage("GameScript", "Malformed scripting action: %s\n", LIGHT_RED, String); - return NULL; - } - return action; -} - -Action* GenerateActionDirect(char *String, Scriptable *object) -{ - Action* action = GenerateAction(String); - Object *tmp = action->objects[1]; - if (tmp && tmp->objectFields[0]==-1) { - tmp->objectFields[1] = object->GetGlobalID(); - } - action->pointParameter.empty(); - return action; -} - -/** Return true if object is null */ -bool Object::isNull() -{ - if (objectName[0]!=0) { - return false; - } - if (objectFilters[0]) { - return false; - } - for (int i=0;i -#include - -class Action; -class GameScript; - -//escapearea flags -#define EA_DESTROY 1 //destroy actor at the exit (otherwise move to new place) -#define EA_NOSEE 2 //no need to see the exit - -//displaystring flags -#define DS_WAIT 1 -#define DS_HEAD 2 -#define DS_CONSOLE 4 -#define DS_CONST 8 -#define DS_NONAME 16 -#define DS_SILENT 32 -#define DS_SPEECH 64 -#define DS_AREA 128 - -//verbal constant (bg2), we need a lookup table for other games -#define VB_PANIC 1 -#define VB_HAPPY 2 -#define VB_UNHAPPY 3 -#define VB_LEADER 6 -#define VB_TIRED 7 -#define VB_BORED 8 -#define VB_ATTACK 9 -#define VB_DAMAGE 18 -#define VB_DIE 19 -#define VB_SELECT 26 -#define VB_INSULT 44 -#define VB_COMPLIMENT 47 -#define VB_SPECIAL 50 -#define VB_REACT 53 -#define VB_REACT_S 54 -#define VB_RESP_COMP 55 -#define VB_RESP_INS 58 -#define VB_HOSTILE 59 -#define VB_DIALOG 60 -#define VB_CRITHIT 65 -#define VB_CRITMISS 66 -#define VB_TIMMUNE 67 -#define VB_INVENTORY 68 -#define VB_PP_SUCC 69 -#define VB_BIO 74 - -//diffmode (iwd2) -#define DM_EQUAL 1 -#define DM_LESS 2 -#define DM_GREATER 3 - -//markspellandobject (iwd2) -#define MSO_IGNORE_SEE 1 -#define MSO_IGNORE_INVALID 2 -#define MSO_RANDOM_SPELL 4 -#define MSO_IGNORE_HAVE 8 -#define MSO_IGNORE_RANGE 16 -#define MSO_IGNORE_NULL 32 - -//delta (pst) -#define DM_LOWER 1 -#define DM_RAISE 2 -#define DM_SET 3 - -//attack core flags -#define AC_NO_SOUND 1 -#define AC_RUNNING 2 - -//trigger flags stored in triggers in .bcs files -#define NEGATE_TRIGGER 1 - -#define MAX_OBJECT_FIELDS 10 -#define MAX_NESTING 5 - -#define GSASSERT(f,c) \ - if(!(f)) \ - { \ - print("Assertion failed: %s [0x%08lX] Line %d",#f, c, __LINE__); \ - abort(); \ - } - -typedef std::vector SrcVector; - -struct targettype { - Scriptable *actor; //hmm, could be door - unsigned int distance; -}; - -typedef std::list targetlist; - -class GEM_EXPORT Targets { -public: - Targets() - { - } - - ~Targets() - { - Clear(); - } -private: - targetlist objects; -public: - int Count() const; - targettype *RemoveTargetAt(targetlist::iterator &m); - const targettype *GetNextTarget(targetlist::iterator &m, int Type); - const targettype *GetLastTarget(int Type); - const targettype *GetFirstTarget(targetlist::iterator &m, int Type); - Scriptable *GetTarget(unsigned int index, int Type); - void AddTarget(Scriptable* target, unsigned int distance, int flags); - void Clear(); -}; - -class GEM_EXPORT Object { -public: - Object() - { - memset( objectName, 0, 65 ); - - memset( objectFields, 0, MAX_OBJECT_FIELDS * sizeof( int ) ); - memset( objectFilters, 0, MAX_NESTING * sizeof( int ) ); - memset( objectRect, 0, 4 * sizeof( int ) ); - - canary = (unsigned long) 0xdeadbeef; - } - ~Object() - { - } -public: - int objectFields[MAX_OBJECT_FIELDS]; - int objectFilters[MAX_NESTING]; - int objectRect[4]; - char objectName[65]; -private: - volatile unsigned long canary; -public: - void Dump() - { - int i; - - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - if(objectName[0]) { - print("Object: %s\n",objectName); - return; - } - print("IDS Targeting: "); - for(i=0;iRelease(); - objectParameter = NULL; - } - } - int Evaluate(Scriptable* Sender); -public: - unsigned short triggerID; - int int0Parameter; - int flags; - int int1Parameter; - int int2Parameter; - Point pointParameter; - char string0Parameter[65]; - char string1Parameter[65]; - Object* objectParameter; -private: - volatile unsigned long canary; -public: - void Dump() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - print ("Trigger: %d\n", triggerID); - print ("Int parameters: %d %d %d\n", int0Parameter, int1Parameter, int2Parameter); - print ("Point: [%d.%d]\n", pointParameter.x, pointParameter.y); - print ("String0: %s\n", string0Parameter); - print ("String1: %s\n", string1Parameter); - if (objectParameter) { - objectParameter->Dump(); - } else { - print("No object\n"); - } - print("\n"); - } - - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -class GEM_EXPORT Condition { -public: - Condition() - { - canary = (unsigned long) 0xdeadbeef; - } - ~Condition() - { - for (size_t c = 0; c < triggers.size(); ++c) { - if (triggers[c]) { - triggers[c]->Release(); - triggers[c] = NULL; - } - } - } - bool Evaluate(Scriptable* Sender); -public: - std::vector triggers; -private: - volatile unsigned long canary; -public: - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -class GEM_EXPORT Action { -public: - Action(bool autoFree) - { - actionID = 0; - objects[0] = NULL; - objects[1] = NULL; - objects[2] = NULL; - memset(string0Parameter, 0, 65); - memset(string1Parameter, 0, 65); - int0Parameter = 0; - pointParameter.null(); - int1Parameter = 0; - int2Parameter = 0; - //changed now - if (autoFree) { - RefCount = 0; //refcount will be increased by each AddAction - } else { - RefCount = 1; //one reference hold by the script - } - canary = (unsigned long) 0xdeadbeef; - } - ~Action() - { - for (int c = 0; c < 3; c++) { - if (objects[c]) { - objects[c]->Release(); - objects[c] = NULL; - } - } - } -public: - unsigned short actionID; - Object* objects[3]; - int int0Parameter; - Point pointParameter; - int int1Parameter; - int int2Parameter; - char string0Parameter[65]; - char string1Parameter[65]; -private: - int RefCount; - volatile unsigned long canary; -public: - int GetRef() { - return RefCount; - } - void Dump() - { - int i; - - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - print("Int0: %d, Int1: %d, Int2: %d\n",int0Parameter, int1Parameter, int2Parameter); - print("String0: %s, String1: %s\n", string0Parameter?string0Parameter:"", string1Parameter?string1Parameter:""); - for (i=0;i<3;i++) { - if (objects[i]) { - print( "%d. ",i+1); - objects[i]->Dump(); - } else { - print( "%d. Object - NULL\n",i+1); - } - } - - print("RefCount: %d\n", RefCount); - } - - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - if (!RefCount) { - print( "WARNING!!! Double Freeing in %s: Line %d\n", __FILE__, - __LINE__ ); - abort(); - } - RefCount--; - if (!RefCount) { - canary = 0xdddddddd; - delete this; - } - } - void IncRef() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - RefCount++; - if (RefCount >= 65536) { - print( "Refcount increased to: %d in action %d\n", RefCount, - actionID ); - abort(); - } - } -}; - -class GEM_EXPORT Response { -public: - Response() - { - weight = 0; - canary = (unsigned long) 0xdeadbeef; - } - ~Response() - { - for (size_t c = 0; c < actions.size(); c++) { - if (actions[c]) { - if (actions[c]->GetRef()>2) { - print("Residue action %d with refcount %d\n", actions[c]->actionID, actions[c]->GetRef()); - } - actions[c]->Release(); - actions[c] = NULL; - } - } - } - int Execute(Scriptable* Sender); -public: - unsigned char weight; - std::vector actions; -private: - volatile unsigned long canary; -public: - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -class GEM_EXPORT ResponseSet { -public: - ResponseSet() - { - canary = (unsigned long) 0xdeadbeef; - } - ~ResponseSet() - { - for (size_t b = 0; b < responses.size(); b++) { - responses[b]->Release(); - responses[b] = NULL; - } - } - int Execute(Scriptable* Sender); -public: - std::vector responses; -private: - volatile unsigned long canary; -public: - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -class GEM_EXPORT ResponseBlock { -public: - ResponseBlock() - { - condition = NULL; - responseSet = NULL; - canary = (unsigned long) 0xdeadbeef; - } - ~ResponseBlock() - { - if (condition) { - condition->Release(); - condition = NULL; - } - if (responseSet) { - responseSet->Release(); - responseSet = NULL; - } - } -public: - Condition* condition; - ResponseSet* responseSet; -private: - volatile unsigned long canary; -public: - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -class GEM_EXPORT Script { -public: - Script() - { - canary = (unsigned long) 0xdeadbeef; - } - ~Script() - { - for (unsigned int i = 0; i < responseBlocks.size(); i++) { - if (responseBlocks[i]) { - responseBlocks[i]->Release(); - responseBlocks[i] = NULL; - } - } - } -public: - std::vector responseBlocks; -private: - volatile unsigned long canary; -public: - void Release() - { - GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - canary = 0xdddddddd; - delete this; - } -}; - -typedef int (* TriggerFunction)(Scriptable*, Trigger*); -typedef void (* ActionFunction)(Scriptable*, Action*); -typedef Targets* (* ObjectFunction)(Scriptable *, Targets*, int ga_flags); -typedef int (* IDSFunction)(Actor *, int parameter); - -#define TF_NONE 0 -#define TF_CONDITION 1 //this isn't a trigger, just a condition (0x4000) -#define TF_SAVED 2 //trigger is in svtriobj.ids -#define TF_MERGESTRINGS 8 //same value as actions' mergestring - -struct TriggerLink { - const char* Name; - TriggerFunction Function; - short Flags; -}; - -//createcreature flags -#define CC_OFFSET 1 -#define CC_OBJECT 2 -#define CC_OFFSCREEN 3 -#define CC_MASK 3 -#define CC_CHECK_IMPASSABLE 4 //adjust position (searchmap) -#define CC_PLAY_ANIM 8 //play animation -#define CC_STRING1 16 //resref is in second string -#define CC_CHECK_OVERLAP 32 //other actors -#define CC_COPY 64 //copy appearance -#define CC_SCRIPTNAME 128 //scriptname in 2nd string - -//begindialog flags -#define BD_STRING0 0 -#define BD_TARGET 1 -#define BD_SOURCE 2 -#define BD_RESERVED 3 //playerX resref -#define BD_INTERACT 4 //banter dialogs -#define BD_LOCMASK 7 //where is the dialog resref -#define BD_TALKCOUNT 8 //increases talkcount -#define BD_SETDIALOG 16 //also sets dialog (for string0) -#define BD_CHECKDIST 32 //checks distance, if needs, walks up -#define BD_OWN 64 //source == target, works for player only -#define BD_INTERRUPT 128 //interrupts action -#define BD_NUMERIC 256 //target is numeric -#define BD_ITEM 512 //talk to an item -#define BD_NOEMPTY 1024 //don't display '... has nothing to say to you' - -#define AF_NONE 0 -#define AF_IMMEDIATE 1 -#define AF_CONTINUE 2 -#define AF_MASK 3 //none, immediate or continue -#define AF_BLOCKING 4 -#define AF_MERGESTRINGS 8 -//we could use this flag to restrict player scripts from using dangerous -//opcodes, it would be a very useful and easy to implement feature! -#define AF_RESTRICTED 16 -//#define AF_RESTRICTED_LEVEL2 32 //maybe we could use 2 bits for this??? -#define AF_SCRIPTLEVEL 64 //this hack will transfer scriptlevel to int0parameter at runtime (changecurrentscript relies on it) -#define AF_INVALID 128 -#define AF_DIRECT 256 //this hack will transfer target from gamecontrol to object1 at compile time -#define AF_ALIVE 512 //only alive actors can do this -#define AF_INSTANT 1024 - -struct ActionLink { - const char* Name; - ActionFunction Function; - short Flags; -}; - -struct ObjectLink { - const char* Name; - ObjectFunction Function; -}; - -struct IDSLink { - const char* Name; - IDSFunction Function; -}; - -#define MAX_TRIGGERS 0xFF -#define MAX_ACTIONS 400 -#define MAX_OBJECTS 128 -#define AI_SCRIPT_LEVEL 4 //the script level of special ai scripts - -extern void SetScriptDebugMode(int arg); -extern int RandomNumValue; - -class GEM_EXPORT GameScript { -public: - GameScript(const ieResRef ResRef, Scriptable* Myself, - int ScriptLevel = 0, bool AIScript = false); - ~GameScript(); - const char *GetName() { return this?Name:"NONE\0\0\0\0"; } - static void ExecuteString(Scriptable* Sender, char* String); - static int EvaluateString(Scriptable* Sender, char* String); - static void ExecuteAction(Scriptable* Sender, Action* aC); -public: - bool Update(bool *continuing = NULL, bool *done = NULL); - void EvaluateAllBlocks(); -private: //Internal Functions - Script* CacheScript(ieResRef ResRef, bool AIScript); - ResponseBlock* ReadResponseBlock(DataStream* stream); - ResponseSet* ReadResponseSet(DataStream* stream); - Response* ReadResponse(DataStream* stream); - Trigger* ReadTrigger(DataStream* stream); - static int ParseInt(const char*& src); - static void ParseString(const char*& src, char* tmp); -private: //Internal variables - Scriptable* const MySelf; - ieResRef Name; - Script* script; - unsigned int lastAction; - int scriptlevel; -public: //Script Functions - static int ID_Alignment(Actor *actor, int parameter); - static int ID_Allegiance(Actor *actor, int parameter); - static int ID_AVClass(Actor *actor, int parameter); - static int ID_Class(Actor *actor, int parameter); - static int ID_ClassMask(Actor *actor, int parameter); - static int ID_Faction(Actor *actor, int parameter); - static int ID_Gender(Actor *actor, int parameter); - static int ID_General(Actor *actor, int parameter); - static int ID_Race(Actor *actor, int parameter); - static int ID_Specific(Actor *actor, int parameter); - static int ID_Subrace(Actor *actor, int parameter); - static int ID_Team(Actor *actor, int parameter); - - //Triggers - static int ActionListEmpty(Scriptable* Sender, Trigger* parameters); - static int ActuallyInCombat(Scriptable* Sender, Trigger* parameters); - static int Acquired(Scriptable* Sender, Trigger* parameters); - static int Alignment(Scriptable* Sender, Trigger* parameters); - static int Allegiance(Scriptable* Sender, Trigger* parameters); - static int AnimationID(Scriptable* Sender, Trigger* parameters); - static int AnimState(Scriptable* Sender, Trigger* parameters); - static int AnyPCOnMap(Scriptable* Sender, Trigger* parameters); - static int AnyPCSeesEnemy(Scriptable* Sender, Trigger* parameters); - static int AreaCheck(Scriptable* Sender, Trigger* parameter); - static int AreaCheckObject(Scriptable* Sender, Trigger* parameter); - static int AreaFlag(Scriptable* Sender, Trigger* parameter); - static int AreaRestDisabled(Scriptable* Sender, Trigger* parameter); - static int AreaStartsWith(Scriptable* Sender, Trigger* parameter); //InWatchersKeep - static int AreaType(Scriptable* Sender, Trigger* parameter); - static int AtLocation(Scriptable* Sender, Trigger* parameter); - static int AttackedBy(Scriptable* Sender, Trigger* parameters); - static int BecameVisible(Scriptable* Sender, Trigger* parameters); - static int BitCheck(Scriptable* Sender, Trigger* parameters); - static int BitCheckExact(Scriptable* Sender, Trigger* parameters); - static int BitGlobal_Trigger(Scriptable* Sender, Trigger* parameters); - static int BreakingPoint(Scriptable* Sender, Trigger* parameters); - static int CalendarDay(Scriptable* Sender, Trigger* parameters); - static int CalendarDayGT(Scriptable* Sender, Trigger* parameters); - static int CalendarDayLT(Scriptable* Sender, Trigger* parameters); - static int CalledByName(Scriptable* Sender, Trigger* parameters); - static int ChargeCount(Scriptable* Sender, Trigger* parameters); - static int CharName(Scriptable* Sender, Trigger* parameters); - static int CheckDoorFlags(Scriptable* Sender, Trigger* parameters); - static int CheckPartyAverageLevel(Scriptable* Sender, Trigger* parameters); - static int CheckPartyLevel(Scriptable* Sender, Trigger* parameters); - static int CheckSkill(Scriptable* Sender, Trigger* parameters); - static int CheckSkillGT(Scriptable* Sender, Trigger* parameters); - static int CheckSkillLT(Scriptable* Sender, Trigger* parameters); - static int CheckSpellState(Scriptable* Sender, Trigger* parameters); - static int CheckStat(Scriptable* Sender, Trigger* parameters); - static int CheckStatGT(Scriptable* Sender, Trigger* parameters); - static int CheckStatLT(Scriptable* Sender, Trigger* parameters); - static int Class(Scriptable* Sender, Trigger* parameters); - static int ClassEx(Scriptable* Sender, Trigger* parameters); - static int ClassLevel(Scriptable* Sender, Trigger* parameters); - static int ClassLevelGT(Scriptable* Sender, Trigger* parameters); - static int ClassLevelLT(Scriptable* Sender, Trigger* parameters); - static int Clicked(Scriptable* Sender, Trigger* parameters); - static int Closed(Scriptable* Sender, Trigger* parameters); - static int CombatCounter(Scriptable* Sender, Trigger* parameters); - static int CombatCounterGT(Scriptable* Sender, Trigger* parameters); - static int CombatCounterLT(Scriptable* Sender, Trigger* parameters); - static int Contains(Scriptable* Sender, Trigger* parameters); - static int CreatureHidden( Scriptable* Sender, Trigger* parameters); - static int CurrentAreaIs(Scriptable* Sender, Trigger* parameters); - //static int DamageTaken(Scriptable* Sender, Trigger* parameters); - //static int DamageTakenGT(Scriptable* Sender, Trigger* parameters); - //static int DamageTakenLT(Scriptable* Sender, Trigger* parameters); - static int Dead(Scriptable* Sender, Trigger* parameters); - static int Delay(Scriptable* Sender, Trigger* parameters); - static int Detect(Scriptable* Sender, Trigger* parameters); - static int Die(Scriptable* Sender, Trigger* parameters); - static int Died(Scriptable* Sender, Trigger* parameters); - static int Difficulty(Scriptable* Sender, Trigger* parameters); - static int DifficultyGT(Scriptable* Sender, Trigger* parameters); - static int DifficultyLT(Scriptable* Sender, Trigger* parameters); - static int Disarmed(Scriptable* Sender, Trigger* parameters); - static int DisarmFailed(Scriptable* Sender, Trigger* parameters); - static int Entered(Scriptable* Sender, Trigger* parameters); - static int EntirePartyOnMap(Scriptable* Sender, Trigger* parameters); - static int Exists(Scriptable* Sender, Trigger* parameters); - static int ExtendedStateCheck(Scriptable* Sender, Trigger* parameters); - static int ExtraProficiency(Scriptable* Sender, Trigger* parameters); - static int ExtraProficiencyGT(Scriptable* Sender, Trigger* parameters); - static int ExtraProficiencyLT(Scriptable* Sender, Trigger* parameters); - static int Faction(Scriptable* Sender, Trigger* parameters); - static int FallenPaladin(Scriptable* Sender, Trigger* parameters); - static int FallenRanger(Scriptable* Sender, Trigger* parameters); - static int False(Scriptable* Sender, Trigger* parameters); - static int ForceMarkedSpell_Trigger(Scriptable* Sender, Trigger* parameters); - static int Frame(Scriptable* Sender, Trigger* parameters); - static int Gender(Scriptable* Sender, Trigger* parameters); - static int General(Scriptable* Sender, Trigger* parameters); - static int G_Trigger(Scriptable* Sender, Trigger* parameters); - static int Global(Scriptable* Sender, Trigger* parameters); - static int GlobalAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters); - static int GlobalBAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters); - static int GlobalBAndGlobalExact(Scriptable* Sender, Trigger* parameters); - static int GlobalBitGlobal_Trigger(Scriptable* Sender, Trigger* parameters); - static int GlobalGT(Scriptable* Sender, Trigger* parameters); - static int GlobalGTGlobal(Scriptable* Sender, Trigger* parameters); - static int GlobalLT(Scriptable* Sender, Trigger* parameters); - static int GlobalLTGlobal(Scriptable* Sender, Trigger* parameters); - static int GlobalOrGlobal_Trigger(Scriptable* Sender, Trigger* parameters); - static int GlobalsEqual(Scriptable* Sender, Trigger* parameters); - static int GlobalsGT(Scriptable* Sender, Trigger* parameters); - static int GlobalsLT(Scriptable* Sender, Trigger* parameters); - static int GlobalTimerExact(Scriptable* Sender, Trigger* parameters); - static int GlobalTimerExpired(Scriptable* Sender, Trigger* parameters); - static int GlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters); - static int GlobalTimerStarted(Scriptable* Sender, Trigger* parameters); - static int GGT_Trigger(Scriptable* Sender, Trigger* parameters); - static int GLT_Trigger(Scriptable* Sender, Trigger* parameters); - static int Happiness(Scriptable* Sender, Trigger* parameters); - static int HappinessGT(Scriptable* Sender, Trigger* parameters); - static int HappinessLT(Scriptable* Sender, Trigger* parameters); - static int HarmlessEntered(Scriptable* Sender, Trigger* parameters); - static int HasBounceEffects(Scriptable* Sender, Trigger* parameters); - static int HasImmunityEffects(Scriptable* Sender, Trigger* parameters); - static int HasInnateAbility(Scriptable* Sender, Trigger* parameters); - static int HasItem(Scriptable* Sender, Trigger* parameters); - static int HasItemEquipped(Scriptable* Sender, Trigger* parameters); - static int HasItemSlot(Scriptable* Sender, Trigger* parameters); - static int HasItemTypeSlot(Scriptable* Sender, Trigger* parameters); - static int HasWeaponEquipped(Scriptable* Sender, Trigger* parameters); - static int HaveAnySpells(Scriptable* Sender, Trigger* parameters); - static int HaveSpellParty(Scriptable* Sender, Trigger* parameters); - static int HaveSpell(Scriptable* Sender, Trigger* parameters); - static int HaveUsableWeaponEquipped(Scriptable* Sender, Trigger* parameters); - static int Heard(Scriptable* Sender, Trigger* parameters); - static int Help_Trigger(Scriptable* Sender, Trigger* parameters); - static int HelpEX(Scriptable* Sender, Trigger* parameters); - static int HitBy(Scriptable* Sender, Trigger* parameters); - static int HotKey(Scriptable* Sender, Trigger* parameters); - static int HP(Scriptable* Sender, Trigger* parameters); - static int HPGT(Scriptable* Sender, Trigger* parameters); - static int HPLost(Scriptable* Sender, Trigger* parameters); - static int HPLostGT(Scriptable* Sender, Trigger* parameters); - static int HPLostLT(Scriptable* Sender, Trigger* parameters); - static int HPLT(Scriptable* Sender, Trigger* parameters); - static int HPPercent(Scriptable* Sender, Trigger* parameters); - static int HPPercentGT(Scriptable* Sender, Trigger* parameters); - static int HPPercentLT(Scriptable* Sender, Trigger* parameters); - static int InActiveArea(Scriptable* Sender, Trigger* parameter); - static int InCutSceneMode(Scriptable *Sender, Trigger* parameter); - static int InLine(Scriptable* Sender, Trigger* parameter); - static int InMyArea(Scriptable* Sender, Trigger* parameter); - static int InMyGroup(Scriptable* Sender, Trigger* parameter); - static int InParty(Scriptable* Sender, Trigger* parameters); - static int InPartyAllowDead(Scriptable* Sender, Trigger* parameters); - static int InPartySlot(Scriptable* Sender, Trigger* parameters); - static int InteractingWith(Scriptable* Sender, Trigger* parameters); - static int Internal(Scriptable* Sender, Trigger* parameters); - static int InternalGT(Scriptable* Sender, Trigger* parameters); - static int InternalLT(Scriptable* Sender, Trigger* parameters); - static int InTrap(Scriptable* Sender, Trigger* parameters); - static int InventoryFull(Scriptable* Sender, Trigger* parameter); - static int InWeaponRange(Scriptable* Sender, Trigger* parameter); - static int IsAClown(Scriptable* Sender, Trigger* parameters); - static int IsActive(Scriptable* Sender, Trigger* parameters); - static int IsCreatureAreaFlag( Scriptable* Sender, Trigger* parameters); - static int IsCreatureHiddenInShadows( Scriptable* Sender, Trigger* parameters); - static int IsGabber(Scriptable* Sender, Trigger* parameters); - static int IsExtendedNight(Scriptable* Sender, Trigger* parameters); - static int IsFacingObject(Scriptable* Sender, Trigger* parameters); - static int IsFacingSavedRotation(Scriptable* Sender, Trigger* parameters); - static int IsLocked(Scriptable* Sender, Trigger* parameters); - static int IsMarkedSpell(Scriptable* Sender, Trigger* parameters); - static int IsOverMe(Scriptable* Sender, Trigger* parameters); - static int IsPathCriticalObject( Scriptable* Sender, Trigger* parameters); - static int IsPlayerNumber( Scriptable* Sender, Trigger* parameters); - static int IsRotation(Scriptable* Sender, Trigger* parameters); - static int IsSpellTargetValid( Scriptable* Sender, Trigger* parameters); - static int IsTeamBitOn(Scriptable* Sender, Trigger* parameters); - static int IsValidForPartyDialog(Scriptable* Sender, Trigger* parameters); - static int IsWeaponRanged(Scriptable* Sender, Trigger* parameters); - static int IsWeather(Scriptable* Sender, Trigger* parameters); - static int ItemIsIdentified(Scriptable* Sender, Trigger* parameters); - static int Joins(Scriptable* Sender, Trigger* parameters); - static int Kit(Scriptable* Sender, Trigger* parameters); - static int Killed(Scriptable* Sender, Trigger* parameters); - static int KnowSpell(Scriptable* Sender, Trigger* parameters); - static int LastMarkedObject_Trigger(Scriptable* Sender, Trigger* parameters); - static int LastPersonTalkedTo(Scriptable* Sender, Trigger* parameters); - static int Leaves(Scriptable* Sender, Trigger* parameters); - static int Level(Scriptable* Sender, Trigger* parameters); - static int LevelGT(Scriptable* Sender, Trigger* parameters); - static int LevelLT(Scriptable* Sender, Trigger* parameters); - static int LevelInClass(Scriptable* Sender, Trigger* parameters); - static int LevelInClassGT(Scriptable* Sender, Trigger* parameters); - static int LevelInClassLT(Scriptable* Sender, Trigger* parameters); - static int LevelParty(Scriptable* Sender, Trigger* parameters); - static int LevelPartyGT(Scriptable* Sender, Trigger* parameters); - static int LevelPartyLT(Scriptable* Sender, Trigger* parameters); - static int LocalsEqual(Scriptable* Sender, Trigger* parameters); - static int LocalsGT(Scriptable* Sender, Trigger* parameters); - static int LocalsLT(Scriptable* Sender, Trigger* parameters); - static int LOS(Scriptable* Sender, Trigger* parameters); - static int ModalState(Scriptable* Sender, Trigger* parameters); - static int Morale(Scriptable* Sender, Trigger* parameters); - static int MoraleGT(Scriptable* Sender, Trigger* parameters); - static int MoraleLT(Scriptable* Sender, Trigger* parameters); - static int NamelessBitTheDust(Scriptable* Sender, Trigger* parameters); - static int NearbyDialog(Scriptable* Sender, Trigger* parameters); - static int NearLocation(Scriptable* Sender, Trigger* parameters); - static int NearSavedLocation(Scriptable* Sender, Trigger* parameters); - static int NightmareModeOn(Scriptable* Sender, Trigger* parameters); - static int NotStateCheck(Scriptable* Sender, Trigger* parameters); - static int NullDialog(Scriptable* Sender, Trigger* parameters); - static int NumCreatures(Scriptable* Sender, Trigger* parameters); - static int NumCreaturesAtMyLevel(Scriptable* Sender, Trigger* parameters); - static int NumCreaturesGT(Scriptable* Sender, Trigger* parameters); - static int NumCreaturesGTMyLevel(Scriptable* Sender, Trigger* parameters); - static int NumCreaturesLT(Scriptable* Sender, Trigger* parameters); - static int NumCreaturesLTMyLevel(Scriptable* Sender, Trigger* parameters); - static int NumCreatureVsParty(Scriptable* Sender, Trigger* parameters); - static int NumCreatureVsPartyGT(Scriptable* Sender, Trigger* parameters); - static int NumCreatureVsPartyLT(Scriptable* Sender, Trigger* parameters); - static int NumDead(Scriptable* Sender, Trigger* parameters); - static int NumDeadGT(Scriptable* Sender, Trigger* parameters); - static int NumDeadLT(Scriptable* Sender, Trigger* parameters); - static int NumItems(Scriptable* Sender, Trigger* parameters); - static int NumItemsGT(Scriptable* Sender, Trigger* parameters); - static int NumItemsLT(Scriptable* Sender, Trigger* parameters); - static int NumItemsParty(Scriptable* Sender, Trigger* parameters); - static int NumItemsPartyGT(Scriptable* Sender, Trigger* parameters); - static int NumItemsPartyLT(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteracted(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteractedGT(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteractedLT(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteractedObject(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteractedObjectGT(Scriptable* Sender, Trigger* parameters); - static int NumTimesInteractedObjectLT(Scriptable* Sender, Trigger* parameters); - static int NumTimesTalkedTo(Scriptable* Sender, Trigger* parameters); - static int NumTimesTalkedToGT(Scriptable* Sender, Trigger* parameters); - static int NumTimesTalkedToLT(Scriptable* Sender, Trigger* parameters); - static int ObjectActionListEmpty(Scriptable* Sender, Trigger* parameters); - static int OnCreation(Scriptable* Sender, Trigger* parameters); - static int OnIsland(Scriptable* Sender, Trigger* parameters); - static int OnScreen(Scriptable* Sender, Trigger* parameters); - static int Opened(Scriptable* Sender, Trigger* parameters); - static int OpenFailed(Scriptable* Sender, Trigger* parameters); - static int OpenState(Scriptable* Sender, Trigger* parameters); - static int Or(Scriptable* Sender, Trigger* parameters); - static int OutOfAmmo(Scriptable* Sender, Trigger* parameters); - static int OwnsFloaterMessage(Scriptable* Sender, Trigger* parameters); - static int PartyCountEQ(Scriptable* Sender, Trigger* parameters); - static int PartyCountGT(Scriptable* Sender, Trigger* parameters); - static int PartyCountLT(Scriptable* Sender, Trigger* parameters); - static int PartyCountAliveEQ(Scriptable* Sender, Trigger* parameters); - static int PartyCountAliveGT(Scriptable* Sender, Trigger* parameters); - static int PartyCountAliveLT(Scriptable* Sender, Trigger* parameters); - static int PartyGold(Scriptable* Sender, Trigger* parameters); - static int PartyGoldGT(Scriptable* Sender, Trigger* parameters); - static int PartyGoldLT(Scriptable* Sender, Trigger* parameters); - static int PartyHasItem(Scriptable* Sender, Trigger* parameters); - static int PartyHasItemIdentified(Scriptable* Sender, Trigger* parameters); - static int PartyMemberDied(Scriptable* Sender, Trigger* parameters); - static int PartyRested(Scriptable* Sender, Trigger* parameters); - static int PCCanSeePoint(Scriptable* Sender, Trigger* parameters); - static int PCInStore(Scriptable* Sender, Trigger* parameters); - static int PersonalSpaceDistance(Scriptable* Sender, Trigger* parameters); - static int PickLockFailed(Scriptable* Sender, Trigger* parameters); - static int PickpocketFailed(Scriptable* Sender, Trigger* parameters); - static int Proficiency(Scriptable* Sender, Trigger* parameters); - static int ProficiencyGT(Scriptable* Sender, Trigger* parameters); - static int ProficiencyLT(Scriptable* Sender, Trigger* parameters); - static int Race(Scriptable* Sender, Trigger* parameters); - static int RandomNum(Scriptable* Sender, Trigger* parameters); - static int RandomNumGT(Scriptable* Sender, Trigger* parameters); - static int RandomNumLT(Scriptable* Sender, Trigger* parameters); - static int RandomStatCheck(Scriptable* Sender, Trigger* parameters); - static int Range(Scriptable* Sender, Trigger* parameters); - static int Reaction(Scriptable* Sender, Trigger* parameters); - static int ReactionLT(Scriptable* Sender, Trigger* parameters); - static int ReactionGT(Scriptable* Sender, Trigger* parameters); - static int RealGlobalTimerExact(Scriptable* Sender, Trigger* parameters); - static int RealGlobalTimerExpired(Scriptable* Sender, Trigger* parameters); - static int RealGlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters); - static int ReceivedOrder(Scriptable* Sender, Trigger* parameters); - static int Reputation(Scriptable* Sender, Trigger* parameters); - static int ReputationGT(Scriptable* Sender, Trigger* parameters); - static int ReputationLT(Scriptable* Sender, Trigger* parameters); - static int School(Scriptable* Sender, Trigger* parameters); - static int See(Scriptable* Sender, Trigger* parameters); - static int Sequence(Scriptable* Sender, Trigger* parameters); - static int SetLastMarkedObject(Scriptable* Sender, Trigger* parameters); - static int SetMarkedSpell_Trigger(Scriptable* Sender, Trigger* parameters); - static int Specifics(Scriptable* Sender, Trigger* parameters); - static int SpellCast(Scriptable* Sender, Trigger* parameters); - static int SpellCastInnate(Scriptable* Sender, Trigger* parameters); - static int SpellCastOnMe(Scriptable* Sender, Trigger* parameters); - static int SpellCastPriest(Scriptable* Sender, Trigger* parameters); - static int StateCheck(Scriptable* Sender, Trigger* parameters); - static int StealFailed(Scriptable* Sender, Trigger* parameters); - static int StoreHasItem(Scriptable* Sender, Trigger* parameters); - static int StuffGlobalRandom(Scriptable* Sender, Trigger* parameters); - static int SubRace(Scriptable* Sender, Trigger* parameters); - static int SystemVariable_Trigger(Scriptable* Sender, Trigger* parameters); - static int TargetUnreachable(Scriptable* Sender, Trigger* parameters); - static int Team(Scriptable* Sender, Trigger* parameters); - static int Time(Scriptable* Sender, Trigger* parameters); - static int TimeGT(Scriptable* Sender, Trigger* parameters); - static int TimeLT(Scriptable* Sender, Trigger* parameters); - static int TimeOfDay(Scriptable* Sender, Trigger* parameters); - static int TimerActive(Scriptable* Sender, Trigger* parameters); - static int TimerExpired(Scriptable* Sender, Trigger* parameters); - static int TookDamage(Scriptable* Sender, Trigger* parameters); - static int TotalItemCnt(Scriptable* Sender, Trigger* parameters); - static int TotalItemCntExclude(Scriptable* Sender, Trigger* parameters); - static int TotalItemCntExcludeGT(Scriptable* Sender, Trigger* parameters); - static int TotalItemCntExcludeLT(Scriptable* Sender, Trigger* parameters); - static int TotalItemCntGT(Scriptable* Sender, Trigger* parameters); - static int TotalItemCntLT(Scriptable* Sender, Trigger* parameters); - static int TrapTriggered(Scriptable* Sender, Trigger* parameters); - static int TriggerTrigger(Scriptable* Sender, Trigger* parameters); - static int TriggerSetGlobal(Scriptable* Sender, Trigger* parameters); - static int True(Scriptable* Sender, Trigger* parameters); - static int TurnedBy(Scriptable* Sender, Trigger* parameters); - static int Unlocked(Scriptable* Sender, Trigger* parameters); - static int UnselectableVariable(Scriptable* Sender, Trigger* parameters); - static int UnselectableVariableGT(Scriptable* Sender, Trigger* parameters); - static int UnselectableVariableLT(Scriptable* Sender, Trigger* parameters); - static int Unusable(Scriptable* Sender, Trigger* parameters); - static int Vacant(Scriptable* Sender, Trigger* parameters); - static int WalkedToTrigger(Scriptable* Sender, Trigger* parameters); - static int WasInDialog(Scriptable* Sender, Trigger* parameters); - static int Xor(Scriptable* Sender, Trigger* parameters); - static int XP(Scriptable* Sender, Trigger* parameters); - static int XPGT(Scriptable* Sender, Trigger* parameters); - static int XPLT(Scriptable* Sender, Trigger* parameters); -public: - //Actions - static void Activate(Scriptable* Sender, Action* parameters); - static void ActivatePortalCursor(Scriptable* Sender, Action* parameters); - static void AddAreaFlag(Scriptable* Sender, Action* parameters); - static void AddAreaType(Scriptable* Sender, Action* parameters); - static void AddExperienceParty(Scriptable *Sender, Action* parameters); - static void AddExperiencePartyCR(Scriptable *Sender, Action* parameters); - static void AddExperiencePartyGlobal(Scriptable *Sender, Action* parameters); - static void AddFeat(Scriptable *Sender, Action* parameters); - static void AddGlobals(Scriptable* Sender, Action* parameters); - static void AddHP(Scriptable* Sender, Action* parameters); - static void AddJournalEntry(Scriptable* Sender, Action* parameters); - static void AddKit(Scriptable* Sender, Action* parameters); - static void AddMapnote(Scriptable* Sender, Action* parameters); - static void AddSpecialAbility(Scriptable* Sender, Action* parameters); - static void AddSuperKit(Scriptable* Sender, Action* parameters); - static void AddWayPoint(Scriptable* Sender, Action* parameters); - static void AddXP2DA(Scriptable *Sender, Action* parameters); - static void AddXPObject(Scriptable *Sender, Action* parameters); - static void AdvanceTime(Scriptable *Sender, Action* parameters); - static void Ally(Scriptable* Sender, Action* parameters); - static void AmbientActivate(Scriptable* Sender, Action* parameters); - static void AnkhegEmerge(Scriptable* Sender, Action* parameters); - static void AnkhegHide(Scriptable* Sender, Action* parameters); - static void ApplyDamage(Scriptable* Sender, Action* parameters); - static void ApplyDamagePercent(Scriptable* Sender, Action* parameters); - static void ApplySpell(Scriptable* Sender, Action* parameters); - static void ApplySpellPoint(Scriptable* Sender, Action* parameters); - static void AttachTransitionToDoor(Scriptable* Sender, Action* parameters); - static void Attack(Scriptable* Sender, Action* parameters); - static void AttackNoSound(Scriptable* Sender, Action* parameters); - static void AttackOneRound(Scriptable* Sender, Action* parameters); - static void AttackReevaluate(Scriptable* Sender, Action* parameters); - static void BanterBlockFlag(Scriptable* Sender, Action* parameters); - static void BanterBlockTime(Scriptable* Sender, Action* parameters); - static void BashDoor(Scriptable* Sender, Action* parameters); - static void BattleSong(Scriptable* Sender, Action* parameters); - static void Berserk(Scriptable* Sender, Action* parameters); - static void BitClear(Scriptable* Sender, Action* parameters); - static void BitGlobal(Scriptable* Sender, Action* parameters); - static void BreakInstants(Scriptable* Sender, Action* parameters); - static void Calm(Scriptable* Sender, Action* parameters); - static void ChangeAIScript(Scriptable* Sender, Action* parameters); - static void ChangeAIType(Scriptable* Sender, Action* parameters); - static void ChangeAlignment(Scriptable* Sender, Action* parameters); - static void ChangeAllegiance(Scriptable* Sender, Action* parameters); - static void ChangeAnimation(Scriptable* Sender, Action* parameters); - static void ChangeAnimationNoEffect(Scriptable* Sender, Action* parameters); - static void ChangeClass(Scriptable* Sender, Action* parameters); - static void ChangeColor(Scriptable* Sender, Action* parameters); - static void ChangeCurrentScript(Scriptable* Sender, Action* parameters); - static void ChangeDestination(Scriptable* Sender, Action* parameters); - static void ChangeDialogue(Scriptable* Sender, Action* parameters); - static void ChangeGender(Scriptable* Sender, Action* parameters); - static void ChangeGeneral(Scriptable* Sender, Action* parameters); - static void ChangeRace(Scriptable* Sender, Action* parameters); - static void ChangeSpecifics(Scriptable* Sender, Action* parameters); - static void ChangeStat(Scriptable* Sender, Action* parameters); - static void ChangeStatGlobal(Scriptable* Sender, Action* parameters); - static void ChangeStoreMarkup(Scriptable* Sender, Action* parameters); - static void ChangeTileState(Scriptable* Sender, Action* parameters); - static void ClearActions(Scriptable* Sender, Action* parameters); - static void ClearAllActions(Scriptable* Sender, Action* parameters); - static void ClearPartyEffects(Scriptable* Sender, Action* parameters); - static void ClearSpriteEffects(Scriptable* Sender, Action* parameters); - static void ClickLButtonObject(Scriptable* Sender, Action* parameters); - static void ClickLButtonPoint(Scriptable* Sender, Action* parameters); - static void ClickRButtonObject(Scriptable* Sender, Action* parameters); - static void ClickRButtonPoint(Scriptable* Sender, Action* parameters); - static void CloseDoor(Scriptable* Sender, Action* parameters); - static void ContainerEnable(Scriptable* Sender, Action* parameters); - static void Continue(Scriptable* Sender, Action* parameters); - static void CopyGroundPilesTo(Scriptable* Sender, Action* parameters); - static void CreateCreature(Scriptable* Sender, Action* parameters); - static void CreateCreatureAtLocation(Scriptable* Sender, Action* parameters); - static void CreateCreatureAtFeet(Scriptable* Sender, Action* parameters); - static void CreateCreatureCopyPoint(Scriptable* Sender, Action* parameters); - static void CreateCreatureDoor(Scriptable* Sender, Action* parameters); - static void CreateCreatureImpassable(Scriptable* Sender, Action* parameters); - static void CreateCreatureImpassableAllowOverlap(Scriptable* Sender, - Action* parameters); - static void CreateCreatureObject(Scriptable* Sender, Action* parameters); - static void CreateCreatureObjectCopy(Scriptable* Sender, Action* parameters); - static void CreateCreatureObjectDoor(Scriptable* Sender, Action* parameters); - static void CreateCreatureObjectOffset(Scriptable* Sender, Action* parameters); - static void CreateCreatureObjectOffScreen(Scriptable* Sender, Action* parameters); - static void CreateCreatureOffScreen(Scriptable* Sender, Action* parameters); - static void CreateItem(Scriptable* Sender, Action* parameters); - static void CreateItemNumGlobal(Scriptable* Sender, Action* parameters); - static void CreatePartyGold(Scriptable *Sender, Action *parameters); - static void CreateVisualEffect(Scriptable* Sender, Action* parameters); - static void CreateVisualEffectObject(Scriptable* Sender, - Action* parameters); - static void CreateVisualEffectObjectSticky(Scriptable* Sender, - Action* parameters); - static void CutSceneID(Scriptable* Sender, Action* parameters); - static void Damage(Scriptable* Sender, Action* parameters); - static void DayNight(Scriptable *Sender, Action* parameters); - static void Deactivate(Scriptable* Sender, Action* parameters); - static void Debug(Scriptable* Sender, Action* parameters); - static void DemoEnd(Scriptable* Sender, Action* parameters); - static void DestroyAllDestructableEquipment(Scriptable* Sender, - Action* parameters); - static void DestroyAllEquipment(Scriptable* Sender, Action* parameters); - static void DestroyGold(Scriptable* Sender, Action* parameters); - static void DestroyItem(Scriptable* Sender, Action* parameters); - static void DestroyPartyGold(Scriptable* Sender, Action* parameters); - static void DestroyPartyItem(Scriptable* Sender, Action* parameters); - static void DestroyPartyItemNum(Scriptable* Sender, Action* parameters); - static void DestroySelf(Scriptable* Sender, Action* parameters); - static void DetectSecretDoor(Scriptable* Sender, Action* parameters); - static void Dialogue(Scriptable* Sender, Action* parameters); - static void DialogueForceInterrupt(Scriptable* Sender, Action* parameters); - static void DialogueInterrupt(Scriptable* Sender, Action* parameters); - static void DisableFogDither(Scriptable* Sender, Action* parameters); - static void DisableSpriteDither(Scriptable* Sender, Action* parameters); - static void DisplayMessage(Scriptable* Sender, Action* parameters); - static void DisplayString(Scriptable* Sender, Action* parameters); - static void DisplayStringHead(Scriptable* Sender, Action* parameters); - static void DisplayStringHeadOwner(Scriptable* Sender, Action* parameters); - static void DisplayStringNoName(Scriptable* Sender, Action* parameters); - static void DisplayStringNoNameHead(Scriptable* Sender, Action* parameters); - static void DisplayStringWait(Scriptable* Sender, Action* parameters); - static void DoubleClickLButtonObject(Scriptable* Sender, Action* parameters); - static void DoubleClickLButtonPoint(Scriptable* Sender, Action* parameters); - static void DoubleClickRButtonObject(Scriptable* Sender, Action* parameters); - static void DoubleClickRButtonPoint(Scriptable* Sender, Action* parameters); - static void DropInventory(Scriptable* Sender, Action* parameters); - static void DropInventoryEX(Scriptable* Sender, Action* parameters); - static void DropItem(Scriptable* Sender, Action* parameters); - static void EnableFogDither(Scriptable* Sender, Action* parameters); - static void EnablePortalTravel(Scriptable* Sender, Action* parameters); - static void EnableSpriteDither(Scriptable* Sender, Action* parameters); - static void EndCredits(Scriptable* Sender, Action* parameters); - static void EndCutSceneMode(Scriptable* Sender, Action* parameters); - static void Enemy(Scriptable* Sender, Action* parameters); - static void EscapeArea(Scriptable* Sender, Action* parameters); - static void EscapeAreaDestroy(Scriptable* Sender, Action* parameters); - static void EscapeAreaNoSee(Scriptable* Sender, Action* parameters); - static void EscapeAreaObject(Scriptable* Sender, Action* parameters); - static void EscapeAreaObjectNoSee(Scriptable* Sender, Action* parameters); - static void EquipItem(Scriptable *Sender, Action *parameters); - static void EquipMostDamagingMelee(Scriptable *Sender, Action *parameters); - static void EquipRanged(Scriptable *Sender, Action *parameters); - static void EquipWeapon(Scriptable *Sender, Action *parameters); - static void ExitPocketPlane(Scriptable* Sender, Action* parameters); - static void ExpansionEndCredits(Scriptable* Sender, Action* parameters); - static void Explore(Scriptable *Sender, Action *parameters); - static void ExploreMapChunk(Scriptable *Sender, Action *parameters); - static void ExportParty(Scriptable *Sender, Action *parameters); - static void Face(Scriptable* Sender, Action* parameters); - static void FaceObject(Scriptable* Sender, Action* parameters); - static void FaceSavedLocation(Scriptable* Sender, Action* parameters); - static void FadeFromColor(Scriptable* Sender, Action* parameters); - static void FadeToAndFromColor(Scriptable* Sender, Action* parameters); - static void FadeToColor(Scriptable* Sender, Action* parameters); - static void FakeEffectExpiryCheck(Scriptable* Sender, Action* parameters); - static void FillSlot(Scriptable *Sender, Action* parameters); - static void FindTraps(Scriptable* Sender, Action* parameters); - static void FixEngineRoom(Scriptable *Sender, Action* parameters); - static void FloatMessageFixed(Scriptable* Sender, Action* parameters); - static void FloatMessageFixedRnd(Scriptable* Sender, Action* parameters); - static void FloatMessageRnd(Scriptable* Sender, Action* parameters); - static void FloatRebus(Scriptable* Sender, Action* parameters); - static void Follow(Scriptable* Sender, Action* parameters); - static void FollowCreature(Scriptable* Sender, Action* parameters); - static void FollowObjectFormation(Scriptable* Sender, Action* parameters); - static void ForceAIScript(Scriptable* Sender, Action* parameters); - static void ForceAttack(Scriptable* Sender, Action* parameters); - static void ForceFacing(Scriptable* Sender, Action* parameters); - static void ForceHide(Scriptable* Sender, Action* parameters); - static void ForceLeaveAreaLUA(Scriptable* Sender, Action* parameters); - static void ForceMarkedSpell(Scriptable* Sender, Action* parameters); - static void ForceSpell(Scriptable* Sender, Action* parameters); - static void ForceSpellPoint(Scriptable* Sender, Action* parameters); - static void ForceUseContainer(Scriptable* Sender, Action* parameters); - static void Formation(Scriptable* Sender, Action* parameters); - static void FullHeal(Scriptable* Sender, Action* parameters); - static void GenerateMaze(Scriptable* Sender, Action* parameters); - static void GeneratePartyMember(Scriptable* Sender, Action* parameters); - static void GetItem(Scriptable* Sender, Action* parameters); - static void GetStat(Scriptable* Sender, Action* parameters); - static void GiveItem(Scriptable* Sender, Action* parameters); - static void GiveOrder(Scriptable* Sender, Action* parameters); - static void GivePartyAllEquipment(Scriptable* Sender, Action* parameters); - static void GivePartyGold(Scriptable* Sender, Action* parameters); - static void GivePartyGoldGlobal(Scriptable* Sender, Action* parameters); - static void GlobalAddGlobal(Scriptable* Sender, Action* parameters); - static void GlobalAndGlobal(Scriptable* Sender, Action* parameters); - static void GlobalBAnd(Scriptable* Sender, Action* parameters); - static void GlobalBAndGlobal(Scriptable* Sender, Action* parameters); - static void GlobalBitGlobal(Scriptable* Sender, Action* parameters); - static void GlobalBOr(Scriptable* Sender, Action* parameters); - static void GlobalBOrGlobal(Scriptable* Sender, Action* parameters); - static void GlobalMax(Scriptable* Sender, Action* parameters); - static void GlobalMaxGlobal(Scriptable* Sender, Action* parameters); - static void GlobalMin(Scriptable* Sender, Action* parameters); - static void GlobalMinGlobal(Scriptable* Sender, Action* parameters); - static void GlobalOrGlobal(Scriptable* Sender, Action* parameters); - static void GlobalSetGlobal(Scriptable* Sender, Action* parameters); - static void GlobalShL(Scriptable* Sender, Action* parameters); - static void GlobalShLGlobal(Scriptable* Sender, Action* parameters); - static void GlobalShout(Scriptable* Sender, Action* parameters); - static void GlobalShR(Scriptable* Sender, Action* parameters); - static void GlobalShRGlobal(Scriptable* Sender, Action* parameters); - static void GlobalSubGlobal(Scriptable* Sender, Action* parameters); - static void GlobalXor(Scriptable* Sender, Action* parameters); - static void GlobalXorGlobal(Scriptable* Sender, Action* parameters); - static void Help(Scriptable* Sender, Action* parameters); - static void Hide(Scriptable* Sender, Action* parameters); - static void HideAreaOnMap(Scriptable* Sender, Action* parameters); - static void HideCreature(Scriptable* Sender, Action* parameters); - static void HideGUI(Scriptable* Sender, Action* parameters); - static void IncInternal(Scriptable* Sender, Action* parameters); - static void IncMoraleAI(Scriptable* Sender, Action* parameters); - static void IncrementChapter(Scriptable* Sender, Action* parameters); - static void IncrementExtraProficiency(Scriptable* Sender, Action* parameters); - static void IncrementGlobal(Scriptable* Sender, Action* parameters); - static void IncrementGlobalOnce(Scriptable* Sender, Action* parameters); - static void IncrementKillStat(Scriptable* Sender, Action* parameters); - static void IncrementProficiency(Scriptable* Sender, Action* parameters); - static void Interact(Scriptable* Sender, Action* parameters); - static void JoinParty(Scriptable* Sender, Action* parameters); - static void JumpToObject(Scriptable* Sender, Action* parameters); - static void JumpToPoint(Scriptable* Sender, Action* parameters); - static void JumpToPointInstant(Scriptable* Sender, Action* parameters); - static void JumpToSavedLocation(Scriptable* Sender, Action* parameters); - static void Kill(Scriptable* Sender, Action* parameters); - static void KillFloatMessage(Scriptable* Sender, Action* parameters); - static void Leader(Scriptable* Sender, Action* parameters); - static void LeaveArea(Scriptable* Sender, Action* parameters); - static void LeaveAreaLUA(Scriptable* Sender, Action* parameters); - static void LeaveAreaLUAEntry(Scriptable* Sender, Action* parameters); - static void LeaveAreaLUAPanic(Scriptable* Sender, Action* parameters); - static void LeaveAreaLUAPanicEntry(Scriptable* Sender, Action* parameters); - static void LeaveParty(Scriptable* Sender, Action* parameters); - static void Lock(Scriptable* Sender, Action* parameters); - static void LockScroll(Scriptable* Sender, Action* parameters); - static void MakeGlobal(Scriptable* Sender, Action* parameters); - static void MakeUnselectable(Scriptable* Sender, Action* parameters); - static void MarkObject(Scriptable* Sender, Action* parameters); - static void MarkSpellAndObject(Scriptable* Sender, Action* parameters); - static void MatchHP(Scriptable* Sender, Action* parameters); - static void MoraleDec(Scriptable* Sender, Action* parameters); - static void MoraleInc(Scriptable* Sender, Action* parameters); - static void MoraleSet(Scriptable* Sender, Action* parameters); - static void MoveBetweenAreas(Scriptable* Sender, Action* parameters); - static void MoveBetweenAreasEffect(Scriptable* Sender, Action* parameters); - static void MoveCursorPoint(Scriptable* Sender, Action* parameters); - static void MoveGlobal(Scriptable* Sender, Action* parameters); - static void MoveGlobalObject(Scriptable* Sender, Action* parameters); - static void MoveGlobalObjectOffScreen(Scriptable* Sender, Action* parameters); - static void MoveGlobalsTo(Scriptable* Sender, Action* parameters); - static void MoveInventory(Scriptable *Sender, Action* parameters); - static void MoveToCenterOfScreen(Scriptable* Sender, Action* parameters); - static void MoveToExpansion(Scriptable* Sender, Action* parameters); - static void MoveToObject(Scriptable* Sender, Action* parameters); - static void MoveToObjectFollow(Scriptable* Sender, Action* parameters); - static void MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters); - static void MoveToObjectUntilSee(Scriptable* Sender, Action* parameters); - static void MoveToOffset(Scriptable* Sender, Action* parameters); - static void MoveToPoint(Scriptable* Sender, Action* parameters); - static void MoveToPointNoInterrupt(Scriptable* Sender, Action* parameters); - static void MoveToPointNoRecticle(Scriptable* Sender, Action* parameters); - static void MoveToSavedLocation(Scriptable* Sender, Action* parameters); - static void MoveViewPoint(Scriptable* Sender, Action* parameters); - static void MoveViewObject(Scriptable* Sender, Action* parameters); - static void NIDSpecial1(Scriptable* Sender, Action* parameters); - static void NIDSpecial2(Scriptable* Sender, Action* parameters); - static void NoAction(Scriptable* Sender, Action* parameters); - static void NoActionAtAll(Scriptable* Sender, Action* parameters); - static void OpenDoor(Scriptable* Sender, Action* parameters); - static void Panic(Scriptable* Sender, Action* parameters); - static void PauseGame(Scriptable *Sender, Action* parameters); - static void PermanentStatChange(Scriptable* Sender, Action* parameters); - static void PickLock(Scriptable* Sender, Action* parameters); - static void PickPockets(Scriptable* Sender, Action* parameters); - static void PickUpItem(Scriptable* Sender, Action* parameters); - static void PlayBardSong(Scriptable* Sender, Action* parameters); - static void PlayDead(Scriptable* Sender, Action* parameters); - static void PlayDeadInterruptable(Scriptable* Sender, Action* parameters); - static void PlayerDialogue(Scriptable* Sender, Action* parameters); - static void PlaySequence(Scriptable* Sender, Action* parameters); - static void PlaySequenceGlobal(Scriptable* Sender, Action* parameters); - static void PlaySequenceTimed(Scriptable* Sender, Action* parameters); - static void PlaySound(Scriptable* Sender, Action* parameters); - static void PlaySoundNotRanged(Scriptable* Sender, Action* parameters); - static void PlaySoundPoint(Scriptable* Sender, Action* parameters); - static void Plunder(Scriptable* Sender, Action* parameters); - static void Polymorph(Scriptable* Sender, Action* parameters); - static void PolymorphCopy(Scriptable* Sender, Action* parameters); - static void PolymorphCopyBase(Scriptable* Sender, Action* parameters); - static void ProtectObject(Scriptable* Sender, Action* parameters); - static void ProtectPoint(Scriptable* Sender, Action* parameters); - static void QuitGame(Scriptable* Sender, Action* parameters); - static void RandomFly(Scriptable* Sender, Action* parameters); - static void RandomRun(Scriptable* Sender, Action* parameters); - static void RandomTurn(Scriptable* Sender, Action* parameters); - static void RandomWalk(Scriptable* Sender, Action* parameters); - static void RandomWalkContinuous(Scriptable* Sender, Action* parameters); - static void RealSetGlobalTimer(Scriptable* Sender, Action* parameters); - static void ReallyForceSpell(Scriptable* Sender, Action* parameters); - static void ReallyForceSpellDead(Scriptable* Sender, Action* parameters); - static void ReallyForceSpellPoint(Scriptable* Sender, Action* parameters); - static void Recoil(Scriptable* Sender, Action* parameters); - static void RegainPaladinHood(Scriptable* Sender, Action* parameters); - static void RegainRangerHood(Scriptable* Sender, Action* parameters); - static void RemoveAreaFlag(Scriptable* Sender, Action* parameters); - static void RemoveAreaType(Scriptable* Sender, Action* parameters); - static void RemoveJournalEntry(Scriptable* Sender, Action* parameters); - static void RemoveMapnote(Scriptable* Sender, Action* parameters); - static void RemovePaladinHood(Scriptable* Sender, Action* parameters); - static void RemoveRangerHood(Scriptable* Sender, Action* parameters); - static void RemoveSpell(Scriptable* Sender, Action* parameters); - static void RemoveTraps(Scriptable* Sender, Action* parameters); - static void ReputationInc(Scriptable* Sender, Action* parameters); - static void ReputationSet(Scriptable* Sender, Action* parameters); - static void RestorePartyLocation(Scriptable *Sender, Action* parameters); - static void Rest(Scriptable *Sender, Action* parameters); - static void RestNoSpells(Scriptable *Sender, Action* parameters); - static void RestParty(Scriptable *Sender, Action* parameters); - static void RestUntilHealed(Scriptable *Sender, Action* parameters); - static void ReturnToSavedLocation(Scriptable* Sender, Action* parameters); - static void ReturnToSavedLocationDelete(Scriptable* Sender, Action* parameters); - static void RevealAreaOnMap(Scriptable* Sender, Action* parameters); - static void RunAwayFrom(Scriptable* Sender, Action* parameters); - static void RunAwayFromNoInterrupt(Scriptable* Sender, Action* parameters); - static void RunAwayFromNoLeaveArea(Scriptable* Sender, Action* parameters); - static void RunFollow(Scriptable* Sender, Action* parameters); - static void RunningAttack(Scriptable* Sender, Action* parameters); - static void RunningAttackNoSound(Scriptable* Sender, Action* parameters); - static void RunToObject(Scriptable* Sender, Action* parameters); - static void RunToPoint(Scriptable* Sender, Action* parameters); - static void RunToPointNoRecticle(Scriptable* Sender, Action* parameters); - static void RunToSavedLocation(Scriptable* Sender, Action* parameters); - static void SaveGame(Scriptable* Sender, Action* parameters); - static void SaveLocation(Scriptable* Sender, Action* parameters); - static void SaveObjectLocation(Scriptable* Sender, Action* parameters); - static void ScreenShake(Scriptable* Sender, Action* parameters); - static void SelectWeaponAbility(Scriptable* Sender, Action* parameters); - static void SendTrigger(Scriptable* Sender, Action* parameters); - static void SetAnimState(Scriptable* Sender, Action* parameters); - static void SetApparentName(Scriptable* Sender, Action* parameters); - static void SetAreaFlags(Scriptable* Sender, Action* parameters); - static void SetAreaRestFlag(Scriptable* Sender, Action* parameters); - static void SetArmourLevel(Scriptable* Sender, Action* parameters); - static void SetBeenInPartyFlags(Scriptable* Sender, Action* parameters); - static void SetBestWeapon(Scriptable *Sender, Action *parameters); - static void SetCursorState(Scriptable* Sender, Action* parameters); - static void SetCreatureAreaFlag(Scriptable* Sender, Action* parameters); - static void SetCriticalPathObject(Scriptable* Sender, Action* parameters); - static void SetDialogue(Scriptable* Sender, Action* parameters); - static void SetDialogueRange(Scriptable* Sender, Action* parameters); - static void SetDoorFlag(Scriptable* Sender, Action* parameters); - static void SetDoorLocked(Scriptable* Sender, Action* parameters); - static void SetEncounterProbability(Scriptable* Sender, Action* parameters); - static void SetExtendedNight(Scriptable* Sender, Action* parameters); - static void SetFaction(Scriptable* Sender, Action* parameters); - static void SetGabber(Scriptable* Sender, Action* parameters); - static void SetGlobal(Scriptable* Sender, Action* parameters); - static void SetGlobalRandom(Scriptable* Sender, Action* parameters); - static void SetGlobalTimer(Scriptable* Sender, Action* parameters); - static void SetGlobalTimerOnce(Scriptable* Sender, Action* parameters); - static void SetGlobalTimerRandom(Scriptable* Sender, Action* parameters); - static void SetGlobalTint(Scriptable* Sender, Action* parameters); - static void SetHP(Scriptable* Sender, Action* parameters); - static void SetHPPercent(Scriptable* Sender, Action* parameters); - static void SetInternal(Scriptable* Sender, Action* parameters); - static void SetInterrupt(Scriptable* Sender, Action* parameters); - static void SetLeavePartyDialogFile(Scriptable* Sender, Action* parameters); - static void SetMarkedSpell(Scriptable* Sender, Action* parameters); - static void SetMasterArea(Scriptable* Sender, Action* parameters); - static void SetMazeEasier(Scriptable* Sender, Action* parameters); - static void SetMazeHarder(Scriptable* Sender, Action* parameters); - static void SetMoraleAI(Scriptable* Sender, Action* parameters); - static void SetMusic(Scriptable* Sender, Action* parameters); - static void SetNamelessClass(Scriptable* Sender, Action* parameters); - static void SetNamelessDeath(Scriptable* Sender, Action* parameters); - static void SetNamelessDisguise(Scriptable* Sender, Action* parameters); - static void SetNoOneOnTrigger(Scriptable* Sender, Action* parameters); - static void SetNumTimesTalkedTo(Scriptable* Sender, Action* parameters); - static void SetPlayerSound(Scriptable* Sender, Action* parameters); - static void SetQuestDone(Scriptable* Sender, Action* parameters); - static void SetRegularName(Scriptable* Sender, Action* parameters); - static void SetRestEncounterChance(Scriptable* Sender, Action* parameters); - static void SetRestEncounterProbabilityDay(Scriptable* Sender, Action* parameters); - static void SetRestEncounterProbabilityNight(Scriptable* Sender, Action* parameters); - static void SetSavedLocation(Scriptable* Sender, Action* parameters); - static void SetSavedLocationPoint(Scriptable* Sender, Action* parameters); - static void SetScriptName(Scriptable* Sender, Action* parameters); - static void SetSelection(Scriptable* Sender, Action* parameters); - static void SetStartPos(Scriptable* Sender, Action* parameters); - static void SetTeam(Scriptable* Sender, Action* parameters); - static void SetTeamBit(Scriptable* Sender, Action* parameters); - static void SetTextColor(Scriptable* Sender, Action* parameters); - static void SetToken(Scriptable* Sender, Action* parameters); - static void SetToken2DA(Scriptable* Sender, Action* parameters); - static void SetTokenGlobal(Scriptable* Sender, Action* parameters); - static void SetTokenObject(Scriptable* Sender, Action* parameters); - static void SetTrackString(Scriptable* Sender, Action* parameters); - static void SetupWish(Scriptable* Sender, Action* parameters); - static void SetupWishObject(Scriptable* Sender, Action* parameters); - static void SetVisualRange(Scriptable* Sender, Action* parameters); - static void SG(Scriptable* Sender, Action* parameters); - static void Shout(Scriptable* Sender, Action* parameters); - static void SmallWait(Scriptable* Sender, Action* parameters); - static void SmallWaitRandom(Scriptable* Sender, Action* parameters); - static void SoundActivate(Scriptable* Sender, Action* parameters); - static void SpawnPtActivate(Scriptable* Sender, Action* parameters); - static void SpawnPtDeactivate(Scriptable* Sender, Action* parameters); - static void SpawnPtSpawn(Scriptable* Sender, Action* parameters); - static void Spell(Scriptable* Sender, Action* parameters); - static void SpellCastEffect(Scriptable* Sender, Action* parameters); - static void SpellHitEffectPoint(Scriptable* Sender, Action* parameters); - static void SpellHitEffectSprite(Scriptable* Sender, Action* parameters); - static void SpellNoDec(Scriptable* Sender, Action* parameters); - static void SpellPoint(Scriptable* Sender, Action* parameters); - static void SpellPointNoDec(Scriptable* Sender, Action* parameters); - static void StartCombatCounter(Scriptable* Sender, Action* parameters); - static void StartCutScene(Scriptable* Sender, Action* parameters); - static void StartCutSceneMode(Scriptable* Sender, Action* parameters); - static void StartDialogue(Scriptable* Sender, Action* parameters); - static void StartDialogueInterrupt(Scriptable* Sender, Action* parameters); - static void StartDialogueNoSet(Scriptable* Sender, Action* parameters); - static void StartDialogueNoSetInterrupt(Scriptable* Sender, - Action* parameters); - static void StartDialogueOverride(Scriptable* Sender, Action* parameters); - static void StartDialogueOverrideInterrupt(Scriptable* Sender, - Action* parameters); - static void StartMovie(Scriptable* Sender, Action* parameters); - static void StartMusic(Scriptable* Sender, Action* parameters); - static void StartRainNow(Scriptable* Sender, Action* parameters); - static void StartRandomTimer(Scriptable* Sender, Action* parameters); - static void StartSong(Scriptable* Sender, Action* parameters); - static void StartStore(Scriptable* Sender, Action* parameters); - static void StartTimer(Scriptable* Sender, Action* parameters); - static void StateOverrideFlag(Scriptable* Sender, Action* parameters); - static void StateOverrideTime(Scriptable* Sender, Action* parameters); - static void StaticPalette(Scriptable* Sender, Action* parameters); - static void StaticStart(Scriptable* Sender, Action* parameters); - static void StaticStop(Scriptable* Sender, Action* parameters); - static void StopMoving(Scriptable* Sender, Action* parameters); - static void StorePartyLocation(Scriptable *Sender, Action* parameters); - static void Swing(Scriptable* Sender, Action* parameters); - static void SwingOnce(Scriptable* Sender, Action* parameters); - static void TakeItemList(Scriptable* Sender, Action* parameters); - static void TakeItemListParty(Scriptable* Sender, Action* parameters); - static void TakeItemListPartyNum(Scriptable* Sender, Action* parameters); - static void TakeItemReplace(Scriptable* Sender, Action* parameters); - static void TakePartyGold(Scriptable* Sender, Action* parameters); - static void TakePartyItem(Scriptable* Sender, Action* parameters); - static void TakePartyItemAll(Scriptable* Sender, Action* parameters); - static void TakePartyItemNum(Scriptable* Sender, Action* parameters); - static void TakePartyItemRange(Scriptable* Sender, Action* parameters); - static void TeleportParty(Scriptable* Sender, Action* parameters); - static void TextScreen(Scriptable* Sender, Action* parameters); - static void ToggleDoor(Scriptable* Sender, Action* parameters); - static void TimedMoveToPoint(Scriptable* Sender, Action* parameters); - static void TransformItem(Scriptable* Sender, Action* parameters); - static void TransformItemAll(Scriptable* Sender, Action* parameters); - static void TransformPartyItem(Scriptable* Sender, Action* parameters); - static void TransformPartyItemAll(Scriptable* Sender, Action* parameters); - static void TriggerActivation(Scriptable* Sender, Action* parameters); - static void Turn(Scriptable* Sender, Action* parameters); - static void TurnAMT(Scriptable* Sender, Action* parameters); - static void UndoExplore(Scriptable *Sender, Action *parameters); - static void UnhideGUI(Scriptable* Sender, Action* parameters); - static void Unlock(Scriptable* Sender, Action* parameters); - static void UnlockScroll(Scriptable* Sender, Action* parameters); - static void UseContainer(Scriptable* Sender, Action* parameters); - static void UseDoor(Scriptable* Sender, Action* parameters); - static void UseItem(Scriptable* Sender, Action* parameters); - static void UseItemPoint(Scriptable* Sender, Action* parameters); - static void VerbalConstant(Scriptable* Sender, Action* parameters); - static void VerbalConstantHead(Scriptable* Sender, Action* parameters); - static void Wait(Scriptable* Sender, Action* parameters); - static void WaitAnimation(Scriptable* Sender, Action* parameters); - static void WaitRandom(Scriptable* Sender, Action* parameters); - static void Weather(Scriptable* Sender, Action* parameters); - static void XEquipItem(Scriptable *Sender, Action *parameters); -public: - //Objects - static Targets *BestAC(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *EighthNearest(Scriptable *Sender, Targets *parameter, int ga_flagss); - static Targets *EighthNearestDoor(Scriptable *Sender, Targets *parameter, int ga_flagss); - static Targets *EighthNearestEnemyOf(Scriptable *Sender, Targets *parameter, int ga_flagss); - static Targets *EighthNearestEnemyOfType(Scriptable *Sender, Targets *parameter, int ga_flagss); - static Targets *EighthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Farthest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FarthestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FifthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FifthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FifthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FifthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FifthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FourthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FourthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FourthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FourthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *FourthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Gabber(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *GroupOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastAttackerOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastCommandedBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastHeardBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastHelp(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastHitter(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastMarkedObject(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastSeenBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastSummonerOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastTalkedToBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastTargetedBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LastTrigger(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LeaderOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *LeastDamagedOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *MostDamagedOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Myself(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *MyTarget(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Nearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestEnemySummoned(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NearestPC(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NinthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NinthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NinthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NinthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *NinthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Nothing(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player1(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player1Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player2(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player2Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player3(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player3Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player4(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player4Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player5(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player5Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player6(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player6Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Protagonist(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ProtectedBy(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ProtectorOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SecondNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SecondNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SecondNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SecondNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SecondNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SelectedCharacter(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SeventhNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SeventhNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SeventhNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SeventhNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SeventhNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SixthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SixthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SixthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SixthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *SixthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *StrongestOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *StrongestOfMale(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *TenthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *TenthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *TenthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *TenthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *TenthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ThirdNearest(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ThirdNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ThirdNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ThirdNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *ThirdNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *WeakestOf(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *WorstAC(Scriptable *Sender, Targets *parameters, int ga_flags); - -public: - /*GemRB extensions/actions*/ - static void RunAwayFromPoint(Scriptable* Sender, Action* parameters); - static void UnMakeGlobal(Scriptable* Sender, Action* parameters); - static void UnloadArea(Scriptable* Sender, Action* parameters); - - /*GemRB extensions/objects*/ - static Targets *Player7(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player7Fill(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player8(Scriptable *Sender, Targets *parameters, int ga_flags); - static Targets *Player8Fill(Scriptable *Sender, Targets *parameters, int ga_flags); -}; - -GEM_EXPORT Action* GenerateAction(char* String); -Action* GenerateActionDirect(char* String, Scriptable *object); -GEM_EXPORT Trigger* GenerateTrigger(char* String); - -void InitializeIEScript(); - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp deleted file mode 100644 index 78ddc6a91..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp +++ /dev/null @@ -1,674 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2005 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/Matching.h" - -#include "GameScript/GSUtils.h" - -#include "Interface.h" -#include "Game.h" -#include "Map.h" -#include "TileMap.h" -#include "Scriptable/Container.h" -#include "Scriptable/Door.h" -#include "Scriptable/InfoPoint.h" - -/* return a Targets object with a single scriptable inside */ -static inline Targets* ReturnScriptableAsTarget(Scriptable *sc) -{ - if (!sc) return NULL; - Targets *tgts = new Targets(); - tgts->AddTarget(sc, 0, 0); - return tgts; -} - -/* do IDS filtering: [PC], [ENEMY], etc */ -static inline bool DoObjectIDSCheck(Object *oC, Actor *ac, bool *filtered) { - for (int j = 0; j < ObjectIDSCount; j++) { - if (!oC->objectFields[j]) { - continue; - } - *filtered = true; - IDSFunction func = idtargets[j]; - if (!func) { - printMessage("GameScript", "Unimplemented IDS targeting opcode: %d\n", YELLOW, j); - continue; - } - if (!func( ac, oC->objectFields[j] ) ) { - return false; - } - } - return true; -} - -/* do object filtering: Myself, LastAttackerOf(Player1), etc */ -static inline Targets *DoObjectFiltering(Scriptable *Sender, Targets *tgts, Object *oC, int ga_flags) { - for (int i = 0; i < MaxObjectNesting; i++) { - int filterid = oC->objectFilters[i]; - if (!filterid) break; - - ObjectFunction func = objects[filterid]; - if (!func) { - printMessage("GameScript", "Unknown object filter: %d %s\n", YELLOW, - filterid, objectsTable->GetValue(filterid)); - continue; - } - - tgts = func(Sender, tgts, ga_flags); - if (!tgts->Count()) { - delete tgts; - return NULL; - } - } - return tgts; -} - -static EffectRef fx_protection_creature_ref = { "Protection:Creature", -1 }; - -static inline bool DoObjectChecks(Map *map, Scriptable *Sender, Actor *target, int &dist, bool ignoreinvis=false) -{ - dist = SquaredMapDistance(Sender, target); - - // TODO: what do we check for non-actors? - // non-actors have a visual range (15), we should do visual range and LOS - - if (Sender->Type == ST_ACTOR) { - Actor *source = (Actor *)Sender; - - // Detect() ignores invisibility completely - if (!ignoreinvis) { - // TODO: move this stuff into a shared function so it can be used elsewhere? - - // SEEINVISIBLE skips these checks :-) - if (source->Modified[IE_SEEINVISIBLE] == 0) { - ieDword state = target->Modified[IE_STATE_ID]; - // check for invisibility - if ((state & STATE_INVISIBLE) != 0) return false; - // check for improved invisibility? probably not - //if ((state & STATE_INVIS2) != 0) return false; - } - - // maybe this should be setting an invis flag? - // TODO: should SEEINVISIBLE ignore this? Detect()? - if (target->Modified[IE_AVATARREMOVAL]) return false; - } - - // visual range check - int visualrange = source->Modified[IE_VISUALRANGE]; - if (dist > visualrange*visualrange) return false; - - // LOS check - if (!map->IsVisible(Sender->Pos, target->Pos)) return false; - - // protection against creature - if (target->fxqueue.HasEffect(fx_protection_creature_ref)) { - // TODO: de-hardcode these (may not all be correct anyway) - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 2, source->Modified[IE_EA])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 3, source->Modified[IE_GENERAL])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 4, source->Modified[IE_RACE])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 5, source->Modified[IE_CLASS])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 6, source->Modified[IE_SPECIFIC])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 7, source->Modified[IE_SEX])) return false; - if (target->fxqueue.HasEffectWithParamPair(fx_protection_creature_ref, 8, source->Modified[IE_ALIGNMENT])) return false; - } - } - return true; -} - -/* returns actors that match the [x.y.z] expression */ -static Targets* EvaluateObject(Map *map, Scriptable* Sender, Object* oC, int ga_flags) -{ - // if you ActionOverride a global actor, they might not have a map :( - // TODO: don't allow this to happen? - if (!map) { - return NULL; - } - - if (oC->objectName[0]) { - //We want the object by its name... (doors/triggers don't play here!) - Actor* aC = map->GetActor( oC->objectName, ga_flags ); - - /*if (!aC && (ga_flags&GA_GLOBAL) ) { - aC = FindActorNearby(oC->objectName, map, ga_flags ); - }*/ - - //return here because object name/IDS targeting are mutually exclusive - return ReturnScriptableAsTarget(aC); - } - - if (oC->objectFields[0]==-1) { - // this is an internal hack, allowing us to pass actor ids around as objects - Actor* aC = map->GetActorByGlobalID( (ieDword) oC->objectFields[1] ); - if (aC) { - if (!aC->ValidTarget(ga_flags)) { - return NULL; - } - return ReturnScriptableAsTarget(aC); - } - Door *door = map->GetDoorByGlobalID( (ieDword) oC->objectFields[1]); - if (door) { - return ReturnScriptableAsTarget(door); - } - - Container* cont = map->GetContainerByGlobalID((ieDword) oC->objectFields[1]); - if (cont) { - return ReturnScriptableAsTarget(cont); - } - - InfoPoint* trap = map->GetInfoPointByGlobalID((ieDword) oC->objectFields[1]); - if (trap) { - return ReturnScriptableAsTarget(trap); - } - - return NULL; - } - - Targets *tgts = NULL; - - //we need to get a subset of actors from the large array - //if this gets slow, we will need some index tables - int i = map->GetActorCount(true); - while (i--) { - Actor *ac = map->GetActor(i, true); - if (!ac) continue; // is this check really needed? - // don't return Sender in IDS targeting! - if (ac == Sender) continue; - bool filtered = false; - if (DoObjectIDSCheck(oC, ac, &filtered)) { - if (!filtered) { - // if no filters were applied.. - assert(!tgts); - return NULL; - } - int dist; - if (DoObjectChecks(map, Sender, ac, dist, (ga_flags & GA_DETECT) != 0)) { - if (!tgts) tgts = new Targets(); - tgts->AddTarget((Scriptable *) ac, dist, ga_flags); - } - } - } - - return tgts; -} - -Targets* GetAllObjects(Map *map, Scriptable* Sender, Object* oC, int ga_flags) -{ - if (!oC) { - return NULL; - } - Targets* tgts = EvaluateObject(map, Sender, oC, ga_flags); - //if we couldn't find an endpoint by name or object qualifiers - //it is not an Actor, but could still be a Door or Container (scriptable) - if (!tgts && oC->objectName[0]) { - return NULL; - } - //now lets do the object filter stuff, we create Targets because - //it is possible to start from blank sheets using endpoint filters - //like (Myself, Protagonist etc) - if (!tgts) { - tgts = new Targets(); - } - tgts = DoObjectFiltering(Sender, tgts, oC, ga_flags); - return tgts; -} - -Targets *GetAllActors(Scriptable *Sender, int ga_flags) -{ - Map *map = Sender->GetCurrentArea(); - - int i = map->GetActorCount(true); - Targets *tgts = new Targets(); - while (i--) { - Actor *ac = map->GetActor(i,true); - int dist = Distance(Sender->Pos, ac->Pos); - tgts->AddTarget((Scriptable *) ac, dist, ga_flags); - } - return tgts; -} - -/* get a non-actor object from a map, by name */ -Scriptable *GetActorObject(TileMap *TMap, const char *name) -{ - Scriptable * aC = TMap->GetDoor( name ); - if (aC) { - return aC; - } - - //containers should have a precedence over infopoints because otherwise - //AR1512 sanity test quest would fail - //If this order couldn't be maintained, then 'Contains' should have a - //unique call to get containers only - - //No... it was not an door... maybe a Container? - aC = TMap->GetContainer( name ); - if (aC) { - return aC; - } - - //No... it was not a container ... maybe an InfoPoint? - aC = TMap->GetInfoPoint( name ); - if (aC) { - return aC; - } - return aC; -} - -// blocking actions need to store some kinds of objects between ticks -Scriptable* GetStoredActorFromObject(Scriptable* Sender, Object* oC, int ga_flags) -{ - Scriptable *tar = NULL; - // retrieve an existing target if it still exists and is valid - if (Sender->CurrentActionTarget) { - tar = core->GetGame()->GetActorByGlobalID(Sender->CurrentActionTarget); - if (tar) { - // always an actor, check if it satisfies flags - if (((Actor *)tar)->ValidTarget(ga_flags)) { - return tar; - } - } - return NULL; // target invalid/gone - } - tar = GetActorFromObject(Sender, oC, ga_flags); - // maybe store the target if it's an actor.. - if (tar && tar->Type == ST_ACTOR) { - // .. but we only want objects created via objectFilters - if (oC->objectFilters[0]) { - Sender->CurrentActionTarget = tar->GetGlobalID(); - } - } - return tar; -} - -Scriptable* GetActorFromObject(Scriptable* Sender, Object* oC, int ga_flags) -{ - Scriptable *aC = NULL; - - if (!oC) { - return NULL; - } - Game *game = core->GetGame(); - Targets *tgts = GetAllObjects(Sender->GetCurrentArea(), Sender, oC, ga_flags); - if (tgts) { - //now this could return other than actor objects - aC = tgts->GetTarget(0,-1); - delete tgts; - if (aC || oC->objectFields[0]!=-1) { - return aC; - } - - //global actors are always found by object ID! - return game->GetGlobalActorByGlobalID(oC->objectFields[1]); - } - - if (oC->objectName[0]) { - // if you ActionOverride a global actor, they might not have a map :( - // TODO: don't allow this to happen? - if (Sender->GetCurrentArea()) { - aC = GetActorObject(Sender->GetCurrentArea()->GetTileMap(), oC->objectName ); - if (aC) { - return aC; - } - } - - //global actors are always found by scripting name! - aC = game->FindPC(oC->objectName); - if (aC) { - return aC; - } - aC = game->FindNPC(oC->objectName); - if (aC) { - return aC; - } - } - return NULL; -} - -bool MatchActor(Scriptable *Sender, ieDword actorID, Object* oC) -{ - if (!Sender) { - return false; - } - Actor *ac = Sender->GetCurrentArea()->GetActorByGlobalID(actorID); - if (!ac) { - return false; - } - - // [0]/[ANYONE] can match all actors - if (!oC) { - return true; - } - - bool filtered = false; - - // name matching - if (oC->objectName[0]) { - if (strnicmp(ac->GetScriptName(), oC->objectName, 32) != 0) { - return false; - } - filtered = true; - } - - // IDS targeting - // (if we already matched by name, we don't do this) - // TODO: check distance? area? visibility? - if (!filtered && !DoObjectIDSCheck(oC, ac, &filtered)) return false; - - // globalID hack should never get here - assert(oC->objectFilters[0] != -1); - - // object filters - if (oC->objectFilters[0]) { - // object filters insist on having a stupid targets list, - // so we waste a lot of time here - Targets *tgts = new Targets(); - int ga_flags = 0; // TODO: correct? - - // handle already-filtered vs not-yet-filtered cases - // e.g. LastTalkedToBy(Myself) vs LastTalkedToBy - if (filtered) tgts->AddTarget(ac, 0, ga_flags); - - tgts = DoObjectFiltering(Sender, tgts, oC, ga_flags); - if (!tgts) return false; - - // and sometimes object filters are lazy and not only don't filter - // what we give them, they clear it and return a list :( - // so we have to search the whole list.. - bool ret = false; - targetlist::iterator m; - const targettype *tt = tgts->GetFirstTarget(m, ST_ACTOR); - while (tt) { - Actor *actor = (Actor *) tt->actor; - if (actor->GetGlobalID() == actorID) { - ret = true; - break; - } - tt = tgts->GetNextTarget(m, ST_ACTOR); - } - delete tgts; - if (!ret) return false; - } - return true; -} - -int GetObjectCount(Scriptable* Sender, Object* oC) -{ - if (!oC) { - return 0; - } - // EvaluateObject will return [PC] - // GetAllObjects will also return Myself (evaluates object filters) - // i believe we need the latter here - Targets* tgts = GetAllObjects(Sender->GetCurrentArea(), Sender, oC, 0); - int count = tgts->Count(); - delete tgts; - return count; -} - -//TODO: -//check numcreaturesatmylevel(myself, 1) -//when the actor is alone -//it should (obviously) return true if the trigger -//evaluates object filters -//also check numcreaturesgtmylevel(myself,0) with -//actor having at high level -int GetObjectLevelCount(Scriptable* Sender, Object* oC) -{ - if (!oC) { - return 0; - } - // EvaluateObject will return [PC] - // GetAllObjects will also return Myself (evaluates object filters) - // i believe we need the latter here - Targets* tgts = GetAllObjects(Sender->GetCurrentArea(), Sender, oC, 0); - int count = 0; - if (tgts) { - targetlist::iterator m; - const targettype *tt = tgts->GetFirstTarget(m, ST_ACTOR); - while (tt) { - count += ((Actor *) tt->actor)->GetXPLevel(true); - tt = tgts->GetNextTarget(m, ST_ACTOR); - } - } - delete tgts; - return count; -} - -Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters, int ga_flags) -{ - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTarget); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *XthNearestDoor(Targets *parameters, unsigned int count) -{ - //get the origin - Scriptable *origin = parameters->GetTarget(0, -1); - parameters->Clear(); - if (!origin) { - return parameters; - } - //get the doors based on it - Map *map = origin->GetCurrentArea(); - unsigned int i =(unsigned int) map->TMap->GetDoorCount(); - if (count>i) { - return parameters; - } - while (i--) { - Door *door = map->TMap->GetDoor(i); - unsigned int dist = Distance(origin->Pos, door->Pos); - parameters->AddTarget(door, dist, 0); - } - - //now get the xth door - origin = parameters->GetTarget(count, ST_DOOR); - parameters->Clear(); - if (!origin) { - return parameters; - } - parameters->AddTarget(origin, 0, 0); - return parameters; -} - -Targets *XthNearestOf(Targets *parameters, int count, int ga_flags) -{ - Scriptable *origin; - - if (count<0) { - const targettype *t = parameters->GetLastTarget(ST_ACTOR); - origin = t->actor; - } else { - origin = parameters->GetTarget(count, ST_ACTOR); - } - parameters->Clear(); - if (!origin) { - return parameters; - } - parameters->AddTarget(origin, 0, ga_flags); - return parameters; -} - -//mygroup means the same specifics as origin -Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags) -{ - if (origin->Type != ST_ACTOR) { - parameters->Clear(); - return parameters; - } - - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Actor *actor = (Actor *) origin; - //determining the specifics of origin - ieDword type = actor->GetStat(IE_SPECIFIC); //my group - - while ( t ) { - if (t->actor->Type!=ST_ACTOR) { - t=parameters->RemoveTargetAt(m); - continue; - } - Actor *actor = (Actor *) (t->actor); - if (actor->GetStat(IE_SPECIFIC) != type) { - t=parameters->RemoveTargetAt(m); - continue; - } - t = parameters->GetNextTarget(m, ST_ACTOR); - } - return XthNearestOf(parameters,count, ga_flags); -} - -Targets *ClosestEnemySummoned(Scriptable *origin, Targets *parameters, int ga_flags) -{ - if (origin->Type != ST_ACTOR) { - parameters->Clear(); - return parameters; - } - - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Actor *actor = (Actor *) origin; - //determining the allegiance of the origin - int type = GetGroup(actor); - - if (type==2) { - parameters->Clear(); - return parameters; - } - - actor = NULL; - while ( t ) { - Actor *tmp = (Actor *) (t->actor); - if (tmp->GetStat(IE_SEX) != SEX_SUMMON) { - continue; - } - if (type) { //origin is PC - if (tmp->GetStat(IE_EA) <= EA_GOODCUTOFF) { - continue; - } - } else { - if (tmp->GetStat(IE_EA) >= EA_EVILCUTOFF) { - continue; - } - } - actor = tmp; - t = parameters->GetNextTarget(m, ST_ACTOR); - } - parameters->Clear(); - parameters->AddTarget(actor, 0, ga_flags); - return parameters; -} - -Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags) -{ - if (origin->Type != ST_ACTOR) { - parameters->Clear(); - return parameters; - } - - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Actor *actor = (Actor *) origin; - //determining the allegiance of the origin - int type = GetGroup(actor); - - if (type==2) { - parameters->Clear(); - return parameters; - } - - while ( t ) { - if (t->actor->Type!=ST_ACTOR) { - t=parameters->RemoveTargetAt(m); - continue; - } - Actor *actor = (Actor *) (t->actor); - // IDS targeting already did object checks (unless we need to override Detect?) - if (type) { //origin is PC - if (actor->GetStat(IE_EA) <= EA_GOODCUTOFF) { - t=parameters->RemoveTargetAt(m); - continue; - } - } else { - if (actor->GetStat(IE_EA) >= EA_EVILCUTOFF) { - t=parameters->RemoveTargetAt(m); - continue; - } - } - t = parameters->GetNextTarget(m, ST_ACTOR); - } - return XthNearestOf(parameters,count, ga_flags); -} - -Targets *XthNearestEnemyOf(Targets *parameters, int count, int ga_flags) -{ - Actor *origin = (Actor *) parameters->GetTarget(0, ST_ACTOR); - parameters->Clear(); - if (!origin) { - return parameters; - } - //determining the allegiance of the origin - int type = GetGroup(origin); - - if (type==2) { - return parameters; - } - Map *map = origin->GetCurrentArea(); - int i = map->GetActorCount(true); - Actor *ac; - while (i--) { - ac=map->GetActor(i,true); - int distance; - //int distance = Distance(ac, origin); - // TODO: if it turns out you need to check Sender here, beware you take the right distance! - // (n the original games, this is only used for NearestEnemyOf(Player1) in obsgolem.bcs) - if (!DoObjectChecks(map, origin, ac, distance)) continue; - if (type) { //origin is PC - if (ac->GetStat(IE_EA) >= EA_EVILCUTOFF) { - parameters->AddTarget(ac, distance, ga_flags); - } - } - else { - if (ac->GetStat(IE_EA) <= EA_GOODCUTOFF) { - parameters->AddTarget(ac, distance, ga_flags); - } - } - } - return XthNearestOf(parameters,count, ga_flags); -} - diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h deleted file mode 100644 index f069d6bb9..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h +++ /dev/null @@ -1,49 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ -#ifndef MATCHING_H -#define MATCHING_H - -#include "GameScript/GameScript.h" - -#include "exports.h" - -class TileMap; - -GEM_EXPORT Targets* GetAllObjects(Map *map, Scriptable* Sender, Object* oC, int ga_flags); -Targets* GetAllActors(Scriptable* Sender, int ga_flags); -Scriptable* GetActorFromObject(Scriptable* Sender, Object* oC, int ga_flags = 0); -Scriptable* GetStoredActorFromObject(Scriptable* Sender, Object* oC, int ga_flags = 0); -Scriptable *GetActorObject(TileMap *TMap, const char *name); - -Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters, int ga_flags); -Targets *XthNearestOf(Targets *parameters, int count, int ga_flags); -Targets *XthNearestDoor(Targets *parameters, unsigned int count); -Targets *XthNearestEnemyOf(Targets *parameters, int count, int ga_flags); -Targets *ClosestEnemySummoned(Scriptable *origin, Targets *parameters, int ga_flags); -Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags); -Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags); - -/* returns true if actor matches the object specs. */ -bool MatchActor(Scriptable *Sender, ieDword ID, Object* oC); -/* returns the number of actors matching the IDS targeting */ -int GetObjectCount(Scriptable* Sender, Object* oC); -int GetObjectLevelCount(Scriptable* Sender, Object* oC); - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp deleted file mode 100644 index 05beeba7f..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp +++ /dev/null @@ -1,1164 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/GameScript.h" - -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" - -#include "win32def.h" - -#include "DialogHandler.h" -#include "Game.h" -#include "GUI/GameControl.h" - -//------------------------------------------------------------- -// Object Functions -//------------------------------------------------------------- - -//in this implementation, Myself will drop the parameter array -//i think all object filters could be expected to do so -//they should remove unnecessary elements from the parameters -Targets *GameScript::Myself(Scriptable* Sender, Targets* parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(Sender, 0, ga_flags); - return parameters; -} - -Targets *GameScript::NearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 0); -} - -Targets *GameScript::SecondNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 1); -} - -Targets *GameScript::ThirdNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 2); -} - -Targets *GameScript::FourthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 3); -} - -Targets *GameScript::FifthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 4); -} - -Targets *GameScript::SixthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 5); -} - -Targets *GameScript::SeventhNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 6); -} - -Targets *GameScript::EighthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 7); -} - -Targets *GameScript::NinthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 8); -} - -Targets *GameScript::TenthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) -{ - return XthNearestDoor(parameters, 9); -} - -//in bg2 it is same as player1 so far -//in iwd2 this is the Gabber!!! -//but also, if there is no gabber, it is the first PC -//probably it is simply the nearest exportable character... -Targets *GameScript::Protagonist(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - //this sucks but IWD2 is like that... - static bool charnameisgabber = core->HasFeature(GF_CHARNAMEISGABBER); - if (charnameisgabber) { - GameControl* gc = core->GetGameControl(); - if (gc) { - parameters->AddTarget(gc->dialoghandler->GetSpeaker(), 0, ga_flags); - } - if (parameters->Count()) { - return parameters; - } - //ok, this will return the nearest PC in the first slot - Game *game = core->GetGame(); - int i = game->GetPartySize(false); - while(i--) { - Actor *target = game->GetPC(i,false); - parameters->AddTarget(target, Distance(Sender, target), ga_flags); - } - return parameters; - } - parameters->AddTarget(core->GetGame()->GetPC(0, false), 0, ga_flags); - return parameters; -} - -//last talker -Targets *GameScript::Gabber(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - GameControl* gc = core->GetGameControl(); - if (gc) { - parameters->AddTarget(gc->dialoghandler->GetSpeaker(), 0, ga_flags); - } - return parameters; -} - -Targets *GameScript::LastTrigger(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - if (Sender->LastTrigger) { - Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); - parameters->AddTarget(target, 0, ga_flags); - } - return parameters; -} - -Targets *GameScript::LastMarkedObject(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastMarked); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -//actions should always use LastMarkedObject, because LastSeen could be deleted -Targets *GameScript::LastSeenBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastSeen); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastHelp(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHelp); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastHeardBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHeard); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -//i was told that Group means the same specifics, so this is just an -//object selector for everyone with the same specifics as the current object -Targets *GameScript::GroupOf(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - ieDword tmp = actor->GetStat(IE_SPECIFIC); - Map *cm = Sender->GetCurrentArea(); - int i = cm->GetActorCount(true); - while (i--) { - Actor *target=cm->GetActor(i,true); - if (target && (target->GetStat(IE_SPECIFIC)==tmp) ) { - parameters->AddTarget(target, 0, ga_flags); - } - } - } - return parameters; -} - -/*this one is tough, but done */ -Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - /*if (actor) { - ieWord tmp = actor->LastProtected; - Map *cm = Sender->GetCurrentArea(); - int i = cm->GetActorCount(true); - while (i--) { - Actor *target=cm->GetActor(i,true); - if (target && (target->LastProtected ==tmp) ) { - parameters->AddTarget(target, 0, ga_flags); - } - } - }*/ - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtector); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::ProtectedBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtectee); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastCommandedBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastCommander); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -// this is essentially a LastTargetedBy(0) - or MySelf -// but IWD2 defines it -Targets *GameScript::MyTarget(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - return GetMyTarget(Sender, NULL, parameters, ga_flags); -} - -Targets *GameScript::LastTargetedBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - return GetMyTarget(Sender, actor, parameters, ga_flags); -} - -Targets *GameScript::LastAttackerOf(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastAttacker); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastHitter(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHitter); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LeaderOf(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastFollowed); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastTalkedToBy(Scriptable *Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTalker); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::LastSummonerOf(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastSummoner); - if (target) { - parameters->AddTarget(target, 0, ga_flags); - } - } - return parameters; -} - -Targets *GameScript::Player1(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(0,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player1Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(1), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player2(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(1,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player2Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(2), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player3(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(2,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player3Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(3), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player4(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(3,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player4Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(4), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player5(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(4,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player5Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(5), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player6(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(5,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player6Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(6), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player7(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(6,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player7Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(7), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player8(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(7,false), 0, ga_flags); - return parameters; -} - -Targets *GameScript::Player8Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(8), 0, ga_flags); - return parameters; -} - -Targets *GameScript::BestAC(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr=t->actor; - Actor *actor=(Actor *) scr; - int bestac=actor->GetStat(IE_ARMORCLASS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int ac=actor->GetStat(IE_ARMORCLASS); - if (bestacactor; - } - } - - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} - -/*no idea why this object exists since the gender could be filtered easier*/ -Targets *GameScript::StrongestOfMale(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - int pos=-1; - int worsthp=-1; - Scriptable *scr = NULL; - //assignment intentional - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - Actor *actor = (Actor *) t->actor; - if (actor->GetStat(IE_SEX)!=SEX_MALE) continue; - int hp=actor->GetStat(IE_HITPOINTS); - if ((pos==-1) || (worsthpactor; - } - } - parameters->Clear(); - if (scr) { - parameters->AddTarget(scr, 0, ga_flags); - } - return parameters; -} - -Targets *GameScript::StrongestOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr=t->actor; - Actor *actor=(Actor *) scr; - int besthp=actor->GetStat(IE_HITPOINTS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int hp=actor->GetStat(IE_HITPOINTS); - if (besthpactor; - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} - -Targets *GameScript::WeakestOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr=t->actor; - Actor *actor=(Actor *) scr; - int worsthp=actor->GetStat(IE_HITPOINTS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int hp=actor->GetStat(IE_HITPOINTS); - if (worsthp>hp) { - worsthp=hp; - scr=t->actor; - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} - -Targets *GameScript::WorstAC(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr=t->actor; - Actor *actor=(Actor *) scr; - int worstac=actor->GetStat(IE_ARMORCLASS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int ac=actor->GetStat(IE_ARMORCLASS); - if (worstac>ac) { - worstac=ac; - scr=t->actor; - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} - -Targets *GameScript::MostDamagedOf(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - //Original engines restrict this to the PCs... - /*targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr = t->actor; - Actor *actor=(Actor *) scr; - int worsthp=actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int hp=actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (worsthp>hp) { - worsthp=hp; - scr=t->actor; - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters;*/ - Map* area = Sender->GetCurrentArea() ; - Game *game = core->GetGame(); - Scriptable* scr = NULL ; - int worsthp = 0xffff ; - int i = game->GetPartySize(false); - while (i--) { - Actor *actor = game->GetPC(i, false); - if(actor->GetCurrentArea() == area) { - int hp=actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (worsthp>hp) { - worsthp=hp; - scr=actor; - } - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} -Targets *GameScript::LeastDamagedOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - targetlist::iterator m; - const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); - if (!t) { - return parameters; - } - Scriptable *scr = t->actor; - Actor *actor = (Actor *) scr; - int besthp=actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - // assignment in while - while ( (t = parameters->GetNextTarget(m, ST_ACTOR) ) ) { - actor = (Actor *) t->actor; - int hp=actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (besthpactor; - } - } - parameters->Clear(); - parameters->AddTarget(scr, 0, ga_flags); - return parameters; -} - -Targets *GameScript::Farthest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - const targettype *t = parameters->GetLastTarget(ST_ACTOR); - parameters->Clear(); - if (t) { - parameters->AddTarget(t->actor, 0, ga_flags); - } - return parameters; -} - -Targets *GameScript::FarthestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, -1, ga_flags); -} - -Targets *GameScript::NearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 0, ga_flags); -} - -Targets *GameScript::SecondNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 1, ga_flags); -} - -Targets *GameScript::ThirdNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 2, ga_flags); -} - -Targets *GameScript::FourthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 3, ga_flags); -} - -Targets *GameScript::FifthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 4, ga_flags); -} - -Targets *GameScript::SixthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 5, ga_flags); -} - -Targets *GameScript::SeventhNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 6, ga_flags); -} - -Targets *GameScript::EighthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 7, ga_flags); -} - -Targets *GameScript::NinthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 8, ga_flags); -} - -Targets *GameScript::TenthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOf(parameters, 9, ga_flags); -} - -Targets *GameScript::NearestEnemySummoned(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return ClosestEnemySummoned(Sender, parameters, ga_flags); -} - -Targets *GameScript::NearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 0, ga_flags); -} - -Targets *GameScript::SecondNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 1, ga_flags); -} - -Targets *GameScript::ThirdNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 2, ga_flags); -} - -Targets *GameScript::FourthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 3, ga_flags); -} - -Targets *GameScript::FifthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 4, ga_flags); -} - -Targets *GameScript::SixthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 5, ga_flags); -} - -Targets *GameScript::SeventhNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 6, ga_flags); -} - -Targets *GameScript::EighthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 7, ga_flags); -} - -Targets *GameScript::NinthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 8, ga_flags); -} - -Targets *GameScript::TenthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestEnemyOfType(Sender, parameters, 9, ga_flags); -} - -Targets *GameScript::NearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 0, ga_flags); -} - -Targets *GameScript::SecondNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 1, ga_flags); -} - -Targets *GameScript::ThirdNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 2, ga_flags); -} - -Targets *GameScript::FourthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 3, ga_flags); -} - -Targets *GameScript::FifthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 4, ga_flags); -} - -Targets *GameScript::SixthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 5, ga_flags); -} - -Targets *GameScript::SeventhNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 6, ga_flags); -} - -Targets *GameScript::EighthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 7, ga_flags); -} - -Targets *GameScript::NinthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 8, ga_flags); -} - -Targets *GameScript::TenthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - return XthNearestMyGroupOfType(Sender, parameters, 9, ga_flags); -} - -/* returns only living PC's? if not, alter getpartysize/getpc flag*/ -Targets *GameScript::NearestPC(Scriptable* Sender, Targets *parameters, int ga_flags) -{ - parameters->Clear(); - Map *map = Sender->GetCurrentArea(); - Game *game = core->GetGame(); - int i = game->GetPartySize(true); - int mindist = -1; - Actor *ac = NULL; - while (i--) { - Actor *newactor=game->GetPC(i,true); - //NearestPC for PC's will not give themselves as a result - //this might be different from the original engine - if ((Sender->Type==ST_ACTOR) && (newactor == (Actor *) Sender)) { - continue; - } - if (newactor->GetCurrentArea()!=map) { - continue; - } - int dist = Distance(Sender, newactor); - if ( (mindist == -1) || (distAddTarget(ac, 0, ga_flags); - } - return parameters; -} - -Targets *GameScript::Nearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 0, ga_flags); -} - -Targets *GameScript::SecondNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 1, ga_flags); -} - -Targets *GameScript::ThirdNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 2, ga_flags); -} - -Targets *GameScript::FourthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 3, ga_flags); -} - -Targets *GameScript::FifthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 4, ga_flags); -} - -Targets *GameScript::SixthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 5, ga_flags); -} - -Targets *GameScript::SeventhNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 6, ga_flags); -} - -Targets *GameScript::EighthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 7, ga_flags); -} - -Targets *GameScript::NinthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 8, ga_flags); -} - -Targets *GameScript::TenthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) -{ - return XthNearestOf(parameters, 9, ga_flags); -} - -Targets *GameScript::SelectedCharacter(Scriptable* Sender, Targets* parameters, int ga_flags) -{ - Map *cm = Sender->GetCurrentArea(); - parameters->Clear(); - int i = cm->GetActorCount(true); - while (i--) { - Actor *ac=cm->GetActor(i,true); - if (ac->GetCurrentArea()!=cm) { - continue; - } - if (ac->IsSelected()) { - parameters->AddTarget(ac, Distance(Sender, ac), ga_flags ); - } - } - return parameters; -} - -Targets *GameScript::Nothing(Scriptable* /*Sender*/, Targets* parameters, int /*ga_flags*/) -{ - parameters->Clear(); - return parameters; -} - -//------------------------------------------------------------- -// IDS Functions -//------------------------------------------------------------- - -int GameScript::ID_Alignment(Actor *actor, int parameter) -{ - int value = actor->GetStat( IE_ALIGNMENT ); - int a = parameter&15; - if (a) { - if (a != ( value & 15 )) { - return 0; - } - } - a = parameter & 240; - if (a) { - if (a != ( value & 240 )) { - return 0; - } - } - return 1; -} - -int GameScript::ID_Allegiance(Actor *actor, int parameter) -{ - int value = actor->GetStat( IE_EA ); - switch (parameter) { - case EA_GOODCUTOFF: - return value <= EA_GOODCUTOFF; - - case EA_NOTGOOD: - return value >= EA_NOTGOOD; - - case EA_NOTNEUTRAL: - return value >=EA_EVILCUTOFF || value <= EA_GOODCUTOFF; - - case EA_NOTEVIL: - return value <= EA_NOTEVIL; - - case EA_EVILCUTOFF: - return value >= EA_EVILCUTOFF; - - case 0: - case EA_ANYTHING: - return true; - - } - //default - return parameter == value; -} - -// *_ALL constants are different in iwd2 due to different classes (see note below) -// bard, cleric, druid, fighter, mage, paladin, ranger, thief -static const int all_bg_classes[] = { 206, 204, 208, 203, 202, 207, 209, 205 }; -static const int all_iwd2_classes[] = { 202, 203, 204, 205, 209, 206, 207, 208 }; - -// Dual-classed characters will detect only as their new class until their -// original class is re-activated, when they will detect as a multi-class -// GetClassLevel takes care of this automatically! -inline bool idclass(Actor *actor, int parameter, bool iwd2) { - int value = 0; - if (parameter < 202 || parameter > 209) { - value = actor->GetStat(IE_CLASS); - return parameter==value; - } - - const int *classes; - if (iwd2) { - classes = all_iwd2_classes; - } else { - classes = all_bg_classes; - } - - // we got one of the *_ALL values - if (parameter == classes[4]) { - // MAGE_ALL (also sorcerers) - value = actor->GetMageLevel() + actor->GetSorcererLevel(); - } else if (parameter == classes[3]) { - // FIGHTER_ALL (also monks) - value = actor->GetFighterLevel() + actor->GetMonkLevel(); - } else if (parameter == classes[1]) { - // CLERIC_ALL - value = actor->GetClericLevel(); - } else if (parameter == classes[7]) { - // THIEF_ALL - value = actor->GetThiefLevel(); - } else if (parameter == classes[0]) { - // BARD_ALL - value = actor->GetBardLevel(); - } else if (parameter == classes[5]) { - // PALADIN_ALL - value = actor->GetPaladinLevel(); - } else if (parameter == classes[2]) { - // DRUID_ALL - value = actor->GetDruidLevel(); - } else if (parameter == classes[6]) { - // RANGER_ALL - value = actor->GetRangerLevel(); - } - return value > 0; -} - -int GameScript::ID_Class(Actor *actor, int parameter) -{ - if (core->HasFeature(GF_3ED_RULES)) { - //iwd2 has different values, see also the note for AVClass - return idclass(actor, parameter, 1); - } - return idclass(actor, parameter, 0); -} - -// IE_CLASS holds only one class, not a bitmask like with iwd2 kits. The ids values -// are friendly to binary comparison, so we just need to build such a class value -int GameScript::ID_ClassMask(Actor *actor, int parameter) -{ - // maybe we're lucky... - int value = actor->GetStat(IE_CLASS); - if (parameter&(1<<(value-1))) return 1; - - // otherwise iterate over all the classes - value = actor->GetClassMask(); - - if (parameter&value) return 1; - return 0; -} - -// this is only present in iwd2 -// the function is identical to ID_Class, but uses the class20 IDS, -// iwd2's class.ids is different than the rest, while class20 is identical (remnant) -int GameScript::ID_AVClass(Actor *actor, int parameter) -{ - return idclass(actor, parameter, 0); -} - -int GameScript::ID_Race(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_RACE); - return parameter==value; -} - -int GameScript::ID_Subrace(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_SUBRACE); - return parameter==value; -} - -int GameScript::ID_Faction(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_FACTION); - return parameter==value; -} - -int GameScript::ID_Team(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_TEAM); - return parameter==value; -} - -int GameScript::ID_Gender(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_SEX); - return parameter==value; -} - -int GameScript::ID_General(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_GENERAL); - return parameter==value; -} - -int GameScript::ID_Specific(Actor *actor, int parameter) -{ - int value = actor->GetStat(IE_SPECIFIC); - return parameter==value; -} diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp deleted file mode 100644 index 4f8f79e1e..000000000 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp +++ /dev/null @@ -1,4105 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2005 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GameScript/GameScript.h" - -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" - -#include "win32def.h" - -#include "Calendar.h" -#include "DialogHandler.h" -#include "Game.h" -#include "GameData.h" -#include "Polygon.h" -#include "Video.h" -#include "GUI/GameControl.h" -#include "math.h" //needs for acos -#include "Scriptable/Container.h" -#include "Scriptable/Door.h" -#include "Scriptable/InfoPoint.h" - -//------------------------------------------------------------- -// Trigger Functions -//------------------------------------------------------------- -int GameScript::BreakingPoint(Scriptable* Sender, Trigger* /*parameters*/) -{ - int value=GetHappiness(Sender, core->GetGame()->Reputation ); - return value < -300; -} - -int GameScript::Reaction(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - parameters->Dump(); - return 0; - } - int value = GetReaction(((Actor*) scr), Sender); - return value == parameters->int0Parameter; -} - -int GameScript::ReactionGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - parameters->Dump(); - return 0; - } - int value = GetReaction(((Actor*) scr), Sender); - return value > parameters->int0Parameter; -} - -int GameScript::ReactionLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - parameters->Dump(); - return 0; - } - int value = GetReaction(((Actor*) scr), Sender); - return value < parameters->int0Parameter; -} - -int GameScript::Happiness(Scriptable* Sender, Trigger* parameters) -{ - int value=GetHappiness(Sender, core->GetGame()->Reputation ); - return value == parameters->int0Parameter; -} - -int GameScript::HappinessGT(Scriptable* Sender, Trigger* parameters) -{ - int value=GetHappiness(Sender, core->GetGame()->Reputation ); - return value > parameters->int0Parameter; -} - -int GameScript::HappinessLT(Scriptable* Sender, Trigger* parameters) -{ - int value=GetHappiness(Sender, core->GetGame()->Reputation ); - return value < parameters->int0Parameter; -} - -int GameScript::Reputation(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->Reputation/10 == (ieDword) parameters->int0Parameter; -} - -int GameScript::ReputationGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->Reputation/10 > (ieDword) parameters->int0Parameter; -} - -int GameScript::ReputationLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->Reputation/10 < (ieDword) parameters->int0Parameter; -} - -int GameScript::Alignment(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return ID_Alignment( actor, parameters->int0Parameter); -} - -int GameScript::Allegiance(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return ID_Allegiance( actor, parameters->int0Parameter); -} - -//should return *_ALL stuff -int GameScript::Class(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - return ID_Class( actor, parameters->int0Parameter); -} - -int GameScript::ClassEx(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - return ID_AVClass( actor, parameters->int0Parameter); -} - -int GameScript::Faction(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - return ID_Faction( actor, parameters->int0Parameter); -} - -int GameScript::Team(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - return ID_Team( actor, parameters->int0Parameter); -} - -int GameScript::SubRace(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - //subrace trigger uses a weird system, cannot use ID_* - //return ID_Subrace( actor, parameters->int0Parameter); - int value = actor->GetStat(IE_SUBRACE); - if (value) { - value |= actor->GetStat(IE_RACE)<<16; - } - if (value == parameters->int0Parameter) { - return 1; - } - return 0; -} - -//if object parameter is given (gemrb) it is used -//otherwise it works on the current object (iwd2) -int GameScript::IsTeamBitOn(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = Sender; - if (parameters->objectParameter) { - scr = GetActorFromObject( Sender, parameters->objectParameter ); - } - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = (Actor*)scr; - if (actor->GetStat(IE_TEAM) & parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::NearbyDialog(Scriptable* Sender, Trigger* parameters) -{ - Actor *target = Sender->GetCurrentArea()->GetActorByDialog(parameters->string0Parameter); - if ( !target ) { - return 0; - } - return CanSee( Sender, target, true, GA_NO_DEAD | GA_NO_HIDDEN ); -} - -//atm this checks for InParty and See, it is unsure what is required -int GameScript::IsValidForPartyDialog(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor *target = (Actor *) scr; - //inparty returns -1 if not in party - if (core->GetGame()->InParty( target )<0) { - return 0; - } - //don't accept parties currently in dialog! - //this might disturb some modders, but this is the correct behaviour - //for example the aaquatah dialog in irenicus dungeon depends on it - GameControl *gc = core->GetGameControl(); - Actor *pc = (Actor *) scr; - if (pc->GetGlobalID() == gc->dialoghandler->targetID || pc->GetGlobalID()==gc->dialoghandler->speakerID) { - return 0; - } - - //don't accept parties with the no interrupt flag - //this fixes bug #2573808 on gamescript level - //(still someone has to turn the no interrupt flag off) - if(!pc->GetDialog(GD_CHECK)) { - return 0; - } - return CanSee( Sender, target, false, GA_NO_DEAD ); -} - -int GameScript::InParty(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr; - - if (parameters->objectParameter) { - scr = GetActorFromObject( Sender, parameters->objectParameter ); - } else { - scr = Sender; - } - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - Actor *tar = (Actor *) scr; - if (core->GetGame()->InParty( tar ) <0) { - return 0; - } - //don't allow dead, don't allow maze and similar effects - if (tar->ValidTarget(GA_NO_DEAD|GA_NO_HIDDEN)) { - return 1; - } - return 0; -} - -int GameScript::InPartyAllowDead(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr; - - if (parameters->objectParameter) { - scr = GetActorFromObject( Sender, parameters->objectParameter ); - } else { - scr = Sender; - } - if (!scr || scr->Type != ST_ACTOR) { - return 0; - } - return core->GetGame()->InParty( ( Actor * ) scr ) >= 0 ? 1 : 0; -} - -int GameScript::InPartySlot(Scriptable* Sender, Trigger* parameters) -{ - Actor *actor = core->GetGame()->GetPC(parameters->int0Parameter, false); - return MatchActor(Sender, actor->GetGlobalID(), parameters->objectParameter); -} - -int GameScript::Exists(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - return 1; -} - -int GameScript::IsAClown(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type!=ST_ACTOR) { - return 0; - } - return 1; -} - -int GameScript::IsGabber(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type!=ST_ACTOR) { - return 0; - } - if (scr->GetGlobalID() == core->GetGameControl()->dialoghandler->speakerID) - return 1; - return 0; -} - -int GameScript::IsActive(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->GetInternalFlag()&IF_ACTIVE) { - return 1; - } - return 0; -} - -int GameScript::InTrap(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->GetInternalFlag()&IF_INTRAP) { - return 1; - } - return 0; -} - -/* checks if targeted actor is in the specified region - GemRB allows different regions, referenced by int0Parameter - The polygons are stored in island.2da files */ -int GameScript::OnIsland(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - Gem_Polygon *p = GetPolygon2DA(parameters->int0Parameter); - if (!p) { - return 0; - } - return p->PointIn(scr->Pos); -} - -int GameScript::School(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = (Actor *) scr; - //only the low 2 bytes count - //the School values start from 1 to 9 and the first school value is 0x40 - //so this mild hack will do - if ( actor->GetStat(IE_KIT) == (ieDword) (0x20<int0Parameter)) { - return 1; - } - return 0; -} - -int GameScript::Kit(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = (Actor *) scr; - - ieDword kit = actor->GetStat(IE_KIT); - //TODO: fix baseclass / barbarian confusion - - //IWD2 style kit matching (also used for mage schools) - if (kit == (ieDword) (parameters->int0Parameter)) { - return 1; - } - //BG2 style kit matching (not needed anymore?), we do it on load - //kit = (kit>>16)|(kit<<16); - if ( kit == (ieDword) (parameters->int0Parameter)) { - return 1; - } - return 0; -} - -int GameScript::General(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if (actor == NULL) { - return 0; - } - return ID_General(actor, parameters->int0Parameter); -} - -int GameScript::Specifics(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if (actor == NULL) { - return 0; - } - return ID_Specific(actor, parameters->int0Parameter); -} - -int GameScript::BitCheck(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if ( value & parameters->int0Parameter ) return 1; - } - return 0; -} - -int GameScript::BitCheckExact(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDword tmp = (ieDword) parameters->int0Parameter ; - if ((value & tmp) == tmp) return 1; - } - return 0; -} - -//BM_OR would make sense only if this trigger changes the value of the variable -//should I do that??? -int GameScript::BitGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - HandleBitMod(value, parameters->int0Parameter, parameters->int1Parameter); - if (value!=0) return 1; - } - return 0; -} - -int GameScript::GlobalOrGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if ( value1 ) return 1; - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - if ( value2 ) return 1; - } - } - return 0; -} - -int GameScript::GlobalAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter, &valid ); - if (valid && value1) { - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter, &valid ); - if (valid && value2) return 1; - } - return 0; -} - -int GameScript::GlobalBAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - if ((value1& value2 ) != 0) return 1; - } - } - return 0; -} - -int GameScript::GlobalBAndGlobalExact(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - if (( value1& value2 ) == value2) return 1; - } - } - return 0; -} - -int GameScript::GlobalBitGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - HandleBitMod( value1, value2, parameters->int1Parameter); - if (value1!=0) return 1; - } - } - return 0; -} - -//no what exactly this trigger would do, defined in iwd2, but never used -//i just assume it sets a global in the trigger block -int GameScript::TriggerSetGlobal(Scriptable* Sender, Trigger* parameters) -{ - SetVariable( Sender, parameters->string0Parameter, parameters->int0Parameter ); - return 1; -} - -//would this function also alter the variable? -int GameScript::Xor(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if (( value ^ parameters->int0Parameter ) != 0) return 1; - } - return 0; -} - -//TODO: -//no sprite is dead for iwd, they use KILL__CNT -int GameScript::NumDead(Scriptable* Sender, Trigger* parameters) -{ - ieDword value; - - if (core->HasFeature(GF_HAS_KAPUTZ) ) { - value = CheckVariable(Sender, parameters->string0Parameter, "KAPUTZ"); - } else { - ieVariable VariableName; - snprintf(VariableName, 32, core->GetDeathVarFormat(), parameters->string0Parameter); - value = CheckVariable(Sender, VariableName, "GLOBAL" ); - } - return ( value == (ieDword) parameters->int0Parameter ); -} - -int GameScript::NumDeadGT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value; - - if (core->HasFeature(GF_HAS_KAPUTZ) ) { - value = CheckVariable(Sender, parameters->string0Parameter, "KAPUTZ"); - } else { - ieVariable VariableName; - snprintf(VariableName, 32, core->GetDeathVarFormat(), parameters->string0Parameter); - value = CheckVariable(Sender, VariableName, "GLOBAL" ); - } - return ( value > (ieDword) parameters->int0Parameter ); -} - -int GameScript::NumDeadLT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value; - - if (core->HasFeature(GF_HAS_KAPUTZ) ) { - value = CheckVariable(Sender, parameters->string0Parameter, "KAPUTZ"); - } else { - ieVariable VariableName; - - snprintf(VariableName, 32, core->GetDeathVarFormat(), parameters->string0Parameter); - value = CheckVariable(Sender, VariableName, "GLOBAL" ); - } - return ( value < (ieDword) parameters->int0Parameter ); -} - -int GameScript::G_Trigger(Scriptable* Sender, Trigger* parameters) -{ - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter, "GLOBAL" ); - return ( value == parameters->int0Parameter ); -} - -int GameScript::Global(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if ( value == parameters->int0Parameter ) return 1; - } - return 0; -} - -int GameScript::GLT_Trigger(Scriptable* Sender, Trigger* parameters) -{ - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter,"GLOBAL" ); - return ( value < parameters->int0Parameter ); -} - -int GameScript::GlobalLT(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if ( value < parameters->int0Parameter ) return 1; - } - return 0; -} - -int GameScript::GGT_Trigger(Scriptable* Sender, Trigger* parameters) -{ - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter, "GLOBAL" ); - return ( value > parameters->int0Parameter ); -} - -int GameScript::GlobalGT(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDwordSigned value = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - if ( value > parameters->int0Parameter ) return 1; - } - return 0; -} - -int GameScript::GlobalLTGlobal(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDwordSigned value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDwordSigned value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - if ( value1 < value2 ) return 1; - } - } - return 0; -} - -int GameScript::GlobalGTGlobal(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDwordSigned value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); - if (valid) { - ieDwordSigned value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); - if (valid) { - if ( value1 > value2 ) return 1; - } - } - return 0; -} - -int GameScript::GlobalsEqual(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "GLOBAL" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "GLOBAL" ); - return ( value1 == value2 ); -} - -int GameScript::GlobalsGT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "GLOBAL" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "GLOBAL" ); - return ( value1 > value2 ); -} - -int GameScript::GlobalsLT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "GLOBAL" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "GLOBAL" ); - return ( value1 < value2 ); -} - -int GameScript::LocalsEqual(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "LOCALS" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "LOCALS" ); - return ( value1 == value2 ); -} - -int GameScript::LocalsGT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "LOCALS" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "LOCALS" ); - return ( value1 > value2 ); -} - -int GameScript::LocalsLT(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, "LOCALS" ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, "LOCALS" ); - return ( value1 < value2 ); -} - -int GameScript::RealGlobalTimerExact(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - ieDword value2 = core->GetGame()->RealTime; - if ( value1 == value2 ) return 1; - } - return 0; -} - -int GameScript::RealGlobalTimerExpired(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - if ( value1 < core->GetGame()->RealTime ) return 1; - } - return 0; -} - -int GameScript::RealGlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - if ( value1 > core->GetGame()->RealTime ) return 1; - } - return 0; -} - -int GameScript::GlobalTimerExact(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid) { - if ( value1 == core->GetGame()->GameTime ) return 1; - } - return 0; -} - -int GameScript::GlobalTimerExpired(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - if ( value1 < core->GetGame()->GameTime ) return 1; - } - return 0; -} - -//globaltimernotexpired returns false if the timer doesn't exist -int GameScript::GlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - if ( value1 > core->GetGame()->GameTime ) return 1; - } - return 0; -} - -//globaltimerstarted returns false if the timer doesn't exist -//is it the same as globaltimernotexpired? -int GameScript::GlobalTimerStarted(Scriptable* Sender, Trigger* parameters) -{ - bool valid=true; - - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); - if (valid && value1) { - if ( value1 > core->GetGame()->GameTime ) return 1; - } - return 0; -} - -int GameScript::WasInDialog(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_wasindialog); -} - -int GameScript::OnCreation(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_oncreation); -} - -int GameScript::NumItemsParty(Scriptable* /*Sender*/, Trigger* parameters) -{ - int cnt = 0; - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - cnt+=actor->inventory.CountItems(parameters->string0Parameter,1); - } - return cnt==parameters->int0Parameter; -} - -int GameScript::NumItemsPartyGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - int cnt = 0; - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - cnt+=actor->inventory.CountItems(parameters->string0Parameter,1); - } - return cnt>parameters->int0Parameter; -} - -int GameScript::NumItemsPartyLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - int cnt = 0; - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - cnt+=actor->inventory.CountItems(parameters->string0Parameter,1); - } - return cntint0Parameter; -} - -int GameScript::NumItems(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - - Inventory *inv = NULL; - switch (tar->Type) { - case ST_ACTOR: - inv = &(((Actor *) tar)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) tar)->inventory); - break; - default:; - } - if (!inv) { - return 0; - } - - int cnt = inv->CountItems(parameters->string0Parameter,1); - return cnt==parameters->int0Parameter; -} - -int GameScript::TotalItemCnt(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1); //shall we count heaps or not? - return cnt==parameters->int0Parameter; -} - -int GameScript::TotalItemCntExclude(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1)-actor->inventory.CountItems(parameters->string0Parameter,1); //shall we count heaps or not? - return cnt==parameters->int0Parameter; -} - -int GameScript::NumItemsGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - - Inventory *inv = NULL; - switch (tar->Type) { - case ST_ACTOR: - inv = &(((Actor *) tar)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) tar)->inventory); - break; - default:; - } - if (!inv) { - return 0; - } - - int cnt = inv->CountItems(parameters->string0Parameter,1); - return cnt>parameters->int0Parameter; -} - -int GameScript::TotalItemCntGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1); //shall we count heaps or not? - return cnt>parameters->int0Parameter; -} - -int GameScript::TotalItemCntExcludeGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1)-actor->inventory.CountItems(parameters->string0Parameter,1); //shall we count heaps or not? - return cnt>parameters->int0Parameter; -} - -int GameScript::NumItemsLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - - Inventory *inv = NULL; - switch (tar->Type) { - case ST_ACTOR: - inv = &(((Actor *) tar)->inventory); - break; - case ST_CONTAINER: - inv = &(((Container *) tar)->inventory); - break; - default:; - } - if (!inv) { - return 0; - } - - int cnt = inv->CountItems(parameters->string0Parameter,1); - return cntint0Parameter; -} - -int GameScript::TotalItemCntLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1); //shall we count heaps or not? - return cntint0Parameter; -} - -int GameScript::TotalItemCntExcludeLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - int cnt = actor->inventory.CountItems("",1)-actor->inventory.CountItems(parameters->string0Parameter,1); //shall we count heaps or not? - return cntint0Parameter; -} - -//the int0 parameter is an addition, normally it is 0 -int GameScript::Contains(Scriptable* Sender, Trigger* parameters) -{ -//actually this should be a container - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !tar || tar->Type!=ST_CONTAINER) { - return 0; - } - Container *cnt = (Container *) tar; - if (HasItemCore(&cnt->inventory, parameters->string0Parameter, parameters->int0Parameter) ) { - return 1; - } - return 0; -} - -int GameScript::StoreHasItem(Scriptable* /*Sender*/, Trigger* parameters) -{ - return StoreHasItemCore(parameters->string0Parameter, parameters->string1Parameter); -} - -//the int0 parameter is an addition, normally it is 0 -int GameScript::HasItem(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !scr ) { - return 0; - } - Inventory *inventory; - switch (scr->Type) { - case ST_ACTOR: - inventory = &( (Actor *) scr)->inventory; - break; - case ST_CONTAINER: - inventory = &( (Container *) scr)->inventory; - break; - default: - inventory = NULL; - break; - } - if (inventory && HasItemCore(inventory, parameters->string0Parameter, parameters->int0Parameter) ) { - return 1; - } - return 0; -} - -int GameScript::ItemIsIdentified(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) scr; - if (HasItemCore(&actor->inventory, parameters->string0Parameter, IE_INV_ITEM_IDENTIFIED) ) { - return 1; - } - return 0; -} - -/** if the string is zero, then it will return true if there is any item in the slot (BG2)*/ -/** if the string is non-zero, it will return true, if the given item was in the slot (IWD2)*/ -int GameScript::HasItemSlot(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) scr; - //this might require a conversion of the slots - if (actor->inventory.HasItemInSlot(parameters->string0Parameter, parameters->int0Parameter) ) { - return 1; - } - return 0; -} - -//this is a GemRB extension -//HasItemTypeSlot(Object, SLOT, ItemType) -//returns true if the item in SLOT is of ItemType -int GameScript::HasItemTypeSlot(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !scr || scr->Type!=ST_ACTOR) { - return 0; - } - Inventory *inv = &((Actor *) scr)->inventory; - if (parameters->int0Parameter>=inv->GetSlotCount()) { - return 0; - } - CREItem *slot = inv->GetSlotItem(parameters->int0Parameter); - if (!slot) { - return 0; - } - Item *itm = gamedata->GetItem(slot->ItemResRef); - int itemtype = itm->ItemType; - gamedata->FreeItem(itm, slot->ItemResRef, 0); - if (itemtype==parameters->int1Parameter) { - return 1; - } - return 0; -} - -int GameScript::HasItemEquipped(Scriptable * Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if ( !scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) scr; - if (actor->inventory.HasItem(parameters->string0Parameter, IE_INV_ITEM_EQUIPPED) ) { - return 1; - } - return 0; -} - -int GameScript::Acquired(Scriptable * Sender, Trigger* parameters) -{ - if ( Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - if (actor->inventory.HasItem(parameters->string0Parameter, IE_INV_ITEM_ACQUIRED) ) { - return 1; - } - return 0; -} - -/** this trigger accepts a numeric parameter, this number is the same as inventory flags - like: 1 - identified, 2 - unstealable, 4 - stolen, 8 - undroppable, etc. */ -/** this is a GemRB extension */ -int GameScript::PartyHasItem(Scriptable * /*Sender*/, Trigger* parameters) -{ - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - if (HasItemCore(&actor->inventory, parameters->string0Parameter, parameters->int0Parameter) ) { - return 1; - } - } - return 0; -} - -int GameScript::PartyHasItemIdentified(Scriptable * /*Sender*/, Trigger* parameters) -{ - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - while(i--) { - Actor *actor = game->GetPC(i, true); - if (HasItemCore(&actor->inventory, parameters->string0Parameter, IE_INV_ITEM_IDENTIFIED) ) { - return 1; - } - } - return 0; -} - -int GameScript::InventoryFull( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - if (actor->inventory.FindCandidateSlot( SLOT_INVENTORY, 0 )==-1) { - return 1; - } - return 0; -} - -int GameScript::HasInnateAbility(Scriptable *Sender, Trigger *parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - if (parameters->string0Parameter[0]) { - return actor->spellbook.HaveSpell(parameters->string0Parameter, 0); - } - return actor->spellbook.HaveSpell(parameters->int0Parameter, 0); -} - -int GameScript::HaveSpell(Scriptable *Sender, Trigger *parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - if (parameters->string0Parameter[0]) { - return actor->spellbook.HaveSpell(parameters->string0Parameter, 0); - } - return actor->spellbook.HaveSpell(parameters->int0Parameter, 0); -} - -int GameScript::HaveAnySpells(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - return actor->spellbook.HaveSpell("", 0); -} - -int GameScript::HaveSpellParty(Scriptable* /*Sender*/, Trigger *parameters) -{ - Game *game=core->GetGame(); - - int i = game->GetPartySize(true); - - if (parameters->string0Parameter[0]) { - while(i--) { - Actor *actor = game->GetPC(i, true); - if (actor->spellbook.HaveSpell(parameters->string0Parameter, 0) ) { - return 1; - } - } - } else { - while(i--) { - Actor *actor = game->GetPC(i, true); - if (actor->spellbook.HaveSpell(parameters->int0Parameter, 0) ) { - return 1; - } - } - } - return 0; -} - -int GameScript::KnowSpell(Scriptable *Sender, Trigger *parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - if (parameters->string0Parameter[0]) { - return actor->spellbook.KnowSpell(parameters->string0Parameter); - } - return actor->spellbook.KnowSpell(parameters->int0Parameter); -} - -int GameScript::True(Scriptable * /* Sender*/, Trigger * /*parameters*/) -{ - return 1; -} - -//in fact this could be used only on Sender, but we want to enhance these -//triggers and actions to accept an object argument whenever possible. -//0 defaults to Myself (Sender) -int GameScript::NumTimesTalkedTo(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return actor->TalkCount == (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::NumTimesTalkedToGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return actor->TalkCount > (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::NumTimesTalkedToLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return actor->TalkCount < (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::NumTimesInteracted(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - ieDword npcid = parameters->int0Parameter; - if (npcid>=MAX_INTERACT) return 0; - if (!actor->PCStats) return 0; - return actor->PCStats->Interact[npcid] == (ieDword) parameters->int1Parameter ? 1 : 0; -} - -int GameScript::NumTimesInteractedGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - ieDword npcid = parameters->int0Parameter; - if (npcid>=MAX_INTERACT) return 0; - if (!actor->PCStats) return 0; - return actor->PCStats->Interact[npcid] > (ieDword) parameters->int1Parameter ? 1 : 0; -} - -int GameScript::NumTimesInteractedLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - scr = Sender; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - ieDword npcid = parameters->int0Parameter; - if (npcid>=MAX_INTERACT) return 0; - if (!actor->PCStats) return 0; - return actor->PCStats->Interact[npcid] < (ieDword) parameters->int1Parameter ? 1 : 0; -} - -//GemRB specific -//interacting npc counts were restricted to 24 -//gemrb will increase a local variable in the interacting npc, with the scriptname of the -//target npc -int GameScript::NumTimesInteractedObject(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* tar = ( Actor* ) scr; - return CheckVariable(Sender, tar->GetScriptName(), "LOCALS") == (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::NumTimesInteractedObjectGT(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* tar = ( Actor* ) scr; - return CheckVariable(Sender, tar->GetScriptName(), "LOCALS") > (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::NumTimesInteractedObjectLT(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* tar = ( Actor* ) scr; - return CheckVariable(Sender, tar->GetScriptName(), "LOCALS") < (ieDword) parameters->int0Parameter ? 1 : 0; -} - -int GameScript::ObjectActionListEmpty(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - - // added CurrentAction as part of blocking action fixes - if (scr->GetCurrentAction() || scr->GetNextAction()) { - return 0; - } - return 1; -} - -int GameScript::ActionListEmpty(Scriptable* Sender, Trigger* /*parameters*/) -{ - // added CurrentAction as part of blocking action fixes - if (Sender->GetCurrentAction() || Sender->GetNextAction()) { - return 0; - } - return 1; -} - -int GameScript::False(Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - return 0; -} - -/* i guess this is a range of circle edges (instead of centers) */ -int GameScript::PersonalSpaceDistance(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - int range = parameters->int0Parameter; - - int distance = PersonalDistance(Sender, scr); - if (distance <= ( range * 10 )) { - return 1; - } - return 0; -} - -int GameScript::Range(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - int distance = SquaredMapDistance(Sender, scr); - return DiffCore(distance, (parameters->int0Parameter+1)*(parameters->int0Parameter+1), parameters->int1Parameter); -} - -int GameScript::InLine(Scriptable* Sender, Trigger* parameters) -{ - Map *map = Sender->GetCurrentArea(); - if (!map) { - return 0; - } - - Scriptable* scr1 = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr1) { - return 0; - } - - //looking for a scriptable by scriptname only - Scriptable* scr2 = map->GetActor( parameters->string0Parameter, 0 ); - if (!scr2) { - scr2 = GetActorObject(map->GetTileMap(), parameters->string0Parameter); - } - if (!scr2) { - return 0; - } - - double fdm1 = SquaredDistance(Sender, scr1); - double fdm2 = SquaredDistance(Sender, scr2); - double fd12 = SquaredDistance(scr1, scr2); - double dm1 = sqrt(fdm1); - double dm2 = sqrt(fdm2); - - if (fdm1>fdm2 || fd12>fdm2) { - return 0; - } - double angle = acos(( fdm2 + fdm1 - fd12 ) / (2*dm1*dm2)); - if (angle*180.0*M_PI<30.0) return 1; - return 0; -} - -//PST -int GameScript::AtLocation( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if ( (tar->Pos.x==parameters->pointParameter.x) && - (tar->Pos.y==parameters->pointParameter.y) ) { - return 1; - } - return 0; -} - -//in pst this is a point -//in iwd2 this is not a point -int GameScript::NearLocation(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (parameters->pointParameter.isnull()) { - Point p((short) parameters->int0Parameter, (short) parameters->int1Parameter); - int distance = PersonalDistance(p, scr); - if (distance <= ( parameters->int2Parameter * 10 )) { - return 1; - } - return 0; - } - //personaldistance is needed for modron constructs in PST maze - int distance = PersonalDistance(parameters->pointParameter, scr); - if (distance <= ( parameters->int0Parameter * 10 )) { - return 1; - } - return 0; -} - -int GameScript::NearSavedLocation(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - if (core->HasFeature(GF_HAS_KAPUTZ)) { - // we don't understand how this works in pst yet - return 1; - } - Actor *actor = (Actor *) Sender; - Point p( (short) actor->GetStat(IE_SAVEDXPOS), (short) actor->GetStat(IE_SAVEDYPOS) ); - // should this be PersonalDistance? - int distance = Distance(p, Sender); - if (distance <= ( parameters->int0Parameter * 10 )) { - return 1; - } - return 0; -} - -int GameScript::Or(Scriptable* /*Sender*/, Trigger* parameters) -{ - return parameters->int0Parameter; -} - -int GameScript::TriggerTrigger(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTrigger(trigger_trigger, parameters->int0Parameter); -} - -int GameScript::WalkedToTrigger(Scriptable* Sender, Trigger* parameters) -{ - /*Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); - if (!target) { - return 0; - } - if (PersonalDistance(target, Sender) > 3*MAX_OPERATING_DISTANCE ) { - return 0; - } - //now objects suicide themselves if they are empty objects - //so checking an empty object is easier - if (parameters->objectParameter == NULL) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - if (MatchActor(Sender, Sender->LastTrigger, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0;*/ - return Sender->MatchTriggerWithObject(trigger_walkedtotrigger, parameters->objectParameter); -} - -int GameScript::Clicked(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_clicked, parameters->objectParameter); -} - -int GameScript::Disarmed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_disarmed, parameters->objectParameter); -} - -//stealing from a store failed, owner triggered -int GameScript::StealFailed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_disarmfailed, parameters->objectParameter); -} - -int GameScript::PickpocketFailed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_pickpocketfailed, parameters->objectParameter); -} - -int GameScript::PickLockFailed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_picklockfailed, parameters->objectParameter); -} - -int GameScript::OpenFailed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_failedtoopen, parameters->objectParameter); -} - -int GameScript::DisarmFailed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_disarmfailed, parameters->objectParameter); -} - -//opened for doors/containers (using lastEntered) -int GameScript::Opened(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_opened, parameters->objectParameter); -} - -//closed for doors (using lastTrigger) -int GameScript::Closed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_closed, parameters->objectParameter); -} - -//unlocked for doors/containers (using lastUnlocked) -int GameScript::Unlocked(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_unlocked, parameters->objectParameter); -} - -int GameScript::Entered(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_entered, parameters->objectParameter); -} - -int GameScript::HarmlessEntered(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_harmlessentered, parameters->objectParameter); -} - -int GameScript::IsOverMe(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_PROXIMITY) { - return 0; - } - Highlightable *trap = (Highlightable *)Sender; - - Targets *tgts = GetAllObjects(Sender->GetCurrentArea(), Sender, parameters->objectParameter, GA_NO_DEAD); - int ret = 0; - if (tgts) { - targetlist::iterator m; - const targettype *tt = tgts->GetFirstTarget(m, ST_ACTOR); - while (tt) { - Actor *actor = (Actor *) tt->actor; - if (trap->IsOver(actor->Pos)) { - ret = 1; - break; - } - tt = tgts->GetNextTarget(m, ST_ACTOR); - } - } - delete tgts; - return ret; -} - -//this function is different in every engines, if you use a string0parameter -//then it will be considered as a variable check -//you can also use an object parameter (like in iwd) -int GameScript::Dead(Scriptable* Sender, Trigger* parameters) -{ - if (parameters->string0Parameter[0]) { - ieDword value; - ieVariable Variable; - - if (core->HasFeature( GF_HAS_KAPUTZ )) { - value = CheckVariable( Sender, parameters->string0Parameter, "KAPUTZ"); - } else { - snprintf( Variable, 32, core->GetDeathVarFormat(), parameters->string0Parameter ); - } - value = CheckVariable( Sender, Variable, "GLOBAL" ); - if (value>0) { - return 1; - } - return 0; - } - Scriptable* target = GetActorFromObject( Sender, parameters->objectParameter ); - if (!target) { - return 1; - } - if (target->Type != ST_ACTOR) { - return 1; - } - Actor* actor = ( Actor* ) target; - if (actor->GetStat( IE_STATE_ID ) & STATE_DEAD) { - return 1; - } - return 0; -} - -int GameScript::CreatureHidden(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *act=(Actor *) Sender; - - //this stuff is not completely clear, but HoW has a flag for this - //and GemRB uses the avatarremoval stat for it. - //HideCreature also sets this stat, so... - if (act->GetStat(IE_AVATARREMOVAL)) { - return 1; - } - - if (act->GetInternalFlag()&IF_VISIBLE) { - return 0; - } - return 1; -} -int GameScript::BecameVisible(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_becamevisible); -} - -int GameScript::Die(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_die); -} - -int GameScript::Died(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_died, parameters->objectParameter); -} - -int GameScript::PartyMemberDied(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_partymemberdied, parameters->objectParameter); -} - -int GameScript::NamelessBitTheDust(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_namelessbitthedust); -} - -int GameScript::Killed(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_killed, parameters->objectParameter); -} - -int GameScript::Race(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return ID_Race(actor, parameters->int0Parameter); -} - -int GameScript::Gender(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - return ID_Gender(actor, parameters->int0Parameter); -} - -int GameScript::HP(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if ((signed) actor->GetBase( IE_HITPOINTS ) == parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if ( (signed) actor->GetBase( IE_HITPOINTS ) > parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if ( (signed) actor->GetBase( IE_HITPOINTS ) < parameters->int0Parameter) { - return 1; - } - return 0; -} - -//these triggers work on the current damage (not the last damage) -/* they are identical to HPLost -int GameScript::DamageTaken(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - int damage = actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (damage==(int) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::DamageTakenGT(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - int damage = actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (damage>(int) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::DamageTakenLT(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - int damage = actor->GetStat(IE_MAXHITPOINTS)-actor->GetBase(IE_HITPOINTS); - if (damage<(int) parameters->int0Parameter) { - return 1; - } - return 0; -} -*/ - -int GameScript::HPLost(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - //max-current - if ( (signed) actor->GetStat(IE_MAXHITPOINTS)-(signed) actor->GetBase( IE_HITPOINTS ) == (signed) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPLostGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - //max-current - if ( (signed) actor->GetStat(IE_MAXHITPOINTS)-(signed) actor->GetBase( IE_HITPOINTS ) > (signed) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPLostLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - //max-current - if ( (signed) actor->GetStat(IE_MAXHITPOINTS)-(signed) actor->GetBase( IE_HITPOINTS ) < (signed) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPPercent(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (GetHPPercent( scr ) == parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPPercentGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (GetHPPercent( scr ) > parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::HPPercentLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (GetHPPercent( scr ) < parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::XP(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if (actor->GetStat( IE_XP ) == (unsigned) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::XPGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if (actor->GetStat( IE_XP ) > (unsigned) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::XPLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr) { - return 0; - } - if (scr->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) scr; - if (actor->GetStat( IE_XP ) < (unsigned) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CheckSkill(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objectParameter ); - if (!target) { - return 0; - } - if (target->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) target; - int sk = actor->GetSkill( parameters->int1Parameter ); - if (sk<0) return 0; - if ( sk == parameters->int0Parameter) { - return 1; - } - return 0; -} -int GameScript::CheckStat(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* target = GetActorFromObject( Sender, parameters->objectParameter ); - if (!target) { - return 0; - } - if (target->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) target; - if ( (signed) actor->GetStat( parameters->int1Parameter ) == parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CheckSkillGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - int sk = actor->GetSkill( parameters->int1Parameter ); - if (sk<0) return 0; - if ( sk > parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CheckStatGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if ( (signed) actor->GetStat( parameters->int1Parameter ) > parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CheckSkillLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - int sk = actor->GetSkill( parameters->int1Parameter ); - if (sk<0) return 0; - if ( sk < parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CheckStatLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if ( (signed) actor->GetStat( parameters->int1Parameter ) < parameters->int0Parameter) { - return 1; - } - return 0; -} - -/* i believe this trigger is the same as 'MarkObject' action - except that if it cannot set the marked object, it returns false */ -int GameScript::SetLastMarkedObject(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - scr->LastMarked = tar->GetGlobalID(); - return 1; -} - -int GameScript::IsSpellTargetValid(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - Actor *actor = NULL; - if (tar->Type == ST_ACTOR) { - actor = (Actor *) tar; - } - - int flags = parameters->int1Parameter; - if (!(flags & MSO_IGNORE_NULL) && !actor) { - return 0; - } - if (!(flags & MSO_IGNORE_INVALID) && actor && actor->InvalidSpellTarget() ) { - return 0; - } - int splnum = parameters->int0Parameter; - if (!(flags & MSO_IGNORE_HAVE) && !scr->spellbook.HaveSpell(splnum, 0) ) { - return 0; - } - int range; - if ((flags & MSO_IGNORE_RANGE) || !actor) { - range = 0; - } else { - range = Distance(scr, actor); - } - if (!(flags & MSO_IGNORE_INVALID) && actor->InvalidSpellTarget(splnum, scr, range)) { - return 0; - } - return 1; -} - -//This trigger seems to always return true for actors... -//Always manages to set spell to 0, otherwise it sets if there was nothing set earlier -int GameScript::SetMarkedSpell_Trigger(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - if (parameters->int0Parameter) { - if (scr->LastMarkedSpell) { - return 1; - } - if (!scr->spellbook.HaveSpell(parameters->int0Parameter, 0) ) { - return 1; - } - } - - //TODO: check if spell exists (not really important) - scr->LastMarkedSpell = parameters->int0Parameter; - return 1; -} - -int GameScript::ForceMarkedSpell_Trigger(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - scr->LastMarkedSpell = parameters->int0Parameter; - return 1; -} - -int GameScript::IsMarkedSpell(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - return scr->LastMarkedSpell == parameters->int0Parameter; -} - - -int GameScript::See(Scriptable* Sender, Trigger* parameters) -{ - int see = SeeCore(Sender, parameters, 0); - //don't mark LastSeen for clear!!! - if (Sender->Type==ST_ACTOR && see) { - Actor *act = (Actor *) Sender; - //save lastseen as lastmarked - //FIXME: what is this doing? - act->LastMarked = act->LastSeen; - //Sender->AddTrigger (&act->LastSeen); - } - return see; -} - -int GameScript::Detect(Scriptable* Sender, Trigger* parameters) -{ - parameters->int0Parameter=1; //seedead/invis - int see = SeeCore(Sender, parameters, 0); - if (!see) { - return 0; - } - return 1; -} - -int GameScript::LOS(Scriptable* Sender, Trigger* parameters) -{ - int see=SeeCore(Sender, parameters, 1); - if (!see) { - return 0; - } - return Range(Sender, parameters); //same as range -} - -int GameScript::NumCreatures(Scriptable* Sender, Trigger* parameters) -{ - int value = GetObjectCount(Sender, parameters->objectParameter); - return value == parameters->int0Parameter; -} - -int GameScript::NumCreaturesAtMyLevel(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - int level = ((Actor *) Sender)->GetXPLevel(true); - int value; - - if (parameters->int0Parameter) { - value = GetObjectLevelCount(Sender, parameters->objectParameter); - } else { - value = GetObjectCount(Sender, parameters->objectParameter); - } - return value == level; -} - -int GameScript::NumCreaturesLT(Scriptable* Sender, Trigger* parameters) -{ - int value = GetObjectCount(Sender, parameters->objectParameter); - return value < parameters->int0Parameter; -} - -int GameScript::NumCreaturesLTMyLevel(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - int level = ((Actor *) Sender)->GetXPLevel(true); - int value; - - if (parameters->int0Parameter) { - value = GetObjectLevelCount(Sender, parameters->objectParameter); - } else { - value = GetObjectCount(Sender, parameters->objectParameter); - } - return value < level; -} - -int GameScript::NumCreaturesGT(Scriptable* Sender, Trigger* parameters) -{ - int value = GetObjectCount(Sender, parameters->objectParameter); - return value > parameters->int0Parameter; -} - -int GameScript::NumCreaturesGTMyLevel(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - int level = ((Actor *) Sender)->GetXPLevel(true); - int value; - - if (parameters->int0Parameter) { - value = GetObjectLevelCount(Sender, parameters->objectParameter); - } else { - value = GetObjectCount(Sender, parameters->objectParameter); - } - return value > level; -} - -int GameScript::NumCreatureVsParty(Scriptable* Sender, Trigger* parameters) -{ - //creating object on the spot - if (!parameters->objectParameter) { - parameters->objectParameter = new Object(); - } - int value = GetObjectCount(Sender, parameters->objectParameter); - value -= core->GetGame()->GetPartySize(true); - return value == parameters->int0Parameter; -} - -int GameScript::NumCreatureVsPartyGT(Scriptable* Sender, Trigger* parameters) -{ - if (!parameters->objectParameter) { - parameters->objectParameter = new Object(); - } - int value = GetObjectCount(Sender, parameters->objectParameter); - value -= core->GetGame()->GetPartySize(true); - return value > parameters->int0Parameter; -} - -int GameScript::NumCreatureVsPartyLT(Scriptable* Sender, Trigger* parameters) -{ - if (!parameters->objectParameter) { - parameters->objectParameter = new Object(); - } - int value = GetObjectCount(Sender, parameters->objectParameter); - value -= core->GetGame()->GetPartySize(true); - return value < parameters->int0Parameter; -} - -int GameScript::Morale(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_MORALEBREAK) == parameters->int0Parameter; -} - -int GameScript::MoraleGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_MORALEBREAK) > parameters->int0Parameter; -} - -int GameScript::MoraleLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_MORALEBREAK) < parameters->int0Parameter; -} - -int GameScript::CheckSpellState(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (parameters->int0Parameter>255) { - return 0; - } - unsigned int position = parameters->int0Parameter>>5; - unsigned int bit = 1<<(parameters->int0Parameter&31); - if (actor->GetStat(IE_SPLSTATE_ID1+position) & bit) { - return 1; - } - return 0; -} - -int GameScript::StateCheck(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_STATE_ID) & parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::ExtendedStateCheck(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_EXTSTATE_ID) & parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::NotStateCheck(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_STATE_ID) & ~parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::RandomNum(Scriptable* /*Sender*/, Trigger* parameters) -{ - if (parameters->int0Parameter<0) { - return 0; - } - if (parameters->int1Parameter<0) { - return 0; - } - return parameters->int1Parameter-1 == RandomNumValue%parameters->int0Parameter; -} - -int GameScript::RandomNumGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - if (parameters->int0Parameter<0) { - return 0; - } - if (parameters->int1Parameter<0) { - return 0; - } - return parameters->int1Parameter-1 < RandomNumValue%parameters->int0Parameter; -} - -int GameScript::RandomNumLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - if (parameters->int0Parameter<0) { - return 0; - } - if (parameters->int1Parameter<0) { - return 0; - } - return parameters->int1Parameter-1 > RandomNumValue%parameters->int0Parameter; -} - -int GameScript::OpenState(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - if (InDebug&ID_TRIGGERS) { - printMessage("GameScript", "Couldn't find door/container:%s\n", LIGHT_RED, - parameters->objectParameter? parameters->objectParameter->objectName:""); - print("Sender: %s\n", Sender->GetScriptName() ); - } - return 0; - } - switch(tar->Type) { - case ST_DOOR: - { - Door *door =(Door *) tar; - return !door->IsOpen() == !parameters->int0Parameter; - } - case ST_CONTAINER: - { - Container *cont = (Container *) tar; - return !(cont->Flags&CONT_LOCKED) == !parameters->int0Parameter; - } - default:; //to remove a warning - } - printMessage("GameScript", "Not a door/container:%s\n", LIGHT_RED, - tar->GetScriptName()); - return 0; -} - -int GameScript::IsLocked(Scriptable * Sender, Trigger *parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - printMessage("GameScript", "Couldn't find door/container:%s\n", LIGHT_RED, - parameters->objectParameter? parameters->objectParameter->objectName:""); - print("Sender: %s\n", Sender->GetScriptName() ); - return 0; - } - switch(tar->Type) { - case ST_DOOR: - { - Door *door =(Door *) tar; - return !!(door->Flags&DOOR_LOCKED); - } - case ST_CONTAINER: - { - Container *cont = (Container *) tar; - return !!(cont->Flags&CONT_LOCKED); - } - default:; //to remove a warning - } - printMessage("GameScript", "Not a door/container:%s\n", LIGHT_RED, - tar->GetScriptName()); - return 0; -} - -int GameScript::Level(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - // FIXME: what about multiclasses or dualclasses? - return actor->GetStat(IE_LEVEL) == (unsigned) parameters->int0Parameter; -} - -//this is just a hack, actually multiclass should be available -int GameScript::ClassLevel(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - - if (!ID_Class( actor, parameters->int0Parameter) ) - return 0; - // FIXME: compare the requested level - return actor->GetStat(IE_LEVEL) == (unsigned) parameters->int1Parameter; -} - -// iwd2 and pst have different order of parameters: -// ClassLevelGT(Protagonist,MAGE,89) -// LevelInClass(Myself,10,CLERIC) -int GameScript::LevelInClass(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - - if (!ID_ClassMask( actor, parameters->int1Parameter) ) - return 0; - // FIXME: compare the requested level - return actor->GetStat(IE_LEVEL) == (unsigned) parameters->int0Parameter; -} - -int GameScript::LevelGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return actor->GetStat(IE_LEVEL) > (unsigned) parameters->int0Parameter; -} - -//this is just a hack, actually multiclass should be available -int GameScript::ClassLevelGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (!ID_Class( actor, parameters->int0Parameter) ) - return 0; - return actor->GetStat(IE_LEVEL) > (unsigned) parameters->int1Parameter; -} - -int GameScript::LevelInClassGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - - if (!ID_ClassMask( actor, parameters->int1Parameter) ) - return 0; - return actor->GetStat(IE_LEVEL) > (unsigned) parameters->int0Parameter; -} - -int GameScript::LevelLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return actor->GetStat(IE_LEVEL) < (unsigned) parameters->int0Parameter; -} - -int GameScript::ClassLevelLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (!ID_Class( actor, parameters->int0Parameter) ) - return 0; - return actor->GetStat(IE_LEVEL) < (unsigned) parameters->int1Parameter; -} - -int GameScript::LevelInClassLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - - if (!ID_ClassMask( actor, parameters->int1Parameter) ) - return 0; - return actor->GetStat(IE_LEVEL) < (unsigned) parameters->int0Parameter; -} - -int GameScript::UnselectableVariable(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - return tar->UnselectableTimer == (unsigned) parameters->int0Parameter; -} - -int GameScript::UnselectableVariableGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - return tar->UnselectableTimer > (unsigned) parameters->int0Parameter; -} - -int GameScript::UnselectableVariableLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - return tar->UnselectableTimer < (unsigned) parameters->int0Parameter; -} - -int GameScript::AreaCheck(Scriptable* Sender, Trigger* parameters) -{ - if (!strnicmp(Sender->GetCurrentArea()->GetScriptName(), parameters->string0Parameter, 8)) { - return 1; - } - return 0; -} - -int GameScript::AreaCheckObject(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - - if (!tar) { - return 0; - } - if (!strnicmp(tar->GetCurrentArea()->GetScriptName(), parameters->string0Parameter, 8)) { - return 1; - } - return 0; -} - -//lame iwd2 uses a numeric area identifier, this reduces its usability -int GameScript::CurrentAreaIs(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - - if (!tar) { - return 0; - } - ieResRef arearesref; - snprintf(arearesref, 8, "AR%04d", parameters->int0Parameter); - if (!strnicmp(tar->GetCurrentArea()->GetScriptName(), arearesref, 8)) { - return 1; - } - return 0; -} - -//lame bg2 uses a constant areaname prefix, this reduces its usability -//but in the spirit of flexibility, gemrb extension allows arbitrary prefixes -int GameScript::AreaStartsWith(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - - if (!tar) { - return 0; - } - ieResRef arearesref; - if (parameters->string0Parameter[0]) { - strnlwrcpy(arearesref, parameters->string0Parameter, 8); - } else { - strnlwrcpy(arearesref, "AR30", 8); //InWatchersKeep - } - int i = strlen(arearesref); - if (!strnicmp(tar->GetCurrentArea()->GetScriptName(), arearesref, i)) { - return 1; - } - return 0; -} - -int GameScript::EntirePartyOnMap(Scriptable* Sender, Trigger* /*parameters*/) -{ - Map *map = Sender->GetCurrentArea(); - Game *game=core->GetGame(); - int i=game->GetPartySize(true); - while (i--) { - Actor *actor=game->GetPC(i,true); - if (actor->GetCurrentArea()!=map) { - return 0; - } - } - return 1; -} - -int GameScript::AnyPCOnMap(Scriptable* Sender, Trigger* /*parameters*/) -{ - Map *map = Sender->GetCurrentArea(); - Game *game=core->GetGame(); - int i=game->GetPartySize(true); - while (i--) { - Actor *actor=game->GetPC(i,true); - if (actor->GetCurrentArea()==map) { - return 1; - } - } - return 0; -} - -int GameScript::InActiveArea(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (core->GetGame()->GetCurrentArea() == tar->GetCurrentArea()) { - return 1; - } - return 0; -} - -int GameScript::InMyArea(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (Sender->GetCurrentArea() == tar->GetCurrentArea()) { - return 1; - } - return 0; -} - -int GameScript::AreaType(Scriptable* Sender, Trigger* parameters) -{ - Map *map=Sender->GetCurrentArea(); - return (map->AreaType¶meters->int0Parameter)>0; -} - -int GameScript::IsExtendedNight( Scriptable* Sender, Trigger* /*parameters*/) -{ - Map *map=Sender->GetCurrentArea(); - if (map->AreaType&AT_EXTENDED_NIGHT) { - return 1; - } - return 0; -} - -int GameScript::AreaFlag(Scriptable* Sender, Trigger* parameters) -{ - Map *map=Sender->GetCurrentArea(); - return (map->AreaFlags¶meters->int0Parameter)>0; -} - -int GameScript::AreaRestDisabled(Scriptable* Sender, Trigger* /*parameters*/) -{ - Map *map=Sender->GetCurrentArea(); - if (map->AreaFlags&2) { - return 1; - } - return 0; -} - -//new optional parameter: size of actor (to reach target) -int GameScript::TargetUnreachable(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 1; //well, if it doesn't exist it is unreachable - } - Map *map=Sender->GetCurrentArea(); - if (!map) { - return 1; - } - unsigned int size = parameters->int0Parameter; - - if (!size) { - if (Sender->Type==ST_ACTOR) { - size = ((Movable *) Sender)->size; - } - else { - size = 1; - } - } - return map->TargetUnreachable( Sender->Pos, tar->Pos, size); -} - -int GameScript::PartyCountEQ(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(0)==parameters->int0Parameter; -} - -int GameScript::PartyCountLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(0)int0Parameter; -} - -int GameScript::PartyCountGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(0)>parameters->int0Parameter; -} - -int GameScript::PartyCountAliveEQ(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(1)==parameters->int0Parameter; -} - -int GameScript::PartyCountAliveLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(1)int0Parameter; -} - -int GameScript::PartyCountAliveGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartySize(1)>parameters->int0Parameter; -} - -int GameScript::LevelParty(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartyLevel(1)==parameters->int0Parameter; -} - -int GameScript::LevelPartyLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartyLevel(1)int0Parameter; -} - -int GameScript::LevelPartyGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->GetPartyLevel(1)>parameters->int0Parameter; -} - -int GameScript::PartyGold(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->PartyGold == (ieDword) parameters->int0Parameter; -} - -int GameScript::PartyGoldGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->PartyGold > (ieDword) parameters->int0Parameter; -} - -int GameScript::PartyGoldLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->PartyGold < (ieDword) parameters->int0Parameter; -} - -int GameScript::OwnsFloaterMessage(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - return tar->textDisplaying; -} - -int GameScript::InCutSceneMode(Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - return core->InCutSceneMode(); -} - -int GameScript::Proficiency(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>31) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_PROFICIENCYBASTARDSWORD+idx) == parameters->int1Parameter; -} - -int GameScript::ProficiencyGT(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>31) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_PROFICIENCYBASTARDSWORD+idx) > parameters->int1Parameter; -} - -int GameScript::ProficiencyLT(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>31) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_PROFICIENCYBASTARDSWORD+idx) < parameters->int1Parameter; -} - -//this is a PST specific stat, shows how many free proficiency slots we got -//we use an unused stat for it -int GameScript::ExtraProficiency(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_FREESLOTS) == parameters->int0Parameter; -} - -int GameScript::ExtraProficiencyGT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_FREESLOTS) > parameters->int0Parameter; -} - -int GameScript::ExtraProficiencyLT(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_FREESLOTS) < parameters->int0Parameter; -} - -int GameScript::Internal(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>15) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_INTERNAL_0+idx) == parameters->int1Parameter; -} - -int GameScript::InternalGT(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>15) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_INTERNAL_0+idx) > parameters->int1Parameter; -} - -int GameScript::InternalLT(Scriptable* Sender, Trigger* parameters) -{ - unsigned int idx = parameters->int0Parameter; - if (idx>15) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - return (signed) actor->GetStat(IE_INTERNAL_0+idx) < parameters->int1Parameter; -} - -//we check if target is currently in dialog or not -int GameScript::NullDialog(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - GameControl *gc = core->GetGameControl(); - if ( (tar->GetGlobalID() != gc->dialoghandler->targetID) && (tar->GetGlobalID() != gc->dialoghandler->speakerID) ) { - return 1; - } - return 0; -} - -//this one checks scriptname (deathvar), i hope it is right -//IsScriptName depends on this too -//Name is another (similar function) -int GameScript::CalledByName(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - if (stricmp(actor->GetScriptName(), parameters->string0Parameter) ) { - return 0; - } - return 1; -} - -//This is checking on the character's name as it was typed in -int GameScript::CharName(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = GetActorFromObject( Sender, parameters->objectParameter ); - if (!scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = (Actor *) scr; - if (!strnicmp(actor->ShortName, parameters->string0Parameter, 32) ) { - return 1; - } - return 0; -} - -int GameScript::AnimationID(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - if ((ieWord) actor->GetStat(IE_ANIMATION_ID) == (ieWord) parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::AnimState(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - if (tar->Type != ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) tar; - return actor->GetStance() == parameters->int0Parameter; -} - -//this trigger uses hours -int GameScript::Time(Scriptable* /*Sender*/, Trigger* parameters) -{ - return (core->GetGame()->GameTime/AI_UPDATE_TIME)%7200/300 == (ieDword) parameters->int0Parameter; -} - -//this trigger uses hours -int GameScript::TimeGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return (core->GetGame()->GameTime/AI_UPDATE_TIME)%7200/300 > (ieDword) parameters->int0Parameter; -} - -//this trigger uses hours -int GameScript::TimeLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return (core->GetGame()->GameTime/AI_UPDATE_TIME)%7200/300 < (ieDword) parameters->int0Parameter; -} - -int GameScript::HotKey(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTrigger(trigger_hotkey, parameters->int0Parameter); -} - -int GameScript::CombatCounter(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->CombatCounter == (ieDword) parameters->int0Parameter; -} - -int GameScript::CombatCounterGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->CombatCounter > (ieDword) parameters->int0Parameter; -} - -int GameScript::CombatCounterLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - return core->GetGame()->CombatCounter < (ieDword) parameters->int0Parameter; -} - -int GameScript::TrapTriggered(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_traptriggered, parameters->objectParameter); -} - -int GameScript::InteractingWith(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - GameControl *gc = core->GetGameControl(); - if (Sender->GetGlobalID() != gc->dialoghandler->targetID && Sender->GetGlobalID() != gc->dialoghandler->speakerID) { - return 0; - } - if (tar->GetGlobalID() != gc->dialoghandler->targetID && tar->GetGlobalID() != gc->dialoghandler->speakerID) { - return 0; - } - return 1; -} - -int GameScript::LastPersonTalkedTo(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - if (MatchActor(Sender, scr->LastTalker, parameters->objectParameter)) { - return 1; - } - return 0; -} - -int GameScript::IsRotation(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if ( actor->GetOrientation() == parameters->int0Parameter ) { - return 1; - } - return 0; -} - -//GemRB currently stores the saved location in a local variable, but it is -//actually stored in the .gam structure (only for PCs) -int GameScript::IsFacingSavedRotation(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetOrientation() == actor->GetStat(IE_SAVEDFACE) ) { - return 1; - } - return 0; -} - -int GameScript::IsFacingObject(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type != ST_ACTOR) { - return 0; - } - Scriptable* target = GetActorFromObject( Sender, parameters->objectParameter ); - if (!target) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (actor->GetOrientation()==GetOrient( target->Pos, actor->Pos ) ) { - return 1; - } - return 0; -} - -int GameScript::AttackedBy(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_attackedby, parameters->objectParameter, parameters->int0Parameter); - /*if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - Targets *tgts = GetAllObjects(Sender->GetCurrentArea(), Sender, parameters->objectParameter, GA_NO_DEAD); - int ret = 0; - int AStyle = parameters->int0Parameter; - //iterate through targets to get the actor - if (tgts) { - targetlist::iterator m; - const targettype *tt = tgts->GetFirstTarget(m, ST_ACTOR); - while (tt) { - Actor *actor = (Actor *) tt->actor; - //if (actor->LastTarget == scr->GetID()) { - if (scr->LastAttacker == actor->GetGlobalID()) { - if (!AStyle || (AStyle==actor->GetAttackStyle()) ) { - scr->AddTrigger(&scr->LastAttacker); - ret = 1; - break; - } - } - tt = tgts->GetNextTarget(m, ST_ACTOR); - } - } - delete tgts; - return ret;*/ -} - -int GameScript::TookDamage(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_tookdamage); - /*if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - //zero damage doesn't count? - if (actor->LastHitter && actor->LastDamage) { - Sender->AddTrigger(&actor->LastHitter); - return 1; - } - return 0;*/ -} - -int GameScript::HitBy(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_attackedby, parameters->objectParameter, parameters->int0Parameter); -} - -int GameScript::Heard(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_heard, parameters->objectParameter, parameters->int0Parameter); -} - -int GameScript::LastMarkedObject_Trigger(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (MatchActor(Sender, actor->LastMarked, parameters->objectParameter)) { - //don't mark this object for clear - //Sender->AddTrigger(&actor->LastSeen); - return 1; - } - return 0; -} - -int GameScript::HelpEX(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - int stat; - switch (parameters->int0Parameter) { - case 1: stat = IE_EA; break; - case 2: stat = IE_GENERAL; break; - case 3: stat = IE_RACE; break; - case 4: stat = IE_CLASS; break; - case 5: stat = IE_SPECIFIC; break; - case 6: stat = IE_SEX; break; - case 7: stat = IE_ALIGNMENT; break; - default: return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - //a non actor checking for help? - return 0; - } - Actor* actor = ( Actor* ) tar; - Actor* help = Sender->GetCurrentArea()->GetActorByGlobalID(actor->LastHelp); - if (!help) { - //no help required - return 0; - } - if (actor->GetStat(stat)==help->GetStat(stat) ) { - // FIXME - //Sender->AddTrigger(&actor->LastHelp); - return 1; - } - return 0; -} - -int GameScript::Help_Trigger(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_help, parameters->objectParameter); -} - -int GameScript::ReceivedOrder(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_receivedorder, parameters->objectParameter, parameters->int0Parameter); -} - -int GameScript::Joins(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_joins, parameters->objectParameter); - /*if(Sender->Type!=ST_ACTOR) { - return 0; - } - Actor * actor = ( Actor* ) Sender; - //this trigger is sent only to PCs in a party - if(!actor->PCStats) { - return 0; - } - if (MatchActor(Sender, actor->PCStats->LastJoined, parameters->objectParameter)) { - Sender->AddTrigger(&actor->PCStats->LastJoined); - return 1; - } - return 0;*/ -} - -int GameScript::Leaves(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_leaves, parameters->objectParameter); - /*if(Sender->Type!=ST_ACTOR) { - return 0; - } - Actor * actor = ( Actor* ) Sender; - //this trigger is sent only to PCs in a party - if(!actor->PCStats) { - return 0; - } - if (MatchActor(Sender, actor->PCStats->LastLeft, parameters->objectParameter)) { - Sender->AddTrigger(&actor->PCStats->LastLeft); - return 1; - } - return 0;*/ -} - -int GameScript::FallenPaladin(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* act = ( Actor* ) Sender; - return (act->GetStat(IE_MC_FLAGS) & MC_FALLEN_PALADIN)!=0; -} - -int GameScript::FallenRanger(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* act = ( Actor* ) Sender; - return (act->GetStat(IE_MC_FLAGS) & MC_FALLEN_RANGER)!=0; -} - -int GameScript::NightmareModeOn(Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - ieDword diff; - - core->GetDictionary()->Lookup("Nightmare Mode", diff); - if (diff) { - return 1; - } - return 0; -} - -int GameScript::Difficulty(Scriptable* /*Sender*/, Trigger* parameters) -{ - ieDword diff; - - core->GetDictionary()->Lookup("Difficulty Level", diff); - int mode = parameters->int1Parameter; - //hack for compatibility - if (!mode) { - mode = EQUALS; - } - return DiffCore(diff, (ieDword) parameters->int0Parameter, mode); -} - -int GameScript::DifficultyGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - ieDword diff; - - core->GetDictionary()->Lookup("Difficulty Level", diff); - return diff>(ieDword) parameters->int0Parameter; -} - -int GameScript::DifficultyLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - ieDword diff; - - core->GetDictionary()->Lookup("Difficulty Level", diff); - return diff<(ieDword) parameters->int0Parameter; -} - -int GameScript::Vacant(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_AREA) { - return 0; - } - Map *map = (Map *) Sender; - if ( map->CanFree() ) { - return 1; - } - return 0; -} - -//this trigger always checks the right hand weapon? -int GameScript::InWeaponRange(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar) { - return 0; - } - Actor *actor = (Actor *) Sender; - WeaponInfo wi; - unsigned int wrange = 0; - ITMExtHeader *header = actor->GetWeapon(wi, false); - if (header) { - wrange = wi.range; - } - header = actor->GetWeapon(wi, true); - if (header && (wi.range>wrange)) { - wrange = wi.range; - } - if ( PersonalDistance( Sender, tar ) <= wrange * 10 ) { - return 1; - } - return 0; -} - -//this implementation returns only true if there is a bow wielded -//but there is no ammo for it -//if the implementation should sign 'no ranged attack possible' -//then change some return values -//in bg2/iwd2 it doesn't accept an object (the object parameter is gemrb ext.) -int GameScript::OutOfAmmo(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* scr = Sender; - if (parameters->objectParameter) { - scr = GetActorFromObject( Sender, parameters->objectParameter ); - } - if ( !scr || scr->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) scr; - WeaponInfo wi; - ITMExtHeader *header = actor->GetWeapon(wi, false); - //no bow wielded? - if (!header || header->AttackType!=ITEM_AT_BOW) { - return 0; - } - //we either have a projectile (negative) or an empty bow (positive) - //so we should find a negative slot, positive slot means: OutOfAmmo - if (actor->inventory.GetEquipped()<0) { - return 0; - } - //out of ammo - return 1; -} - -//returns true if a weapon is equipped (with more than 0 range) -//if a bow is equipped without projectile, it is useless! -//please notice how similar is this to OutOfAmmo -int GameScript::HaveUsableWeaponEquipped(Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - WeaponInfo wi; - ITMExtHeader *header = actor->GetWeapon(wi, false); - - //bows are not usable (because if they are loaded, the equipped - //weapon is the projectile) - if (!header || header->AttackType==ITEM_AT_BOW) { - return 0; - } - //only fist we have, it is not qualified as weapon? - if (actor->inventory.GetEquippedSlot() == actor->inventory.GetFistSlot()) { - return 0; - } - return 1; -} - -int GameScript::HasWeaponEquipped(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->inventory.GetEquippedSlot() == IW_NO_EQUIPPED) { - return 0; - } - return 1; -} - -int GameScript::PCInStore( Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - if (core->GetCurrentStore()) { - return 1; - } - return 0; -} - -//this checks if the launch point is onscreen, a more elaborate check -//would see if any piece of the Scriptable is onscreen, what is the original -//behaviour? -int GameScript::OnScreen( Scriptable* Sender, Trigger* /*parameters*/) -{ - Region vp = core->GetVideoDriver()->GetViewport(); - if (vp.PointInside(Sender->Pos) ) { - return 1; - } - return 0; -} - -int GameScript::IsPlayerNumber( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->InParty == parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::PCCanSeePoint( Scriptable* /*Sender*/, Trigger* parameters) -{ - Map* map = core->GetGame()->GetCurrentArea(); - if (map->IsVisible(parameters->pointParameter, false) ) { - return 1; - } - return 0; -} - -//i'm clueless about this trigger -int GameScript::StuffGlobalRandom( Scriptable* Sender, Trigger* parameters) -{ - unsigned int max=parameters->int0Parameter+1; - ieDword Value; - if (max) { - Value = RandomNumValue%max; - } else { - Value = RandomNumValue; - } - SetVariable( Sender, parameters->string0Parameter, Value ); - if (Value) { - return 1; - } - return 0; -} - -int GameScript::IsCreatureAreaFlag( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_MC_FLAGS) & parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::IsPathCriticalObject( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_MC_FLAGS) & MC_PLOT_CRITICAL) { - return 1; - } - return 0; -} - -// 0 - ability, 1 - number, 2 - mode -int GameScript::ChargeCount( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - int Slot = actor->inventory.FindItem(parameters->string0Parameter,0); - if (Slot<0) { - return 0; - } - CREItem *item = actor->inventory.GetSlotItem (Slot); - if (!item) {//bah - return 0; - } - if (parameters->int0Parameter>2) { - return 0; - } - int charge = item->Usages[parameters->int0Parameter]; - switch (parameters->int2Parameter) { - case DM_EQUAL: - if (charge == parameters->int1Parameter) - return 1; - break; - case DM_LESS: - if (charge < parameters->int1Parameter) - return 1; - break; - case DM_GREATER: - if (charge > parameters->int1Parameter) - return 1; - break; - default: - return 0; - } - return 0; -} - -// no idea if it checks only alive partymembers -int GameScript::CheckPartyLevel( Scriptable* /*Sender*/, Trigger* parameters) -{ - if (core->GetGame()->GetPartyLevel(false)int0Parameter) { - return 0; - } - return 1; -} - -// no idea if it checks only alive partymembers -int GameScript::CheckPartyAverageLevel( Scriptable* /*Sender*/, Trigger* parameters) -{ - int level = core->GetGame()->GetPartyLevel(false); - switch (parameters->int1Parameter) { - case DM_EQUAL: - if (level ==parameters->int0Parameter) { - return 1; - } - break; - case DM_LESS: - if (level < parameters->int0Parameter) { - return 1; - } - break; - case DM_GREATER: - if (level > parameters->int0Parameter) { - return 1; - } - break; - default: - return 0; - } - return 1; -} - -int GameScript::CheckDoorFlags( Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_DOOR) { - return 0; - } - Door* door = ( Door* ) tar; - if (door->Flags¶meters->int0Parameter) { - return 1; - } - return 0; -} - -// works only on animations? -// Be careful when converting to GetActorFromObject, it won't return animations (those are not scriptable) -int GameScript::Frame( Scriptable* Sender, Trigger* parameters) -{ - //to avoid a crash - if (!parameters->objectParameter) { - return 0; - } - AreaAnimation* anim = Sender->GetCurrentArea()->GetAnimation(parameters->objectParameter->objectName); - if (!anim) { - return 0; - } - int frame = anim->frame; - if ((frame>=parameters->int0Parameter) && - (frame<=parameters->int1Parameter) ) { - return 1; - } - return 0; -} - -//Modalstate in IWD2 allows specifying an object -int GameScript::ModalState( Scriptable* Sender, Trigger* parameters) -{ - Scriptable *scr; - - if (parameters->objectParameter) { - scr = GetActorFromObject( Sender, parameters->objectParameter ); - } else { - scr = Sender; - } - if (scr->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) scr; - - if (actor->ModalState==(ieDword) parameters->int0Parameter) { - return 1; - } - return 0; -} - -/* a special redundant trigger for iwd2 - could do something extra */ -int GameScript::IsCreatureHiddenInShadows( Scriptable* Sender, Trigger* /*parameters*/) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - - if (actor->ModalState==MS_STEALTH) { - return 1; - } - return 0; -} - -int GameScript::IsWeather( Scriptable* /*Sender*/, Trigger* parameters) -{ - Game *game = core->GetGame(); - ieDword weather = game->WeatherBits & parameters->int0Parameter; - if (weather == (ieDword) parameters->int1Parameter) { - return 1; - } - return 0; -} - -int GameScript::Delay( Scriptable* Sender, Trigger* parameters) -{ - ieDword delay = (ieDword) parameters->int0Parameter; - if (delay<=1) { - return 1; - } - - return (Sender->ScriptTicks % delay) <= Sender->IdleTicks; -} - -int GameScript::TimeOfDay(Scriptable* /*Sender*/, Trigger* parameters) -{ - ieDword timeofday = (core->GetGame()->GameTime/AI_UPDATE_TIME)%7200/1800; - - if (timeofday==(ieDword) parameters->int0Parameter) { - return 1; - } - return 0; -} - -//this is a PST action, it's using delta, not diffmode -int GameScript::RandomStatCheck(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - - ieDword stat = actor->GetStat(parameters->int0Parameter); - ieDword value = Bones(parameters->int2Parameter); - switch(parameters->int1Parameter) { - case DM_SET: - if (stat==value) - return 1; - break; - case DM_LOWER: - if (statvalue) - return 1; - break; - } - return 0; -} - -int GameScript::PartyRested(Scriptable* Sender, Trigger* /*parameters*/) -{ - return Sender->MatchTrigger(trigger_partyrested); -} - -int GameScript::IsWeaponRanged(Scriptable* Sender, Trigger* parameters) -{ - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->inventory.GetEquipped()<0) { - return 1; - } - return 0; -} - -//HoW applies sequence on area animations -int GameScript::Sequence(Scriptable* Sender, Trigger* parameters) -{ - //to avoid a crash, check if object is NULL - if (parameters->objectParameter) { - AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objectParameter->objectName); - if (anim) { - //this is the cycle count for the area animation - //very much like stance for avatar anims - if (anim->sequence==parameters->int0Parameter) { - return 1; - } - return 0; - } - } - - Scriptable *tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStance()==parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::TimerExpired(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->TimerExpired(parameters->int0Parameter) ) { - return 1; - } - return 0; -} - -int GameScript::TimerActive(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->TimerActive(parameters->int0Parameter) ) { - return 1; - } - return 0; -} - -int GameScript::ActuallyInCombat(Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - Game *game=core->GetGame(); - if (game->AnyPCInCombat()) return 1; - return 0; -} - -int GameScript::InMyGroup(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } -/* IESDP SUCKS - if (GetGroup( (Actor *) tar)==GetGroup( (Actor *) Sender) ) { - return 1; - } -*/ - if ( ((Actor *) tar)->GetStat(IE_SPECIFIC)==((Actor *) tar)->GetStat(IE_SPECIFIC) ) { - return 1; - } - return 0; -} - -int GameScript::AnyPCSeesEnemy(Scriptable* /*Sender*/, Trigger* /*parameters*/) -{ - Game *game = core->GetGame(); - unsigned int i = (unsigned int) game->GetLoadedMapCount(); - while(i--) { - Map *map = game->GetMap(i); - if (map->AnyPCSeesEnemy()) { - return 1; - } - } - return 0; -} - -int GameScript::Unusable(Scriptable* Sender, Trigger* parameters) -{ - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *actor = (Actor *) Sender; - - Item *item = gamedata->GetItem(parameters->string0Parameter); - int ret; - if (actor->Unusable(item)) { - ret = 0; - } else { - ret = 1; - } - gamedata->FreeItem(item, parameters->string0Parameter, true); - return ret; -} - -int GameScript::HasBounceEffects(Scriptable* Sender, Trigger* parameters) -{ - Scriptable *tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_BOUNCE)) return 1; - return 0; -} - -int GameScript::HasImmunityEffects(Scriptable* Sender, Trigger* parameters) -{ - Scriptable *tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) tar; - if (actor->GetStat(IE_IMMUNITY)) return 1; - return 0; -} - -// this is a GemRB specific trigger, to transfer some system variables -// to a global (game variable), it will always return true, and the -// variable could be checked in a subsequent trigger (like triggersetglobal) - -#define SYSV_SCREENFLAGS 0 -#define SYSV_CONTROLSTATUS 1 -#define SYSV_REPUTATION 2 -#define SYSV_PARTYGOLD 3 - -int GameScript::SystemVariable_Trigger(Scriptable* Sender, Trigger* parameters) -{ - ieDword value; - - switch (parameters->int0Parameter) { - case SYSV_SCREENFLAGS: - value = core->GetGameControl()->GetScreenFlags(); - break; - case SYSV_CONTROLSTATUS: - value = core->GetGame()->ControlStatus; - break; - case SYSV_REPUTATION: - value = core->GetGame()->Reputation; - break; - case SYSV_PARTYGOLD: - value = core->GetGame()->PartyGold; - break; - default: - return 0; - } - - SetVariable(Sender, parameters->string0Parameter, value); - return 1; -} - -int GameScript::SpellCast(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_spellcast, parameters->objectParameter, parameters->int0Parameter); - /*if(parameters->int0Parameter) { - unsigned int param = 2000+parameters->int0Parameter%1000; - if (param!=Sender->LastSpellSeen) { - return 0; - } - } - if(MatchActor(Sender, Sender->LastCasterSeen, parameters->objectParameter)) { - Sender->AddTrigger(&Sender->LastCasterSeen); - return 1; - } - return 0;*/ -} - -int GameScript::SpellCastPriest(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_spellcastpriest, parameters->objectParameter, parameters->int0Parameter); - /*if(parameters->int0Parameter) { - unsigned int param = 1000+parameters->int0Parameter%1000; - if (param!=Sender->LastSpellSeen) { - return 0; - } - } - if(MatchActor(Sender, Sender->LastCasterSeen, parameters->objectParameter)) { - Sender->AddTrigger(&Sender->LastCasterSeen); - return 1; - } - return 0;*/ -} - -int GameScript::SpellCastInnate(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_spellcastinnate, parameters->objectParameter, parameters->int0Parameter); - /*if(parameters->int0Parameter) { - unsigned int param = 3000+parameters->int0Parameter%1000; - if (param!=Sender->LastSpellSeen) { - return 0; - } - } - if(MatchActor(Sender, Sender->LastCasterSeen, parameters->objectParameter)) { - Sender->AddTrigger(&Sender->LastCasterSeen); - return 1; - } - return 0;*/ -} - -int GameScript::SpellCastOnMe(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_spellcastonme, parameters->objectParameter, parameters->int0Parameter); - /*if(parameters->int0Parameter) { - if ((ieDword) parameters->int0Parameter!=Sender->LastSpellOnMe) { - return 0; - } - } - if(MatchActor(Sender, Sender->LastCasterOnMe, parameters->objectParameter)) { - Sender->AddTrigger(&Sender->LastCasterOnMe); - return 1; - } - return 0;*/ -} - -int GameScript::CalendarDay(Scriptable* /*Sender*/, Trigger* parameters) -{ - int day = core->GetCalendar()->GetCalendarDay(core->GetGame()->GameTime/AI_UPDATE_TIME/7200); - if(day == parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CalendarDayGT(Scriptable* /*Sender*/, Trigger* parameters) -{ - int day = core->GetCalendar()->GetCalendarDay(core->GetGame()->GameTime/AI_UPDATE_TIME/7200); - if(day > parameters->int0Parameter) { - return 1; - } - return 0; -} - -int GameScript::CalendarDayLT(Scriptable* /*Sender*/, Trigger* parameters) -{ - int day = core->GetCalendar()->GetCalendarDay(core->GetGame()->GameTime/AI_UPDATE_TIME/7200); - if(day < parameters->int0Parameter) { - return 1; - } - return 0; -} - -//NT Returns true only if the active CRE was turned by the specified priest or paladin. -int GameScript::TurnedBy(Scriptable* Sender, Trigger* parameters) -{ - return Sender->MatchTriggerWithObject(trigger_turnedby, parameters->objectParameter); -} diff --git a/project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp b/project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp deleted file mode 100644 index 1319d68b3..000000000 --- a/project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003-2005 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "GlobalTimer.h" - -#include "ControlAnimation.h" -#include "Game.h" -#include "Interface.h" -#include "Video.h" -#include "GUI/GameControl.h" - -GlobalTimer::GlobalTimer(void) -{ - //AI_UPDATE_TIME: how many AI updates in a second - interval = ( 1000 / AI_UPDATE_TIME ); - Init(); -} - -GlobalTimer::~GlobalTimer(void) -{ - std::vector::iterator i; - for(i = animations.begin(); i != animations.end(); ++i) { - delete (*i); - } -} - -void GlobalTimer::Init() -{ - fadeToCounter = 0; - fadeFromCounter = 0; - fadeFromMax = 0; - fadeToMax = 0; - waitCounter = 0; - shakeCounter = 0; - startTime = 0; //forcing an update - speed = 0; - ClearAnimations(); -} - -void GlobalTimer::Freeze() -{ - unsigned long thisTime; - unsigned long advance; - - thisTime = GetTickCount(); - advance = thisTime - startTime; - if ( advance < interval) { - return; - } - startTime = thisTime; - Game* game = core->GetGame(); - if (!game) { - return; - } - game->RealTime++; - - ieDword count = advance/interval; - // pst/bg2 do this, if you fix it for another game, wrap it in a check - DoFadeStep(count); - - // show scrolling cursor while paused - GameControl* gc = core->GetGameControl(); - if (gc) - gc->UpdateScrolling(); -} - -bool GlobalTimer::ViewportIsMoving() -{ - return (goal.x!=currentVP.x) || (goal.y!=currentVP.y); -} - -void GlobalTimer::SetMoveViewPort(ieDword x, ieDword y, int spd, bool center) -{ - speed=spd; - currentVP=core->GetVideoDriver()->GetViewport(); - if (center) { - x-=currentVP.w/2; - y-=currentVP.h/2; - } - goal.x=(short) x; - goal.y=(short) y; -} - -void GlobalTimer::DoStep(int count) -{ - Video *video = core->GetVideoDriver(); - - int x = currentVP.x; - int y = currentVP.y; - if ( (x != goal.x) || (y != goal.y)) { - if (speed) { - if (xgoal.x) x=goal.x; - } else { - x-=speed; - if (xgoal.y) y=goal.y; - } else { - y-=speed; - if (y>1); - y += (rand()%shakeY) - (shakeY>>1); - } - } - video->MoveViewportTo(x,y); -} - -bool GlobalTimer::Update() -{ - Map *map; - Game *game; - GameControl* gc; - unsigned long thisTime; - unsigned long advance; - - gc = core->GetGameControl(); - if (gc) - gc->UpdateScrolling(); - - UpdateAnimations(); - - thisTime = GetTickCount(); - - if (!startTime) { - startTime = thisTime; - return false; - } - - advance = thisTime - startTime; - if ( advance < interval) { - return false; - } - ieDword count = advance/interval; - DoStep(count); - DoFadeStep(count); - if (!gc) { - goto end; - } - game = core->GetGame(); - if (!game) { - goto end; - } - map = game->GetCurrentArea(); - if (!map) { - goto end; - } - //do spell effects expire in dialogs? - //if yes, then we should remove this condition - if (!(gc->GetDialogueFlags()&DF_IN_DIALOG) ) { - map->UpdateFog(); - map->UpdateEffects(); - if (thisTime) { - //this measures in-world time (affected by effects, actions, etc) - game->AdvanceTime(1); - } - } - //this measures time spent in the game (including pauses) - if (thisTime) { - game->RealTime++; - } -end: - startTime = thisTime; - return true; -} - - -void GlobalTimer::DoFadeStep(ieDword count) { - Video *video = core->GetVideoDriver(); - if (fadeToCounter) { - fadeToCounter-=count; - if (fadeToCounter<0) { - fadeToCounter=0; - } - video->SetFadePercent( ( ( fadeToMax - fadeToCounter ) * 100 ) / fadeToMax ); - //bug/patch #1837747 made this unneeded - //goto end; //hmm, freeze gametime? - } - //i think this 'else' is needed now because of the 'goto' cut above - else if (fadeFromCounter!=fadeFromMax) { - if (fadeFromCounter>fadeFromMax) { - fadeFromCounter-=count; - if (fadeFromCounterfadeFromMax) { - fadeToCounter=fadeFromMax; - } - video->SetFadePercent( ( ( fadeFromMax - fadeFromCounter ) * 100 ) / fadeFromMax ); - //bug/patch #1837747 made this unneeded - //goto end; //freeze gametime? - } - } - if (fadeFromCounter==fadeFromMax) { - video->SetFadePercent( 0 ); - } -} - -void GlobalTimer::SetFadeToColor(unsigned long Count) -{ - if(!Count) { - Count = 64; - } - fadeToCounter = Count; - fadeToMax = fadeToCounter; - //stay black for a while - fadeFromCounter = 128; - fadeFromMax = 0; -} - -void GlobalTimer::SetFadeFromColor(unsigned long Count) -{ - if(!Count) { - Count = 64; - } - fadeFromCounter = 0; - fadeFromMax = Count; -} - -void GlobalTimer::SetWait(unsigned long Count) -{ - waitCounter = Count; -} - -void GlobalTimer::AddAnimation(ControlAnimation* ctlanim, unsigned long time) -{ - AnimationRef* anim; - unsigned long thisTime; - - thisTime = GetTickCount(); - time += thisTime; - - // if there are no free animation reference objects, - // alloc one, else take the first free one - if (first_animation == 0) - anim = new AnimationRef; - else { - anim = animations.front (); - animations.erase (animations.begin()); - first_animation--; - } - - // fill in data - anim->time = time; - anim->ctlanim = ctlanim; - - // and insert it into list of other anim refs, sorted by time - for (std::vector::iterator it = animations.begin() + first_animation; it != animations.end (); it++) { - if ((*it)->time > time) { - animations.insert( it, anim ); - anim = NULL; - break; - } - } - if (anim) - animations.push_back( anim ); -} - -void GlobalTimer::RemoveAnimation(ControlAnimation* ctlanim) -{ - // Animation refs for given control are not physically removed, - // but just marked by erasing ptr to the control. They will be - // collected when they get to the front of the vector - for (std::vector::iterator it = animations.begin() + first_animation; it != animations.end (); it++) { - if ((*it)->ctlanim == ctlanim) { - (*it)->ctlanim = NULL; - } - } -} - -void GlobalTimer::UpdateAnimations() -{ - unsigned long thisTime; - thisTime = GetTickCount(); - while (animations.begin() + first_animation != animations.end()) { - AnimationRef* anim = animations[first_animation]; - if (anim->ctlanim == NULL) { - first_animation++; - continue; - } - - if (anim->time <= thisTime) { - anim->ctlanim->UpdateAnimation(); - first_animation++; - continue; - } - break; - } -} - -void GlobalTimer::ClearAnimations() -{ - first_animation = (unsigned int) animations.size(); -} - -void GlobalTimer::SetScreenShake(unsigned long shakeX, unsigned long shakeY, - unsigned long Count) -{ - this->shakeX = shakeX; - this->shakeY = shakeY; - shakeCounter = Count+1; -} diff --git a/project/jni/application/gemrb/gemrb/core/GlobalTimer.h b/project/jni/application/gemrb/gemrb/core/GlobalTimer.h deleted file mode 100644 index bcb933102..000000000 --- a/project/jni/application/gemrb/gemrb/core/GlobalTimer.h +++ /dev/null @@ -1,78 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ -#ifndef GLOBALTIMER_H -#define GLOBALTIMER_H - -#include "exports.h" -#include "win32def.h" - -#include "Region.h" - -#include - -class ControlAnimation; - -struct AnimationRef -{ - ControlAnimation *ctlanim; - unsigned long time; -}; - - -class GEM_EXPORT GlobalTimer { -private: - unsigned long startTime; - unsigned long interval; - - int fadeToCounter, fadeToMax; - int fadeFromCounter, fadeFromMax; - unsigned long waitCounter; - int shakeCounter; - unsigned long shakeX, shakeY; - unsigned int first_animation; - std::vector animations; - //move viewport to this coordinate - Point goal; - int speed; - Region currentVP; - - void DoFadeStep(ieDword count); -public: - GlobalTimer(void); - ~GlobalTimer(void); -public: - void Init(); - void Freeze(); - bool Update(); - bool ViewportIsMoving(); - void DoStep(int count); - void SetMoveViewPort(ieDword x, ieDword y, int spd, bool center); - void SetFadeToColor(unsigned long Count); - void SetFadeFromColor(unsigned long Count); - void SetWait(unsigned long Count); - void SetScreenShake(unsigned long shakeX, unsigned long shakeY, - unsigned long Count); - void AddAnimation(ControlAnimation* ctlanim, unsigned long time); - void RemoveAnimation(ControlAnimation* ctlanim); - void ClearAnimations(); - void UpdateAnimations(); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Holder.h b/project/jni/application/gemrb/gemrb/core/Holder.h deleted file mode 100644 index 170a4c87e..000000000 --- a/project/jni/application/gemrb/gemrb/core/Holder.h +++ /dev/null @@ -1,95 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef HOLDER_H -#define HOLDER_H - -#include -#include - -template -class Held { -public: - Held() : RefCount(0) {} - void acquire() { ++RefCount; } - void release() { assert(RefCount && "Broken Held usage."); - if (!--RefCount) delete static_cast(this); } - size_t GetRefCount() { return RefCount; } -private: - size_t RefCount; -}; - -/** - * @class Holder - * Intrusive smart pointer. - * - * The class T must have member function acquire and release, such that - * acquire increases the refcount, and release decreses the refcount and - * frees the object if needed. - * - * Derived class of Holder shouldn't add member variables. That way, - * they can freely converted to Holder without slicing. - */ - -template -class Holder { -public: - Holder(T* ptr = NULL) - : ptr(ptr) - { - if (ptr) - ptr->acquire(); - } - ~Holder() - { - if (ptr) - ptr->release(); - } - Holder(const Holder& rhs) - : ptr(rhs.ptr) - { - if (ptr) - ptr->acquire(); - } - Holder& operator=(const Holder& rhs) - { - if (rhs.ptr) - rhs.ptr->acquire(); - if (ptr) - ptr->release(); - ptr = rhs.ptr; - return *this; - } - T& operator*() const { return *ptr; } - T* operator->() const { return ptr; } - bool operator!() const { return !ptr; } -#include "operatorbool.h" - OPERATOR_BOOL(Holder,T,ptr) - T* get() const { return ptr; } - void release() { - if (ptr) - ptr->release(); - ptr = NULL; - } -protected: - T *ptr; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/Image.cpp b/project/jni/application/gemrb/gemrb/core/Image.cpp deleted file mode 100644 index 8b03e095b..000000000 --- a/project/jni/application/gemrb/gemrb/core/Image.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "Image.h" - -#include "Interface.h" -#include "Video.h" - -Image::Image(unsigned int w, unsigned int h) - : height(h), width(w), data(new Color[height*width]) -{ -} - -Image::~Image() -{ - delete[] data; -} - -Sprite2D* Image::GetSprite2D() -{ - union { - Color color; - ieDword Mask; - } r = {{ 0xFF, 0x00, 0x00, 0x00 }}, - g = {{ 0x00, 0xFF, 0x00, 0x00 }}, - b = {{ 0x00, 0x00, 0xFF, 0x00 }}, - a = {{ 0x00, 0x00, 0x00, 0xFF }}; - void *pixels = malloc(sizeof(Color) * height*width); - memcpy(pixels, data, sizeof(Color)*height*width); - return core->GetVideoDriver()->CreateSprite(width, height, 32, - r.Mask, g.Mask, b.Mask, a.Mask, pixels); -} diff --git a/project/jni/application/gemrb/gemrb/core/Image.h b/project/jni/application/gemrb/gemrb/core/Image.h deleted file mode 100644 index 9628d6561..000000000 --- a/project/jni/application/gemrb/gemrb/core/Image.h +++ /dev/null @@ -1,61 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef IMAGE_H -#define IMAGE_H - -#include "RGBAColor.h" -#include "exports.h" - -class Sprite2D; - -class GEM_EXPORT Image { -public: - Image(unsigned int height, unsigned int width); - ~Image(); - Color GetPixel(unsigned int x, unsigned int y) const - { - if (x >= width || y >= height) { - static const Color black = { 0, 0, 0, 0 }; - return black; - } - return data[width*y+x]; - - } - void SetPixel(unsigned int x, unsigned int y, Color idx) - { - if (x >= width || y >= height) - return; - data[width*y+x] = idx; - - } - unsigned int GetHeight() const - { - return height; - } - unsigned int GetWidth() const - { - return width; - } - Sprite2D *GetSprite2D(); -private: - unsigned int height, width; - Color *data; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/ImageFactory.cpp b/project/jni/application/gemrb/gemrb/core/ImageFactory.cpp deleted file mode 100644 index 17ad0d0c6..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageFactory.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "ImageFactory.h" - -#include "Interface.h" -#include "Video.h" - -ImageFactory::ImageFactory(const char* ResRef, Sprite2D* bitmap_) - : FactoryObject( ResRef, IE_BMP_CLASS_ID ), bitmap(bitmap_) -{ - -} - -ImageFactory::~ImageFactory(void) -{ - core->GetVideoDriver()->FreeSprite( bitmap ); -} - -Sprite2D* ImageFactory::GetSprite2D() const -{ - bitmap->acquire(); - return bitmap; -} - diff --git a/project/jni/application/gemrb/gemrb/core/ImageFactory.h b/project/jni/application/gemrb/gemrb/core/ImageFactory.h deleted file mode 100644 index c0576d99f..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageFactory.h +++ /dev/null @@ -1,40 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef IMAGEFACTORY_H -#define IMAGEFACTORY_H - -#include "exports.h" -#include "globals.h" - -#include "FactoryObject.h" -#include "Sprite2D.h" - -class GEM_EXPORT ImageFactory : public FactoryObject { -private: - Sprite2D* bitmap; -public: - ImageFactory(const char* ResRef, Sprite2D* bitmap); - ~ImageFactory(void); - - Sprite2D* GetSprite2D() const; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp b/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp deleted file mode 100644 index 3275d3e13..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "ImageMgr.h" - -#include "win32def.h" - -#include "ImageFactory.h" -#include "Interface.h" -#include "Video.h" - -const TypeID ImageMgr::ID = { "ImageMgr" }; - -ImageMgr::ImageMgr(void) -{ -} - -ImageMgr::~ImageMgr(void) -{ -} - -Bitmap* ImageMgr::GetBitmap() -{ - unsigned int height = GetHeight(); - unsigned int width = GetWidth(); - Bitmap *data = new Bitmap(width, height); - - printMessage("ImageMgr", "Don't know how to handle 24bit bitmap from %s...", WHITE, - str->filename ); - printStatus( "ERROR", LIGHT_RED ); - - Sprite2D *spr = GetSprite2D(); - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - data->SetAt(x,y, spr->GetPixel(x,y).r); - } - } - - core->GetVideoDriver()->FreeSprite(spr); - - return data; -} - -Image* ImageMgr::GetImage() -{ - unsigned int height = GetHeight(); - unsigned int width = GetWidth(); - Image *data = new Image(width, height); - - Sprite2D *spr = GetSprite2D(); - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - data->SetPixel(x,y, spr->GetPixel(x,y)); - } - } - - core->GetVideoDriver()->FreeSprite(spr); - - return data; -} - -void ImageMgr::GetPalette(int /*colors*/, Color* /*pal*/) -{ - printMessage("ImageMgr", "Can't get non-existant palette from %s... ", WHITE, - str->filename); - printStatus("ERROR", LIGHT_RED); -} - -ImageFactory* ImageMgr::GetImageFactory(const char* ResRef) -{ - ImageFactory* fact = new ImageFactory( ResRef, GetSprite2D() ); - return fact; -} diff --git a/project/jni/application/gemrb/gemrb/core/ImageMgr.h b/project/jni/application/gemrb/gemrb/core/ImageMgr.h deleted file mode 100644 index 40d4709eb..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageMgr.h +++ /dev/null @@ -1,68 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef IMAGEMGR_H -#define IMAGEMGR_H - -#include "exports.h" - -#include "Bitmap.h" -#include "Image.h" -#include "Resource.h" -#include "Sprite2D.h" -#include "System/DataStream.h" - -class ImageFactory; - -/** - * Base class for Image plugins. - */ -class GEM_EXPORT ImageMgr : public Resource { -public: - static const TypeID ID; -public: - ImageMgr(void); - virtual ~ImageMgr(void); - /** Returns a \ref Sprite2D containing the image. */ - virtual Sprite2D* GetSprite2D() = 0; - virtual Image* GetImage(); - virtual Bitmap* GetBitmap(); - /** - * Returns image palette. - * - * @param[in] colors Number of colors to return. - * @param[out] pal Array to fill with colors. - * - * This does nothing if there is no palette. - */ - virtual void GetPalette(int colors, Color* pal); - /** Returns the width of the image */ - virtual int GetWidth() = 0; - /** Returns the height of the image */ - virtual int GetHeight() = 0; - /** - * Returns a \ref ImageFactory for the current image. - * - * @param[in] ResRef name of image represented by factory. - */ - ImageFactory* GetImageFactory(const char* ResRef); -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/ImageWriter.cpp b/project/jni/application/gemrb/gemrb/core/ImageWriter.cpp deleted file mode 100644 index 4c2eae78b..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageWriter.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "ImageWriter.h" - -ImageWriter::ImageWriter(void) -{ -} - -ImageWriter::~ImageWriter(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/ImageWriter.h b/project/jni/application/gemrb/gemrb/core/ImageWriter.h deleted file mode 100644 index a02a44b7b..000000000 --- a/project/jni/application/gemrb/gemrb/core/ImageWriter.h +++ /dev/null @@ -1,35 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef IMAGEWRITER_H -#define IMAGEWRITER_H - -#include "Plugin.h" -#include "Sprite2D.h" -#include "System/DataStream.h" - -class GEM_EXPORT ImageWriter : public Plugin { -public: - ImageWriter(void); - ~ImageWriter(void); - - /** Writes an Sprite2D to a stream and frees the sprite. */ - virtual void PutImage(DataStream *output, Sprite2D *sprite) = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp b/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp deleted file mode 100644 index e39eb6891..000000000 --- a/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#include "IndexedArchive.h" - -IndexedArchive::IndexedArchive(void) -{ -} - -IndexedArchive::~IndexedArchive(void) -{ -} diff --git a/project/jni/application/gemrb/gemrb/core/IndexedArchive.h b/project/jni/application/gemrb/gemrb/core/IndexedArchive.h deleted file mode 100644 index 3938ceee9..000000000 --- a/project/jni/application/gemrb/gemrb/core/IndexedArchive.h +++ /dev/null @@ -1,36 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -#ifndef INDEXEDARCHIVE_H -#define INDEXEDARCHIVE_H - -#include "globals.h" - -#include "Plugin.h" - -class GEM_EXPORT IndexedArchive : public Plugin { -public: - IndexedArchive(void); - virtual ~IndexedArchive(void); - virtual int OpenArchive(const char* filename) = 0; - virtual DataStream* GetStream(unsigned long Resource, unsigned long Type) = 0; -}; - -#endif diff --git a/project/jni/application/gemrb/gemrb/core/IniSpawn.cpp b/project/jni/application/gemrb/gemrb/core/IniSpawn.cpp deleted file mode 100644 index 374ecc956..000000000 --- a/project/jni/application/gemrb/gemrb/core/IniSpawn.cpp +++ /dev/null @@ -1,717 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2007 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -// This class handles the special spawn structures of planescape torment -// (stored in .ini format) - -#include "IniSpawn.h" - -#include "win32def.h" - -#include "CharAnimations.h" -#include "Game.h" -#include "GameData.h" -#include "Interface.h" -#include "Map.h" -#include "PluginMgr.h" -#include "GameScript/GSUtils.h" -#include "GameScript/Matching.h" -#include "Scriptable/Actor.h" - -static const int StatValues[9]={ -IE_EA, IE_FACTION, IE_TEAM, IE_GENERAL, IE_RACE, IE_CLASS, IE_SPECIFIC, -IE_SEX, IE_ALIGNMENT }; - -IniSpawn::IniSpawn(Map *owner) -{ - map = owner; - NamelessSpawnArea[0] = 0; - NamelessState = 35; - NamelessVar = NULL; - namelessvarcount = 0; - Locals = NULL; - localscount = 0; - eventspawns = NULL; - eventcount = 0; - last_spawndate = 0; -} - -IniSpawn::~IniSpawn() -{ - if (eventspawns) { - delete[] eventspawns; - } -} - -static Holder GetIniFile(const ieResRef DefaultArea) -{ - //the lack of spawn ini files is not a serious problem, happens all the time - if (!gamedata->Exists( DefaultArea, IE_INI_CLASS_ID)) { - return NULL; - } - - DataStream* inifile = gamedata->GetResource( DefaultArea, IE_INI_CLASS_ID ); - if (!inifile) { - return NULL; - } - if (!core->IsAvailable( IE_INI_CLASS_ID )) { - printStatus( "ERROR", LIGHT_RED ); - printMessage( "IniSpawn","No INI Importer Available.\n",LIGHT_RED ); - return NULL; - } - - PluginHolder ini(IE_INI_CLASS_ID); - ini->Open(inifile); - return ini; -} - -/*** initializations ***/ - -static inline int CountElements(const char *s, char separator) -{ - int ret = 1; - while(*s) { - if (*s==separator) ret++; - s++; - } - return ret; -} - -static inline void GetElements(const char *s, ieResRef *storage, int count) -{ - while(count--) { - ieResRef *field = storage+count; - strnuprcpy(*field, s, sizeof(ieResRef)-1); - for(size_t i=0;iGetKeyAsString(crittername,"spec_var",NULL); - if (s) { - if ((strlen(s)>9) && s[6]==':' && s[7]==':') { - strnuprcpy(critter.SpecContext, s, 6); - strnlwrcpy(critter.SpecVar, s+8, 32); - } else { - strnuprcpy(critter.SpecContext, "GLOBAL", 6); - strnlwrcpy(critter.SpecVar, s, 32); - } - } - - //add this to specvar at each spawn - ps = inifile->GetKeyAsInt(crittername,"spec_var_inc", 0); - critter.SpecVarInc=ps; - - //use this value with spec_var_operation to determine spawn - ps = inifile->GetKeyAsInt(crittername,"spec_var_value",0); - critter.SpecVarValue=ps; - //this operation uses DiffCore - s = inifile->GetKeyAsString(crittername,"spec_var_operation",""); - critter.SpecVarOperator=GetDiffMode(s); - //the amount of critters to spawn - critter.TotalQuantity = inifile->GetKeyAsInt(crittername,"spec_qty",1); - critter.SpawnCount = inifile->GetKeyAsInt(crittername,"create_qty",critter.TotalQuantity); - - //the creature resource(s) - s = inifile->GetKeyAsString(crittername,"cre_file",NULL); - if (s) { - critter.creaturecount = CountElements(s,','); - critter.CreFile=new ieResRef[critter.creaturecount]; - GetElements(s, critter.CreFile, critter.creaturecount); - } else { - printMessage("IniSpawn", "Invalid spawn entry: %s\n", LIGHT_RED, crittername); - } - - s = inifile->GetKeyAsString(crittername,"point_select",NULL); - - if (s) { - ps=s[0]; - } else { - ps=0; - } - - s = inifile->GetKeyAsString(crittername,"spawn_point",NULL); - if (s) { - //expect more than one spawnpoint - if (ps=='r') { - //select one of the spawnpoints randomly - int count = core->Roll(1,CountElements(s,']'),-1); - //go to the selected spawnpoint - while(count--) { - while(*s++!=']') ; - } - } - //parse the selected spawnpoint - int x,y,o; - if (sscanf(s,"[%d.%d:%d]", &x, &y, &o)==3) { - critter.SpawnPoint.x=(short) x; - critter.SpawnPoint.y=(short) y; - critter.Orientation=o; - } else { - if (sscanf(s,"[%d.%d]", &x, &y)==2) { - critter.SpawnPoint.x=(short) x; - critter.SpawnPoint.y=(short) y; - critter.Orientation=core->Roll(1,16,-1); - } - } - } - - //store or retrieve spawn point - s = inifile->GetKeyAsString(crittername,"spawn_point_global", NULL); - if (s) { - switch (ps) { - case 'e': - critter.SpawnPoint.fromDword(CheckVariable(map, s+8,s)); - break; - default: - //see save_selected_point - //SetVariable(map, s+8, s, critter.SpawnPoint.asDword()); - break; - } - } - - //take facing from variable - s = inifile->GetKeyAsString(crittername,"spawn_facing_global", NULL); - if (s) { - switch (ps) { - case 'e': - critter.Orientation=(int) CheckVariable(map, s+8,s); - break; - default: - //see save_selected_point - //SetVariable(map, s+8, s, (ieDword) critter.Orientation); - break; - } - } - - s = inifile->GetKeyAsString(crittername,"save_selected_point",NULL); - if (s) { - if ((strlen(s)>9) && s[6]==':' && s[7]==':') { - SetVariable(map, s+8, s, critter.SpawnPoint.asDword()); - } else { - SetVariable(map, s, "GLOBAL", critter.SpawnPoint.asDword()); - } - } - s = inifile->GetKeyAsString(crittername,"save_selected_facing",NULL); - if (s) { - if ((strlen(s)>9) && s[6]==':' && s[7]==':') { - SetVariable(map, s+8, s, (ieDword) critter.Orientation); - } else { - SetVariable(map, s, "GLOBAL", (ieDword) critter.Orientation); - } - } - - //sometimes only the orientation is given, the point is stored in a variable - ps = inifile->GetKeyAsInt(crittername,"facing",-1); - if (ps!=-1) critter.Orientation = ps; - ps = inifile->GetKeyAsInt(crittername, "ai_ea",-1); - if (ps!=-1) critter.SetSpec[AI_EA] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_team",-1); - if (ps!=-1) critter.SetSpec[AI_TEAM] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_general",-1); - if (ps!=-1) critter.SetSpec[AI_GENERAL] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_race",-1); - if (ps!=-1) critter.SetSpec[AI_RACE] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_class",-1); - if (ps!=-1) critter.SetSpec[AI_CLASS] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_specifics",-1); - if (ps!=-1) critter.SetSpec[AI_SPECIFICS] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_gender",-1); - if (ps!=-1) critter.SetSpec[AI_GENDER] = (ieByte) ps; - ps = inifile->GetKeyAsInt(crittername, "ai_alignment",-1); - if (ps!=-1) critter.SetSpec[AI_ALIGNMENT] = (ieByte) ps; - - s = inifile->GetKeyAsString(crittername,"spec",NULL); - if (s) { - int x[9]; - - ps = sscanf(s,"[%d.%d.%d.%d.%d.%d.%d.%d.%d]", x, x+1, x+2, x+3, x+4, x+5, - x+6, x+7, x+8); - if (ps == 0) { - strnuprcpy(critter.ScriptName, s, 32); - critter.Flags|=CF_CHECK_NAME; - memset(critter.Spec,-1,sizeof(critter.Spec)); - } else { - while(ps--) { - critter.Spec[ps]=(ieByte) x[ps]; - } - } - } - - s = inifile->GetKeyAsString(crittername,"script_name",NULL); - if (s) { - strnuprcpy(critter.ScriptName, s, 32); - } - - //iwd2 script names (override remains the same) - //special 1 == area - s = inifile->GetKeyAsString(crittername,"script_special_1",NULL); - if (s) { - strnuprcpy(critter.AreaScript,s, 8); - } - //special 2 == class - s = inifile->GetKeyAsString(crittername,"script_special_2",NULL); - if (s) { - strnuprcpy(critter.ClassScript,s, 8); - } - //special 3 == general - s = inifile->GetKeyAsString(crittername,"script_special_3",NULL); - if (s) { - strnuprcpy(critter.GeneralScript,s, 8); - } - //team == specific - s = inifile->GetKeyAsString(crittername,"script_team",NULL); - if (s) { - strnuprcpy(critter.SpecificScript,s, 8); - } - - //combat == race - s = inifile->GetKeyAsString(crittername,"script_combat",NULL); - if (s) { - strnuprcpy(critter.RaceScript,s, 8); - } - //movement == default - s = inifile->GetKeyAsString(crittername,"script_movement",NULL); - if (s) { - strnuprcpy(critter.DefaultScript,s, 8); - } - - //pst script names - s = inifile->GetKeyAsString(crittername,"script_override",NULL); - if (s) { - strnuprcpy(critter.OverrideScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_class",NULL); - if (s) { - strnuprcpy(critter.ClassScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_race",NULL); - if (s) { - strnuprcpy(critter.RaceScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_general",NULL); - if (s) { - strnuprcpy(critter.GeneralScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_default",NULL); - if (s) { - strnuprcpy(critter.DefaultScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_area",NULL); - if (s) { - strnuprcpy(critter.AreaScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"script_specifics",NULL); - if (s) { - strnuprcpy(critter.SpecificScript,s, 8); - } - s = inifile->GetKeyAsString(crittername,"dialog",NULL); - if (s) { - strnuprcpy(critter.Dialog,s, 8); - } - - //flags - if (inifile->GetKeyAsBool(crittername,"death_scriptname",false)) { - critter.Flags|=CF_DEATHVAR; - } - //don't spawn when spawnpoint is visible - if (inifile->GetKeyAsBool(crittername,"ignore_can_see",false)) { - critter.Flags|=CF_IGNORECANSEE; - } - //unsure, but could be similar to previous - if (inifile->GetKeyAsBool(crittername,"check_view_port", false)) { - critter.Flags|=CF_CHECKVIEWPORT; - } - //unknown, this is used only in pst - if (inifile->GetKeyAsBool(crittername,"check_crowd", false)) { - critter.Flags|=CF_CHECKCROWD; - } - //unknown, this is used only in pst - if (inifile->GetKeyAsBool(crittername,"find_safest_point", false)) { - critter.Flags|=CF_SAFESTPOINT; - } - //disable spawn based on game difficulty - if (inifile->GetKeyAsBool(crittername,"area_diff_1", false)) { - critter.Flags|=CF_NO_DIFF_1; - } - if (inifile->GetKeyAsBool(crittername,"area_diff_2", false)) { - critter.Flags|=CF_NO_DIFF_2; - } - if (inifile->GetKeyAsBool(crittername,"area_diff_3", false)) { - critter.Flags|=CF_NO_DIFF_3; - } -} - -void IniSpawn::ReadSpawnEntry(DataFileMgr *inifile, const char *entryname, SpawnEntry &entry) -{ - const char *s; - - entry.interval = (unsigned int) inifile->GetKeyAsInt(entryname,"interval",0); - //don't default to NULL here, some entries may be missing in original game - //an empty default string here will create an empty but consistent entry - s = inifile->GetKeyAsString(entryname,"critters",""); - int crittercount = CountElements(s,','); - entry.crittercount=crittercount; - entry.critters=new CritterEntry[crittercount]; - ieVariable *critters = new ieVariable[crittercount]; - GetElements(s, critters, crittercount); - while(crittercount--) { - ReadCreature(inifile, critters[crittercount], entry.critters[crittercount]); - } - delete[] critters; -} - -/* set by action */ -void IniSpawn::SetNamelessDeath(const ieResRef area, Point &pos, ieDword state) -{ - strnuprcpy(NamelessSpawnArea, area, 8); - NamelessSpawnPoint = pos; - NamelessState = state; -} - -void IniSpawn::InitSpawn(const ieResRef DefaultArea) -{ - const char *s; - - Holder inifile = GetIniFile(DefaultArea); - if (!inifile) { - strnuprcpy(NamelessSpawnArea, DefaultArea, 8); - return; - } - - s = inifile->GetKeyAsString("nameless","destare",DefaultArea); - strnuprcpy(NamelessSpawnArea, s, 8); - s = inifile->GetKeyAsString("nameless","point","[0.0]"); - int x,y; - if (sscanf(s,"[%d.%d]", &x, &y)!=2) { - x=0; - y=0; - } - NamelessSpawnPoint.x=x; - NamelessSpawnPoint.y=y; - //35 - already standing - //36 - getting up - NamelessState = inifile->GetKeyAsInt("nameless","state",36); - - namelessvarcount = inifile->GetKeysCount("namelessvar"); - if (namelessvarcount) { - NamelessVar = new VariableSpec[namelessvarcount]; - for (y=0;yGetKeyNameByIndex("namelessvar",y); - strnlwrcpy(NamelessVar[y].Name, Key, 32); - NamelessVar[y].Value = inifile->GetKeyAsInt("namelessvar",Key,0); - } - } - - localscount = inifile->GetKeysCount("locals"); - if (localscount) { - Locals = new VariableSpec[localscount]; - for (y=0;yGetKeyNameByIndex("locals",y); - strnlwrcpy(Locals[y].Name, Key, 32); - Locals[y].Value = inifile->GetKeyAsInt("locals",Key,0); - } - } - - s = inifile->GetKeyAsString("spawn_main","enter",NULL); - if (s) { - ReadSpawnEntry(inifile.get(), s, enterspawn); - } - s = inifile->GetKeyAsString("spawn_main","events",NULL); - if (s) { - eventcount = CountElements(s,','); - eventspawns = new SpawnEntry[eventcount]; - ieVariable *events = new ieVariable[eventcount]; - GetElements(s, events, eventcount); - int ec = eventcount; - while(ec--) { - ReadSpawnEntry(inifile.get(), events[ec], eventspawns[ec]); - } - delete[] events; - } - //maybe not correct - InitialSpawn(); -} - - -/*** events ***/ - -//respawn nameless after he bit the dust -void IniSpawn::RespawnNameless() -{ - Game *game = core->GetGame(); - Actor *nameless = game->GetPC(0, false); - - if (NamelessSpawnPoint.isnull()) { - core->GetGame()->JoinParty(nameless,JP_INITPOS); - NamelessSpawnPoint=nameless->Pos; - strnuprcpy(NamelessSpawnArea, nameless->Area, 8); - } - - nameless->Resurrect(); - //hardcoded!!! - if (NamelessState==36) { - nameless->SetStance(IE_ANI_PST_START); - } - int i; - - for (i=0;iGetPartySize(false);i++) { - MoveBetweenAreasCore(game->GetPC(i, false),NamelessSpawnArea,NamelessSpawnPoint,-1, true); - } - - //certain variables are set when nameless dies - for (i=0;i=0) { - // dunno if this should be negated - if (!DiffCore(specvar, critter.SpecVarValue, critter.SpecVarOperator) ) { - return; - } - } else { - //ar0203 in PST seems to want the check this way. - //if other areas conflict and you want to use (!specvar), - //please research further - //researched further - ar0203 respawns only if specvar is 1 - if (!specvar) { - return; - } - } - } - - if (!(critter.Flags&CF_IGNORECANSEE)) { - if (map->IsVisible(critter.SpawnPoint, false) ) { - return; - } - } - - if (critter.Flags&CF_NO_DIFF_MASK) { - ieDword difficulty; - ieDword diff_bit; - - core->GetDictionary()->Lookup("Difficulty Level", difficulty); - switch (difficulty) - { - case 0: - diff_bit = CF_NO_DIFF_1; - break; - case 1: - diff_bit = CF_NO_DIFF_2; - break; - case 2: - diff_bit = CF_NO_DIFF_3; - break; - default: - diff_bit = 0; - } - if (critter.Flags&diff_bit) { - return; - } - } - - if (critter.ScriptName[0] && (critter.Flags&CF_CHECK_NAME) ) { - //maybe this one needs to be using getobjectcount as well - //currently we cannot count objects with scriptname??? - if (map->GetActor( critter.ScriptName, 0 )) { - return; - } - } else { - //Object *object = new Object(); - Object object; - //objectfields based on spec - object.objectFields[0]=critter.Spec[0]; - object.objectFields[1]=critter.Spec[1]; - object.objectFields[2]=critter.Spec[2]; - object.objectFields[3]=critter.Spec[3]; - object.objectFields[4]=critter.Spec[4]; - object.objectFields[5]=critter.Spec[5]; - object.objectFields[6]=critter.Spec[6]; - object.objectFields[7]=critter.Spec[7]; - object.objectFields[8]=critter.Spec[8]; - int cnt = GetObjectCount(map, &object); - if (cnt>=critter.TotalQuantity) { - return; - } - } - - int x = core->Roll(1,critter.creaturecount,-1); - Actor* cre = gamedata->GetCreature(critter.CreFile[x]); - if (!cre) { - return; - } - - SetVariable(map, critter.SpecVar, critter.SpecContext, specvar+(ieDword) critter.SpecVarInc); - map->AddActor(cre); - for (x=0;x<9;x++) { - if (critter.SetSpec[x]) { - cre->SetBase(StatValues[x], critter.SetSpec[x]); - } - } - cre->SetPosition( critter.SpawnPoint, 0, 0);//maybe critters could be repositioned - cre->SetOrientation(critter.Orientation,false); - if (critter.ScriptName[0]) { - cre->SetScriptName(critter.ScriptName); - } - if (critter.OverrideScript[0]) { - cre->SetScript(critter.OverrideScript, SCR_OVERRIDE); - } - if (critter.ClassScript[0]) { - cre->SetScript(critter.ClassScript, SCR_CLASS); - } - if (critter.RaceScript[0]) { - cre->SetScript(critter.RaceScript, SCR_RACE); - } - if (critter.GeneralScript[0]) { - cre->SetScript(critter.GeneralScript, SCR_GENERAL); - } - if (critter.DefaultScript[0]) { - cre->SetScript(critter.DefaultScript, SCR_DEFAULT); - } - if (critter.AreaScript[0]) { - cre->SetScript(critter.AreaScript, SCR_AREA); - } - if (critter.SpecificScript[0]) { - cre->SetScript(critter.SpecificScript, SCR_SPECIFICS); - } - if (critter.Dialog[0]) { - cre->SetDialog(critter.Dialog); - } -} - -void IniSpawn::SpawnGroup(SpawnEntry &event) -{ - if (!event.critters) { - return; - } - unsigned int interval = event.interval; - if (interval) { - if(core->GetGame()->GameTime/interval<=last_spawndate/interval) { - return; - } - } - last_spawndate=core->GetGame()->GameTime; - - for(int i=0;iSpawnCount;j++) { - SpawnCreature(*critter); - } - } -} - -//execute the initial spawn -void IniSpawn::InitialSpawn() -{ - SpawnGroup(enterspawn); - //these variables are set when entering first - for (int i=0;i.ini files - * @author The GemRB Project - */ - -#ifndef INISPAWN_H -#define INISPAWN_H - -#include "exports.h" -#include "ie_types.h" - -#include "DataFileMgr.h" -#include "Region.h" - -class Map; - -/** - * @struct CritterEntry - */ - -//critter flags -#define CF_IGNORECANSEE 1 -#define CF_DEATHVAR 2 -#define CF_NO_DIFF_1 4 -#define CF_NO_DIFF_2 8 -#define CF_NO_DIFF_3 16 -#define CF_CHECKVIEWPORT 32 -#define CF_CHECKCROWD 64 -#define CF_SAFESTPOINT 128 -#define CF_NO_DIFF_MASK 28 -#define CF_CHECK_NAME 256 -//spec ids flags -#define AI_EA 0 -#define AI_FACTION 1 -#define AI_TEAM 2 -#define AI_GENERAL 3 -#define AI_RACE 4 -#define AI_CLASS 5 -#define AI_SPECIFICS 6 -#define AI_GENDER 7 -#define AI_ALIGNMENT 8 - -//spawn point could be: -// s - single -// r - random -// e - preset -// save_select_point saves the spawnpoint - -struct CritterEntry { - int creaturecount; - ieResRef *CreFile; //spawn one of these creatures - ieByte Spec[9]; //existance check IDS qualifier - ieByte SetSpec[9]; //set IDS qualifier - ieVariable ScriptName; //existance check scripting name - ieVariable SpecVar; //condition variable - ieResRef SpecContext; //condition variable context - ieResRef OverrideScript; //override override script - ieResRef ClassScript; //overrride class script - ieResRef RaceScript; //override race script - ieResRef GeneralScript; //override general script - ieResRef DefaultScript; //override default script - ieResRef AreaScript; //override area script - ieResRef SpecificScript; //override specific script - ieResRef Dialog; //override dialog - ieVariable SpawnPointVar; //spawn point saved location - Point SpawnPoint; //spawn point - int SpecVarOperator; //operation performed on spec var - int SpecVarValue; //using this value with the operation - int SpecVarInc; //add this to spec var at each spawn - int Orientation; //spawn orientation - int Flags; //CF_IGNORENOSEE, CF_DEATHVAR, etc - int TotalQuantity; //total number - int SpawnCount; //create quantity -}; - -/** - * @class SpawnEntry - */ -class SpawnEntry { -public: - ieDword interval; - int crittercount; - CritterEntry *critters; - SpawnEntry() { - interval = 0; - crittercount = 0; - critters = NULL; - } - ~SpawnEntry() { - if (critters) { - for (int i=0;i -#endif - -#include "Interface.h" - -#include "exports.h" -#include "globals.h" -#include "strrefs.h" -#include "win32def.h" - -#include "ActorMgr.h" -#include "AmbientMgr.h" -#include "AnimationMgr.h" -#include "ArchiveImporter.h" -#include "Audio.h" -#include "Calendar.h" -#include "DataFileMgr.h" -#include "DialogHandler.h" -#include "DialogMgr.h" -#include "DisplayMessage.h" -#include "EffectMgr.h" -#include "EffectQueue.h" -#include "Factory.h" -#include "Game.h" -#include "GameData.h" -#include "GlobalTimer.h" -#include "ImageMgr.h" -#include "ItemMgr.h" -#include "KeyMap.h" -#include "MapMgr.h" -#include "MoviePlayer.h" -#include "MusicMgr.h" -#include "Palette.h" -#include "PluginLoader.h" -#include "PluginMgr.h" -#include "ProjectileServer.h" -#include "SaveGameIterator.h" -#include "SaveGameMgr.h" -#include "ScriptEngine.h" -#include "ScriptedAnimation.h" -#include "SoundMgr.h" -#include "SpellMgr.h" -#include "StoreMgr.h" -#include "StringMgr.h" -#include "SymbolMgr.h" -#include "TileMap.h" -#include "Video.h" -#include "WindowMgr.h" -#include "WorldMapMgr.h" -#include "GameScript/GameScript.h" -#include "GUI/Button.h" -#include "GUI/Console.h" -#include "GUI/EventMgr.h" -#include "GUI/GameControl.h" -#include "GUI/Label.h" -#include "GUI/MapControl.h" -#include "GUI/Window.h" -#include "GUI/WorldMapControl.h" -#include "Scriptable/Container.h" -#include "System/FileStream.h" -#include "System/VFS.h" - -#if defined(__HAIKU__) -#include -#endif - -#include -#include -#include - -GEM_EXPORT Interface* core; - -#ifdef WIN32 -GEM_EXPORT HANDLE hConsole; -#endif - -//use DialogF.tlk if the protagonist is female, that's why we leave space -static const char dialogtlk[] = "dialog.tlk\0"; - -static int MaximumAbility = 25; -static ieWordSigned *strmod = NULL; -static ieWordSigned *strmodex = NULL; -static ieWordSigned *intmod = NULL; -static ieWordSigned *dexmod = NULL; -static ieWordSigned *conmod = NULL; -static ieWordSigned *chrmod = NULL; -static ieWordSigned *lorebon = NULL; -static ieWordSigned *wisbon = NULL; -static int **reputationmod = NULL; -static ieVariable IWD2DeathVarFormat = "_DEAD%s"; -static ieVariable DeathVarFormat = "SPRITE_IS_DEAD%s"; - -Interface::Interface(int iargc, char* iargv[]) -{ - argc = iargc; - argv = iargv; -#ifdef WIN32 - hConsole = GetStdHandle( STD_OUTPUT_HANDLE ); -#endif - textcolor( LIGHT_WHITE ); - print( "GemRB Core Version v%s Loading...\n", VERSION_GEMRB ); - - // default to the correct endianswitch - ieWord endiantest = 1; - if (((char *)&endiantest)[1] == 1) { - // big-endian - DataStream::SetEndianSwitch(true); - } - - unsigned int i; - for(i=0;i<256;i++) { - pl_uppercase[i]=(ieByte) toupper(i); - pl_lowercase[i]=(ieByte) tolower(i); - } - - projserv = NULL; - VideoDriverName = "sdl"; - AudioDriverName = "openal"; - vars = NULL; - tokens = NULL; - lists = NULL; - RtRows = NULL; - sgiterator = NULL; - game = NULL; - calendar = NULL; - keymap = NULL; - worldmap = NULL; - CurrentStore = NULL; - CurrentContainer = NULL; - UseContainer = false; - InfoTextPalette = NULL; - timer = NULL; - displaymsg = NULL; - evntmgr = NULL; - console = NULL; - slottypes = NULL; - slotmatrix = NULL; - - ModalWindow = NULL; - tooltip_x = 0; - tooltip_y = 0; - tooltip_currtextw = 0; - tooltip_ctrl = NULL; - plugin_flags = NULL; - - pal16 = NULL; - pal32 = NULL; - pal256 = NULL; - - GUIEnhancements = 0; - - CursorCount = 0; - Cursors = NULL; - - mousescrollspd = 10; - - strncpy( GameType, "auto", sizeof( GameType )-1); - ConsolePopped = false; - CheatFlag = false; - FogOfWar = 1; - QuitFlag = QF_NORMAL; - EventFlag = EF_CONTROL; -#ifndef WIN32 - CaseSensitive = true; //this is the default value, so CD1/CD2 will be resolved -#else - CaseSensitive = false; -#endif - GameOnCD = false; - SkipIntroVideos = false; - DrawFPS = false; - KeepCache = false; - TouchScrollAreas = false; - TooltipDelay = 100; - IgnoreOriginalINI = 0; - FullScreen = 0; - GUIScriptsPath[0] = 0; - GamePath[0] = 0; - SavePath[0] = 0; - GemRBPath[0] = 0; - PluginsPath[0] = 0; - CachePath[0] = 0; - GemRBOverridePath[0] = 0; - GameName[0] = 0; - - strncpy( GameOverridePath, "override", sizeof(GameOverridePath) ); - strncpy( GameSoundsPath, "sounds", sizeof(GameSoundsPath) ); - strncpy( GameScriptsPath, "scripts", sizeof(GameScriptsPath) ); - strncpy( GamePortraitsPath, "portraits", sizeof(GamePortraitsPath) ); - strncpy( GameCharactersPath, "characters", sizeof(GameCharactersPath) ); - strncpy( GameDataPath, "data", sizeof(GameDataPath) ); - strncpy( INIConfig, "baldur.ini", sizeof(INIConfig) ); - strncpy( ButtonFont, "STONESML", sizeof(ButtonFont) ); - strncpy( TooltipFont, "STONESML", sizeof(TooltipFont) ); - strncpy( MovieFont, "STONESML", sizeof(MovieFont) ); - strncpy( ScrollCursorBam, "CURSARW", sizeof(ScrollCursorBam) ); - strncpy( GlobalScript, "BALDUR", sizeof(GlobalScript) ); - strncpy( WorldMapName[0], "WORLDMAP", sizeof(ieResRef) ); - memset( WorldMapName[1], 0, sizeof(ieResRef) ); - strncpy( Palette16, "MPALETTE", sizeof(Palette16) ); - strncpy( Palette32, "PAL32", sizeof(Palette32) ); - strncpy( Palette256, "MPAL256", sizeof(Palette256) ); - strcpy( TooltipBackResRef, "\0" ); - for (int size = 0; size < MAX_CIRCLE_SIZE; size++) { - strcpy( GroundCircleBam[size], "\0" ); - GroundCircleScale[size] = 0; - } - TooltipColor.r = 0; - TooltipColor.g = 255; - TooltipColor.b = 0; - TooltipColor.a = 255; - TooltipMargin = 10; - - TooltipBack = NULL; - DraggedItem = NULL; - DraggedPortrait = 0; - DefSound = NULL; - DSCount = -1; - memset(GameFeatures, 0, sizeof( GameFeatures )); - //GameFeatures = 0; - //GameFeatures2 = 0; - memset( WindowFrames, 0, sizeof( WindowFrames )); - memset( GroundCircles, 0, sizeof( GroundCircles )); - memset(FogSprites, 0, sizeof( FogSprites )); - AreaAliasTable = NULL; - ItemExclTable = NULL; - ItemDialTable = NULL; - ItemDial2Table = NULL; - ItemTooltipTable = NULL; - update_scripts = false; - SpecialSpellsCount = -1; - SpecialSpells = NULL; - - gamedata = new GameData(); -} - -#define FreeResourceVector(type, variable) \ -{ \ - size_t i=variable.size(); \ - while(i--) { \ - if (variable[i]) { \ - delete variable[i]; \ - } \ - } \ - variable.clear(); \ -} - -//2da lists are ieDword lists allocated by malloc -static void Release2daList(void *poi) -{ - free( (ieDword *) poi); -} - -static void ReleaseItemList(void *poi) -{ - delete ((ItemList *) poi); -} - -static void FreeAbilityTables() -{ - if (strmod) { - free(strmod); - } - strmod = NULL; - if (strmodex) { - free(strmodex); - } - strmodex = NULL; - if (intmod) { - free(intmod); - } - intmod = NULL; - if (dexmod) { - free(dexmod); - } - dexmod = NULL; - if (conmod) { - free(conmod); - } - conmod = NULL; - if (chrmod) { - free(chrmod); - } - chrmod = NULL; - if (lorebon) { - free(lorebon); - } - lorebon = NULL; - if (wisbon) { - free(wisbon); - } - wisbon = NULL; -} - -void Interface::FreeResRefTable(ieResRef *&table, int &count) -{ - if (table) { - free( table ); - count = -1; - } -} - -static void ReleaseItemTooltip(void *poi) -{ - free(poi); -} - -Interface::~Interface(void) -{ - DragItem(NULL,NULL); - delete AreaAliasTable; - - if (music) { - music->HardEnd(); - } - // stop any ambients which are still enqueued - if (AudioDriver) { - AmbientMgr *ambim = AudioDriver->GetAmbientMgr(); - if (ambim) ambim->deactivate(); - } - //destroy the highest objects in the hierarchy first! - delete game; - delete calendar; - delete worldmap; - delete keymap; - - FreeAbilityTables(); - - if (reputationmod) { - for (unsigned int i=0; i<20; i++) { - if (reputationmod[i]) { - free(reputationmod[i]); - } - } - free(reputationmod); - reputationmod=NULL; - } - - if (SpecialSpells) { - free(SpecialSpells); - } - SurgeSpells.clear(); - - PluginMgr::Get()->RunCleanup(); - - ReleaseMemoryActor(); - EffectQueue_ReleaseMemory(); - CharAnimations::ReleaseMemory(); - - FreeResRefTable(DefSound, DSCount); - - free( slottypes ); - free( slotmatrix ); - - delete sgiterator; - - if (Cursors) { - for (int i = 0; i < CursorCount; i++) { - video->FreeSprite( Cursors[i] ); - } - delete[] Cursors; - } - - FreeResourceVector( Font, fonts ); - FreeResourceVector( Window, windows ); - - size_t i; - for (i = 0; i < musiclist.size(); i++) { - free((void *)musiclist[i]); - } - - DamageInfoMap.clear(); - - ModalStates.clear(); - - delete plugin_flags; - - delete projserv; - - delete console; - - delete pal256; - delete pal32; - delete pal16; - - delete timer; - delete displaymsg; - - if (video) { - - for(i=0;iFreeSprite(FogSprites[i]); - } - - for(i=0;i<4;i++) { - video->FreeSprite(WindowFrames[i]); - } - - for (int size = 0; size < MAX_CIRCLE_SIZE; size++) { - for(i=0;i<6;i++) { - video->FreeSprite(GroundCircles[size][i]); - } - } - - if (TooltipBack) { - for(i=0;i<3;i++) { - //freesprite checks for null pointer - video->FreeSprite(TooltipBack[i]); - } - delete[] TooltipBack; - } - if (InfoTextPalette) { - gamedata->FreePalette(InfoTextPalette); - } - - video->SetDragCursor(NULL); - } - - delete evntmgr; - - delete vars; - delete tokens; - if (lists) { - lists->RemoveAll(Release2daList); - delete lists; - } - - if (RtRows) { - RtRows->RemoveAll(ReleaseItemList); - delete RtRows; - } - if (ItemExclTable) { - ItemExclTable->RemoveAll(NULL); - delete ItemExclTable; - } - if (ItemDialTable) { - ItemDialTable->RemoveAll(NULL); - delete ItemDialTable; - } - if (ItemDial2Table) { - ItemDial2Table->RemoveAll(NULL); - delete ItemDial2Table; - } - if (ItemTooltipTable) { - ItemTooltipTable->RemoveAll(ReleaseItemTooltip); - delete ItemTooltipTable; - } - - Map::ReleaseMemory(); - Actor::ReleaseMemory(); - - gamedata->ClearCaches(); - delete gamedata; - gamedata = NULL; - - // Removing all stuff from Cache, except bifs - if (!KeepCache) DelTree((const char *) CachePath, true); -} - -void Interface::SetWindowFrame(int i, Sprite2D *Picture) -{ - video->FreeSprite(WindowFrames[i]); - WindowFrames[i]=Picture; -} - -GameControl* Interface::StartGameControl() -{ - //making sure that our window is the first one - if (ConsolePopped) { - PopupConsole(); - } - DelAllWindows();//deleting ALL windows - gamedata->DelTable(0xffffu); //dropping ALL tables - Window* gamewin = new Window( 0xffff, 0, 0, (ieWord) Width, (ieWord) Height ); - gamewin->WindowPack[0]=0; - GameControl* gc = new GameControl(); - gc->XPos = 0; - gc->YPos = 0; - gc->Width = (ieWord) Width; - gc->Height = (ieWord) Height; - gc->Owner = gamewin; - gc->ControlID = 0x00000000; - gc->ControlType = IE_GUI_GAMECONTROL; - gamewin->AddControl( gc ); - AddWindow( gamewin ); - SetVisible( 0, WINDOW_VISIBLE ); - //setting the focus to the game control - evntmgr->SetFocused(gamewin, gc); - if (guiscript->LoadScript( "MessageWindow" )) { - guiscript->RunFunction( "MessageWindow", "OnLoad" ); - gc->UnhideGUI(); - } - - return gc; -} - -/* handle main loop events that might destroy or create windows -thus cannot be called from DrawWindows directly -these events are pending until conditions are right -*/ -void Interface::HandleEvents() -{ - GameControl *gc = GetGameControl(); - if (gc && (!gc->Owner || !gc->Owner->Visible)) { - gc=NULL; - } - - if (EventFlag&EF_SELECTION) { - EventFlag&=~EF_SELECTION; - guiscript->RunFunction( "GUICommonWindows", "SelectionChanged", false); - } - - if (EventFlag&EF_UPDATEANIM) { - EventFlag&=~EF_UPDATEANIM; - guiscript->RunFunction( "GUICommonWindows", "UpdateAnimation", false); - } - - if (EventFlag&EF_PORTRAIT) { - ieDword tmp = (ieDword) ~0; - vars->Lookup( "PortraitWindow", tmp ); - if (tmp != (ieDword) ~0) { - EventFlag&=~EF_PORTRAIT; - guiscript->RunFunction( "GUICommonWindows", "UpdatePortraitWindow" ); - } - } - - if (EventFlag&EF_ACTION) { - ieDword tmp = (ieDword) ~0; - vars->Lookup( "ActionsWindow", tmp ); - if (tmp != (ieDword) ~0) { - EventFlag&=~EF_ACTION; - guiscript->RunFunction( "GUICommonWindows", "UpdateActionsWindow" ); - } - } - - if ((EventFlag&EF_CONTROL) && gc) { - EventFlag&=~EF_CONTROL; - guiscript->RunFunction( "MessageWindow", "UpdateControlStatus" ); - //this is the only value we can use here - if (game->ControlStatus & CS_HIDEGUI) - gc->HideGUI(); - else - gc->UnhideGUI(); - return; - } - if ((EventFlag&EF_SHOWMAP) && gc) { - ieDword tmp = (ieDword) ~0; - vars->Lookup( "OtherWindow", tmp ); - if (tmp == (ieDword) ~0) { - EventFlag &= ~EF_SHOWMAP; - guiscript->RunFunction( "GUIMA", "ShowMap" ); - } - return; - } - - if (EventFlag&EF_SEQUENCER) { - EventFlag&=~EF_SEQUENCER; - guiscript->RunFunction( "GUIMG", "OpenSequencerWindow" ); - return; - } - - if (EventFlag&EF_IDENTIFY) { - EventFlag&=~EF_IDENTIFY; - // FIXME: Implement this. - guiscript->RunFunction( "GUICommonWindows", "OpenIdentifyWindow" ); - return; - } - if (EventFlag&EF_OPENSTORE) { - EventFlag&=~EF_OPENSTORE; - guiscript->RunFunction( "GUISTORE", "OpenStoreWindow" ); - return; - } - - if (EventFlag&EF_EXPANSION) { - EventFlag&=~EF_EXPANSION; - guiscript->RunFunction( "MessageWindow", "GameExpansion", false ); - return; - } - - if (EventFlag&EF_CREATEMAZE) { - EventFlag&=~EF_CREATEMAZE; - guiscript->RunFunction( "Maze", "CreateMaze", false ); - return; - } - - if ((EventFlag&EF_RESETTARGET) && gc) { - EventFlag&=~EF_RESETTARGET; - EventFlag|=EF_TARGETMODE; - gc->ResetTargetMode(); - return; - } - - if ((EventFlag&EF_TARGETMODE) && gc) { - EventFlag&=~EF_TARGETMODE; - gc->UpdateTargetMode(); - return; - } -} - -/* handle main loop events that might destroy or create windows -thus cannot be called from DrawWindows directly -*/ -void Interface::HandleFlags() -{ - //clear events because the context changed - EventFlag = EF_CONTROL; - - if (QuitFlag&(QF_QUITGAME|QF_EXITGAME) ) { - // when reaching this, quitflag should be 1 or 2 - // if Exitgame was set, we'll set Start.py too - QuitGame (QuitFlag&QF_EXITGAME); - QuitFlag &= ~(QF_QUITGAME|QF_EXITGAME); - } - - if (QuitFlag&QF_LOADGAME) { - QuitFlag &= ~QF_LOADGAME; - LoadGame(LoadGameIndex.get(), VersionOverride ); - LoadGameIndex.release(); - //after loading a game, always check if the game needs to be upgraded - } - - if (QuitFlag&QF_ENTERGAME) { - QuitFlag &= ~QF_ENTERGAME; - if (game) { - EventFlag|=EF_EXPANSION; - timer->Init(); - - //rearrange party slots - game->ConsolidateParty(); - GameControl* gc = StartGameControl(); - //switch map to protagonist - Actor* actor = GetFirstSelectedPC(true); - if (actor) { - gc->ChangeMap(actor, true); - } - } else { - printMessage("Core", "No game to enter...\n", LIGHT_RED); - QuitFlag = QF_QUITGAME; - } - } - - if (QuitFlag&QF_CHANGESCRIPT) { - QuitFlag &= ~QF_CHANGESCRIPT; - guiscript->LoadScript( NextScript ); - guiscript->RunFunction( NextScript, "OnLoad" ); - } -} - -static bool GenerateAbilityTables() -{ - FreeAbilityTables(); - - //range is: 0 - maximumability - int tablesize = MaximumAbility+1; - strmod = (ieWordSigned *) malloc (tablesize * 4 * sizeof(ieWordSigned) ); - if (!strmod) - return false; - strmodex = (ieWordSigned *) malloc (101 * 4 * sizeof(ieWordSigned) ); - if (!strmodex) - return false; - intmod = (ieWordSigned *) malloc (tablesize * 5 * sizeof(ieWordSigned) ); - if (!intmod) - return false; - dexmod = (ieWordSigned *) malloc (tablesize * 3 * sizeof(ieWordSigned) ); - if (!dexmod) - return false; - conmod = (ieWordSigned *) malloc (tablesize * 5 * sizeof(ieWordSigned) ); - if (!conmod) - return false; - chrmod = (ieWordSigned *) malloc (tablesize * 1 * sizeof(ieWordSigned) ); - if (!chrmod) - return false; - lorebon = (ieWordSigned *) malloc (tablesize * 1 * sizeof(ieWordSigned) ); - if (!lorebon) - return false; - wisbon = (ieWordSigned *) malloc (tablesize * 1 * sizeof(ieWordSigned) ); - if (!wisbon) - return false; - return true; -} - -bool Interface::ReadAbilityTable(const ieResRef tablename, ieWordSigned *mem, int columns, int rows) -{ - AutoTable tab(tablename); - if (!tab) { - return false; - } - //this is a hack for rows not starting at 0 in some cases - int fix = 0; - const char * tmp = tab->GetRowName(0); - if (tmp && (tmp[0]!='0')) { - fix = atoi(tmp); - for (int i=0;iQueryField(0,j),NULL,0 ); - } - } - } - for (int j=0;jQueryField(i,j),NULL,0 ); - } - } - return true; -} - -bool Interface::ReadAbilityTables() -{ - bool ret = GenerateAbilityTables(); - if (!ret) - return ret; - ret = ReadAbilityTable("strmod", strmod, 4, MaximumAbility + 1); - if (!ret) - return ret; - ret = ReadAbilityTable("strmodex", strmodex, 4, 101); - //3rd ed doesn't have strmodex, but has a maximum of 40 - if (!ret && (MaximumAbility<=25) ) - return ret; - ret = ReadAbilityTable("intmod", intmod, 5, MaximumAbility + 1); - if (!ret) - return ret; - ret = ReadAbilityTable("hpconbon", conmod, 5, MaximumAbility + 1); - if (!ret) - return ret; - if (!HasFeature(GF_3ED_RULES)) { - //no lorebon in iwd2??? - ret = ReadAbilityTable("lorebon", lorebon, 1, MaximumAbility + 1); - if (!ret) - return ret; - //no dexmod in iwd2??? - ret = ReadAbilityTable("dexmod", dexmod, 3, MaximumAbility + 1); - if (!ret) - return ret; - } - //this table is a single row (not a single column) - ret = ReadAbilityTable("chrmodst", chrmod, MaximumAbility + 1, 1); - if (!ret) - return ret; - if (HasFeature(GF_WISDOM_BONUS)) { - ret = ReadAbilityTable("wisxpbon", wisbon, 1, MaximumAbility + 1); - if (!ret) - return ret; - } - return true; -} - -bool Interface::ReadGameTimeTable() -{ - AutoTable table("gametime"); - if (!table) { - return false; - } - - Time.round_sec = atoi(table->QueryField("ROUND_SECONDS", "DURATION")); - Time.turn_sec = atoi(table->QueryField("TURN_SECONDS", "DURATION")); - Time.round_size = Time.round_sec * AI_UPDATE_TIME; - Time.rounds_per_turn = Time.turn_sec / Time.round_sec; - - return true; -} - -bool Interface::ReadSpecialSpells() -{ - int i; - bool result = true; - - AutoTable table("splspec"); - if (table) { - SpecialSpellsCount = table->GetRowCount(); - SpecialSpells = (SpellDescType *) malloc( sizeof(SpellDescType) * SpecialSpellsCount); - for (i=0;iGetRowName(i),8 ); - //if there are more flags, compose this value into a bitfield - SpecialSpells[i].value = atoi(table->QueryField(i,0) ); - } - } else { - result = false; - } - - table.load("wildmag"); - if (table) { - SurgeSpell ss; - for (i = 0; (unsigned)i < table->GetRowCount(); i++) { - strncpy(ss.spell, table->QueryField(i, 0), 8); - ss.message = strtol(table->QueryField(i, 1), NULL, 0); - // comment ignored - SurgeSpells.push_back(ss); - } - } else { - result = false; - } - - return result; -} - -int Interface::GetSpecialSpell(ieResRef resref) -{ - for (int i=0;iGetStat(IE_STATE_ID) & STATE_SILENCED ) { - if (!(sp&SP_SILENCE)) { - return 1; - } - } - - return 0; -} - -bool Interface::ReadAuxItemTables() -{ - int idx; - bool flag = true; - - if (ItemExclTable) { - ItemExclTable->RemoveAll(NULL); - } else { - ItemExclTable = new Variables(); - ItemExclTable->SetType(GEM_VARIABLES_INT); - } - - AutoTable aa; - - //don't report error when the file doesn't exist - if (aa.load("itemexcl")) { - idx = aa->GetRowCount(); - while (idx--) { - ieResRef key; - - strnlwrcpy(key,aa->GetRowName(idx),8); - ieDword value = strtol(aa->QueryField(idx,0),NULL,0); - ItemExclTable->SetAt(key, value); - } - } - if (ItemDialTable) { - ItemDialTable->RemoveAll(NULL); - } else { - ItemDialTable = new Variables(); - ItemDialTable->SetType(GEM_VARIABLES_INT); - } - if (ItemDial2Table) { - ItemDial2Table->RemoveAll(NULL); - } else { - ItemDial2Table = new Variables(); - ItemDial2Table->SetType(GEM_VARIABLES_STRING); - } - - //don't report error when the file doesn't exist - if (aa.load("itemdial")) { - idx = aa->GetRowCount(); - while (idx--) { - ieResRef key, dlgres; - - strnlwrcpy(key,aa->GetRowName(idx),8); - ieDword value = strtol(aa->QueryField(idx,0),NULL,0); - ItemDialTable->SetAt(key, value); - strnlwrcpy(dlgres,aa->QueryField(idx,1),8); - ItemDial2Table->SetAtCopy(key, dlgres); - } - } - - if (ItemTooltipTable) { - ItemTooltipTable->RemoveAll(ReleaseItemTooltip); - } else { - ItemTooltipTable = new Variables(); - ItemTooltipTable->SetType(GEM_VARIABLES_POINTER); - } - - //don't report error when the file doesn't exist - if (aa.load("tooltip")) { - idx = aa->GetRowCount(); - while (idx--) { - ieResRef key; - int *tmppoi = (int *) malloc(sizeof(int)*3); - - strnlwrcpy(key,aa->GetRowName(idx),8); - for (int i=0;i<3;i++) { - tmppoi[i] = atoi(aa->QueryField(idx,i)); - } - ItemTooltipTable->SetAt(key, (void*)tmppoi); - } - } - return flag; -} - -//Static -const char *Interface::GetDeathVarFormat() -{ - return DeathVarFormat; -} - -int Interface::GetItemExcl(const ieResRef itemname) const -{ - ieDword value; - - if (ItemExclTable && ItemExclTable->Lookup(itemname, value)) { - return (int) value; - } - return 0; -} - -int Interface::GetItemTooltip(const ieResRef itemname, int header, int identified) -{ - int *value = NULL; - - if (ItemTooltipTable) { - void* lookup = NULL; - ItemTooltipTable->Lookup(itemname, lookup); - value = (int*)lookup; - } - if (value && (value[header]>=0)) { - return value[header]; - } - Item *item = gamedata->GetItem(itemname); - if (!item) { - return -1; - } - int ret = identified?item->ItemNameIdentified:item->ItemName; - gamedata->FreeItem(item, itemname, 0); - return ret; -} - -int Interface::GetItemDialStr(const ieResRef itemname) const -{ - ieDword value; - - if (ItemDialTable && ItemDialTable->Lookup(itemname, value)) { - return (int) value; - } - return -1; -} - -//second value is the item dialog resource returned by this method -int Interface::GetItemDialRes(const ieResRef itemname, ieResRef retval) const -{ - if (ItemDial2Table && ItemDial2Table->Lookup(itemname, retval, sizeof(ieResRef))) { - return 1; - } - return 0; -} - -bool Interface::ReadAreaAliasTable(const ieResRef tablename) -{ - if (AreaAliasTable) { - AreaAliasTable->RemoveAll(NULL); - } else { - AreaAliasTable = new Variables(); - AreaAliasTable->SetType(GEM_VARIABLES_INT); - } - - AutoTable aa(tablename); - if (!aa) { - //don't report error when the file doesn't exist - return true; - } - - int idx = aa->GetRowCount(); - while (idx--) { - ieResRef key; - - strnlwrcpy(key,aa->GetRowName(idx),8); - ieDword value = atoi(aa->QueryField(idx,0)); - AreaAliasTable->SetAt(key, value); - } - return true; -} - -//this isn't const -int Interface::GetAreaAlias(const ieResRef areaname) const -{ - ieDword value; - - if (AreaAliasTable && AreaAliasTable->Lookup(areaname, value)) { - return (int) value; - } - return -1; -} - -bool Interface::ReadMusicTable(const ieResRef tablename, int col) { - AutoTable tm(tablename); - if (!tm) - return false; - - for (unsigned int i = 0; i < tm->GetRowCount(); i++) { - musiclist.push_back(strdup(tm->QueryField(i, col))); - } - - return true; -} - -bool Interface::ReadDamageTypeTable() { - AutoTable tm("dmgtypes"); - if (!tm) - return false; - - DamageInfoStruct di; - for (ieDword i = 0; i < tm->GetRowCount(); i++) { - di.strref = displaymsg->GetStringReference(atoi(tm->QueryField(i, 0))); - di.resist_stat = TranslateStat(tm->QueryField(i, 1)); - di.value = strtol(tm->QueryField(i, 2), (char **) NULL, 16); - di.iwd_mod_type = atoi(tm->QueryField(i, 3)); - DamageInfoMap.insert(std::make_pair ((ieDword)di.value, di)); - } - - return true; -} - -bool Interface::ReadReputationModTable() { - AutoTable tm("reputati"); - if (!tm) - return false; - - reputationmod = (int **) calloc(21, sizeof(int *)); - int cols = tm->GetColumnCount(); - for (unsigned int i=0; i<20; i++) { - reputationmod[i] = (int *) calloc(cols, sizeof(int)); - for (int j=0; jQueryField(i, j)); - } - } - - return true; -} - -bool Interface::ReadModalStates() -{ - AutoTable table("modal"); - if (!table) - return false; - - ModalStatesStruct ms; - for (unsigned short i = 0; i < table->GetRowCount(); i++) { - strncpy(ms.spell, table->QueryField(i, 0), 8); - strncpy(ms.action, table->QueryField(i, 1), 16); - ms.entering_str = atoi(table->QueryField(i, 2)); - ms.leaving_str = atoi(table->QueryField(i, 3)); - ms.failed_str = atoi(table->QueryField(i, 4)); - ms.aoe_spell = atoi(table->QueryField(i, 5)); - ModalStates.push_back(ms); - } - - return true; -} - -//Not a constant anymore, we let the caller set the entry to zero -char *Interface::GetMusicPlaylist(int SongType) const { - if (SongType < 0 || (unsigned int)SongType >= musiclist.size()) - return NULL; - - return musiclist[SongType]; -} - -static const Color white = {0xff,0xff,0xff,0xff}; -static const Color black = {0x00,0x00,0x00,0xff}; -static const Region bg( 0, 0, 100, 30 ); - -/** this is the main loop */ -void Interface::Main() -{ - ieDword brightness = 10; - ieDword contrast = 5; - ieDword speed = 10; - - vars->Lookup("Full Screen", FullScreen); - video->CreateDisplay( Width, Height, Bpp, FullScreen); - video->SetDisplayTitle( GameName, GameType ); - vars->Lookup("Brightness Correction", brightness); - vars->Lookup("Gamma Correction", contrast); - vars->Lookup("Mouse Scroll Speed", speed); - video->SetGamma(brightness, contrast); - SetMouseScrollSpeed((int) speed); - if (vars->Lookup("Tooltips", TooltipDelay)) { - // the games store the slider position*10, not the actual delay - TooltipDelay *= TOOLTIP_DELAY_FACTOR/10; - } - - Font* fps = GetFont( ( unsigned int ) 0 ); - char fpsstring[40]={"???.??? fps"}; - unsigned long frame = 0, time, timebase; - timebase = GetTickCount(); - double frames = 0.0; - Palette* palette = CreatePalette( white, black ); - do { - //don't change script when quitting is pending - - while (QuitFlag) { - HandleFlags(); - } - //eventflags are processed only when there is a game - if (EventFlag && game) { - HandleEvents(); - } - HandleGUIBehaviour(); - - GameLoop(); - DrawWindows(true); - if (DrawFPS) { - frame++; - time = GetTickCount(); - if (time - timebase > 1000) { - frames = ( frame * 1000.0 / ( time - timebase ) ); - timebase = time; - frame = 0; - sprintf( fpsstring, "%.3f fps", frames ); - } - video->DrawRect( bg, black ); - fps->Print( bg, - ( unsigned char * ) fpsstring, palette, - IE_FONT_ALIGN_LEFT | IE_FONT_ALIGN_MIDDLE, true ); - } - if (TickHook) - TickHook->call(); - } while (video->SwapBuffers() == GEM_OK); - gamedata->FreePalette( palette ); -} - -int Interface::ReadResRefTable(const ieResRef tablename, ieResRef *&data) -{ - int count = 0; - - if (data) { - free(data); - data = NULL; - } - AutoTable tm(tablename); - if (!tm) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find %s.2da.\n",tablename ); - return 0; - } - count = tm->GetRowCount(); - data = (ieResRef *) calloc( count, sizeof(ieResRef) ); - for (int i = 0; i < count; i++) { - strnlwrcpy( data[i], tm->QueryField( i, 0 ), 8 ); - //* marks an empty resource - if (data[i][0]=='*') { - data[i][0]=0; - } - } - return count; -} - -int Interface::LoadSprites() -{ - ieDword i; - int size; - if (!IsAvailable( IE_2DA_CLASS_ID )) { - print( "No 2DA Importer Available.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - - //loading cursors - AnimationFactory* anim; - anim = (AnimationFactory*) gamedata->GetFactoryResource("cursors", IE_BAM_CLASS_ID); - if (anim) - { - CursorCount = anim->GetCycleCount(); - Cursors = new Sprite2D * [CursorCount]; - for (int i = 0; i < CursorCount; i++) { - Cursors[i] = anim->GetFrame( 0, (ieByte) i ); - } - } - printMessage( "Core", "Loading Cursors...", WHITE ); - - // this is the last existing cursor type - if (CursorCountSetCursor( Cursors[0], Cursors[1] ); - printStatus( "OK", LIGHT_GREEN ); - - // Load fog-of-war bitmaps - anim = (AnimationFactory*) gamedata->GetFactoryResource("fogowar", IE_BAM_CLASS_ID); - printMessage( "Core", "Loading Fog-Of-War bitmaps...", WHITE ); - if (!anim || anim->GetCycleSize( 0 ) != 8) { - // unknown type of fog anim - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - - FogSprites[0] = NULL; - FogSprites[1] = anim->GetFrame( 0, 0 ); - FogSprites[2] = anim->GetFrame( 1, 0 ); - FogSprites[3] = anim->GetFrame( 2, 0 ); - - FogSprites[4] = video->MirrorSpriteVertical( FogSprites[1], false ); - - FogSprites[5] = NULL; - - FogSprites[6] = video->MirrorSpriteVertical( FogSprites[3], false ); - - FogSprites[7] = NULL; - - FogSprites[8] = video->MirrorSpriteHorizontal( FogSprites[2], false ); - - FogSprites[9] = video->MirrorSpriteHorizontal( FogSprites[3], false ); - - FogSprites[10] = NULL; - FogSprites[11] = NULL; - - FogSprites[12] = video->MirrorSpriteHorizontal( FogSprites[6], false ); - - FogSprites[16] = anim->GetFrame( 3, 0 ); - FogSprites[17] = anim->GetFrame( 4, 0 ); - FogSprites[18] = anim->GetFrame( 5, 0 ); - FogSprites[19] = anim->GetFrame( 6, 0 ); - - FogSprites[20] = video->MirrorSpriteVertical( FogSprites[17], false ); - - FogSprites[21] = NULL; - - FogSprites[23] = NULL; - - FogSprites[24] = video->MirrorSpriteHorizontal( FogSprites[18], false ); - - FogSprites[25] = anim->GetFrame( 7, 0 ); - - { - Sprite2D *tmpsprite = video->MirrorSpriteVertical( FogSprites[25], false ); - FogSprites[22] = video->MirrorSpriteHorizontal( tmpsprite, false ); - video->FreeSprite( tmpsprite ); - } - - FogSprites[26] = NULL; - FogSprites[27] = NULL; - - { - Sprite2D *tmpsprite = video->MirrorSpriteVertical( FogSprites[19], false ); - FogSprites[28] = video->MirrorSpriteHorizontal( tmpsprite, false ); - video->FreeSprite( tmpsprite ); - } - - i = 0; - vars->Lookup("3D Acceleration", i); - if (i) { - for(i=0;iCreateAlpha( FogSprites[i] ); - video->FreeSprite ( FogSprites[i] ); - FogSprites[i] = alphasprite; - } - } - } - - printStatus( "OK", LIGHT_GREEN ); - - // Load ground circle bitmaps (PST only) - //block required due to msvc6.0 incompatibility - for (size = 0; size < MAX_CIRCLE_SIZE; size++) { - if (GroundCircleBam[size][0]) { - anim = (AnimationFactory*) gamedata->GetFactoryResource(GroundCircleBam[size], IE_BAM_CLASS_ID); - if (!anim || anim->GetCycleCount() != 6) { - // unknown type of circle anim - printMessage( "Core", "Loading Ground circle bitmaps...", WHITE ); - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - - for (int i = 0; i < 6; i++) { - Sprite2D* sprite = anim->GetFrame( 0, (ieByte) i ); - if (GroundCircleScale[size]) { - GroundCircles[size][i] = video->SpriteScaleDown( sprite, GroundCircleScale[size] ); - video->FreeSprite( sprite ); - } else { - GroundCircles[size][i] = sprite; - } - } - } - } - - printMessage( "Core", "Loading Ground circle bitmaps...", WHITE ); - printStatus( "OK", LIGHT_GREEN ); - - printMessage( "Core", "Loading Fonts...\n", WHITE ); - AutoTable tab("fonts"); - if (!tab) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find fonts.2da.\nTermination in Progress...\n" ); - return GEM_ERROR; - } else { - PluginHolder bamint(IE_BAM_CLASS_ID); - if (!bamint) { - printStatus( "ERROR", LIGHT_RED ); - print( "No BAM Importer Available.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - DataStream* str = NULL; - - int count = tab->GetRowCount(); - for (int i = 0; i < count; i++) { - const char* ResRef = tab->QueryField( i, 0 ); - int needpalette = atoi( tab->QueryField( i, 1 ) ); - int first_char = atoi( tab->QueryField( i, 2 ) ); - str = gamedata->GetResource( ResRef, IE_BAM_CLASS_ID ); - if (!bamint->Open(str)) { - continue; - } - Font* fnt = bamint->GetFont(); - if (!fnt) { - continue; - } - strnlwrcpy( fnt->ResRef, ResRef, 8 ); - if (needpalette) { - - Color fore = {0xff, 0xff, 0xff, 0}; - Color back = {0x00, 0x00, 0x00, 0}; - if (!strnicmp( TooltipFont, ResRef, 8) ) { - if (TooltipColor.a==0xff) { - fore = TooltipColor; - } else { - fore = back; - back = TooltipColor; - } - } - Palette* pal = CreatePalette( fore, back ); - pal->CreateShadedAlphaChannel(); - fnt->SetPalette(pal); - gamedata->FreePalette( pal ); - } - fnt->SetFirstChar( (ieByte) first_char ); - fonts.push_back( fnt ); - } - - if (fonts.size() == 0) { - printMessage( "Core", "No default font loaded! ", WHITE ); - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - if (GetFont( ButtonFont ) == NULL) { - printMessage("Core", "ButtonFont not loaded: %s ", WHITE, - ButtonFont); - printStatus( "WARNING", YELLOW ); - } - if (GetFont( MovieFont ) == NULL) { - printMessage("Core", "MovieFont not loaded: %s ", WHITE, - MovieFont); - printStatus( "WARNING", YELLOW ); - } - if (GetFont( TooltipFont ) == NULL) { - printMessage("Core", "TooltipFont not loaded: %s ", WHITE, - TooltipFont); - printStatus( "WARNING", YELLOW ); - } - } - printMessage( "Core", "Fonts Loaded...", WHITE ); - printStatus( "OK", LIGHT_GREEN ); - - if (TooltipBackResRef[0]) { - anim = (AnimationFactory*) gamedata->GetFactoryResource(TooltipBackResRef, IE_BAM_CLASS_ID); - printMessage( "Core", "Initializing Tooltips...", WHITE ); - if (!anim) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - TooltipBack = new Sprite2D * [3]; - for (int i = 0; i < 3; i++) { - TooltipBack[i] = anim->GetFrame( 0, (ieByte) i ); - TooltipBack[i]->XPos = 0; - TooltipBack[i]->YPos = 0; - } - printStatus( "OK", LIGHT_GREEN ); - } - - return GEM_OK; -} - -int Interface::Init() -{ - plugin_flags = new Variables(); - plugin_flags->SetType( GEM_VARIABLES_INT ); - - printMessage( "Core", "Initializing the Event Manager...", WHITE ); - evntmgr = new EventMgr(); - - printMessage( "Core", "Initializing Lists Dictionary...", WHITE ); - lists = new Variables(); - if (!lists) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - lists->SetType( GEM_VARIABLES_POINTER ); - - printMessage( "Core", "Initializing Variables Dictionary...", WHITE ); - vars = new Variables(); - if (!vars) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - vars->SetType( GEM_VARIABLES_INT ); - vars->ParseKey(true); - - vars->SetAt( "Volume Ambients", 100 ); - vars->SetAt( "Volume Movie", 100 ); - vars->SetAt( "Volume Music", 100 ); - vars->SetAt( "Volume SFX", 100 ); - vars->SetAt( "Volume Voices", 100 ); - printStatus( "OK", LIGHT_GREEN ); - - if (!LoadConfig()) { - printMessage( "Core", "Could not load config file ", YELLOW); - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printMessage( "Core", "Starting Plugin Manager...\n", WHITE ); - PluginMgr *plugin = PluginMgr::Get(); - LoadPlugins(PluginsPath); - if (plugin && plugin->GetPluginCount()) { - printMessage( "Core", "Plugin Loading Complete...", WHITE ); - printStatus( "OK", LIGHT_GREEN ); - } else { - printMessage( "Core", "Plugin Loading Failed, check path...", YELLOW); - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - plugin->RunInitializers(); - - time_t t; - t = time( NULL ); - srand( ( unsigned int ) t ); -#ifdef _DEBUG - FileStreamPtrCount = 0; -#endif - printMessage( "Core", "GemRB Core Initialization...\n", WHITE ); - printStatus( "OK", LIGHT_GREEN ); - printMessage( "Core", "Initializing Video Driver...", WHITE ); - video = ( Video * ) PluginMgr::Get()->GetDriver(&Video::ID, VideoDriverName.c_str()); - if (!video) { - printStatus( "ERROR", LIGHT_RED ); - print( "No Video Driver Available.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - if (video->Init() == GEM_ERROR) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot Initialize Video Driver.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - Color defcolor={255,255,255,200}; - SetInfoTextColor(defcolor); - printStatus( "OK", LIGHT_GREEN ); - - { - printMessage( "Core", "Initializing Search Path...", WHITE ); - if (!IsAvailable( PLUGIN_RESOURCE_DIRECTORY )) { - print( "no DirectoryImporter! " ); - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - - char path[_MAX_PATH]; - - PathJoin( path, CachePath, NULL); - gamedata->AddSource(path, "Cache", PLUGIN_RESOURCE_DIRECTORY); - - PathJoin( path, GemRBOverridePath, "override", GameType, NULL); - gamedata->AddSource(path, "GemRB Override", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - size_t i; - for (i = 0; i < ModPath.size(); ++i) - gamedata->AddSource(ModPath[i].c_str(), "Mod paths", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GemRBOverridePath, "override", "shared", NULL); - gamedata->AddSource(path, "shared GemRB Override", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GamePath, GameOverridePath, NULL); - gamedata->AddSource(path, "Override", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GamePath, GameSoundsPath, NULL); - gamedata->AddSource(path, "Sounds", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GamePath, GameScriptsPath, NULL); - gamedata->AddSource(path, "Scripts", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GamePath, GamePortraitsPath, NULL); - gamedata->AddSource(path, "Portraits", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - PathJoin( path, GamePath, GameDataPath, NULL); - gamedata->AddSource(path, "Data", PLUGIN_RESOURCE_CACHEDDIRECTORY); - - //IWD2 movies are on the CD but not in the BIF - char *description = strdup("CD1/data"); - for (i = 0; i < MAX_CD; i++) { - for (size_t j=0;jAddSource(path, description, PLUGIN_RESOURCE_CACHEDDIRECTORY); - } - } - free(description); - - printStatus( "OK", LIGHT_GREEN ); - } - - { - printMessage( "Core", "Initializing KEY Importer...", WHITE ); - char ChitinPath[_MAX_PATH]; - PathJoin( ChitinPath, GamePath, "chitin.key", NULL ); - if (!gamedata->AddSource(ChitinPath, "chitin.key", PLUGIN_RESOURCE_KEY)) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - } - - printMessage( "Core", "Initializing GUI Script Engine...", WHITE ); - guiscript = PluginHolder(IE_GUI_SCRIPT_CLASS_ID); - if (guiscript == NULL) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - if (!guiscript->Init()) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - strcpy( NextScript, "Start" ); - - { - // re-set the gemrb override path, since we now have the correct GameType if 'auto' was used - char path[_MAX_PATH]; - PathJoin( path, GemRBOverridePath, "override", GameType, NULL); - gamedata->AddSource(path, "GemRB Override", PLUGIN_RESOURCE_CACHEDDIRECTORY, RM_REPLACE_SAME_SOURCE); - } - - printMessage( "Core", "Reading Game Options...\n", WHITE ); - if (!LoadGemRBINI()) { - print( "Cannot Load INI\nTermination in Progress...\n" ); - return GEM_ERROR; - } - - //loading baldur.ini - if (!IgnoreOriginalINI) { - char ini_path[_MAX_PATH]; - PathJoin( ini_path, GamePath, INIConfig, NULL ); - LoadINI( ini_path ); - } - - int i; - for (i = 0; i < 8; i++) { - if (INIConfig[i] == '.') - break; - GameNameResRef[i] = INIConfig[i]; - } - GameNameResRef[i] = 0; - - printMessage( "Core", "Creating Projectile Server...\n", WHITE ); - projserv = new ProjectileServer(); - if (!projserv->GetHighestProjectileNumber()) { - printStatus( "ERROR", LIGHT_RED ); - print( "No projectiles are available...\n" ); - } - - printMessage( "Core", "Checking for Dialogue Manager...", WHITE ); - if (!IsAvailable( IE_TLK_CLASS_ID )) { - printStatus( "ERROR", LIGHT_RED ); - print( "No TLK Importer Available.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - strings = PluginHolder(IE_TLK_CLASS_ID); - printMessage( "Core", "Loading Dialog.tlk file...", WHITE ); - char strpath[_MAX_PATH]; - PathJoin( strpath, GamePath, dialogtlk, NULL ); - FileStream* fs = FileStream::OpenFile(strpath); - if (!fs) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find Dialog.tlk.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - strings->Open(fs); - - { - printMessage( "Core", "Loading Palettes...\n", WHITE ); - ResourceHolder pal16im(Palette16); - if (pal16im) - pal16 = pal16im->GetImage(); - ResourceHolder pal32im(Palette32); - if (pal32im) - pal32 = pal32im->GetImage(); - ResourceHolder pal256im(Palette256); - if (pal256im) - pal256 = pal256im->GetImage(); - if (!pal16 || !pal32 || !pal256) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printMessage( "Core", "Palettes Loaded\n", WHITE ); - } - - if (!IsAvailable( IE_BAM_CLASS_ID )) { - printStatus( "ERROR", LIGHT_RED ); - print( "No BAM Importer Available.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - - printMessage( "Core", "Initializing stock sounds...\n", WHITE ); - DSCount = ReadResRefTable ("defsound", DefSound); - if (DSCount == 0) { - printStatus( "ERROR", LIGHT_RED ); - print( "Cannot find defsound.2da.\nTermination in Progress...\n" ); - return GEM_ERROR; - } - - printStatus( "OK", LIGHT_GREEN ); - printMessage( "Core", "Broadcasting Event Manager...", WHITE ); - video->SetEventMgr( evntmgr ); - printStatus( "OK", LIGHT_GREEN ); - printMessage( "Core", "Initializing Window Manager...", WHITE ); - windowmgr = PluginHolder(IE_CHU_CLASS_ID); - if (windowmgr == NULL) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - int ret = LoadSprites(); - if (ret) return ret; - - printMessage( "Core", "Setting up the Console...", WHITE ); - QuitFlag = QF_CHANGESCRIPT; - console = new Console(); - console->XPos = 0; - console->YPos = (ieWord) (Height - 25); - console->Width = (ieWord) Width; - console->Height = 25; - if (fonts.size() > 0) { - console->SetFont( fonts[0] ); - } - - Sprite2D *tmpsprite = GetCursorSprite(); - if (!tmpsprite) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - console->SetCursor (tmpsprite); - printStatus( "OK", LIGHT_GREEN ); - - printMessage( "Core", "Starting up the Sound Driver...", WHITE ); - AudioDriver = ( Audio * ) PluginMgr::Get()->GetDriver(&Audio::ID, AudioDriverName.c_str()); - if (AudioDriver == NULL) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - if (!AudioDriver->Init()) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - printMessage( "Core", "Allocating SaveGameIterator...", WHITE ); - sgiterator = new SaveGameIterator(); - if (sgiterator == NULL) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - //no need of strdup, variables do copy the key! - vars->SetAt( "SkipIntroVideos", (unsigned long)SkipIntroVideos ); - vars->SetAt( "GUIEnhancements", (unsigned long)GUIEnhancements ); - vars->SetAt( "TouchScrollAreas", (unsigned long)TouchScrollAreas ); - - printMessage( "Core", "Initializing Token Dictionary...", WHITE ); - tokens = new Variables(); - if (!tokens) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - tokens->SetType( GEM_VARIABLES_STRING ); - printStatus( "OK", LIGHT_GREEN ); - - printMessage( "Core", "Initializing Music Manager...", WHITE ); - music = PluginHolder(IE_MUS_CLASS_ID); - if (!music) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - printMessage("Core", "Loading music list...\n", WHITE ); - if (HasFeature( GF_HAS_SONGLIST )) { - ret = ReadMusicTable("songlist", 1); - } else { - /*since bg1 and pst has no .2da for songlist, - we must supply one in the gemrb/override folder. - It should be: music.2da, first column is a .mus filename*/ - ret = ReadMusicTable("music", 0); - } - if (ret) { - printStatus( "OK", LIGHT_GREEN ); - } else { - printStatus( "NOT FOUND", YELLOW ); - } - - if (HasFeature( GF_RESDATA_INI )) { - printMessage( "Core", "Loading resource data File...", WHITE ); - INIresdata = PluginHolder(IE_INI_CLASS_ID); - DataStream* ds = gamedata->GetResource("resdata", IE_INI_CLASS_ID); - if (!INIresdata->Open(ds)) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - } - - if (HasFeature( GF_HAS_PARTY_INI )) { - printMessage( "Core", "Loading precreated teams setup...\n", WHITE ); - INIparty = PluginHolder(IE_INI_CLASS_ID); - char tINIparty[_MAX_PATH]; - PathJoin( tINIparty, GamePath, "Party.ini", NULL ); - FileStream* fs = FileStream::OpenFile( tINIparty ); - if (!INIparty->Open(fs)) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - } - - if (HasFeature(GF_IWD2_DEATHVARFORMAT)) { - memcpy(DeathVarFormat, IWD2DeathVarFormat, sizeof(ieVariable)); - } - - if (HasFeature( GF_HAS_BEASTS_INI )) { - printMessage( "Core", "Loading beasts definition File...\n", WHITE ); - INIbeasts = PluginHolder(IE_INI_CLASS_ID); - char tINIbeasts[_MAX_PATH]; - PathJoin( tINIbeasts, GamePath, "beast.ini", NULL ); - // FIXME: crashes if file does not open - FileStream* fs = FileStream::OpenFile( tINIbeasts ); - if (!INIbeasts->Open(fs)) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - - printMessage( "Core", "Loading quests definition File...\n", WHITE ); - INIquests = PluginHolder(IE_INI_CLASS_ID); - char tINIquests[_MAX_PATH]; - PathJoin( tINIquests, GamePath, "quests.ini", NULL ); - // FIXME: crashes if file does not open - FileStream* fs2 = FileStream::OpenFile( tINIquests ); - if (!INIquests->Open(fs2)) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - } - game = NULL; - calendar = NULL; - keymap = NULL; - - timer = new GlobalTimer(); - printMessage( "Core", "Bringing up the Global Timer...", WHITE ); - if (!timer) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = Init_EffectQueue(); - printMessage( "Core", "Initializing effects...", WHITE ); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = InitItemTypes(); - printMessage( "Core", "Initializing Inventory Management...", WHITE ); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - displaymsg = new DisplayMessage(); - printMessage( "Core", "Initializing string constants...", WHITE ); - if (!displaymsg) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = ReadRandomItems(); - printMessage( "Core", "Initializing random treasure...", WHITE ); - if (ret) { - printStatus( "OK", LIGHT_GREEN ); - } - else { - printStatus( "ERROR", LIGHT_RED ); - } - - ret = ReadAbilityTables(); - printMessage( "Core", "Initializing ability tables...", WHITE ); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = ReadReputationModTable(); - printMessage( "Core", "Reading reputation mod table...", WHITE); - if (ret) { - printStatus( "OK", LIGHT_GREEN ); - } else { - printStatus( "NOT FOUND", LIGHT_RED ); - } - - if ( gamedata->Exists("WMAPLAY", IE_2DA_CLASS_ID) ) { - ret = ReadAreaAliasTable( "WMAPLAY" ); - printMessage( "Core", "Initializing area aliases...", WHITE ); - if (ret) { - printStatus( "OK", LIGHT_GREEN ); - } - else { - printStatus( "NOT FOUND", YELLOW ); - } - } - - ret = ReadGameTimeTable(); - printMessage( "Core", "Reading game time table...", WHITE); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = ReadSpecialSpells(); - printMessage( "Core", "Reading special spells table...", WHITE); - if (ret) { - printStatus( "OK", LIGHT_GREEN ); - } else { - printStatus( "NOT FOUND", YELLOW ); - } - - ret = ReadAuxItemTables(); - printMessage( "Core", "Reading item tables...", WHITE); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - printStatus( "OK", LIGHT_GREEN ); - - ret = ReadDamageTypeTable(); - printMessage( "Core", "Reading damage type table...", WHITE); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - - ret = ReadModalStates(); - printMessage( "Core", "Reading modal states table...", WHITE); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } else { - printStatus( "OK", LIGHT_GREEN ); - } - - printMessage( "Core", "Reading game script tables...", WHITE); - InitializeIEScript(); - printStatus( "OK", LIGHT_GREEN ); - - printMessage( "Core", "Initializing keymap tables...", WHITE); - keymap = new KeyMap(); - ret = keymap->InitializeKeyMap("keymap.ini", "keymap"); - if (!ret) { - printStatus( "ERROR", LIGHT_RED ); - } else { - printStatus( "OK", LIGHT_GREEN ); - } - printMessage( "Core", "Core Initialization Complete!\n", WHITE ); - - return GEM_OK; -} - -bool Interface::IsAvailable(SClass_ID filetype) const -{ - return PluginMgr::Get()->IsAvailable( filetype ); -} - -WorldMap *Interface::GetWorldMap(const char *map) -{ - int index = worldmap->FindAndSetCurrentMap(map?map:game->CurrentArea); - return worldmap->GetWorldMap(index); -} - -ProjectileServer* Interface::GetProjectileServer() const -{ - return projserv; -} - -Video* Interface::GetVideoDriver() const -{ - return video.get(); -} - -Audio* Interface::GetAudioDrv(void) const { - return AudioDriver.get(); -} - -const char* Interface::TypeExt(SClass_ID type) const -{ - switch (type) { - case IE_2DA_CLASS_ID: - return "2da"; - - case IE_ACM_CLASS_ID: - return "acm"; - - case IE_ARE_CLASS_ID: - return "are"; - - case IE_BAM_CLASS_ID: - return "bam"; - - case IE_BCS_CLASS_ID: - return "bcs"; - - case IE_BS_CLASS_ID: - return "bs"; - - case IE_BIF_CLASS_ID: - return "bif"; - - case IE_BIO_CLASS_ID: - if (HasFeature(GF_BIOGRAPHY_RES)) { - return "res"; - } - return "bio"; - - case IE_BMP_CLASS_ID: - return "bmp"; - - case IE_PNG_CLASS_ID: - return "png"; - - case IE_CHR_CLASS_ID: - return "chr"; - - case IE_CHU_CLASS_ID: - return "chu"; - - case IE_CRE_CLASS_ID: - return "cre"; - - case IE_DLG_CLASS_ID: - return "dlg"; - - case IE_EFF_CLASS_ID: - return "eff"; - - case IE_GAM_CLASS_ID: - return "gam"; - - case IE_IDS_CLASS_ID: - return "ids"; - - case IE_INI_CLASS_ID: - return "ini"; - - case IE_ITM_CLASS_ID: - return "itm"; - - case IE_MOS_CLASS_ID: - return "mos"; - - case IE_MUS_CLASS_ID: - return "mus"; - - case IE_MVE_CLASS_ID: - return "mve"; - - case IE_OGG_CLASS_ID: - return "ogg"; - - case IE_PLT_CLASS_ID: - return "plt"; - - case IE_PRO_CLASS_ID: - return "pro"; - - case IE_SAV_CLASS_ID: - return "sav"; - - case IE_SPL_CLASS_ID: - return "spl"; - - case IE_SRC_CLASS_ID: - return "src"; - - case IE_STO_CLASS_ID: - return "sto"; - - case IE_TIS_CLASS_ID: - return "tis"; - - case IE_TLK_CLASS_ID: - return "tlk"; - - case IE_TOH_CLASS_ID: - return "toh"; - - case IE_TOT_CLASS_ID: - return "tot"; - - case IE_VAR_CLASS_ID: - return "var"; - - case IE_VVC_CLASS_ID: - return "vvc"; - - case IE_WAV_CLASS_ID: - return "wav"; - - case IE_WED_CLASS_ID: - return "wed"; - - case IE_WFX_CLASS_ID: - return "wfx"; - - case IE_WMP_CLASS_ID: - return "wmp"; - } - return NULL; -} - -void Interface::FreeString(char *&str) const -{ - if (str) { - strings->FreeString(str); - } - str = NULL; -} - -ieStrRef Interface::UpdateString(ieStrRef strref, const char *text) const -{ - return strings->UpdateString( strref, text ); -} - -char* Interface::GetString(ieStrRef strref, ieDword options) const -{ - ieDword flags = 0; - - if (!(options & IE_STR_STRREFOFF)) { - vars->Lookup( "Strref On", flags ); - } - return strings->GetString( strref, flags | options ); -} - -void Interface::SetFeature(int flag, int position) -{ - if (flag) { - GameFeatures[position>>5] |= 1<<(position&31); - } else { - GameFeatures[position>>5] &= ~(1<<(position&31) ); - } -} - -ieDword Interface::HasFeature(int position) const -{ - return GameFeatures[position>>5] & (1<<(position&31)); -} - -/** Search directories and load a config file */ -bool Interface::LoadConfig(void) -{ -#ifndef WIN32 - char path[_MAX_PATH]; - char name[_MAX_PATH]; - - // Find directory where user stores GemRB configurations (~/.gemrb). - // FIXME: Create it if it does not exist - // Use current dir if $HOME is not defined (or bomb out??) - - char* s = getenv( "HOME" ); - if (s) { - strcpy( UserDir, s ); - strcat( UserDir, "/."PACKAGE"/" ); - } else { - strcpy( UserDir, "./" ); - } - - // Find basename of this program. It does the same as basename (3), - // but that's probably missing on some archs - s = strrchr( argv[0], PathDelimiter ); - if (s) { - s++; - } else { - s = argv[0]; - } - - strcpy( name, s ); - //if (!name[0]) // FIXME: could this happen? - // strcpy (name, PACKAGE); // ugly hack - - // If we were called as $0 -c , load config from filename - if (argc > 2 && ! strcmp("-c", argv[1])) { - if (LoadConfig( argv[2] )) { - return true; - } else { - // Explicitly specified cfg file HAS to be present - return false; - } - } - - // FIXME: temporary hack, to be deleted?? - if (LoadConfig( "GemRB.cfg" )) { - return true; - } - - PathJoinExt( path, UserDir, name, "cfg" ); - - if (LoadConfig( path )) { - return true; - } - -#ifdef SYSCONFDIR - PathJoinExt( path, SYSCONFDIR, name, "cfg" ); - - if (LoadConfig( path )) { - return true; - } -#endif - - // Don't try with default binary name if we have tried it already - if (!strcmp( name, PACKAGE )) { - return false; - } - - PathJoinExt( path, UserDir, PACKAGE, "cfg" ); - - if (LoadConfig( path )) { - return true; - } - -#ifdef SYSCONFDIR - PathJoinExt( path, SYSCONFDIR, PACKAGE, "cfg" ); - - if (LoadConfig( path )) { - return true; - } -#endif - - return false; -#else // WIN32 - // If we were called as $0 -c , load config from filename - if (argc > 2 && ! strcmp("-c", argv[1])) { - return LoadConfig( argv[2] ); - // Explicitly specified cfg file HAS to be present - } - strcpy( UserDir, ".\\" ); - return LoadConfig( "GemRB.cfg" ); -#endif// WIN32 -} - -bool Interface::LoadConfig(const char* filename) -{ - size_t i; - - printMessage("Config","Trying to open ", WHITE); - textcolor(LIGHT_WHITE); - print("%s ", filename); - FileStream* config = FileStream::OpenFile(filename); - if (config == NULL) { - printStatus("NOT FOUND", YELLOW); - return false; - } - - //once GemRB own format is working well, this might be set to 0 - SaveAsOriginal = 1; - - int lineno = 0; - while (config->Remains()) { - char line[1024]; - char *name, *nameend, *value, *valueend; - - if (config->ReadLine(line, _MAX_PATH) == -1) { - break; - } - lineno++; - - // skip leading blanks from name - name = line; - name += strspn( line, " \t\r\n" ); - - // ignore empty or comment lines - if (*name == '\0' || *name == '#') { - continue; - } - - value = strchr( name, '=' ); - if (!value || value == name) { - print( "Invalid line %d\n", lineno ); - continue; - } - - // trim trailing blanks from name - nameend = value; - while (nameend > name && strchr( "= \t", *nameend )) { - *nameend-- = '\0'; - } - - value++; - // skip leading blanks - value += strspn( value, " \t"); - - // trim trailing blanks from value - valueend = value + strlen( value ) - 1; - while (valueend >= value && strchr( " \t\r\n", *valueend )) { - *valueend-- = '\0'; - } - - if (false) { -#define CONFIG_INT(str, var) \ - } else if (stricmp(name, str) == 0) { \ - var ( atoi(value) ) - CONFIG_INT("Bpp", Bpp = ); - CONFIG_INT("CaseSensitive", CaseSensitive = ); - CONFIG_INT("DoubleClickDelay", evntmgr->SetDCDelay); - CONFIG_INT("DrawFPS", DrawFPS = ); - CONFIG_INT("EnableCheatKeys", EnableCheatKeys); - CONFIG_INT("EndianSwitch", DataStream::SetEndianSwitch); - CONFIG_INT("FogOfWar", FogOfWar = ); - CONFIG_INT("FullScreen", FullScreen = ); - CONFIG_INT("GUIEnhancements", GUIEnhancements = ); - CONFIG_INT("GameOnCD", GameOnCD = ); - CONFIG_INT("Height", Height = ); - CONFIG_INT("KeepCache", KeepCache = ); - CONFIG_INT("MultipleQuickSaves", GameControl::MultipleQuickSaves); - CONFIG_INT("RepeatKeyDelay", evntmgr->SetRKDelay); - CONFIG_INT("SaveAsOriginal", SaveAsOriginal = ); - CONFIG_INT("ScriptDebugMode", SetScriptDebugMode); - CONFIG_INT("SkipIntroVideos", SkipIntroVideos = ); - CONFIG_INT("TooltipDelay", TooltipDelay = ); - CONFIG_INT("Width", Width = ); - CONFIG_INT("IgnoreOriginalINI", IgnoreOriginalINI = ); - CONFIG_INT("TouchScrollAreas", TouchScrollAreas = ); -#undef CONFIG_INT -#define CONFIG_STRING(str, var) \ - } else if (stricmp(name, str) == 0) { \ - strncpy(var, value, sizeof(var)) - CONFIG_STRING("GameCharactersPath", GameCharactersPath); - CONFIG_STRING("GameDataPath", GameDataPath); - CONFIG_STRING("GameName", GameName); - CONFIG_STRING("GameOverridePath", GameOverridePath); - CONFIG_STRING("GamePortraitsPath", GamePortraitsPath); - CONFIG_STRING("GameScriptsPath", GameScriptsPath); - CONFIG_STRING("GameSoundsPath", GameSoundsPath); - CONFIG_STRING("GameType", GameType); -#undef CONFIG_STRING -#define CONFIG_STRING(str, var) \ - } else if (stricmp(name, str) == 0) { \ - var = value - CONFIG_STRING("AudioDriver", AudioDriverName); - CONFIG_STRING("VideoDriver", VideoDriverName); -#undef CONFIG_STRING -#define CONFIG_PATH(str, var) \ - } else if (stricmp(name, str) == 0) { \ - strncpy(var, value, sizeof(var)); - CONFIG_PATH("CachePath", CachePath); - CONFIG_PATH("GUIScriptsPath", GUIScriptsPath); - CONFIG_PATH("GamePath", GamePath); - CONFIG_PATH("GemRBOverridePath", GemRBOverridePath); - CONFIG_PATH("GemRBPath", GemRBPath); - CONFIG_PATH("PluginsPath", PluginsPath); - CONFIG_PATH("SavePath", SavePath); -#undef CONFIG_PATH - } else if (stricmp( name, "ModPath" ) == 0) { - for (char *path = strtok(value,SPathListSeparator); - path; - path = strtok(NULL,SPathListSeparator)) { - ModPath.push_back(path); - } - } else if (stricmp( name, "SkipPlugin" ) == 0) { - plugin_flags->SetAt( value, PLF_SKIP ); - } else if (stricmp( name, "DelayPlugin" ) == 0) { - plugin_flags->SetAt( value, PLF_DELAY ); - } else { - for(i=0;iGetResource( "gemrb", IE_INI_CLASS_ID ); - if (! inifile) { - printStatus( "ERROR", LIGHT_RED ); - return false; - } - - printMessage("Core", "Loading game type-specific GemRB setup...\n%s", WHITE, - inifile->originalfile); - - if (!IsAvailable( IE_INI_CLASS_ID )) { - printStatus( "ERROR", LIGHT_RED ); - print( "[Core]: No INI Importer Available.\n" ); - return false; - } - PluginHolder ini(IE_INI_CLASS_ID); - ini->Open(inifile); - - printStatus( "OK", LIGHT_GREEN ); - - const char *s; - - // Resrefs are already initialized in Interface::Interface() - s = ini->GetKeyAsString( "resources", "CursorBAM", NULL ); - if (s) - strnlwrcpy( CursorBam, s, 8 ); //console cursor - - s = ini->GetKeyAsString( "resources", "ScrollCursorBAM", NULL ); - if (s) - strnlwrcpy( ScrollCursorBam, s, 8 ); - - s = ini->GetKeyAsString( "resources", "ButtonFont", NULL ); - if (s) - strnlwrcpy( ButtonFont, s, 8 ); - - s = ini->GetKeyAsString( "resources", "TooltipFont", NULL ); - if (s) - strnlwrcpy( TooltipFont, s, 8 ); - - s = ini->GetKeyAsString( "resources", "MovieFont", NULL ); - if (s) - strnlwrcpy( MovieFont, s, 8 ); - - s = ini->GetKeyAsString( "resources", "TooltipBack", NULL ); - if (s) - strnlwrcpy( TooltipBackResRef, s, 8 ); - - s = ini->GetKeyAsString( "resources", "TooltipColor", NULL ); - if (s) { - if (s[0] == '#') { - unsigned long c = strtoul (s + 1, NULL, 16); - // FIXME: check errno - TooltipColor.r = (unsigned char) (c >> 24); - TooltipColor.g = (unsigned char) (c >> 16); - TooltipColor.b = (unsigned char) (c >> 8); - TooltipColor.a = (unsigned char) (c); - } - } - - //which stat determines the fist weapon (defaults to class) - Actor::SetFistStat(ini->GetKeyAsInt( "resources", "FistStat", IE_CLASS)); - - TooltipMargin = ini->GetKeyAsInt( "resources", "TooltipMargin", TooltipMargin ); - - // The format of GroundCircle can be: - // GroundCircleBAM1 = wmpickl/3 - // to denote that the bitmap should be scaled down 3x - for (int size = 0; size < MAX_CIRCLE_SIZE; size++) { - char name[30]; - sprintf( name, "GroundCircleBAM%d", size+1 ); - s = ini->GetKeyAsString( "resources", name, NULL ); - if (s) { - const char *pos = strchr( s, '/' ); - if (pos) { - GroundCircleScale[size] = atoi( pos+1 ); - strncpy( GroundCircleBam[size], s, pos - s ); - GroundCircleBam[size][pos - s] = '\0'; - } else { - strcpy( GroundCircleBam[size], s ); - } - } - } - - s = ini->GetKeyAsString( "resources", "NoteString", NULL ); - TextArea::SetNoteString(s); - - s = ini->GetKeyAsString( "resources", "INIConfig", NULL ); - if (s) - strcpy( INIConfig, s ); - - s = ini->GetKeyAsString( "resources", "Palette16", NULL ); - if (s) - strcpy( Palette16, s ); - - s = ini->GetKeyAsString( "resources", "Palette32", NULL ); - if (s) - strcpy( Palette32, s ); - - s = ini->GetKeyAsString( "resources", "Palette256", NULL ); - if (s) - strcpy( Palette256, s ); - - unsigned int i = (unsigned int) ini->GetKeyAsInt ("charset", "CharCount", 0); - if (i>99) i=99; - while(i--) { - char key[10]; - snprintf(key,9,"Letter%d", i+1); - s = ini->GetKeyAsString( "charset", key, NULL ); - if (s) { - const char *s2 = strchr(s,','); - if (s2) { - unsigned char upper = atoi(s); - unsigned char lower = atoi(s2+1); - pl_uppercase[lower] = upper; - pl_lowercase[upper] = lower; - } - } - } - - MaximumAbility = ini->GetKeyAsInt ("resources", "MaximumAbility", 25 ); - - RedrawTile = ini->GetKeyAsInt( "resources", "RedrawTile", 0 )!=0; - - for (i=0;iGetKeyAsInt( "resources", game_flags[i], 0 ), i ); - //printMessage("Option", "", GREEN); - //print("%s = %s\n", game_flags[i], HasFeature(i)?"yes":"no"); - } - - ForceStereo = ini->GetKeyAsInt( "resources", "ForceStereo", 0 ); - - return true; -} - -Palette* Interface::CreatePalette(const Color &color, const Color &back) -{ - Palette* pal = new Palette(); - pal->front = color; - pal->back = back; - pal->col[0].r = 0; - pal->col[0].g = 0xff; - pal->col[0].b = 0; - pal->col[0].a = 0; - for (int i = 1; i < 256; i++) { - pal->col[i].r = back.r + - ( unsigned char ) ( ( ( color.r - back.r ) * ( i ) ) / 255 ); - pal->col[i].g = back.g + - ( unsigned char ) ( ( ( color.g - back.g ) * ( i ) ) / 255 ); - pal->col[i].b = back.b + - ( unsigned char ) ( ( ( color.b - back.b ) * ( i ) ) / 255 ); - pal->col[i].a = back.a + - ( unsigned char ) ( ( ( color.a - back.a ) * ( i ) ) / 255 ); - } - return pal; -} - -/** No descriptions */ -Color* Interface::GetPalette(unsigned index, int colors, Color *pal) const -{ - Image *img; - if (colors == 32) { - img = pal32; - } else if (colors <= 32) { - img = pal16; - } else if (colors == 256) { - img = pal256; - } else { - return pal; - } - if (index >= img->GetHeight()) { - index = 0; - } - for (int i = 0; i < colors; i++) { - pal[i] = img->GetPixel(i, index); - } - return pal; -} -/** Returns a preloaded Font */ -Font* Interface::GetFont(const char *ResRef) const -{ - for (unsigned int i = 0; i < fonts.size(); i++) { - if (strnicmp( fonts[i]->ResRef, ResRef, 8 ) == 0) { - return fonts[i]; - } - } - return NULL; -} - -Font* Interface::GetFont(unsigned int index) const -{ - if (index >= fonts.size()) { - return NULL; - } - return fonts[index]; -} - -Font* Interface::GetButtonFont() const -{ - return GetFont( ButtonFont ); -} - -/** Returns the Event Manager */ -EventMgr* Interface::GetEventMgr() const -{ - return evntmgr; -} - -/** Returns the Window Manager */ -WindowMgr* Interface::GetWindowMgr() const -{ - return windowmgr.get(); -} - -/** Get GUI Script Manager */ -ScriptEngine* Interface::GetGUIScriptEngine() const -{ - return guiscript.get(); -} - -static EffectRef fx_summon_disable_ref = { "AvatarRemovalModifier", -1 }; - -//NOTE: if there were more summoned creatures, it will return only the last -Actor *Interface::SummonCreature(const ieResRef resource, const ieResRef vvcres, Scriptable *Owner, Actor *target, const Point &position, int eamod, int level, Effect *fx, bool sexmod) -{ - //maximum number of monsters summoned - int cnt=10; - Actor * ab = NULL; - - //TODO: - //decrease the number of summoned creatures with the number of already summoned creatures here - //the summoned creatures have a special IE_SPECIFIC - - while(cnt--) { - ab = gamedata->GetCreature(resource); - if (!ab) { - return NULL; - } - - if (Owner && Owner->Type==ST_ACTOR) { - ab->LastSummoner = Owner->GetGlobalID(); - } - //Always use Base stats for the recently summoned creature - - int enemyally; - - if (eamod==EAM_SOURCEALLY || eamod==EAM_SOURCEENEMY) { - if (Owner && Owner->Type==ST_ACTOR) { - enemyally = ((Actor *) Owner)->GetStat(IE_EA)>EA_GOODCUTOFF; - } else { - enemyally = true; - } - } else { - if (target) { - enemyally = target->GetBase(IE_EA)>EA_GOODCUTOFF; - } else { - enemyally = true; - } - } - - switch (eamod) { - case EAM_SOURCEALLY: - case EAM_ALLY: - if (enemyally) { - ab->SetBase(IE_EA, EA_ENEMY); //is this the summoned EA? - } else { - ab->SetBase(IE_EA, EA_CONTROLLED); //is this the summoned EA? - } - break; - case EAM_SOURCEENEMY: - case EAM_ENEMY: - if (enemyally) { - ab->SetBase(IE_EA, EA_CONTROLLED); //is this the summoned EA? - } else { - ab->SetBase(IE_EA, EA_ENEMY); //is this the summoned EA? - } - break; - case EAM_NEUTRAL: - ab->SetBase(IE_EA, EA_NEUTRAL); - break; - default: - break; - } - - // mark the summon, but only if they don't have a special sex already - if (sexmod && ab->BaseStats[IE_SEX] < SEX_EXTRA) { - ab->SetBase(IE_SEX, SEX_SUMMON); - } - - Map *map; - if (target) { - map = target->GetCurrentArea(); - } else { - map = Owner->GetCurrentArea(); - } - map->AddActor(ab); - ab->SetPosition(position, true, 0); - ab->RefreshEffects(NULL); - - if (vvcres[0]) { - ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(vvcres, false); - if (vvc) { - //This is the final position of the summoned creature - //not the original target point - vvc->XPos=ab->Pos.x; - vvc->YPos=ab->Pos.y; - //force vvc to play only once - vvc->PlayOnce(); - map->AddVVCell( vvc ); - - //set up the summon disable effect - Effect *newfx = EffectQueue::CreateEffect(fx_summon_disable_ref, 0, 1, FX_DURATION_ABSOLUTE); - if (newfx) { - newfx->Duration = vvc->GetSequenceDuration(AI_UPDATE_TIME)*9/10 + core->GetGame()->GameTime; - ApplyEffect(newfx, ab, ab); - } - } - } - - //remove the xp value of friendly summons - if (ab->BaseStats[IE_EA]SetBase(IE_XPVALUE, 0); - } - if (fx) { - ApplyEffect(fx, ab, Owner); - } - - //this check should happen after the fact - level -= ab->GetBase(IE_XP); - if(level<0 || ab->GetBase(IE_XP) == 0) { - break; - } - - } - return ab; -} - -void Interface::RedrawControls(const char *varname, unsigned int value) -{ - for (unsigned int i = 0; i < windows.size(); i++) { - Window *win = windows[i]; - if (win != NULL && win->Visible!=WINDOW_INVALID) { - win->RedrawControls(varname, value); - } - } -} - -void Interface::RedrawAll() -{ - for (unsigned int i = 0; i < windows.size(); i++) { - Window *win = windows[i]; - if (win != NULL && win->Visible!=WINDOW_INVALID) { - win->Invalidate(); - } - } -} - -/** Loads a WindowPack (CHUI file) in the Window Manager */ -bool Interface::LoadWindowPack(const char* name) -{ - DataStream* stream = gamedata->GetResource( name, IE_CHU_CLASS_ID ); - if (stream == NULL) { - printMessage("Interface", "Error: Cannot find %s.chu\n", LIGHT_RED, name ); - return false; - } - if (!GetWindowMgr()->Open(stream)) { - printMessage("Interface", "Error: Cannot Load %s.chu\n", LIGHT_RED, name ); - return false; - } - - strncpy( WindowPack, name, sizeof( WindowPack ) ); - WindowPack[sizeof( WindowPack ) - 1] = '\0'; - - return true; -} - -/** Loads a Window in the Window Manager */ -int Interface::LoadWindow(unsigned short WindowID) -{ - unsigned int i; - - for (i = 0; i < windows.size(); i++) { - Window *win = windows[i]; - if (win == NULL) - continue; - if (win->Visible==WINDOW_INVALID) { - continue; - } - if (win->WindowID == WindowID && - !strnicmp( WindowPack, win->WindowPack, sizeof(WindowPack) )) { - SetOnTop( i ); - win->Invalidate(); - return i; - } - } - Window* win = windowmgr->GetWindow( WindowID ); - if (win == NULL) { - return -1; - } - memcpy( win->WindowPack, WindowPack, sizeof(WindowPack) ); - - int slot = -1; - for (i = 0; i < windows.size(); i++) { - if (windows[i] == NULL) { - slot = i; - break; - } - } - if (slot == -1) { - windows.push_back( win ); - slot = ( int ) windows.size() - 1; - } else { - windows[slot] = win; - } - win->Invalidate(); - return slot; -} -// FIXME: it's a clone of LoadWindow -/** Creates a Window in the Window Manager */ -int Interface::CreateWindow(unsigned short WindowID, int XPos, int YPos, unsigned int Width, unsigned int Height, char* Background) -{ - unsigned int i; - - for (i = 0; i < windows.size(); i++) { - if (windows[i] == NULL) - continue; - if (windows[i]->WindowID == WindowID && !stricmp( WindowPack, - windows[i]->WindowPack )) { - SetOnTop( i ); - windows[i]->Invalidate(); - return i; - } - } - - Window* win = new Window( WindowID, (ieWord) XPos, (ieWord) YPos, (ieWord) Width, (ieWord) Height ); - if (Background[0]) { - ResourceHolder mos(Background); - if (mos != NULL) { - win->SetBackGround( mos->GetSprite2D(), true ); - } - } - - strcpy( win->WindowPack, WindowPack ); - - int slot = -1; - for (i = 0; i < windows.size(); i++) { - if (windows[i] == NULL) { - slot = i; - break; - } - } - if (slot == -1) { - windows.push_back( win ); - slot = ( int ) windows.size() - 1; - } else { - windows[slot] = win; - } - win->Invalidate(); - return slot; -} - -/** Sets a Window on the Top */ -void Interface::SetOnTop(int Index) -{ - std::vector::iterator t; - for(t = topwin.begin(); t != topwin.end(); ++t) { - if((*t) == Index) { - topwin.erase(t); - break; - } - } - if(topwin.size() != 0) - topwin.insert(topwin.begin(), Index); - else - topwin.push_back(Index); -} -/** Add a window to the Window List */ -void Interface::AddWindow(Window * win) -{ - int slot = -1; - for(unsigned int i = 0; i < windows.size(); i++) { - Window *w = windows[i]; - - if(w==NULL) { - slot = i; - break; - } - } - if(slot == -1) { - windows.push_back(win); - slot=(int)windows.size()-1; - } - else - windows[slot] = win; - win->Invalidate(); -} - -/** Get a Control on a Window */ -int Interface::GetControl(unsigned short WindowIndex, unsigned long ControlID) const -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - return -1; - } - int i = 0; - while (true) { - Control* ctrl = win->GetControl( (unsigned short) i ); - if (ctrl == NULL) - return -1; - if (ctrl->ControlID == ControlID) - return i; - i++; - } -} -/** Adjust the Scrolling factor of a control (worldmap atm) */ -int Interface::AdjustScrolling(unsigned short WindowIndex, - unsigned short ControlIndex, short x, short y) -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - return -1; - } - Control* ctrl = win->GetControl( ControlIndex ); - if (ctrl == NULL) { - return -1; - } - switch(ctrl->ControlType) { - case IE_GUI_WORLDMAP: - ((WorldMapControl *) ctrl)->AdjustScrolling(x,y); - break; - default: //doesn't work for these - return -1; - } - return 0; -} - -/** Set the Tooltip text of a Control */ -int Interface::SetTooltip(unsigned short WindowIndex, - unsigned short ControlIndex, const char* string) -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - return -1; - } - Control* ctrl = win->GetControl( ControlIndex ); - if (ctrl == NULL) { - return -1; - } - return ctrl->SetTooltip( string ); -} - -void Interface::DisplayTooltip(int x, int y, Control *ctrl) -{ - if (tooltip_ctrl && tooltip_ctrl == ctrl && tooltip_x == x && tooltip_y == y) - return; - tooltip_x = x; - tooltip_y = y; - tooltip_currtextw = 0; - tooltip_ctrl = ctrl; -} - -int Interface::GetVisible(unsigned short WindowIndex) const -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - return -1; - } - return win->Visible; -} -/** Set a Window Visible Flag */ -int Interface::SetVisible(unsigned short WindowIndex, int visible) -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - return -1; - } - if (visible!=WINDOW_FRONT) { - win->Visible = (char) visible; - } - switch (visible) { - case WINDOW_GRAYED: - win->Invalidate(); - //here is a fallthrough - case WINDOW_INVISIBLE: - //hiding the viewport if the gamecontrol window was made invisible - if (win->WindowID==65535) { - video->SetViewport( 0,0,0,0 ); - } - evntmgr->DelWindow( win ); - break; - - case WINDOW_VISIBLE: - if (win->WindowID==65535) { - video->SetViewport( win->XPos, win->YPos, win->Width, win->Height); - } - //here is a fallthrough - case WINDOW_FRONT: - if (win->Visible==WINDOW_VISIBLE) { - evntmgr->AddWindow( win ); - } - win->Invalidate(); - SetOnTop( WindowIndex ); - break; - } - return 0; -} - - -/** Set the Status of a Control in a Window */ -int Interface::SetControlStatus(unsigned short WindowIndex, - unsigned short ControlIndex, unsigned long Status) -{ - //don't set the status of an already invalidated window - Window* win = GetWindow(WindowIndex); - if (win == NULL) { - return -1; - } - Control* ctrl = win->GetControl( ControlIndex ); - if (ctrl == NULL) { - return -1; - } - if (Status&IE_GUI_CONTROL_FOCUSED) { - evntmgr->SetFocused( win, ctrl); - } - if (ctrl->ControlType != ((Status >> 24) & 0xff) ) { - return -2; - } - switch (ctrl->ControlType) { - case IE_GUI_BUTTON: - //Button - { - Button* btn = ( Button* ) ctrl; - btn->SetState( ( unsigned char ) ( Status & 0x7f ) ); - } - break; - default: - ctrl->Value = Status & 0x7f; - break; - } - return 0; -} - -/** Show a Window in Modal Mode */ -int Interface::ShowModal(unsigned short WindowIndex, int Shadow) -{ - if (WindowIndex >= windows.size()) { - printMessage( "Core", "Window not found", LIGHT_RED ); - return -1; - } - Window* win = windows[WindowIndex]; - if (win == NULL) { - printMessage( "Core", "Window already freed", LIGHT_RED ); - return -1; - } - win->Visible = WINDOW_FRONT; - //don't destroy the other window handlers - //evntmgr->Clear(); - SetOnTop( WindowIndex ); - evntmgr->AddWindow( win ); - evntmgr->SetFocused( win, NULL ); - - ModalWindow = NULL; - DrawWindows(); - win->Invalidate(); - - Color gray = { - 0, 0, 0, 128 - }; - Color black = { - 0, 0, 0, 255 - }; - - Region r( 0, 0, Width, Height ); - - if (Shadow == MODAL_SHADOW_GRAY) { - video->DrawRect( r, gray ); - } else if (Shadow == MODAL_SHADOW_BLACK) { - video->DrawRect( r, black ); - } - - ModalWindow = win; - return 0; -} - -bool Interface::IsFreezed() -{ - return !update_scripts; -} - -void Interface::GameLoop(void) -{ - update_scripts = false; - GameControl *gc = GetGameControl(); - if (gc) { - update_scripts = !(gc->GetDialogueFlags() & DF_FREEZE_SCRIPTS); - } - - bool do_update = GSUpdate(update_scripts); - - //i'm not sure if this should be here - - //in multi player (if we ever get to it), only the server must call this - if (do_update) { - if ( game->selected.size() > 0 ) { - gc->ChangeMap(GetFirstSelectedPC(true), false); - } - // the game object will run the area scripts as well - game->UpdateScripts(); - } -} - -/** handles hardcoded gui behaviour */ -void Interface::HandleGUIBehaviour(void) -{ - GameControl *gc = GetGameControl(); - if (gc) { - //this variable is used all over in the following hacks - int flg = gc->GetDialogueFlags(); - - //the following part is a series of hardcoded gui behaviour - - //initiating dialog - if (flg & DF_IN_DIALOG) { - // -3 noaction - // -2 close - // -1 open - // choose option - ieDword var = (ieDword) -3; - vars->Lookup("DialogChoose", var); - if ((int) var == -2) { - // TODO: this seems to never be called? (EndDialog is called from elsewhere instead) - gc->dialoghandler->EndDialog(); - } else if ( (int)var !=-3) { - if ( (int) var == -1) { - guiscript->RunFunction( "GUIWORLD", "DialogStarted" ); - } - gc->dialoghandler->DialogChoose(var); - if (!(gc->GetDialogueFlags() & (DF_OPENCONTINUEWINDOW | DF_OPENENDWINDOW))) - guiscript->RunFunction( "GUIWORLD", "NextDialogState" ); - - // the last node of a dialog can have a new-dialog action! don't interfere in that case - ieDword newvar = 0; vars->Lookup("DialogChoose", newvar); - if (var == (ieDword) -1 || newvar != (ieDword) -1) { - vars->SetAt("DialogChoose", (ieDword) -3); - } - } - if (flg & DF_OPENCONTINUEWINDOW) { - guiscript->RunFunction( "GUIWORLD", "OpenContinueMessageWindow" ); - gc->SetDialogueFlags(DF_OPENCONTINUEWINDOW|DF_OPENENDWINDOW, BM_NAND); - } else if (flg & DF_OPENENDWINDOW) { - guiscript->RunFunction( "GUIWORLD", "OpenEndMessageWindow" ); - gc->SetDialogueFlags(DF_OPENCONTINUEWINDOW|DF_OPENENDWINDOW, BM_NAND); - } - } - - //handling container - if (CurrentContainer && UseContainer) { - if (!(flg & DF_IN_CONTAINER) ) { - gc->SetDialogueFlags(DF_IN_CONTAINER, BM_OR); - guiscript->RunFunction( "CommonWindow", "OpenContainerWindow" ); - } - } else { - if (flg & DF_IN_CONTAINER) { - gc->SetDialogueFlags(DF_IN_CONTAINER, BM_NAND); - guiscript->RunFunction( "CommonWindow", "CloseContainerWindow" ); - } - } - //end of gui hacks - } -} - -void Interface::DrawWindows(bool allow_delete) -{ - //here comes the REAL drawing of windows - if (ModalWindow) { - ModalWindow->DrawWindow(); - return; - } - size_t i = topwin.size(); - while(i--) { - unsigned int t = topwin[i]; - - if ( t >=windows.size() ) - continue; - - //visible ==1 or 2 will be drawn - Window* win = windows[t]; - if (win != NULL) { - if (win->Visible == WINDOW_INVALID) { - if (allow_delete) { - topwin.erase(topwin.begin()+i); - evntmgr->DelWindow( win ); - delete win; - windows[t]=NULL; - } - } else if (win->Visible) { - win->DrawWindow(); - } - } - } -} - -void Interface::DrawTooltip () -{ - if (! tooltip_ctrl || !tooltip_ctrl->Tooltip) - return; - - Font* fnt = GetFont( TooltipFont ); - char *tooltip_text = tooltip_ctrl->Tooltip; - - int w1 = 0; - int w2 = 0; - int strw = fnt->CalcStringWidth( tooltip_text ) + 8; - int w = strw; - int h = fnt->maxHeight; - - if (TooltipBack) { - // animate BG tooltips - // TODO: make tooltip animation an option instead - // of following hard-coded check! - if (TooltipMargin == 5) { - // TODO: make speed an option - int tooltip_anim_speed = 15; - if (tooltip_currtextw < strw) { - tooltip_currtextw += tooltip_anim_speed; - } - if (tooltip_currtextw > strw) { - tooltip_currtextw = strw; - } - w = tooltip_currtextw; - } - - h = TooltipBack[0]->Height; - w1 = TooltipBack[1]->Width; - w2 = TooltipBack[2]->Width; - w += TooltipMargin*2; - strw += TooltipMargin*2; - //multiline in case of too much text - if (w>TooltipBack[0]->Width) - strw=w=TooltipBack[0]->Width; - else if (strw>TooltipBack[0]->Width) - strw=TooltipBack[0]->Width; - } - - int strx = tooltip_x - strw / 2; - int y = tooltip_y - h / 2; - // Ensure placement within the screen - if (strx < 0) strx = 0; - else if (strx + strw + w1 + w2 > Width) - strx = Width - strw - w1 - w2; - if (y < 0) y = 0; - else if (y + h > Height) - y = Height - h; - - int x = strx + ((strw - w) / 2); - - // FIXME: take back[0] from center, not from left end - Region r2 = Region( x, y, w, h ); - if (TooltipBack) { - video->BlitSprite( TooltipBack[0], x + TooltipMargin, y, true, &r2 ); - video->BlitSprite( TooltipBack[1], x, y, true ); - video->BlitSprite( TooltipBack[2], x + w, y, true ); - } - - if (TooltipBack) { - r2.x+=TooltipMargin; - strx+=TooltipMargin; - } - Region textr = Region( strx, y, strw, h ); - fnt->Print( r2, textr, (ieByte *) tooltip_text, NULL, - IE_FONT_ALIGN_CENTER | IE_FONT_ALIGN_MIDDLE, true ); -} - -//interface for higher level functions, if the window was -//marked for deletion it is not returned -Window* Interface::GetWindow(unsigned short WindowIndex) const -{ - if (WindowIndex < windows.size()) { - Window *win = windows[WindowIndex]; - if (win && (win->Visible!=WINDOW_INVALID) ) { - return win; - } - } - return NULL; -} - -// this function will determine if wnd is a valid window pointer -// by checking if its WindowID is the same as the reference -bool Interface::IsValidWindow(unsigned short WindowID, Window *wnd) const -{ - size_t WindowIndex = windows.size(); - while (WindowIndex--) { - if (windows[WindowIndex] == wnd) { - return wnd->WindowID == WindowID; - } - } - return false; -} - -//this function won't delete the window, just mark it for deletion -//it will be deleted in the next DrawWindows cycle -//regardless, the window deleted is inaccessible for gui scripts and -//other high level functions from now -int Interface::DelWindow(unsigned short WindowIndex) -{ - if (WindowIndex >= windows.size()) { - return -1; - } - Window* win = windows[WindowIndex]; - if ((win == NULL) || (win->Visible==WINDOW_INVALID) ) { - printMessage( "Core", "Window deleted again", LIGHT_RED ); - return -1; - } - if (win == ModalWindow) { - ModalWindow = NULL; - RedrawAll(); //marking windows for redraw - } - evntmgr->DelWindow( win ); - win->release(); - //re-capturing new (old) modal window if any - size_t tw = topwin.size(); - for(size_t i=0;iVisible==WINDOW_FRONT) { - ModalWindow = tmp; - break; - } - } - return 0; -} - -void Interface::DelAllWindows() -{ - vars->SetAt("MessageWindow", (ieDword) ~0); - vars->SetAt("OptionsWindow", (ieDword) ~0); - vars->SetAt("PortraitWindow", (ieDword) ~0); - vars->SetAt("ActionsWindow", (ieDword) ~0); - vars->SetAt("TopWindow", (ieDword) ~0); - vars->SetAt("OtherWindow", (ieDword) ~0); - vars->SetAt("FloatWindow", (ieDword) ~0); - for(unsigned int WindowIndex=0; WindowIndexClear(); - ModalWindow = NULL; -} - -/** Popup the Console */ -void Interface::PopupConsole() -{ - ConsolePopped = !ConsolePopped; - RedrawAll(); - console->Changed = true; -} - -/** Draws the Console */ -void Interface::DrawConsole() -{ - console->Draw( 0, 0 ); -} - -/** Get the Sound Manager */ -SaveGameIterator* Interface::GetSaveGameIterator() const -{ - return sgiterator; -} -/** Sends a termination signal to the Video Driver */ -bool Interface::Quit(void) -{ - return video->Quit(); -} -/** Returns the variables dictionary */ -Variables* Interface::GetDictionary() const -{ - return vars; -} -/** Returns the token dictionary */ -Variables* Interface::GetTokenDictionary() const -{ - return tokens; -} -/** Get the Music Manager */ -MusicMgr* Interface::GetMusicMgr() const -{ - return music.get(); -} -/** Loads an IDS Table, returns -1 on error or the Symbol Table Index on success */ -int Interface::LoadSymbol(const char* ResRef) -{ - int ind = GetSymbolIndex( ResRef ); - if (ind != -1) { - return ind; - } - DataStream* str = gamedata->GetResource( ResRef, IE_IDS_CLASS_ID ); - if (!str) { - return -1; - } - PluginHolder sm(IE_IDS_CLASS_ID); - if (!sm) { - delete str; - return -1; - } - if (!sm->Open(str)) { - return -1; - } - Symbol s; - strncpy( s.ResRef, ResRef, 8 ); - s.sm = sm; - ind = -1; - for (size_t i = 0; i < symbols.size(); i++) { - if (!symbols[i].sm) { - ind = ( int ) i; - break; - } - } - if (ind != -1) { - symbols[ind] = s; - return ind; - } - symbols.push_back( s ); - return ( int ) symbols.size() - 1; -} -/** Gets the index of a loaded Symbol Table, returns -1 on error */ -int Interface::GetSymbolIndex(const char* ResRef) const -{ - for (size_t i = 0; i < symbols.size(); i++) { - if (!symbols[i].sm) - continue; - if (strnicmp( symbols[i].ResRef, ResRef, 8 ) == 0) - return ( int ) i; - } - return -1; -} -/** Gets a Loaded Symbol Table by its index, returns NULL on error */ -Holder Interface::GetSymbol(unsigned int index) const -{ - if (index >= symbols.size()) { - return Holder(); - } - if (!symbols[index].sm) { - return Holder(); - } - return symbols[index].sm; -} -/** Frees a Loaded Symbol Table, returns false on error, true on success */ -bool Interface::DelSymbol(unsigned int index) -{ - if (index >= symbols.size()) { - return false; - } - if (!symbols[index].sm) { - return false; - } - symbols[index].sm.release(); - return true; -} -/** Plays a Movie */ -int Interface::PlayMovie(const char* ResRef) -{ - ResourceHolder mp(ResRef); - if (!mp) { - return -1; - } - - ieDword subtitles = 0; - Font *SubtitleFont = NULL; - Palette *palette = NULL; - ieDword *frames = NULL; - ieDword *strrefs = NULL; - int cnt = 0; - int offset = 0; - - //one of these two should exist (they both mean the same thing) - vars->Lookup("Display Movie Subtitles", subtitles); - if (subtitles) { - //HoW flag - cnt=-3; - offset = 3; - } else { - //ToB flag - vars->Lookup("Display Subtitles", subtitles); - } - AutoTable sttable; - if (subtitles && sttable.load(ResRef)) { - cnt += sttable->GetRowCount(); - if (cnt>0) { - frames = (ieDword *) malloc(cnt * sizeof(ieDword) ); - strrefs = (ieDword *) malloc(cnt * sizeof(ieDword) ); - } else { - cnt = 0; - } - if (frames && strrefs) { - for (int i=0;iQueryField(i+offset, 0) ); - strrefs[i] = atoi (sttable->QueryField(i+offset, 1) ); - } - } - int r = atoi(sttable->QueryField("red", "frame")); - int g = atoi(sttable->QueryField("green", "frame")); - int b = atoi(sttable->QueryField("blue", "frame")); - SubtitleFont = GetFont (MovieFont); //will change - if (r || g || b) { - if (SubtitleFont) { - Color fore = {(unsigned char) r,(unsigned char) g,(unsigned char) b, 0x00}; - Color back = {0x00, 0x00, 0x00, 0x00}; - palette = CreatePalette( fore, back ); - } - } - } - - //shutting down music and ambients before movie - if (music) - music->HardEnd(); - AmbientMgr *ambim = AudioDriver->GetAmbientMgr(); - if (ambim) ambim->deactivate(); - video->SetMovieFont(SubtitleFont, palette ); - mp->CallBackAtFrames(cnt, frames, strrefs); - mp->Play(); - gamedata->FreePalette( palette ); - if (frames) - free(frames); - if (strrefs) - free(strrefs); - //restarting music - if (music) - music->Start(); - if (ambim) ambim->activate(); - //this will fix redraw all windows as they looked like - //before the movie - RedrawAll(); - - //Setting the movie name to 1 - vars->SetAt( ResRef, 1 ); - return 0; -} - -int Interface::Roll(int dice, int size, int add) const -{ - if (dice < 1) { - return add; - } - if (size < 1) { - return add; - } - if (dice > 100) { - return add + dice * size / 2; - } - for (int i = 0; i < dice; i++) { - add += rand() % size + 1; - } - return add; -} - -static char bmp_suffix[6]="M.BMP"; -static char png_suffix[6]="M.PNG"; - -int Interface::GetPortraits(TextArea* ta, bool smallorlarge) -{ - int count = 0; - char Path[_MAX_PATH]; - - if (smallorlarge) { - bmp_suffix[0]='S'; - png_suffix[0]='S'; - } else { - bmp_suffix[0]='M'; - png_suffix[0]='M'; - } - PathJoin( Path, GamePath, GamePortraitsPath, NULL ); - DirectoryIterator dir(Path); - if (!dir) { - return -1; - } - print( "Looking in %s\n", Path ); - do { - char *name = dir.GetName(); - if (name[0] == '.') - continue; - if (dir.IsDirectory()) - continue; - strupr(name); - char *pos = strstr(name,bmp_suffix); - if (!pos && IsAvailable(IE_PNG_CLASS_ID) ) { - pos = strstr(name,png_suffix); - } - if (!pos) continue; - pos[1]=0; - count++; - ta->AppendText( name, -1 ); - } while (++dir); - return count; -} - -int Interface::GetCharSounds(TextArea* ta) -{ - bool hasfolders; - int count = 0; - char Path[_MAX_PATH]; - - PathJoin( Path, GamePath, GameSoundsPath, NULL ); - hasfolders = ( HasFeature( GF_SOUNDFOLDERS ) != 0 ); - DirectoryIterator dir(Path); - if (!dir) { - return -1; - } - print( "Looking in %s\n", Path ); - do { - char *name = dir.GetName(); - if (name[0] == '.') - continue; - if (hasfolders == !dir.IsDirectory()) - continue; - if (!hasfolders) { - strupr(name); - char *pos = strstr(name,"A.WAV"); - if (!pos) continue; - *pos=0; - } - count++; - ta->AppendText( name, -1 ); - } while (++dir); - return count; -} - -int Interface::GetCharacters(TextArea* ta) -{ - int count = 0; - char Path[_MAX_PATH]; - - PathJoin( Path, GamePath, GameCharactersPath, NULL ); - DirectoryIterator dir(Path); - if (!dir) { - return -1; - } - print( "Looking in %s\n", Path ); - do { - char *name = dir.GetName(); - if (name[0] == '.') - continue; - if (dir.IsDirectory()) - continue; - strupr(name); - char *pos = strstr(name,".CHR"); - if (!pos) continue; - *pos=0; - count++; - ta->AppendText( name, -1 ); - } while (++dir); - return count; -} - -bool Interface::LoadINI(const char* filename) -{ - FileStream* config = FileStream::OpenFile(filename); - if (config == NULL) { - return false; - } - char name[65], value[_MAX_PATH + 3]; - while (config->Remains()) { - char line[_MAX_PATH]; - - if (config->ReadLine(line, _MAX_PATH) == -1) - break; - - if ((line[0] == '#') || - ( line[0] == '[' ) || - ( line[0] == '\r' ) || - ( line[0] == '\n' ) || - ( line[0] == ';' )) { - continue; - } - - name[0] = 0; - value[0] = 0; - - //the * element is not counted - if (sscanf( line, "%[^=]=%[^\r\n]", name, value )!=2) - continue; - if (( value[0] >= '0' ) && ( value[0] <= '9' )) { - vars->SetAt( name, atoi( value ) ); - } - } - delete config; - return true; -} - -/** Enables/Disables the Cut Scene Mode */ -void Interface::SetCutSceneMode(bool active) -{ - GameControl *gc = GetGameControl(); - - if (gc) { - // don't mess with controls/etc if we're already in a cutscene - if (active == (bool)(gc->GetScreenFlags()&SF_CUTSCENE)) - return; - - gc->SetCutSceneMode( active ); - } - if (game) { - if (active) { - game->ControlStatus |= CS_HIDEGUI; - } else { - game->ControlStatus &= ~CS_HIDEGUI; - } - SetEventFlag(EF_CONTROL); - } - video->SetMouseEnabled(!active); -} - -/** returns true if in dialogue or cutscene */ -bool Interface::InCutSceneMode() const -{ - GameControl *gc = GetGameControl(); - if (!gc || (gc->GetDialogueFlags()&DF_IN_DIALOG) || (gc->GetScreenFlags()&SF_DISABLEMOUSE) ) { - return true; - } - return false; -} - -/** Updates the Game Script Engine State */ -bool Interface::GSUpdate(bool update_scripts) -{ - if(update_scripts) { - return timer->Update(); - } - else { - timer->Freeze(); - return false; - } -} - -void Interface::QuitGame(int BackToMain) -{ - SetCutSceneMode(false); - if (timer) { - //clear cutscenes - //clear fade/screenshake effects - timer->Init(); - timer->SetFadeFromColor(0); - } - - DelAllWindows(); //delete all windows, including GameControl - - //shutting down ingame music - //(do it before deleting the game) - if (music) { - music->HardEnd(); - } - // stop any ambients which are still enqueued - if (AudioDriver) { - AmbientMgr *ambim = AudioDriver->GetAmbientMgr(); - if (ambim) ambim->deactivate(); - } - //delete game, worldmap - if (game) { - delete game; - game=NULL; - } - if (worldmap) { - delete worldmap; - worldmap=NULL; - } - if (BackToMain) { - strcpy(NextScript, "Start"); - QuitFlag |= QF_CHANGESCRIPT; - } - GSUpdate(true); -} - -void Interface::SetupLoadGame(Holder sg, int ver_override) -{ - LoadGameIndex = sg; - VersionOverride = ver_override; - QuitFlag |= QF_LOADGAME; -} - -void Interface::LoadGame(SaveGame *sg, int ver_override) -{ - // This function has rather painful error handling, - // as it should swap all the objects or none at all - // and the loading can fail for various reasons - - // Yes, it uses goto. Other ways seemed too awkward for me. - - gamedata->SaveAllStores(); - strings->CloseAux(); - tokens->RemoveAll(NULL); //clearing the token dictionary - - if(calendar) delete calendar; - calendar = new Calendar; - - DataStream* gam_str = NULL; - DataStream* sav_str = NULL; - DataStream* wmp_str1 = NULL; - DataStream* wmp_str2 = NULL; - - Game* new_game = NULL; - WorldMapArray* new_worldmap = NULL; - - LoadProgress(10); - if (!KeepCache) DelTree((const char *) CachePath, true); - LoadProgress(15); - - if (sg == NULL) { - //Load the Default Game - gam_str = gamedata->GetResource( GameNameResRef, IE_GAM_CLASS_ID ); - sav_str = NULL; - wmp_str1 = gamedata->GetResource( WorldMapName[0], IE_WMP_CLASS_ID ); - if (WorldMapName[1][0]) { - wmp_str2 = gamedata->GetResource( WorldMapName[1], IE_WMP_CLASS_ID ); - } - } else { - gam_str = sg->GetGame(); - sav_str = sg->GetSave(); - wmp_str1 = sg->GetWmap(0); - if (WorldMapName[1][0]) { - wmp_str2 = sg->GetWmap(1); - if (!wmp_str2) { - //upgrade an IWD game to HOW - wmp_str2 = gamedata->GetResource( WorldMapName[1], IE_WMP_CLASS_ID ); - } - } - } - - // These are here because of the goto - PluginHolder gam_mgr(IE_GAM_CLASS_ID); - PluginHolder wmp_mgr(IE_WMP_CLASS_ID); - - if (!gam_str || !(wmp_str1 || wmp_str2) ) - goto cleanup; - - // Load GAM file - if (!gam_mgr) - goto cleanup; - - if (!gam_mgr->Open(gam_str)) - goto cleanup; - - new_game = gam_mgr->LoadGame(new Game(), ver_override); - if (!new_game) - goto cleanup; - - gam_str = NULL; - - // Load WMP (WorldMap) file - if (!wmp_mgr) - goto cleanup; - - if (!wmp_mgr->Open(wmp_str1, wmp_str2)) - goto cleanup; - - new_worldmap = wmp_mgr->GetWorldMapArray( ); - - wmp_str1 = NULL; - wmp_str2 = NULL; - - LoadProgress(20); - // Unpack SAV (archive) file to Cache dir - if (sav_str) { - PluginHolder ai(IE_SAV_CLASS_ID); - if (ai) { - if (ai->DecompressSaveGame(sav_str) != GEM_OK) { - goto cleanup; - } - } - delete sav_str; - sav_str = NULL; - } - - // Let's assume that now is everything loaded OK and swap the objects - - delete game; - delete worldmap; - - game = new_game; - worldmap = new_worldmap; - - strings->OpenAux(); - LoadProgress(70); - return; -cleanup: - // Something went wrong, so try to clean after itself - - delete new_game; - delete new_worldmap; - - delete gam_str; - delete wmp_str1; - delete wmp_str2; - delete sav_str; -} - -/* swapping out old resources */ -void Interface::UpdateMasterScript() -{ - if (game) { - game->SetScript( GlobalScript, 0 ); - } - - PluginHolder wmp_mgr(IE_WMP_CLASS_ID); - if (! wmp_mgr) - return; - - if (worldmap) { - DataStream *wmp_str1 = gamedata->GetResource( WorldMapName[0], IE_WMP_CLASS_ID ); - DataStream *wmp_str2 = gamedata->GetResource( WorldMapName[1], IE_WMP_CLASS_ID ); - - if (!wmp_mgr->Open(wmp_str1, wmp_str2)) { - delete wmp_str1; - delete wmp_str2; - } - - delete worldmap; - worldmap = wmp_mgr->GetWorldMapArray(); - } -} - -bool Interface::HideGCWindow() -{ - Window *window = GetWindow( 0 ); - // in the beginning, there's no window at all - if (! window) - return false; - - Control* gc = window->GetControl(0); - if (gc->ControlType!=IE_GUI_GAMECONTROL) { - return false; - } - SetVisible(0, WINDOW_INVISIBLE); - return true; -} - -void Interface::UnhideGCWindow() -{ - Window *window = GetWindow( 0 ); - if (!window) - return; - Control* gc = window->GetControl(0); - if (gc->ControlType!=IE_GUI_GAMECONTROL) - return; - SetVisible(0, WINDOW_VISIBLE); -} - -GameControl *Interface::GetGameControl() const -{ - Window *window = GetWindow( 0 ); - // in the beginning, there's no window at all - if (! window) - return NULL; - - Control* gc = window->GetControl(0); - if (gc == NULL) { - return NULL; - } - if (gc->ControlType!=IE_GUI_GAMECONTROL) { - return NULL; - } - return (GameControl *) gc; -} - -bool Interface::InitItemTypes() -{ - if (slotmatrix) { - free(slotmatrix); - } - AutoTable it("itemtype"); - ItemTypes = 0; - if (it) { - ItemTypes = it->GetRowCount(); //number of itemtypes - if (ItemTypes<0) { - ItemTypes = 0; - } - int InvSlotTypes = it->GetColumnCount(); - if (InvSlotTypes > 32) { //bit count limit - InvSlotTypes = 32; - } - //make sure unsigned int is 32 bits - slotmatrix = (ieDword *) malloc(ItemTypes * sizeof(ieDword) ); - for (int i=0;iQueryField(i,j),NULL,0) ) { - value |= k; - } - k <<= 1; - } - //we let any items in the inventory - slotmatrix[i] = (ieDword) value | SLOT_INVENTORY; - } - } - - //slottype describes the inventory structure - Inventory::Init(HasFeature(GF_MAGICBIT)); - AutoTable st("slottype"); - if (slottypes) { - free(slottypes); - slottypes = NULL; - } - SlotTypes = 0; - if (st) { - SlotTypes = st->GetRowCount(); - //make sure unsigned int is 32 bits - slottypes = (SlotType *) malloc(SlotTypes * sizeof(SlotType) ); - memset(slottypes, -1, SlotTypes * sizeof(SlotType) ); - for (unsigned int row = 0; row < SlotTypes; row++) { - bool alias; - unsigned int i = (ieDword) strtol(st->GetRowName(row),NULL,0 ); - if (i>=SlotTypes) continue; - if (slottypes[i].sloteffects!=0xffffffffu) { - slottypes[row].slot = i; - i=row; - alias = true; - } else { - slottypes[row].slot = i; - alias = false; - } - slottypes[i].slottype = (ieDword) strtol(st->QueryField(row,0),NULL,0 ); - slottypes[i].slotid = (ieDword) strtol(st->QueryField(row,1),NULL,0 ); - strnlwrcpy( slottypes[i].slotresref, st->QueryField(row,2), 8 ); - slottypes[i].slottip = (ieDword) strtol(st->QueryField(row,3),NULL,0 ); - slottypes[i].slotflags = (ieDword) strtol(st->QueryField(row,5),NULL,0 ); - //don't fill sloteffects for aliased slots (pst) - if (alias) { - continue; - } - slottypes[i].sloteffects = (ieDword) strtol(st->QueryField(row,4),NULL,0 ); - //setting special slots - if (slottypes[i].slottype&SLOT_ITEM) { - if (slottypes[i].slottype&SLOT_INVENTORY) { - Inventory::SetInventorySlot(i); - } else { - Inventory::SetQuickSlot(i); - } - } - switch (slottypes[i].sloteffects) { - //fist slot, not saved, default weapon - case SLOT_EFFECT_FIST: Inventory::SetFistSlot(i); break; - //magic weapon slot, overrides all weapons - case SLOT_EFFECT_MAGIC: Inventory::SetMagicSlot(i); break; - //weapon slot, Equipping marker is relative to it - case SLOT_EFFECT_MELEE: Inventory::SetWeaponSlot(i); break; - //ranged slot - case SLOT_EFFECT_MISSILE: Inventory::SetRangedSlot(i); break; - //right hand - case SLOT_EFFECT_LEFT: Inventory::SetShieldSlot(i); break; - //head (for averting critical hit) - case SLOT_EFFECT_HEAD: Inventory::SetHeadSlot(i); break; - default:; - } - } - } - return (it && st); -} - -ieDword Interface::FindSlot(unsigned int idx) const -{ - ieDword i; - - for (i=0;i=SlotTypes) { - return 0; - } - return slottypes[idx].slot; -} - -ieDword Interface::QuerySlotType(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return 0; - } - return slottypes[idx].slottype; -} - -ieDword Interface::QuerySlotID(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return 0; - } - return slottypes[idx].slotid; -} - -ieDword Interface::QuerySlottip(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return 0; - } - return slottypes[idx].slottip; -} - -ieDword Interface::QuerySlotEffects(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return 0; - } - return slottypes[idx].sloteffects; -} - -ieDword Interface::QuerySlotFlags(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return 0; - } - return slottypes[idx].slotflags; -} - -const char *Interface::QuerySlotResRef(unsigned int idx) const -{ - if (idx>=SlotTypes) { - return ""; - } - return slottypes[idx].slotresref; -} - -// checks the itemtype vs. slottype, and also checks the usability flags -// vs. Actor's stats (alignment, class, race, kit etc.) -int Interface::CanUseItemType(int slottype, Item *item, Actor *actor, bool feedback, bool equipped) const -{ - //inventory is a special case, we allow any items to enter it - if ( slottype==-1 ) { - return SLOT_INVENTORY; - } - //if we look for ALL slot types, then SLOT_SHIELD shouldn't interfere - //with twohandedness - //As long as this is an Item, use the ITEM constant - //switch for IE_INV_ITEM_* if it is a CREItem - if (item->Flags&IE_ITEM_TWO_HANDED) { - //if the item is twohanded and there are more slots, drop the shield slot - if (slottype&~SLOT_SHIELD) { - slottype&=~SLOT_SHIELD; - } - if (slottype&SLOT_SHIELD) { - //cannot equip twohanded in offhand - if (feedback) displaymsg->DisplayConstantString(STR_NOT_IN_OFFHAND, 0xf0f0f0); - return 0; - } - } - - if ( (unsigned int) item->ItemType>=(unsigned int) ItemTypes) { - //invalid itemtype - if (feedback) displaymsg->DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); - return 0; - } - - //if actor is supplied, check its usability fields - if (actor) { - //constant strings - int idx = actor->Unusable(item); - if (idx) { - if (feedback) displaymsg->DisplayConstantString(idx, 0xf0f0f0); - return 0; - } - //custom strings - ieStrRef str = actor->Disabled(item->Name, item->ItemType); - if (str && !equipped) { - if (feedback) displaymsg->DisplayString(str, 0xf0f0f0, 0); - return 0; - } - } - - //if any bit is true, the answer counts as true - int ret = (slotmatrix[item->ItemType]&slottype); - - if (!ret) { - if (feedback) displaymsg->DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); - return 0; - } - - //this warning comes only when feedback is enabled - if (feedback) { - //this was, but that disabled equipping of amber earrings in PST - //if (slotmatrix[item->ItemType]&(SLOT_QUIVER|SLOT_WEAPON|SLOT_ITEM)) { - if (ret&(SLOT_QUIVER|SLOT_WEAPON|SLOT_ITEM)) { - //don't ruin the return variable, it contains the usable slot bits - int flg = 0; - if (ret&SLOT_QUIVER) { - if (item->GetWeaponHeader(true)) flg = 1; - } - - if (ret&SLOT_WEAPON) { - //melee - if (item->GetWeaponHeader(false)) flg = 1; - //ranged - if (item->GetWeaponHeader(true)) flg = 1; - } - - if (ret&SLOT_ITEM) { - if (item->GetEquipmentHeaderNumber(0)!=0xffff) flg = 1; - } - - if (!flg) { - displaymsg->DisplayConstantString(STR_UNUSABLEITEM, 0xf0f0f0); - return 0; - } - } - } - - return ret; -} - -Label *Interface::GetMessageLabel() const -{ - ieDword WinIndex = (ieDword) -1; - ieDword TAIndex = (ieDword) -1; - - vars->Lookup( "OtherWindow", WinIndex ); - if (( WinIndex != (ieDword) -1 ) && - ( vars->Lookup( "MessageLabel", TAIndex ) )) { - Window* win = GetWindow( (unsigned short) WinIndex ); - if (win) { - Control *ctrl = win->GetControl( (unsigned short) TAIndex ); - if (ctrl && ctrl->ControlType==IE_GUI_LABEL) - return (Label *) ctrl; - } - } - return NULL; -} - -TextArea *Interface::GetMessageTextArea() const -{ - ieDword WinIndex = (ieDword) -1; - ieDword TAIndex = (ieDword) -1; - - vars->Lookup( "MessageWindow", WinIndex ); - if (( WinIndex != (ieDword) -1 ) && - ( vars->Lookup( "MessageTextArea", TAIndex ) )) { - Window* win = GetWindow( (unsigned short) WinIndex ); - if (win) { - Control *ctrl = win->GetControl( (unsigned short) TAIndex ); - if (ctrl && ctrl->ControlType==IE_GUI_TEXTAREA) - return (TextArea *) ctrl; - } - } - return NULL; -} - -static const char *saved_extensions[]={".are",".sto",0}; -static const char *saved_extensions_last[]={".tot",".toh",0}; - -//returns the priority of the file to be saved -//2 - save -//1 - save last -//0 - don't save -int Interface::SavedExtension(const char *filename) -{ - const char *str=strchr(filename,'.'); - if (!str) return 0; - int i=0; - while(saved_extensions[i]) { - if (!stricmp(saved_extensions[i], str) ) return 2; - i++; - } - i=0; - while(saved_extensions_last[i]) { - if (!stricmp(saved_extensions_last[i], str) ) return 1; - i++; - } - return 0; -} - -static const char *protected_extensions[]={".exe",".dll",".so",0}; - -//returns true if file should be saved -bool Interface::ProtectedExtension(const char *filename) -{ - const char *str=strchr(filename,'.'); - if (!str) return false; - int i=0; - while(protected_extensions[i]) { - if (!stricmp(protected_extensions[i], str) ) return true; - i++; - } - return false; -} - -void Interface::RemoveFromCache(const ieResRef resref, SClass_ID ClassID) -{ - char filename[_MAX_PATH]; - - PathJoinExt(filename, CachePath, resref, TypeExt(ClassID)); - unlink ( filename); -} - -//this function checks if the path is eligible as a cache -//if it contains a directory, or suspicious file extensions -//we bail out, because the cache will be purged regularly. -bool Interface::StupidityDetector(const char* Pt) -{ - char Path[_MAX_PATH]; - strcpy( Path, Pt ); - DirectoryIterator dir(Path); - if (!dir) { - print("\n**cannot open**\n"); - return true; - } - do { - const char *name = dir.GetName(); - if (dir.IsDirectory()) { - if (name[0] == '.') { - if (name[1] == '\0') - continue; - if (name[1] == '.' && name[2] == '\0') - continue; - } - print("\n**contains another dir**\n"); - return true; //a directory in there??? - } - if (ProtectedExtension(name) ) { - print("\n**contains alien files**\n"); - return true; //an executable file in there??? - } - } while (++dir); - //ok, we got a good conscience - return false; -} - -void Interface::DelTree(const char* Pt, bool onlysave) -{ - char Path[_MAX_PATH]; - - if (!Pt[0]) return; //Don't delete the root filesystem :) - strcpy( Path, Pt ); - DirectoryIterator dir(Path); - if (!dir) { - return; - } - do { - char *name = dir.GetName(); - if (dir.IsDirectory()) - continue; - if (name[0] == '.') - continue; - if (!onlysave || SavedExtension(name) ) { - char dtmp[_MAX_PATH]; - dir.GetFullPath(dtmp); - unlink( dtmp ); - } - } while (++dir); -} - -void Interface::LoadProgress(int percent) -{ - vars->SetAt("Progress", percent); - RedrawControls("Progress", percent); - RedrawAll(); - DrawWindows(); - video->SwapBuffers(); -} - -void Interface::ReleaseDraggedItem() -{ - DraggedItem=NULL; //shouldn't free this - video->SetDragCursor (NULL); -} - -void Interface::DragItem(CREItem *item, const ieResRef Picture) -{ - //We should drop the dragged item and pick this up, - //we shouldn't have a valid DraggedItem at this point. - //Anyway, if there is still a dragged item, it will be destroyed. - if (DraggedItem) { - printMessage("Core","Forgot to call ReleaseDraggedItem when leaving inventory (item destroyed)!\n",YELLOW); - delete DraggedItem; - } - DraggedItem = item; - if (video) { - Sprite2D* DraggedCursor = NULL; - if (item) { - DraggedCursor = gamedata->GetBAMSprite( Picture, 0, 0 ); - } - video->SetDragCursor (DraggedCursor); - } -} - -void Interface::SetDraggedPortrait(int dp, int idx) -{ - if (idx<0) idx=14; - DraggedPortrait = dp; - if (dp) { - //hmm this might work? - Cursors[idx]->acquire(); - video->SetDragCursor(Cursors[idx]); - } else { - video->SetDragCursor(NULL); - } -} - -bool Interface::ReadItemTable(const ieResRef TableName, const char * Prefix) -{ - ieResRef ItemName; - int i,j; - - AutoTable tab(TableName); - if (!tab) { - return false; - } - i=tab->GetRowCount(); - for(j=0;jGetRowName(j), 8); - } - //Variable elements are free'd, so we have to use malloc - //well, not anymore, we can use ReleaseFunction - int l=tab->GetColumnCount(j); - if (l<1) continue; - int cl = atoi(tab->GetColumnName(0)); - ItemList *itemlist = new ItemList(l, cl); - for(int k=0;kResRefs[k],tab->QueryField(j,k), 8); - } - RtRows->SetAt(ItemName, (void*)itemlist); - } - return true; -} - -bool Interface::ReadRandomItems() -{ - ieResRef RtResRef; - int i; - - ieDword difflev=0; //rt norm or rt fury - vars->Lookup("Nightmare Mode", difflev); - if (RtRows) { - RtRows->RemoveAll(ReleaseItemList); - } - else { - RtRows=new Variables(10, 17); //block size, hash table size - if (!RtRows) { - return false; - } - RtRows->SetType( GEM_VARIABLES_POINTER ); - } - AutoTable tab("randitem"); - if (!tab) { - return false; - } - if (difflev>=tab->GetColumnCount()) { - difflev = tab->GetColumnCount()-1; - } - - //the gold item - strnlwrcpy( GoldResRef, tab->QueryField((unsigned int) 0,(unsigned int) 0), 8); - if ( GoldResRef[0]=='*' ) { - return false; - } - strnlwrcpy( RtResRef, tab->QueryField( 1, difflev ), 8); - i=atoi( RtResRef ); - if (i<1) { - ReadItemTable( RtResRef, 0 ); //reading the table itself - return true; - } - if (i>5) { - i=5; - } - while(i--) { - strnlwrcpy( RtResRef, tab->QueryField(2+i,difflev), 8); - ReadItemTable( RtResRef,tab->GetRowName(2+i) ); - } - return true; -} - -CREItem *Interface::ReadItem(DataStream *str) -{ - CREItem *itm = new CREItem(); - if (ReadItem(str, itm)) return itm; - delete itm; - return NULL; -} - -CREItem *Interface::ReadItem(DataStream *str, CREItem *itm) -{ - str->ReadResRef( itm->ItemResRef ); - str->ReadWord( &itm->Expired ); - str->ReadWord( &itm->Usages[0] ); - str->ReadWord( &itm->Usages[1] ); - str->ReadWord( &itm->Usages[2] ); - str->ReadDword( &itm->Flags ); - if (ResolveRandomItem(itm) ) { - return itm; - } - return NULL; -} - -#define MAX_LOOP 10 - -//This function generates random items based on the randitem.2da file -//there could be a loop, but we don't want to freeze, so there is a limit -bool Interface::ResolveRandomItem(CREItem *itm) -{ - if (!RtRows) return true; - for(int loop=0;loopLookup( itm->ItemResRef, lookup ) ) { - if (!gamedata->Exists(itm->ItemResRef, IE_ITM_CLASS_ID)) { - printMessage("Interface", "Nonexistent random item (bad table entry) detected: %s\n", LIGHT_RED, itm->ItemResRef); - return false; - } - return true; - } - ItemList *itemlist = (ItemList*)lookup; - if (itemlist->WeightOdds) { - //instead of 1d19 we calculate with 2d10 (which also has 19 possible values) - i=Roll(2,(itemlist->Count+1)/2,-2); - } else { - i=Roll(1,itemlist->Count,-1); - } - strnlwrcpy( NewItem, itemlist->ResRefs[i], 8); - char *p=(char *) strchr(NewItem,'*'); - if (p) { - *p=0; //doing this so endptr is ok - k=strtol(p+1,NULL,10); - } else { - k=1; - } - j=strtol(NewItem,&endptr,10); - if (j<1) { - j=1; - } - if (*endptr) { - strnlwrcpy(itm->ItemResRef, NewItem, 8); - } else { - strnlwrcpy(itm->ItemResRef, GoldResRef, 8); - } - if ( !memcmp( itm->ItemResRef,"no_drop",8 ) ) { - itm->ItemResRef[0]=0; - } - if (!itm->ItemResRef[0]) { - return false; - } - itm->Usages[0]=(ieWord) Roll(j,k,0); - } - printMessage("Interface", "Loop detected while generating random item:%s\n", LIGHT_RED, - itm->ItemResRef); - return false; -} - -//now that we store spell name in spl, i guess, we shouldn't pass 'ieResRef name' -//these functions are needed because Win32 doesn't allow freeing memory from -//another dll. So we allocate all commonly used memories from core -ITMExtHeader *Interface::GetITMExt(int count) -{ - return new ITMExtHeader[count]; -} - -SPLExtHeader *Interface::GetSPLExt(int count) -{ - return new SPLExtHeader[count]; -} - -Effect *Interface::GetEffect(ieDword opcode) -{ - if (opcode==0xffffffff) { - return NULL; - } - Effect *fx = new Effect(); - if (!fx) { - return NULL; - } - memset(fx,0,sizeof(Effect)); - fx->Opcode=opcode; - return fx; -} - -Effect *Interface::GetFeatures(int count) -{ - return new Effect[count]; -} - -/* -void Interface::FreeITMExt(ITMExtHeader *p, Effect *e) -{ - delete [] p; - delete [] e; -} - -void Interface::FreeSPLExt(SPLExtHeader *p, Effect *e) -{ - delete [] p; - delete [] e; -} -*/ - -WorldMapArray *Interface::NewWorldMapArray(int count) -{ - return new WorldMapArray(count); -} - -Container *Interface::GetCurrentContainer() -{ - return CurrentContainer; -} - -int Interface::CloseCurrentContainer() -{ - UseContainer = false; - if ( !CurrentContainer) { - return -1; - } - //remove empty ground piles on closeup - CurrentContainer->GetCurrentArea()->TMap->CleanupContainer(CurrentContainer); - CurrentContainer = NULL; - return 0; -} - -void Interface::SetCurrentContainer(Actor *actor, Container *arg, bool flag) -{ - //abort action if the first selected PC isn't the original actor - if (actor!=GetFirstSelectedPC(false)) { - CurrentContainer = NULL; - return; - } - CurrentContainer = arg; - UseContainer = flag; -} - -Store *Interface::GetCurrentStore() -{ - return CurrentStore; -} - -void Interface::CloseCurrentStore() -{ - gamedata->SaveStore(CurrentStore); - CurrentStore = NULL; -} - -Store *Interface::SetCurrentStore(const ieResRef resname, ieDword owner) -{ - if (CurrentStore) { - if (!strnicmp(CurrentStore->Name, resname, 8)) { - return CurrentStore; - } - - //not simply delete the old store, but save it - CloseCurrentStore(); - } - - CurrentStore = gamedata->GetStore(resname); - if (CurrentStore == NULL) { - return NULL; - } - if (owner) { - CurrentStore->SetOwnerID(owner); - } - return CurrentStore; -} - -void Interface::SetMouseScrollSpeed(int speed) { - mousescrollspd = (speed+1)*2; -} - -int Interface::GetMouseScrollSpeed() { - return mousescrollspd; -} - -ieStrRef Interface::GetRumour(const ieResRef dlgref) -{ - PluginHolder dm(IE_DLG_CLASS_ID); - dm->Open(gamedata->GetResource(dlgref, IE_DLG_CLASS_ID)); - Dialog *dlg = dm->GetDialog(); - - if (!dlg) { - printMessage("Interface", "Cannot load dialog: %s\n", LIGHT_RED, dlgref); - return (ieStrRef) -1; - } - Scriptable *pc=game->GetPC( game->GetSelectedPCSingle(), false ); - - ieStrRef ret = (ieStrRef) -1; - int i = dlg->FindRandomState( pc ); - if (i>=0 ) { - ret = dlg->GetState( i )->StrRef; - } - delete dlg; - return ret; -} - -//plays stock sound listed in defsound.2da -void Interface::PlaySound(int index) -{ - if (index<=DSCount) { - AudioDriver->Play(DefSound[index]); - } -} - -Actor *Interface::GetFirstSelectedPC(bool forced) -{ - Actor *ret = NULL; - int slot = 0; - int partySize = game->GetPartySize( false ); - if (!partySize) return NULL; - for (int i = 0; i < partySize; i++) { - Actor* actor = game->GetPC( i,false ); - if (actor->IsSelected()) { - if (actor->InPartyInParty; - } - } - } - - if (forced && !ret) { - return game->FindPC((unsigned int) 0); - } - return ret; -} - -Actor *Interface::GetFirstSelectedActor() -{ - if (game->selected.size()) { - return game->selected[0]; - } - return NULL; -} - -//this is used only for the console -Sprite2D *Interface::GetCursorSprite() -{ - Sprite2D *spr = gamedata->GetBAMSprite(CursorBam, 0, 0); - if (spr) - { - if(HasFeature(GF_OVERRIDE_CURSORPOS)) - { - spr->XPos=1; - spr->YPos=spr->Height-1; - } - } - return spr; -} - -Sprite2D *Interface::GetScrollCursorSprite(int frameNum, int spriteNum) -{ - return gamedata->GetBAMSprite(ScrollCursorBam, frameNum, spriteNum); -} - -/* we should return -1 if it isn't gold, otherwise return the gold value */ -int Interface::CanMoveItem(const CREItem *item) const -{ - //This is an inventory slot, switch to IE_ITEM_* if you use Item - if (!HasFeature(GF_NO_DROP_CAN_MOVE) ) { - if (item->Flags & IE_INV_ITEM_UNDROPPABLE) - return 0; - } - //not gold, we allow only one single coin ResRef, this is good - //for all of the original games - if (strnicmp(item->ItemResRef, GoldResRef, 8 ) ) - return -1; - //gold, returns the gold value (stack size) - return item->Usages[0]; -} - -// dealing with applying effects -void Interface::ApplySpell(const ieResRef resname, Actor *actor, Scriptable *caster, int level) -{ - Spell *spell = gamedata->GetSpell(resname); - if (!spell) { - return; - } - - int header = spell->GetHeaderIndexFromLevel(level); - EffectQueue *fxqueue = spell->GetEffectBlock(caster, actor->Pos, header, level); - - ApplyEffectQueue(fxqueue, actor, caster, actor->Pos); - delete fxqueue; -} - -void Interface::ApplySpellPoint(const ieResRef resname, Map* area, const Point &pos, Scriptable *caster, int level) -{ - Spell *spell = gamedata->GetSpell(resname); - if (!spell) { - return; - } - int header = spell->GetHeaderIndexFromLevel(level); - Projectile *pro = spell->GetProjectile(caster, header, pos); - pro->SetCaster(caster->GetGlobalID(), level); - area->AddProjectile(pro, caster->Pos, pos); -} - -//-1 means the effect was reflected back to the caster -//0 means the effect was resisted and should be removed -//1 means the effect was applied -int Interface::ApplyEffect(Effect *effect, Actor *actor, Scriptable *caster) -{ - if (!effect) { - return 0; - } - - EffectQueue *fxqueue = new EffectQueue(); - //AddEffect now copies the fx data, please delete your effect reference - //if you created it. (Don't delete cached references) - fxqueue->AddEffect( effect ); - int res = ApplyEffectQueue(fxqueue, actor, caster); - delete fxqueue; - return res; -} - -int Interface::ApplyEffectQueue(EffectQueue *fxqueue, Actor *actor, Scriptable *caster) -{ - Point p; - p.empty(); //the effect should have all its coordinates already set - return ApplyEffectQueue(fxqueue, actor, caster, p); -} - -int Interface::ApplyEffectQueue(EffectQueue *fxqueue, Actor *actor, Scriptable *caster, Point p) -{ - int res = fxqueue->CheckImmunity ( actor ); - if (res) { - if (res == -1 ) { - //bounced back at a nonliving caster - if (caster->Type!=ST_ACTOR) { - return 0; - } - actor = (Actor *) caster; - } - fxqueue->SetOwner( caster ); - - if (fxqueue->AddAllEffects( actor, p)==FX_NOT_APPLIED) { - res=0; - } - } - return res; -} - -Effect *Interface::GetEffect(const ieResRef resname, int level, const Point &p) -{ - //Don't free this reference, it is cached! - Effect *effect = gamedata->GetEffect(resname); - if (!effect) { - return NULL; - } - if (!level) { - level = 1; - } - effect->Power = level; - effect->PosX=p.x; - effect->PosY=p.y; - return effect; -} - -// dealing with saved games -int Interface::SwapoutArea(Map *map) -{ - PluginHolder mm(IE_ARE_CLASS_ID); - if (mm == NULL) { - return -1; - } - int size = mm->GetStoredFileSize (map); - if (size > 0) { - //created streams are always autofree (close file on destruct) - //this one will be destructed when we return from here - FileStream str; - - str.Create( map->GetScriptName(), IE_ARE_CLASS_ID ); - int ret = mm->PutArea (&str, map); - if (ret <0) { - printMessage("Core", "Area removed: %s\n", YELLOW, - map->GetScriptName()); - RemoveFromCache(map->GetScriptName(), IE_ARE_CLASS_ID); - } - } else { - printMessage("Core", "Area removed: %s\n", YELLOW, - map->GetScriptName()); - RemoveFromCache(map->GetScriptName(), IE_ARE_CLASS_ID); - } - //make sure the stream isn't connected to sm, or it will be double freed - return 0; -} - -int Interface::WriteCharacter(const char *name, Actor *actor) -{ - char Path[_MAX_PATH]; - - PathJoin( Path, GamePath, GameCharactersPath, NULL ); - if (!actor) { - return -1; - } - PluginHolder gm(IE_CRE_CLASS_ID); - if (gm == NULL) { - return -1; - } - - //str is freed - { - FileStream str; - - if (!str.Create( Path, name, IE_CHR_CLASS_ID )) - return -1; - - int ret = gm->PutActor(&str, actor, true); - if (ret <0) { - printMessage("Core", "Character cannot be saved: %s\n", YELLOW, name); - return -1; - } - } - - //write the BIO string - if (!HasFeature(GF_NO_BIOGRAPHY)) { - FileStream str; - - str.Create( Path, name, IE_BIO_CLASS_ID ); - //never write the string reference into this string - char *tmp = GetString(actor->GetVerbalConstant(VB_BIO),IE_STR_STRREFOFF); - str.Write (tmp, strlen(tmp)); - free(tmp); - } - return 0; -} - -int Interface::WriteGame(const char *folder) -{ - PluginHolder gm(IE_GAM_CLASS_ID); - if (gm == NULL) { - return -1; - } - - int size = gm->GetStoredFileSize (game); - if (size > 0) { - //created streams are always autofree (close file on destruct) - //this one will be destructed when we return from here - FileStream str; - - str.Create( folder, GameNameResRef, IE_GAM_CLASS_ID ); - int ret = gm->PutGame (&str, game); - if (ret <0) { - printMessage("Core", "Game cannot be saved: %s\n", YELLOW, folder); - return -1; - } - } else { - printMessage("Core", "Internal error, game cannot be saved: %s\n", YELLOW, folder); - return -1; - } - return 0; -} - -int Interface::WriteWorldMap(const char *folder) -{ - PluginHolder wmm(IE_WMP_CLASS_ID); - if (wmm == NULL) { - return -1; - } - - if (WorldMapName[1][0]) { - worldmap->SetSingle(false); - } - - int size1 = wmm->GetStoredFileSize (worldmap, 0); - int size2 = 1; //just a dummy value - - //if size is 0 for the first worldmap, then there is a problem - if (!worldmap->IsSingle() && (size1>0) ) { - size2=wmm->GetStoredFileSize (worldmap, 1); - } - - int ret = 0; - if ((size1 < 0) || (size2<0) ) { - ret=-1; - } else { - //created streams are always autofree (close file on destruct) - //this one will be destructed when we return from here - FileStream str1; - FileStream str2; - - str1.Create( folder, WorldMapName[0], IE_WMP_CLASS_ID ); - if (!worldmap->IsSingle()) { - str2.Create( folder, WorldMapName[1], IE_WMP_CLASS_ID ); - } - ret = wmm->PutWorldMap (&str1, &str2, worldmap); - } - if (ret <0) { - printMessage("Core", "Internal error, worldmap cannot be saved: %s\n", YELLOW, folder); - return -1; - } - return 0; -} - -int Interface::CompressSave(const char *folder) -{ - FileStream str; - - str.Create( folder, GameNameResRef, IE_SAV_CLASS_ID ); - DirectoryIterator dir(CachePath); - if (!dir) { - return -1; - } - PluginHolder ai(IE_SAV_CLASS_ID); - ai->CreateArchive( &str); - - //.tot and .toh should be saved last, because they are updated when an .are is saved - int priority=2; - while(priority) { - do { - const char *name = dir.GetName(); - if (dir.IsDirectory()) - continue; - if (name[0] == '.') - continue; - if (SavedExtension(name)==priority) { - char dtmp[_MAX_PATH]; - dir.GetFullPath(dtmp); - FileStream fs; - fs.Open(dtmp); - ai->AddToSaveGame(&str, &fs); - } - } while (++dir); - //reopen list for the second round - priority--; - if (priority>0) { - dir.Rewind(); - } - } - return 0; -} - -int Interface::GetMaximumAbility() const { return MaximumAbility; } - -int Interface::GetStrengthBonus(int column, int value, int ex) const -{ - //to hit, damage, open doors, weight allowance - if (column<0 || column>3) - return -9999; - - if (value<0) - value = 0; - else if (value>25) - value = 25; - - if (ex<0) - ex=0; - else if (ex>100) - ex=100; - - return strmod[column*(MaximumAbility+1)+value]+strmodex[column*101+ex]; -} - -//The maze columns are used only in the maze spell, no need to restrict them further -int Interface::GetIntelligenceBonus(int column, int value) const -{ - //learn spell, max spell level, max spell number on level, maze duration dice, maze duration dice size - if (column<0 || column>4) return -9999; - - return intmod[column*(MaximumAbility+1)+value]; -} - -int Interface::GetDexterityBonus(int column, int value) const -{ - //no dexmod in iwd2 and only one type of modifier - if (HasFeature(GF_3ED_RULES)) { - return (value-10)/2; - } - - //reaction, missile, ac - if (column<0 || column>2) - return -9999; - - return dexmod[column*(MaximumAbility+1)+value]; -} - -int Interface::GetConstitutionBonus(int column, int value) const -{ - //no conmod in iwd2 - if (HasFeature(GF_3ED_RULES)) { - return (value-10)/2; - } - - //normal, warrior, minimum, regen hp, regen fatigue - if (column<0 || column>4) - return -9999; - - return conmod[column*(MaximumAbility+1)+value]; -} - -int Interface::GetCharismaBonus(int column, int /*value*/) const -{ - // store price reduction - if (column<0 || column>(MaximumAbility-1)) - return -9999; - - return chrmod[column]; -} - -int Interface::GetLoreBonus(int column, int value) const -{ - //no lorebon in iwd2 - lore is a skill - if (HasFeature(GF_3ED_RULES)) return 0; - - if (column<0 || column>0) - return -9999; - - return lorebon[value]; -} - -int Interface::GetWisdomBonus(int column, int value) const -{ - //no wismod in iwd2 - if (HasFeature(GF_3ED_RULES)) { - return (value-10)/2; - } - - if (!HasFeature(GF_WISDOM_BONUS)) return 0; - - // xp bonus - if (column<0 || column>0) - return -9999; - - return wisbon[value]; -} - -int Interface::GetReputationMod(int column) const -{ - int reputation = game->Reputation / 10 - 1; - - if (column<0 || column>8) { - return -9999; - } - if (reputation > 19) { - reputation = 19; - } - if (reputation < 0) { - reputation = 0; - } - - return reputationmod[reputation][column]; -} - -// -3, -2 if request is illegal or in cutscene -// -1 if pause is already active -// 0 if pause was not allowed -// 1 if autopause happened -int Interface::Autopause(ieDword flag) -{ - GameControl *gc = GetGameControl(); - if (!gc) { - return -3; - } - if (InCutSceneMode()) { - return -2; - } - if (gc->GetDialogueFlags()&DF_FREEZE_SCRIPTS) { - return -1; - } - ieDword autopause_flags = 0; - - vars->Lookup("Auto Pause State", autopause_flags); - if (autopause_flags & (1<DisplayConstantString(STR_AP_UNUSABLE+flag, 0xff0000); - gc->SetDialogueFlags(DF_FREEZE_SCRIPTS, BM_OR); - return 1; - } - return 0; -} - -void Interface::RegisterOpcodes(int count, const EffectDesc *opcodes) -{ - EffectQueue_RegisterOpcodes(count, opcodes); -} - -void Interface::SetInfoTextColor(const Color &color) -{ - if (InfoTextPalette) { - gamedata->FreePalette(InfoTextPalette); - } - InfoTextPalette = CreatePalette(color, black); -} - -//todo row? -void Interface::GetResRefFrom2DA(const ieResRef resref, ieResRef resource1, ieResRef resource2, ieResRef resource3) -{ - if (!resource1) { - return; - } - resource1[0]=0; - if (resource2) { - resource2[0]=0; - } - if (resource3) { - resource3[0]=0; - } - AutoTable tab(resref); - if (tab) { - unsigned int cols = tab->GetColumnCount(); - unsigned int row = (unsigned int) Roll(1,tab->GetRowCount(),-1); - strnuprcpy(resource1, tab->QueryField(row,0), 8); - if (resource2 && cols>1) - strnuprcpy(resource2, tab->QueryField(row,1), 8); - if (resource3 && cols>2) - strnuprcpy(resource3, tab->QueryField(row,2), 8); - } -} - -ieDword *Interface::GetListFrom2DAInternal(const ieResRef resref) -{ - ieDword *ret; - - AutoTable tab(resref); - if (tab) { - ieDword cnt = tab->GetRowCount(); - ret = (ieDword *) malloc((1+cnt)*sizeof(ieDword)); - ret[0]=cnt; - while(cnt) { - ret[cnt]=strtol(tab->QueryField(cnt-1, 0),NULL, 0); - cnt--; - } - return ret; - } - ret = (ieDword *) malloc(sizeof(ieDword)); - ret[0]=0; - return ret; -} - -ieDword* Interface::GetListFrom2DA(const ieResRef tablename) -{ - ieDword *list; - - if (!lists->Lookup(tablename, (void *&) list)) { - list = GetListFrom2DAInternal(tablename); - lists->SetAt(tablename, list); - } - - return list; -} - -//returns a numeric value associated with a stat name (symbol) from stats.ids -ieDword Interface::TranslateStat(const char *stat_name) -{ - long tmp; - - if (valid_number(stat_name, tmp)) { - return (ieDword) tmp; - } - - int symbol = LoadSymbol( "stats" ); - Holder sym = GetSymbol( symbol ); - ieDword stat = (ieDword) sym->GetValue( stat_name ); - if (stat==(ieDword) ~0) { - printMessage("Core", "Cannot translate symbol: %s\n", YELLOW, stat_name); - } - return stat; -} - -void Interface::WaitForDisc(int disc_number, const char* path) -{ - GetDictionary()->SetAt( "WaitForDisc", (ieDword) disc_number ); - - GetGUIScriptEngine()->RunFunction( "GUICommonWindows", "OpenWaitForDiscWindow" ); - do { - DrawWindows(); - for (size_t i=0;iRunFunction( "GUICommonWindows", "OpenWaitForDiscWindow" ); - return; - } - } - - } while (video->SwapBuffers() == GEM_OK); -} - -// remove the extraneus EOL newline and carriage return -void Interface::StripLine(char * string, size_t size) { - if (size >= 2 && string[size-2] == '\n') { - string[size-2] = '\0'; - } - if (size >= 3 && string[size-3] == '\r') { - string[size-3] = '\0'; // remove the carriage return too - } -} - -void Interface::SetTickHook(EventHandler hook) -{ - TickHook = hook; -} - -void Interface::SetNextScript(const char *script) -{ - strncpy( NextScript, script, sizeof(NextScript) ); - QuitFlag |= QF_CHANGESCRIPT; -} - -void Interface::SanityCheck(const char *ver) { - if (strcmp(ver, VERSION_GEMRB)) { - error("Core", "version check failed: core version %s doesn't match caller's version %s\n", VERSION_GEMRB, ver); - } -} diff --git a/project/jni/application/gemrb/gemrb/core/Interface.h b/project/jni/application/gemrb/gemrb/core/Interface.h deleted file mode 100644 index f8d86189f..000000000 --- a/project/jni/application/gemrb/gemrb/core/Interface.h +++ /dev/null @@ -1,807 +0,0 @@ -/* GemRB - Infinity Engine Emulator - * Copyright (C) 2003 The GemRB Project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * - */ - -/** - * @file Interface.h - * Declaration of Interface class, central interconnect for various GemRB parts - */ - -#ifndef INTERFACE_H -#define INTERFACE_H - -#include "SClassID.h" -#include "exports.h" - -#include "Cache.h" -#include "Callback.h" -#include "Holder.h" - -#include -#include -#include - -#ifdef _MSC_VER // No SFINAE -#include "Audio.h" -#include "DataFileMgr.h" -#include "MusicMgr.h" -#include "SaveGame.h" -#include "ScriptEngine.h" -#include "StringMgr.h" -#include "SymbolMgr.h" -#include "Video.h" -#include "WindowMgr.h" -#endif - -class Actor; -class Audio; -class CREItem; -class Calendar; -class Console; -class Container; -class Control; -class DataFileMgr; -struct Effect; -class EffectQueue; -struct EffectDesc; -class EventMgr; -class Factory; -class Font; -class Game; -class GameControl; -class GlobalTimer; -class ITMExtHeader; -class Image; -class Item; -class KeyMap; -class Label; -class Map; -class MusicMgr; -class Palette; -class ProjectileServer; -class Resource; -class SPLExtHeader; -class SaveGame; -class SaveGameIterator; -class ScriptEngine; -class ScriptedAnimation; -class Spell; -class Sprite2D; -class Store; -class StringMgr; -class SymbolMgr; -class TableMgr; -class TextArea; -class Variables; -class Video; -class Window; -class WindowMgr; -class WorldMap; -class WorldMapArray; - -struct Symbol { - Holder sm; - char ResRef[8]; -}; - -struct SlotType { - ieDword slot; - ieDword slottype; - ieDword slottip; - ieDword slotid; - ieDword sloteffects; - ieDword slotflags; - ieResRef slotresref; -}; - -struct DamageInfoStruct { - unsigned int strref; - unsigned int resist_stat; - unsigned int value; - int iwd_mod_type; - // maybe also add the ac bonus and/or the DL_ constants -}; - -struct ModalStatesStruct { - ieResRef spell; - char action[16]; - unsigned int entering_str; - unsigned int leaving_str; - unsigned int failed_str; - bool aoe_spell; -}; - -struct TimeStruct { - unsigned int round_sec; - unsigned int turn_sec; - unsigned int round_size; // in ticks - unsigned int rounds_per_turn; -}; - -struct SpellDescType { - ieResRef resref; - ieStrRef value; -}; -#define SP_IDENTIFY 1 //any spell that cannot be cast from the menu -#define SP_SILENCE 2 //any spell that can be cast in silence - -struct SurgeSpell { - ieResRef spell; - ieStrRef message; -}; - -class ItemList { -public: - ieResRef *ResRefs; - unsigned int Count; - //if count is odd and the column titles start with 2, the random roll should be 2d((c+1)/2)-1 - bool WeightOdds; - - ItemList(unsigned int size, int label) { - ResRefs = (ieResRef *) calloc(size, sizeof(ieResRef) ); - Count = size; - if ((size&1) && (label==2)) { - WeightOdds=true; - } else { - WeightOdds=false; - } - } - ~ItemList() { - if (ResRefs) { - free(ResRefs); - } - } -}; - -// Colors of modal window shadow -// !!! Keep these synchronized with GUIDefines.py !!! -#define MODAL_SHADOW_NONE 0 -#define MODAL_SHADOW_GRAY 1 -#define MODAL_SHADOW_BLACK 2 - -#define WINDOW_INVALID -1 -#define WINDOW_INVISIBLE 0 -#define WINDOW_VISIBLE 1 -#define WINDOW_GRAYED 2 -#define WINDOW_FRONT 3 - -//quitflags -#define QF_NORMAL 0 -#define QF_QUITGAME 1 -#define QF_EXITGAME 2 -#define QF_CHANGESCRIPT 4 -#define QF_LOADGAME 8 -#define QF_ENTERGAME 16 - -//events that are called out of drawwindow -//they wait until the condition is right -#define EF_CONTROL 1 //updates the game window statuses -#define EF_SHOWMAP 2 //starts worldmap -#define EF_PORTRAIT 4 //updates portraits -#define EF_ACTION 8 //updates the actions bar -#define EF_UPDATEANIM 16 //updates avatar animation -#define EF_SEQUENCER 32 //starts sequencer/contingency creation -#define EF_IDENTIFY 64 //starts identify screen -#define EF_SELECTION 128 //selection changed -#define EF_OPENSTORE 256 //open store window -#define EF_EXPANSION 512 //upgrade game request -#define EF_CREATEMAZE 1024 //call the maze generator -#define EF_RESETTARGET 2048 //reset the mouse cursor -#define EF_TARGETMODE 4096 //update the mouse cursor - -//autopause -#define AP_UNUSABLE 0 -#define AP_ATTACKED 1 -#define AP_HIT 2 -#define AP_WOUNDED 3 -#define AP_DEAD 4 -#define AP_NOTARGET 5 -#define AP_ENDROUND 6 -#define AP_ENEMY 7 -#define AP_TRAP 8 -#define AP_SPELLCAST 9 - -/** ea relations (derivated from 2 actor's EA value) */ -#define EAR_FRIEND 0 -#define EAR_NEUTRAL 1 -#define EAR_HOSTILE 2 - -/** Max size of actor's ground circle (PST) */ -#define MAX_CIRCLE_SIZE 3 - -/** Summoning */ -#define EAM_SOURCEALLY 0 -#define EAM_SOURCEENEMY 1 -#define EAM_ENEMY 2 -#define EAM_ALLY 3 -#define EAM_NEUTRAL 4 -#define EAM_DEFAULT 5 -// -#define STAT_CON_HP_NORMAL 0 -#define STAT_CON_HP_WARRIOR 1 -#define STAT_CON_HP_MIN 2 -#define STAT_CON_HP_REGEN 3 -#define STAT_CON_FATIGUE 4 - -#define STAT_DEX_REACTION 0 -#define STAT_DEX_MISSILE 1 -#define STAT_DEX_AC 2 - -#define STAT_INT_LEARN 0 -#define STAT_INT_MAXLEVEL 1 -#define STAT_INT_MAXNUMBER 2 - -//sloteffects (querysloteffect returns it) -#define SLOT_EFFECT_NONE 0 -#define SLOT_EFFECT_ITEM 1 //normal equipped item -#define SLOT_EFFECT_FIST 2 //fist slot -#define SLOT_EFFECT_MAGIC 3 //magic weapon slot -#define SLOT_EFFECT_MELEE 4 //normal weapon slot -#define SLOT_EFFECT_MISSILE 5 //quiver slots -#define SLOT_EFFECT_LEFT 6 //shield (left hand) slot -#define SLOT_EFFECT_HEAD 7 //head slot - -//fog of war bits -#define FOG_DRAWFOG 1 -#define FOG_DRAWSEARCHMAP 2 -#define FOG_DITHERSPRITES 4 - -enum PluginFlagsType { - PLF_NORMAL, - PLF_SKIP, - PLF_DELAY -}; - -/** - * @class Interface - * Central interconnect for all GemRB parts, driving functions and utility functions possibly belonging to a better place - */ - -class GEM_EXPORT Interface -{ -private: - Holder

EU<&w;456E-Thm;aKmw{PAwB-*dik)gSoz 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%0Dcs%TK zKOa1$*>=u0%|jb>c$Y+<{6!K~=18)p1ZcI8U^@W<$b z%MoGr=Xah7`FTdGy|9R#>hMKBn%^bo*RjCUzsp_K1lK*e@U719@xGHk0zc%Vb`>k1 zFMOZJz`)SPfTO%FEe0o6-JY{t%?1K3=QsOLRG;v*f8O*N*BrK7V5#O)3Ys8y=6AE; zC)qTK88g!awq6kx7Ot7Fz^EcBy}@(8?6l~8i?1ph9=UnlW~QZr-2T7w8^mm9WYxGx zuQ()mUDt7;?oRDYl-9`f~P{kEfe558Zf|=q~a1WBStc-mp(?yT4u7 z%Aw_BzTUlgThZmSEGD;hTQ2S{3~%{z(#kqo_@b%L`?3wk_~SWr>pFiu@iDfLO}_r9 zXJ*EsU){3*UVatUnWgqrk;CtIgp=0>(f6t)KEdyICak|7_(|zO{+#ZIZ6&&U?0o)B zUF7mjVWZMVuSNA9THeRE6mMJo^}J7r;Y2Gn6YoWn`l>r0=o~zlSt9=SdAsXW1%-=B zC%uxYJH<3p-LLIby>;@oMShSG$JDOoC0d>DRl`&mC&e#6|NL#=j1Nkj6MlIKReOqZ z)=f5dp5gYkeUWPOMxB!?o-v+9>Prn%HB;S-FWB{+P7YA`sG~W-Lv`g`7xR}$bFZMw ztGR^0qBEM9Fg~fs6m+vYc>GaTDV^YF*7r8G0 zI%9^--7yt5et^-ag;4R4(Jt8nb=6roR!M-n z>T^QMk2o;#v9-lJNC-WV$j>@?0CuWI|DrR;?;ka`&`42;@d!ruq{P0~-A@@97~HVs zirmEX)Z*j}P^-`PqIXfNf&lAZcmmg-({k!*_^3jvI(-xW9Px-a{{^y+UFPpm4zC~Lx9cBA#bv;QY!zEi) zbCdl!iE78sKkOEDe|LLfQ|RayXz)gQM*fy;4I#%@T&|6KoI)Qw@t1$$7E-guz&)jb zm1*ym_c0sd)!vx9nmV;^a#$n4{pE8_P95*{>z)GIAtIvg8WX}L&VBXtmzC(?Dvotn zdF+Luo$KB0eJ-&$cE4hmyEqUStiY_oata> zxme_gpC;R+qpX$=n-*xud#I_37pE$iEKd<*+`1~`$+P7QGiUuWD6Cx|RjYTsV}io* z3i0y~1SXw9chB;+SBG#O1e%+elUa;^DI;vr|q?U=m9O4KCmvxjk%u z`5Y|3F|t5zT5e`B?%*~}1qb)1YFD)t&W&}Six=Mm7k}8s(Q`qO0ZNm| zrV+_ zI;NQ4z{J3lvD@HZdcp_yz{juOzk2-WMaRPFy?S~}WYN=t&27ysuyPk;gfzD(F&(2P zE|7$0`xX2^)wz;?Bx{;w?#3#!ol5+IT#12d%QXKad7LM(fo;VdZETjiaG!DM`!#fn zIw%~mjgRCO7v!Uz0G%WNzB_IT=5?3_hcOv+u+i){>8oLbgC-tMH1^Jo9Sp3ov zV0;DCQ(*m3&Gs8-+)Aw8@mL#I!I+;`T#$iUiGWW?l&E~bAn&`E+*-W3=F%mjTeKC;>by?1U1rQCwWh5QQ&F2Ucq&3^Ng&$jB6QJIwq;U2)X}X z>F{BLvh?Ih=j|IOWE%dG*)MEw^=^%s=+?=cQS_;T%q!H`wRvR|Trv z3m4cWtmeHVcizqmcaOc{n#(*(ev24S=-Zy7qO-Dv-mR}oTfr=pRXgvbquYwFs;{O@ zxXc^9D_H)sL9qUszw_e13Y_9x8E0s6>Z-VuPn7S?){l#37=QlZx!ij0I`$&@r0|04 zyZ8$iFG{sgJj5OGOKg9(_1t$MTl{Sv>FhpIZKd&R<$`m|%*#%m>bM=WZJrtXmFRz$ zU%D+_I{*HXsdl@!U4H53I{W$j3&r=ZfBDA1J;m^1TW3J#O_1G`@7drD+l?(IHfweQxH2|WCUJzjS{ia&C%*;!Wm`5)Q|snZQS5{_>5A~9i)eB*jH&D3D+X}?te{&6ck%$Oqe zXH$`w`;R@@zxS5?`Ce39KkM}Cr>*x*?;N_iF( znV;Q0KlSvc9Z;*d7>fHy0}l~q@erX zcNXadCk5T-7OJ?*lpdQXQ+S2*_%s<|OEnqczRbDF-hG`i!hM{_x0L0aG@O`x$nfEe zZP9Og6fEbJ%`x8bB;w_ZHGSt^+?ber#8B+~s%w^IPb3O^j&5GHHQBvy;@V@6BCnRM zK3&^$=Xiw8>gWkF{?_LtV~W<4Jh2P2Dw1CtF0=LatM_YV3T`#;<=t|Q;hq(9#cQ4iYmE=c zzUfWKtPnUVc=Tdb#fPI084ac!h>>~x;lbL&hh7SRuCj5&-o5jP*~dpR=s*)_wZI2 zPzOA-(vHr@S>b`}J1i&8LMuFWP<{6sXFF+X+^WVT1_lPu-Bp=_@J+yxIq~LXWFb`w& zAq(=0N)pk|22tRtfcuxd)#4Y?F)Dpdfs7PI*U z^AU@s+b%YoG3YAuFB`US1T#e!<(H(EWuk@__^uKuj#UzZ;6r?U3mRG*5%l96niFIynY-wy_Z5nPfGPs%-E^J(xzdZ$|$GT_^lE^RFcx+}=cX(1t@X5g0q zz9Y*hCE)@q=#DJ6phNse7!NW!_DxijxYhas%c1(mxvpu#QYU79E6>hEKXwT;8ibTK zL1&IlU}{;Hm-lhsv1txs90s7VpmYw7@87cCzj)m=Z~w%= zz;F_qe+r9p@*xN2^iI48IxX9E{^{@^tZC96A1rP*xUv{u4FCUM|IMjoD(5&o^EW*y zxP6;TwVZ!nx@5Wz^Y^=Lna`FqnW*b}@Gnt)IdO~9TE*a9Q@qC543 z-bnfP-PLI2!b?TguZI{I7)~-`SyK&KgbZ%`rcO93)TAKdcKxHsn%OHKE?S}E`61nH z<;g9XPqV-LXpGx+`N*ps7SDy3nAS9IPEb#n(`UXo`u#f2jJqMq*PgW1mkH-R zRCsT8DoRW-GR1li6``A*;?J&$2c0JdYHMQDf<=jWDWH`Wpsp2CQzpovLE-uXg>Z9) z!@4FKM)$7YKRWgF-TTK`wO+rLe3O&FmsZ63bLRompF3L^ObNecR_a&V_^8k<0#id19 zPS1q3Lw2&Yv$5iAhlKy}yQ%>S4s2yfQC_+U)`;b|FflNYNwPV@@pyTIC-|65=BFyV zn9#y{+VjLb-0sHFH;1{K)q>3ucZ*Pk^D6GEn2O5tOVSe4QR>Ge1s>R(4twkG_8peH zgmKL2q+R3xhTGL(qj4t@u+cbcqOP?POK}=qjQ@lmcKj#&G?rdB1YLcXj%}2pII%1h zbW{;aRw~lbJ$aqiPsjUdPyolbkNh8tzm$eHG#yAdZV;}=%(_Er#SX^l3!M@&(~8U{ zEl`|3u_-z&E{Si_3`TLZc+N78@d2OFhi!bUI5{J+2z?d@eES{01;a*z#Rkef^O@AZ zZCBxR2IWN6W=Zt6fxd6h3Nr=cLa)T$(Eq#1L?#MMUzO zg#vq@hD)*4>q&b9=jzX1ohs77m>ly+Ds4?-hs3iDxi{t&&XBwOq44_-r8Adzbj+&y z?;CM<<3`aUM=wdU-lg5;`OHh4zP~xK{mF`JYwqT&v04X*-uk)CaN1;h^rHY9Yz*0h zaFrRwsh}-BC|M6WJOG+4T!G^@SLGE9PRA9lSHwGWw+SZ*f=d*Qtfp95=a^<0!!MgI z9&O!%zV!LzeHq+yuMlV8j;Y;NZ98!H&L;XUT$~8?Ax1~3IK3#p9Bq#b5ndEeNKBZ) z25u8GwzajXA83mCFDdayvgvN~pTo{d(BmN&M|;#XOyp#~-C!}R3Oyf8&fY#7wkH## z+h2^iB@?vnhLkOtkR6!{84?_eHW#ntWkBs`X)jq43m#?1R#g;d6y=xV*vtayu;xx+ zYT+=0^aQXjEoWX^eQzrR0|O_vX_VrOlEkDO@FKR<2?x2F4S3q#S8|<~Yx7)nHF=?E zYS-dvy?g(6`$XLon(i(9W8WXuC$V3TL^GR)>`c0mEK$tuTlekcS-}r)n!7WZtd>vr zR%Cjcu>3F;f)!**F6;$HXEeqX+31%cMUjQq2Jb%&mKT%wuxRMs_fQ-hy{x>&TivSz2> zoYLBH>X@Sck)1iGb5dhPOqT0p&zqZZO{Cz*)j#`JdSBEQ?^w^VYRR2S$C~O#b1xY|%+MA(Zcj~~8`!f$F9Ju4+kDi^rT>AS0cTt~{iSDnF@25C& zrO&#u>~(1C&t*$(gd7@#q;A1FME@J`)a1ds$ZsSUhUFa z?tE8ly5Xdx_l<(`^X7!VR9M6kuPVK&*23@a+o-K~i$b4O?u+wHKlQ3JF!N&4i@vsH z%MzAZzA}A1DWYVL+1nt0ry0^GeUh)F=Y(x~v2?APadul|a9ID!6U&^7ch88-Tx@je zPRQQHTvKv)9101F-tt23_GT`f8M)a_Rh!Cx#B80sP)J03_WL)hm)}@cyZ_>hK#{;b z_Bz&YTmOX}tz8=ZZuQwT4D2Z*zZDnw+1?C48r1;gcnv z9HD-*+5+A#(n)@=d0Rj;8PiY$1v z$Wy>K)`WLa#}W3vh{X9fqze~z1@4(+arA?&>X+vtjvoWA6n8DC(D+r{Rs1#J%X1O- z*9%{q*W|nAd~trT%$oK^_RB4D`CaS%3UA51@|n!%DQtOpiSwl;b22X}W(J)zc{#yE zGksQx$E+#FzE&!}I&1&`WMBNO{4!d$-q`la6L*5jPs>Tfy^oju_wJt-zi_r3cOLmZ z9p@NEaehXA0qPVd`e-3&L`LAC$iXMCo{7mPWPw&ELKcJxym|jn{(%(Mt-RMSErMT3 zi7^aRoS&bEXGrGv@83Id-URzwcj**7z9~q|#2ArLU_l#SLii@>Bz$?Bz#I7oFJ5Bb zm|XuXw+FoH4BJWN#RZ8)N!ggYu@ce_@Jf6h$gSIFpMp!8=7(~)*biT}n1Gk9jqe!+=W zKi~egQw~kIEdnmV=5rEVBJRMVe8^wZp{At~bg0C?hMk@B(2Mv}lXp$GhSoG#!z4KaTbLZ+ z{csW`$`hB&OlD(XY2a{cnIF{f!-5$!{&$(NSQz8njElQGf(h7&&F?sDjA0N2ZG~m{ zSjYxy6E91_W$=z|@i8@t4$8g+ zJeH2S0RtR%i0tgZu7lHKxDJj^wYfHxkfo?QF;Fc{bYNeD)6yOsp_y>tvjuodJ?V^6oYj>W5i0-_B#tJP0 zen)EqgKdNtyTo;_;eN-{x!!cTdIuqwpymrymw;n|-@qUVZNs+n=wo;XHTMzTWfw<>Ob=J{eRzIN}v{`Oh+K{vJ88BbzrKRE-XMoA+S)ulxNk z%l6j(+EeEvzRtLccS&F5*)r4YP0N-(o%i>zczw?gGsgU|2a6vx)+aD096#~we5~VX zt;g@$&8pIVM=3gqHeBwgjY?xZE3UF_qwzI%JI0OCcb7FEObB7vmc1+8Tqm7XJNn?R zzE)nfH3mGD;?LdZFWc51Tlq?guS!h7*yfPc{W<2>1A`Pe4`y1Ht8cq~y=PnOS&LWE z0UO@LZ|uz8-f;Uzb=XEby(15KbY- zbNJ@Y&#apgSDg{ZD71M^=34EzOP`n+kLOx6?_MS6-|}2?PknFu^BWf~oa_2Dm#=8w z<1e9{GS+b&QDvVer7vBvbRTQa@&yHn4UTmuttx(R_-PXC@jbL|hFH)#fhdtZk*)oE z8Riun%sDhyD~{iyT|K(M^d_5_uZj6AU1ir}nYXU)`T9UqXIGR5L*Fu~9GR-S<<=8b zoE4)Mb+%pJ6)(kQbvA7F*Xh6Oco^PuERj6BIapImpTAOd*Sh?~C=TM&SO&1qVe$(@gW8&8fO^d8%B5o|fE-yD$E)TgaO4ye~bF$>b81-~DD{`FH&weH93EgQNt zUYN7^X-)4(_Om@zx^z{+@;dnvh@luDEFH2aG?N{U_EL&JP zZ=;)@=YxnHCmj|?2^UqH5Oh~&eVDQ)EMeW}e8qaFv z=REs^faS9d9r^=jo>L9o``lY-(RG#siO!t~o%7C$ zzx;gJz@aIG*>>jMt$!I#a&yg}b@)WnF%B&rZJD!11*ZFa&M(vMT9xvMZEi$@jq6s2 zmj1$zKbR(PekeHe()zJ;Ov`;IQyXLEEXKL1$IiT4HSurJjr>h>K2D6RuqzIfh%C9s zzUSP=uYW(x%=qY-&nfcAN5=PBhnLTy1BWct%7u76^31k0cngcLx&BP~U%IHrbt3C` zpO~AiTvkd6HHY*s{{8XADO*spB2Zc3O0{mXj9?Ytq+IO_F2(cKa+A1sl{ z?5n{Qd5O zS9TolqXUP|N0^(GEb2V5a?io!x&`lZ!%i?xJ|cMRtb0v@XU@5lhpmnUJ*(H*hJ@ag z_R*2CIJ7B9dzwncRj;()hs)LWUsbC(=(X+}`@u;pfAiYRjo+nB{urdKt5-iaIQmWG zqy@GYF2^5QR{dw<=g)pZf4pZN+n}p;<&5-G%MR0m%#KwW`dx0z|7dUN(hZpLGsi5i zWY^=i`)|0kc1d}D(3hNbbQ^EQhlR%;r2kIv_Kr$V+0%Bma7OIWfBdLRQ?CDf;|*H$ zDvx!6SV2y4L25F}+P6!O9(^e({L1~Yr27dMAIEnS6O#agC+OWgsqSLjJ9vr<^6_n1 zWoHL%;la5UOvl&A3(rVZadLhUT1z%*LP|msv^lXM;Q*gZK?i^00gfXF8T;NHJSX>W z#}$jkMUk0rFqdJPNn0)90@jj&xiaM<-%^yoJ5rHt4+S>;8E=qsl{O95RN&o!1Y zgfg--AJ$iBVT9b0?Z~Vr*6MFB+_Ll|3H)vgK0K$~|UCr193k}w2cciH@hhjTi|296flmW6v8`}~%&qIdi@ zzWOl%bW9D%ahUV*#U=T9Xo~?R*xP^n-f49x z^SHwG9}LXGY}*+N4Zos0$L*y365Pujz|O%F3t$_BaIC?d$$4WjXi+%mAaTqQfRe-_ za9az$D*WlCM^A$s8af#MC$O3bbh@4~JaJVpR_BC0%dsaw(2R z=m8HtTuY*|LAaw<_O9*RX6HWzDUP5J0 zyMEta6rW*~^7NejLd`bui8Vsg!++)?PA6*J zp&jp8e$Vnfo%F@1&NaA+x4LV$)Lg;rxO>}k;?4xW@Zl_blRPEyyqn?q?%n$A78Tyg z^G|EfVX+Y5+22$8v!Y3LbJVG?Tb>`7SrKRc+u~qX@98(^rpssD`MmSYr{5VjHxwG1 zRVp8vb~7}~Rx^9sRo5FEJ!Ri8y?Hnxf6obz*G4igX39OZc%2w5A{X^>5_?42jPE&I zebs(mFP_dzFudZst!MtJM)RxuCv4a9tM3(g>$4@%Z^rJD51}Oo))(v&{>3f$p`2+~ zaK)E{^0Ai-mx)&&a?#%Ox46qN<85yLj11>(r%pca+;;C#B@IGeYzMjtIZBj2*&k?QSd#_Fd6Yuwhp`@A&!_O#B@`_ImHt)6y~{l*Lp zuFx7Ii7jfs0^Ys2y(y<--}KyhMS;z~YSlHDP0n=}dH;3ggiQaCbCVbPF52ByFl)|J zV{xAKvo@(zt$G_TSDD|hG{w}V6=M}}Tn{sDo_(d;@U1Ved zH>Td5yiDme_oTbBmHg*j!apu*J@V+@lkc)7Z4Tbf5dF=pV@dha-*Kvza*sStbDp$c z+$ZO>erfjFD~Drt7hcCXv8zje9~XP4@WJv2Lk`nqh5K(`{cQ1{@LcB64Rx-GJpUM;x}Or( z-ObD!_fYq_=d*h)2pJ1-7=whpj=Yn}8jE-(zp!wvxn!U47 z=HwdBy>r`^3FU`==C*aO&Q;*t7qaL5qJO^Z#fKK=T$mL)DJ00zX{VO+rPKG9Z%q-s zYI#=ditms1N!yiMXDhJIPn^9=&-O3Z!?v_IIbqVP#!oRfck~%? z7f(FDrhq-C-~7@{#k(JVul(aEe{AAR&gh1khBnJlf?Gr!?;n`9iFti-zgE9kYp4ng<%> zM)lT&WCfPK0t++6Dww+d%u=BE6uGeKa$oSf#H#_7e z{&52@>A<=Uy)>^Vu@cpKfkfoRgSiI09ElE$K1F}i6F$f*T)!ZWZb2rG(jPowmsgyO zc~TARVsZBNU#!-+PpT=}pw+{1=B~9HsK8wxCk6f1UJMiePCacU<(3;Ob?6)#Y(ANSj?fJV8bWuFk z7J3PmUE83nff2!=3qOv5PKOLOW`ke&v15{k0v{(IM^O*Y!3+0X^vf?{T=#Qm%jP)H zwiVFU0#Wp1GD=E|@{o6@&yYNGAizGCjoB!HNsyOEqCvDnQnHDesmX`;>>NiWS5F?E zg_R1|zFDlW6j78SKsu_XTEc4 z3=9k)!!d%gEV(E(H?aU?l!O0M$@eeCUmkub=6zoD>C1By^M_ANjGv(obzG0A|BtiG zD+8UNg?o!>JLn88HdkC{WKK$4dhC$#UCdGT%4 zgQD7yS?+p*d*7DbGA!R~Xs{&voX#SnHxa3~_LjIwFJ!x>`dqb5dBxi1swWDk?KPOc z2uoSsyVCddP06DSiAR5x__XG|xY{=9S=6#yhdn;a2(jN>Hfh7G6~b8wU0YmUp1VHD zZQ_~$R(TP9McM6-e+N$zT`7J`G&6RoZOAIWSFS})rfW<>Zhw9^<%!EDr|J{i9XwTZ zgLW?cyE^C3gQu2TK9nxs()#6$v~TdszNOcXnX-TU#O*pGc){D5^4Isreh~flJ?+wD9$G;QY!URrsyr3- z2JOg)nZYRWajHdj0`;-_La?^dSUKt^(rqPqEE}8 z?TBTCRSp;pvGR<}qMUM+WRjMUnve*o8bF7cf=-;>z|Eg{p}~2|{6^_>#ccsSeF6tg z9PnXpzsSv?JeQjzk>QZlM|qdF>I$}>E$%!$yI-I$-FUgSIUiP8V!9zeHy_)Pz8tGD zHcU=#oXN+xSUe#yVFEK~&*TpVW#u;g9tFo^|IhLK<9YaR-@ku#f)QISceOHHmA-U! zrVzf#d9Qc?=i}*1p^1NvBJof*bhgVL6#U1-Q#uf@J&btMA z=elFuT9o)^>qp#KwG3Pgpu_>vhVAzDouFa>R{`U`GEx{+CNf~#(qCSdk%>0sh+=YO zMH|j7{ZmRee+-8vQH)xoygWZA4aLQ26Osjz4)9w@$Z+7==PLdnAz=l>AyD1U%+1E; zw?W}?eK}kG4k2lUvTxd{)cpG0YIn|31_p*iMzp~s zkkZ7Y%$&>;@F9r4=e+rvLHE<_^*_iOmFUr+v-n7>hk(|je_?n2i>+0dQDr*ICVJ%_ z-FX$d51Ru1_-_$j%YC=*VsMeARrPtzjZaN0JoW^UJV@JFWaJf}W*HpAjW^I;kD`6RPxzyYPyk(r3n;r$$RR4PXU$h2obnl^AXc}xf8Kq){crB~6C=nw^NU*vv z9&0RPFg?g9#s+Gzxq;ubo}!IpBNCz!O!SvRqs>j}33b8#wcdchzGd;^^9+&xas zP64hzC3ifuaphr$Y{Z#D>b$j-Hmom2B? zZo$fv&QCXC8y)S>E?Q5(^jx&n!=Ta%Jobt(ofC)Y3+>*$Bw%_zYDI+2?H^sRyWQi6 zaxEd#Q3n99nLg18yXmvJmcIpW$40+06c+B-QjkK=e;)Y3u%Pg<>9~H#Lwh?93wrvQ zyj$=yxOhM>aKOf=WRznbPxc^5q7rt$9O&M{HZFw{o}%9GrY7kgjNC@xBcKXOK5~5j z(kYR^j(G&svFRrxuvQTWD>3~9-H&U%tD>bE_i-VQs!NP;=Qk|(A%bR3pp$K;>5$w| zEAw|wtTV3r5QF-D3o|h?F#N@uqjNIT^T0#xv6l|!wJ3 zY4@C6v+lomKE1Hw{ls0n4DSf%h4}8XexP(zy5rsb%|FinxbbN15zTwfy$9>BUXitX z`ol{4+83L+pnbnz&w2KDx$w#Q`$biI*1s;1lRC(EwXFGyDU(O&;y1;I#TDY+4PWbyWuW71>CoL3ua3$#R z^sqP4eLQnR&QD3rS^&|LDW9cmp}?gQ+!rOa@u%CjrIj3(GcoPJA%O0G}z*b_ep_S-_ zrECT!b}_a#VTTvss}(X3dru#{5Pl@}L;~wh+PO?t9x!iW)-Yf@F=`m(K`URdKUqlf zr$U>_olK0d3E4=z&8A40t(Yn`0i=^6Em4?F1cIAyexV(=4ORcB63%`dpUe zxzCb#vRO$gmQEz-EZ*-+SrMfY$atHMYuN7y6cI{O#$By}0+MjG2C{%)wN~ubdKETO zhZ%ZBsfmV|i3Ad3;0s}TLduUoQcAqT3-F%nOr(?oIdbv<-x5RgVmBkdTo7h0O4}Tq zI6>CpNGAwe!Dn3V2VZJxci_?_MOK|tKjt?coPW^p#MO%iNe!|d$>_FPo@JMVB~O%w zF3eWcUNn}3vf%KF!ytdY&j$MwJSYh{T2sXEz`Mm5{=E5k8vI00tifwUT=0ThUf??p zyuIP)^06IP2zOr$x*E3^eQ@T?IT?9-P{RvrwN{jxXpAF#A%~cN^PyvVVEe_ZXLavg zM-N>KtfBkhZ1rW_8L=oe(FB)Yp_YO+?;G%f574dE1?9v=;0C>mxY$(h4*|;fJ-=QB;(V+L1;~gv&O|G&lV@ z{BgylWP#~z#SxkBG_24Ep^Bci3cyBBu_TJ3{PI+^75W8Btfg_YieYh zn*?CXE;h@}NGfSz2y;ubvYvFTL9i#lb&lj8_G5-6=z(TGV%K}^^0=od5&|h^JGG{p&em{*S4$7!9DA6+LroVGmemL znJ6_aIO?EHAhfV8SXp?TIk@K?PTSaC7pH(zJo+{WNb)PnFHg%sT}Fe)HtaFkh8~_5 zubTgYrA+Lxmr;f~F$A^~(o=vX&P^#e6K4~bT|TVlkwEV%ClXk&Ws(kEum$S39X$8X z@tmT?Rf&Z~mYJ^ zO;g6*>c@ZKj5YXH7@UWuY|z-vPQYl?@&svQ2x2tO3ukV{`6uHy+6Z@F1?*~^M>5`# z`VoWQXxtahKwOP;)uF_<%lw=I3=Hdfv5n!BC6*)>fqN-i=bkQm6d~mL{Hv(k^##+9 zIv)sN;?xk>!4Um)&X@cz&$kO7wQM{oz3#EgtBdbSHfhW3>fgaXadGI!FVp@$|JiT< zzv9vVuG96#mrndIcw=F>XV3nSw&&B6GXDg-u&JBx7^ty zSN1%b%iwVRyO%G2YPQz@`_lK&)?9ymX{|S7*1gWk^54CGtClcazW3(d?AZDp_x9)9 zx|~()&FFQn|4Ur`jVw9afx8MJoHtqhbpKERR zZ+*V~Uz(iJY5l!ZtF^y}-T%fn<^GvZrz^J0y}$PO?yHY+dnIq@pZykH{d?`+zt`?( z?T2yy%I06LoCq@{{9BaVg}Ur*_ix?KfBW|P?6__5&$fU2b8TMxui2Fezf65H|q57)d{cIdf)K&`_{ML zAH6kijH)}HvtRt#!$*}K3udwR>=*CbKSee03&<5))lFNIeZ&yBC{*DUyDF290u?!s5`*69_o zbL&dtmNWdn`aAvk-hW@OXWgGMT_oXFb-CWBhi^aKmMNRY9@LPv=kDM3&w2gA(g6)o z)iX-I%g3E>l|5k1y5iZvclK-Ib>l#4D(~NWU19dr;%31do!SDO`sBH#XAe(#%)EDN z_3KaO*Tn7jZce|ae&DB#<^k!O)9;{os84)hG!JF}MW zqnKQZkm-At?=$+cjVCbqe1BY4{r>E)kN3WIbH1~*dy)I@*U>4J6$>9eeW`urSi9!u z4>P{k%{gdoz#jzITJ+mB@luvR@zBhPr(2tNys|{jHm4-YuVJt_>=L ze$BpnJ>%MKp^1%5S3d1NP`miA*u+MrJ(=m|75C4HU6YghD);``-)}&zaMQ9VS9Y|?vLmPJ8fUwz4LVYf#T{5zc(q)D!Zd ztD{z8zonKi|2ErKeN6|`dwDfC)`3g3>)+1*J5=My74Y@eznk$Zf;|~m z-Fx?U;n#ayV#^t>KEJltzGTmy*^MF(dcU*Pf7M$z-&#B)eF?)=8e?!BHbqA$IA{~V@}y)W`3*e5WB?7eoM>kD^K zLz1<0?EiZYS$`k%V_fy|(ck1V&f5BZlUG#j{+0N>t8%i)f?4hB{$7h{uw-3vta`0H z-}6Jy^p`V)zTfm)#_Rydz`Hj0ug%c+U|e-CZ=SvAk9llC4X=t{Kl}Na`&emEL(-nd zuXhw{^oQwNfdZz!XvMdRyd?~w`rm8=!zVL^?7h3^=7*XUADtJfbe+$wnQP8}=Xn`d zK<{^}cQV^>`+dFrnLE6N*4h*9r#4o2GJ4&+^hkG_`|9*LOlSUt|2vfZQA~P` z_Z+4xd#=gxrEYyEwIaA7s9NLgzUL30rU>^2H_R&Uspx;-Auf_oRsUCf{n6caHyK`w zEO@r{^E>BQlV_@|E1n*_H~;^S81MYon^>~qtf$+}+1@c7R69P%eVH3O&EahJ^GofA z1wT$=64@)cM|bbq(?TmM(@(sYz9so`qK%H>yD2L^&t>xQ&nka>Sm^P&N%xkXp0uLU z{X<@vK?Bp3J!W<_Yw88xpKSJ7^lWQg%$)z*n7x)Wn7%Jr@O;|u9rr{R`7vg_)%jj{ zch3?A)AwhNmmcBf3XrOwZY+QOtT(7St&K6)*L2Y3FP6U!anJ4#V8yQM`(JgLUiU-~Mg@g_y+k z`!8yXBZW-$k9{qwHqzI0IBP9=EIRRSP}q&>%B(vIocG*Y^JedbWjY)Aow*D?cR!1- zd@Hx|-`;8FACEoHmybKrT`H#OV95VCZ~yu=g?27n0bl&iR6p8jqH#bv|IglOS3h4l z*REw_9@LOj_xarF`TIL7PwckIG3d2s)u>93-SexK>Edn!{rA}>b)L$di?(m5JNPHg zW~Had-lyg7vpeoBtvvtcc>4Q2nj(8wpIbfOx$EAkZ;5?(+ATjNs(w5s{XRS7yy?5W zpXN2$uTkmxc&)5HJ^la#SHS1Avj2%c`zkycvmQHNoBP`ID(l-ukp(Zdek_lDymKOx z$X>I5>+V}0zUUmxNmzu|K@LRT}_d_$`yri5kFH8s&w5m z++)$N%BoSNe%JD5+wYaq_g#D!UDJ2Fysj>zGJf4x?;=l;y*uZ=4z&ors!qR~mwdYT|26*KlUG!# zOUUZiaEQpP$dK+5hxx ze3s`ziT5ILPe7SsYw4R^Pi?OJdNSGRqV?-XvGP0jS^Qe0)Vip=uj1yp8X><$FJc$W z^_7&|rhREeKb-xeuEMaiXXVd?*;k&0&=c?_yk8gSQ`%-qjr&VW^tf{PG+?U6D z{p~zO9v}U2;j@+4`_E=E`DXi0_$+#H_QBC&Wmb)<-PO5gE8G9F2Q|#Pes1n8=I7nb z{z9H1d&BI%>^YzMJW~Fn!hZJoHIr6U?XLKJuYXprfc~$e2i3Q#tcvU2{=9bQ%&S*x z-_JjrQ}??1f6lb>zmMiV=XqbZV}i>?>(}3Qo?`mS464@K#Xk#ZI$Ye{V7{D@)mO?j zf8&<(ALlImaJW^Z>)xevl6^PaRaiBurpH=qd%bx-fk|YqcJy|U9nU?u0=|UB%ANB* za~$N+-hXX{lSCFgJNjKy#vfGOfc*Y!;o|>`BRxT>YGV81|BLfIuUupNY`90_djG%v zeX4;yptAsu-_Tvk`D2=Jt7NUti5>u&Ayi4hFR0^TOY1`@n*8W z(AJNMiC=$JHrM%Z1$;^CnEqReb@D8itKAhZzn*=s(iOMHy!zhu=ikreSe$QW64`qq z|NQy28!C%W)}CLQU#1q=Eq?!T(Y=qgdu6-7sI0p8Zl@^wm6b~vw$}Cv{k*%-51cM- z1>T3>6WsGcdPtvGbez)pH%)>iVK-J;5soC%5U)`5E z&E;bDbBo&h$y&Md%g$FjR`2JT;&QROSmxgJ>_3xYgk0Yr+GG3v^iZ+z*~-e=e1)BF~_ z*!uVDQ?~C~9*kZ00>$4~9{!l~xH*E$^?gOo#{@Z09#N0oqkT+tjN3b@^{^RE$2Na4)4|vo1}3p`+oSv?|=7Q&6rX8=G3dXw(mvX z|1~NUGR;r@ni8G3e-@~`*|pwQaX+YCy01N>x(%FtKCaQ+z^A~fQT2A`);Hp7%iC1C z;%+~`wf15^C_l@@eK7}RcsBiCte~X$;?xb6y`cwXD|Yvy;s zjr;vTW#hNnT-)pXrPB`Her*%qKX2o`H(&30_5OZfdp~+*<@>4ct=IllU9RHwcgMUN zRu2E`Ty*bwvaSEMH)K|M*2i^zE6P0>vnpq#eR#Cb7F1u%E`2XMh4p(cS6Q1%R^^Pd z51;OvsBbh`qw4Lvh{yyxHCBy^|7hDRg|oYkuVG+dsKmMiq^zJQH4VJYGB>~zbP=MB z`uYuNr;>A{u!FF#YV7m5b*&6G@kvvK2sc}F8pPZmi^Dfu$#aEvyJ`4;Dpy4;nK|Zh#i$IJ1jFGNZd%{yxQudUq zlc(V66B8q|C!aXJmVSBs#N7_>=~1o!)qI0xR6k`jxG za4%G~wzOnpt;D%dwM$zfo`BJ)Q*23yHLy^laV=C$=rW3M0wox1)7fBGXQraAzexkF zc6ML@-;d|a%-kl(DFr&*@}W&S$I%xYjB9w#Fh9|eVl-E1X%sOy`Q`r1gY^sMIESN; z4tu{A>&H3Al!SLdpEYDX-`duRX?>uvdeoI>_DoAnaT}bIT3n2KX!Yj~Huh><3#eP} zT-g}O$iVQN1?^OJP~J+)$W=^Pls~{^{nu}2;v=?k?$_LaDv#_sp02cRg=!Y(ulsqeQH}Q^W8WrjJ{e9~*(iuD!A_pSL`%KTTTTR67shh8vWWqE9e_jR)y zXW2oz?%v?)_;WdSSz+9F&hSaWwo46P%vGFKRy_0A0`0pC>sl=eEG9P|=KR)v>qXUE zb@Q?#<>@N%9jA}lypsF4$NkT*KWNv}=F~T=18v&}O}L@#R{+OHeh%7H{)WVaBni+l zUvvM|I(b|;8+SWBb)oD%fn4x6bG_{zIo+rK{sPo<%6aRA zNu@bCsn`Qa7=CfpI08!&$@IcD$YSUdKI+FWavLxyiY#$p zox^^{@C$m?CZuh;4!q(U{elmWeaVSAIXRhV8M^^mNP#Z#WM2K^0voTxn>Q~WKYskO zQR&qA1H8{Ioi*ItIT8{RmM!PbL|^rtCa^LEXQ7*%oRXNEh-M#Bp=-U{;+Itwt|iC+ z5*7&HF*-jNuhGAM<1zaFG|$_3j4sc|b8(=xb^Gu3UpQx$p4G@)!)0NGu^ zwi|bVq+MmY1Dh(uXgDROrskyPqHXfPK3DkW)vL#^q#f6Yx!u~?_76QbY?-B7G^=#ti_1`&G7zx}K^kQesJgyMFph}r-VPlc`RP@xf zrjH9x5=aMK8HpzZ*)6Sh<18;8HE;R2nt_2~HnyHqaytBOqtes1+|3384G-_e7jAYA z{JnFT=dEQgSd)}Wa$Hv^ac%qcTiP{e;ge;%+rKNhDR753KCk{@+_k)G{<5pa8A0co zUVhkr^3B4-%I)iA_Z9xQ_RzZhy=>i&;wK>|TNL&(CQK~XwXIgU79*&u!ZhJmY{@l? zOWclg3$7fP{ijlX_v5QNcNf1p?ssIPr#hoR>D~Qn0z17uZZCUvoX^WKJEsh1PMJWYFD%%Xp{>>d-G>ET(PEG$VR(R{qnUY*ZPTCTISD4r%B!R@L-c07xq!Yb=vjtPc@q-@ zgFN~v8sKUxC$YE~a`*V!X{Ym+7znt2uVH=dVZ7h0R^1c*95JQ)Ot)sR(c|Wze@E_fZ{4vgwN zYUb8gnkR1W+;5g!{5R%W+GqCpX&cw=E8R1lyK9?C{o`EA)AxU}%X=5xUbbE=@@szV z!>PWZ@!c1bmbDyfoRTTwwoZG-blX;y59Vx}BcP;E1&&kwt1ey zz9%xe$2aZax~V<9`LA|0l}ju?nCRK2Yw{$F{1Y6I3TY>+N{` z?sL!$iI0=kH=M|R>O1d@^YPV(?#C>ebfCKMt||Z7{kr-mRQW$`dpLEH4r5*0^vdhI zG`;TcV~NbDSoxak-p94Ka>NqiN~K?|u4q>O{NdE`T$!*5}q;hRh>V@{MU1T?f<_9(epE#dNSkYGQLrY zb8|BOkl>KOcBsU!u37v%`&_Pzks+Utz4#rzd&j;PJPo~bfBg&EpIdQNKrCh1eW4P$ z<$3!TD!MsZe?Dmctai=5|7g2fs`Bo;<1V#x@Hc;c@4(mm3Ei|{ojWM+F{53r3&|2# z8o;1sdIhD$-QP{O6u@>`7cdnTbj;trx!;>Z&ve;}7&j^F&VLPp57qMxP99xxJi#R4 z+(L|#pR9V?u0%ks#%K_O+uo>|J`HlF!g0_+M#{o$DF+TcIACzcftfF`jxEpPyrh$% zl@o(9v$3paCzrD9}!FP!~DBEVZa8GbL3Y9>m$0J1`PJ8>bs?Fmkj@ zXDGySD_@m0oWLNl@p6N~iSxGit{<3iP+I52*ZUI=&OZq1avZg0(qT%pc6zA*S}_Z% z7q>T-Sc{_ja>5_+01If4W47%;-JNXAh2%Ue63bGB7UonigLX-6b<`C&|MQcCZC{U7DxKK42mQyd;VPIjnVHv|Jy&nHv|l?_*{9j z^rm-l-Pxa}&#!0nUd!m6wq=Q`ZlG{o$f_k*gbw80KE3aM zv`*7oroiOFuSSYbitF|rWM(Z|z0WHq!RT{I!i=W2o0|lEKDv3UvFvm>UE{iiG4P z-X#g{3#VhfKc1bxP3QUoQM-@ZHmiS3T)z5(&~M?`H&;s4r{3dOD^T`a?z7SEl22c5 zXvpnVJ9G8(n!Df3uT1zg=R+HcXK!+ z9&;x+@*PqTaJ_z5vx;f)GR2(ZPMV&oZB2#Of8ReO)@{_hx%Q{=`}3j6-}lTp=hXG? ze8y*{h$MlN%a3MosWu3eZ)sa@cA@*?P0d*s)Y@*cm|t+=S8$y(NAjlD)@Et8vR@4R za{{gJ-?Qjjzg3oTD+}Y+mPf0(&N{R|*%9_m@IrLhpYN-uZargbXLh8_zlQPT6PJyv zRA)U~n)>zI)Dx*6*ih5X;TQHl@RVHmdzrsm@bxnF)zaIgpa(HZqc4?|+;%3IX+oxhlu>r+W#=!FwH{uj~rPXAy$%7NRpxdf`RUHGap$9C22 zc#I|x5N-GZLh*|k{CWb+ax*_EKQ9%n+(a3ebtW({`v=#+?Dt0ucq)F7y?Dm4e_Q|j zje8thw(qzj?$81oje8s$Vl=LCY^w?0Qn)Mj{N(%`wCiPw+il&E+>^}1S=3{`AtB)b z3%Aj~^7Iew+8Y^@((BXf<);hqyluI3CV?GoDnNt%+I~F#1UUwGSMay>@83Hra19;p zIQ8cd){T9oYRTA+=!5fB1f_xqoY8aPA^K&v#@ZXg&>lD<(gusJNgA zbx}UJXDHK9u%nSpW)b+@Oyd^N{tY*_G%JgqxQ6D&hvEW<8uVtQ{CR)o0l)ZU=A`Ej z8WfJ75a4<1WKyn>i@xLM%Zn!;@I+-^S}C6Cgx|k+wzA<|PMuJ_v=Y|o#gf56Mibsm z^pFL*t4|WKdvV7v%W8{Xt~?ts2Q~Msmtcb(-hjhS)GavR07cs|3EshEc*6AF^%D~i z`@^oDzj^qgeo{j$<`Ghi7j4wQqw3gpwlqH< zoL^LFXlj76odSA>gAX&VGaNV=ChXR<+q=b}7@x6523U=q!+_t|_p6w^@fvGnip{k) zEclJZd5{G(5R9+~0`7w>Ac63)rdAX@Pl9b0G`XnK)W9GQBQHv@D)U<~d=x*X-(ye* z?VQ*<=q=JmFC-8A)%3$%h7{v(f3V}7Nr?B5PQ_z1==@jAtOeVu#|}FG6=xT+vijsl zJVxVh+OXrDNnkG*IDvDDHo3H@828P<*6nPpyK&wOeB}AI4BTVoHR({f5Z8m6oWHSS{{$6EXW^!h6E~qD> zdu*p*g8>iAfj_GPd=7Z9{p94`#%;i}HNcK>`^C1fryD~zI=HN>K4-T;>6cq^d!b;X z_l+GrbF~ZBDHX8`l`9qVw!Sv_YyJVPC#1-1X%9Mo3^ZMfQF5jvrl+H=Gk~p55$=eU zxqCOZ`NQhTliQ3VGhZwHLf`qRv`XNBKD1EA80~-vyyMy-FYD_(0{CWb z&%WyYKaqif;Tj_Y0~QbDCZ?x?g0J)ad<<8aZxWrx5V>8-&0-w1&ajch&FiEpMSVQNqUi1 zlCXhQ{d27ynkP;)i3SMI*_&`C`(!tphNpar@qUiO3<3Om;@zEQtIXbYLH?oPLcNb- z$~PR=$pn3RKH<*i1Pyp*d# z-*q^Bru{8&6_0J=9Aqq>2xx{)$K#zi7s~1AhaJj?(R4{kDgvDZhhC*Pu=P2v`?$}o zO(RK%hmU7*Lu2s*S%=UAhYl1laU?p3`#_HsDdZ|D<@w0a?Qo+{;?~R;kG*E0w*wh} zF}33?vQqFaSJ}M-eEbxS=QvumcZ2~TF)k(jK|ISc(!rx-tpr% z_HEptbDtKScG$F?fq@~I5lc~$lA2bWUz(Q!$_t_Wr-hmocwDbP(~c;=_%Jd4v_rE| z=nIY9>Hq%6U+K82*=>AhGLPb~zDH~Og!lq@P57QD+G>W~xcyR(H|)VKlS}&189Q}a zG#0sKOmFjz*sy+1aLA&Ab(6N6z7jes<=gqy=uGm9BMW(=-YW*%n`%x{c)vU@OX4K& z6xLm5`t6#lOHSH83tKAL7HI6(WBmBg4x>EdT^F`kw%u6qDLja+e5HA2d8XOR!~+Mi z^_P3FCi~2{SKrF|18tqjrkN{nSKleA#U({pny=70cJ~gpc9vG06MJ~)FH`6{e|bBl zY!CSE1#FGL+Qz$LYTn?Lgc!x6oC2j|r(DjvytxMXhj3-nfO z+KeyTa3^=LEja7W-4$%rzgls2jkh)x*#|;v0nG9_v$!A??F3gO4;Vo1uLoUl=D^0w zvzUQHg8dd_2&)bc&*g>-kiJfXBCF1cAKEMD8doY$| z=3)8|)Ys{{tqMPzOK)D{ygHnHofaFfYdHHlDVb#$5p^K}G=IVY8peR0%@u2N*yb<6 zLrkvAP87y@+C>T|JTU?ka)t@y;0aJM3z`#w9PE*FWCD{IcmV(W10k6QuO15<9^hM| zi{4g#RCjDP?(_k+6Epl^nT>^g$FCna)5pde#W(&iFfb@%n;J+dP0UHoNd)g-UOFY0 zugQR??f>M0_PGaEm}}f_(GoGX`&acp+QO-AS@Olcwk0>?9{KtdHqo3uTz<7tF*#* zrN_c;e>ZWk)k}8r)P#gQIK!v-&!o4)iJR>uhf;|~>J$DWx9)72IDf_3mHKw_Ov;Q0 zXU}eYaQ3W&j@v#7Q34cTUXkVC7ixZu0G!1qatI zt-h7YA;6ZtBw0)6C7Z@RTUL&o+nERE6-aCrH2L12>~lpBFuJg+rr7f@EZNvGEjFbH7zYQxujSxGo`pT;&#|;3!&Pu`lB^YZ(`0$D;6wx zej!DWZ;fgGrVu}q8`IpkSzd_0AG*t;NJ!29;<`;CtEyinZvLJ8$ujY}`TDnQ;WhmF z@w_%!E4f(NJUMs2v(meFTX#nK-Rnk+mcChLUa(c0Q7Xpo=DNqSF>4QQNw_CC)3Qz3 z;Jc1Fd!E*W4jqZV;kic__fCJ~HvLx2+Xc5j3GLz&h><<`Tt1t{h(G7|CRX;smRH+? zWAAImx?4Z_O0>Xb+Mh39Xd zi&OG^;murHzQ0#8_}dBl(5vCe6{qB0@tq2KyHHFy_57c6{9oI%LgOaYoSgIbO4^Za z3HH?=<&?d@t>9gybu6rIv+nw-3JTl}SDPl!*_^)O3;TjUYi)JYuREPg&j`K!QTQWE z<{#-+I5EMji2NWAMJq9YSlTRdYhI^PLNAqYm#XFkMYHJmLokY)%Sdi z+Gd#eiZeR)7@KdpT>R|IYoE>Alzky?@m{gGnbx6`L_KG|G_qiu;>(%q9kJoix-0u- z#b+&i`0TEf`O`PPf6w-AVOQ`sw^G@myC9BR)uPh$A(Odl`R)GJsSj7I+a7ao{^3mp zr*CXu7PtJLP>YI2fOe^9u8nW)lC`}}hg@%!yxPbc$C|}|&gKWR{_BO7yVr%Ls@C5) zGF$IP_rCC09^IS!LnH4^5Dm~e<pyAr@L0 zE%Kr#r6IE~iZQM)#8mW6;8v!`*Q;WEChk~o;UH>#Lga?n`g>*KYfW_9R_OAmKaEm8 ztLAuL*@QE4)0>x%BTvQgtdIV}vBjb01<&5C>$PIpYX!`b_rLna!<+e4KQ@2C;qKp? z#r&FrCGLvYJ)RtJn4e$BG;`vNNk46NUMrQqUwN!Od&R6hRnKBeBe>5Ous7@rs|>MP zXUH*6)R%qFR!5`H=Uypl$tu21+9AG`dtIf`k`~5858B`TN>uO3IuZCRc+1>x+xH*Z z|9|QJYrmfxPcNzXnHx9jJoD-8GxPgqE_m|R@#^o>C2P`_{kQ)jdi#<6M_pUx_}suJ z-;CyNUe5MvzEpP!&+{3%*`4RE_9Qee@BFS?bofN~^GSCTr@Z@p@t(s{uliqCgoC+0 zMStuIa(|I@sO}K^6vHVzJ6~Pt6kBQj(l|ktr8)gd^`VQOH7}U$wX`iW>|QH*^gxoF z@I0x7OIyVabIP|e31yy)x%Zj?*8M(xY>& z4u_gAS<-rd>-LwsH+`M9?K^(<|0VuI$DT1w*u6OWu4JrWz#r~=OOUw&$Q*&xfA9tF}FV8o(Npr6!bqaj(Ya#j9uPFM9IvuA4~C z9g$Q1H%k_8-8=ipoQOsCm+Ku)*D%C>m{}sab;^x|fNYLqs-e#_S5FApkgHQQy(;X+ zC#@|WwU@(dJC&l}t_#|>Y*JmD|4F-)x9@sPl!az}f8ArWo%fEUOjXzAs{K($S&>?~ zQm<;lw9A(FHe6rWw|bh^hjF}(4_Rlefv z>&36LB;_C6mYV$TUY6Bq_Ah}~Z!MTq)ZP79jh%I=3`dc|9!Eb0o&)@kyQ9O7JQUff z%g-C7BJn*`|I61q=M$%RWLTz_vpukyQf=4r({Q4259j2?r}r0ZX1}Byzayx8GtS;A)GhdZ}FM@5}%jpwuM^?uei^|Vvt*2jIv zf}+F%-Hw*p?VQ1*ar&vmW8dI9-klo$vF5*Sxrv`#zVEl>;uZcqo8xsSY!^1@XS~1l zS@(~Y13PV4nZI}CmfZb&Gu+o^OWMWOH8<|ud*S-~&Yb6OMBCFZ8I}FCP)QO#aGF7| zIpKPQOTO0uvErCj#gdO?O8E*aPai!0C%r|frYP#k(IakmW!HzS+~K-Gs&$u;`Fy2R z{^}m-8ya!1_Le#}UCjJ@{D$g;uSaqmmzcyyKvp#=Eib%wGhbYM8Sk zD2cyy^8R&k3tHT67Y2$wH!EDmIzO>LNq9!fGW9Ld6Y8>U_n$9$qa-&s_KT4Joc?!T zLMDINu%krRKYEk+o4SDPCH5TpN#!xWzUv>j@_U=5_VojA51;+;gtao}@yYWHtN$_H zedhZ8kX`G^#0<;2)NZ@I?Kj-!3EZA@>GZJ=8^Ug6^*hD9*w)2zIrOT=Vi$|$9?phK zj$Zk$xkBF0a>0VU`Sm;J#GaX1yJXXU@jA0_%OiN4_nDVm*>&Ys-M&vTyP2o|+WuVC zsqLBQD(=!14=z@{?K>BFVpnTI*{Y*+=ktVqaH{(pm$ma?_>srLE{(07(@(^D8%*i{ zzrg(n=kL&`3GaS?`rFREDP_`z|1Y${XB_X9k+{71Ov1y<&l|5SGA{dj&^m7o&z-_J ziC&rF3y;FWZMJjl-E(d3#ng}wlRB#p2Q|&h`p$RihVROszk>_e@7Q*I>b_c*mHDsm zKWZa(`FJB>!&eML+-x)2wvt4aR@iV`}KQ?ccO_&svese3+ zoV-iL=Qls|2~3xIzjt-PzLJG=mmH4f+Lo1PtaGj4fCSTHp(u}~p1Tsh-!X~LkBMaW zo&LsuO4s!K75xI-FS{b;e=TyWx^hJ&^VqwoOE?c7EB&)%!jd_O%Fpgidg$!>_mMqn zOD|pa_?s>U28P$rsdtnGL#b(LC8-r9pdNi}-$AZJ1_CbcxqtIBp7%2I%&z8n>&C36 zoB8VM|Nq>#T{c*4fB3O2aIvWWE{_&t#SYsyGW-Iu{!#s~w|%}FE!E%uN!YwzImILQTW84C+zsacE}O6W{p;yL8~N)~O?EkF z?7nnu#~MYMd%0z|6%_WMjV@}WPv(YQosKa&l$w*8T!Q7yIti%*U+Ui@CL?2OW9B+H z*>qezCZ-*^`6Zdy4q-=3o`E_<0gNrsAt@fs1jl3ld3gTu ztgAaG*HSXt-ehWCat4+q_n_Y7fu#)a-Xz#~oW05Fpzyu0SxAhr zQ?Lzrm{T9f-8^5=`GN&Zkdr=pc_f1lK+hM9`8&r}=C2aljaH14KJPU(&%)V-1zSpR zx-J%EI>G6>nB`gfVxdun#djr%dFeT*n9N8rOl( z&RlE}(LejSXpqs5Y~)ZLCM~0j4884jinS36nnBpEy6Epc6de z9AL$3p+#2{n zh@hK9+d(&p{@OM1S%V2X+a43o#}xua@jOXblP;Y>U^x_G8^;hu40MtcHe* zf=m&TGhV)Si$X8&YMMAhz-Q^>w6P=!HA0d$AP(`wJnkp8tU?lQ%6sx9a=t zUndiz<<4KPj@)|l#;uLJZEsDsz1_X{pWu!MP274=!b^MYmP=3~H^W)_)`d2+Eem;b zGn{YN-}=Og+5$P6#<>@q&#~?AOUuVU#qtw;9S^QWQ}ug3Jz31az+ldZWx;t`eqIT9 z*w6L6H)!IH?Ln#K(K!b`NXW(-`2`Bev8}qj^S^G&k|VNz|Jn0iojup?m5S>r)msV+ z5_DfM2tC@iKgU6d<+=CLzyG$ldc5#uU{z>knjceU893i`NqNl1E#?RIa9l3(zt>jP zAY%NyO5_|*+JUDH_YdtW%#7cp81{mDolRC>et@QW%-_Y&y~UsZTaCF)%P<8_-P4FUn0U$;<~e+Kz@C^pi2<*?T@b z;?-8i$wy9}lbOD0X{cbxhNd$sZ*}FiYTe*^+q!@K-#3wAP1Rew?puYuNk8v>>E@)o z$Da3FZP_nw>i?_WOWw$1yOQ~&3dt$p4%{@u$b@7I@qS?BJ*+cx*T{5RRH z9>GhdWq4gN@|`Jl`N$P6-`1$5D}$mhY*}D-!6ZOBQ|f7m{_!eDTfOItRVG|rv}D57 zMJf}oE?P42>LQg%R~Idrbaj!+{bAWs5GFWSFQQlbj=CdMa{pjA>L=uh_MW$c!y+y%xh%h zOHJh#l`(xbKR|88Y^H;P2MtSqmQ)>nl>2vk>;1Jq@>G9j^nBquc+q9aIfIh>>(^gf z?VlaKuuk%E;uNE0dE2)88`t;Vn|Y(Bm*L9uQs2#Cd?#ae1}r+U+PqW{xr83kVl|!(gsFHE35{T%Ggfs>4%+qFOiwr=QL7 zaJyZ(*l@F=^OrQ{WRA4vSl-PGH^c`1{;eZae!M&+^-_wmxmk@pId{pVrs@&52%8ZEQTNH1emynN#kkLY^y} zJ>`CDO^u3QZdTZG)2``x4ovk=jD!kS-aUH#wCLad?Z4$w)A`I7%%ZRc6UGq~X~n6j z7)v`7k|bsxxPI~OWlM`A{T@$yOiFq7GIBFFOAGAUweu+Zj2T8t8dxR&TQl!{DfZ^o zD{FcguP(;%-@-b* zj|bPC`&XxT(1Ejf-GmDY_9~35#mstWOUTSlB}~Ox#HJ?};XBxSw>9KsZyXn%t$NZl z5!{VnVqm~nR*;@ph1#SAEx${HH4_Tc9N1$dlnyh?BryE8Jad&ja!X_5{Knae7Az`{ zlUtUxPR#3DjM6r$*%)JYYwJvoeVhyoZDLsFpwm-x3yQKzazJwvp)>C0-S!Y_eg9kY z7pK^pynjs13?i-*WhO3~wq#93p4cW`_Je7Y4t#uf?(zGTud*f=3(t3+_G|mE)oHu_ zu8}`uuasJ1>H9b|^8faKYvzQv*9B~x{`T-Nh!?+%MxzPe1Rz3`T%wDJ-u|58(}*&TKzrCM)Y)8n`b%f? ztJXZ>mS28+{rT@#+3!!!|Nj21|7X*M+Ur|R`yHJ)Pn;+G=#2FE>*=D=e{Zj^zrRtz zeqVji#=|ww9@bdOgve~R``4G+DSRz?e|RBRq~Gzn>#Hq<@Ahb&bDgiRrRP#U)l2E( z=S4!ob=4uAqOn`G3KuPpQZ39V4&p40o-VLbJYu@a?}+K~_V3Ntq)%#J;p8Hf81#Po z_IUgI`}W{)x@A7R4Tk93v z>oaHi%N3V$VqZmr?7Vd1gHQ}o($sU9sEw;o&VP{G%$ zoO=Exj=T^Y485-Zx9M{d#xVZoCpO62he!An5Y4Cl2UES}GMa$C{1YCVv{@3H} z1&wD}b0*AFTU2|m{IFbZlV@o2VScFt5;KH6W_d|`ShUhVGmHiVsK5O6 zZ|b`QAqfNK^$9^$#Z?m8T&EMh-DM8rWn<1b-IsKsx_gV8pVWk`y!EP9EoOFy9Bv6X z9cz^^+Q`3Yf+vU43PvDBKNj#b^g9Vi3OAj&@bFge6I zvsU&(n*8sgMK*~Q6B)1YT<+#sktPwJ(qMY{kCJil%ff|>C5Kp)omU>_P-fmDc}&8* z_bu~@KOZfUw@;2a!`V5nqUK#y)#R!=Gi7Q13!hti)ic63e&m=dZZ>b>Zspl6zE?MW z{4y`gOz!^KBWlzAGFdVe=T17Q^m0n?M8BI6FQ@cQ_PcrHlICm|tJKL}%X9v4u+1xb z=5FxIymimQjZY`;Nfa(iR1hv>d}COtq5MbfieTO3mZx(QgZvjKx8G%Z!y;!fYe8(Q zbtmJ?s8ywH2FFDf$g)4Tk!O3t|2CYsFJ=q040>M*Hf)kl5~h=|`Do)O|hA=eJcQl@m1md3o<$EESC|Z}Zt}Gx1!_ zebtvSzjL=Jh--H-?5YrsoNX%gV3Ad0UDB;1m+L;=Ho%yBEapMt9p6o?Wn3nyK$ULAKyX3Us zWo5UAUcNI~oN9Sw8*W`*a*_K(3+sck40DbhuE|?z8B_Oc*Rk^lmVOWju{v)e;Bi{} z-32khmqnlalV|GL9$U!bYkg)yg2}eWGiM!OS?|DP#nz$mapTkl7ed|@em-Dpr_{N$ z^~m=VI?EXtel6Btc`EwBa>?HxY_1)yk$YJoQ1e5RPvOR6)1&FypLH)7pPA0sdZx*4 zsmF)qt6uLrmdI4Qs@X&3eCU$Hzx4m^cQax9aAu)p!}BWH-^?Mel(l@;EV%PA((%s9 zpK^(u*1Q57Y8DCZZLd14u76tCwyEml>emf(wC$QF$nqW7x$W+ictzpZ|DS{8G{xdo zlkX--bpL z9bNlgk9Bhy&Ele7q%6MNd(O=2{)?om4(C>#b-UeLCM_F$&L~`VMe)9Kr&+ssUu`kI zA1$+>_-194_4M`WryH%`mM&>!Ep2*KsTSzM*l@0NPm|^ZKG&?7yXH3bxh}4DSUx3s zJ#*=V1KyoqSxTO)uvAFjKYK@$g+aQNso~lrrOx6bw;C-PS@bqC-s+nW{Py%h71{Os zeVTgy9rBE>KYguj)xmSEhYsrTZEcPfI>o-*Bt)PrQbXy@Cj*r-R}IxSd9ymit11== zZ@raXqmuWA+iqFm%FHA8SPhfn8>czP^W9UrZhQTRRO0LiZ|hzw&1)x*bstSX^P<}< zddXv-+uCNLMIC4NY)xv__RD#gtMlzyuF|)Yw?p1+-ahk&xZ;ExyEk~gS?zE#`j`IH zee+TcU+joo7P&0lSyIS*XGCdtPXE&Wqpu~@`VWWmN_Y3pH5cnyX=Zl)N5BNrZH;PII-#B7ys*pmMqni zZ>fLNjCpv&_VwR7p2|0I|DI{|eoU0JIvVo4@Kz=J27y^eB=#O_)V=X1YhqYZy|P&I z>_@w79C+fbk1jQObL_Uy`)fYz**1+w#7xv5c)mG1oxkSurdpxwy|v%2s_&^4)Xq0N zeQ$Gz?xgYv-Ge#zB0e+fZPSpj*i*W}V$BrIO|4(PUSIFPc=rXLD%*7FD+fF`v{;A! zm2}|deHv7K^wA2v$4j%0-uss~zvQYU({iTZOWh zZ0mA8TM<#t^4(nT-lGE6ij3VK_{#bEzG(N&p0mB~=u5Nhnd;)|`mEm1Hg7KqX|5Hz z)KM$O*I6t0p(gA<(m4^zjFxt8|5EQ|vobI&;KI_8PfyJ)O47^B%j})%o4?pYpzZyi zu4&&UO|*$*F0&Ik%V=HJlyY2b!b!KqmRlC)e&@TeVz=z^|8@8E6i#NTUwS4~v2s=2 zs$HvU4!?7m>T@Gp?0R&hcXiU{D)sDxX;&9M3Cn!n<{Mgksc8H5H#xsrSq~?k*tGYB z&Go3ix<#+=9x%A=eOPL3*{pD${%BnmyCnQ+V4--Mx2gZ64i-%81+aH8J?q9NiSXEaeAh3%6Z96DN{W ztkk|!*~6O2EWG3N+K{ij!b0~=s|9a8n9Is>LH3fXjKR{IlH2*Bjjvj4*H5rDyz=z! z=RezL?pKd6hz!25H*3OKImU_i1E;Cp<|s2rs@7odV2J)ElKy@5@g7(H^KUf0CcRLs z-q*PHu6B*6{-R!$)yt-E^vp3?UznQJ&2T!>Xm7i_NvC+>w>K}I7k)GF4mOKd)k%7- zaq`j2$4Xu|ei=rtzjV_wd1XPsx|;ddr{xN+4$??a)S13Cv$*b9snmq2thYalH)fx0 ztzi^Tx3qfp|8C^USF))bx4#SBGuWBBbrW;h6(QfGtM&Q9_uhZEbol@5IkVZf#3Qfc zRlDXz%}_oPlP6dgr?r$lXHie-v(p{C%=hK%z8+p^pU|KAWYQ;r5_PS;mdAAxG|KiI zdbr%J#N~^yS_c!?zO}{ zt7xg8wf2I>=~j2w)|P!bF;_1h_dRLo?KL&b?AYmB?dSBP*NT0<>ilixe9N3QTb3H! z3)<^(ai{9$jEz3b&!?J|9GtsXI%eba(u;j{)nZ`>wATsBHa>jKsAlv3Dr3sWTdt?< zA{H}xo9{h&SLN5G-9DbbkNvw*R{!>=jO#6qYLUEMcE=7xCAo<;Z99KF`FvdS_66SS z3V(KZ-8{l?c>9!4==D{LWJJW4uetbZ-P9iT=9Pz*-95<^Ig;CvYrd=aUs(r6)DNp=l z5nlS=?ss-?>y{Z4nIq4Ic3#c<#i9AEzA@F4uisa>yB2|%!Qvh49YicuM`Jag65gM`QzGtl3 z;rD${!0~S{Jh=bGO8Gc_ocntFtrF|!)52@i)mGVUY4=$YJ?ZQ}k=ZU=7@sYzm^wSi zMl)6{@1N$YgR4Rc=DsgXQp^%s&Yr!Yw$=JlfK%>;(pgKz>~lU(dcP|sAgF}lZd7^K z>eaR?X=F>#UznnzGtafY17A*OY7x+w)sr|9&XobwQZV^OIuh-Y1h; zUTs+Zjd@ao?6(_r9zr_~&$}%@k>$e%_V3448g1U3%xr2_yl`0V?tT@{H;d=p-LJ&? zVe$4Pp}qXS0{!I$5Y)x!vz_m-o$eS1z+7QFkCb5GCJG zcjt1u3xcxw^bc(kcKx*jOYbu4dGdgEbmX3M>MhI$W@q`2_Q;6rUj3BmzP0jF%^M%jc-1|f zeu8V)JzjI`%~L*~kjgvf7iD?>x93h1k%_!Ko942=zNIU!EjZ2h^*$3#W&H(HuWRWF zUO&NAA|JHHu^ zIGMirzyymE(kI!4q$`_eIV!2We>-V{#VPHX`YO9VU0TK0X<-zvsubwK{VZIdo@;l6 zO5A?b!7JXU#(Fp>0Mhewz=w{Yj3U8qD?hM=p?Q;noU5~d$%J*S6JPa7crf(b$aIi+ z@?7qHcEX7Vykbv&<)3(P{=u8a@~PQXPF_62=znhwsv|RGz2{>@bz=ly>z}l*Mm&MN?)(?Z4)ed?k zt6!7{AK%yDsVAn+_Mfqs&lY_X#dp8VA6}sOBy5{R(u*_lOHrqN!ImH3XW=-(?|Q*u zmzduw>m&t6cIIZj#eB&g6O#8dvNAh!MNIf;&)jSu!>KH=o4xu+ds|CF2LGbz)|o75 z!(V*2jyS$yWMB~H!Zu`7nweCRm<(RzFn3zCKa-(A>;3QHZ#Hut%e%eTW>JEZQ`4pu z=eehNA8B>?_&t03l;AsIK^28T*7wg?8k?x>&HLl`PJR(zXHpHvAr?i~69Rs2iyx+Z zSahgxzs&dfi-Wqdl*4^bF>hjA+7RRrIq})@g31{GRMW{9Q?`oTe_gdw%JX7yn}K^o z#ELT^){Ez@YBu>4Fn@vFan0?!ygrA8uYc;7W9G~HVz&YBKb1SLy5bfrb8pVl+C8`I z^tZ*cLb7c%-hW-yJ4@#K*Oxq&hDAwCcUgAT=bBG7Jec)4^WWPyT)&cD1jkAWpIfoL zS;FJvRT0-{mfXS(JKly~o40`J*R>lRAQ7ar{ z!-HOgO>oh@9oTp~?&CG1FGrlNe13K&d3Uhc!&b>dl2@nhum6%Jn0D8NV|~Zd&{?yJ zbq=?$D7!uD$L>!$%;whC50f(Un<3=TB<%oWj3uc0BW^JrlJUj;# z|JAMYoA*xP{jF(XJ~Z^Nm(&bD)%n`$P+oMJkXrciEZnJ^Xo6atn2 zQ+;JnZezmYmyE=sT#UhM3+Ui=wFTSHDuMN_6T|W(InbvNbEALCfJb_<9bgJFHa`!` zo_xeA81N;Simb5pB8@r%34hKXcyRu~tLJYXz7WTH0q!f8-ReS&3=Er?u;ko~#FEsa z#ANUgdFrLuqGkmF_7C4}UG*mLX*YfFXj$eXV7y>vX8fN2x>-~CeQOJ5?EiCvHD}AN zJs+A6h(7%E|6`Vcx550^7hdgmn0;gUg7EXXEPF3KOFd+9JoVeH6{SkKF0-dOC|xsO zs>1Gb=&qLi(O}hEB}UwC+Z~d)EDqJ~v3&hFk|T)aw(I03HzSb;Z~D2aBzx?YbXMFJ zT&rs!;as1WV_X^gB*i?}lq1m6bVccF#V}>>Vwvv^p_d(MB+}KMo|>3jTBO~P>AXjZ z>tp6G%{|g#ua^8Rx!Q5{MsobgC#ixz^IS}IeG*IF{jGAD*JSfmZS_L~eskez>u=if zr7N78`e`kn>XKP}`_iATpKN670(2s2L&5ULrBv!Hx;HJ0W+%fE6lQqm&6xmo=ZUUozl~b+^j4*_caJUTrSdapgtXYGEFm*a@PTQ3fpqHOt4*q)@w2xvFfoZ z0A+?_|Cyi2>_Xqmz2$4KCC-z*AyyQlWkWn3TBpFkk*L7xWAv{)?Ss6=^9vX!1TJn% zegHmw18Y3xmE|X6R2~)+ZYa5|kmmxGDSr?BnQM#d#`o!Uw*PRa0g%~*(*VcOz|4Z2#Pm|M$^aB*Snu6Uf#16;F2MG4=W%uk3DA0lpZ~3me;8M={jk{8 z?$+R{kmIf)d*p${6Rwc_BM;0bv6t>5P?x*qAGS;Um{SYA?^`}Sqy)z@^CRD-63zFQx1@xbPk)yA`b#@RP^FIsh> zcjw-V*YjU>?|PVTyx8{!%YF^xx99Q#%lmI$Q)b+1l=$i4v^%#dh2OSBgyx;v-ZBLxChAI)!` ze_3BAjVVjCZKt+3NNy|Ny`4|o938g(KDg^y=IoaXPcmp7Z#>0(?YG&QGzT_7Q|W_$sbv&te#RG_1@0pWZFf636Ed#ZF}7% zJMsNVpWsd(mo6P8_icI0ri6>ITv=6`R&cYgsiEji!!IF6hjr_}*JNm}D))AnyKAqPu`}AU9+$x1_ zv7N84^lg=YwrR)bb&3nZ=FXiUAjWd#Ro=6pIsAewQ}VtnKHD2q*zL!1X4|=Mx6E12 zeEXhrfBMXZsJEZ@-TJb(*ld2@z1iibx>+mV@0Gi|`OuQ^SB3%;j1N7uo-N##eDz~Q z>C@T$lg`x@Xuj*1^meb4=mrG^@q>kh-6h+;SvHnLo=Q?(5XRT6RMzEu`9%5h$LA&& zz6eiWn$Fj~e3?$)imPwTcRxGY9m&L4xo4`Nit$-a$k6uhnh*G`mA&y25s&^VfrJd`~>LP9gl=x1tjv%e32fN$jpZ zFtPH;H_de&HR2VI)s=iick6HV?!V_>U7yGvpZF@iC2aN;iR=2mUr+h` zD&X1kpOw>=`%U+<+N-(ur186=()4eY)pl*-zPE2&dvji~vhcP|^me=R&7X5W*FF_I z`TOsmKVRD$Y-Z2B=@m5X{`~rSfq>QZsO??8w6o93nHU(J8Dr@sse5e|CQ1&aC?znWjvCvoG|l?{XccA97FrazwV*8h=;td3Kquuo5 zO~H=ivz2!IXje3AY~FJF`>i?&n|m^vR(`4S!G|8{Iv!u?=lmpW)y@k6J02Al1k`9& zJbKXmuhb$**h0eP1)t18J|&4{O_9cmmga-Aomv(*3LL!C7NPT>Sx>NgvEXbq`=1Q_ zes$mEEZ#kqNloR@O9@>o`_iM~tcB6?05xXo3jHHK2aesnAXamr@+eP?cXGwul6BMT z?Jo``ZPds)G*gegLDXEasWN*VtLe80jppJ&anO>DDz(sR8GcD)qgseF`dQ@-t) z@*h=I3s1SnTzKV}H=cBL~}}TcY1Q4>eS=$qs%bEqXrcL%G&GiyMWf z6XhSuhu9Prtar3-oxAK|XEXQhE$w@z-u$_1M8C6*6nQc&U-K`dg_K5|C3$05(XLyV%6i}Z>^lGk+|7wYcR zK6k~z`lDP#|BN8Lr$3eDV^H1LvpXqHlaYbpEw*L4*_kCdnZ@8Sw9<=bAwBWU=YH_b zDSpB5@U*gFiBtCsM$?zGzkEF1lzHgJyF_=1zaP_=ruT+@YTNzo!d4C~AM^F@&D)AD zpJg$*wcB!WcVT$Tmy=f3(ZUx^ecqRCIL05(pxqxCg>3TmM?Et$4*lwu{rB># zu+A*Cr-~eYzayNyHi*7gE%6C{zcXR|{lHI35Ax@9KWr<}-DBtTZ|WkKZwecgK6)*x z_t5e_zNL8E>aXX0LJTKbshM~$n$%a_`9SC3!ORlzx6j*Mrz$91R66OERNX12nd*LR zr|PYfw=MF6j5wxtH80WXe6Jd&!Z;~@`T6H>`(}Jl;+*iyOQ_mYl(TNKx$_LSx9y8m zn>Xs5RPl`QEK*-;n5voTUVOo>?{sp2!bcs=2_C8|=en4`M4I6Q9mjU|_1o(>+bcPs zjx=gJ9C`WshLi&g3YKX;4;A^P8Z0ah9KU>5`ADaS?i!O4zPrfHZ_pVoZ0?S!ur51B zUkhSU9-3812jFigNpfKK39z~2z%1~)Vpny`k5+-zty9a^Ewo2(g#4HLxe?Yl#%@t@ zNj_?S2GlYl+&un>ZHT#LUS~C|bBxgx&&f~8EJj;x59%GWaIBI5_m1a;lpk?m;$v%z zcaRWzB9WhU@&N4AivC4sj^96OY@v~&5aSVy?n#M#t-GHxFfh1b%N3xLp^B3;Kr69* zFM1cXDhRM%*txoZ+4G_<2T!Gk&?k}LA2ZXWBkL|)uaSsdVaFO?X!Mu!{hI3Lb@^ci z-M@R^DIYzVJ8hAv{ghwJ?|;tu{<5h%?OU`J(^0m+R@akcGF-A%H8m4BS&1Sef>2c^|VOUhR#! ztEp4#CWkcw++RM|y?t}!88;@nqHe_4qRuHsmSmB(%w9)6G$BQBhC zD6{1=k81XU9IH$3Z!G4#U35oPUxTZKZPha6gJ@N7%%Z#ruoR6E|GA0jnaR1Cs0Z05 zf#M(9sRtcc@_<2ro&AT^uHRK`$}ZBN%f<>b6PN5={Q`Z&Q}@f3bD%Cf=#(yuHn?wM zc4}H?PO4sF?r9zWlltDeTBm$Gd&>)X3PU!8UbtlJ<;gP1b0@2Vk+Ht8hg$lSrW=|^ z6+S*mTIbWUZOR#?1!|(bcm9Yd1P9Bjt>X__eEzAFpwJVE_m3oHoR*wKn`&6z_UaJM zb2f7mb25wZZxsY@sskUMBJo7(eRj%;2~1+Cpq@P5Vba6)m(Rh18YA)NrsZZ9;|^%k zR0+ce3^uPxuR9mN;6Mw_dZQXvoa>e${=)1bLdUWp9&*REHRSHu z3CD074Nji8js9h|tJ(_Z#I8K5T>5xuD1ZrACy~){sI8n(%-Bs$yfWZiB|h z;mR)XaMt zAKU{UzkdJf@uL?V3#a$$=`E2(PYXKYj;4S9Fff>9Ffw3dy4-@q93xXRy`EEi2-}-z1 zE1sIGl7CiNe+e!Bv0BdHQ)vB{)&FjUH*Z|uCLG`v9N)Wq->fq=#&iFs+5JD8^lB2v!osUj$Kc&xqHC{ezpWT((>J|ULUHI{K z;mh03r@yyfd(WSHU;fs9`;waa7k~a;_`2fvZ~g_(1K%&+_ul^3{{Ip`{w06--M{d? zecS&36167(w68o_yfVJt=l{3lXBXcr-g&?N%>RGM4=+A?Z$GW>|HePZ`={F1t@-yc z`E9@a>-s-8emp+@Z1GzAx*YpkKOY}|w|KAn?|wcxSv#w$l20$bT)esXv%9#x?VlZg z?#KLfzy6=+ME!})*C#Che{u8tgoX1CJML|0-{a7*$E9Tt(*y;B6BDj$1Z-F#5Mjb0 zW5puJ+|y_W6dasT zv|sIMrSGxdvwHZa&5@rL!!XTBpkc8{(_)df#X^njD_kG0JSvcJL@-lT;N_ADFP2V} zObL{D8Zc8NV5aEBh$$B%Lk(_(7~Z&QU}>_!!epc6)(tzi6z(W3*jf6q;>(AMuOEN% zeE7-B$1t;f+dCy(TwIFfr(g~7VW^T5A}%sWLyTBj(t znmlk(eCwn6*hllVlj>_P)#q-y@BMV&J1&0Ux%h?a;upTFS$;xXNI16~|;Zjm>Ei-C-81%UEXnsm%5h*_~&yJI z%BD}@yFP_)`xd|NTlD(BU_o)nEuIV!7aRKA_fh&dYJbhRSsYDLjm7q7D^QFlcq1lrHNX)yP$1@jZL zv(HS=KihsrbjumhZRfgVeuj79DMG1#2k!py66&gGQ{hqkJrtZsH0A9SDoC>28EsV^1B=5ci1iN za+u>~zrfpZp0^z%uY0;)kMzACdiQ|u-MVCV?3UrVW19EQSzbJ+dhwv? z&5NctPwHMhX?yjk^4X)xcdr^BK5KmVuJ+}_)~7GCpZNCe^v92tG7e5yF<6Xt6Es}znaxXCAF1GW;>1amKxb@)v{Y_Ww_YNaI>1_ zZZpf}W~S@ybobjW-e9|)bym{{6&2oc`u640xsnN$>6Lg(yxb?_8y*kcJb7; zkGH;^{B`c-vv)V2-Mjhi-_LWKyYC+E-n;np-^bbyK0NvL;mfZVZ+`uF^X$o=XI~z@ zy{TGIU07OO`1jo_wjH~7vfjJDue!dv{6Aksef{@;hkyUJzgz!L- z1NPOuA9%z*TFP81u6QEOp>e?5CFFsq&@Jth5(x&@$EI3rI$CNnQerYzVm54iOlo{e zVsb)ec3gUjT5^I`ikxhMnqr!)W|FFUs-|+Hyo|iEin`2(w!)ms#+t_3lHAg)((J0% z>Za=EyypC}`tr8&_KOz?OrBuSy+UL542$+9D$BQ+^smwBpCdEB$!7neriM+67IaOT zuxitWRhv3?b#?4owW4j-jAgTSOxv|%+pZ;j%a*KLwq@V6p2lr+Ca&AFao(bpjgxjR z>{>c;)zpo%wyxaOyK>pwoy+#_+}7N>ZSm5+$y3*Do;t6)ci-yX#@%Zd?w&hw`QDAw zn^*QPp1FQ<>;CT4hSjALcKdGFo!ikKyJC6mjOorhwkNYZcr5brwam-cLQkIyy?rkA zn19D{wjIY=tB$c(s+@sGf|Z;Te{u%0dR}bxG<4P6cy#5*r7t^EB~OapTsd{8q$z9UR@a@pODlVyw(3rG zT^qXe?bcM;ucCK-r`n!1t?^n zTYWkE@^ts~=f|ImFP|Qs9)4Z?y7_eT{Pp+m#qF>C{_We{+vVlk%irI>yLW%HUi2NkUljBI)<5kE9(I!|RDQk}SgO!*NkB!CW6~Spl%47tpZo(w=P%N-bq%g- zTlR@3_N`^xuVSCG&u2vGZzzdNc)jn)#rn?d4_xP8i03^!d6=*oGt5HZ0jz zkWyCggs(uP@57XH0U_%?Tv_+QB=3XCyANCB7?|d&GwoGpY8Gc|HfLJQuQXX-X|udg zx4lrdf>E>pmpg}+yM|V{g;Y3;Rk@0lzX)5tiCR97TD*=}yo_1B%{B+7z67Op2}1J% zjOGP!HF{_@dPq%-V4E1B*6CulGKFtuh}_N+yH+2@r8$aAV+5zx7;bgq-0Gy+ndbxeoQtQo1J1Zr&HY)6`RoPuOzP)aKf7SGw)8r0|$t@1E zdu-Nle@X0tEwLBYIA2&3d}ELIjYZy9Hc1O?e>ZW%yQ!PrPTuxIRJrfH4<2{F_}u>FcmLbT8{baf`FQ>o=b3xFr*3ke zyvu*~Hov|_hlWLmmQ|0QU6;14pN6$xRq?E#!dYRZ)8cBUMOM!Xt)3WMKQX#~;`M@= z_bVbVltkVriM&!1dZ#G#QdQ`!ve0XFvG?j?FIL9htc<-|8+^Gq_{1 z?312bZEp8JujXN1(#O1_k9k>~Syeyt*di+Jx!3HQ&wTCPdFI#e#joAh&%2|acTYdx zaqYW1>)+m4|Nd_No4fgPck*RxZrJ_VQ2QnE`H#czKDO_j%wN4+{@ZywnK`uOioNqObwF_lM<7Xkdly*kWo=kkyepbmRFWlRuo%Qm0FdX zm|L1zT3DHwnV%V-UKyX9pI)3_o?V_?U7j3coSkEwonl>GVjW|kqhp|>Vqsz;r=Xyw zVPIyVVWcOgrKTsVWTtDRWNM|QD66HZDr;$~E3c@kZ>XxSX=-k%s4Q=&gMYBEzjthW z^kE10%O2sUJ^XLG#2>%naQ%+Q{X;hnoH}yi)|DH_&K$XR=gPT5XYL(3bMO*V!In)W zn>H0~V_OrOlM|Dhb2sNL1HUype>J;4yL!HRdVG4gz4&&9@O}pKeueV&3jFH@{N)v{ zoHjpmTmQ~+`#b6ihs+Hw=^LD~*RWEsP%}_5(=f5K&{0&e(bO@rw9zs(Qq$EkQ&!V6 zHnX$VQ&hJz)K}EhH{7Y9xzxaNsfOxS3)8JCx@%2r_u42w_DxH3EelI6D=W?O^Nq`k zb*!sRbWAP`4E8K6&h+$-%*?Kgd_DWqwl4FxqM~o7PL&OvI`?Ym+^bh(O-*A>x8B`a zdbhOH_ABpR-rm|?-@m?Rn|0SZugyK2`&Rj_>|)uu$#Y{L$KHJ$YdiVw-UA{2_e=8c z`{e)kxql$%|AUzS5B?mu@aMsYLl;gw`tah?i5s6@{5bXF$*UhvZap#CU}w77&~~?> z@pjHL=km{<%|EN3b5=i3pTXO@`?R(9Y3tM4yR}zWugSH#g(PS zrGLLkU1^wod-nDN$&x$v?q;3(;BIpDmvOQ}wgP?WmL5Ql+$~LSj>c%(fPleKnsWH8o~dsLidbd#p^Ec9k|&eLck1 zyQuB#Bek`YmgO2fliegXmn-aU*EQQyW_wR<+qA7l8a#Ww? zs6Wk9f1bPi$$N&Ctk#*VyI;2Me(Abf@@VzUqt!Q6t1XxQu6+9YXFea7Hh=eOzSCKK z_pZo>n#qKl&%0ta|JwFBX4~ePZk@liY|i%5dF3VXC0}E{e2M+`EuN1jj+ZZ%w?C%8 zFV4T`zK`FXGd}z0&aK>SP``Ue!R|d@@=|}^y>)8$*Q>jGzwSQ!b@$rd-D}V8e!KR& z_3iiNOlvzL~C7o7Fxz5TuW%=7JP8h+`2`+w!jq5mBmyvzz-r#0M8Yxo^kaXhbc@_^FO z14?I)XdOPHb^46j@k4s&Pc7uwP^`7Ncx6G+>cUSeia%$4`jGkY)9VkMFSs~fadSy> zbxU-2%6dAX>sbL)ydOV+9!5uoZ78*a<`^- z#R`q86V(Vtkk(_xs&s9CnqM)&di>jnm#=@ zeSUKO{MQdAynZp`{gWB*--K}N*d?-ir^xQzQ>%7Nt*qSh@!N_IA6I?(y6V&Cb>F_P z*u>o}V*=gExbRH;0Eii;F+2izBa(C$p0)x0f%wn=`+^_eDql zD<+}jDxu`+$&Y?bdi*O$h^^tuk%L#3EZp)WQNcD<#kSN$IakNHR!2M8M!Q%^J=;jV zT1&s&%07SDf`n}w61MHgShu5M-IA1jTT=F|DcQFt=b`VtE}m-UQLsFHCnqpsbGx^8vry7g`IT~=nht<0-;ZELvq?(M#L zZ~xtsP1ulMzM;N6BO$+{puQxdzT`(j&6k3tHw9UbGO9jhr2VQW`&E(mt)lK*MdCk} zh!~s5D4WPQtH?OJ$Vkh`Slh^GX20v^e&%L==G*J24uj}($*SBz;zu!W?^LY)Miyyo_s#;K8$y!?a_ua2&chBCoW_a_r z|F(U}`}*?lm;atGe6YTg!HVyX?S%gu3QqiI7um7@z~RMA92^-P3`$l)N>)ZfY(_$A zTn#;~T|KRBO}%|h&3#?Xoo(HnZSAdn{k?t-&7K|Io-OUZJ^j8;9o}v&-hMs)jy?XK zULLMq9=>ia&VD}LeopR=PX3;!96XPCxSnGP2;OudVAF-5jTeJ9U%ps$;c}7Dg<@l) z4+e%G4UIo<-oUY86W6AVoSQdtZ!YfGP~1^e&{bH_SzP4J5MwhbW>3(anoA7*4La)^ zbmmX6**{@VL&u^8D<(~tv1!AOu8x*fE0)ZfF~v$jZ>^%@VolA(s+y}+Rafh(F4xsv zudKXYdG!MB6PmA1YQNOhkY?~&<<_ui*2b<~on396tJ+qsTDEf5vYE5QrtI2gIi-(v z!9wnctXH;|wqLrm{hHZ^Yi3(68g9C3xb3Rxw#%j)uQU6|epx8<^{fmpL$UgS3wLf_ zICS&GA=XouuHHCx^~kBSM{eD{a_sPxYnRWQJALQe=|lH!AG&w^(81%E4qm@>k$*$c zC-yaSnHi*~I~=%Xdg7YyjdQj~?%5tWXv|aasgEJ1W-&wf{|xj065kslz8{F_KVWfw zLB;w9EC;MrE?S#hRM$Cau5(jg>8QPus)ClOftId@nyrPIvWcCsiK4cSp|y>sx{{^3 zk*c|oslJw}zLl=Mm94!Rvqr~RosQF5J*V}$&g*%d(Dgf`?RiSyS4+cJQ_EksZgN=E z#JI4TfpJrRF0)#_NNx2dv)!xomhZCLzD#lZHpTVp4A-yI+`n+=f`v;rtlYX`<=PcX z_wHD_c*)w$TlTKrv-!Dic)qKDe5!wa=>3G!{|RRg6uf;&-w5d zY%nNbTEi2wrY9z+=T44~&6_iO7}&Y()w%7(S2KvuR^Z=laNxM+spFbz2Xqw==xQF( zRz0Gvdq`dTkiNE-g1(x9zTOH2y(JooOH?%1=%_AY^5|Z5vSa1RuIv+@87I86G(9r4 zye(!o#xPx4N@&_R59rD<>|WxpDf=joVv0`&(D`FP$l$kot~4RWKn} zFe6tog*k%tc2xU~TP?S4w%okkcKf!gg_Vn?m7BHYQ48ziR=bbv+;L?0E>(uScb$21 zoq6*--!+79Y7g&fFJHCXf7SH-S<~ZpZLe?hcUYF6FfBe{TfIk~gGXLMMqNNeT|q^n zM@3?WOJIgeVMK~&MT)0Oh^ByKte9x9oa|>ct8czJF{%Rd19(-`uBxeCS6zN(`4Y1w z%S@LoHD8);vOIlTO3KzWrklBumTzzFe0#G}*7E0EhdjsdxWw|hLVw4?{KU-oz{vWO zvkzYCTDWP|!%wRwnwu^bHBFvc`Z%=o@zt-wro5B4_6BeD4K6)<`Rm!syt>A{Yd8Dm z7N31vtSkF@?Og7+ce`b6y<=-n-~Fp?%e;DTb9SwB_TR&=nU$rRm8G2*&vs6pefaTg z<;T&Bg%5nY@#Nc&E9Z`UIrrquyDM+reYtb*&7psH9vwXN>EWYO4==sC`03WgQ@=jG zI`;9_vy->3ojmqUbHmQ+U0bWS{e8}S>GR#@&wCel|6SbOJo&V9fXKOZe&^Qt>*t-* z%R9Gl>jT{_VlmB81=W8y%iP&h&3)?N?cKNC-{;+DF7Lm$fA{}th5tuqr2gaI)L_9q zg=O^|mf3SucJC3{y~m`z$z=H=p6QEprcaXDzDcHklg;`rrukh;`&UhBn6+uauC58Y zR&7`|t7F-&8PnQ!Y@4=Z-L@&~*7fY0w`O1Co`sD~3nwm`IC0X(jhi|Z@uwd=O--PhaPxOVcyxtllcUA=Pg?3s((TQ@IX zx_SH7?*87@>(|bnKX>;2z10oP?h_`f3p{!x`s$JFvuDEZ-bufFDgN}S{9|E(*U~ct z1m;LcOcD~BCM7jbPHv*0;7n1`xw5izrKM+!i_eyqkDnkAKV?e9lsOTTCdJH}6*FyK z)VzsN6KBTFoEkWHcI4#gq2UvP<7eECm~%a3(*2mQ3qf%gel6Rub8io4 zs|MHZnq0eVa__dyz1v0?uUlQbZ*}v&ndJpL(;J4iH!O{>m>S)}4K~?(EyO=b3-M=KlS<`?s_=d%)=f507zOdG_kzvs;2!eqFrARls?68+7Q$EAMM^tzzxwVQ&8;CC4hp$SNi%%E#%@?C$37aL~cwsEf;CC#U0XhYmO% zJK}omko!S3hl6TP2UXn;s=6Ljc0Q==esH~RcT-8IJ<{iK zqS50>ug95Yk3;PqY7HK0EiQ^ZE}Bg)s$DL+eJbaUZ;^NE5i?1V% zU)(m3xM3i5%SiH;k@QVN>DwD;+}J$JV#7?!4YMtaA}k7{EQ+Ideu&up>E^DFw|8;h zsOGp;&0$%=Wm&~(&3I4gTtokg?*19w>vw2BP=EML|D~M5TS1M-k}A(-b>0iFdLq8; zjr>9}iIsvfYel8j%8IQPms>6`m@hFkL1b=*)a(?o={bV)lV(mxn>;0L_MC?kX1$y- z@9m_SkEcz2J~R5k-0&yyAu4KE0I- z6_>75+`3Y8?^4UfTUA%@HC?_~dH?Rs3zjcmvVVI{!GfZc4OKZy@`|=3RxPS5+f-V& ztF~}iapt<}(tYK*8|#xZ6N*zS(o0jyYisJ0A0=e}%1Hl~lK(KL{^OsFudgcp{>pj% zt>*dNr}yq&{r7wJVt(`E@_GLD_vY2@vi@IE{_*GEr_X<{j<<{X|LNhg>HYcpYj*wp z^z)teho}E;Pv^hCulCp1+t1_o*Z+KbU4Q@IZ*R*Ve1Bj6=ih7jdWQXs{PlnSefV%$ zzP|BTzx)CF?*HAN*Z<#L!DUnX>&;7Jf%Efi>p%WEdiuG3{Jx5xubyhpm~OB>elJ@> zV#33?!-ozZI(Yby@&QGKL&^$@3QCGfO3I3g%E}8D*f_a5IW{}F*0(frwEpDaW)%G` z$j79m$0Q{uV#Ua0rO3o4$fRb-q{hi4rl}+*DPm@+WX7t*rz)Z+s-$PCB*!ac$1B9B zE5s;kq{z%A$joIZti@@pC8=#?DQ(5d&Zf$)CMqswYA(jhZ>FoyCo8XaK%wEdLc@6t zj{_<$2XuUnC^;Qb^E#yFc1qFln5O4BUEh<+&PUbV59|ADukhgK&^BgTwCYU545{uN zR;ydsW-npeJw>g3idcJ(+4LU1?Q`V%_t>ppq_}_5#D=bw8&=Ki*tK*=+tik6Yo~0R zJ7ryS&$`8H_HCZCuY1qJ*-Z;~FWR_#(#GkVR<2()bN;N#hBns)%R)Q0`L5`TUDD`0 zWnu7~mEL=HR!^Gh-nBJ+*4*;8=KN`!D zk84Fvs!L62Nm6c3QEgIIa*>;NRa$nMpSxdPdR|?*qoaRfV18j>yr*Y<mv=Wb8`{a%mn-8#Q_`F{3$_Wtwmxfe*gcE$LEiJn9q9R|MHF{|1TK3Y)bb?IWNE0L9M#e=N}g< z7u(c7rdpOdTC6%!tTIxpHdd@mR;)^FszPe2Mrx{DVxn4NqEcp}R(z&xdZuc6yk>U1 ze0I8ejJk4)vUY+ZiiWlhE=&djlZ_@!Fq$yQkSXN}gRmv5FsrJus^|eH*Rx)}hrOIn zyLq#3xO|aWri4f43(uT@9tLp{VR2?*a}i^HWn+F}Zhc{Gd1GmN?%fR1%N4Ar3#j)S zh_B}`pRd8cUt<0Oi~SQ?8a6Ch(6MC0iYXm4wybFBnXzO|%al1ww#?bGrm1I6)1IbD zO^Y^7>gwuRwQAO`U2Sb`)3zucP%ZeioPi3{g#oVc%ZW8=!s#+fS@ z?wq-B>CTBuTQ_c9+Sxm`b8hd9gndx9?rQeDD0} z&HJ|}H}nTDSRXuLe({F+#U2gb84cMH6QV0NRHt;fhpb5V*%6+zq}*vseo{}oSB*oK zQ$kfxfLl>PSXM?^R)$|yMV?zlU7CwySW2Q_NT6RyVVsX=T~4H9Ol4w?YhhBVXHaRR zmv3cOtZP+ms#|htSg>!IcWz#GY+Q70UA42LdvaoWa$tCHVR*1-d2yz{cVxbIW&Z2g z|F(7g+ji<;->QRsuO627Az-M5FUmt9jUH&6R!mi~SF zGyZMjeC5;m%ftJ=UGL*J^W)p@*T3z&-?wxA-}TS;>*@EcUwD-pI;({+jdSW$_~Q^B?Bh9IpPv^ZTUn8TIoQ6#N4f z{U<8;3o7_0F5LcX-kz3w#TB1E-#YyNbJh{z6Pwj1Joi`7pYIfB+j_vR^?+@&f?czM zeft92_JlnR3Huu!>}wI&*CMdLX~O=dfI|*15)^pWE3VlfP_{$;PJw^r!}**_Ho|T- zdTl?Pm|iY5xuh+bB2k$l!737=DiV|-LV!&98& z<1M2jEt3-+BU2qC<8Bk9Zex>PV$=lPhmR+( zG5#s~+R)&{tgz&Y#*#ZKi*6~cx~8@4qTafjiVN>*uDq+d^tSHO+sbS2YcIa9o_#|< z+d?7TMkC*5Nru&;6thK1hRd={*X3ES%rsy7*ktu{qx>fuQyy*2dAL7KbVr`}uBQU~ z-U{t~F17pp%!(&-Yu?PSlbTQ|HmO*0TDfRwiE!{IvxjGQA33#q%dOu%zxXZB&i@o; zFJ4-w`SM@Xz29pW{g1x-;QOnE@3$)Nzt;Qbmcg&=!#CFZK0fe$8s~~@C*S8zzJGi9 zzEYq1*Ry_Jv;Dlb{9W|@KieBy^P9Wxw@u&2t6wi2+b9+N*NksX?d%GZo&R#P{%RZS zWi;LVv$X8<>pNms4)I;Nq<7`hz3Wr|u3vrN;C0gnA71}@c%Apbi`!}iJX=}k)ZDJy zQvA!`;kSInrT_aU{^ewR^>T4~$CCraDqIg(jZ{AfwZ0N<@M3ND`YYA@%hZZj$BI{m zjn{@v*G5g3NlaErOjgLuR*28mNROFIPgzS&S;|h>iqV)&ky}mhK$k1ehQ!GXZ!8!z z4=_HM#5kwoNx%=0m>(i{Sf<#tgxI)T*>l9CW=RQC%9kdQ9w(8WLm_9BuIMb-M8d;GVQJH%4$I~0EPb^zScC?7>be&S^GWF+?(4VSTSeBZwEH!OO z-NGOknJZ{18|V-xE-?AJaPSY$_!vP0fpDWK0cMjz%q9gHP75-f7-&BEs=@Tjo2Fdf z6mnr>*p;nemo~Fb`T915=S?V&Y)G%n)t#G0Iq*`jl2i|*a8Yiz&f?&*0` z+avquOe~X5OmmKnQ_kK)GBwI`{wT#VFTUH9WaIp3&*4Y4%0hpYCpRSpH6;fh7P_P? zWV|?dQ*v;zkkO|}o476&bsK;3F6uh<+3TLjv{13B;ZsAdObNR-E&Tf4l`Ge;$z8E3 zd&Ro^RV(vXW#_ER&&kZl%gxEl&dbfue4X+B#j6)@-o1PI`t95I@)A-qGIDZ~vXZjW z((@(c=g*llXWpz?^XAQ*J9F;rxwGfbj*p0liHeDei;9bli;RxFA94T2ojbSg-Me}B z?(O^b48^81mio&df7X5a^y<~CvkgA&tF8Y1?yhXd{P6m^xF0{CeohaN+E@4U)7#hA z-{0T&m+RG`dOoZFixO>|{+~YIFHyi?)xg=>$jaZ!+uzySz_~ZMt)Z1$A?cxF67!Fa z8!R3cEeu9_f<}6VMsl274gPIj3;_!SnL;vLLSDFBd2z%<;>eZ&m690&Ul_zRnZ-1f z#WaP*B!$f+jm<2%%`COeSf%+?t@%{h`9#I_9L_d-GkC?kYpB`UgWZLnislTN_ zvZYXxQ7}d=&?e2$Caus$jMFB})5a{*rcBa?&yrz&Fynl0#`)2lUG9?e-C5^{i_Yf{ zP<{}uE^t9X;DU<46(xa7Y69031+J-zTvZn_RS+>(5;0esWTHCBM0t{t`lM|NlQuGS zq~>-!Wr$9yv`%8JPGV&ja&;GSRTokf7fKBm5;YGB(0A2U3YJ}?OuQ8=6vDic;jRT?qmn;-~{R50PEla_TU2b;tcTvLf6hp-8(FH@wC{@ zy-$5^Zn z+p{2U(~8h-OJese3E!9#urn!UZ&uXiw8;H=cQ-t|u;=NOU2pI0dwp}~>)U(Z-!B%p zQ!imuAYxb|V_73(TqI;(HOr!Inn~d_tI~OPwG&N?XBt<}w671{Q4qVUCU{>_@Yb^E z&2_god|g-gJNERs*xT=7kN^99?(cWo_V?BN?|=8b``!PZ-Tz&?-@A7I_wIi0-Os-} ze(v4z^Y%V5H8b}7G5EUu-<*2I{}qr=O2!Iv>BMsfzRSpQo?I z*C#AYco4U*t)8>{1DDuGQ5hi~8zUa3Q`s&d5h^7SDLfS+Iu#~4EG026JT@viH7Ytx zDKbhTGD;yfLLoLmCN)MSOhqM5Ts%r%K1o_WLRmUNQ8`9YGF(+MTx>B~YBpJEHBn(T zQD#h4WlmLmPHcWoZhA^?c}i*x?H!U2RMQxLbVUAKc!R~`2CL_dRu9WoPfOPmJC2^H zIC8R5RrALZ4VEREtSK6-shX`%Rcn9tYPPq$c4)>|)DTh2CHu2wqEIoi(Ix-OZWQJCE^ zSY6RLJ&`+H(A(Tln!hmGUz1%v(>*?NIz#1k2iJZ9)$;+O?+ZfbbC~YeDE*&twn1X; zfrz&cD&|gL*?U3d?*^6T4w1trLLR>;xjcjC^A4TvA33j=#LRwT^LqXOy0= zNxJ?4Ih`HRf!jykwHWV$9~rWRC&o|wJr!>Lytt7grZ zwd=;MUoF4djM&bMuM`nLT!_pRw%-=cTt9=$tv z>E63d_uh5=yLYPb-mHcHc0Fu7c5&gejSsJNPW*QA;<=R@*S-8WZ)WGco1Oc1p8WT7 z<-yjM3tL}KJUVmY(wiHf?)*6Q=gF(BE4LoK+52?o*{Mh0Ze2R}>(#wyxBgvw_VC=b zhwsjP{P*tU=D(K@|J}U!@aM;iKTm#qdh_Jdn=h~K-u$||d-m$??bpM%n_s`s{_6t! z&vN;9_v`;K%=*_q|KPKKr=RO56#xH~e*gd5-{u>-|8xEMw)y-2w;R9zzxmJp+&=q% zawqCVLblX%i1PmZxJ;U@q3`48ebQ!XVti(1dS-lje0p+vdUkShjB<90jEsVejD~`O zpfv-WoRXTHmXeaHmX@ljtfr!>yu7Bey1cfwy3Dq+%F4FJ!pz3T%G}(-+S z-0are?Cjd=>eAxk*5=~u=KSjX{ObDh=JN99`x(|ZD9m55p}{~wOGQabMN3UdjjyB2 zyTg-V(xXX}geC7wuQWkoY&WmAO3lceRdW{c!amr0y2l{#N6cfRD~36ifT$UdJT{C>vt z2Q%ish?wytWXhY6NsnS?y^5Ll?33EvrCOJ_TAg02cYLqi^~IX^H}5>KdF_eSdvEMs zd}R0LE6aDES-$+t_V2y<_oes$bKR2GcT-y5T{${$%h7pXj@~cdAB-DOMNPbgL{3#>*RYmo)it2AE z>F-j?|E1)A6uA-4c8)Ks@$=!YpBI1aUVOIu@!8Xp-=3a4clGAIt2h6h-Ff6JYZ#RGbK2Pu6y|{aKDaOc2reTi2>?VQkNgR_W2{d;J%$+6B zJ4;|{o50j*0;~&^9hRv(q$xP0sW_x5Ii#sMBpzfBi2QhALBYkyLW78nhKy!9IT}7O z4YI=XWtrzQH#Z13PmrG6!9IBge|L-g>=2Ij5Q%mlk$xYUexFGVFbyCdSSuvB_VrKU_O`mtDVd9|)orhYcUYgQ-YEtv5uF1FBW*_ToKh`+? z+Qj~Ao%7E{Hk@;va4)pupl`>)*clg{SrR^pq<#}h{w9|GQ84}M)RfPYQ}`!5;gCrr32P@FBv)a8+h%VX1{kG38W+M+5{ zsxql$>7>%7L0?jXcvCL(JiWy8^m6YL;~volpJZ1J;iEblOXqL$o!Tg4d^M){stxy7 z8}DAG?6pqObCat73b{8Mi9aq1zs$w|*~|ZQmi%m~_}jY}+J8A5KPE7JS-|#Z9OtKb ztluVa|C`1Cbw?JwTQcF^mJj>BoH+RA#=<*4E*^TaanY5|OFbt)omtuS=H;n7Ghh9= zIjd>su0ub6EoyC>)OzgF(r25NPW$w9Ti4WWr>^$B+Inu**LlBs@3pOMeD?O>wYwAh z_Fg>qxAR@|$$N)i{#!h=@$t=tk9R(t{Bz>v){B>ye%!pY^Yhe`pQo&?@> zKUbe^ef@Un>$y+2SFg_hem#%hJg?vEzHI(}>zg~R@9wp}U0uKL|G%XFf1e)wefsck z?FTRZ{d)25nZ&ENoF5*3`*L{q=KbuS{)=*bvv277%<)}R>YldApYRtf>kT;K69oAn4G8po0%C?m4!+(%0eptcHK4f{(M6)FOn$B80*sjQA{! z{4BWgD!Ak-yzDBp>R7TIHKY<5CWf(03=^5?$K$X_+hqMVUX%n2%{!}hf?LMW` zer!?0u~i-Cmi3%l*K}}U+rgE6Czm#!T-$kcZR^p+y=PZ5Klt$S(TCR$IbJ;Gl6b%+ z^@vmQA-DA7?im6dvjn?l3VTKfc}Gq3xIMw+_M}s{CZDvNaN2s3wnd;Z(DAl@grpt!e zE(J5(3TL<$&T?mt5i`6qZR4G=LYuI{J=Z?&G2^V+*7;{!C)2l+O?)Sv`c@wD%Uq-< zxoF+YM|qKt-rbxeXE{l3XVARLOL0Gq?y)wk@n1M6f8w6}jeFudo9b64Ijjsy*jbdY z)2pC0tDvS?m}ySyAAAj>!F-ITw=V z+(?>qC2Q7|tZ8@B=3UC0cq?({wZyp>Qzzd{oqaWV`rYLDm$@yTe6xJ^)%qzv!#URG zbFIyKuFmURo%4EgJj$@iWn?-PAoH&vMN>f}b#;DcK)E0$hP{A&D= zce7w`@xhjzB+jI*1@a49)7+5JAZDy?O)0NWgTBD`o307VO@3T^z`*{ z`)bzkTrlTwD6QcAE+xh&CMGB*Cdntp%E!km$0sYtCoIRu&B({j$S2MyCeJvHL2w#} z;4}%rX(EEtcsQpqaZVF@X=-{YTS_IuN+qHyB|-)iSf-L%sFYl)mR`Ovp?v9+lEsgTmOuNrXuge$(2E_qKg^q6YuGu7NL+~8z@$>|WI(;?eVu!ZOrhpa8Sy5{qh z+)pMspG|YQx4hxrD$7+W(_J#R>uanRPmFi(ozuOx_hwXu&ZrEZ@jE2yM_A;q(8!BHc^l8h73%Km%&qgxWz>{y zTq%3-WvrrPY+~fy#GAH)mU}1e+#C3__9E-wjjqgvN0~X7I(MczYv#KJX}cM(I=(qe z{gc!(u35{xqtZ{`dZuM1zG|0PcJ=hvzrv*0ugzk+9@TDs%iYZS__kfgw^yr||6cyB zE$w^zbG~EZeQMMC(!>0pUpqH#n_k#9{p;V?ne*qB_2qr{%i}-yj_>??KfU+<>))Nv zw~N{Hx8m!&%UAC%pZ$IQ{d@KM{{A?TJHbI=Z>JI#$*^X5;-5Dq(M}?UVE7xFHL>G(S6gk0Q&C3w+%Iw^AMo z3kysT5Sk<;G*M7Em|@A1kd%}wPo9{Fh-?X&QW6qUa^=bwlPh1gnDCS&s4PrPY4B5J z5Ef<@Hf9#)RyO7q=GHdW{?aNNW>ywf=2zzDSEgq$qoD9pLE*=u!jFZ8pY4SnJQ95J zNU-UVXyYT{=10>X2u*k*H07Dtq=$mj9t%!-yDBN^nfbrBI^XZp1Ot`pd($$UAu5S*$usz(UD9EfV z%&;)jv^3bbJbe3y3md*%+Vbhrrf=7_eZ08w>(z~)FBgBfUd~}qz-3gzXH>>(SjcVq znPdBht}UNBw|(s1%H6S@-=~1buZYXDjMKZ2*T1yiqrCsjhn{m^y3T#-Jo~Np^hfU# zpZ!m8dueg_>GAk#^ZDy{p3&+*S0_9@Ty%c?+>nUbF)`DlZcPZgH6ifcl%LBicP~=i zy~%X@F5UIZ_Ac1Ac)_~OD;BQav2pjBmD~3$UB4)I!K&H~+p>4;t6s7)f6vbPMY$QP zYAbdXmn^H!*;bykFTbcRp{lSTt+1l3G9|AvC$Y4qu(T+%HmkBWt+co-H@hymy0AFC zvO2#sy}tH+Lh}ED*AFs&f2jEWg5`$2-QSYC_)5zPEBRvL zV*jlDpY+e(?7#kka#4q4hYlS)d{9|YNm04+jElSbVFu35X4YqkOiVUTN=`vZN}G_mIUF>-3v;&FL zjwDSxlrqgNeVSu3+u42_u5Koy)j~$Ajf`e%3C)%g+RY}!zM%CCXNGd|%LNQ~cCBFO zmy_z3vs!P*b|AgsWPZod{0`lO9^H%{<&-YvoHp&GM)r=Vhn_na2g*NS;Ov@vM zrdJwmcjf9&)mk5Fbs&B2!TiZ5^Jl9j%+^hquADJn`N;(BCll1)%+P-`MgLKZ#;YKW zXHh!u!gL-6YQ2n9dm5|v_OIKq?MxHCuAlOG{UrVslla$!aWG|xG-pq7%9`SoJ=Hlo z^w6u2L$9wYNnKHrzOq=#bkXcBNzq##MU_6fT_SX=RM?tf?-IYgOZ5Ie$vdF1^ti&( z>k3=X8>~IAvG%@3?E#DA3o6AYbh2;QR39-aKckg@XIa9fbp@vuR@~Z{a%^YLxurSh z-kxo$KHB8|bW-}&N#$oZ`Je5Izq_jbZ&bkJs)EaI5vS8CUWb+ZF7r9==kz@;=zLw) z|HNMh60cn-JolmS-iyqGH!?3Ci9GqF^5&JwpI=;$zDd1$C-v-~(6@&|4?ik>e98Cp zDc{?#ZlC*l`(5wte`|Lie7k$%-S5fO@72G*U(RQDMy_s#^{)*Te+pmzczo*Q@~fBq zUoW3;cFrz$Uj03*|9gr*R(^l<`Jd{QhgbF8>tFwW{oB6(_+2H|665Ui{x1k_a&BpMZ*zBWb8vBWadLJ#=HPVD#qFq@<6%eF)c@1*}=GShTzH>hBI3hIx9kQl zf7o*+Tw`U5EMboP+QeY?H=(RqfbVdC-(rKj$sBT*J>oWN*nQ5Z>y}_V9pSjzLUFZ4 z;_HgU*(`#$T>@{r82(Nv{GH-?TtstuNapjB$mu+l-+fs7byDBQgwD6&{m-UY`>?l9p9q%yeDn@8?*j7W%K{| z?LYMH!KHl{J~ggb^>D_ki7mfAE@|uB@@!?#w3lzb?Yz_Xv+3Q@Me~+k+Bfx6$N)n$J_{&{x!>23e;?ep{R{r&Xq-Ft`6@?u~2 zbF#iNZTQoFaFGq`gMj&m7TY$v*SB^2lo5Q*YIKfUIB-;K+w*ArMhF7y2Ud?Zjn$ROQ zrAus1o7}8MxoMq(6MF?`_6pAJ7M$EIIlEtSdcS0R!_0t=sUa;>Lwe>0HO-CcnjF?P zIj(PZWaISE&iT>46T+QC0^DOF{DUreMBQ=;yXF*k&nxhvTi{K<$g7^AcRgb-`v%|k zjlS+2e&754h4U9~oWEjn;*QOcTULkenVq_6cmzwQeYqxi?>F(9WyR!}U=bO|gY^%uFSdy~2 zCTDxmn=M6;HdVdaSM_RR*{i)}uQr!G+g~QOp-gN~o!F*2v3+%7JL|sfzp?xEf>qzP zJ$&3fWy-CR_L6cK=x$JG;$Z6PxY60!$=Ok|+CA{*@4sueK9o6Md#?7~^SR&qpZ9{hT?K+j#Z#=V9y5t-bqeLtT2^-+#w@-MOXx#m(pI=lbdA?~S`xwSSZC?p?O~ zw{8B=f8dXBaL|8NUM5$jfD01?E=-n7Ynf;~dD6xS6E_|7usG3ad9riI$<7Ks`A4=s zC)^zsJRB8VI`zFe_1#+4J$u!Co3-7WS37jCcIsa3*1p=afA!gh)yF%s542<-X~{m+ zlYOo!`(Ri0(XRBvZRyARo*!s@f28sKA=d}TTwfe4J~8|G1bzKL2KmAX44yL>GIt0> zPBDnw!cn>A#6yd~E*8Tsm%>vjg{x9HUx|3W3elWpq8YNwB)5$xc9~A?HW}wWo8Wy+ z#f?JQ8;zn@YPq*cr7yJ#?`11rtLDG=+C;Y8duqA+(q#XI#r|7d#dQ1&>uuf^E8fCQ6g?zsjNUzkpPV?6!c_6f2ZCfO&iwa8grbItGToV~v)*?SGu*K+&adaSogJobxP z46oi!$+#l(eQy$rj$VGVYWmO6{MFfZ*RKD4llSZPeV&qCvQLWCkJK7n`5d?7`(KXx z>=Xa>FJh8&Ww-6)oY%!$DJ1>NMDI^z&5_M5C!Ti(o}Zi)r*eFsPv?9;-#LE%byFw) zva){c>v!$;pF8EOmG8T_?u(1>)z_V=sXce4#{89QW~^K_YwfyuYuC{Ijt5RG3kc_~Xx^n;%n;2v|gv~fpdLS{1Gwx5ZW#c~lhV;I8B#ly{~U)wgV@$1^DU)NskU2A&e*E6#X z8(FPyaBTVe+ik&riK73%6*-jtY|~NknJqO%I+Mo;;Qwz7{8acAnI&;EVnk zbmLRtE$#qI&H!ufi#xa$-*L&Xb;-0n`eM(~7qu!9e^ey?s7f*~ox!wpW>e}6=ak4p zPa~8>A{L88Bu}~VXzER&&>O)aH-oR+l)%F^bwi?s++O2JWx48c)bz>?y&-P+2?(caismgV2&3ECK_N+_&5p(|2{)w^$#`-_P>Q1~p^ugM7V!3ycns@U1 zP?bCDeX0T`|Jq>oH_-W8NbtMK*A6YuRXuN|9aj>%|INzz?{aId-v9OM%SH3_Tle`& z_sPDjEB|)n_r-fNH}0GH@$zPI_B8#uGk4qAlz)BGp1oK;ukY-Asrmb>Up{^^wUzz4 zxct4Cs+#J|SLZ%mKKXR{_po{P4SOrL{Q7k9)tARtU#`3w?tiV}y8rciHqq6;YyQ6N z{`y`2`hEZP=l9*4QN8)&!@JM^{65=y^K9$RwMY4*y+22vmfs#Gwk=F-d-(Ki*QX`E z*1r9E^=;|w+b5o`nS1u{>Btij`Tx&4tv=8GFW%|d{0H}cJl)#h+@sJ~;Gq~}#A3XsYOUA}a#zsq~CQGJ9N~T7Hk5N~TQC3fpSx-^pOjtN8RL?;>?Bm}IUQ6ToK!u$bX~lZUEGv?+JqDri>fXcRbDRK ze$o4Y1cRr9vI1)|(~`t94Lp|I3f||m+|Q}`pIhf}ZefMQgAl7TD{E$WvmRT^74Tt2 z;D;55&9BK^T=3xPk|)etG=6Sf$x^a{rDSExmldsFR=VB&6e6Yyx62B&e9 zXK_?YzmhD&`k*b#rf*z0eQWB3&CMsR4YVu_w5$v@Ee*AI8?4^3X~oXXD=Igvs@{}U zu`#piaJcH0+8bMIEld6+?D{8D#rQj1gQtn%UHwkKM6rX}|9+QtWz?;fa5!KkmL{yu zapM@X(>6}0GKWPQY8P#Ap2YEBh7Om-@-9Zb%tsB`yI3AfWAxaSe#pjXX+mVsyvR%Q zZeEIW=<6x(>+xT=#(&+M{CRWY_wA`~tZ`WAlpwf3B4mw3%o>THMIu3~M7XACwlh9G z^-xqxP*iK;)Kv~4Tcb+0R{5-T%UPRNvp3ACxh!b0U(n<{ukN_4?z*Veb+-Z!_m~~- zNp_q0_E_XwwVSfbEa#@}Jbt!lx6Y^Cx?Fw{qTeFK=Wfw_xmnjXHNNiF!lVNmU-blk zo#6ep!~1UJ_O{|Y-o@{HpWDtlZWDdXHv0J9KEI0XzCUDkKe=3YbNl12_~)VfA7B5| zAJ6?_m)wQg$MS#t>;B!1f7{0H_~XNACiXp29ei=TDFS?!EyWUt7B&>DREUw{m@al` zX>)<3LW~;6bk;+u%>|YP1v?80DnAtTKX~{_@WChH2V8Q8M6FtseR`CgdX(L|l-=5t z9s86kCEUA&+-Gr3TH5#|U;>lu5)b~B29B%FOkmSqa*{8z*vTqpf}Hu1^URW;oZR+I zFtkrmVwlP4l;$*{)gVQYDYDb)TGE7Gixh3fo8FFmmnKZsd7{IIUtCXiaYnlA8Y4Xdi$xr(x zzwMj-x^wpH*4giSXTNU_f6*QOqCNgif4q!CfRsmoluLvhlgug}-tnyb}Fsz zR$Sk|G^1yEhR=d5za?3Ii}E~|W%@eG`YyGd<#l};n}LjXy2Z4ESLU6(Gx6lDnP;!f zJbQ8K>6=rJ7cXkqzC2*V_J|$pUDoW6`BTz*#bN51gsFD|djAxxz2vd?(@nOm#l5c< z`$j#F-f}$ZtDcOhM85I74D-1!Hte~RTDgHr=QUAO!`@NyR-;_Q6 zy!))aTK~Qs*S~$LJN~7)?`8XO!Pxb3rScXV-xue8Lp+Vb~e{(ks&?9cAm^7rrmvnWnaOe-q< zcJI-h=B51n)9q~H=FN}#_oF2B;Z1v{&*x7ZI{ziT=QoQ)B%`CmYysxk2F$xToTkik z?wRL2XP)qc1&^mJc|2*+<4MaNPh0qO;?k!R7uzcNpI+VYDAeVn=E5IS0{^ViU^Jbw zz{){+38(Nir;N)T3|0n#u`_1KdGXZ!7gkGTx!^VHg4fJTUb8QsjJR+z>e9)mi>GfM zc<_3E8P5sT1UFZAH&u1F)O58}aW&EKv{3UjQ+_eif=yr3u6{_o{3-eJxAg0rPcHC2 zy2AbN3jb3hj>kqk&yBhsm~}ld>wIL``OL8Qp<%aelHBoZx%1gG52VjLkw5oL{#>Pu z*=iZn_1;X-d^1D!)fDAdbF|;h(tj7F@Gwl{Wt_^>K%J+NN^e889*3&Ej@5e|toS@y z^L_Nv2jPof#IF{KSTA#9fzX{LQkT}qU0Wr0Z<*x9b&@w1ie6nQTN|UkEL#0rOI}QW z-W|`qKjQYb*!?{c{HyaXn`4(Y!3)by? z8dH6G>AP*-e`T+??au2hzdK9q?yPq^&6&U3M!l=vV)wz~*MZM3oX>A-k2@|`xz+wt zUj3WPmaIR@Y(KuPdv*V_&VuKa3GcfP>=Sof9>;X>@8yHbmpik?F)nOg?|gm_pET3G z7XJO65|z@G-*T_)EWfz;ee${e{ksi>?d@h;7)~$A)cg6VeTuex(E4-BV`uyC|7ZC4 z*zq&7xg*WRi}G}z-HAK1d-Ig~@|6iiD+`KtKKWPlvU%#KcI~PCVXK#iWzSz@Y7?7X zv+dreq`hB{{@VDm_uI?fbK%m*-Z{r7$L^85LG=W^!Fyel*B zuGGBSR=*Qp-vK4jBg;SKuQ2+^oMpgRs>aBx=IGlH>CqkOF+0+uJu+f?WJG@?%Y}3? z(*!}|6hY%8LGv_0^Tde;$rDY|r*2A^x+!Jq#F!B;I@)I-j6gBe|Hasn0dRoNzyx8Uw zf}78XZa*Wu{gn82y$Kuirfkrhv_*H?7Tt+kw5M*;p1etadfAEzWosrCu9{Z5Zffbu z$>rG-%JV}$WQ2Xm3H)NU>dD<@Z;E|xE{{FBJ^1MQ;H&$&1Gry=aoa4EyRulYCP;aS zzwr`(?KSb%f42A?S&;Wc^6!hpzb^z2-zaVfyi@u3$7eOpWHnB4AK~L?CmlOGS#OrQ zf5eiQO+GtQrdHjw`nt*YSLgw~&sGm6)Lu4xJ}vlO?(;p?daRQhvM<_hU-UcgDE}RA zxgFE(zG&1w3H)|r^Pi3BN2i1zol<^P`2DKocBbcRvgiH0y7$BSdchkOvR6!G@BFb^ z^0f5DMe{`W`)%9z_F8;p@5Zr@*3z-%X1m@Ws%kjdd++4gebux7emC>Ke_y6%L+P`F*FGFxJFz`FT|Rei z^_J3qAI%CLe*E_1%D1B{-*&Ei>+Qcy-~Q&lPbtq&U7nlW@%nsO-XCRy{}sQt=Qy%| z3%_=#pn#*GfYB*tk28auouHhZp&g^4ogyb=LC2H{9X%5|{s(XHjBd&(NIbH7zL~U73nORMhRe2A%v^rfdV!l$sz|Gq;wQZg#>;9ws8!j7dx@=f< z!Laa>ak1fs0^<#z3^si<*eIKrWPj+)xzlG3o<4N&_#w^@n~NBka_%%JSoaGY7j&30 zIlQIYf6DCm9(RX79Sd02Pf(e^L1aINg06y=vWAwjikh~Hp1O{rx{{*47N10cmat-J_L8;PYZj+3TAjZtJz-gXMqWZnVn$9T%Zv!g*-^6@(#)2nZA*LB zFn1?wLVn`Qgv6&AnQv24-{#~#PD*~AmHj*|{e9m12Z`?=ynOKD<%=gzpS*ed6rZ4w94{Z631YJ+$W5Oi zIDg8_33H~-m@{|Aq{&K!sU8^7(_a}lyzwV6A$rD;<&*+^$werNdwWrRmKc~Gy zS7Vj7hEtjSG=<&rr)Qnkn((!M>RQpz+^JV{L$4lRm3@14wsqEPtE|`k*UihWnwOcI z&CkfPyjiqm`_{K1(Z5$F%Pzld&2H7lUsg8X@}BLLtHxLE8W$}pU$XrBo0I#B)%|o^p+ z=xE@=!+{Hr2PPi~O+Ruq<p;UQIr1`rv@+lOv|j4w*hYW@^o}`N7ex4-RjA za(t`MfvsXKH#r{O;(C0m^TDm|M^;^rExjICdOzIh^?2v$N0lcYR%$=^sqyHi*5ltR zAF!`@#J=hw`^v}c*$>(?9<^sZY|nh$o-OS1LdfNnpo_G?5ecCq(!y#p1k`2=FN=~n zwZ(EuuJ@GZ4j~U*Lf&|VymAY9=o#|THRQ2($ZPj20uEP1Jgx{i)tF4#VcWDrdD0T? zwkIw+nfXjNSE_t!4Cyj{IYl}0%JZU(W1lkhMJ~kZB+bxB+Y@uDWNFXOD9hJdxwc7% z%9yXR$iG@}f0b>~?!Nbadk@@Ydw9}qV)a>}@6k);ww<)KTJ~W_aO$faw7$#?z0>li zp1-?p#_r(15A)8ppKSYC?JF-Y^Y_Px8;2f0<_=aDoBu`6)^_Wcnu4D{XFi>-tgU~3 zozMLEO4Dt>em#2ix^t^}__cd+vDM|tfA60CI@4O(c(Qaczu7anymR(9|NO|we)#m- zqt$PhZohr{{kHJ5ZQ;+$u01QiX7_H5{+l)W?{akB=P<3djy~{fd2Yhz%X}ODzP$YH zV72Xh``Uk>UUFZ{uVip#9XMig z^T?JPN4DN%{vSisdcP4D@P1xFM$ukuXY&olp6&oH*0VRSvyc=U{;>Y0N}&m2rWqxkg9 zLeVpcQ_m!Zo)I)XGjZ#gz^`X6@}Ak~d#3R0nU8DFaJtW&+-Io1)mXjUV0p==C35MW z*5@YO<2`M0aMI1glS(INOYWi^}Wn*O^$tsjOQFZJm;u#%+mCo-scOa z_ZLl{|9qvyFYn~dNe^Peu(uz0RE^V~dk}bbt^)932-c_5r@ZH%#+p~lIA6as+)ARAXYBlxu zGr!;4{9e&O+bhlA@52me#{XL6gzGPjni zWlptN)w{?WJJTO7KCkRH-@VVS-|oLs+8ftDH%_;3Uq1PGeUSdXQ!^^&mcA@~_tgAn z_&t%h+UT0Mxi7z#r(VAwdaokB^mFamwcodHPkWVr-sIlQ%zf6ki^{jXy%+O)@6N~k zb|tny3O-$|x&Qd*0^kFMp9g@V@@g`&$Y5 zY0K??NN}_6pWW=v{_vvn4;}$KWtRgy$|?KEpAAN26QKMjI-*KN` zh@*jpN%3HUhk=L?UwezP!o>^^6EPwG29-$)Cqq26cqg4}N!g@uGseS=f0A~?6K=(y zNgfMXf^?ciPAe|;^4Q50w6ZZITk$KK$6~=tS&dtw74MdLtY;0BP zdCm{Z7p&MF@I^(WoWE;7zp7osBsnL|{smXu1CAwY6my-bV|r@S_-VdV>-hzf!~ z;4=4x2TCSeI*d29ROfO2|6_Epb*i&?c&A#Jr{4OBagoaVx0U_)Wp%Z;^wsRwE23X- z*?wK}-5TS2Hxp*wNtk`-!LI!Wi|d>JKWw|OnD^sK-<9gKxz3wSotK}v=gy^B_b%1% zP5n`I`pesGM{noO{(igc{r0(O+hfzV+dkj6*FJ~+Og{VB_bv5zI%95h#^3Rbx^*(* z-pRO|nlX1ZiUk{XY}m17$C5Qm*6dlcXVIQTn>KA)wQ1F^UAvYoTefZ6wsq^)?c29+ z;lhm@S8m+6bLY;bOP7Al$d0~!G5PIrE2~@9{pDq)vhVFKUcG#|cGGv4{CxlWDx;7}ud69}^XMnHaPs5n zdNF%!>ES3+}_>g?|tv>wYRMNfA2|i^>?{D?CR=K1%T^6&4h{{8Q-bwb*+ zzi-a`-g$H8&Yd^;<V*X@YAHzIC3$Te@=$sbp{oAq$s{=0wtZ|84+@Voxte}?~G1u+~)s~5widzz&Sou8J<gM%h}CK*-b0iO-tAO-a-~wSzach9~t_qtR=ZndJ+0b_GsT&(NvPSmSpo;_Ib|?}5x_%M-T! zWte(5bH-nWsecuw9+vbvuIRNq(d)UO*Y)Bld5fpKOP(T^JZ0YFDRGad+!Hpqf7)Qb z_LP6&n#}70+2WS->~a*XY1Voo7WyK0)d%Yk!Sa=h-UYhfU*1>iA^W|SD zX6UEjRa2fbq`u-lwPm`<%gZ8?mqli-*W45roU(u6nM&`O|NB-wur2+_vnplUwnxm) zS8amtGG!lDivBE={@SSgH&_01t@!V=63*``xZf7>zwO9_WoIr-yK^&l>BZcs+}2X! z_L;H&atgj~zIaw&Z2P_l|9{Ua-mgA=I6tm`-%r0!1-OPLQ`R)?&-J1Gk z#_{jc_TM>MzcbomZ?xIoXv4kHwtJ(0XKnv@HShE5yNlPC_y1)!_#g5m=Rcn*v$Ytn zGJDhHwoYNz$4-WaGiL70jNI`uqT)qFqw<#=cZnO7k~e-zSpHy4({pT?>MoIBuXO61 z_NjyF$4=^>W99HD;P(2&;Uy=}(uGAFipaM^adiK5bQb;;JI*x^&8s)DV@F z(4|kVE)_LNc^G|qt7u4xXvo(oS9qpe8#wka(D?u0#exer9&Fe#q2tGe6D=QB9O-zm z3KO$y!|bh+r#rD9{F&qkX+Z7$|2F5)i! z-1YfW*XPgPTwGpUT;AN=ryCY2E!eX|Vuc2ymzKA;_UTirPMuz*eJWc^J8RYIS6QoG zzs{0=^;$~$_3T+vvt~<2N6m`r-zLM_C!3pXU$y3OMD_EH-yX}##>&oB?~{N3^3|)i z@7`G#F8ZHx{^h;N&C7qC`!Zij?uERhMeVyY3FvkQ^Tx}_ z&XlmNerZ$i?$nJJQ@IykKXyKTw?$dhicd`#*m=c=u)d z80n`P?WY{?XTN8T-^MwPdnb8r zp5(iIlJEXmr?<>HzA5U!#;6lp!)j92w&bt%DcI{%vDYbQZ&1?WsH(+LX^X?^7W)-$ zj!WI_Si0FWd2?j;YS;4Bq4lfJX1tzpvaJ1Q+484l)6e>Czk80eeXiW`xs%UrhzpOH zFa2TVdD*g4k1uPU_x~HW;j-O)wi#>ZZAEvK77;uxU+w&);@Us^-#XK_rAMYzsq)ix;=N*-IKfSR`cGMH>t0` z@#}Bl@9!(m$@}lFw|V{Z=brb^yMyiH`Toq2yHjnt<$G1d`?ELqnm_+`uW!-)dG7mn zGgQ|L+7=5M7jqg{OB$E68kdWHekk?qaOs&pz59!0|7qVaJra6DhUvHAx6hyV|NlID zM*nt!?S|Y3WX~LmJ@ZH<=cQcQOS`m}jA@b;Es>1N3|1cqJ|p!(W;5TO18epl$?-XC z7OxnWY<53kTf_DlYs+WkKCn%zX4`Dc{oADd=NHD$m2#hdDnI+o^z5`!66fdJMoFyS zN<}xa{odAhqv36y(l&wHGu|KIdvsaf?!R>Wzux=*J}|#N{h#~CZ+V%n{R>UFVrpm^~t)@n;rbeu$CX9)xjERZQ$w|-2>78?X1;6YgWhEg6B_SmxAw@MY zWwmJviW8L-Cn~B=RaOmEP!3j74pvkSR#gvIRu5NKzpkKuUB!M)sl>A03zjtz;tSm! z7y3IUIyfeJI3~JyW;%Ihdbwu$xu!b0rniGW25HL*B#K$eSgo`VNF6;U zcJ!PaZ$ZJaqN1aP#m7H?Q2Fpl?eoXw92{vJTth}PV+HA!t^VOMKvNB{ZU&*|F(R$tL`)l({E*;o${l=R6M`{k7DLQed>c*vK zYnHyX%-;R^+P7pgK5>TVvmV& zFZjOq<-_vR#t-_!AIQFcu-oq7Ggkq`Fd;HZPph5YBL`FKJipOef=Mqz1zzF{kr!< z_sh}SFTBeQr>h%=zfWFgdmyI1W9LVXV&RIOou;h2d2J5falBK@HM^#5-*=wc|CVna zdf#}Q`Q>r=iZAK!kiTaWw$i^Ze{50vXJ{#A@|EAu1&@6m`L5R5XNOC zjt!QGuyy&heQUD`H>Ok3?VZ+B4Ra<|UqVLv_ga^*K` z#ZQ)s-)vRCnyr5IGKbmI4jAelEXzH}C%e!ucH!e)hhl#z-Tk%5wr!Dm?~&g=NBn1c z%`=-Wvtfc=vZ`&0u5pgCaguiRHNS6j_P$xsEK_hV@ZX-ve`ahx#43KYF#Kqt`BP5* zr=0#*PupdM|1nw5nib1`ZLj3Ia_vhW@_H_&%z63OW%KWoV*HnNq~5kWxv@U# z!H+c;e!6y^K5g{tD(7Z=C86T}rrgDd5zp zn_H${?77N4GyCz)*TR;sr++qE_bfj~`_7)gEtQ*7UYEVRHuuxpYSG)@SC`3!)mO#* ze(8Dl`SP#x=bP75Ui^_N_3gIyk?b{WH)gl#|CUP3pIyg%Z|k3L`@U|Ux$XY5zS_C3 ze^}lB`8E0a_11U!-Rk>wzt%^#Ov6uJDJu#`hy>9hRi|rR*+@E+M-ta{%&o67XzrxKw&-?FpsQagTA^eYcYljl^ z(In=hLCi;un2&NXAN6uRn&o^{%DJ`5xs}biRn56I&AD}P8&_@{m#o{Txo)5Cx_z=e z_Nn&Rr@v~SnwNcYURLz{%#&kho~r3QT^Dik?uKc5QY6MxF6eO7h)mObUo z_Kcf%C3fD8*m>7t=iQ2(cUgYkb@_Q$rS)z~YrbaJ{UFi(%d`&~P2HcivgT~y-&w1_ zZFTsYz3|v}p|kl*qwb&DTCQDEwz{Nz_1AsZU)8TS{t=h|WADKi?voAI9R1?H`sI1E z;)vZ(&-0z$tM__u-s`<`xA#uo_QKBki)QtgO!hAg%vBczYmW)qvREXx%{5T=o3Xj0 z_}q-Z^fQ&|XJ&9eYvNA3BWnDxZReA=osar#GTeRK@V+YMk}?qH<AMTX6` z-?9G40&#;Et~^zo8+#nrD}))oFqL47aL3>SE>U(>|z7`=B)Oi{ivjsuRDdPvlgX%BwV$S8Xc4>QsL9;2xFW9;NU;)$l&$ za9^7>(@G+2r#dP3I%!W1vYs8JK0U~MzSsH*Uh6x&_Romg-*Rg~&n!c`62SJKN|P{L~i`LIqi4)-E-%c`P>f(#_9r+n&^rSw^eq?6;-T7nwoIe|%*K^2! z&wt3kQt_MPW8p?VMivG+LB$@4Hvb|HH!l`}34+WmPgD*pJiNq3B!$6H)spjSV#AbK zO+0R%e#`-~%N8zjV7xNLKuRl0!c?}ajjwgla@UKOFB)CAYWOH#?v|m_Ml=;ZF&hF06ZstcqLJch~OIlQTJiWLaCbfAo8?mQs zT$1{P@5Jd7OkA6a3@ZLEvhk4%XwcNqVC?Gp%@=fR*`hUzRxzzuwQ|*}!&k0cy<&3Z z3Zt)1DX;DfwFSHx3{h4Fxv{|a z#{MQpCShCOw}!csnG@dgSXeRW_4Vob^{w;s<48AuUeESyzJEji_wzr#ef%#uqwPMY zoDZ9gOhkfR!XX0#r4Lg&I{x{&g!r&X3byQ6A>s3eU+7W854+CVNjG**JmjS2{!82_ zsD8p-_VfL7zA#D}*c-4$M(VgSL_X?Vs-pj&os~7!Ay6=Yamo~i(9~21Usu+E<9rim ztzxrr$(r@*l>u+5?u@o+%i6XrTefZ5GQI_CmvXVGf!>_7c4UPNc&N$o`Ffd{0 z>EZb-}ebA@JmmygAz?Cy12FB*hXLQe;ec1l-;Q7a!w;bBEY0I`vO_7Il9xVTI zFef)BCzmnW+WNq`dvY7f87!?Vlq?gA%Zl8J3K<{7d@pt`a{uJ;$>kFh-=}}YcJ=4J zPyaLF4?owBr3d1gF!G|NMFUv1jpaPp@bGEDfof+k2nC>WaSW|DZFD8$AjO3qN{rdUSetdYtso z^jOKhRB`F@<>?BkX=!Pxsj2Dd&!0SbqV)9X)2Gj$iz|qViHRwSii=NIn5r~&>eQ*z zr-v(qDqdB%s%WZUYG!6;YHF&yRblJ4ZE~(z+1b`@SNg7eoX_+*|9k$X|ElfrMSqsY z^P7L`_+O>>^Xr2Dryu^io%~mSd3U|#wf%BWFU0?P&H3>9;lHl~|4nc1*8R7jrTO1a zhvl+U`lfvJp6L4XN&-M2*CyO_9A80L1NcwZ&X!rCDY6;WT)%4p z&?5uSLf#oH)6^7LJ(!{zwoEZoP+t4lI#M!L$5JP9hK&z@zyxcB_3JwVf(#g@i1IRu zsw&Uev{7qXSEtmpRhkRdrLko&yn5EKtc`WS(oD{b>_|qdTh}6XS(*JV$^DYB&A>Lg zR;SjQ`M`mD7Y^Jzae>jmtcb;@XD&mqaQcBWA_a!*XJT~D#4vgnn;$sERIq(p$@Yz3 zHf;Q~W$ULco4;+^{;h1o$FdDy3%7hN-SW9~)92z%-;1|>XOEF#VhBI(aNw-riL;s~ z?rPq+YkA|aCCi5r&aXwh%zN%0s=cFBb4R)6u5zN>#5%dah=21g?&to{#mL0?K0@Jy zy50?QIgXFs3{HQAotcFWGfi&zuplL(fJ;D-X^C5#(xFR>8a{k^(a|%*L&4ZgOIuIN zTF*+|PEB1=&0NvU+|W$l(9B+wPs5{4blDNnrANe<9usHI{HXep(;?H%DKagoGA*dG zEGV_CDAms^G|#IvF3UGA%C{~mx2`JI(XCc-!p#7d6jL$go4yX7e#QZ_ZZl1Jy7iy2 z!G9s8SM}bX&M#pI10x8He(S-CFk4wnjWwIIC{AUdVP=gWUguuQeb|; zd}42sxQr|@7XTDXI1B>HSFu2+PK>E%-LfX z&Wa_bKj}-&f5T|Opf<0sVdeD6E2nRsY5pMT-Q%o>uhU*W&wKhlQI?_N7E9GFwyK+~ zl{ZE}2kWvcWy4BRytCc+HG(ryb=< zJN$!M@{5+_7fp%xni8M2rCv%vc!Het1VQN;lHxNY<)?_sPnjz)XR^ek$s)7Zm$Zm8 ztQ2(3oap*8@Th}ZiKkmhrkhWunm{yL%F(IJH$RFx_&KTSY}7JesinWtN`I%C{Zcdg zrRx;7%4zsyH!L-0a((IRD(PSxFo$!CLX`KWhQ&*7<~l^4GhAS^eXr7b<`rjNuQ|is z7cP2W75A=H+=-^GcTHXIZgu$BX|-U<@_kE|FZ`0?oS7e7DSsiRaMjXJA=#nz*;ijK zzRH|y%6vSFz46;FV+Z%Y0qM*JHG2wotj=V4k!Qy}C&Tjl`2&AGUpDx!%P4YsJxgZf z_lp}j|Mty`mEex+Im(#)M1*yQ#nBl%7z)$!9GY6$C$L2Hd%S%-HLdyNfgcQ!4Rihb z=E{4|b9QKSc9<9}5b#KdX$oUrqG*fO_71K7j$3wtUzLBGR2*gSwJUV!j(3_J@8s?f z6dn-dAK>Nh5fvYC%OT>JgUhi1muns&*F1dANeE0gXHr z;RDW>F9csc;eGl<^z9q$7YsjMHT`(mnDx)s@2nCt4)UC3+SqfZnISo1Lno_1QWj^+ ztjN|`k?k{?&3^0T98N6b_|42GIISVMWohsd(FZcAygS@(?>Kg27vsjVcLvq{76%R* z%N2a_Vwkf>Xzt!d74i8h;qz0%?~9n*D_p&6e^y!HuCc*kZH>#?7MHCpPOGcjRyVnA zu5;X6=eoJgb$y%j`b;Oj_n-ORuf@^9#>Jf6)v(~kqXj!AJ@|3yLCd8HM>btJ^6A2o zPX-D*nK=9zwUmSSmxQ`1ExNRN<09j%MaEglMvc2}tf^Aa+s)W8-=A&={bM%x|Efvoe_z`Km1)a1i1@ffaSKdk+;Ws5GPf{Nw$M_R z(;+TAi1EVYpevKZu1pVP;z^mxn;OdVG^FQAXs<{}ujrK?(L^<`R}sq^HnAlvYg(GQ zu4`%P!eyx|*YQSVzKFK$!r5>3t49V`b!s-VOT)BCH zr@+vt+;mfc@wO84jh_s*elywp(P;Zuv+bWZZuq`+%lFMi41dx5=4P@Uztni>8_$9j z%A0o>Z~jpc#(80C?5(-MWlG!ksIOn7zW!56U249g=$Z|?)^Aw0o@0e=D9@F-S}WOq zc}q83PVGJ5Pae%>6xpp8DDj8U)9fdeG8-V*5eJEOWz*Y`HL^Y`MJi08EgVt$te@ZvAT=`V13I5362&)r5=_=9ENI4g%S%{j2EgHFBIYS znKd<_ZECK8s1?r;E8Zbi%(CFD z%*wMeOPRZ`CH66v%uFtgY_QO=omSz(q$GGD-P1|s^=38c4a*dQcq1?K+-xXuX%n;# zQ|n(I?{`8jD@E7vYUc2T=&a^;7u z2Yy7`{EQZKXVj07esH#)=i)o&*B@F-e=#y0XRL43Q((9ztH3db^9C z%(Z&5)@|3Pim!x?vX{FvHhgqv#cCB`4o2@e8C7(xXrAKO|S9-PA z^NN#Cs+c$Z+}9A(D6bIzLO-5`MT6mJ<8QA91=j^4+7X-@+>KM)wU|W{wKfz?^-^#W zUD3sIB_S~Ds=?P+FPIIbOd~c*ZQVF)YvG1n6}k~jYyOpY?!T0Gz^loW>12anFxMJO z(F?hLmvb2}eQgL+aF(~2)p^1wgLxC<;bhAV-(nW?DV*P7eE&y9PI$^|FO)||{+bMu|k=DQW$e_a<`ty^^U;ibU#)46>Iu9hud{r22-YsTrb zW7i#cE1b98f5&~xmxbS#98X#QJZ1j#y}@zc8|&V)FW)QA^TS5wL#4@!-!FRJKQ^xG zZ~wEb?eBld8TC=?_PZbd%U;!xE`L~GqW{2*4Hb%MEZp)vQ{|7TF(iw(+-OzcbC7t% z;*t=v$RN+K#o`FF$ALbNLlsLCYAy-P=Q*O!Ej*!_<%uBI1chlzVto@XF{a8SIe61+roF09dsUGQo|9`~WCKJo?1>^yf8+vJ|K&3ocDuf2BH~MoD#M$q@h&e3>ydgirhwyENg{Hx9lbzQ{;Lk!CTzr z$au~{=M<|p-_xoCx^msuY!m0ZE1fasd^VNmvtQ%SB}$hP_Pu0~ofglgB>ZeXD>uU? zLCccHh@B;lJHKq$Q+qJt=l{a;bOgg(W`!M@b&W$hNmp7( zH(E&7S}6CxJeTA1LasN4T%QsfJLJ7|&U@;e_trh{t$*I*`Wt2pY2p<(^g5U}@Vm7HSS7RuSurJs^gRsm zb6}ZTtnw#7d3r|H^^C0T5>f|jryaBHJI4G_vfpFDM<$`fdk#Xq{zhCMd>el*UG(Qt zz`vIo|9L_j)Rel-6lR+luutUXKIQ!6GMnfHHgTmchFueqc1;l4bs=ci1*2UXiXtjl zZ3O~3yVu+jXANQIx#+;_%%ikTOf3AkL_EKDMuJaH3e%)n2`A4o6nmZCcO|TW)x(<0 zJHI(qCi!ee`q?)PsilWD^>0oqe|!3++Z=~48=fW2ZF%}t>DP@|0$lWi^+@`B2+qvCKWi*ZYdE$39s( z`@zcnEZIAHb{x7~AzJv>L%5(e{xk0p--y#||1+Gi7c_piztLt-6YD`P`=d=Ayl!Xu z9w;;vD(&Ft+{x+5Fwa@VU0{!kN{!2sKMaN|6&#$@T%6Q+CQRx)aKe?*sAywt`_Yq$ zLL4U#Gqhew+Q$F+PxAS*%+c|a**kfE|I5`R=ISM8>Dr{e<(7#Zi zf8zz4n7+c zzfjPAp`reSgs*P)OF8gJHUJX)jT6fCq*n>kQi^hjtZ&yJOyJ6Cq^UfpeMqGDsB zYO_^krbBesQsyN$Sz4G&QX9lCFmJl&5Py#Sx%U+IIu%xX=2iygqYRsp7Ay=BFbLu^ z3*s{jV_c}_V9GONRom=UjU2`cBy1^i9tsUbiXmAsm}Azyeun=SsgoBe|ePxxhKr?XmYJ+p8N8&g)aKtUe+!7Y6WRp}fBFS$zJ z@-gSxK76;pyovFblFctA+h5AIzZcuEFPf2HFv~PsqpkO`PS@Y+7k@T)O89-*epCLa z*f}Fn_cJOLjXPD66pym&Ed8mI`eSW_&i<`3`+Mg!^zLa`yJx}NrUi2sE!aD0Li45x zi@OXKtmtG|wM!$^`ATH)lx3Q3mxUHH=N3L##He>;t8vOZxo9hsF4nXK!K4y-Y{utw{`9xINBD=g7h*rKns zMO~7nr8jA&?zft!d9+W{Xuqa${94BGZ5hkANi6S^@N(B# zYCP?hr2AW@kLT|0n8)Jq+H=X*N56z#)_Q)ao8TkwQ6}lbxXyXyy6&L6ZI|zeE#KL@ zWOx6v-TEgPdN%SLyX14sA}?|pd&In_8(@= z70<0u(Ji~RGW<(F#NF99OJIZil{Og%r-KJ~S+>7A#CNq__MiTRf9q3z$ZJZU4K#EM zDa=yq*rmCM@r;4*oN1PeavNVhxF5*5IX+;mp>4L$eKzG=N-EYz7;Y%1JZO+$azDah zk$9}3X=Z?7aQcy+wi%ZVxy6rM65UvIcxUo83u(5b*NrzSlgfO~%i0w}Iz% zT-#S2_o{>1X0em2oGnlOTRz9Z>C@~DO=)X3NNQ&t?26ua$!yIQS?$*cPFZj0@>{cs zd*!QRtEwl=id(Xcf931ruYPZAV_Z@wkS%p+mUyD>;fU8sOLAGV*%wC~7g{3RlNg(z zdC9i#i;lAb=l>H29%Q9t@NUasl8)=<^-tJ}ru>>u;q^hsl*5WSj}uca z3+8+d%sFkC^SUtQHfPFj&y?euDe4xzZx6k-Ykp(d{l>Qat#$ib`~J848)Wx%$n0y8 z+1Vqzw@G$)lkEPkxjWkC?CG1kt8Xrw`3B<$YGvQl%J}XaI(Pq&-kpE?X$E?n!FrsN z>r=Zt&KWr`Im5Vp3ae7?N!{Gm&Cez>n%Nj_v)Oc@&;456ygAHD?^&K{2Rzqix>cik ziz!vyL+n>xvX_qxT18T#0E{V&6(st7TqKJF=Gb#E$Kc zZly?c=v>l!{gGd`Xx{$|n#bQvNiS1elh<;0@qu@)7PUM6-DeYNysnVP@iDGNI_yj2 znkUAKo^Vgo_^BKCO+NTr{3;oPJ{G-TzL<4FTbMZGI$PERamKFYI&^JCo44!nt>Ztt!=HHY6E*E*Pg=&Aw5;<{n&*y`!p|w3pG6chCw4_F^Nd>N9hu6I`PwJ*wT|TM9Ld`< zk-Kdof7?X1*I2eQSsr(?Jg!u^JgFs!No2)Rt}8~Y&x=^2b}H?4ni#k8MbOeGQA?kM zEq)TW_{@snZ!5w-<^&{~t=cpzqX+`T}SjUcFSM(kLXhA z6BeE>IC+}z#-hC=!}(=&5S&P27RtT$(}ld2?nYaLl{ zqzCUjzpZG0?$^5Aub97?vNt-vRczno-1oJ8V%uRqUiUdt2Lru?opSBmaxI_TDY~=s ztHs*4EPLOo?EO2%`?%)ybC=h}F2B3$+>X-uh3_r7C2XHd?0s%ibzZslK~uW@p*QFwd07?o+EO5&PeWhv-L&S_Yb1;kA~NZ#ebIF`OLiNZoLR+L=iJf-(40*?|e4> zy`naC+9`j+UTnI(@N|B={(j+okNl3D+C5SGz3cjY;+ucfy_v;cD9r!px}8tNZ;irF zftQ{$`MSL)tMt5OxfQeaeT-!LWK%3WY3ondZ_mUnqvQVB{`omSNkZ+{`Xm23 zE&Q0&I}?K}GUuGJ->Pylc?Of8;J(0w8Ag7h%lj@LF!1HMd?@pANkPl~lENy9W&O%Y z5}b#540?JJ-7JLXXtvEvoMG7(nJ`239M|DBhG*E)+czIKVCN}56li!x@^FTP+i?SN zp5mhh=5wsu3=8BWo^>WaijX*V%z*El^z-h|$5|616xvuHHWe!F2#AqrYfX+|(Gxnn z$UsNxaFT(J*x^S8I&z1F40Hq!PcqPvoZjSpbc0EZRa@!hK@_ zWVnXmFjt}Lj-(jQbt2(y+Q&l^B2?Q#A7&M7l?ZG98`z(H!1U290lf=7*#~z-8RlJR z`>-Y1M)t-YznnO6v-Q%m`Ku>BvLB^^D8Bzj5-r_>11%ytE2%Q!ZIxi-4UQp<~sMvYoX&M64G(;xq2u;)xo2Yek zYNyB4Zm)0!qp3Tz0%v9g-jq^M3-4YnK6${l&I)y{74ll(>$Ea9XeaY^ z&6P~MmNaCUuXFd>8XmQlKk)tZF!>1=C8k`Im~>HQ8f%pDjzG(|sztYwJI)1J&MmB* zoBD}mgUrR)g$s5EIhIdtx|hYe*R-ojxa(K8=vVcr9j~W!yq?-2J;g(Mil_8c&)EgD zr}A!N5N%$&BbTFcx7H@-se6LY7KrEZ2bkYlowvpRaE5(S4MTarp~BV)UZcTIc#Md!S7n0SHs*R=;# zk32IH-08GsuNPC<^@hg3rOdyj+4vr)-7LJOdxZ1Oyi^ay@@E0>nUvED_{;ClV3Sk$ z!mjqEeTRDochaj*KenrHJ`;2B@_(*R`bU?3+rL8j&Z|ouY!e<{oAU7DB-bse&tINU zWKpn>53k!d?@&!`E9&jZSLK+LXU* z8t3fa8q>fll%Z{}&2i%-`)y5yZ(NGsx)iQ3YP4EvwOVU7dvtlJgqn7(l6t#Fj5*`g zMw71=yWDIFF8VO6o7K54sxvR@$3>O5BIR>M+Wc0rE1nHDzZ-1cymI=dI ze8XkJX~k!XOKKjtYB}(5HEwqlbkh6g=v8xK>AtqqeQi(c+(ZxDUvcTaL`WmU<5!ky zrV0WpSsm3%9hWVzlbB)JqTstQ%{TGcS%o`$RPQitaZ|`uxU@;uC9j`Avm1WPVdX!rwoby{K=eO`%wn=Z;CcR~M>^dyqQ5rGj6-V3UhRcsi93)RNT)F7; zDr4H`NjlFr=G?lJbE|@{Hd3!3a$ftI6UDI;-|s5wyS=K(ay573Z>fMMc7aDCqR-6G z`8Y%8Yef93o%?!r3QpN<7P`SKeAD)jP20l?w}mpVe`^|Nowc{T$?AP+w;P-!LkB2e;V6x`5xAv{C_N`}M%fP*X+^R+FPlgITff>B0jmmCmeGy0g+~PLQbM%Dx3*?pD`bEU&v=ezhp` ztKpZnh$V*CmTI0`DtTS#Jy%p=F6V)@wg=ZL3%>Lzdhb>A-Y@Noig8u2&95NaU%|HQ zml%o-WF=1}=rYY*^U&v8(uAXuj5p_8%vpa?X1%KAz2u$uyg%0**i>^rm37}~?mq{* zoF42K68X7ai)+SKDG~N2(*-ISOq_AiQhT=Pq-@ejiLHF`>(d2Z(L`zOLuR3E`D~$r z(GI0YuDv>uYdZ1v#1*nz1Ff?cmtSq1ardiXwN%n~vm@`adv4#CC|{uYFQJ&p;>x6o z9jYHavV|L=i7IM|C^+C{hv0cZQh(``B7D$qJ9-``6{}llgp}D zgmX!x*Dkh>d5xRoA|vOoS(LxR$s|NolF^ho*>uxJtD7!&FSs1OAd(@)XuKem=gd}L z0a;;g*`W#*Kw6Y}@=gWLYP?U6E4# zz-QZXNh^k33m10_78J1_6ERQj+HELmAdvpxqqx+EIjKzszAqYBePVAMI5Rc**(=sF zclQ+9iM`ugqsw^sde_7D&)dH-Fq$1OzHrU>L?36<+epO&jiRp(@D;lpnp+^^$D%ih zYmdVeVJa&X2_J~@Tr?k7iRyo=TRZ&PmiR1AqE_3wQCVT-&04txTnH*SVB{`>a7y zyBxEU`PZ5Anl$eFl6JvfdvWT6_m2NUeb4;YH4RQM^uBxMlm4?Xsp2)JI%`ZDm-1fN zwB_oiO;@*Vy1Z@M<&E2}Z``PU!$KfO_Djy(FK_02d8_g3o5&*DsVVP$iVDmM7EEkZ z_FDPSKIqkxG$+P)%S6hJwGN-Td3esVM90rtmKd*X;68n8YU<--Zg(uVH8kF+WYDkn zm$`hKal;^dh7p{uizW!f}dfd1HEd0vPn)fd;k1_Eb z}#ly}y9V+Wjq&$$F+T^nQSHldG`8Q1N z-zd4igXjJap8Y?3_P6N#Z&}lDC!d4n)&{$qOzHyb2Fzd(B8YrdhaUh#k<&3u6;?n_9gY|x8^sy z8t42vc&BaQo@1_+y@!AL9%l9J=AL!XBavG|muancm*ee8leTS~^ljs%Z%b2UA1~Nb z9O-)f)2Vl&p|;wqtHZB;S-b9SJo76ywO8!d&3Js9j=8>`)pp&SKR+XG&%)G{ut8ZKli1??OT@ncuVx}GggJYc@w*Hb^g_N`>yW(9sd4h{O0t8Bz=jP-TX7} z*tf_?M3pB978P8qN~t)!aDV&1|Eep0zRyq$a*&>Q?cqeV4<}wIZK~>+W7jV;(S2Tv zhQtSr36&zel_I?rQ+fnbgAM$T*38q|FlTw1W&GK!eY?Kal+I>#I4q`fWkd7|&Nr3M zEk0y2x*y=*GWW+;O(v_5mIpc?t{qQgeh-a)ncKCqH>Jsc}y&S3rRWYgb>U!%0n9 z4Q8)4E>-8LvsQYY4Jtktv^;h7D;_Aj1S3N#uDOEP7B|Ny?^kdtIVNv zR+-D!7?ywGT;9X!^(;#3#H^BYvzDZ;U;K2<;^%9YKVP@}`P%Z6w;xQ}e^68;hb6DI zqx#~q{p>%*m3RJQ&-;JmuRa@(LSMz7XPwDPDF-Gw+z@JOX#PCOVAfMz&Ys5eGLs|s zb-dKES4e%%^6hCNAZ& z*&J$H95Qn!hqnLJsq0T^1td2+nfgtXS{`wBb;RA>E_Zi_++FU&{9_uk@BS{!f1**F znFQWOHcoY5XHjGkh+!>pUN!N8)B^TH4sUh-e%N*Y6{8`OiGZ@BGN+5F;>ELU3d>T( zEVqeXZ#$ycR`|B<;{s;S7Y1H0OuSfPk9pobpt6(Q^Cjyt&Dv!v7u@Gr!ux>j?B#<3 z8%{*Dr0_AHUUT$-Ry9k+^PZ^ZdK(!llMk55>#&xw?l@GKz~42^vf)uGpXzB@$Cq5o zFHQA(s;&8SwT9^Gl~Y%*49%XiT5Zni>r7E+Ro0eGirdb&GX6c2lo`YIW4#`i)gD~i z^YgvqKUWcs|I=0|U6{LgiMpA4d`zX7pvQ^{0-?+bE4`+LD0{Dz^jgWRoXMM@vpAC} zWvfr>)-x$v&pz35_G!tPr=>aqO{xJ35t=W~Z3??`_~mT|)!Jy)MRSc#%B_&FP)KoK zkoBTv@d~NHD?KYZ3=7W%3>ceHJ57*^#N?3($w&6G+Rq^W4 zmz)_E)As2m2sg^Mr||FLmD$59Q+wjT$?0#NqMIkwAgQ0B8 zj2$hrcC^gg)i!fy>+GGbGj_Yr+U*``ut-$3S z=bG@Gd%~0Mb-(6jmHexqldPbVY+xhIz&H1THlVuyDbCGRqP?nU_gi^w@xA)^r^ z7Qe-2Uxh1^M&!(hU0NG+N`*AyC-Z2jP13%;ETr+|l~<+p{GZn6zg+o!{g>wk|3$kq zzKTy0{jGmZrg?wG#M}mRgDtFf7V*l~bN1ekm-*B9QO8}t;JD@mmH>wdnx+ynEZZ51 zqcrr+H1QqMeIYnauVbpW%7(IDCbPVYW_gC&-YHz`6J&p5`>3%wy-C^l;zZU-b8c|7 zPVT8t4Q@2|DExNt=dw!;@lp$ZFW=45;B)C&(!YVYi7xl;np6gump=;HbzIC5ESF-KfXu5CX*1E#2bstOrDJ-;8 z*k~u9V#?C^j`|)NZ|0=AkP}rFwuw)9~(rJyZnNK~ceil?6ozrvb=w>5F(Mh4E zlR|AL#oEq_HJ%l`o8`&1-o`z@mUM~&QM>k6*VLci#Jr&V=fQhV+kb`0yoxW}QU7!z z9HM{S>?TP<3wsZeC82JA;SGwTpVZprDGNty2K)MUd=U&eaPJ{`z$?bKSp=`UV>z z4S56Y7xP)pbMpMu72)Ix<=_hD;B$9U5^+|ZxIsh3#!J&CN|Q-kl6lJFq=_#qRMg^F zkEpFUqPpUk`l@5O1`E{SU7La%6XGkPMp-bB#rs(6`8YF zV$N={(VZ}F{nWSxa|2h*4O}ugl7}Nw)xmtX$cv{_9-jJI?8vI{tkFy8#Cj$+)~jr+ zrcay#(j!9BBVzJH?j(d<;^^_7-QzvG_jHucgs{n<%wl$Dy0WjkyhW&FX5*@NpxVn| z`@epjoM#cY&IxVVG&?!B|AqyFVzm1aJ`2v9%v}?hU2imMz3~t&D{|8?Nz_t$X^)||7`8u(c?4?$`JC0Q?S;;6cOM2ooHK%Ojg=VSS$e{JeboOXdr1+poB8zr=ilM}9#>e#XXsiv&|DLh36x z3k@Zd`x=%m3A{6@Fu`COPbAm0$;YQpp1#%~W}i^xPAQ4CQOR4X4pp3udfd77Shjla z^>xNGWBS+JPS{kZY;bqO$&$xuDVN0(wpD6xO1*u*`H%I-6aV<9M1Fp<;`5Wa&owVR z)4cRtd*_+(vbpOYnaSI4-RW>Qxv}jzlkYXB+;2{~eEJ8w!>_l8-=E(9;(WTm0e8M9 z=6sLLIRy>)MYnK>Z|M}+)GJcdAyn2Qw(JN;aI))*jY@ijN_ig_HB3}^HBsT1k3h0& zSE10+y_1gAPFDFdNtJoBYID#Mr{E=rgHsm;r6yl`^62stp-WFDUlN^kSv2Uf=;cdO zjV?_!x;%BWaf4UhuB^CSQI5N!5_h>3?sCiA6;?T`ELCcun(ubK(EWx}Z%pyZ@-@ux zHhkk@_QuETouAn|PouZqMsNL1l;Am6g6C{8p7X`{P0!{xXEwiC zQ~c)5=Qnq_J^s0t9aJs5m>TvmHSA?**v-(er=?+6dBfiNhTYXodz_ngSvKu-Y}#wv zwBNN4ZvH&5`E_IZdFS)<+~?Ky+y0iX=Ce!WvrXi)Pwlfw)~h@h^=r=7H>%Y~y}zvr ze{*&HP2u&H+4l>s?R~hW{`Acc*Rmf+ulKF5%Kdk_`n2`?weM@TDc4!w|NXW~e#3X? z2mAOBvfH)E{E{g968vMM|3r0r_qo4hioX@V*{T0ge4k3ppGhS@vp-E;zw-LNWwHNf z6&7oKz7}$B?#es6gIT}t7q$Bl_UlFT&B^(p=l5N=`5*WHmHXq@^1AtTTlTqbWt#iG z?pw`|tG^$H|34njJiku&*O%-cpTC@V{_>*!W$*od{q=L>EKT=jWu?8{KC|?Gn%UnO zH$Nq(9X~%a);|5)-&r^RXFvO}ex~yNv_AjybLPymw6!fRt9th5%bC`fGf!VO4qukO z&i8!G{CPV~ZHud`p1u2WX77I1pXnS~yZ>vmEqct@QexA};iJgp9Wh;X&2hnN--RxI z7gPMzAyDh;S+|IdanTb7!=ec@5;x2UT(P5YMT_T-C7CTtGN(+b+_I&zrzdsIn$$ge zN}HNW7cKIgG%0t}rr1qgv0bZbyJpp{+U2~e&3V?c;?pB178z`sW4kFs zF0$mjj`(>W^R#8w#+RFCK0J9UVWaVlHzoOgyZF`5-q+SWU~PIr-SmdK>Jf9*E9Rsk;7Bcm1jE_FMfJi^>r;l_RXjjbQ4*q2BBD%Pi<`X{HG3~^K9$sTDw$dP5tG*AKdT@A zb;xbX&t2pnyU4$GQMt3whb*6OSzgafmKMwkzM-oy_3ErsS>DOpmNTC}$8-LiPyaie z{&_iW`F+*#ebx2rZad7oov`nAz`oaum{N9JC@oxg+GFBrkBz4@I!{j$`W2yByQar3 z&M!X9F*?pOI?y#b)Hyo#wN2o2o51%rHy!5YELoTDWM&d7ce9rb#z4z|u{ z7k?xl>s3=?`Ss-0FY4Df&A)e|wrulb!Bf)8a&Tkci7luB3BaNhYp^;;x0^s)gk)hnyo11xGe5)j1h7@yQC0 zs+C?pS9twg>B+vrlYQ0cmKCR4vQD^VoN~)L<(hr+XvWFojJd5W3l>jk(OAaNlqBV- z85^$Y9IhGcZyD`x=^n2dAHTI>Nt9ENwrRk6gMjrW7gnfcUzue3`s6I$l(lNkYtx+9 zhB?1AQ+~^*{MJu-ZeH?SIbo;ynhWpyl%I&npSbj1$JBp9(vNoN7Vc!uT&kRD+G^sc zx_0TrYZpCV$9hWN?Uc6dm~HDB9kC=g=aN}|v#cGP_1_b_nR&jmNWbScyeXeoXK?6I zz?QEQC2lV+{C51YOuu@7pIU&w+9iM0U32`3?B|}bn0&@&@*%s~uWHTCevhd-@Uv&Z z=bI13i%ZM?Eq<>b>##27SHag$?b+dWG5ddgJodHUJilg7?d!{P zZ_j^s|M#B<|DGT3-)B?#=jqMM>(9@xt^Jtv>S_1N@b$~$_Rp&N{Ok5@^ZWm5y7&D4 ze0z8K{d@a=|9klNd%ygI^YiN(*2hm+xpMyfWp#D`+y4Cc$NlF|<8RC7*LAimOZRR5 zzwN?j`HKJIb}0vS>gF(*#S5snoE1LSsbI56qF>^ea$g}cXHT@y<4M1oy?^oRNj~AX zoWs)#Vv`Z@&B=5R2L(Wg${ZH?g*^GT> zdL@gJ-R{gVG*3I!JF_VH*`4}`g5t=+;>hCS+eM#m6rL}BFz@+^y$wwttcpKh+VL}X z$B)>ZEO&RZNX8tR7o#*UW>JowA>Z^C^XW_Yr*Dy;-eW&KM`3!5!1S6A@?47b8f{8m zi5*22Y#~Ypp#q&NU6Wn~&TunXCi%HN?2WwD$Cwrty}c@Ve^c_3xXd-D9#`mXpL5Rn z+ylci4-8MuNuOeR-lBS*=ee58cUaRZxzBtSj}rM1CI0#L6pkCyxh=!GEUtH5eyw_U zcB)O((;IWU;_jZR`tVMNrRlF+^_7pUS5jYR<~7&EJ3fEj-kVnCt8*Xv z9iMb}N*D8&SI&7~kK4@l+YoiWV*C8hZ+A&tDAwHY-mBpM)e8q-KXf)fB!0I?W}m2O zk#*V=zc-VrKPG<{Iwr58Up-^fr@&vUj?WZ6U!*?&d45gko|mOBuWg@t`~RAIKlkNb zZ~wJde)hN8EV~ao-#(cB?Qpzxf6ZGvv#ZsAqW_&*B7&)xmeUxBE(ezmnQfDV5_BgN1u83H2IH@-+(f z*&KYf=+c>DW1UY%y4;)AaBW`OU7YLnDd#lT8|^NcRbF$lPObPlb;~iW>DR2je`D)^ zmll?%(NB1p@L|)!2~!Uzu68@5KF!6q&ow_nYr_x*d(-`*YU z`pzF#Te0QYHNfByL9%<<30^YzZu?6Ua$^3s{*r;X>YKU1^M>hsTA zXP&<{o}YiFW}oHfpVz)jzkNCWolpHv`@dfge!1>`IoN;M@_D}X)pmd1KK-&i{PO+# zKK1q1e;?od(*OOky`A6xA0~f4fBte_|FZplzyGsl{rj5x>-zVX@%GD>*Z;eIo}uKQ zyX(jM!J#3+p|h5*TeW80vNesDLxLHjUO9wHFJHWnjYH}ci*ISHFR!gHZ>_Gc!4mif;groVrinV3E_tvWDafr5aP49_7arwJD>e7ImB zASfm$C?_Z>Cn+i@Dk>=}EGjH4DlRT8FF$*R!1O5+^XE*NFlo+=S(Bzrn>A(Lv^f)} z&6zoG($tBw=FXfpdFr&;b0wKDh}*Y9u3x)z;ohYiH?Q5fdhgQRo7XPiym$TX&HI;4Z`?OFxv;(B;(-$% zF5GzW=;OwVqNk^=i`tlz^!3!%?69@7=S1w!d%KMHwR!%X4W*}-n|spN?vW>&5Oa zd;06^YV-WK{iUyu&9&bC?%v+o_xI-h{{G&srsDs@#lQRI?Q1?gxwtvqf1Z8)uTM`u zhp&&@Q~CMT+uPUQ-`iXJ|KIt3`TO;MemwmAynjAK#r5^`moMAr<6Hap8?R68f4+Tx ze=zR*|A({g&%CaG$|e8TH~ji9f2ZTv{-eq(e)4~A+48URTg}7z3p4c>ZBF1zY}D8k z5K_KS;*j>bc8?byJzpqKYB<5aq;4{sih{ytamPqz1(kM=(~}!JnigsVn1}?Mh=dz4 z30ZiiCM&Rp^eheaY3R{XTAik~JWXqTp4$4vbt^b^rfkt^+_Y^f*M*I2t5~E%o7T?K z+Yo%6`P-{sd{Qp#zKfLqDU_+}GM{=Ae1p^N+^%Eis?n^Cg z&A6+7Z+Cz5>h+6f&!4>8zE$wS8%dXBw%r??Vs0+Xn`2PE-k_~~M|(NTW%WrfrH_8= ze)hw)n)OHp`;lL4M}M*&Wp7boYg21&S>EEd%*`d;a>)!>8VerJbx1YOf2N7_*D^+>ta){icdG65^6R*e0#{%t)bV;ub7saZ~3yNgl9`B zZ|PUvckkri%12ol*zC(FIr?GJ)WzQ6`jYXROO8I-H1&1ZntL0H&K|p(ZN7fy9iyFf zw|Dj4HqX1aGxPMjwYR_L-QHM#eO~kK?{fFbAH4Y2e4J0tuJFZ)lgh{a%<(xrC%`F%DTk6^DDj(ZqyT;P~xd#JE?IVW8{1up3b&57iDD! zBQrOj9$p_G9-s7?lg_5ioOt#u&)KuQx@UTIbb54jd)Dgsu36)=X02~-PQ%Q#Yj@6- z-LPTv_ATsuVSEQJ-V(I9$)Mh)yCC4L#<_1HvzVv8d-3LxOYzbRcUS1W3lVSItlj+V zm18;cJiT`fFJGN2O5JcrBFCKV_+91-Lz}&}GwkN+#H*d|Kl(Afm}&2x<~_AeH8svP ze-Hind-(5PWhQ1NX6D6B&5N3vlbxKBoSYvWa(aB|u#nOrVI}2Bi*FGj4ypMzRb1Bh-|StO#k~=ys~S1W!L(~zRk#gKlAo&>$L6P8}Ge4cyHdpee)LnyXX41wwvu&JNqwj ze!ixO3m0Bo=<40pe!NXwUsh69K5|pd$xEWik5?a?zCLbSQqs>=TeZXd*UgI9o|W`> z)=A#%Yq>GI>n`8ooqav`&ZfM}*LY`d&%LuL`SLZ{+1uaV+Lio$+uZ8%H~01nZ`%F- z!o0uk-(_vK{lC!J?CvLLRVCH`{${fJIa&M4e@9kwtNX`Vl|H-l(m4FwoV``w?rbf7 zzJC7xg3phRMo-tfyR+!&yQ{0euaB=UczkSe^me)X`~H4;cQ^g}JKO#B|Bp7a>&x5L ze0_28wR(TNedVWTFE4LDKkx6)Kb95WA06F2UH|_6s;>{PuI^tSUtjb2S^k30`Tr|B zyF1V8b>39%)Ynu{RptFqbm?YYkfo$#Wn^TfWhASmC2OUnD{G}HD{HFjf+ee#ELpW? z%`&EtE1{u{ZL?;z&Dy0FaQ%Xl$yO7Si@W`VGhS!Be32o@vH88BtgUU+zI}Ru@%=7W z)F*!7^>A@;6J4yb$N18L4j(fk6B9N!w-w?-R~;XTE?Sl*w!&B>v^6R^>Sjdb?Wo%g z_j?zt;J$M3;6cGs3o9#2%ODLu5iTC56%Y8`6s%<5XO$GE8r-oBC|%Cp{qkg*p{2pg zKXS!2d-ndhu;j5YLvr8x{0Z~xH`F_1BqT&61h^DCic#nfcg zBvmC9xdnNJc}10FRpnK=#kr+9hLt6j`32_1dB)X6ItErI7N&Y;hGs_Qx~A5KmImj> zde=Hv2N$~+dzVL7`&YZir-#>ve^2m#ACP~);QxU~jgBI>T)U5nIcK;}(~aCzlaq7x z$B$R3r`5yO&57As_4mk;V<%6ZeSJOu=8nYM&wOuh&$+iV_w~Bm+hy->>`Q;%w|95h zyW4xS|IfS2{_UM5$KuofYTNnW*cW{`aPe?^pR8rgqZ=0|AMc-QSNZ77%E`~q&9N(g zcBZvBU4M>s`Nuy$y~WSP@2hzD>1cPjUMy3%e*C_wpQpBJhp&&{TlM(XR_W{O?(Zsm ze64qOdEVW9)xXc}wf_F@{@(8o?lrf6m$#|<@Z#fPcYitCx=$}oUOw)BaI^aPdG@vc z9=+@qKOeWJ=HI8QpTpP3?_xtonWR$Dhxa|9|~w`odH73r-zfeeCG!b4OPnJi7ek(d9>v zE@$5HvvlXruRDHr-ua`F$H<(=XtaHS;PwTE+b3vlpCH-4LA8H_XnzN9|BAOZhV7L} zeV|9$S$48n`(ma3?UiDz zjdE;`I_P|B;o)0}-KB@zIR(8r0=-KYA1h6s_WJ0W3;ofo9h})6ox*IMli5zb<_R{J zT9#{c?nc(6oo98bmsg(C>)vBK?Pv8`u5Z!eavLnvPXTlucHdK^`JZtb@{?tfj+w|T!=rakA`>U(Ri*GA?4*mnQR>m8yO zDyq{hy8`z=d0>gPTTgy_1BN? zHKOZ_!uFkt{<|yT?CeFI=0~&dPg_?Vz3tukQ@r(IxqmjNUEY1`?E6>S_hjGswXgE` z?`g8{ZgQT~E`57*{p)kJvGwm>ANw3{9{Xe0(??gXc?aLt_kX*?XzS}&SKeg@SFiVfyW6hx z!LciivxC|5{bYBUmP(XA`8H?q=65x=ZPs_iz3kf8NgFoV|;l&9ADD z7q5HwPdxqLA&@yZ`zZzSb8iyPPTL+wt&?Huuq9LC(po zLd*6{O6!=y`e5?5CzH25n!fSb^oz^@CU*P(8Vf9~~lm8s`WPHTd zDD=dEb8&(~rjS;qlv--v{EgdtCT;7QwykgCw$7;=d!64rPJJt!A}f?CEBtiMq$hJG zJzc5!=}HJ|)Gj7l=ZmJ^7j>gMC$4@narqgYkVMgy1zsV0y+UhGh18zD`bX>PpVe2G zS6yY!zS8{4r0KP(leCGmwCUm5Ta}`=EWWj6u{FoW*p?r1dym-teZrXZO29C8qT{g+ z$7dRr*=G!@&uFCI(I}r;_^)X4AJJv4tIu$S&lX?5QDf!?ow-}IqSJ#n9^6*6xb|#X z`z>8R-rE|zx983-zZ6xrbIaSp+}n?@Z9KoXc)t7fy7TXt&&+FHbFcZ$KIb|A4&Q5b zuVL%|p=i+(!%>MZD zPj!b^viB~RH=AF3rRZJY?bhRO#pjpARoyE6nR)(d`rh#Q-{b2I3mzZ6uy*?4?eV?$ zYWF_5H~S-d{&d?v#YZ2PYs>GC|NG_etmX1*^J-&$|GE6+v;XV3nmGQrx|GPxM^QZ6sv***-=Udm?udn}GS^Vnx+LiOmm(|_-{q6I??eqEf|F8M< z_xa`b_VerifBkcO{dD`fy}v%b{@Nd(U-ze~`}gPL>&xxy_Wn2IwR>RqZ^pkb$-h3= zH?RBez2aZ}l1%}B>I448f4Kh8JpI2*5byGH+N>rOOHB)-_82+L4i|gz;iTY?CnZ0h zl>QX?BIqi#e-Yz;p_%bFC&V9}5q~wp;cAEj?+nfrv$mH#j8@DYE3Z3hQFqM34(Y`mQVhIg7*RvCf&P`dA z>UnX~(w93g>FvC-So5IWF+E+!1TJ#MyF5u<90X)ivIxd)QaFeq;Rlg0XjoQuhvxwvJDYReVFyITtPekt7Bllp7s>CQ;)j+@$^J6H1*g-`q(F8yr1q1GG& zt*GoEqs*vX=hoEhtvt$hdX;b3)!A#ax8JyuyEXSl+Vu^0_hqsdWZZjsVbkf2rQ3sV z=Xw2>b9j5>^_`vl*S5~TxA*?m?+wxS9s3)d=QX$A?CvXQ>#ypU`7CMsZu^rR|8I02 z_&C||vAXlLxjeCTS~W*kc1&HqIBafTT&-2v*_k^!H+N1>pL}hu_w53^+Q+SL&Waar zkI}kOwlm}S)Jt>2PnXB8zEiw6>;2bTwdSwB-OsToSpD(A+G)<)qxtV=+E;D={NnDr z$KR{`@5ozxO?dI8dE(~&X>+Q#yg4*kRD8ZqOr=@n*PCsx&zs+^*!cF@Y1!>@@AiGp zI)69(_xrte75~ppWY6!jtEql;@%H5Y`|~P4J-@lUeqQ~zcZW8YPoKYk|EEXq7yRj- z`0sp2#}An}m;dn|3N=DiKU$?);<*GTu(>cwE>f7F%5`#5%M*dbl3F&wKn3PN*FQqN zlLQ6A&BVeDCkC)Co0OH-v1{j)U9D5tHn3cp6=sp`a+>W##?4b1%+`^z)e7zf6O=7Z zy|&VP5hU_uMc1zo)kVeuYJc~idberqM$^;M7O5id-U-PFF>wmqQM7Pu-o2Z(9151l z_|Ls;JpaMY@>g?SzMJ{-RpqjVKlT1c5pfvt1XPOTTalQz8TVv{@N7I(_+o|c;3DmA;TWp%I8>ZG3i zYf#g35EfsND!3w7a7nJ@nqPRb1ue@SESWZ8$+Znrwr#lbtz*l%jxXm{^t@YfX5Nc6 z_h!7=cjHdujy(rknjRiGG;zwLjaM#x?CCmr=G4kJuV&7fb#u?IpMQS+Y-&4t=-AOm z&z3%#_Vm)Vsh74*{q*f>SKroC>%Okid&E-oKCJeC+2IF%pFhN%K2i7kN8<4#f!D7T ze!t>*{!HfkH<|bERQ~_-^T45_4;~%8aOvrXPghTz`ugJ3*B`ge{`mFw$+5dvp8Y-Z z?eLv*j}P6Oz4Y&P?e_O!{rA?-ueoFMcSr5F%;$eTzdJg8@9FjI;rIF0@0Yz_W54h3 z+b{2q-@M!Z`S*Q&xw`!|e;&X3n19{>f8pn6;SPU`3lINeRn(ie{{z?m&iDF%lmr^* zyX<6PG}M!5iT0Qi?a>r1G2w|A*y9RV}w0~2d zF@}mcnoc{o_1eNxvxQ%`J>>oI!EN^mwcjVy+E=8pJ8e!b=?*UGF3wr)owGVSW_EPV z>}sdo?n%4TgWAK3miuQ-&yU((@0Rb779UVnUvSRB<6T0=y?}^+1r-N9Tpnh)Jd8;B zSP}BkVqwap04vF0Gtpo>*>FSQc+1%lw(~=b=Lc<{5w(BHy&aQoZkcp<)3nRGrrq8* z@%qNV3p*n(Y>m9KH}uZt&`Y~xZ*7mgwm;ZzL$u|NXwxm>#+%};cilIryJ1my!>II* zS?wjm>RYDe*ESd2+g@R~p~P}Wjp?2$+f7xr-@a$LcKheu@5R60*O#x`UG=B%@0Z8V z&c5HC|9?mI@8f@W@3-Ca|Muhd{|xi&{ym@Vzn{tW|GpNR-={ygk+|q15W;S+AY-LSQN=i#j{kM7P5w;B*H*YR1*ic+hP~g#5s;a6GG)d^lF`+BbP6t#4IXp94M1rEYI$KUF2yWVRNrORGnf=7cQ>Pb;h+L3h zP+s0KF+3=QVaikkt%gmDR&AQJs%w+ff>n#wE%SP#wKCf=|HhUDb(8q6_+Pqy`S`13 z-VJPRN6fR1?3=W4a`)oR-IKd#8-M9LbNK4r!)FhlzI*xf;nTM--#&i&`t{q_&mX^k-(2BeV#?F%;Jx_9;T-m9)(sSj@ zlbJ6yU(Q@98JQVrDS30}%t}_vpRGGxRauWNZB2cu`c!o3)X=A)S4B;?hHfpr`jvMp zZ*QruFYnp2y=&K=eVeO0S2j0x?pxctb8BtyGXLG{%=~xpVduxn%99@_U!E+y`Eqcv z@n!Df&D{aVGZRw_3rj02b5kp8OG}e^v&?gIbKd0SzRk;j|Nfoao410uecjX5)y31( z!^Op~PoG|X-Tb@x_Wttk{@?kJv|YOVdwah9p4#sp|Ni!WZ(sB8$H&vh{p0QH|9$&; z8Z=P!``6p!+u!f6|NmCp;qT=J=fCIwU0wM1{fd_>{`dWpHwXwe3~-d_oUuYiEDA=f<-qLJi0Mq(vAs}eq6ZJvSCxp zhfgjFo0Kd!8O;osDik|cDtfY9`0R-R^QYdJF!#=s*_Y-_zZNv%Uett(VN-5~O}QF3 z=WgJn%aOA#M^3vPI`4Yy#QVXK7otP2gvZ{A54H*jH;ah3ycA-3E5`g@oc+y{&t3FAJmMxz*rTMVsH#}$>*VC-Ez_<{y@H`04LdCa&Mwe?F(bS$-rwbN+vcubnE26aQA9dv45g z(%5y<^HVD4Lp|oLp13DKy>cOEMAKPB(^X8%O?drzbn|U=ejS^-u|5%yLWEw-&@+T zySQh6vCocjKNh)|$#OB1ECMfUjL1``G0BF1MjmJrtf;Vo_BG)^znUW{x!KXe_S*By0-RL z^z$>@*WG-7xA=bbv;E(7Yu?BI$xV2<{ovF1#&7#GGXBl}U#ZPd|E*_P=Y{c?x=RUA|}4E}H)bKp*F;Sl6B zW-L)UQ?lqxNs>;#65dD=I-g(+q8n2?a_)KlV?o66hGzY97fSXafi@5 zp}vQFeGkRPUUGIm}N)4pAu`0cXmuh*woUYulmb($?P@L)tp2cy*$2fZ@^ zc6U7NE=e#8_=qm{otkteH0f;UBi$=PI#(yJF`2Z+G&pBVP|nuik5-u#b4#r6mRRrQ zsdlix%sBgH$JrtyhD~#OH^uf8#rhWA_4#z?>?hkZ+?UASzRw_ z?UNGvXXoggpSkM9+?850R_e`JtvheEcH|2E*bI&6oHY?St75X&MdhuF%Um0oxi&U; zeRS^n_}4iR?{n_F$h-F@^X9AU+wb1rkbQGY`qfSOm(~(*?WN>xW=UAhl(L*DXFFTc ze)e38`LlP;n7=P(#?F{Id!uIUj+?hXGIB>`?4H=@UD46|;^TMTkNC?P@c&NCmjBXL za(Nv3{I>G^w)XnW_VSAv>?bSO3;Q%k3W%i$wr%X<+Q|6m(3?j}GLsg~nUoY$P?*=k zvVDt+eo$Aq*tveE52qDbpQf^irX)&CnV=LE!Ku4OM}3iw{-Q++i&iPDYHM7f-L+D? zGgG5GQ>#0BWk>c(uNNykU#;+dmFe*^`w;II!M0nM+;({+$1drd*Ryip8c8wM8PW?1 z+cLPFExDB|y^|}olUcKcdwMmGUGw40UzgG!T(}{ia8pq6wy^T8R|^hjSKY|0yp>&T z{i4G9)i0};KP_MWw0_OLBY`=Vx9JW~^W9!2o1Q~9y@&VuDDCxKTytj8-!sX73JV*j zeRK@#RJ`W7&`dLN+scRAG6jEp@u+c|603I5PFt$rL|^HN&eAiz#izQ)TtpVpoGxbo!JwWmL?KL0&mgCj$SCqs)XM~^Q{morb7H&dTG zSD*jw8jkmCc;2t;db6_c&05tjS6%r{j_{cs<26_3*{;&JO|^HMdVlGXp7LdWB};uv zmivE8@%fhG_chJ;YpU<}bbtOQXLz2S<9T|PPy9@u$eDhzv;Cs_epB@Prs?{J>iCDR zI}@_@T-f@vSJ#}sy6*h-+%wm6^{(XWndRu3<>{K{>YKjTF@L{q%bRsu-mTsCcI~$J z>q}+Ul*{Fn$mW*G=YEyR|0HR=82!1FLoc^ z*nRlp>BXI=AD=w^c;#y0gkP^xp1mrWmhtXa&b*9=ziK9Cy!@5)^HHv zP-Qe?)HGtW*r~v@pusbkLs7FeMWZ!!MN43al15gb$<`Gzy)$fjcQCDGY4dZM=;t*v z&TA&)!cz?a$xc}Yil#GDx6Vl28W~`vlMx$cX&Yu)YgVb_a0hC+Ps5{6Hl&AJ-a;h?D}MGju#JEzr11j`j&O$H-k0IXAU@? zxDa^ag6EABkvDEc9y#KAgRp@jIS0kGg3ecGTWa*C0+;!%^8J(pbmUTFF=4 zD0cdUrQ&mYd(R#`_EhS~b7?gZ2~{yERZ&TG@!2ZVXDpjGYuU7!OQ+6W9{#{ct8ixM zw40{WEVo{({A%`-_s1c%-HXzGPYP?lWOn>h+44_(&rkUsSi0-<)?K&PE<3(<+wr~Y zt}otqe)Gcnn+p%D&b+X@^2GMi8{2b_>`&HNP;9fI+Gs_(){=ayCHZP433@pRdNmo0 z9TIU}GLcHJJU=UZq4f8%-`{-C%YNAQ{a^0=zqkLjmmfHwobuu0-wVPiKVBX_ zF}t4mRlQfozx6v9JvYv;SaL+Mz@bUpfnm~~OOt9Cg18<`XMFHyQvsuh6N9R5$274i z&WE0)wlMH`Ni+)ux^!!t?9@8#93parA(Tg9-7<}J%TyNfX?SO?@W@)_k-3toAh)!o zZ`YP}Y(f6PZt>n?t9y+uI7+`dA^DQ&)3GWpwO)Luk0j33;hC$;8>`cMca6`THNLhvXKZrL?9C~R+a_jL z;Vo~iZC{;TUpG*Kx#ECyERxml01p4?C z`ows~)MUmuMb;!$It95V6}cvPr3QJ021SJyMU@s+`FgqeW~Jq3h2=(-)mHh{R^=tT z#U-aX7KbHzmla0y1>Bk#eQRR)y{Y^mCE_99L_)rag?tqa`_AlY%Is>|d~~bx(NbsC zugVUYk0T^6*aR|e@eAGN7rNCqeCzp;?dPwQoMGBJ_dranxIz4N+xYu?1MY9WaAEU} z8@q4Z*nWlOi@rJknk_u*w(+gq%Da9$v$C}8;@Pr`qvs|^&wYG5_P`Op??>{!t8BP# zyp{ippZpg_8Heo8oPZpj6Q1^rcXZb>gknN zPrux{%Cn))ba$QY_CnkJg_}2&Zr)P5dr$4|O~u=HRd3%{y?f(eAQP~{JDQ3(}PJ2 zG7cV!0zsE9G0150PXBpRZi?fAlqDB8F$D3oPH{h}u^?6CNs3|7rmjyKs;pa#-27OT zm#K`2H@9i7!9UC9byn1cog2kB&R;R95 zp1Wjya?e#$!wbfyM`lSUp6%r=RBIDkc5K?RV_|7(Vb7LbvoMxEaOlo8ru6L0#_gN7 zY~HqsJts#dH&^y!MY^@MI6J$!yL)+hx_`R3et5XNxw(9KxjjFBz5jWJ43)FiCvIEc zIIe!=y7`s!`e*Lj+bAd)85kI8bO^}E$Vy3xi;2k#PLz7uYiXwl`QB%`Dx)5@vXa9~p`}geH!D-tTZu|CdTi?XKa~J#8Z9KQ`j7sj7N;_3vfB zf2IBUo!;2kxU=!#&V>tE6H-z*C8VPnj~x$JSG%UBe!X$!%HEfm3B_q?#bssOGiKkO zH~ap~_#2TCH)3P%M918Uj=C2gXBiP`8xw0C6>T4P+am714WrpMKl5$==G)Jkm7m*I z*7*6Y?V`WkvJV~ zVja(|muu|Ke(>_svzM>Foi#1^{_WX6*@E96{_$1(Dfs{6;lr28AAUR&e)9IY`h&aA z&EM~HxL056{pH=^?eWde=3iv{-?d`SL;s{tZuN#@;R=UlbT}tQE)(h!@N_lyR5jLA zE!IqxkqOx7up-K9btI#alv%@?Wx8J6{g<{mXWu^kl7a8juD*t*d6S#w8N1z&6nwp? zqcqg0AlR%V+^{Iz^jnDW#}MWQYZH{%`6zg1k$Eo=4;mEvo1`zbz#b`4O@PF*wWVVXtvHj$B*K4HYVKvR$+zWZUzePI zUo!r}+<+UCL+(tEximk@Y(|*flt9Z#fu^%UZKs7A&kMGm7;HW>+?b4VibO7SHPuh0k`&rT-z9Oacj`cy-{~}$6ekYXucuTe#c#lEtgI9+_u?u-DuZ+ ztFjAbbvNt^uNYQdu`In~T6)R0)~jY~)iv|#d-mmq2K9zJ3QV_Dm~N^u-c@A0t;&2~ zmHEax`;Gq$c7EjW$+h#%XUt!={r(w;d*|K>yxljO`P;qo@At=B{9w?Lt7Dng*WiEp zxQlvy6r>Ssqkmz=U3cMew`M(_>DK^`8Vw+?_TR&yl0#8|KIC_ zhs_^+_;~x_9TXw<>08(+?*NJr!#(^c=hAd zs~-zX{svYtX8d)q%$cyqv7;$byoF<3pTr^di{Xu`4f8&+*o|!$mSbYRv)>u`^=r? zcMfeobZGmfQ|nKi+J8%J!7;T3V)7B~{HwO}=aq0|7V+ekab*{FW|a57DNrw|bSbYs z`mOTl*WX9@f2i>MQseur%KKZj|JU*!)+K$+jhT}hUru(EyzDsh^1;Z>iZ_cFT7FL4 z$u0QPdm`)UmPJ=zJlc9=($^c8dVg#>+wy7ck*>E(PR)I?Dpp}@6~D*&oBr!{|J1-^zD8*S_4j`t9EJ zZ+EYMUA^LceTGCuj!Z?4R85v#)n%hU%SwOb-hQ$B+r{#^kL7nAvoGif&t`_HcV zYqpzj=ItMb{5k(36r%1l=`h~5pVk>x)^I<(ygvT+-`d*u-+TAoH~(IL-{wc{>j(XB z58Ib@l=c6+!QA)%hPstSqs+WNg(X~;cE6y#KW?AxBw#;N(DAFjLa*?IZ3>%29HJPTJhD4_dKdJp zUBDx!#(m>(z&9ricEu@+1#U$~@D+$oEEf$dV0RI)xoZd!)Ybk^Vv{g@sZYE5%fnis>wsW4g}an$f1bMQO=arHQu!jjUKC=VnCSm0(yZ z-hHXt`So$;q8ly__Y^!2Do7^J=rZ&QHS!BLIvHSiHpujJnDP10<4-dqL^7hpG9pDY zqeWjwOn-4}%B!2x7=QiXS`*vaSi5v#?bM0RTQ?^6b_UN~Sv+^9ck|Bd#jVwwm%4XP zO<%n=e0Fd7?zR5x_qGeazn%L0dhYxCZv`$eTd;j&@^h>`ckr*CB6CCbiv`g)CRG2} z;C`ed{mF{(D>KX!@3b2{l(u~-ZTwQ)_^G({Q+eyR^5(Jv=FBX|&NDf37CUl&KG?~v z*vY-nvwPu5?}wVF1y^cM%v>Fqncec`>x-VRGtTthIMcgh&DkGo*0$s%SR1BWYo@DP zmWz9wz3qMWzPI)be|?J+I#w*3y!#sOY?^#$)8#!~n`;()+Oy!*q6NPeZTPim!?R5r zzO7opw?l8;e!aXMnwczl-m~+(XTLuc_3m`^d+l3tTDRp_S;;lNI=B4Qy5&-fZoM;i zh~-}*_oDXlh2PsYzRwlD@PFIR|GB3R?7nueJlFaCt@iuObCoBo3-tJYqg^iHkF&nP z$A$Tiod2t&Byjz(F!@`U@$B&loe!Bg|1SUd^Stxu`N`e$mrvX0qhCKW@~74AU!{3( zr8jK&mz((b_oHXum!5rpI(k2&_7U!a(&xu-z2h(V`d8}8f0q@-hyP3dU|o3d^W-gR z2fD93a?SdDD&zC1S07Hk`n0g*=Y^`8jM_R&9R-Dag#`&34TeH2BEBqBeG*Qk8HgGy zhR!iqkf+I%5z);w%Pgs3ny$jSUiD3rFEGAg^o(V9@H#Kp@Y?#|*SUfb;+f3hOBT-V znYg=WWBZzo>Zgtfr@m@6`^@&_Of5s@9Q_3e50@vr?BB@6Ad<^8HK%FH$Aelw1VVos zn6?*`9``6+uHh@*w9I?UwCtW~(QCF<&)Md_r!T!}UHYPR;gjZ-Z<^=dwa;Jcnm+IA z>3ISZ5+x>NicHCsnUgFvD_v|_zFc5Ox5kzZt!+J8+q(2v*Ce0HNjjbTxPhytW@)U` z(%Ph{wLx2*i+YobdV{m(7Dw&%u4>M9TO1v>xjL-d-EVce-|X->>j!i1bN&!1`6*KN zo5|I-?&#izde8awp7jnd9UN{ZB>W5rI2us!)WhRyM#k5OjI$LHZ(S^lrPaDy(`~nw zE3eHL_IQ8aOP*nyFS6Z?(CcUv+wTDx80F%U6Wy7^TMKv#j1aP!@J4mcbDf^ zpKmDtEB>Bc?;d|_t<1h(7FC}!-#q(#T8)j24?B%YCaa^xVAA zbB(_DCi*fKBptVK7KybGiM5;(V>$J%#nihyLu_`0*z645yW{Gf$}6=MrZqoJ{{Gzh z=jT>t))FSx(q@*@=EN$+h6!~mCe+O^Fq085><}>Q5iso%G3^pER_mB8aKtxR_}BQq{W#yS0{He(?(y{N0%p*Iqd4GZR>GvTa&DIM3ejJoZhmNj8E=- zVqooOVt5?7grh=SyK=h5?*)iZRL-tD}PO8&iW_XQ01VyKrmvdWW-X@khP*A zi)CXL3kR*1j#@4rwp>1Jz5Klf-h6|O41=Bwlb#%tt{kSG#R_VHXVqHLf}J);np{Yd zyWG^BxwRvAYftv(uKdk@8Qc9{Z182V`sgXJ`-$EGyQQ}oJ>Hi2ye;&3UFh|?)USO< z%9ovK-*%>c-JQx?@r0py-cIMZO6PkH|2Fs^+@K#|@rYfd_lJ1zFY$gh2G!(7)nvz| z2Pz6~R(RZW$@rNPaWtjkX^6|!kd&(>AzyhGvd!pSH@A1?+-}xa&mO;e_V~4UL(8w$ zBWj3yT+tIb@u#!mPrr*e{VwJ-byJ4 z(?d69ecr444g3C|(D>T)aK52aoY5gg9}bSqU$oPnXp7AZU(=wYDcv=N*Y{MP+S3Wu zXBGd?3Vvv+-qzziu_wB-$9?9U@YXs0Q=9yIogC%{IW!9`b7j4}Oz7G|v1?1kE-n^i z{gQcP!Jet6{!YXB@RoY6+wAGfWtF51ASUk_z@g!^4lgypZ zvUiKV*dh9Ahxn^1k(X5>uPdi9{EAyD@ZL!0K`@`hk1&ZJVN$;sL*4#eZ76i$O^}L6 zmkLQ2i{YQqZo;tRg4+S5Ehm-MoSbw*YmejxHl?VXh7)49PlVlG5oWXSY~O`6`Md7~ z?!J?_{7~ZdLzW|@R?Hvg>P^tQ&e9RBbm8qhmX986RW`v@dxEO=1XtGvRo7nr#jyWN z-2r=Mp$UczEKD<*9VZ-2STsQ=K||z(9M@?%zSEL@3`OnApWPZ({0VgWmr=r~vaEoo zL$~RODD&e&)yE$lG*uSnFnQ?wH+T4J|Jz<>()@Yq%{;pa-faUr$#_ zS+5|nL`7u1r^ZQ-6(>A0G(0ji=Uoi6TfDsLn8V*Wjn6EV-xjOg5(;lE_-%gPLMAC)RR%DR>`Tx>Y3(h(Jj>EDtdBN zTgv4Ltr-h%ZoT+sSJ9hYpJaY<$waXFF}wOXyZR}s>LsV@1&ihxhvvTk7LKUHmg zub6#Y`~A4^1A*}uIJt`r8+J-@?Ud%MmgugS)lo6Ct7>-V&l%mnA07Ftqr#-4%CttM zdCk(M+y@J{eK4?5IuvJhiP5uQQfJw;-qMM^#jZzpFBZCUu~Y7aihs$b=`mf?V^(dC zS=C=NYkkeG^)+qtYuffZr8PK(H8_=;$Gd3gNaKn7H&CNxaDT%nxmO}u2wGMEtr{8KJ!h%+*d4jmhHZi zw(D+sHADZ-xbr{l*0T+W$yF>l`0+_~rU=bqD}e@T}P27NkMbn0QztA}2}Y;Y^82&Wv*>cpPifd>LvLrT1TRYb~TUJ{-R$JOude1&yx$f=e2X0H>vX-*6m}#+dhQ-cVJ9o_7x#Mw+Z9$%# z*t>bt-o=H<-D}voyuWw(`nA*7uiY+x@A&<5>Id$bUpT0L;-dWxO@$+>8fQ!`?%0}K zQr0a6{Lt^q)8Wn4FLGo>BsMVmc#pW z&xsR#XU-_5Ja>Km7um8+blX<(t>t3nCDTgErk9mYFa194`;9>%|F3Qxxb^G7uVWW}9sBU?*@?ygYg6<;zDmZ(jQO^V89zpPn9lb@l11t56d4kaN36mzccz7u;dEmjqq^Yah?XoB(<$^|}rAd@y9N%Jv^&DqUCr_E$ zdH9o-*Q!;gva(LS%F>d0wMt4VYu2o+s9CRWMM>SdHEWmEtX;cq{i?e4>(?$ewyL(a zh~#8uVPWTBV`XFGicskwQ%&6~Gv-Ec7a#;wRlZ`Zz&S@Tvl zS7uI*?A(ujdf)W&_}0DidpED4d-?Y6>Dy;-@1MPW{qFwx?d#_+pKt%*sr&<3ffvFY zEI--Uf3vdxZf|30X=7_^XLW69cX4eKT68FhYf#K$o5Xn&JK-^4vnrZt!59nd@=I&#n9U~W3OKgzJE9R{@v?0Zr{IQec_J% zl{@x#j4Uo$S==(SVcXK*Q{LlO(&Jmk^f)+HI5>9l<+}&2_?-XZ^ZrcE`!g~3-_+c{ zQ}h4Np#z5=J$Q8K!lh3aKAkeyu*r&P%{s=#*{>&jN~jkUCnwzZGmZ4tkFN5uX; zcXsT$vuEF}T|4jX+k128?wfn}->%+aT~TFG^SR*5x0gTeUOxGI`*Qhv^J;6#zrFnX z^Etoxf$9CzneF21+4tS~^X==id|Fe7h=Z)mm z&FNRp&%10>?f3f+>)p@dU(UxH+0`HY@ksPDchI!y>u<*GORM)h_OolwYf)ByO;&x) zr3bRL4qm@h1K=-sj^)$ouG(+*U!te&yJ9AwR&2_yrIrLI@=&5$mccxt{xH4#&?tuHU(wzw^1--*B+M z>0)`;$?~q7`nYx{rFVBTB!WlY`ce9_R-hsH)j1vy8GqovX|QXp3aVaZT@@Pd%m~# zWv%OqU;Q|{^R@Z(b@J=(+TW?F+wuJ$U&WWd4{!e04)|+a=pga`&=>JEKcO@|A+bE6 zuzBe@d(PkZF>mu{`{x1`2RW+`vR0qe{WB^0iRk(p+Hr+Jb&qDuQJBNirXcP#iTiX= z*CNfMPgbaktWXure0XXLhiKIjtGzvJ&1=+@y}CKqo>f_XSZDp|MGKBMT}(fkaB~U| zLs_aapQy55sIZ@Da2{{5oUhFKZL0J8rZ&v$ZLpI|OVCewp^)=LBj?SR{^Gnx7W|yt z{+{0Yp4$1E+3`Di^$%T(my&PT!au2y!_l&J;oQSdV;4WU%OTM((UZPrQuv%n<$E^y zFY5ANv?|_c!L#|RIRhlIl}ts!W@$5;{YTd1{(wXxhrqXPH+S^!Bn%4@{mInLRT!eQI$2+}jD0@25mx z$O*ra6@TYhz^#W7*ItHPd>V7}ZPZ=v9oN6@zRp{5g}=&-r_z+K+PwG2ww_f8S1Oxw3}t>5)q_;p2@`Dr;X{yxMT_>W#_S8y{yEK7L&& z{QBc$Y0k;gox!smE`166bSCW7o3c}H{BGH7n7wbq^o={F@7yte=a%`bI?U`h?bpgY z5qP>z?%$N{Wi$4dP1#=;vY{?!M`6sC%Ah@!L7PgWHq}P$Dh}IL9Ja5TFXT-u!_?p6 zp}(hJWuGwX@akKKSMOS!z2M=GWe=Y$d--MC&o|qi{#p0+&$_pd_Wgad@A0R7k6$hP z{A%IrUkhiic>YZA#opRCyKCRL-jq$f1X@6e6eIkA0%k6UG z{QGD3Rhxf*_xI24@7(Y2>+k!&;mg0npW6Ag2>z+thVQ-y6>~2?2N4H zIQB9~?p2Uv=21u&X)@rPY}`4)xI1V=N8pC8;0;~@8$5$Hc?T9LXjm>?xg%x8j+B)< z0z+&vvf?T^<};bfx6O*5I4i!>&0(gSL#tcBRJVX$wq<_WOB}V=xN5KQRbS<;zRF#_ zZ|P)%AFFLsPcfJ$J3NqBQrP3+?Y2a8agXU@oi7_h)I{cS<{no`Kd^hCvbrRNQ zbM7iM-8GnWSEK8&#jL|BZI?~@F6;E2wrMZ#a zcJ+4Mta9DgWoxCs<<91N6V)ekt8cEA-`w5j?o^$-`&-Y3U2iYj`kJ=&wQhNTj^+PV zf5)`^9rN<{&FOMZY4Xm`=N}TAcWC-O7oGjRF_q$5e`)`(`v1CKr^&YZn&($mky@e|hqCB>ypmoCLKm#CyLFmqZSHZD4r{>10}iJ9{Q8FXCMoY%N9 zFL;yl3X6Hch5Hsft8zU1cT(GTRo(mAR*m6bnwIo9E$KP5ex_^u=8lOQy(Vn*oV5Ay zNy`UM=3Ekq@!*n^^pcD8vNI9gFEh1)X{$n;n@6Wx#LTdeUO%6?aZcTiLG6O;j&~d| zQskXE(M@NQn$D(WYcz_(O!|D!O^Q9&6?<=%^T9UZ=I2Ll6lz)(Xj^{Lu>QPa$A^_W zKd!9i$f)AX_<5k@Pr|N$PF0MDel;rHNDypJ2s|ucxH!P@u|eTu1J20>oR>K~H+y(~ z*3gt;%yV>zIO-97Tq*Z)>IY7Z-zrm_jc#d%p0o75XX<=VSNQR~){iH`zMNv6QuAqQ z?WfQ`T#Q#6k{onbgxIbKQC<>byd_3^O_22-FZD%H>WkdWH@WGr3X>0NS2a>#_}ZX2 zQE;N+l7lL{4vKVSny@F$E+}-^>}qqwXx~wzg-2g4KN6O$u<|OKN8V=Nyu-`4JPyA7 z_OjKR%hoc+R&$MZ$86diTU>RgxZ3tpmF?%>d$@kpaG`7eBn(cw*Ma6}LKH{5pA~ZRL+;FI%3?TypK^lWjY%eEYej@8_3utv%;j&#XIo z=H1aX^OnAuw{*_ERE6#Ns_XMr_t$StNZ49Xur?!OZ%W1Dl9a_YIjfUuR%azGuPRzz zR<%7ZZGB?d{=&TdmH!r`KHO0HaYgRO6}2ySB>!BJ{d7t8*DdM17O$i2-`}=)e}9j} z57nfI&>Qnl70OtL%Z*rHGdX3J3L%1~$4Qstgq8yB^8PFmL4wQc6A zzMZ?|{G87_31_ct-FnGv%QeF-7frWaH9huv=8c!LZzZ06!+S=Sr?AgW%JpFmflP76UpQb*4{#-=liI~_kadGh}Q$(gupBge{dU$x~m5}i3*RPtH zTroE{-C|UMAymHZF=f#r`KMqcw zy!r9v;>(-8jX$40B60ES)2nBveqHeZ`XzkWSCp5g2N{|o`%%q$`dObi?h6LxFb+1%FL;>5tf zz`)GFAjZJJkYAQsRFs*Ls-Ib&qMuuon4YRvP?XQj@hP0c_=<5t+JyvxBnei53kMFI zKfwFk(pkgJog*PNK~5q4BGU!~10QB52@l4}J^$xQ{*kO{mbn|N%yugA3nQAXY5qy_ zDj-{#7#PH{+M0o4ZIS|yMMr?~6$fU4-)xq%zPud?fHDYeJcDDUP_khcWea5O#OC&HtrWj-i zo}g*}^-HQsV0G)nvULmX(T!H&nk-Jh=n7O1Acs20Xg6F&`_-fu<2TxffU7HU8SPFR(I~^+z?^Z=7)}v3kd2ZCrlHPb)6Sz$kPRk|Zi0FbMqK&B|V}qfMdH z%;1A@!Q)GZJd52g3Zgr`|I*69G)4x7UCay&7-b@;!pcdk)H6y+jGg2?sYQXO?Ro{* zwaqiK_A;(zTBJfUxUj*8C87J9e7 zE^P&~P*&}{la6jHzN)^OGT}0B^sZp}&j!KzYyQrQ|0-~bb7h>N$*HU2Qa(|>H(Nh0 znqmC;hv#zZx$D@A3P+d8D)ZNVS#5ua|wx z%u80DYPs#VZJHVT73+VOU%D+_JpcZZsdl@!U4H53I{Wzi3&ru*znJ}JJvAlc@HV5W zmHRH(qqZOVS-*VJ!4>xfiA9MySaZl0J!g?-8NpZWOc@N17>+Br%kwYVYH;a{Av1d9 z8zeIJ2QV-&WH2x=fa-fte8U?k1&JjYX_`^T;HFk_0;pG`$#?mzZq|K3~n=X+6c{jAfkpSIpNy>sa5#+=A9o!{@D z{{AAUclP=HWtsc_^Z&okW`1`2{M6H%l5akLYTEqM+nIrQGY?Dwsz*)dFr))vB#j7ok=NxQbtR;K*aNyLwcMn%sxx4or3bc5o0HqIHoVd6^ zq|d6L*79{lY;Jl-&v#=oD_7QTd3kLQ+jNoOyL#IE!AX%`!eSyd-rw9 z2={Rw-%^%y(r{w(A;X6=wne|~QLvm>Hph6!lZclu*7Tiwabsfg5ks-_tFBp=J&`Ev zIl6h()@1j-iEEENio9C3`gCp2o#PQUtD`5#_*}b6|Z?7tTjF$`=&P`vqIpg;L(d!6(5d1WHgv^AV%i#hX-p9AC@%{J8o54 z@%qZcwZZM%{bb8GnAdGIS*KxFU)=SW>%qs_!7||t{rBfQ+QC%ur=(<$rRW23)cnD* zXW8r+Q2xNyzAi}1L~D2N`VR)?WVUUL1xBXmEpIO0)Twn03=GA zBW~#$zMJK<{FvS!^r(9=@s!FJzi!53F>Jy;oWEOa7k9j5Ti(BUwv}80XPU`ImJrVs zLV-tv0+03HnIiS?9rMYCLu%n~_y4NbDXXwU4aBUpqw{grUEr!K53`hk)?MtNs_Qq- zCePHkRgFmu3=H!bu=IZl@^cfDK-n6pY0=*X-4o}1eS#P!&D{Bt zE2fQ0AR!=eM%Ka1fW(vuCsJDkyv>-qB$v%BlvF+v#IxX)k3f>=vIIk6ydbi}lb-n@Pdz^k5#wXm=Fk7nLODptcGWcq-ujWpB0kg|kKTW7*-Ou>KyV z$wi5ksYNIzrwJr7Fov6N|H0tx&6cx(arKK1<{sv^3|URgIy^jrK7u|5bzC!2{+vJX z;QRxLC$BOj3={kobEB8ycQ&1Cf_Vs|3NHX#i#rBcEZugo;fz67nSa@K&>V(YK@{be zq?To(hE|$Dq5_K)$0`ZIhQbB14!#8qt&I;^1gzM09{VjNX|SZhRr0^F!4G2#tIAe3 zOE;bk+?m{H5p-s+QlT-_QY`){$%#)!voj$GF`?AUq&>6!;S>UfN$| z@^F$ygkl!O%s+nF)c68&dfne zCunK&!GS{uCNQC;7;=&U4e2b^?AVPv zuay^P=A`1zYc1^6zjom4dvX-@|8>9_l;y=GrFqzbQi|h5zrX>D3w#UI3K9|%Rxmh$ zheeXP+e9{KJg#SBt8Z)g@L)oKeLrKFVlH|RE|h;RgwH=ErFcsJ7WVd*UpUJSubbxW zpBNYzPBLR@)fE=!@x}1}|MlOTTBdT2 z(=&h5lY-l~xm3&f_oYjw>o9-6+m`ukNt21Xt_S}T)t3{uD6Lft-Zk}mVj16_L#sA& z=^SJD@OGYzcf!+~u4T6-S~3{1GYB?DUH-ax+ijWIj?tGbw()E;JipU?SLu`k=D$9~ z*QsZU7IIHH{&ro_gi}551-Y~4b9|1Olz;Ls&%{ZMOmCWZYT8|#6#OIJuH;PI&E0|Z z`l(NEtmO-xkjxYFwbg#^^e=VsFJ&vP{9cxOn5|}mZ~KCke@(aX2wj_)l0P|j%hI)~ z?K^xPSMH6Jf8Sk=RxZ3$Wc_-Gfq~&9BbG|CC@~q*Vo05ER;Woq#O?Y=ku|edK3udy z$MZwF+scz$GM{FD`Oz4+>++FTJ1m|HFEOoY+?=4EFsILaarFCjoEdjRl&?K&J5qi6 zr_D@n`!D_BKjxiz6k*;iXKnRzMuEn`Tgy^3sy|f zV^m-WJo@#|_5|y+`OoexnZH6swL$15@8=l}`;V}rmWCUq}1Fo4>c z7`0$gVqQvSNop=yQzpovLE-uXg>Z9)!@4FKM)$7YKRWgF-TTK`wO+rLe3O&FmsZ63 zbLRompF3L^Obc#LLiXJf@#mW2QDyQ%>S4s2yfQC_+U)`;b| zFflNYNwPV@@pyTI=du4hJpY)Vs_bGyOEuG;C+6XHH;#TbtVPIb!DflOMX17g^)+sz z%kxXp64O!AInrP}d+YD^9hSRpUE}{oz-Zi|4K^BQM0Tx}Sc=o=;>4odd^{0p z&Gz#bJI;uVe9@}p%D})7j%~!DII%1>Jux>GB`X!_=$^dJ>!;)WG$?@M+eiM7#a~K8 z8JZ3x95)EpV`kl96L6;Cbb#Up6Jtwht%MV)OCC&{IeiB6Q|SWqx-QE&#zza9h%nlf z#mO0oMd%YU0*Ml=%KR1#8x0m4DEG`~QUkYLh0__76IGifk=q8K=A^!F&poSGZmg@66pMoFE7;Q8coeVr89Unq>^X zY`S=~bqo5;*2()a$8g6K*crHEYPVI}4&1%7iM|ULCqjLQnV{2)^2c6M_xo#h;+l;kF)~UCWob-P%D)q*Oitx^3zao( z?|Lt4A2WHy&zUW+q*Qz#O>%Mju=bJl(cAl%#LZ|niHvPNZQ8&&qmj3uPjY&x|3|(# z$;+PZJ*UYK{b0}a-?`n#S8e)X`0GL6S$Wi;)Zkh&6Vx}p$B3;Y0ClgxE%?-aU%qAq zf!6DXHFxD*a$8Za!`V00LznTA?)Uw!q04S*%&e?z`Oc_pRr>Qo^})P3vHz|wiJM{b zZSz}$j7?FNMa!at3Jq=?_O>-ly*>N6z{Sgc(O=x;`@WgH?&UX({Ih^{hn{#`qM7$p z)-`iegP(=EShTsaW~bkr(%NzAn4q~OQZKl@jDU(^=w zSkJL)$(>5an(9Y$FD4h|+a~d7$LH5<{>=aAX=lCloJn(k-v52}*mi6G#T~zn)T6b` zqa`~p2IEY}IjN}y=m{wy4K{mJm{w3)-2L6uAhm%}tnDGEl*EBLzT&S3r*QKzp8O%P zkkk0m!N?M3MujH9hs#A2>`oo{aewB)gadb6{LvHKmrH+N;4VONGRrdYbkTlSv{mBn zqV4ZVuiMYaz~IA)Wxx{DLo2B)04L_D*Y5T;83?dG$gbpC?^|}+@AQ4uO$$;SV;sK! zy`SR9l|Jjrve%)lKbI}F6?(ba!tUwv4!?_n^NWpp(=4Vr7tfD7yzEW>?W>s*tA3fT zd9_Pxx$|AI>4uY%-Zu)$&zlqeQehEGysGr7S_{9wZ=<%}Eed^Bxi8K){nV?@z|4zD zFZ$Y+ElXHt`O5V5q==F|W^aT1on}a%^hv&wo)fm|#nQEE#@TI=!D0O?Pb_mT-aR8S zbFtB>J0W`)b4|(JaVR7xddmyB+nc#`X5?l!Rc$K&5wmsjLLm|D+3(-1UVdX)?f#21 z0!0G%*y~uoZT%N^w03Fqk1v1LXcY!>En3;VN@3Q{6?_YI)*2eAyv_YpX>xulm++m6 zg-@1va)kQLY72O~NGJKd=4}DZjNfi$0;jkAH@k8tLg}DcOUu1&v;T^S-|`9FeknIG zDYD?vB2NL|SQFkw9Y@&vA`<7{kS<)<6}V@P#nBJ8s$ZUqIDQPcQrxwmLgQC)SMk?? zFV98TUoU)dUX$;d^TqkWGHcow*)O-q<#(<3E4(H5%4ag4r?BPaCC-G1= za6|$lYQ~C^2=!1dSlxwPuvMAKP@LQ7q!|zZj}Ds{nO$X z&X(iOBj2av9K$Hi&&V%8ovlPGe0@P9G6Dxh4nBGHOiVr@>%asiu~hKzr@)){59J?7 z86MDEqKlqEu3uWjiL9ch=8_-|}5 zgJ;I<7o2GJ-Tt;y4pypS_g@Y+|G^8^l!7vzzVD_R5*irQFbmd2=mqPc13%_BI@V(= zSP$IyzD2+#*nCc+OT-;mln?o9I@Gi@f?6>D8g_QhLr=k{ChwYVjW5oVGq8op0p1TM zQKCF?$;@On29^d6x0d-q4L>ZHLF0dy8H2j4v-_CSwbe1H2X}<=>2=gNh20^2H{JZdMlEc?t|DC6fd% zmXb+AdToview(p{0RfvIFm)uj{Lp0W;5P&v8CV}C%<(aGOky{!Y=Qqw)v|v$roZPXjbz)xMVvGeQy_#PR z!q#}<@K-WgTLa=RP{D@jt;8i;F)Ne+2W4LZ9!t;13_G~T(j3@zaC)o-hsRQFu1zIm zDe7b|YG@`pu&=>sX%7xd6ApZ~umvSh+)qea5~I{H3s`|*!h4_?mYoJ zb5WZIs2)vmV84UzQTZ2-9|%n7>F1m!=C;eSj}JXJXs)&_CSYeip1@5zz+i*ZpN%;D z`Lutfrz!rhEhxnd+XK8eKAhl9MNg`dP0kKRcFQuNB(N*4oTG3s~>)UF-a{8gBVH4Cm^cg_QE$(fsoz0BSL@({eu3N5pR z(aY@P;MU|D32Y_jmUf#S0#;)$wDDREFSPr?h4u}@guF%S=*jf^`AjFgb!I-^+B+=) zIz*7zz$k}Ndq*rluf30gYVXA7*y_wT&t|s~a0#|RfE9s6x&&T(cY$i}!{@NID^u6p zx5Dd^f>LZL0p^mzBv31l-@qWPfzb>jOlDxT?hk^(8nk$mP;-ulx$YsGlBl!jT3acNxzj}i0z}}Dm zt(?Tt7EF?;JRsQ7%nVu&Ik!e&5iidlo;wBej8}=d{o2uEhh98hDqO>iXJ8>a2Q-v{ zQlo-=0&CMEB?8GXM@1qAGRhJwCgREPVEa%TxM2I>MGv?OLvUb$2{vMjXJ8?nrCI_{ z=NjY^v{olOHlI# zs!PDJK(I>-cL|;@?YgD&)bVsAL9u|=S_Zp>KzGi8h>j$aCI4|eZ4!{pXl-Vw&3M}+ zaGUWphoT}@oFx$aXiaCZ)v$y>WJ>@Z{CL_VC#>bR5^xDxgBrypMApA>m*8m$IG#MB ziKiL_MF(1Q8|)GS)gU}NaM!=rEuM$ssgpn!qqV)E7GtlI-~|DmYH$JLY>sqR28OK? z*k&gSatey_!L#>MXWY)aZ6VP1{-?;kxCPRl*92d@J2ZP$E2BE&qb(=q9=x$dH>7FbWE{@&t0{z_k4f(_|>#e1{DvEc!gd5 zvrL=6M^5a>=8Xqcqr=|jJ(&LMe*ep|y|usg)cJ_7Gp^!Y(ieHQ%rtw`vZYVw{rxLm z-}A$aF+c3V;s=fO3Csz{Pdqyx>v&r0@w;}jspmpf{s(pb-mt8Ck7e2v|X zabxt|Wz7c@LKwDX?@Bk}1+iqX)*%o`&;#G9OhBxsWJF~Yp-2PD=w$V=S$U`1o8M)`m>dHMO zhXV_;HfqO3)V}-leon8hPMYW^&ST9SzPa-=>!!q2XT&iIZC;bPRy*#}Cnm<@xfad4 zSIPOeJeS;4-`oED#)S*#x<1Y2E86$?ODLy|bzDbO+2={=OIIx2$J(=eK|x}JW8F!s zir*W4ngn}%53QRa7PL+vN@P!DYyVz`c?Ab^4$akyZsWeyD?}X8o2b-U5b!qWzFcM4@dXuhp@Ey_%5Zs_N&gvt>OO{@Haoz z*6;bcF8fEp?}wj%{nS&f`|*0qhAxd4<}7~N7Kayn+1oL#K8;tR`0C8J*J0zYjoZH4fx7EnwONPba z#$U?(vy(g%(rybF{55$|`*(%Lvl==1n@gWmKT%41^)pP+(k#ho|HSUt$gYq5;yUO4 zrio=uW3f`)_VV+FIeQn&MARNu7p%)`y1~RIz96T_cFkw5DV~CRyk%q6ihotT*>Qeh z@vUUl}H%y*q1YnY=B`Phi^|CzdR{+5%gCLPW>&;B4_`D{an z{=k{%R73YZ_ZC`oo#jBHb7w;5ytCpjKVLR*XbNGrow;}GUxt(1T=QogKGAfHLyJdS z=B!bH={}$H%e1>zr95Jr8@x9jJ<+JF(AxpJ# zAzqI>vn>tY!Xj+0KU4mfF6wce$okzU=4LCGl~O{@A^nSge|&Mu7St?BI;?-O>dmX0 z5+*_avL10eZ^$!_dc99{x5Uc_OJwqRrBbe4uWx@-a8+P>vPM7zdcw=+rsQyg)zx&{o9mo6Vz@hUI<|ZYJI!~6O5CO z2p&7@UX$RNb1vm!t7AdW>UFjup?9TybYv_JZ3@z!rc!a$EA98;a<%Kk9ml>p$OkgBHEYV_hItkW*ZcnhaW6g}fu?OG)8Z?vEwiPq_Fv zzMGhs1Q%XaCJ^S&3^EujS*9dg(abUtCS@Zz&1GB@L{S z|C|5ta8Bpgz|kVxvT$!>pWjke^p4-gS3f31K^=#=@UFNdKM!pY0LX0z_#?mz@AMXc zrWK^m6}JWS^a&g|alppm+#*5PiZnGbo_GmIC7b`El79lPu&}rP_`TEWQ08&)t~_D3 z?Tm$nU(uc8cG7+c?&S_(=irG2unj^u*5J{*UIdHU%y|EJO~jKxjPGR;np0)5*$T$2QyO(VGv zK6zTy%Te%!``efA&Su7Pid_aG&H^b~lN7`bqpeuFzg2ZR?1T=?m3J5cpR^$nv{$@A zxT99~uI=1r=RXB2Cptbgx^%-6V`=^CGT~*oL$RbNH7^}^D7Lfg{DphLY3BEt<{YdH z3~@Zz+N>o-nR)4ub!O8%r#;pZa6LXh^aPg63)E zM^-G3TSAQgS4{ga{wDmS-8uW`YemDKslD5~A?aS`P1D@-apjAT99sL|uOQ<_PETms zubx#b(cd1JTUMT){^#cf!`wH`t9>}Xy;(cu;Q_UETR)l?HzZ%!@+fiMZ_kG0g9?$) zKYwKLel|tmbmsYuNq-6>@BU@UHj{jN{#ZZnn;Hq-ef_g^XNSF>WUlmPMs!Qi=9045 znikvHPaX5ynPoopN=H7dX;Y3hR*-qll+&%`aD4tFhSNNs=j8?-JQrD%n#U=Yd^zpx zk8sPd+`r6Wjb`nW=S?b8yJd9#t#8E-EvpCD>vlbVB`nBc#&}o5=GBA#eQ&jw^;jn^ zGJW~a@~FfX&Ry<4TU29T9)0YxdqMRPm*4zB+m<`@-`$`sZ+LND$xl};$zt()S*P1F zIufs)z49XZ-ojU}RyFMY8~bXud0+i|zaP0_t9QI4QdZj)FB0uKf9mM||1Wp1ORl*Yw%4jIQ0W(gw6N>KPvvaQW-jk9$=60t z)4e!7^6Q*#DU&zW+;;Ozsu%6Z_h|KDU*vRtnpx*Nt#6lG#QI|lLhnvfy%?PPpG%{n z`cbvy8xBzgoubWu#6$lt`W1i0g{A%W@r`b?`7ABHwfp{0@wFFO_+f3J*2>4lAE#LI ze~Z|{DiqZ1+btR%I5Vhi#?R$>XD5`;ezgAes!z+j{Fk3EH=g+9@=3$V)7|n<>R*xD zrFPMF-^6X5RZHToy%jo}>Al7Oi`G|}B*&5)vp;)(IC?}@;K-zzuSGen^EF={lgj&~ z?;N1Q6LIXFPYSmyXGE*qMn%(Ub8AC#+v7Z{g7ORB2YC7(^+=wa=WQz*86R-_?u73j zd`dz?OENZYsQxwOeNxMIpAhI?T^8ZaW|sb;Wtv$ACr5Oy?5cw{bpra%gXd;q>jhuN!>$!Tw{e^^DC+ z%|gDJnq6}`lQ((ug}Au#8yly)$}}tg{jPN4ZAR}GOT~}rK^N_3Y)QG|Bz)#Q+hUc8 zU)WbM%WAnic6ceZgnPM6h6dxJ!xI;k_3-XUU%j|G_UJoXpL?l}MJkftTZ>GVWM4E< zzS;k}OR?qUp}V!=Qtn@t_B4rIu$%55byr$-tr}mbdW}ckCih~SxTL6*2iG!%To^L8 zMNgCpHj&g7<^8?Qy>pXdJ>%?&x8v2r#6o%96%OnVuTlt24&JOWMa9%}l}Fa(kjYn6 zS1PVdFYgg(*RA%ci)vS0^XR_I%9ag0s~cOdGwXKOe(LzZ9_QBmIr@k2v&&XFB@w#| z0{z18JbBD`d176D%eK%(x?-XA3Rfc+@;!RIP1kMFNfpg4lXL>MC0n^()O6|AGOyKa zoy+$r<@)9S;U=%PhEOm68&}L>Ebn~vQ9iIJ9uX4&&d6ORui5z9MGsdlxF)^Ve^bj8;WQD*evl{lXK#7 zje>PQdg`j5R$O{;x0z|n7mkhjK|xZ1+dRbgJIgO-ci>1hW1POwxVR=h=xpB6;)WLO zdzY>VJg(YUp?RlgS~c6I{iuyfySU{xZa8b((zLXE)G6UKfy4(%4h-(wCxDi*v!y&> zXgSPlGGSfo#8-V12?2~P1{0XnBL5j1{8+q#ldrV+b9vd33)*hc%P-2H*Q~4EH=V>? zCxETSQzz`&`P14OSIrtVz2`1$4LRo0_R>7i5H)H8XF{?9OJ9M7K!`CD!(#{QhE*tS z7h`bS1+?*aMnifnyrRTPRO@Ny(NF!~hzO;7kBuWIJyOyJW7A?gk4^7GUkynRR!LMXXe`m46H-Ri z2T2Lw*;Rf6qoTG;eLMjN4jI@qvI*?|%~H|AzO#j;ddF`UwhDnuhdkKRFY>-%`e@Q7 zyrH7pD^Y;K%@nk1?tf#MR4lqDck$i%Usjum}b%e-iQM?82h^xa!PqzKjcyB&SPM~ z*kbU2S55N2v=OMNDgE@ZsEeOaLVTo}ylU zgG~tqCESdcp7AIPn}Ci&I$U{9pzER_lZE6A_7jmNOzI5+Y(WQ9uGgot{ckMdi$xD_ zUd#D2a3*cA-5Gkw=lCHlmu_#fX4~n4s~7j?Gv7Hi1_lO@;TS<#mRyvYn^=G`9>D*p zZG&^3=qFf};F1P-urvI#>ic>FRwYSNsB5rmliBT2bj6cC&83eS6>k=qb6Tj(#7d z_y3&SAh+`8v2xaYj+stuXtt|z$nZP_iu^1X%z zOR~@DEHZi%k$P)yiJSC7wri@-Roj$TtZlA(qHx+?gZYcFl;yoEeP7>{Jj#%G^jC>b zYu<~iZIhlwExUEt>yz9jt_fh37tvRg-TwG@@FdZd z;GCbD zU(QJT2EXiEdi|Iw`^Qh*t}}ucyqzh3eSho+(SP3qJvBrWgJv;%ue()I$^Y&}-_Fg~ z9OE?IID^!eKkwv=Q@iwm8?_-)$>#9T3R*0Qpr5W-o|=RbZ?HlEw8-cJ$B~EY{MOYe zDq38%SX3mL`Far}Ll1|2WwWPVm^)j&%FBo76WC`vVp(AYF-8$so{?FUQ;up~LTW-H zq!{KmFfm9yz$LPQn?LbFgY%U6jYxwHKJ4umxfzt_a&sgy9J2Z-@6uLX!S=Joou_B_ z3-m<}FV{Bb!zw0BH{|E$=jWli0aVX&tj5?{I2pXPP&^?qVFEK~ci|5PW#u;g9tFo^ z|IhLK<9YaR-@ku#f)QISceOHHmA-U!rVzdepv|<3uAsl`T ziaalxJdgc9=i!ypU~$L(jQ8RxJY;11SDSE*9H&f{FoL z1&sU3NMTT!$bfD0dwE$#CfeW}ipiA~Z8$f-PbuB}5w!Cdv@Qjs7AY^!&q+gZaoU7r zfusZc7T|#?>^nlmA0#BKU^oP-N13_V*!)2CXgOQ`4k2lUvTxyEnyYpXct-_2d z(^)prEBENmtI&Pe6!6D?i||_RyLA_Xi!80G&ueacYFgp3C*V!xjcEeDtH0MS-mNv? zDP-pw=?`DhqL}LW?stVhGJWSc^}(|l79W}q%b4HqTz^!4sT0SC@9HH@f!+rE`E8deygSFIqwWnm3p z7sg}Y0bXwA!%PY#JVm|VO^p&f7`ctW=fV_}eB$CQ>XArb$2=G2p;>4euBl#_eHfWg zf)!$+=|M&@Hc)%a4ZOKnnHhd`3!A(8`U?ujI~dC_k8U|DxyucnxocgW7Q zjh$2TXKumDlg>{!VH-H@&n{X|$oO2emBm<$=fq+BLc4b_2^pV{TK8ge{YMw^6-ajw>~tBSENkH z^j%}tcjHUuwu?{2HUF!AeR-r{U%{fPPj5Nbuc~ZZ_V@dmf68{>E6x{o^#>$>m~Xmu zd3?|xYw2xIt>y(+{kXm7%<=NuI{#kJoA&(nHs7ZgILcORlb*6t(BY-jRep!woyYX8 zmxgRUR`O=v&NY(P*sfJ+WnBqd_;OKe`F`2r3A2*VZcJO55y0*AT7M1ST63KlscVwg zES7ulEavg_ZQQJVR&O12eLd_WoIPB6V$YZc6TwMQ*vGv#u3sWcy8Y`!C9nd(JtK+sRn`8(JIK zp-*B9p7fSel8RZaqih)kAD1T%JuWZGXbJqdyk9Ll*svd$w>hV86?nGOA@M}&eRc+7m+FHT!jGh$NMPNiI+w}H1LjdIi5zSxMtz6r zQ`o_P#QC&MN|q63DK4KD6rphh>^afAnXIb@q-9@p~fN(LQR1RiFQl&N)!X_irD zyV1G@{ZJ{7vhGM&_~P;^UQ0s{96DftY-baiosAfFN}l^Hi7%g*q+;p4OGq8q@_i{Q zqGSa5$)@8P_QSD7gwmAp)a{@cBwV+HY#>;-7rV7yg^fpI3BaP%L_^H<2}vv9AxTg{ z3`wN%4llqP!!wZ*Ddb$t1AI#i(Mz%-IjJxwP(v7d#(>z1He3fwE~plR+h)*%IuUKN z;|k&KhdUU{6nfD|j56}e1z|qM(ryCTj3aX(>;<0zy1(JV)w8;G2QE!gWYszKV}9eo z`3DV8T)k+J)FA7TjPBt~^B0p~9>x*S1qA&Iw%4l1st0r|BIC4aJemoCpiRC1c={aI z^|c8yzj2U4KjS99o-Ys9+Qwxujx2)a;jIoF%$f<4Ks%-Fo0BK3UYvNuVJGI=a?7*q zaTI9q)gPoY4T#Wd+-*lEWFMf z-182nb!@MTQ@{zI32SQ#5}2rKtMFKdJvQ6WgY@E6^Ix#^i6aIx%1|d9!Inb0ps*ym zDFtT|ZQ`=ahgJ4ik|=?7d?xA8b$p-!gM;V(Ii6FrxGJ%*$TIVlf)#pQP=D;|c@j?|AB0%qgBSP0^7oJ&%RTUI`g;bUO1nvOY- zW2B#0mROQl1n!`2oqKxLBR8Se?{!^q)erd#1vgv~O%a%~b4twKnb&6=m#;cuu`n!f z&SIxoSMBd!d#^A>vNF(X-m{ba-(RdhDPRBZ?S}T`HX&eBDO=#GF5u zP4(G~mj7O7DR=6Rru6B?Go{x|*RvVzkF7VpZ{_tu^ZBVdURUw$8-rgjyS97%d-vVU zBJ#7X-&S_rtG#nYOx9WI^Uvv(ZM!x)zfIIQYU4a_@?6ofF5S7|uhv!OJ^TDH<7`{f z>5pG!_sm?rW5d6N3p4rziXUIJb-&s(L%RQ+Wmei5^K+s`rvgmfcYOHc?0nVcXzRD# zl3mX@Zf5)`w?`;jE&V)q?#$+eX>NBd_P;fs*w%mc?!8>&V}HexnOt?#W*ffSzSNo{ z>sjm37`3oE&8%lP&Q!+EYF?NYH*04ByYt1INY^{f1;r1aE!tkW#m0SFdjHN(Gqn46zLG4yveL!T}waz z`TOh7ZxU<2+0^ex7uaogeDT@&k1swu|1sn9^NKA$KcBUc*M0W;-)D~Uf;E=)Hn-;3 z*I7LOpVW8dy3M6I|I_C6r)}G2_(fJGcdpRu*Hh*_PO!OUr7D*@x5)T)>EiW~>!oea zCa+!l=;F1oj~UskE4FOCdUnnA-hF9%^S&7OZJr@Zz<*A2VLRtJqRnZgXqb@3cCT z`x0u;+&}j^zIzZ+&H6C|iYuyFH@AQ8O+3^8OnR+##m{%LTb5tC{^yJF49#PUe*Wu^ z@2<_|YwJHdSN)}VafbBQ#Ppj9D~`#WyFR!4cY&g7*1Gr4e&_C-Cv1J)HSlcP-1WC( zbgkO5&J=z>bp7n__-C#CVWzh}D^weCuP@D$OLE;m=SQUJoDWGiF4>y8mnr%!HN0}h zV)|^g^kRdWoOfGxEq&{>C-2=Hm)J)>2~juh2js}E%ARTc+;zIe$KRWF&gPx-qxR+; z)!5HD3ZHL(EI0PE677_|yxgMwQKVVUv5MUSYa143@a^5Lr|oh)0A#_UWQ|$N6`vjP ze_#}Hc4BPD3yG{}mVW2u%%3Iv*imjCdR>M$_1%{#mVS5lXRWigO?`N?qWF06l~>0O zZT`4uXS8ebmv^U+%J6JGwSUVD^XS#juiE*tr+MYwgVWDeF2B08j6J^p=j2Me2|xD+{|t^U z-#@R{KUaAhw_$Vgimkn8qVDd0FY#Y8OZ)7ZsJlngzw?+D=NbODd6a9=HfyJY{FhJ> zXWjFx&pdd;RCr8_JI!5{9SeXx6zmR~H>^-7lK{b4zM`DY0?jJAK+ zTv@yS!<+@Rh9R3Lw#d(3SZf$^c4h1fZK0-BKkMRO-4)fHzA$Uw`s`P=tzicOOz&qW z&;9K)b79uL{uA4kUOpCbyqIGhvOFc7uWgm(mFL;LQ{|nn%Dnn)9rtMQidng7bqC(3 zt(fIpdoN_hW`mHk3+ zvMySYrhMhO%xb-^MV4=Ns7d=YYOH$pd%jA3^z3bcA!lDSM}WM4ja~Q)XIs+h+4uhM zJS=UtPIHyv`(lXpmEG*_w`-QRa-oD zT(8#rpX|Kx_}-)yvo=oezG>@xRVM51yRLi30!-U~y7k4zflbP)k2@ZaQ@Z(g&Ep6C zavG})@4x=M@X%zju1S@x!D6$U*Ozj5?Y7mP(|SYBFgR_+%)+F^=X`CGD(_kqH%&Xe z;p@*0>(6qYvE9eIz3BM$wR(>8HnUtboN{L6(K#vZvju{B{!?LiLJ=mJJuEP2zhgYESd4bO#nJ)^8oE7{0EG3!E^=yv17+-48?B<0T zeF=GYKFXMGo~vy!2b4KY+zrg%RrJlec}`S@&)wyC08F5=)8_sCkGna&p7Drk9=+80 z=yB4;mC}-0LC^TwW>s>1zP2q!BP(sS^vRQplUK}KTdw}R{>@4w*Ry*h-trw=drCg- zp2*fP@$FjsEhVy^rLO*@Y}K@AXXwwf2Lp`PM@_vi!{b`K`qS>mmRZkASAPPzEHAXK z+{XRvoGl2r^n^OQ_fgw)lbYhl+K{3C;!T-RN4LM{g}7R%_648 zTK{)jOJt>m{M%v$s&(h}r|NBB^5TBeU=*|a@oUqZ#QPB|E{jwL^0;oEtNQNa+_%$y zzFxl6b=Fhmnd-qQ%-Z&CNoHw@`sTVHRVFOVm^b_9lXPK@ZD-=^5AL3!^X6wlW7vU! zGsQAzZ08-$y6N%wtH(1>nNNF;K2veMxQFNFi^5s1ChO0>dEPA1_3TL1_Vg(W)8cLg z_a8hvdCUJw6~kv4SN9eud{)^!<9yszjxNJ!SE)NTC!NpO&imJGsDDj)rh4mJ7P;E< z{RyZ4d|ekc@%GJm2hUCxTK?{@kFcYm^wPPUcW!$Ib*5LqS|B27{?k{x@F!4`3#>v#SsFKat zFUvsW?B@%+xBpwyu<%;&vTg(M+&?UO&KGlvmuxz4*}H8~W#<2*6S(Wlo!4IT4ez-5 z@2`mK=UcbjnAx3mr7N;aH-Ek77GS)7?Q)*HdA(kS(_g}&Ijb2H(SP&w=Mn4cJ7IRZAoWNhk_KI)=YAS^n+G$Bw@V zZHp|qLrpw48XpfZ5m$Ux-1c$)!VJBSIZUEW3vaL&Zo2iqdpD2k=Ck|S%pb?T6pqq! zHcd-mmQ2-{_4eg|jX&WGLQW;a$&y8?=DySH%`Gb9Zc3mJ=?-S$rI-keC$ zy-D*YEzCIQe5PHwY^OxmGbY2upg2(dl;gfwqpSMa55CZ*??n<_#s6wR348P0343B+ z{I+5_I>V5UFE{S?jG}MptURWh>pgQ`FE(*Blz!-aRe8o+&#IzLhwq6T%~_C}W9VfZ zQhjPw^+SheM~)plQ+`~stJ3ZEji1(!ShmWp>fHO=e#=geLiX|*n#Lh#AM&ZOpLr+Q z^-S~3i{m`5pLL#C>R#9<(e=#ojGdmK$k}b1_kN#T!ed&T7JohSPi#%wqMP>?+dtmS zFXFm+@5MQ}7eQ((J1oE7Ivil4pWvpQpmB{iXo>#^29l+E4Fi>hG6NIqLoFh2p)lPraXAtB-hg zS#RUjT?g-fjkuNP|MoX8&rw5F-e>*V_X-m=wxw6Q#j8jBG!#jXuTvA)-N|FRdH#ei z<=Z5@Y?sctJ!k*%aEGlko(rD&RDRXu^P!}3{-8F;%?KBR$9K$~&+dt7+x#)}QMOl8 zl-V@x8MVHi0VcOAmzW&vI38f|A8lV}MzN(}6$1mqdMuY3fV!jwMX71vjh(K&-h77* zI9RV2bgkRHLdM;eVQXjitXpEfzfO7<{YlUaR24JcqyAx{-}`ruKJ+kzR!-3O+kc8- z-}egTt%9c>Tsyb(nP5-#V}ngz28UN{-eSr(>7B6lo44sF`;Ub`_EL5|>Aqyj<^3yE z&(_?j73Ezcw(IKbx|Eyq&2FQOw4MszbqF*@6OYHiMWD5ivZpP%8Vp2Q9#-AcT%)Vf zE%#ueuVOcg_?kWcb$ebu`=2o7>BC8r7fft8b?oBDH+%t6m#WmxH7JPNUYNDG{=e?Y zdoiRs-;zWDOJladRXpu=;@4ez^xed-C$#llPB>T*9|s#29J3bZ-8}ZUzR1;|!Sl zK#la1GV{R$Ql@=p`I;OAn$OQ&{^8BRH~jmLH^vq!y_>~o^6{^{3yWt}=Kf_XxofI! zb}uwuC|^0N!OuvtWX5(h(~$SS%#@^7pL82vx#ipUejlP?*iIA zn)XafP4UD|PHJ&6?vcQsJJ{H(ajkG~xpQS>BqIaEa~5o)=}9^H`6N#?5!jHtz_Vzp&qaQPDZcmqC}h<3By+4=`E(_1l^F zh;5wvb^A7N+Z(wko4@ed%YKQ?XAhS9-Tv8l_jBgl^zw5O(T_!rt?I8W-=g+P`h`=2 z9!o~~Eoo^_J;&2cohE6sZ&hD!IJa_|#MQ}pt#@BlZaSS9P1P)#hYhwv9O1uv_MV&%Qmkw-zLy^jf!KeMRzp zYyOrp{}t*Mj_vxP7tB{#9^2u4-R#C$c95>SH@G_fT#j8<826nsd{VIOQo|Q>6=#(d z&pft3`|iTJR*M3Q$&H6OzqQ|bQ8icHyzEGMx=MV<>7zEU$2s3xg{Zs4Yap8~`wpCU)G;TG5S1Vv0@&_4;UgBai zRsvs=#5{DLfc*|cl>_s8G~CM+8R zjP#R=lXI|L8N$ON5yH|LV77-5wAt*I0xO4LjzGen^9LUEFH*a4^SJ#L)sA)V7O|t- zmM16pLmgCJVYxoUNI$7GCnptq6rgOgK<0Tb|X(T*G5_ zN@j5?o-o;6!L}QBn5120x&xa-!_0Tdsi`@sxoDexuur1BdG+e?D{03yVs5u~w*5oS z6%%)B+HINbQjNz8U~ACQ5n@k~_3mB2c3{7g0%Z0T#Y{XcDu@?wPoja%#yW`xGW$WQ z4lkbINh3aZp5Y4~BkinJc!CFP4W8iHi7$A9Cc5_#G8<3ufXv1jJkyezQzJoz9hM8a zjr5b#@==!wfUl>LU=={UoEtg|yurX=4#Ob@`|lO;%+8<pr8tz|D*laxwwTvsS@ZTt0G+BIk4lV!Wx zzbm;ZaECWOul``%wY+Qova7}!LFbxYe%OEV&BDXV?dxUt75=#P(7OG-Y~7FICm|Ub#t{j;Cr&50R{M`H^v~?|@yTqU?KMc|&3=c4LG&9e! zZTizZC&7eSd6iUVh~BI>7m!!bfNWC!aAnRTW(J0964>UHlXDV_iy_yrZoP4~=(d6Y z!-L{aB6i;|IKJSQ-Pn?A%29csNNw*6(@#HG4>l=HPr1b9%O~ynK))jL+A&$%JDcaf z_<8(uVl}7LhR98m`K*^kiGQ10zu;+zro7zUSl9PwTBpChyyV5k=YQYw=J_&KRuTIdzpCbu%iARz4f&-TI;!5FU;__ z)tVc*f1T-U&-t6)9{A7SYo>GWle9-RXoyqJk(^@rR{c z%z8X`Z}_Rq>)lu71ASvwTo*qSpepxidfm2tSMUAQUTLxZ^1%wm<$DDteK>GT`>6Uo zp7(S27uoo~*|6(NUGt@--=%GCwXmDryM46!Ys|IROtCDd_kIq4>D+wsD%bOc7oH_f zPj%e+aaDkP-0%C>UNi0W-Msg6xc}dedorYiJ}qoIJH6HL_FuQh_jn%e{UmO7>(1v! zJyzZI9&g1=^0`9nd7|I$TyK6$(K}e;8TaF6*DQU$xb26-j(_;Rr<3cZ&7PIBmzgKoA_x5tnT>0|ziQSb`?ryr_r=NFa7OYM8=TO@E^cB=kogT7}q#`n}J3@bj`SC-p%uvevhp2?}E`TnYI*oh0( zjT1!IXWbHSJ;Ue4xa@em@EkGKPe&b^6Bp0C-gc2cL5A^mqUM3O8hduQ?32nckjZ;7 z_sGGk>Isur?tJ|ow?p)pM)X&{3G35NFO;}ZpLe@ydZ6Y3pDp5AIp_NX;~Ev`o}Jg- zG}}T#o#}pQ;Ah?hUoHN&b!YZ$4=j*n7tcIk`+V{%_ry~zjML?KmLL6e$&O01G+Zu4_$mS&h;F8)`Rhy6I) zn`28DwU4PETq9(9!D|AK6vyv(ZU-hD=1-Wz_a?f0aZ6RgfqmiHj}lHiWG|S=XERTq z`RfCnhT6?;j}k0i${kRV{c)`A^%4f2`F$o9>>noezgVB}Le;J*(L?IPM6PF3HNGqA zG4wo6uz0yGVUB=J0ITeFws6K6rX3y450~6->TY=;{dDoC2LbJctO-Kw&Yw54P8NA! zkLWIe3Wln@`|fxu#~l34&EGq4H8(+Khi+Q1&K*>|VL4*LNFQsj19Y+)aC!mPSBQ5%q|hwr`ec$fD%9l7Bt*oAJLzA9@tfk9&9QjbqInWEZeOn3Gk;(F z;W~+Di&}zKv6@dU`u8cBi!*V0$vh^9eL6&LX$O;COTPf=XayexqCng;vnO?LnPrOs#h;Qcdj!<>&(uQ$0jNjXPot3+CNdwrCXnxpi* z@z2#yTpm08+IsR;=PeI7xRzB{<~ws{t9Zzq@M9(a(kAj&6=*P7%)kBgrfo#VjK_~O zC$FC(THGhD!@(Wj6sP)cXQ0dp)!t1ypIH6xvF+b)wR+XYKj-?d%((erdd{ZW$?`L& z-4Xoz^n|#{iIRpX@>zW!7XRCvb8CZh^q>0Q_oeTue!72Z`vQj(Prt4C!Jozc|GSo* zdp$?V^iYLvzq^>|1!xBg8#$n=PZ{5$(5W~cgO7MB$3l~j}zmlSrEmw)9g z>iW)K%**wuq%ict2_1jKOURq@LDBw$@hAr#2j>zfuy^4rupQe~x8pOLKwz}t3Jj3D z6~CC_yd%O$KRG`sKQ9%nXaF5?0w0-oCNMJp=RTH^d6325A2Hyo;XoGSnalWX{qr~W zxeSomvVF%L@dOyyY$MbaxJbQvh}qcYGC*cqP4Je&Q-kFv=jWgu2}9gw{*L6HWFF3< z9`g+e2@hDfjsBIVe`wd<$e5H~pI$FNU4Z9p%cV03>}aKp2K%-B_Z|mQ` zcT`|os0;Gxj#Gag!H(0!Qdj3=I|@r6=>UI)1@4QiLB|$=d|Cp&q!zlzy*v%<(?<^& zmMhrv+l!aHz5U`@z%BGzOj9=O8TcA?teYvY`&2?|!J7Z@jcIfL*2ZAnvJ3L=dA=hP zeV~;jmI^yRr>MA~2z4zyxUVVGP_UzsO=i&_o;wBejKPPPy0N8MS@gs;G&epJ7dX_Q zHzVcG`!f&t#V0c-J%7-kaQuV-&s!&xa)n&v{aYY6e0lNY1HS0YODn}QBl7$A&Q><8 z>z6@hCsZ%3gmt8`Gy?KLW)t4e^ANToUJ|iKbjL5tYKvd4JR4AlO+l9KSueo`J0S#@ zrKnqAz+sBEaT2_V$nb>ez3V3?AoinOJ%97?Mg63PSkyzoK-Mx|v{3_33}7AXPR`HE zD#gqd5>f|Bo|PhwC^+}8E^Z;#BMLxPoS1ys0JgIMTkgoqDn%WbK;98;kObZlJ@@b5 zJx`#>wFA zrtGIIQ4Vzld1>z!gJQhq8W~_UcMb!7bKkFG^2TqjktsI!+OXg^7x~Z>EKyKYX@or- zaG#pO!2k+}k2STT;7J**6XVH6m8J#;nA_bXSe5xL7(R+0)9*2;gSN=+9rPCIqnDTm z{%ZQ+DNc&XYyzez24p#rPXM z>^LVaK<;KQ7dQc%(8CgyrA5WKZ*8`2XJg%s_10#P$w!`V%fK@xUrzLxyv#d%WAb7v zKb*%C@L+3j2YmZ(d}H!u!gpU2G8^}pJlJfUWAcj3miC}S=Rh;Sm;s-Xn4XS4kqTWN zBis=ybN6m+^M}=wC$||#X1-SXg}f6I6!c1~1PDC^DLzI95WU;-y>_@-{q>xzlIb-vU>?SgQ<>xp*R?88+3Ab50&)h4VHqZCtmA z8R@4amXsu-Uk=c~@Em+pyE9u(18nm5k%Z8r7jJOQ3<~9R^urE*#4LkSl8P`71`S_i>+Fn?{lj44dV@jd@r-hmo zcwDbP(~c;=_%Jd4v_rE|=nIY9>Hq%6U+K82*=>AhGLPb~zDH~Og!lq@P57QD+G>W~ zxcyR(H|)VKlS}&189Q}aG#0sKOmFjz*sy+1aLA&Ab(6N6z7jes<=gqy=uGm9BMW(= z-YW*%n`%x{c)vU@OX4K&6xLm5`t6#lOHSH83tKAL7HI6(WBmBg4x>EdT^F`kw%u6q zDLja+e5HA2d8XOR!~+Mi^_P3FCi~2{SKrF|11)!Mnz;f`&7G23TvCLk1q%;Jwsw|Q zoO6cwCr4B0J2`qgrECxQLJX`e^_0xwOtkqu@F`EwnKq+@16)!YxcM_LFdWgFcW_>v zqT-RPhfC&Wzd&!urp@@W4Nsy6TZ6OG++D#|{i_vcKY43Yk$oVv^1)KEWfm8tVjO+} z8c^o|_4W-4;TO+2u<`ONX5f%uzr`5Bs>8!`x#0q&&(omDs&fKz2FJyd+9oFqK_@4m z9E1$Y*Wuwh)4>HVj*u+N%)|7dgw%nOuG^~cW7+iPCC;nE+2?7o@w$e)&y$i_h7nm8 z5)eLx^m$@!4%__2dvpuPGuLG&3gbR|A_Wwr7-0%Ixdn0x1gOXbO$R^@+DJMwfk_NJ zaDD!Pkj#TukA)2n@Ga3rZ!SNoJ2o3nA^}^98HBJ*$HKnj*AJYDMEFefiEZ2r4A*3^ z&Ge?GrKKj96zgTC6xT-H4ts1RR2x=*^k>VDNz(a^4wH>9Y~Z-N#x#FZte?q`NfUFW z&RsvR=UMhd#n#4kcgo6;?^>LFa>Xanx`ph`n#Q2l_u%yRYzA+3n{roYu}KZ9mWAeCU$yI#pO23E z`K?*6xL$|c5PzJmc1`8BZQaDXTb9LK_vKb#f4Nz8?JfQHYZ4yC73$BvW~0RM!`nBs z`v04Jo}-KZgrtV|J@m*~HLc6(?Fz4x%a6Q!;`?=>)Krl(@dl#&Tjg?Rced-*exJCr zVvVWG(`4@Q8=KdJoI0?Hy+=gndC;DK$a;Yv`Db!FBbI7aFLX0qYm=y-+WEh6TIcPi zOJS=;F74XWdSvdUl9|(-L#(Gpt&O=OAz*EJ<><2m2k9FHzsuq<)S^+VfM)ZdN`IPCbU zeDR%tF7vPbS7z>HsJ?Ykb?;4~C$m5$37wt&YZP4y>>(M*HwJvCCfqvRNlig`sz67*PIQ64QZ~Z6J9kYt%gi}s z5d7;)ep8G2Y@SIb9sZHKEGlEe=l*{d!FN7DG`jSSPie&Ryu-4BIcrNY(#m@si=r1= zP3kS2bVG7=vqkBbK=F6;!msUIc2GcwjpLmE+pNvLTdg)M^ih7Xu5A7OL+Ag0@K64G z`39S8h(pqtB{g?hPs<*S4r_DZHqB)N* z#P*8ECA&Eax56ZQUK=z8-x!4_r04q1S@p_aysF0QT-oe>&Ds2O zeUC8L20U~=D6rbEH$%*7>OKJ@#mqZ_ZzbBFZeG0By0+@A&bO^Ee;&wrB|MKWbFO5? zv%}9q4l7K4cIa5I{3erV@kif2H>A{0nv(AQQFhmN!IztKpL5&uo)`KU^E%A?DxYHJ zG^N9GyS}|qt=+Qk_(MVFmR{ZcFZ`~nGXISKaeGV1t@cS9UG)0Z4lOV%HWr9@@NNIx zM_xH{N<7=DqrF`ZS^XE#lkD*?Vw_&}SySSN!-_po53ShJY%g%nvd!s>a?Xr>-K)Le z8F&1#d=>r`2PNXW;#a*)F;roYo;p*d^}8P5s|`kfk4`yKf4ie;mTzM{-;&q6%<@kQ z@Nv&D`md((wE0J)zK-_#SuVK;LlrZn{nt*^{Z-M_W%xelO5}oDp^}H5`i7UWMwnfS zZFw|n^G`{+jdc+h-%4txU5Yw=-(In&TF?AS-g*6aAK$lT_wHU7T3%UaC?2zF%2vCA zqnjf-c1JD$l6~TS_tOK1w%Vk}$Q7^OnP70rHR)4|;{FG-{p2*>P2k`7;K^BsXIIkq zu+5xhXrwmN>HNEDw$B@lEbW=%{Capoln=fxy}s?4=V=Fv6L*hAWc>Zxr5I=Ze}9$2 z%Cqhpw=-T{z477GkR5Z5`skz|FF1bMvN~2V_*2pmp*F5*iE5{Gra$7m$}(ZKZc^55 z&*XG(%LCg*o8F%DsG7<1V)3dhUPVc z)+RnPREypA`gP^YU;2CsdwPz{Rg3zX8OLW=$Mb+kIl$}2@6}hVlPpio^eq&h+&$;} z$@G|2CtdHG%N*67zGyp7=GkDcWTs_J5;_w<9(h?jRq|Z$b{VEwXIgTD^o(8I`lIvQ zD`!?u6nULeWGGb7;r-x2yYoj=mPIOCLSL*uR_!6Qb5(ke)4UIx=kspdYHaY8F?_9> z@&C5E=YK@rlDd20T0dsO-z8$%H}#p}OQ|K_9x%bEP1x|(^Do!guPF<<{Bw<#Mhu3G0I zH-+=u%{vzJeR-SZQ@NvmC_dHPf9m8kIsH7pDT+U{Q&g_>$*kIZ#Akuuu6;VCbMGh| z*LgirSTIdv&V`rPpK6PitnjU#@$~tw4O*(=k^OIsB)&}bi%$;x;l6ff@uH2H7AE^L zWcw^+_r6@2^e(gPWn`b3_+^q zE8c#esJFg!`n%sPPB$;Cl(9FJoZqgntSbG;l%+Q3B$j3F^!)nZiPPMv>>Z&`9W$rS zIxWHV+vi002~kafNlzFi6nEGplw!qwv*{0%HNGoHTW(3Y(`o_ZE*o!@NF<9jx*Xyr$X z<`WYarZnCSb(_Wf*?gXo-;wi1inaGe-``)moprLqpWS-GtqtooCni^jDe=@;$s0Vr z<*5@UziH~N4+?M3aqpdY_m20MoqDNB0&;u9)~@TG|KKWz>WmwL)4VE!c5klHJL(&F z`up-feM{zcp6d2AH!?Ao-Y|9B)H(ytqi@A+pRTX2+EUz*Fp2lVH*=N*1FO8r?>^me z+P}i6Hb}sy@BYSxTiJMYI=W^)Kd5HS;+WxB5t7$s=p@n>9kW5#JJ!r7n>f$EJ-5QRgYwsxA@7m9M)hJoo&lwIs4lOhSg1A;)YE@BAShbMg`Irx&)0F&xRx@iG4WS+f;lx~iuZE>5($Ghc&cp~#Bk zZ!~7wO$j$UCM>+<->&rsxm9wXxf;s6`{8!3XuEuZR@>=?CZ&8iLh(H1(U~Pl7tC+{ zwrz;`^FYh((escyVLRt$7P9rK8ymmcCd)Xj__uwV`O3&0~kdW<(qu+{Wdt#Z6} zH0hYGZlO!{V=bvk36EVB3dQ6Pm-OFdk>BaEy0_xS60V-8hX?Ds^i)B{H2qgsxoM68z_6%pIlnng2gcFw2uZoWx`P z=WUS1UE75pufEv6|L8>*nQr$R9d{E-r47F?DUaVK*P;B5tEBsjTi;&|Bh7~Mj#Wx$ zV>xHusxRRa+VjU~=OHhRS)Kpvr6SY4A6m>RK6Jm-LWcVW)61x(vsXF3n3TtDb=f9A zNMk`%Zl9Wre?&XyZ>Q8G9~pM>!+AVjSIYC!WsYpDSi0(<_L&!!?bGfYHC!aMXVx0= zBX?ZP1CsnrC;!-T?J9G53d0086|S^x@sr;@e(5rUO~Te8{DX&nqv$q+TbT-SHy-r! z%5D%izw(EB%4(O}bqTV!17osNOy(Xk`nkVgMWKN8eaS}xL1txTg8m1W+pNghz5aIo ze`eIxTTb6k9ZF?nVEBb~cS34fT1jd}33#j`==7v!1%W-EMSnKlWpcTo{7PWu(}_&J zTFd|b-+v?Ux@XeV_JysM(0+o6u7SbuBOqdn&WcdY`6Sh&yt2?0JiO7~@n6Ml_W%0(e$IAN z^844UYyb85e%A~uACG_&>lkhneoQ~*@nWO%#r@L^o`ty2zixZ5`^l=8GbT+@oHf0s z`jW`p2O0{Qo~0*MuSq&tyjquSpyVldna^M;bGSv*BEH-Y$$FYMOy2doa;-H9*44HA zHRZJF6UGb{TzV9baDm9x;;~TN^Xixyh#E>LCyGvy8#r*X5;a!H2mqW9{wb=9gq*yQBdz?HPLD z(18HP7U*aqk7j}+Of~<-a;P(uZU0M#NGc-%}dTm#O%C+`u_)(GQj)) zVDoYI|F0dLW(4yV=12$Fiahk`HS}J20Tbj9++H5ZpaakYX=DD*v6cA?I-3#YKw3~p zRtJUeh0R)Hj_gCM#GD~Rw$vANAS8;di@@`el5ks5kKP5@datQ@7Vd!#u&o3qcVj`G zA~?Alvpj2GEOhV)oBv7@^U`xr_acLLE8xAhlrRAWA(qmnn zVqe`m!305$+k)%P8lDhcGcOnY5;BnYk0rAn{La9@a0BbEg4Dc{qWl8z1r4ebtc#8q z@Hkh`X)5jNaqx;-ea7e9gu2|z=_fuqYw*gu|KV6rUw@O|UfRyVSm_MY-8IQGczrf^ z9)5GcC_2H|Y=T=;BF_eCYl|M{ImbBVjxom^W6giYEBEZ`&(ycm^FIjbe-O(zILadb zv2pW@mfbIA>9OtUmi?%8jC4 z^TDfK;fI(0*MAiDfA54#6Z@w0@hmAxanGvfTk`F>i&yx*3GEdMrt`V`zt}$A{qk_v z)VIQ0b~)aD7QOSoefPUZQfne^uB!@l_SO#Dw)*Mp+XY8={i~DyYWD4j#~-9CA3&jH zk;vW;yFvg0!az|6L^YOnZ(b16!&=#((r2bZSdnp;tH?EA0Lh?*ccdkoUj$oX{m`NMX80L`uXl` z@BGJR0uAr~iQ0*0JY15w`?{cOq|1*Blcv1=qQsKhrMK&C;^f2I_U~Kr#6!e2dfDDi zU17%sXIxC|C(oI_;Tj zTBfqV&&pJ4Mc{Iu_V3H)ifILIk=-_Z#crS7rzIb#22MSpG3OdoRgOycs$S#|ta-L>;jiU; zWp$dSw`;@(%G^ILq@}h*Ei1e}Z}z=Ep3LE*K`DP1rbv{ePF-4Z)Siu9dQ$AEKaqBG zq(oR`tXxlD54Wm0EcwDWKY=gi>+g>@*Ro%U(D8g{&27BT&YEGa@SLBoCjLC#>Bpi! z*SB!{_j}1dg}f@FQd4GrfBVtmzR9)pprBdF9)-I$+i$n55t{H`_V|_R_70t8vMOp5hx%Teg(hq+uFYzC&pP_hA$XXy^)`!#& ze%pQXYLy-{n20T1)gvl$Z0^GLxrb-_PxPO($iOV^rQ`+Wx6cp$`@8o?P(WpZO1N>o z<~a?wYg4^9mgO9s_%Z$YfBn{ekG~gw?DzOxBz6D7uX}9&^%c6F1b5uveettnb>w`d zShhR&udeYw6F!4GY^|Y4)BC?1xA#T<;S_l~W2fZv_6Pr2T?%WY7jmu=dVJr}$}mc{ zE@x?$Zd~Z()BPWo9WdMZ_4w&MyWsiaP?Ge%}O25SF82A`zP-E{raQjDTR1Ok)WjB%XRW)c6PB|`zD_c zwW;waa6? ze*eB&W_`=TPI2QUxjT+Emp|~I-9F_e(+a)IGk#q%`B9W$_VM-Gy|IU9_aD=ro^D^P zvyn4lN@r-rozLxk{DC^0w^qK}w!Ha&+*ilL>OM7YJG44jeB+WY6x#iG9{;iZ-{;ep zgP;G~|Ne{OK7~33s~4KV|C<;8;Lu(Y@oG(3%_n|5Zr&@$E;~D?#bzIs1tC%YVSTzey?nNkMT7fIk3D?nPK0xG zId1y*p(fE}{`G^AKg?Pt#=ljRTg!NN^~1S&#WnoZe}27u@BiQSFQ2}C|Ng&Ub5isE zsaqV1*=_mM+{#|?>HV|c91fT+ypi(ZMV+SW$;%(yZ-|}Ax1M=;`Kc5EMxA~4bj7-F zZ>akC^?7)zLWzahe%&Kdr{CWB+9tH<_5Aghn-|??wX4@qadVNBp3r^o@ucj|^{OH& zvKM3znfE@QEu_6@%|hiHjUC+aHcLtjWq=Ho-98tT7}f`N@{a>X{{Ql<8A2r#gsEOQC zPdWQx&6g>E4!(XMQ!_<`bsB$KYti?PqMrY|pZwbMs36}dTg&A?!?)<`=i4qG{8#P% zIz92_ns1jv)dE&(oe9h<;!L|V>+Me__X}Hs`8?*N|BKl-)nWb1sKd`WW|?K$_4V4P z9e6AFX4ZL8liW)+YB!&CO}&-38q8f(!}@GTyjRAV-wu|Jc1oSwI9=QtkIvzr>G5yD z(g&w^ecP0+kvBW;-vaMA`+ui>W=X$0pPN_v^7HfB=jv{kesBG5m+CKRu}h%t?=yyd zMjQPae&xUD`8+ZG%a1>wz8np;t`Rq?kD79NPV&?G*}Z>dG(iJ=l>Wm`f7U(lYbX(U#DpJxGGjznP>S z;IaTsmLBkEkxCEI)Ap4y3Sf{}S>(XMJSSn&$Nk35_AzJJI_}=F`FkhU*5@ zJ(3SF9qDo4U=b-gWK*v!)=gSR}u{l5^tD)hdAX9|ojF+$7qR_jQHBFo$;0wlZTUnBX z8YkcrFz{MgFps+>X-gB-&(qMu+3D0pSKKSTLEgmLll@Y!FiqL%ZvX?Y!<%Q4PhL6h z5p#>$nW}(p{JteN#jqv(*rO42SU6@h;@u(c1U{-rI2f`+e8T*@P0oLsYm^Tt32al2 znVmc#yQZPhkomU5j+tHP?m5}e^Q@YIf#DdAATBN`PfY}0$h!7|E!Uv{0oRBB)+%XF z*!lhGb`ckWPEDnE^_q$T7Md-ZC990DvR~hx{rRG**O9*)_jw;?)x4CV8of!mx=6vj z$V#xFNqEi!7Ilk*oPGsO#j+m`KK}JdKfyPq;@WrcPIs2qVg?2Vb4CUR%sV#H z^7Bf-ry9AQ_vT|#wR@%F zdP?<{!h!_d7Yss=w(ZYxP-1!Rz4Y(DEv_Cfd>L33TAAj@lvxJOH(gR5vvG_0fju0T zi~R4kRW*nhKd%xw$CGy8X~X?P`wBDTHz|g_;9h5w)t4WjsUGup@pG@T6@kVp7~35A zIe6GKo`0}+I=eQJ^R-D~azh&Wnx2sA)F&I67#JAYvF!{?%P-1JEXm9VbvurR9Q2bh zZJmS?>$H_-do|BorX=$in$cCmfD{pn>wrbtrdfU2x{ogl{VNKOryY5?sy-7ds zed*?;yvLsRTW^%hzxe(w^Y@;c`R`vo=eEuJms9`emaTo>H~!trC-2vne_7}5zuPwV zz5F-XtscQkre%0tG4h=$b@|8@F5lLur7MG?FKk(0cEKb-I#cRti2m^^M_aw;i&Z9E zU9@Dv)kP{3uP$0L@#-R#NmmywnRIoL%H*qymQ21n>4|sk_n)sGJ$ltw^`}U5vqw^r z{fg8u>kJ)N-erp}nq-)$ACsITV|prbag1qHRj=5!jL3{FZoOgGGGuo|FIKz5@cLZC zBG11OUlL>jO)?EaMcxLA)EIL>ptyjZLX5)>wRh*Hzt&%!t*hC-G-iTY)8dBedo$l< zoMBijC?d_19cx!7>CqVtzD=46hv=2+g%3pd0D{{FDTVZ+_G6BVB52L9}q@L-#mWAz|O zOFEXxtW^HMq8rbrE$6b3+BsoW;v4Q+VpVNcSJo6y%VbK{s|Yxxq*YeFdh_S2K4(;u z*dv!dFxVe|%47Q*xephE({4Na8_)9Fu(m#J%kgvDx}Vn9{>_PAQf+KJt2FYb!kJU< zr$U}9oIT}!YfX)cUv5^|a?`Hqc@9kVPmF{LR^B~&{j})c{_VfzQHQ^0zF-!G4TxaL zz{RPl7(1jAk|bsxxPI~OWlM`A{T@$yOiFq7GIBFFOAGAUweu+Zj2T8t8dxR&TQl!{ zDfZ^oDbCd1M|DlRF?%+5e5*OL@@V3*tPW^HGwtg2qn@yWOVc2jqR z#Eh3OoiK)4We@Gp3IJ8Z%-C{rdLs4#42(S)4opb*pQW5YtWkRRLgdLS2}ZHT4YCh! zIlN--@sYg2cI4s}^tHAtM9un)85kHqZ4%6iEIlzdwInkaydv4Ss4#@X_=@oZqX$6_ z%z6tQ`xNK>tBY~`x3Es{syS`K0IT!{xP0FO3lg7FTlBce)sNQKYp{j;HniRT|&3Tb1^WmN?=WMsksG3 zStU836=b0^?)Kfb5Ndt@Q>3P;)#H`81j_`~$V(AMdne^Af1dX6T^akqv`Gst@3!vW zzx>3ar8_<6D^LA-e!bVr*O75o?3EU#So(g`+VcN)jo7i(e+{~BoPPI7MX1j^_2*7O z$-mt<=KKpvc__E~#Q(se^mbQ`xBryh1Th-=3cS`*-pMR}Pbl&YCMS1>JV<-;$H|`EWVU^&>Kq zKHLxKOT8VQY|lOUWUalaHBY$2mmgoB{`*$<`_uEkzmMzx*)+lVe%WciBNOL{^MoIn z@%(~`x?uLt+w1G^Z&a|~S1+{jV9m3SCHLOD%2?O_kUcG=?st2kSRq%WUwfi?heh(; zD8c7z{L=-+*ZlTU5qw=K*vYluw!>xfI;)8i*MgNNS!}WFY}u9T)p3P;jrSzmYfrDA z|IPb)<`czL2@~CBTsi*s@AdQF*UNwRR|!GtXaq`|zZ<=n}D=C~AJXiLcgM)Eky(VG%J|V~c&3!6E|*!*6Ru zTy<6-oR=M_B4liFw*9k0S4dddjAxg>sC4;!o0`oSK3{Bx)E=c}1s~sjC}HAJy18iU z%pD7uLZT#O&+r}lv323&#fxstW=#)u?fmohd4K=}Oc!6jdwRcsV(O*JU3Ke*~(0z>T0V4kY?1#1e`L_JK)uM5dKY0EEE zDCJO0cH)_NgFW+v3d=-KXMve#*dnR$z5 zyWw?{ZTt$KuRm_N>sMsvF7xHc<6`p*v#)&Ky!Bi~!@P6nDw@7cHI`fW`B6{$i+2xv z9{F6geEibZ^jt;F_Q}SUtw|lFJZmG=FU%_Cl8tD;n7QGcf1zCBqzNBQJ)S?E$g}qQ zzC5oDF3g3GL$>jTG>R@%xMHud)27|@LD>6T?nb-Xn+qDZ-dh~QoW*xJAmZ-jfNklQ zW<0Zr_rA_>NiFF59sVy&TV)>#$TDa2&7AOH=3;qIRoO7lrX?&MliaM9Ogh5TxlkpL zSy0_`*}m8wS&8Delg`xcR^h&{ry}s|mg>ry-6~u2r!V>Vc2bYvhAGFVvE{FbIeKlb zLa=`S665>jo>tTAq)kse6>(*V%@dv*mThvtwUX)Yku9Cat3LK8+cy`rEwfxSPf{Vc z&PUPa$SqWhu_(d%E$^4M*K`0a9nIe4h$WU7;X0EvbH9;40>bvl-Lx zEt33@rPE$lCbi{=+pWjKC2jL>E#3LxQpN?Y_60T$qWxl*Uj#15cqGzhdhsFCvOf}; z2Q)=5Ej{|BBT!@IOO?ie{)Nl|roK{p8T=y{wo5ilzI%Ro-z?{k#^$_rYeS&ueP{VDZA^7-cu zmt~IgC#n7jHa&acfl;H~)p@FX=cg_`_)Gurew|qi70)in94OvQnu9`ZW6P@p9Axa{#Xj-aUHS3sVET2wFK_R%3nc!v5}e7?U>xzr z*4C`(jW?0XdcWT$}M-5U3mho;(xc!AC>A`KSBBAIE z25FC{OUnF}CuOHM^iG$uy7{7H@#fxh=DQ+HCv48zda-KpS-0aQX|mzGD~flWJ1yDG z`>JH~>S&$?#rG^s2)_C> zVp8Arc(v6&Pj9NmO-|v7$x$?$Ni+S4UrpKLmbEi$trear*bLZ}=Je_di zu(4s*R{a?dkL~li^78D))avw%&9#T+-nAEf5&QCCX4Be7IS0co-*tR?@Y;vaq;7ua zX!~g%JCz%`51XZmZ9co_YR=3nZMhF~&wP89d+6KE+f&|lZ8~G` zENdiud-nD{2ET4b$4UHUS`Zx~loS87F#CP~|Cr)$z1(d1j=ooZ1-}q~aA&$Gm&mq+ z<-h++Y%4iCG3`d;rgs7xkES-f<NJuIyGNdx&t{4UL`08n4~>ll3qx>3{D* zwyocH*)(j^esXiE&6{htecoN0%vV*tY_o2LAA{ZP+5RWye)=|Z?YD17pMU=FZL046 zqdM&V<>`eL$FBxe%`gwM4Qkx%ad5{T-wiv~lmu09zpSo`Xl$x+4AqpL(!D}U?U>Ld zx6hIe+`La?&Tcpw8vADFs~h+J<;_pM>X&--^o%_PjYqy+4R?O?E~a!t?c-C2Z<{=+ z+19mMblZtT(@WhaEQzr^!smK*>FdMRA%%LE)>~Yfy1nk`O1pboCU1T`y+`%y&FFor z4%!)K-q>f*eq*0e#f^KZuP-UyHjkWsI_T4#iDI>`KO+Ai_4Sk)E$vopXX3ig!oVQG ziEXeZJvFx|NiQ=mvp38)|F)aJ-p}DY6TF!$)~T59<**Cblp=hU-7%=}?xJ>4OO@?$ z?}T=HpZ@iI?%kztL_8aw2^CqqKYM-l#ODS5vD+HXPdG8lJMa94NxaiJR_6(v(ULuz zxboNLXTI4FAAb@)qc&MuBT8oC%CP?lnTstg#dOUtWM9p=#%Oy@O0Z|u+s@26ha-6d zj5wvV^VU2&eo(1^+b3-Q4~My{Dr(D?Ifkt`7$nlY%XmT7|DyfY0TG?EI6c}IKTyr7 z=)9z`Q1WP*+2thGMt$WD2bz%7o!GjVhDSMcfK2+YU zm&?1Ve1rd#*ODvr-=BCbANDUUfij3?kxusY&*1*6yhsiP#uEIW^^dcWNB#rMj%iFK!6 zYyU7(RacwOYHGXviJwSzobcZ$jiu`o7WS0ByDg!%`DMwc$|~cTaR(LqV*>>zn%#K$ z*z_%vuIphduDW+0H^1EY#Pn(2g(yAg$FqgP82%n}xfn0So4M5G^LFK^g4-MA^xXJ0 z*mI|tUA**vf5-L$?$Z{x#qF7A1Zhw5I>5*qGk4LQ+y9&kPkged{v+vmbmjTp$r4xJ z8BI5f`Z3+qR;X_K`E4K7KIy75uiR8*t1kMz>7tsZs?K}gkd}7A&^O;_f3167e7@R# zh2TRmfoQ$e8xAqLuKwfoc)`g_La{5v*3`(Y>{2Q9Ick1SMdjf(gWd5*=Ic#Zy8Z5< z_NqVPkBqgxb$n~d^WOJ#!Dptn@E7Y(Y)`b`ckZ6YcAv`vouy*6KhBvH3Qme;G8MlP zxYjCu`l7`rR8QVIdBo+(hL93h>81$>{6qeod3mBSSk1$H%7XcQh2{@iGuN>>KU$xY zz35`{FX@HbGxtP_9(|RxXXf7n7Qc%MmoC@1wJH1_Z*0wzL$M#Df0PQT_AXf~tG+gN zQp$XnjRISw{f@9^OU=5f>$8|W?cF8cKU+@et=H6_U%Wk0?#aHznv;W0p8ox+f6BVE zX-^sN6|ZHvn_HZCB6FvC38#L;9(P5z!zNZ=Y+p@?dHC$f9J5y~RfqdD?)m5mFME6Q zYyFd01>WTPNvG zRt;OdYnlARgy@Wv^KUdh2u8}kn(t!1T1%RRt)F+QQcr-H>t2yFJ-SYgG9?FVc_sJt zer!CXW|SYf)bF4~aL4*P7mkHbS!#aqK4adTE#b#DJ)X^UY;)ytt7{LOPA2xGZarqT ze17lm(=1|l=KkAftNu)=+A_j#rSHdY^%TArR|My!6yO(2?Or zDT%og9Qh6@2)JH9qq)oMV$W5vT}MQ`CkOF__=ey6FBTM~HTlG&iGO~cJfIyNx#ygE z3$uaQS^lFvG9tTIKV`aat-Mt8#>X>Wbx)_C;M#SM*W7yZl+P!m^3M51S>FHcxzj{s zA}`OTx$LiR>56L$PV;@e&qPyMf5Fu2TDpSQPjHpU2W>xIs=~kVWb($NZhiUE6F#LS zHa~cK<5c?c!_M7LTMUn{dNz?s?xFgo&B;Gbrf)tl!QzDUNp>OW%H~;)N^0-lPMTnG zN_(ch%C1kBR`GRO7{#k91$uBl3m2&8+8v=1w;wf7c%K^U;huC!&(8rLiH9;cmj>E% zet&~qcxLE_1Cx%b%#Cm!&MJ^7V?;=%a`Zyw9P zdL#=TI9pgE(40I$J7BM1^KFM+b1}~TOSy3J8*G0!=BlmqqSVA<)bSy(YZ4L)z$X`( zm9$*);|Vx$$iRkCUBKF^dY8q|AJz|pn$-?^C97YQHvpYo-r%Vxrq1@Cv6#;meS7zJ zzsw(Apdl};yX4c0GxE_+j{)0$fS-lq1i$MAhh1WRtE`h07}=Sd`4;mfdrU~))5yx~ z%oQ==qdjx8eGI3vz;5>HAMI@|2^sv0rdwyCA6I6%oL%caBLl-mtaB0RrI|@3iOJw4 z%1c8J<~2D8*uD<`z}mZ6=Y`zuEaAy&+m3E~zBRA4!=vEscX7tb&0>plcN!$7-P<#B z`{s_1YrnghH~-6;ue0XghFX69gCYjCGd68~w)y7cnqOC{XS(Q5Zm&z}^~;S(?PFNP zVARlQ6x6yn?sSTr`ZMj5VeLL4LX2kwo=s@v;Z*oumEJFB@bN&)ffk9$1xIGsxbO75 ze5|`7-C-`z(ofPej{f7g+_R~A(etQZoR?J=u4&(t-uCX$neVRGc0~kFKf@U8vHW$t z)1G%{uFUfNI`e|f!b&IoC41sD^~0Y{_+y^fma~X`irTyByXGu1dAWbeQ<0@Bdlt!c z&AThxXLQym*Y~Z%j+BQlf`9R-OpthYqh?l4q~(oC3tFeOKDQCk5M+3IZQA-@GX%PX zCV6ZM3E(_D;pLyal6_}iw45<@VrMqHBjvW^&-$QU%*#&gTCqjDl-;MbATTRDo3D6z zcj}h4?>&!jtBF{N#$+dTi`>kuD_Nj=@@vD%X`8Rinmgmfi$}`qUMk&l-_yVI$Et9> z%@Uj5L_B|HckSk>IXj(p*-wAGBH`xVEi3;^v$wt7sUX9hq$Ql9_g?HJgX?P*-}0@& zTQ#}Sj}xkk2D;=z~y|Nl!$Y-6~quEdn|Kb>t=+<_yC9-KYb(=;8c>SI^%(d?9XlKo4^h^OQT~LPm@X3@%vbCNdIBQi~Fk z!E*wklYBv&4_d#^IV9|JQAxpDrZY-W@oLsGquD$E>$a(sImc}MYqu-z|CYu1?>?xy zUf*?2^0t-otY6XQM+&N1Pw%Kp`~OTJzgOa0CWqX8uiM(m_Z7cP`VqHkT9V--qc-OJ zDW;Pu)2t?36SUX;w`<~}C^3iClS&VKU2byZ=_#(=3~ROb{g`QcPi{>F^RoxJ;hUtY zo&{T-=QMoyaQ+XuRa%pN?)XzBqyMk!ha%UOwSNlqm3$>$s5_sN+r}6&wKT^5q50$U zzphA1L~iP<7F^wLx4ZJag0_u3v*>zm``^(K&!292Dt`XliT>X&rhng>*tPMKv)jQd zpVjvW{!Znvc>l5H!=Cu$8R0=Q6{@HA{$)nZEUPwLpNc2hq$cLzPBuHNepTQ~HX;_UqKrUw1J=3qjNHuh zj1ml!tt2`FOjsJ**Dv4g-oZY}gPGZ$*?i7(o`n*!iVdBOGxxn)tcsrQH*Q)h7z45h z>nZse7zY^&BqktDkU%OzgVY8_v9^btQW6L1_=>+CoWjk=c=CtDLQdmL2O~?E84q-n zg3s)Fw3w&o|6EBP3D~OpGr3>T-Q(fN9PJ2o4`!8|QJkBJHWLJ?6nP^YW?W?K?^?(y z<#GLxN2xoHfdylW!2@13$^X(uKNhd}$notfPhshi3#Z+pmtT}Yw^seS1e+7oS}fVW zJiiESx>6t!l1Zx;G?wW0gp?lvP2{o3y2-kM*MI~wgVumN2Hg_SmQc_CpW%83V;SaI ze>XPmT@Kr?fjN1XnVg!Fn3s&&1VKLgVoM762szuiv9&UPojR@_^2D|gWzkc~FgK{* zuv!9I>5_|H2Eo^iZAdu4pfkhiFjE2YVbAXb7#Ps4%^Y* z7}y!em=T(ZrNy@)5k5=$fFbN68(SV*T}+fj=F@47OqUxjTs^CM@A{F3hujy+H}#zP zfAMOC75Efp$N|XLE8>}h+cq>77>J^`w=`yK{D!+IhPWgVJs99lfyFaJbEX3abNqpQ z$&mYYj$HVmM;eV^sjk6UY8DKattR zj5dqD79_p!bg64-0I#uJ(6a* zH`+q{@!1)|5j}!pDtewe$}9JLe>%y;GfHQYLSv%VCDoN|lRm22iOihzXI>pz(uzFs zP3sI3149re0|S=ArX)4D7;-*V>r~&qI|>4=-{&m49_gZ4#FX<`UQ(L-_GRPM*L0Lr zgQkSOTOV@qz~+?I#h zU5z%My24c;VD-hiJEz(s1p-zd&2OH6SzjlODND3%r?xjpZY$rtolo2x9k%^Gxa(Qw z?3W8qGH73|y8mSD`Mj;xcbYqT8z!B$?mN=d5M{dTwbv#W7N#uILaozLf-FxK#9A83 zA6crbo>Cq4-p=G?+C_m0k6-a^d)*~F@%>4k;7%WxE*&NJZF$S4gp06TSyh@=aI>$e zq3BJ+FCj;Vb?d*^WN5A`_ja(mns#fOOcV>_)++a1JFhjzYcmza9FDT9*>|#ZqeX}a z%amWmf9g+Z7K$=Ho!2k>^kQJ#Dur#aov*L-ZIyqvX~*YviVMQ#&Yd72#&YFV-m{=N z{DLe~^1duS+Z$Ba?ZuT^W`A#@DP=*5!QpMEUZ^=O!1v2v1*{&ey$snNHt|t8dJAKRenT$;4Q>XR4rz z@mX`0C(9(t!*A(wF>R{-W3YYyVU-E|>rY>p5+)vaYF^;#vsSyW)ouJVyF+BU!gizc z*Mn|+Pdv9yA^hF9q7xy@wA*({?5;jAvGT|_&2=3$;uVk9MP;?t-z@y=T^$>D>u>h% zzvo|FpU57c_$t07Z1xq2>-xW6Px<^R;Mwz^mD85{P4}|etGV~2@w=kZ^lz2bc5ULm zw{Ki~b6&Bs@U~6#cDwV(3=GeV85ppX;3cWKC6xu>uFut3(VJ!)@U-3E%N2IP^OER~W2qAaw<=oR{O@*( zrKn)}TLE>6=*mk5ZZ#ZFr`PP%h>JOI@Au|N*VpiDgQ|)dcciv_4h=V#x^j38!}?pc zKDSG*7D<~c>ul%bJzNy3!1wvWqh*!-cMtzDH4C@3p4PBOcV76@B&$rpgl`At`)gFm z%sR?ETSh;*`|_!}HI;l4r}zAj`LN@>@3Y!JDFTiM;%>?Q&b`kz@1KmJ%<-i8L5Cjc zHa(75f3W3gk>D(ueLu`LsPD7HmvAiynaU_s@}@{!~W+blFZW&NH1Vnv!mB&c{kgc{a;QuZ)TVmv_nUe zv3~7Y7TyP&3bz#9_&RIany(zf8y7O`6dd2WmHEcZ?dxh7K0JTplXO|ueW$Zm$Ssw2 zj#(}DD%^9f~43xc(T6&&z$VQF?AzOHdNqvMEA~a}wuWd8_r| zV#8CF>;;#dSWeCoS@BL&<9?q(kJ2aOvb+Z?U3Xml?w!@4kPz{mCu2p+!f8TnQ7zUo z(}E2nKjbjqe($@aM8L82@K$A)IG#J^hx(%UcJB+ED8A)8tDH%O`o`-aMG-fbd2iAa zWO^fSzk)4kw$Z)DgEB!SpKT*8Z#~Iy6m0vNk+3i7Tl<=|M@$-0eR*ztJ<^b!bwJhh z!K_(c5hDLBCQdTkFu5l3ha!{CimyV!ExD2h3vH%4giJpo;P|)T?EK$dE=n;UH%dP{ z+;d#*@$Lir(RPha`Ev17B?AM)a_CJ2`DLj^MVTq7`kCb^M*5j0skx=a;ItarUg z_`kdpG2Hj|66rYs9Th8@4e`eO9O}_2!vIok-^MCx`KSTRu*{Yy8g+f*d+jT!A-n{=$)o+y84xwCmK}Q)YA*gq-W`!j-1)mdxJRA1Qvc@V`n<+ftuu8 zgPOZVl2u4%#u1G#`1Z~ zh3Toz3a6*1TI)=A*ea#$6sEUylA)5yrla>bt}dK3(dnGIu43r-+$+uVpItM5e2C3! zPJzo8%l@2B{%KxEpD*3C&`v^z>w>lPjYoW^eas{dFAjO@eCf?hlixE;s@2ZcdC#() z9OiuQm+5b=>8m`J-n-Pr`;Y(YYESi^Xx6V&{Eb9Iv?m)eIu^!0D`^++syr&WEh4yL z%Ip5t718R6GOk{iYD>j*y30PDa}oTm^LUcme8yUXQ@Lr<>;I}O6!txrK5OH_`bmO{ zABw%Vo4PeTw?;laYTqnTsYAibtO5oBU*r!QxZXZrgON)Z;Ww>N$1) zmWSO>z8%@7p-WQpzAL705Kgar`nr!NWcHbh<{h!6mJgoKZ2iOd^z6;kPn#YabS-|+ zWN4H1{vcm*j>AOj9eqlBC9f_Om~&i8Zs`F_;_>rVex z>3uuwZgpC^Bz{xgy6Ww*n7+K?vr7xl?#rxLb(-~Mi0{dC_E*#Grtt*D>1{jnzWl?{ zUH-22Er&Z!v??z?9ed2>T76_nyHrYd>?>Pc_SKOgGJ8b4>=u2WQ?tcDvvoqh!7k&- zFFfj9yL3a0w5BG0YpY&!XhwmJO@ar@Lc>?i4MwqBctWR({5$r0#a*}1pM?jKiyXV1 zL|m?3lWV*8sfoi~kf-TpM)iuUwc6b>4}A~be&}-I?kAxO78m7wMHLgals=2P{f6t` zhZUxFeSh30%a}h8vPpX3oP69teMQjZ6UL8TYw!10>sw=}7!>Y>MnU(NaTMtWNEldHFNdze)(CEq){?ezO;{dW(s8ZFpX zY*of{ykB(P@m~*P*7paM@7uA!aDzXGt>R=yTHhshc=`f zU{J73^LePqFV$dSap3snyUIs8J#^QYl6#&^kAQU-4aBBAG`o;) z?E~566JT@4fmz^p#jfg>AFTqbTc?(-TWF8o?*A|Mb0e%*irLHnTU1<&K$pg)Yw8JMIi=rlYGpgya}+F!}MluVtQtBZe}rxH?k}!P0Ai&Q4 z!)n*>DmG;oY0&-cg_(&<_O5<`e2vM3-I{jUFD(7{(9#%m{-3_lo zO^QATH~9G0&e&n+G0|>%whL&!tUJAc!!a1GQeNKn>W~8{4PotP<|gK37UMs+1$@{D z_~22ACsOaT!HfD+L4!qj$LtT=Up@y5YRo9kP0P(J#vRb6so;SAz3XQc8+*G#rb2*4Q>TJ5NAF z?9Rn6IM7-R^+q+UxL3qO?86w#hE1+OyyT8+Mf{7U_HSVKVql(No|}e#$tx&Z5V#fN zA5phr+&w$t7#>f7vj%QY{j%CsZH4n_jL*f3?|};!tfg2kC?$Y$0?N_sn7QuvuPQe7 z>NaR%I9%BU9U zF)t?V*md>s7SE{2&ZJ{;-3gklM`LwtzuXV^mD>Jb&b~d=dwZ+89q**;~HYfbv5R<9XO@0-PWvVLB+ z+2(tH*8O)*hiBBQef!oRSboxUezb+4&{MvRO_x}-E+;KH7;t^v(S1L6-!$=l6fWp} z(@9X7P4!8|hWSfWYoZ?)na)D-kEV(d0H75mav=M8H;!*%zZp3e3V&KWxZSXHW;e&hN|9@gM(meaVKLo%U!sy!tnhXxErIL&f0qsW zjPYc0uq}8(r~TJ2sVZD0mkQTpaYANSpq9dj`^kQ@fy~Bv&4yo1dNBdBjR?3K=SD3L ziwiyk%r+)qHqL@C>dBQ)1k5(UZ}u#lhi}I$NIpxzY*PYe~a$Z^=hTA%{d@Z)KF^mnLW6HoNUdyHzz# zvwhyo&A~mvm6w`al#gjN==i>A-i+{z;Qq$UZT^FEUgK?Y*8$wkF|ZW`=QY4K5S-Vz zd);<3?g-8+$j>as;v488TfbRJNxE=Y0N{MQBdAY24-K**_#09_%tXAQ_g@a8^^fdBuXqD}UJb z1$^G}nALz+ViDJ|hci6RYFF~!59`}lH{o;iw7ZLr&}&ut~a=!u&+H!PHb}E_8INV zCp{C~WAH#)b?zkR?Ii~H7g&l}HT&tSxZ7CX__^}j)4BOY@6QLXsz1#V?X^SxqxZAf zTa4HIOOD*NwD~97*@?>}PI5W@F+L(%{P<00qVB>*q=opP%DkWT%O~*kCDzKkAh8JB zauf-v16%Z*MVe&IS-($v%mo!DZjm~`_A?nML&79nysQKXYT%MP!EmoH_9LfK5mFMQS zrB5Gz4rjddi9`IfK+%a+hLf&oJI1^Ude4e_N+< zb<+CW8|hrx8yRP*8SRVvSNL&h@QiDFwyii{p2K67!m`g;eSW#clDkfO)7p>jzaAhg zQ#t>u(&3zdC!5>8Oo?!|Q#kWZ_Ryju9=~MI`KB0nUix>G{c`xkmB}0Ca_yXOtW9r@ zvOMpTynrngf1;T$2XE55JEu^p+bL0=ci*L}^Zz~8U77plaq`qDd+heK_bFB77M}VX z6z6%kxO;=RL1HgnLs&K`|(vP%Q#)(cp*NfqZFeLC{@6W=;zU2{i-11n_OvMkxswSV6a0 zy9FKMKf-vB(Xnr$qQtG%7g+ARJI-}Y6BdtH(q?&fCi>xTpaB>uj#UzZ4TTG29l(RH z6PQ}o<>h_ccWj!27>5C9_$8f#<;1mw(mxsO z>bvvoUcbA=f6=urbMdO5cTN`e=z00QuiDYK{MoJ3id8>~;*M#YHc8d6)Ha^9Zu;HG zgV*w7k1g=+KkcBIbo=))<+@dQmtvff6lEs9u}o+2FLU`fE23(zrnhogP;5g?@+4h{ zPJYAUDTlr?i4@y4r^UV3|IM0V`yx)(VWsebE#?eMU9IH}4lOvppis&|`ey92<2x9Z z`YBON|Ws_tU)&&(PX?RVn zxG?9bnAO%(=efVNHj5>eHg_?9yZN0BDMUZN~Y>r zcBeotbA~r^>mToS$j^N~&$8$E8lBG@b~*M>y0>MWKv&R@<}Ziq7$ufu<85zC(FgmywUtn|f2O z{p-iM+Dq-e-}Wx%3lI#uY5V*Cl84>@#ZlMsY?zWGrU)%rG4oAPVu~U5+o6{*C^qpj zfe&}bcIhr;`OJ5pW;J}yHOA^(ehY?;e2e*%d*(B#fh!yS3EeNa(fT?s z)OMMG?!f~sew4zvakeNiF9ozx1k|-a?sGXbC|rM_5N3ccuEtmKLV|8S2C7p0^orr@ruckZy-h4c2& zZDBhLaFyu*Kf`yM2e{F5%U!6R}N&r(NU!hR5AtvvDUBu-Q0k z&#tu+OL3cBjQ_+jcKj!fiT=E}0JJTlngQElrsBl1RM6pRDA}q=NB87)UOyf0r$GT6 z-#+qxEdEj&>cG}`urG043>#NL>xoHhF>PFpOJ|*IMFh7 zmT`;^_;^#S182p_8Hq*c6Fvfo65vbUHySK9K$IB5=?uz=s?Cz28M?W3=Eisb8&J}W&yZM=Gx~ATDI15eR6OGljrOIpE8{~ zGqgTxzH?d=*tOMT_4n|Vk95)!>?G7euiRFz)m*}`po5b$h{xavheR@ykD;@Yt6lsn z*6PLE>L$L|*>8QM!Fx@zu$IZfj*R)o_1_SzqKb#+VYTgBKE3m8aCyOO{YkoL%e6Ik-+OA^n5lF5Tz*mV&hOJj z^ik`c1{*{6Ae{NUI2E*i4kfcdN0&eo%PS8tF|4u`%4pj7cNeO z`Vq6|Qk-6tUyioHj0jJPCnP4!U<0?k8Qa?0)DJYp{FjvYBiVGf`Ojfzr2~+2a2H2= z)HF=wWWL>CF{=ta*-p;hJ{z_v8gpO|%bsY^@*Pt4L_@YjD`ZG;EZSVWk{2yoYA;z5 z3m!1Xx+l9hqbR==$3`$n_ak=#QwxU~q|bqMGY0e8>U&!m7#KLQPK$uoPv(G^e5Ot~ z$klAX)AqiS>%3f>=c=p83q@1A7EkNl`@h>K>ZZ_iZ{Z*N{-{2Q{dy#t*)(Kl(v4(^ zVs78MZzsdF5v{CkJ0k;A!=Q({}P zLh5Bar)-cYEOalJ!e0D)^L_j7vp=gg&R8UPaO>p}8GZ=Qa8NTg7*@^f>* ztp@Fiwf_71msd>!x>mQf!4YpgYrN)2ww>$`ckao#oXdGDRytGlrDLTU3$v31wK#z_o|t@X;9$D?;~ zL6D=N!=(TJCpR!{U%pCl?P|v7U*0a{&$9dUw!bd?q~6U(#TvWIVzwP$wx_&5wQ^1V z<-6-LyDle3&hb0C@%Efmf9|M7oi*LC=(KG0^_-ANkAfyIojW}@{Jx%RsqDK~f9wA5 zk*=EZ#+>D<;4Jg&Z#&uwo%`S2toxT6@pZ-VRJWju2Pagm>&o*vJ3;D1-JIJ;GJ@}& z>u>U!$$8cD*y1wItqz|5#R6}+X4L&%=N7Us@l!C|rJm_VeaqP^9Bgvulb{AiM;?>{}?(f9mw?cpb9mt<%;>UOhnb_MVK#QeB@vyk9bo0LzRjh9S|Ev#MU z*Sk{D^y!6=7B)U!B@v~4iGE_omC|JcyaPHs0(GVbHvbYix+Of|&2o)pdz%*7xf;F| z75S>!b#UE+75;%dWvs5XT}d0XHC_daT#j=LoWE$sH?C8+o~W2fUQ<)wcyg1OWvB17 zttUNmHm&jXOPZXTTO>4FCp%cc^vo?07v9ZgtbvEu_&P4ypPI`h^j9}Kc*2YK5wn|I z>W|-=;`v2=+rCfplYjr8gEpMKvF(*7oe=i zd3eURe*gZxvr1rX>%_D^P(uMx#DiuWf9o!tg3mt%iJ2I~Tab;@kopolT!-*a(#Z)- zVle;6KX~yH`}qd-&vJXfD;Tj3_7)c;7A0k4ZqrOiJHRXP@dR(`1%@Mvj(v&i>|C-X z!yE+}lq3Y}yci!H<^c^G_^_Sv{epf}O3L~99)v6`NJMQDf{IYA78WwP7%2Uj!gQov zQsTd{!3>@mvtOWh4{m?kDF-XCG5h>rALd~5A#CAoVM;+6Pv3Xb4G9g5YM5K|7s0mX z!^-SK2Y$?Nbgai#W*@lkeT$G&u=$-tr-(bSC?E3Ibf{@*1f5^=uVH8BJoM`0)Z|^$ zt)bNz_E1UAz!oY8ct4y(iT1=LGn3gESQ^F4`9fyez6aNHln7WeWoyUYnVr3i1RfO7=Dfk9FOV;E+RSd5+{ zj)6m^23w9`DfReF$SHV3g*d0cL!}2CDnGG>3bRrC3TM1IA~P9Vs2t$6Kq(1l6dhDl zkd!YrNp!Qa=+0AMKq;amc(D{w64GmPU`u7OXU5EAY@tBF>IY062`)c0Sv&ZRK{Gc7 zQU>N1h0zOwxLQwj*g_ZVc4y}#WuuhGpnVCj3ZQ_Y!?{W3a7^t4SLlue$uLLs6&(k5 zGRz0hL}Bl}6eJd9=b&GDgK~U)iUYe3&g0`da2y}stNG<1Y-t-VpP_Hp2iXcKZ!kTU zxMVA4?GoUi>`TaN>8QI`z`=*e)(-4CIK77JWc*Z{Yf}l@in@&j)z(A@_BA+d?ZFYC z2?st~*n)Bho@hk7uL;H0lmiTNK&PL`V7mmM4~L}>80Fp*vNRX9y?|nAVTuF$9dxhC zzj*vWU_wtn=PWU|U6y@(=$S%uwPi6OOY`xBZ`uI{8=O9E#NpGY{VP392?TFJDYl$= zj+$oG97k>|kWKEF((d26%0dfpVe|t0 zIJk}ZMgm(Yx~1KwhmhUaOK`k)!%Ogfa0!0HFd=V|I(k%oKcDG@zYfjETb-vt4`DP& zY+#hbsLmr6pjYQdLDhNUb8L0!n`g7z2ss5?Fu+PfBAo)S&bvU>`QdZeTAQhB?pxt^ zNnVQTO+5gRrenur{D_}BAo&cl_pTA zG(W@|L2<0hVC$8z=ft8^Y@q_p_UL)U7(I`ugY(FO>go#grug^r?@5Gg#uf+!Y=-9$ zelK*pw`Zt(#hW`|+0 zNCJzKhDRfp1^jMV{mXZ+>Ygt{GD0H$HNhOdDEyqM3q7_uzv0{cP6JiT>&igL_v z`x?