From 10f8ed27e6c313a68ba22c1a524cc9a47f22249f Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 29 Jun 2011 13:44:44 +0300 Subject: [PATCH] Updated GemRB (patch by Beholder) --- .../application/gemrb/AndroidAppSettings.cfg | 14 +- .../gemrb/AndroidData/override4.zip | Bin 0 -> 684835 bytes .../gemrb/AndroidData/scripts4.zip | Bin 0 -> 499584 bytes project/jni/application/gemrb/gemrb/GemRB.cpp | 31 +- .../application/gemrb/gemrb/core/ActorMgr.h | 7 +- .../gemrb/gemrb/core/Animation.cpp | 16 +- .../application/gemrb/gemrb/core/Animation.h | 3 +- .../gemrb/gemrb/core/AnimationFactory.cpp | 1 + .../gemrb/gemrb/core/AnimationFactory.h | 1 + .../gemrb/gemrb/core/AnimationMgr.h | 5 +- .../gemrb/gemrb/core/ArchiveImporter.h | 2 - .../gemrb/gemrb/core/CMakeLists.txt | 93 +- .../application/gemrb/gemrb/core/Cache.cpp | 1 + .../gemrb/gemrb/core/CharAnimations.cpp | 81 +- .../gemrb/gemrb/core/Compressor.cpp | 6 - .../application/gemrb/gemrb/core/Compressor.h | 6 +- .../gemrb/gemrb/core/ControlAnimation.cpp | 18 + .../gemrb/gemrb/core/ControlAnimation.h | 10 +- .../jni/application/gemrb/gemrb/core/Core.cpp | 111 --- .../gemrb/gemrb/core/DataFileMgr.h | 2 +- .../gemrb/gemrb/core/DialogHandler.cpp | 33 +- .../gemrb/gemrb/core/DialogHandler.h | 2 +- .../application/gemrb/gemrb/core/DialogMgr.h | 2 +- .../gemrb/gemrb/core/DisplayMessage.cpp | 15 +- .../gemrb/gemrb/core/DisplayMessage.h | 5 +- .../gemrb/gemrb/core/EffectQueue.cpp | 134 +-- .../gemrb/gemrb/core/EffectQueue.h | 1 + .../gemrb/gemrb/core/FileCache.cpp | 87 ++ .../application/gemrb/gemrb/core/FileCache.h | 27 + .../jni/application/gemrb/gemrb/core/Font.cpp | 49 +- .../jni/application/gemrb/gemrb/core/Font.h | 3 +- .../gemrb/gemrb/core/GUI/Button.cpp | 10 +- .../application/gemrb/gemrb/core/GUI/Button.h | 2 +- .../gemrb/gemrb/core/GUI/Console.cpp | 4 +- .../gemrb/gemrb/core/GUI/Console.h | 2 +- .../gemrb/gemrb/core/GUI/Control.cpp | 57 +- .../gemrb/gemrb/core/GUI/Control.h | 2 +- .../gemrb/gemrb/core/GUI/EventMgr.cpp | 3 +- .../gemrb/gemrb/core/GUI/EventMgr.h | 7 +- .../gemrb/gemrb/core/GUI/GameControl.cpp | 356 ++++--- .../gemrb/gemrb/core/GUI/GameControl.h | 9 +- .../gemrb/gemrb/core/GUI/Label.cpp | 7 +- .../application/gemrb/gemrb/core/GUI/Label.h | 2 +- .../gemrb/gemrb/core/GUI/MapControl.cpp | 30 +- .../gemrb/gemrb/core/GUI/MapControl.h | 2 - .../gemrb/gemrb/core/GUI/Progressbar.cpp | 7 +- .../gemrb/gemrb/core/GUI/Progressbar.h | 2 - .../gemrb/gemrb/core/GUI/ScrollBar.cpp | 8 +- .../gemrb/gemrb/core/GUI/ScrollBar.h | 2 - .../gemrb/gemrb/core/GUI/Slider.cpp | 7 +- .../application/gemrb/gemrb/core/GUI/Slider.h | 2 - .../gemrb/gemrb/core/GUI/TextArea.cpp | 80 +- .../gemrb/gemrb/core/GUI/TextArea.h | 4 +- .../gemrb/gemrb/core/GUI/TextEdit.cpp | 12 +- .../gemrb/gemrb/core/GUI/TextEdit.h | 2 +- .../gemrb/gemrb/core/GUI/Window.cpp | 1 + .../application/gemrb/gemrb/core/GUI/Window.h | 6 +- .../gemrb/gemrb/core/GUI/WorldMapControl.cpp | 7 +- .../gemrb/gemrb/core/GUI/WorldMapControl.h | 2 - .../jni/application/gemrb/gemrb/core/Game.cpp | 70 +- .../jni/application/gemrb/gemrb/core/Game.h | 13 +- .../application/gemrb/gemrb/core/GameData.cpp | 119 ++- .../application/gemrb/gemrb/core/GameData.h | 17 + .../gemrb/gemrb/core/GameScript/Actions.cpp | 237 +++-- .../gemrb/gemrb/core/GameScript/GSUtils.cpp | 150 ++- .../gemrb/gemrb/core/GameScript/GSUtils.h | 2 +- .../gemrb/core/GameScript/GameScript.cpp | 197 ++-- .../gemrb/gemrb/core/GameScript/GameScript.h | 61 +- .../gemrb/gemrb/core/GameScript/Matching.cpp | 16 +- .../gemrb/gemrb/core/GameScript/Matching.h | 2 + .../gemrb/gemrb/core/GameScript/Objects.cpp | 18 +- .../gemrb/gemrb/core/GameScript/Triggers.cpp | 496 ++-------- .../gemrb/gemrb/core/GlobalTimer.cpp | 8 +- .../application/gemrb/gemrb/core/ImageMgr.cpp | 8 +- .../gemrb/gemrb/core/IndexedArchive.cpp | 29 + .../gemrb/gemrb/core/IndexedArchive.h | 36 + .../application/gemrb/gemrb/core/IniSpawn.cpp | 15 +- .../gemrb/gemrb/core/Interface.cpp | 498 ++++------ .../application/gemrb/gemrb/core/Interface.h | 26 +- .../gemrb/gemrb/core/Inventory.cpp | 54 +- .../application/gemrb/gemrb/core/Inventory.h | 10 +- .../jni/application/gemrb/gemrb/core/Item.cpp | 4 +- .../jni/application/gemrb/gemrb/core/Item.h | 2 +- .../application/gemrb/gemrb/core/ItemMgr.h | 2 +- .../application/gemrb/gemrb/core/KeyMap.cpp | 157 +++ .../jni/application/gemrb/gemrb/core/KeyMap.h | 48 + .../application/gemrb/gemrb/core/Makefile.am | 8 +- .../jni/application/gemrb/gemrb/core/Map.cpp | 159 +-- .../jni/application/gemrb/gemrb/core/Map.h | 10 +- .../jni/application/gemrb/gemrb/core/MapMgr.h | 8 +- .../application/gemrb/gemrb/core/Palette.cpp | 10 + .../application/gemrb/gemrb/core/Palette.h | 1 + .../gemrb/gemrb/core/Particles.cpp | 10 +- .../jni/application/gemrb/gemrb/core/Plugin.h | 16 - .../gemrb/gemrb/core/PluginLoader.cpp | 239 +++++ .../gemrb/gemrb/core/PluginLoader.h | 32 + .../gemrb/gemrb/core/PluginMgr.cpp | 210 +--- .../application/gemrb/gemrb/core/PluginMgr.h | 36 +- .../application/gemrb/gemrb/core/Polygon.cpp | 10 +- .../gemrb/gemrb/core/Projectile.cpp | 16 +- .../application/gemrb/gemrb/core/Projectile.h | 6 +- .../gemrb/gemrb/core/ProjectileMgr.h | 2 +- .../gemrb/gemrb/core/ProjectileServer.cpp | 6 +- .../gemrb/gemrb/core/ProjectileServer.h | 1 - .../application/gemrb/gemrb/core/Region.cpp | 40 - .../jni/application/gemrb/gemrb/core/Region.h | 6 - .../gemrb/gemrb/core/ResourceManager.cpp | 22 +- .../application/gemrb/gemrb/core/SaveGame.h | 3 +- .../gemrb/gemrb/core/SaveGameIterator.cpp | 63 +- .../gemrb/gemrb/core/SaveGameMgr.h | 2 +- .../gemrb/gemrb/core/ScriptEngine.h | 2 +- .../gemrb/gemrb/core/Scriptable/Actor.cpp | 283 +++--- .../gemrb/gemrb/core/Scriptable/Actor.h | 32 +- .../gemrb/gemrb/core/Scriptable/Container.cpp | 23 +- .../gemrb/gemrb/core/Scriptable/Container.h | 1 + .../gemrb/gemrb/core/Scriptable/Door.cpp | 46 +- .../gemrb/gemrb/core/Scriptable/Door.h | 2 + .../gemrb/gemrb/core/Scriptable/InfoPoint.cpp | 65 +- .../gemrb/gemrb/core/Scriptable/InfoPoint.h | 1 - .../gemrb/core/Scriptable/Scriptable.cpp | 289 ++++-- .../gemrb/gemrb/core/Scriptable/Scriptable.h | 164 +++- .../gemrb/gemrb/core/ScriptedAnimation.cpp | 15 +- .../gemrb/gemrb/core/ScriptedAnimation.h | 11 +- .../application/gemrb/gemrb/core/Spell.cpp | 8 +- .../application/gemrb/gemrb/core/SpellMgr.h | 2 +- .../gemrb/gemrb/core/Spellbook.cpp | 98 +- .../application/gemrb/gemrb/core/Spellbook.h | 11 +- .../application/gemrb/gemrb/core/Store.cpp | 32 +- .../jni/application/gemrb/gemrb/core/Store.h | 2 +- .../application/gemrb/gemrb/core/StoreMgr.h | 5 +- .../application/gemrb/gemrb/core/StringMgr.h | 2 +- .../application/gemrb/gemrb/core/SymbolMgr.h | 9 +- .../gemrb/gemrb/core/System/DataStream.cpp | 37 +- .../gemrb/gemrb/core/System/DataStream.h | 9 +- .../gemrb/gemrb/core/System/FileStream.cpp | 296 +++--- .../gemrb/gemrb/core/System/FileStream.h | 23 +- .../gemrb/gemrb/core/System/Logging.cpp | 187 ++++ .../gemrb/gemrb/core/System/Logging.h | 92 ++ .../gemrb/gemrb/core/System/MemoryStream.cpp | 94 +- .../gemrb/gemrb/core/System/MemoryStream.h | 34 +- .../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 | 193 +--- .../application/gemrb/gemrb/core/System/VFS.h | 30 +- .../application/gemrb/gemrb/core/TableMgr.h | 2 +- .../application/gemrb/gemrb/core/TileMap.cpp | 10 +- .../application/gemrb/gemrb/core/TileMap.h | 2 +- .../application/gemrb/gemrb/core/TileMapMgr.h | 2 +- .../gemrb/gemrb/core/TileOverlay.cpp | 10 +- .../gemrb/gemrb/core/TileOverlay.h | 2 +- .../application/gemrb/gemrb/core/TileSetMgr.h | 2 +- .../gemrb/gemrb/core/Variables.cpp | 8 +- .../application/gemrb/gemrb/core/Variables.h | 2 + .../application/gemrb/gemrb/core/Video.cpp | 6 + .../jni/application/gemrb/gemrb/core/Video.h | 24 +- .../application/gemrb/gemrb/core/WindowMgr.h | 7 +- .../application/gemrb/gemrb/core/WorldMap.cpp | 32 +- .../application/gemrb/gemrb/core/WorldMap.h | 4 +- .../gemrb/gemrb/core/WorldMapMgr.h | 2 +- .../gemrb/gemrb/includes/HashMap.h | 455 +++++++++ .../gemrb/gemrb/includes/SClassID.h | 1 + .../gemrb/gemrb/includes/StringMap.h | 127 +++ .../gemrb/gemrb/includes/defsounds.h | 1 + .../gemrb/gemrb/includes/exports.h | 39 +- .../gemrb/gemrb/includes/globals.h | 44 +- .../gemrb/gemrb/includes/plugindef.h | 2 +- .../gemrb/gemrb/includes/win32def.h | 31 +- .../gemrb/plugins/2DAImporter/2DAImporter.cpp | 15 +- .../gemrb/plugins/2DAImporter/2DAImporter.h | 4 +- .../gemrb/plugins/ACMReader/ACMReader.cpp | 4 +- .../gemrb/plugins/AREImporter/AREImporter.cpp | 95 +- .../gemrb/plugins/AREImporter/AREImporter.h | 5 +- .../gemrb/plugins/BAMImporter/BAMImporter.cpp | 64 +- .../gemrb/plugins/BAMImporter/BAMImporter.h | 3 +- .../gemrb/plugins/BIFImporter/BIFImporter.cpp | 230 ++--- .../gemrb/plugins/BIFImporter/BIFImporter.h | 12 +- .../gemrb/plugins/BIKPlayer/BIKPlayer.cpp | 6 +- .../gemrb/plugins/BIKPlayer/GetBitContext.cpp | 2 +- .../gemrb/plugins/BMPImporter/BMPImporter.cpp | 39 +- .../gemrb/plugins/BMPImporter/BMPImporter.h | 1 + .../gemrb/plugins/CHUImporter/CHUImporter.cpp | 16 +- .../gemrb/plugins/CHUImporter/CHUImporter.h | 2 +- .../gemrb/gemrb/plugins/CMakeLists.txt | 1 + .../gemrb/plugins/CREImporter/CREImporter.cpp | 51 +- .../gemrb/plugins/CREImporter/CREImporter.h | 7 +- .../gemrb/plugins/DLGImporter/DLGImporter.cpp | 32 +- .../gemrb/plugins/DLGImporter/DLGImporter.h | 3 +- .../DirectoryImporter/DirectoryImporter.cpp | 102 +- .../DirectoryImporter/DirectoryImporter.h | 22 +- .../gemrb/plugins/EFFImporter/EFFImporter.cpp | 27 +- .../gemrb/plugins/EFFImporter/EFFImporter.h | 2 + .../gemrb/plugins/FXOpcodes/FXOpcodes.cpp | 848 ++++++++-------- .../gemrb/plugins/GAMImporter/GAMImporter.cpp | 30 +- .../gemrb/plugins/GAMImporter/GAMImporter.h | 3 +- .../gemrb/plugins/GUIScript/GUIScript.cpp | 281 ++++-- .../gemrb/gemrb/plugins/GUIScript/GUIScript.h | 2 +- .../gemrb/plugins/IDSImporter/IDSImporter.cpp | 16 +- .../gemrb/plugins/IDSImporter/IDSImporter.h | 7 +- .../plugins/IDSImporter/IDSImporterDefs.h | 6 - .../gemrb/plugins/INIImporter/INIImporter.cpp | 19 +- .../gemrb/plugins/INIImporter/INIImporter.h | 5 +- .../gemrb/plugins/ITMImporter/ITMImporter.cpp | 19 +- .../gemrb/plugins/ITMImporter/ITMImporter.h | 3 +- .../gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp | 228 ++--- .../gemrb/plugins/KEYImporter/Dictionary.cpp | 1 + .../gemrb/plugins/KEYImporter/KEYImporter.cpp | 45 +- .../gemrb/plugins/KEYImporter/KEYImporter.h | 4 +- .../gemrb/plugins/MOSImporter/MOSImporter.cpp | 43 +- .../gemrb/plugins/MUSImporter/MUSImporter.cpp | 7 +- .../gemrb/plugins/MVEPlayer/MVEPlayer.cpp | 4 +- .../gemrb/plugins/MVEPlayer/gstmvedemux.h | 4 +- .../gemrb/plugins/MVEPlayer/mve_player.cpp | 19 +- .../gemrb/gemrb/plugins/Makefile.am | 1 + .../gemrb/plugins/OGGReader/OGGReader.cpp | 2 +- .../plugins/OpenALAudio/AmbientMgrAL.cpp | 2 +- .../gemrb/plugins/OpenALAudio/OpenALAudio.cpp | 25 +- .../plugins/OpenALAudio/OpenALAudio.cpp.old | 924 ++++++++++++++++++ .../gemrb/plugins/PLTImporter/PLTImporter.cpp | 12 +- .../gemrb/plugins/PNGImporter/PNGImporter.cpp | 2 +- .../gemrb/plugins/PROImporter/PROImporter.cpp | 14 +- .../gemrb/plugins/PROImporter/PROImporter.h | 3 +- .../gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp | 47 +- .../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/gemrb/plugins/SDLAudio/SDLAudio.cpp | 16 +- .../gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp | 119 ++- .../gemrb/gemrb/plugins/SDLVideo/SDLVideo.h | 5 +- .../gemrb/plugins/SDLVideo/TileRenderer.inl | 48 +- .../gemrb/plugins/SPLImporter/SPLImporter.cpp | 23 +- .../gemrb/plugins/SPLImporter/SPLImporter.h | 3 +- .../gemrb/plugins/STOImporter/STOImporter.cpp | 91 +- .../gemrb/plugins/STOImporter/STOImporter.h | 17 +- .../gemrb/plugins/TISImporter/TISImporter.cpp | 25 +- .../gemrb/plugins/TISImporter/TISImporter.h | 3 +- .../gemrb/plugins/TLKImporter/TLKImporter.cpp | 19 +- .../gemrb/plugins/TLKImporter/TLKImporter.h | 3 +- .../gemrb/plugins/TLKImporter/TlkOverride.cpp | 4 +- .../gemrb/plugins/WAVReader/WAVReader.cpp | 2 +- .../gemrb/plugins/WEDImporter/WEDImporter.cpp | 19 +- .../gemrb/plugins/WEDImporter/WEDImporter.h | 3 +- .../gemrb/plugins/WMPImporter/WMPImporter.cpp | 30 +- .../gemrb/plugins/WMPImporter/WMPImporter.h | 3 +- .../gemrb/plugins/ZLibManager/ZLibManager.cpp | 5 +- .../gemrb/plugins/ZLibManager/ZLibManager.h | 2 +- 248 files changed, 7325 insertions(+), 4549 deletions(-) create mode 100644 project/jni/application/gemrb/AndroidData/override4.zip create mode 100644 project/jni/application/gemrb/AndroidData/scripts4.zip create mode 100644 project/jni/application/gemrb/gemrb/core/FileCache.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/FileCache.h create mode 100644 project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/IndexedArchive.h create mode 100644 project/jni/application/gemrb/gemrb/core/KeyMap.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/KeyMap.h create mode 100644 project/jni/application/gemrb/gemrb/core/PluginLoader.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/PluginLoader.h create mode 100644 project/jni/application/gemrb/gemrb/core/System/Logging.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/System/Logging.h create mode 100644 project/jni/application/gemrb/gemrb/core/System/SlicedStream.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/System/SlicedStream.h create mode 100644 project/jni/application/gemrb/gemrb/core/System/String.cpp create mode 100644 project/jni/application/gemrb/gemrb/core/System/String.h create mode 100644 project/jni/application/gemrb/gemrb/includes/HashMap.h create mode 100644 project/jni/application/gemrb/gemrb/includes/StringMap.h create mode 100644 project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp.old create mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/CMakeLists.txt create mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/Makefile.am create mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.cpp create mode 100644 project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.h diff --git a/project/jni/application/gemrb/AndroidAppSettings.cfg b/project/jni/application/gemrb/AndroidAppSettings.cfg index 3889d0934..8d40b05fc 100644 --- a/project/jni/application/gemrb/AndroidAppSettings.cfg +++ b/project/jni/application/gemrb/AndroidAppSettings.cfg @@ -5,7 +5,7 @@ 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)|override2.zip^!GemRB data(scripts)|scripts2.zip" +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" SdlVideoResize=y SdlVideoResizeKeepAspect=y NeedDepthBuffer=n @@ -18,16 +18,18 @@ AppUsesJoystick=n AppHandlesJoystickSensitivity=n AppUsesMultitouch=n NonBlockingSwapBuffers=n -RedefinedKeys="LCTRL c p o e" +RedefinedKeys="LCTRL c NO_REMAP NO_REMAP e" AppTouchscreenKeyboardKeysAmount=0 AppTouchscreenKeyboardKeysAmountAutoFire=0 -RedefinedKeysScreenKb="LCTRL c p o e" +RedefinedKeysScreenKb="LCTRL c NO_REMAP NO_REMAP e" +StartupMenuButtonTimeout=2000 +HiddenMenuOptions='' MultiABI=y -AppVersionCode=0641 -AppVersionName="0.6.4.1" +AppVersionCode=0643 +AppVersionName="0.6.4.3" CompiledLibraries="sdl_mixer ogg vorbis openal png python" CustomBuildScript=n -AppCflags='-fexceptions -finline-functions -O3 -DSTATIC_LINK=Yes -DHAVE_SNPRINTF -DTOUCHSCREEN' +AppCflags='-fexceptions -finline-functions -O3 -DSTATIC_LINK=Yes -DHAVE_SNPRINTF' AppLdflags='' AppSubdirsBuild='' AppCmdline='GemRB' diff --git a/project/jni/application/gemrb/AndroidData/override4.zip b/project/jni/application/gemrb/AndroidData/override4.zip new file mode 100644 index 0000000000000000000000000000000000000000..8c8645b43ec22ac1278884e77ac456b502dede89 GIT binary patch literal 684835 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�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%0Akaez-0Dc;E8_ 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 GFaQ9#%uHYa literal 0 HcmV?d00001 diff --git a/project/jni/application/gemrb/AndroidData/scripts4.zip b/project/jni/application/gemrb/AndroidData/scripts4.zip new file mode 100644 index 0000000000000000000000000000000000000000..542fce81c9200d369998a919438c0f985248f5f5 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/project/jni/application/gemrb/gemrb/GemRB.cpp b/project/jni/application/gemrb/gemrb/GemRB.cpp index dc688302e..104171d7e 100644 --- a/project/jni/application/gemrb/gemrb/GemRB.cpp +++ b/project/jni/application/gemrb/gemrb/GemRB.cpp @@ -22,10 +22,14 @@ #include "win32def.h" // logging -#include - #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 @@ -35,28 +39,43 @@ #ifdef ANDROID #include -#include "Audio.h" +#include "audio.h" // pause audio playing if app goes in background static void appPutToBackground() { - core->GetAudioDrv()->Pause(); + core->GetAudioDrv()->Pause(); } // resume audio playing if app return to foreground static void appPutToForeground() { - core->GetAudioDrv()->Resume(); + 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 ); - printf("Press enter to continue..."); + print("Press enter to continue..."); textcolor(DEFAULT); getc(stdin); return -1; diff --git a/project/jni/application/gemrb/gemrb/core/ActorMgr.h b/project/jni/application/gemrb/gemrb/core/ActorMgr.h index 7afcfbaf8..e072defc5 100644 --- a/project/jni/application/gemrb/gemrb/core/ActorMgr.h +++ b/project/jni/application/gemrb/gemrb/core/ActorMgr.h @@ -22,14 +22,15 @@ #define ACTORMGR_H #include "Plugin.h" -#include "Scriptable/Actor.h" -#include "System/DataStream.h" + +class Actor; +class DataStream; class GEM_EXPORT ActorMgr : public Plugin { public: ActorMgr(void); virtual ~ActorMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Actor* GetActor(unsigned char is_in_party) = 0; //returns saved size, updates internal offsets before save diff --git a/project/jni/application/gemrb/gemrb/core/Animation.cpp b/project/jni/application/gemrb/gemrb/core/Animation.cpp index 6ec1caa1f..4d58f1fdc 100644 --- a/project/jni/application/gemrb/gemrb/core/Animation.cpp +++ b/project/jni/application/gemrb/gemrb/core/Animation.cpp @@ -25,6 +25,7 @@ #include "Game.h" #include "Interface.h" #include "Map.h" +#include "Sprite2D.h" #include "Video.h" Animation::Animation(int count) @@ -71,8 +72,7 @@ void Animation::SetPos(unsigned int index) void Animation::AddFrame(Sprite2D* frame, unsigned int index) { if (index>=indicesCount) { - printf("You tried to write past a buffer in animation, BAD!\n"); - abort(); + error("Animation", "You tried to write past a buffer in animation, BAD!\n"); } core->GetVideoDriver()->FreeSprite(frames[index]); frames[index]=frame; @@ -107,13 +107,13 @@ unsigned int Animation::GetCurrentFrame() const Sprite2D* Animation::LastFrame(void) { if (!Flags&A_ANI_ACTIVE) { - printf("Frame fetched while animation is inactive!\n"); + print("Frame fetched while animation is inactive!\n"); return NULL; } if (gameAnimation) { starttime = core->GetGame()->Ticks; } else { - GetTime( starttime ); + starttime = GetTickCount(); } Sprite2D* ret; if (playReversed) @@ -126,14 +126,14 @@ Sprite2D* Animation::LastFrame(void) Sprite2D* Animation::NextFrame(void) { if (!Flags&A_ANI_ACTIVE) { - printf("Frame fetched while animation is inactive!\n"); + print("Frame fetched while animation is inactive!\n"); return NULL; } if (starttime == 0) { if (gameAnimation) { starttime = core->GetGame()->Ticks; } else { - GetTime( starttime ); + starttime = GetTickCount(); } } Sprite2D* ret; @@ -149,7 +149,7 @@ Sprite2D* Animation::NextFrame(void) if (gameAnimation) { time = core->GetGame()->Ticks; } else { - GetTime(time); + time = GetTickCount(); } //it could be that we skip more than one frame in case of slow rendering @@ -180,7 +180,7 @@ Sprite2D* Animation::NextFrame(void) Sprite2D* Animation::GetSyncedNextFrame(Animation* master) { if (!Flags&A_ANI_ACTIVE) { - printf("Frame fetched while animation is inactive!\n"); + print("Frame fetched while animation is inactive!\n"); return NULL; } Sprite2D* ret; diff --git a/project/jni/application/gemrb/gemrb/core/Animation.h b/project/jni/application/gemrb/gemrb/core/Animation.h index fcf9a7d13..5c32424cf 100644 --- a/project/jni/application/gemrb/gemrb/core/Animation.h +++ b/project/jni/application/gemrb/gemrb/core/Animation.h @@ -26,10 +26,11 @@ #include "globals.h" #include "Region.h" -#include "Sprite2D.h" #include +class Sprite2D; + class GEM_EXPORT Animation { private: Sprite2D **frames; diff --git a/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp b/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp index e6637394c..941e963a1 100644 --- a/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp +++ b/project/jni/application/gemrb/gemrb/core/AnimationFactory.cpp @@ -23,6 +23,7 @@ #include "win32def.h" #include "Interface.h" +#include "Sprite2D.h" #include "Video.h" AnimationFactory::AnimationFactory(const char* ResRef) diff --git a/project/jni/application/gemrb/gemrb/core/AnimationFactory.h b/project/jni/application/gemrb/gemrb/core/AnimationFactory.h index b385362eb..2da099b39 100644 --- a/project/jni/application/gemrb/gemrb/core/AnimationFactory.h +++ b/project/jni/application/gemrb/gemrb/core/AnimationFactory.h @@ -25,6 +25,7 @@ #include "globals.h" #include "Animation.h" +#include "AnimStructures.h" #include "FactoryObject.h" class GEM_EXPORT AnimationFactory : public FactoryObject { diff --git a/project/jni/application/gemrb/gemrb/core/AnimationMgr.h b/project/jni/application/gemrb/gemrb/core/AnimationMgr.h index d161aff4b..4bf90c61d 100644 --- a/project/jni/application/gemrb/gemrb/core/AnimationMgr.h +++ b/project/jni/application/gemrb/gemrb/core/AnimationMgr.h @@ -25,14 +25,15 @@ #include "Animation.h" #include "AnimationFactory.h" -#include "Font.h" #include "Plugin.h" +class Font; + class GEM_EXPORT AnimationMgr : public Plugin { public: AnimationMgr(void); virtual ~AnimationMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + 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; diff --git a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h b/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h index 076d6795c..fe464cb25 100644 --- a/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h +++ b/project/jni/application/gemrb/gemrb/core/ArchiveImporter.h @@ -29,12 +29,10 @@ class GEM_EXPORT ArchiveImporter : public Plugin { public: ArchiveImporter(void); virtual ~ArchiveImporter(void); - virtual int OpenArchive(const char* filename) = 0; 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; - virtual DataStream* GetStream(unsigned long Resource, unsigned long Type) = 0; }; #endif diff --git a/project/jni/application/gemrb/gemrb/core/CMakeLists.txt b/project/jni/application/gemrb/gemrb/core/CMakeLists.txt index 767e0332f..2d6c8dec1 100644 --- a/project/jni/application/gemrb/gemrb/core/CMakeLists.txt +++ b/project/jni/application/gemrb/gemrb/core/CMakeLists.txt @@ -1,6 +1,92 @@ ADD_DEFINITIONS(-DGEM_BUILD_DLL) -FILE(GLOB gemrb_core_LIB_SRCS "*.cpp" +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 @@ -27,12 +113,13 @@ FILE(GLOB gemrb_core_LIB_SRCS "*.cpp" Scriptable/InfoPoint.cpp Scriptable/Scriptable.cpp Scriptable/PCStatStruct.cpp - System/CachedFileStream.cpp System/DataStream.cpp System/FileStream.cpp System/MemoryStream.cpp + System/Logging.cpp + System/SlicedStream.cpp + System/String.cpp System/VFS.cpp - System/snprintf.cpp ) if (STATIC_LINK) diff --git a/project/jni/application/gemrb/gemrb/core/Cache.cpp b/project/jni/application/gemrb/gemrb/core/Cache.cpp index 647b0cb93..4c11ebabc 100644 --- a/project/jni/application/gemrb/gemrb/core/Cache.cpp +++ b/project/jni/application/gemrb/gemrb/core/Cache.cpp @@ -20,6 +20,7 @@ #include "Cache.h" +#include #include // private inlines diff --git a/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp b/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp index 66dc4b1eb..aa4519042 100644 --- a/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp +++ b/project/jni/application/gemrb/gemrb/core/CharAnimations.cpp @@ -22,6 +22,8 @@ #include "win32def.h" +#include "AnimationFactory.h" +#include "DataFileMgr.h" #include "Game.h" #include "GameData.h" #include "ImageMgr.h" @@ -448,8 +450,7 @@ void CharAnimations::InitAvatarsTable() { AutoTable Avatars("avatars"); if (!Avatars) { - printMessage("CharAnimations", "A critical animation file is missing!\n", LIGHT_RED); - abort(); + error("CharAnimations", "A critical animation file is missing!\n"); } AvatarTable = (AvatarStruct *) calloc ( AvatarsCount = Avatars->GetRowCount(), sizeof(AvatarStruct) ); int i=AvatarsCount; @@ -511,8 +512,8 @@ void CharAnimations::InitAvatarsTable() 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:", LIGHT_RED); - printf("%02x %04x-%04x ", (unsigned int) value, (unsigned int) rmin, (unsigned int) rmax); + printMessage("CharAnimations", "bloodclr entry: %02x %04x-%04x ", LIGHT_RED, + (unsigned int) value, (unsigned int) rmin, (unsigned int) rmax); printStatus("Invalid value!", LIGHT_RED); continue; } @@ -609,8 +610,7 @@ CharAnimations::CharAnimations(unsigned int AnimID, ieDword ArmourLevel) } } ResRef[0]=0; - printMessage("CharAnimations", " ", LIGHT_RED); - printf("Invalid or nonexistent avatar entry:%04X\n", AnimID); + printMessage("CharAnimations", "Invalid or nonexistent avatar entry:%04X\n", LIGHT_RED, AnimID); } //we have to drop them when armourlevel changes @@ -782,8 +782,7 @@ WSW 003 | 013 ESE Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Orient) { if (StanceID>=MAX_ANIMS) { - printf("Illegal stance ID\n"); - abort(); + error("CharAnimation", "Illegal stance ID\n"); } //for paletted dragon animations, we need the stance id @@ -864,7 +863,7 @@ Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Ori autoSwitchOnEnd = true; break; default: - printf ("Invalid Stance: %d\n", StanceID); + print ("Invalid Stance: %d\n", StanceID); break; } Animation** anims = Anims[StanceID][Orient]; @@ -931,10 +930,8 @@ Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Ori if (!af) { if (part < actorPartCount) { - char warnbuf[200]; - snprintf(warnbuf, 200, - "Couldn't create animationfactory: %s (%04x)\n", NewResRef, GetAnimationID()); - printMessage("CharAnimations",warnbuf,LIGHT_RED); + 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; @@ -951,11 +948,8 @@ Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Ori if (!a) { if (part < actorPartCount) { - char warnbuf[200]; - snprintf(warnbuf, 200, - "Couldn't load animation: %s, cycle %d\n", + printMessage("CharAnimations", "Couldn't load animation: %s, cycle %d\n", LIGHT_RED, NewResRef, Cycle); - printMessage("CharAnimations",warnbuf,LIGHT_RED); for (int i = 0; i < part; ++i) delete anims[i]; delete[] anims; @@ -1100,8 +1094,7 @@ Animation** CharAnimations::GetAnimation(unsigned char Stance, unsigned char Ori Anims[StanceID][0] = anims; break; default: - printMessage("CharAnimations","Unknown animation type\n",LIGHT_RED); - abort(); + error("CharAnimations", "Unknown animation type\n"); } delete equipdat; @@ -1115,7 +1108,6 @@ void CharAnimations::GetAnimResRef(unsigned char StanceID, char* NewResRef, unsigned char& Cycle, int Part, EquipResRefData*& EquipData) { - char tmp[256]; EquipData = 0; Orient &= 15; switch (GetAnimType()) { @@ -1203,9 +1195,7 @@ void CharAnimations::GetAnimResRef(unsigned char StanceID, strnlwrcpy(NewResRef, AvatarTable[AvatarsRowNum].Prefixes[Part], 8); break; default: - sprintf (tmp,"Unknown animation type in avatars.2da row: %d\n", AvatarsRowNum); - printMessage ("CharAnimations",tmp, LIGHT_RED); - abort(); + error("CharAnimations", "Unknown animation type in avatars.2da row: %d\n", AvatarsRowNum); } } @@ -1224,8 +1214,7 @@ void CharAnimations::GetEquipmentResRef(const char* equipRef, bool offhand, GetMHREquipmentRef( ResRef, Cycle, equipRef, offhand, equip ); break; default: - printMessage ("CharAnimations", "Unsupported animation type for equipment animation.\n", LIGHT_RED); - abort(); + error("CharAnimations", "Unsupported animation type for equipment animation.\n"); break; } } @@ -1379,9 +1368,12 @@ void CharAnimations::AddVHR2Suffix(char* ResRef, unsigned char StanceID, case IE_ANI_WALK: strcat( ResRef, "g11" ); break; + + case IE_ANI_HIDE: + strcat( ResRef, "g22" ); + break; default: - printf("VHR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "VHR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } } @@ -1459,8 +1451,7 @@ void CharAnimations::AddVHR3Suffix(char* ResRef, unsigned char StanceID, strcat( ResRef, "g11" ); break; default: - printf("VHR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "VHR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } } @@ -1521,8 +1512,7 @@ void CharAnimations::AddFFSuffix(char* ResRef, unsigned char StanceID, break; default: - printf("Four frames Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "Four frames Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } @@ -1663,8 +1653,7 @@ void CharAnimations::AddVHRSuffix(char* ResRef, unsigned char StanceID, break; default: - printf("VHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "VHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } EquipData->Cycle = Cycle; @@ -1732,13 +1721,13 @@ void CharAnimations::AddSixSuffix(char* ResRef, unsigned char StanceID, break; case IE_ANI_TWITCH: + case IE_ANI_SLEEP: strcat( ResRef, "g2" ); Cycle = 64 + Orient; break; default: - printf("Six Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "Six Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } @@ -1787,8 +1776,7 @@ void CharAnimations::AddLR2Suffix(char* ResRef, unsigned char StanceID, Cycle = 32 + Orient; break; default: - printf("LR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "LR2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient>=4) { @@ -1910,8 +1898,7 @@ void CharAnimations::AddMHRSuffix(char* ResRef, unsigned char StanceID, Cycle = Orient; break; default: - printf("MHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "MHR Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient>=5) { @@ -2018,14 +2005,14 @@ void CharAnimations::AddLRSuffix2( char* ResRef, unsigned char StanceID, 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: - printf("LRSuffix2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "LRSuffix2 Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient > 9) { @@ -2101,8 +2088,7 @@ void CharAnimations::AddLRSuffix( char* ResRef, unsigned char StanceID, Cycle = 40 + Orient / 2; break; default: - printf("LR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "LR Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient > 9) { @@ -2175,8 +2161,7 @@ void CharAnimations::AddLR3Suffix( char* ResRef, unsigned char StanceID, Cycle = 24 + Orient / 2; break; default: - printf("LR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "LR3 Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient > 9) { @@ -2250,8 +2235,7 @@ void CharAnimations::AddMMR2Suffix(char* ResRef, unsigned char StanceID, Cycle = ( Orient / 2 ); break; default: - printf("MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient > 9) { @@ -2337,8 +2321,7 @@ void CharAnimations::AddMMRSuffix(char* ResRef, unsigned char StanceID, Cycle = ( Orient / 2 ); break; default: - printf("MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); - abort(); + error("CharAnimation", "MMR Animation: unhandled stance: %s %d\n", ResRef, StanceID); break; } if (Orient > 9) { diff --git a/project/jni/application/gemrb/gemrb/core/Compressor.cpp b/project/jni/application/gemrb/gemrb/core/Compressor.cpp index e7a675be3..187c160b0 100644 --- a/project/jni/application/gemrb/gemrb/core/Compressor.cpp +++ b/project/jni/application/gemrb/gemrb/core/Compressor.cpp @@ -29,9 +29,3 @@ Compressor::Compressor(void) Compressor::~Compressor(void) { } - -// Initialization Function. Returns FALSE if there was an error during initialization, else returns TRUE. -int Compressor::Init(void) -{ - return GEM_OK; -} diff --git a/project/jni/application/gemrb/gemrb/core/Compressor.h b/project/jni/application/gemrb/gemrb/core/Compressor.h index 3409f8019..dcc1ce409 100644 --- a/project/jni/application/gemrb/gemrb/core/Compressor.h +++ b/project/jni/application/gemrb/gemrb/core/Compressor.h @@ -24,16 +24,12 @@ #include "Plugin.h" #include "System/DataStream.h" -#include - class GEM_EXPORT Compressor : public Plugin { public: Compressor(void); virtual ~Compressor(void); - /** Initialization Function. Returns FALSE if there was an error during initialization, else returns TRUE. */ - virtual int Init(void); /** decompresses a datastream (memory or file) to a FILE * stream */ - virtual int Decompress(FILE* dest, DataStream* source, unsigned int size_guess = 0) const = 0; + 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; }; diff --git a/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp b/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp index 6e618844a..7e228f6ea 100644 --- a/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp +++ b/project/jni/application/gemrb/gemrb/core/ControlAnimation.cpp @@ -22,7 +22,9 @@ #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 */ @@ -45,6 +47,7 @@ ControlAnimation::ControlAnimation(Control* ctl, const ieResRef ResRef, int Cycl control = ctl; control->animation = this; has_palette = false; + is_blended = false; } //freeing the bitmaps only once, but using an intelligent algorithm @@ -108,6 +111,7 @@ void ControlAnimation::UpdateAnimation(void) //stopping at end frame if (control->Flags & IE_GUI_BUTTON_PLAYONCE) { core->timer->RemoveAnimation( this ); + control->SetAnimPicture( NULL ); return; } anim_phase = 0; @@ -122,8 +126,18 @@ void ControlAnimation::UpdateAnimation(void) 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 ); @@ -136,3 +150,7 @@ void ControlAnimation::SetPaletteGradients(ieDword *col) 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 index c85870f67..bb7a86d28 100644 --- a/project/jni/application/gemrb/gemrb/core/ControlAnimation.h +++ b/project/jni/application/gemrb/gemrb/core/ControlAnimation.h @@ -23,13 +23,13 @@ #include "RGBAColor.h" #include "exports.h" - -#include "AnimationFactory.h" -#include "Sprite2D.h" -#include "GUI/Control.h" +#include "globals.h" #include +class AnimationFactory; +class Control; + class GEM_EXPORT ControlAnimation { private: AnimationFactory* bam; @@ -38,6 +38,7 @@ private: 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); @@ -46,6 +47,7 @@ public: //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 index 5fd0b66e6..05d0911e4 100644 --- a/project/jni/application/gemrb/gemrb/core/Core.cpp +++ b/project/jni/application/gemrb/gemrb/core/Core.cpp @@ -48,65 +48,6 @@ BOOL WINAPI DllEntryPoint(HINSTANCE /*hinstDLL*/, DWORD /*fdwReason*/, //// Globally used functions -ieByte pl_uppercase[256]; -ieByte pl_lowercase[256]; - -// these 3 functions will copy a string to a zero terminated string with a maximum length -void strnlwrcpy(char *dest, const char *source, int count) -{ - while(count--) { - *dest++ = pl_lowercase[(ieByte) *source]; - if(!*source++) { - while(count--) *dest++=0; - break; - } - } - *dest=0; -} - -void strnuprcpy(char* dest, const char *source, int count) -{ - while(count--) { - *dest++ = pl_uppercase[(ieByte) *source]; - if(!*source++) { - while(count--) *dest++=0; - break; - } - } - *dest=0; -} - -// this one also filters spaces, used to copy variables -void strnspccpy(char* dest, const char *source, int count) -{ - memset(dest,0,count); - while(count--) { - char c = pl_uppercase[(ieByte) *source]; - if (c!=' ') { - *dest++=c; - } - if(!*source++) { - return; - } - } -} - -#ifndef HAVE_STRNLEN -int strnlen(const char* string, int maxlen) -{ - if (!string) { - return -1; - } - int i = 0; - while (maxlen-- > 0) { - if (!string[i]) - break; - i++; - } - return i; -} -#endif // ! HAVE_STRNLEN - static const unsigned char orientations[25]={ 6,7,8,9,10, 5,6,8,10,11, @@ -269,55 +210,3 @@ int EARelation(Scriptable* Owner, Actor* target) return EAR_NEUTRAL; } - -/** Returns the length of string (up to a delimiter) */ -GEM_EXPORT int strlench(const char* string, char ch) -{ - int i; - for (i = 0; string[i] && string[i] != ch; i++) - ; - return i; -} - -//// Compatibility functions -#ifndef HAVE_STRNDUP -GEM_EXPORT char* strndup(const char* s, size_t l) -{ - size_t len = strlen( s ); - if (len < l) { - l = len; - } - char* string = ( char* ) malloc( l + 1 ); - strncpy( string, s, l ); - string[l] = 0; - return string; -} -#endif - -#ifdef WIN32 - -#else - -char* strupr(char* string) -{ - char* s; - if (string) { - for (s = string; *s; ++s) - *s = toupper( *s ); - } - return string; -} - -char* strlwr(char* string) -{ - char* s; - if (string) { - for (s = string; *s; ++s) - *s = tolower( *s ); - } - return string; -} - - -#endif // ! WIN32 - diff --git a/project/jni/application/gemrb/gemrb/core/DataFileMgr.h b/project/jni/application/gemrb/gemrb/core/DataFileMgr.h index 8773767b7..8df95ae7e 100644 --- a/project/jni/application/gemrb/gemrb/core/DataFileMgr.h +++ b/project/jni/application/gemrb/gemrb/core/DataFileMgr.h @@ -40,7 +40,7 @@ class GEM_EXPORT DataFileMgr : public Plugin { public: DataFileMgr(void); virtual ~DataFileMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = false) = 0; + 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; diff --git a/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp b/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp index 0be1070b5..c2877defb 100644 --- a/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp +++ b/project/jni/application/gemrb/gemrb/core/DialogHandler.cpp @@ -25,10 +25,14 @@ #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}; @@ -56,7 +60,7 @@ DialogHandler::~DialogHandler(void) } //Try to start dialogue between two actors (one of them could be inanimate) -int DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgref) +bool DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgref) { if (dlg) { delete dlg; @@ -64,13 +68,12 @@ int DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgr } PluginHolder dm(IE_DLG_CLASS_ID); - dm->Open( gamedata->GetResource( dlgref, IE_DLG_CLASS_ID ), true ); + dm->Open(gamedata->GetResource(dlgref, IE_DLG_CLASS_ID)); dlg = dm->GetDialog(); if (!dlg) { - printMessage("GameControl", " ", LIGHT_RED); - printf( "Cannot start dialog: %s\n", dlgref ); - return -1; + printMessage("GameControl", "Cannot start dialog: %s\n", LIGHT_RED, dlgref); + return false; } strnlwrcpy(dlg->ResRef, dlgref, 8); //this isn't handled by GetDialog??? @@ -85,8 +88,9 @@ int DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgr if (!originalTargetID) originalTargetID = tgt->GetGlobalID(); if (tgt->Type==ST_ACTOR) { Actor *tar = (Actor *) tgt; - spk->LastTalkedTo=targetID; - tar->LastTalkedTo=speakerID; + // TODO: verify + spk->LastTalker=targetID; + tar->LastTalker=speakerID; tar->SetCircleSize(); } if (oldTarget) oldTarget->SetCircleSize(); @@ -94,16 +98,16 @@ int DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgr GameControl *gc = core->GetGameControl(); if (!gc) - return -1; + return false; //check if we are already in dialog if (gc->GetDialogueFlags()&DF_IN_DIALOG) { - return 0; + return true; } int si = dlg->FindFirstState( tgt ); if (si < 0) { - return -1; + return false; } //we need GUI for dialogs @@ -134,7 +138,7 @@ int DialogHandler::InitDialog(Scriptable* spk, Scriptable* tgt, const char* dlgr //core->GetGame()->SetControlStatus(CS_HIDEGUI, BM_NAND); //core->GetGame()->SetControlStatus(CS_DIALOG, BM_OR); //core->SetEventFlag(EF_PORTRAIT); - return 0; + return true; } /*try to break will only try to break it, false means unconditional stop*/ @@ -348,16 +352,15 @@ void DialogHandler::DialogChoose(unsigned int choose) // we have to make a backup, tr->Dialog is freed ieResRef tmpresref; strnlwrcpy(tmpresref,tr->Dialog, 8); - if (target->GetInternalFlag()&IF_NOINT) { + /*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; - } - int ret = InitDialog( speaker, target, tmpresref); - if (ret<0) { + }*/ + if (!InitDialog( speaker, target, tmpresref)) { // error was displayed by InitDialog ta->SetMinRow( false ); EndDialog(); diff --git a/project/jni/application/gemrb/gemrb/core/DialogHandler.h b/project/jni/application/gemrb/gemrb/core/DialogHandler.h index 499fb0dea..8f80d147d 100644 --- a/project/jni/application/gemrb/gemrb/core/DialogHandler.h +++ b/project/jni/application/gemrb/gemrb/core/DialogHandler.h @@ -43,7 +43,7 @@ public: Scriptable *GetTarget(); Actor *GetSpeaker(); - int InitDialog(Scriptable* speaker, Scriptable* target, const char* dlgref); + bool InitDialog(Scriptable* speaker, Scriptable* target, const char* dlgref); void EndDialog(bool try_to_break=false); void DialogChoose(unsigned int choose); }; diff --git a/project/jni/application/gemrb/gemrb/core/DialogMgr.h b/project/jni/application/gemrb/gemrb/core/DialogMgr.h index 125ae52a0..be4128b31 100644 --- a/project/jni/application/gemrb/gemrb/core/DialogMgr.h +++ b/project/jni/application/gemrb/gemrb/core/DialogMgr.h @@ -29,7 +29,7 @@ class GEM_EXPORT DialogMgr : public Plugin { public: DialogMgr(void); virtual ~DialogMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Dialog* GetDialog() const = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp b/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp index ceecd6bb9..26b016f20 100644 --- a/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp +++ b/project/jni/application/gemrb/gemrb/core/DisplayMessage.cpp @@ -26,6 +26,7 @@ #include "TableMgr.h" #include "GUI/Label.h" #include "GUI/TextArea.h" +#include "Scriptable/Actor.h" GEM_EXPORT DisplayMessage * displaymsg; @@ -33,11 +34,11 @@ static int strref_table[STRREF_COUNT]; #define PALSIZE 8 static Color ActorColor[PALSIZE]; -static const char* DisplayFormatName = "[color=%lX]%s - [/color][p][color=%lX]%s[/color][/p]"; -static const char* DisplayFormatAction = "[color=%lX]%s - [/color][p][color=%lX]%s %s[/color][/p]"; -static const char* DisplayFormat = "[/color][p][color=%lX]%s[/color][/p]"; -static const char* DisplayFormatValue = "[/color][p][color=%lX]%s: %d[/color][/p]"; -static const char* DisplayFormatNameString = "[color=%lX]%s - [/color][p][color=%lX]%s: %s[/color][/p]"; +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(); @@ -61,7 +62,7 @@ void DisplayMessage::DisplayString(const char* Text, Scriptable *target) const { Label *l = core->GetMessageLabel(); if (l) { - l->SetText(Text, 0); + l->SetText(Text); } TextArea *ta = core->GetMessageTextArea(); if (ta) { @@ -161,7 +162,7 @@ void DisplayMessage::DisplayConstantStringNameString(int stridx, unsigned int co 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) + 18); + 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 ); diff --git a/project/jni/application/gemrb/gemrb/core/DisplayMessage.h b/project/jni/application/gemrb/gemrb/core/DisplayMessage.h index 9fc781b5d..02a6d48ab 100644 --- a/project/jni/application/gemrb/gemrb/core/DisplayMessage.h +++ b/project/jni/application/gemrb/gemrb/core/DisplayMessage.h @@ -28,8 +28,11 @@ #define DISPLAYMESSAGE_H #include "exports.h" +#include "ie_types.h" -#include "ActorMgr.h" +#include + +class Scriptable; class GEM_EXPORT DisplayMessage { diff --git a/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp b/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp index ca980d686..878ee02c5 100644 --- a/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp +++ b/project/jni/application/gemrb/gemrb/core/EffectQueue.cpp @@ -28,6 +28,7 @@ #include "SymbolMgr.h" #include "Scriptable/Actor.h" #include "Spell.h" //needs for the source flags bitfield +#include "TableMgr.h" #include @@ -97,7 +98,7 @@ bool EffectQueue::match_ids(Actor *target, int table, ieDword value) static const bool fx_instant[MAX_TIMING_MODE]={true,true,true,false,false,false,false,false,true,true,true}; -inline bool IsInstant(ieByte timingmode) +static inline bool IsInstant(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return false; return fx_instant[timingmode]; @@ -105,7 +106,7 @@ inline bool IsInstant(ieByte timingmode) static const bool fx_equipped[MAX_TIMING_MODE]={false,false,true,false,false,true,false,false,true,false,false}; -inline bool IsEquipped(ieByte timingmode) +static inline bool IsEquipped(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return false; return fx_equipped[timingmode]; @@ -114,7 +115,7 @@ inline bool IsEquipped(ieByte 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}; -inline bool NeedPrepare(ieWord timingmode) +static inline bool NeedPrepare(ieWord timingmode) { if( timingmode>=MAX_TIMING_MODE) return false; return fx_relative[timingmode]; @@ -128,7 +129,7 @@ inline bool NeedPrepare(ieWord timingmode) static const int fx_prepared[MAX_TIMING_MODE]={DURATION,PERMANENT,PERMANENT,DELAYED, //0-3 DELAYED,DELAYED,DELAYED,DELAYED,PERMANENT,PERMANENT,PERMANENT}; //4-7 -inline int DelayType(ieByte timingmode) +static inline int DelayType(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return INVALID; return fx_prepared[timingmode]; @@ -137,7 +138,7 @@ inline int DelayType(ieByte timingmode) //which effects are removable static const bool fx_removable[MAX_TIMING_MODE]={true,true,false,true,true,false,true,true,false,false,true}; -inline int IsRemovable(ieByte timingmode) +static inline int IsRemovable(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return INVALID; return fx_removable[timingmode]; @@ -157,18 +158,18 @@ 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 -inline ieByte TriggeredEffect(ieByte timingmode) +static inline ieByte TriggeredEffect(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return false; return fx_triggered[timingmode]; } -int compare_effects(const void *a, const void *b) +static int compare_effects(const void *a, const void *b) { return stricmp(((EffectRef *) a)->Name,((EffectRef *) b)->Name); } -int find_effect(const void *a, const void *b) +static int find_effect(const void *a, const void *b) { return stricmp((const char *) a,((const EffectRef *) b)->Name); } @@ -180,15 +181,14 @@ static EffectDesc* FindEffect(const char* effectname) } void *tmp = bsearch(effectname, effectnames, effectnames_count, sizeof(EffectDesc), find_effect); if( !tmp) { - printMessage( "EffectQueue", "", YELLOW); - printf("Couldn't assign effect: %s\n", effectname ); + printMessage("EffectQueue", "Couldn't assign effect: %s\n", YELLOW, effectname); } return (EffectDesc *) tmp; } static EffectRef fx_protection_from_display_string_ref = { "Protection:String", -1 }; -inline static void ResolveEffectRef(EffectRef &effect_reference) +static inline void ResolveEffectRef(EffectRef &effect_reference) { if( effect_reference.opcode==-1) { EffectDesc* ref = FindEffect(effect_reference.Name); @@ -250,12 +250,11 @@ bool Init_EffectQueue() //reverse linking opcode number //using this unused field if( (poi->opcode!=-1) && effectname[0]!='*') { - printf("Clashing Opcodes FN: %d vs. %d, %s\n", i, poi->opcode, effectname); - abort(); + error("EffectQueue", "Clashing Opcodes FN: %d vs. %d, %s\n", i, poi->opcode, effectname); } poi->opcode = i; } - //printf("-------- FN: %d, %s\n", i, effectname); + //print("-------- FN: %d, %s\n", i, effectname); } core->DelSymbol( eT ); @@ -485,6 +484,7 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const 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: @@ -509,6 +509,7 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const break; case FX_TARGET_ALL_BUT_SELF: + new_fx = new Effect; map=self->GetCurrentArea(); i= map->GetActorCount(true); while(i--) { @@ -517,13 +518,15 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const if( st==actor) { continue; } - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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; @@ -534,6 +537,7 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const map = self->GetCurrentArea(); spec = st->GetStat(IE_SPECIFIC); + new_fx = new Effect; //GetActorCount(false) returns all nonparty critters i = map->GetActorCount(false); while(i--) { @@ -541,13 +545,15 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const if( actor->GetStat(IE_SPECIFIC)!=spec) { continue; } - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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: @@ -557,6 +563,7 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const map = self->GetCurrentArea(); spec = pretarget->GetStat(IE_SPECIFIC); + new_fx = new Effect; //GetActorCount(false) returns all nonparty critters i = map->GetActorCount(false); while(i--) { @@ -564,14 +571,16 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const if( actor->GetStat(IE_SPECIFIC)!=spec) { continue; } - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); + flg = ApplyEffect( actor, new_fx, 1 ); //GetActorCount can now return all nonparty critters - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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: @@ -587,54 +596,63 @@ int EffectQueue::AddEffect(Effect* fx, Scriptable* self, Actor* pretarget, const 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 ); - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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 ); - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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 ); - fx->SetPosition(actor->Pos); + memcpy( new_fx, fx, sizeof( Effect ) ); + new_fx->SetPosition(actor->Pos); - flg = ApplyEffect( actor, fx, 1 ); + flg = ApplyEffect( actor, new_fx, 1 ); //GetActorCount can now return all nonparty critters - if( fx->TimingMode != FX_DURATION_JUST_EXPIRED) { - actor->fxqueue.AddEffect( fx, flg==FX_INSERT ); + 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: - printf( "Unknown FX target type: %d\n", fx->Target); + print( "Unknown FX target type: %d\n", fx->Target); flg = FX_ABORT; break; } @@ -681,7 +699,7 @@ int EffectQueue::AddAllEffects(Actor* target, const Point &destination) const } //resisted effect based on level -inline bool check_level(Actor *target, Effect *fx) +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 @@ -729,7 +747,7 @@ inline bool check_level(Actor *target, Effect *fx) //roll for the effect probability, there is a high and a low treshold, the d100 //roll should hit in the middle -inline bool check_probability(Effect* fx) +static inline bool check_probability(Effect* fx) { //watch for this, probability1 is the high number //probability2 is the low number @@ -773,7 +791,7 @@ static EffectRef fx_secondary_type_bounce_dec_ref = { "Bounce:SecondaryTypeDec", static EffectRef fx_spelltrap = { "SpellTrap", -1 }; //this is for whole spell immunity/bounce -inline static void DecreaseEffect(Effect *efx) +static inline void DecreaseEffect(Effect *efx) { efx->Parameter1--; if( (int) efx->Parameter1<1) { @@ -950,11 +968,11 @@ static bool check_resistance(Actor* actor, Effect* fx) //opcode immunity if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity_ref, fx->Opcode) ) { - printf ("immune to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); + print ("immune to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); return true; } if( actor->fxqueue.HasEffectWithParam(fx_opcode_immunity2_ref, fx->Opcode) ) { - printf ("immune2 to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); + print ("immune2 to effect: %s\n", (char*) Opcodes[fx->Opcode].Name); return true; } @@ -984,10 +1002,10 @@ static bool check_resistance(Actor* actor, Effect* fx) //magic immunity ieDword val = actor->GetStat(IE_RESISTMAGIC); - if( fx->random_value < val) { + 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) { - printf ("effect resisted: %s\n", (char*) Opcodes[fx->Opcode].Name); + print ("effect resisted: %s\n", (char*) Opcodes[fx->Opcode].Name); return true; } } @@ -1006,7 +1024,7 @@ static bool check_resistance(Actor* actor, Effect* fx) if( fx->IsSaveForHalfDamage) { fx->Parameter1/=2; } else { - printf ("%s saved against effect: %s\n", actor->GetName(1), (char*) Opcodes[fx->Opcode].Name); + print ("%s saved against effect: %s\n", actor->GetName(1), (char*) Opcodes[fx->Opcode].Name); return true; } } @@ -1025,7 +1043,7 @@ static bool check_resistance(Actor* actor, Effect* fx) int EffectQueue::ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieDword resistance) const { - //printf( "FX 0x%02x: %s(%d, %d)\n", fx->Opcode, effectnames[fx->Opcode].Name, fx->Parameter1, fx->Parameter2 ); + //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; @@ -1110,15 +1128,14 @@ int EffectQueue::ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieD break; //this shouldn't happen default: - printf("Unknown delay type: %d (from %d)\n", DelayType(fx->TimingMode&0xff), fx->TimingMode); - abort(); + 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))) { - printf("targetless opcode without EFFECT_NO_ACTOR: %d, skipping\n", fx->Opcode); + print("targetless opcode without EFFECT_NO_ACTOR: %d, skipping\n", fx->Opcode); return FX_NOT_APPLIED; } } @@ -1152,7 +1169,7 @@ int EffectQueue::ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieD 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) ) { + if( fx->TimingMode == FX_DURATION_INSTANT_PERMANENT ) { fx->TimingMode = FX_DURATION_JUST_EXPIRED; } break; @@ -1179,7 +1196,7 @@ int EffectQueue::ApplyEffect(Actor* target, Effect* fx, ieDword first_apply, ieD #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}; -inline bool IsLive(ieByte timingmode) +static inline bool IsLive(ieByte timingmode) { if( timingmode>=MAX_TIMING_MODE) return false; return fx_live[timingmode]; @@ -1727,7 +1744,7 @@ bool EffectQueue::HasAnyDispellableEffect() const void EffectQueue::dump() const { - printf( "EFFECT QUEUE:\n" ); + print( "EFFECT QUEUE:\n" ); int i = 0; std::list< Effect* >::const_iterator f; for ( f = effects.begin(); f != effects.end(); f++ ) { @@ -1737,7 +1754,7 @@ void EffectQueue::dump() const if( fx->Opcode < MAX_EFFECTS) Name = (char*) Opcodes[fx->Opcode].Name; - printf( " %2d: 0x%02x: %s (%d, %d) S:%s\n", i++, fx->Opcode, Name, fx->Parameter1, fx->Parameter2, fx->Source ); + print( " %2d: 0x%02x: %s (%d, %d) S:%s\n", i++, fx->Opcode, Name, fx->Parameter1, fx->Parameter2, fx->Source ); } } } @@ -1766,12 +1783,13 @@ bool EffectQueue::HasDuration(Effect *fx) static EffectRef fx_variable_ref = { "Variable:StoreLocalVariable", -1 }; //returns true if the effect must be saved -//variables are saved differently bool EffectQueue::Persistent(Effect* fx) { - //we save this as variable + // 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 false; + return true; } switch (fx->TimingMode) { diff --git a/project/jni/application/gemrb/gemrb/core/EffectQueue.h b/project/jni/application/gemrb/gemrb/core/EffectQueue.h index 1380c394a..0f4aed862 100644 --- a/project/jni/application/gemrb/gemrb/core/EffectQueue.h +++ b/project/jni/application/gemrb/gemrb/core/EffectQueue.h @@ -33,6 +33,7 @@ #include "Effect.h" #include "Region.h" +#include #include class Actor; diff --git a/project/jni/application/gemrb/gemrb/core/FileCache.cpp b/project/jni/application/gemrb/gemrb/core/FileCache.cpp new file mode 100644 index 000000000..3da6ea27a --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/FileCache.cpp @@ -0,0 +1,87 @@ +/* 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 new file mode 100644 index 000000000..1345a4aa1 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/FileCache.h @@ -0,0 +1,27 @@ +/* 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 index 72c7b888f..7cb1bec4a 100644 --- a/project/jni/application/gemrb/gemrb/core/Font.cpp +++ b/project/jni/application/gemrb/gemrb/core/Font.cpp @@ -28,6 +28,7 @@ #include "GameData.h" #include "Interface.h" #include "Palette.h" +#include "Sprite2D.h" #include "Video.h" #include @@ -146,7 +147,7 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, size_t len = strlen( ( char* ) string ); char* tmp = ( char* ) malloc( len + 1 ); memcpy( tmp, ( char * ) string, len + 1 ); - SetupString( tmp, rgn.w, NoColor ); + SetupString( tmp, rgn.w, NoColor, initials, enablecap ); int ystep = 0; if (Alignment & IE_FONT_SINGLE_LINE) { for (size_t i = 0; i < len; i++) { @@ -320,7 +321,7 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, len--; } - SetupString( tmp, rgn.w, NoColor ); + SetupString( tmp, rgn.w, NoColor, initials, capital ); int ystep = 0; if (Alignment & IE_FONT_SINGLE_LINE) { @@ -454,39 +455,36 @@ 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) { - i++; - if (i>=len) - break; - char tag[256]; - int k = 0; - for (k = 0; k < 256; k++) { - if (string[i] == ']') { - tag[k] = 0; - break; - } - tag[k] = string[i++]; + 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; @@ -495,9 +493,14 @@ void Font::SetupString(char* string, unsigned int width, bool NoColor) const 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; @@ -515,6 +518,14 @@ void Font::SetupString(char* string, unsigned int width, bool NoColor) const } 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; @@ -531,6 +542,14 @@ void Font::SetupString(char* string, unsigned int width, bool NoColor) const } 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; diff --git a/project/jni/application/gemrb/gemrb/core/Font.h b/project/jni/application/gemrb/gemrb/core/Font.h index 240bdf436..df2f06f38 100644 --- a/project/jni/application/gemrb/gemrb/core/Font.h +++ b/project/jni/application/gemrb/gemrb/core/Font.h @@ -33,6 +33,7 @@ #include class Palette; +class Sprite2D; struct StringList { Sprite2D*** strings; @@ -99,7 +100,7 @@ public: 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) 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); diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp index 941cdd474..c2d4efa17 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/Button.cpp @@ -21,6 +21,9 @@ #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" @@ -125,7 +128,7 @@ void Button::CloseUpColor() unsigned long newtime; Changed = true; - GetTime( newtime ); + newtime = GetTickCount(); if (newtime #include @@ -92,6 +97,10 @@ void Control::ResetEventHandler(EventHandler handler) handler = NULL; } +void Control::SetText(const char* /*string*/) +{ +} + int Control::RunEventHandler(EventHandler handler) { if (InHandler) { @@ -121,67 +130,33 @@ int Control::RunEventHandler(EventHandler handler) } /** Key Press Event */ -void Control::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) +void Control::OnKeyPress(unsigned char /*Key*/, unsigned short /*Mod*/) { - //printf("OnKeyPress: CtrlID = 0x%08X, Key = %c (0x%02hX)\n", (unsigned int) ControlID, Key, Key); -#ifdef ANDROID // mapping volume control to volume control keys on device, these keys must be set up in AndroidAppSettings.cfg - switch(Key) { - case 'o': // volume down - case 'p': // volume up - int Ambients, Movie, Music, SFX, Voices; - core->GetDictionary()->Lookup( "Volume Ambients", (ieDword&)Ambients ); - core->GetDictionary()->Lookup( "Volume Movie", (ieDword&)Movie ); - core->GetDictionary()->Lookup( "Volume Music", (ieDword&)Music ); - core->GetDictionary()->Lookup( "Volume SFX", (ieDword&)SFX ); - core->GetDictionary()->Lookup( "Volume Voices", (ieDword&)Voices ); - if (Key=='o') { - if(Ambients>0) Ambients-=10; if(Ambients<0) Ambients=0; - if(Movie>0) Movie-=10; if(Movie<0) Movie=0; - if(Music>0) Music-=10; if(Music<0) Music=0; - if(SFX>0) SFX-=10; if(SFX<0) SFX=0; - if(Voices>0) Voices-=10; if(Voices<0) Voices=0; - } else { - if(Ambients<100) Ambients+=10; if(Ambients>100) Ambients=100; - if(Movie<100) Movie+=10; if(Movie>100) Movie=100; - if(Music<100) Music+=10; if(Music>100) Music=100; - if(SFX<100) SFX+=10; if(SFX>100) SFX=100; - if(Voices<100) Voices+=10; if(Voices>100) Voices=100; - } - core->GetDictionary()->SetAt( "Volume Ambients", Ambients ); - core->GetDictionary()->SetAt( "Volume Movie", Movie ); - core->GetDictionary()->SetAt( "Volume Music", Music ); - core->GetDictionary()->SetAt( "Volume SFX", SFX ); - core->GetDictionary()->SetAt( "Volume Voices", Voices ); - core->GetAudioDrv()->UpdateVolume(); - break; - } -#else -(void)Key; // unused, fool the compiler -#endif + //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*/) { - //printf( "OnKeyRelease: CtrlID = 0x%08X, Key = %c (0x%02hX)\n", (unsigned int) ControlID, Key, Key ); + //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*/) { -// printf("OnMouseEnter: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, 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*/) { -// printf("OnMouseLeave: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, 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*/) { - //printf("OnMouseOver: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, y); + //print("OnMouseOver: CtrlID = 0x%08X, x = %hd, y = %hd\n", (unsigned int) ControlID, x, y); } /** Mouse Button Down */ @@ -200,7 +175,7 @@ void Control::OnMouseDown(unsigned short x, unsigned short y, void Control::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, unsigned short /*Button*/, unsigned short /*Mod*/) { - //printf("OnMouseUp: CtrlID = 0x%08X, x = %hd, y = %hd, Button = %d, Mos = %hd\n", (unsigned int) ControlID, x, y, Button, 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 */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Control.h b/project/jni/application/gemrb/gemrb/core/GUI/Control.h index 50a5ad2d4..bfd6862d0 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Control.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/Control.h @@ -67,7 +67,7 @@ public: /** 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 int SetText(const char* string, int pos = 0) = 0; + 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 */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp index 41e22b2b0..bae164a47 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.cpp @@ -26,6 +26,7 @@ #include "Interface.h" #include "Video.h" +#include "GUI/Window.h" EventMgr::EventMgr(void) { @@ -236,7 +237,7 @@ void EventMgr::MouseDown(unsigned short x, unsigned short y, unsigned short Butt Control *ctrl; unsigned long thisTime; - GetTime( thisTime ); + thisTime = GetTickCount(); if (ClickMatch(x, y, thisTime)) { Button |= GEM_MB_DOUBLECLICK; dc_x = 0; diff --git a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h index bda4ae8b8..938525c2e 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/EventMgr.h @@ -28,14 +28,13 @@ #ifndef EVENTMGR_H #define EVENTMGR_H -#include "GUI/Control.h" - #include "exports.h" -#include "WindowMgr.h" - #include +class Control; +class Window; + #define GEM_LEFT 0x81 #define GEM_RIGHT 0x82 #define GEM_UP 0x83 diff --git a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp index 0794c0837..dafdd4b31 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.cpp @@ -25,17 +25,25 @@ #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" @@ -47,11 +55,7 @@ #define DEBUG_SHOW_DOORS DEBUG_SHOW_CONTAINERS #define DEBUG_SHOW_LIGHTMAP 0x08 -#ifdef TOUCHSCREEN -# define SCROLL_BORDER 32 -#else -# define SCROLL_BORDER 5 -#endif +#define SCROLL_BORDER 5 static const Color cyan = { 0x00, 0xff, 0xff, 0xff @@ -132,9 +136,7 @@ GameControl::GameControl(void) lastCursor = IE_CURSOR_NORMAL; moveX = moveY = 0; scrolling = false; -#ifdef TOUCHSCREEN - touched=false; -#endif + touchScrollAreasEnabled = false; numScrollCursor = 0; DebugFlags = 0; AIUpdateCounter = 1; @@ -149,6 +151,12 @@ GameControl::GameControl(void) } else { ScreenFlags = SF_CENTERONACTOR; } + core->GetDictionary()->Lookup("TouchScrollAreas",tmp); + if (tmp) { + touchScrollAreasEnabled = true; + touched = false; + scrollAreasWidth = 32; + } LeftCount = 0; BottomCount = 0; RightCount = 0; @@ -271,7 +279,8 @@ void GameControl::CreateMovement(Actor *actor, const Point &p) actor->AddAction( action ); // force action so that we get target recticles immediately - actor->ProcessActions(true); + // FIXME + actor->ProcessActions(); } GameControl::~GameControl(void) @@ -587,30 +596,24 @@ void GameControl::Draw(unsigned short x, unsigned short y) } } -#ifdef TOUCHSCREEN - if (moveY < 0 && scrolling) - video->DrawLine(screen.x+4, screen.y+SCROLL_BORDER, screen.w+screen.x-4, screen.y+SCROLL_BORDER, red); - else - video->DrawLine(screen.x+4, screen.y+SCROLL_BORDER, screen.w+screen.x-4, screen.y+SCROLL_BORDER, gray); - if (moveY > 0 && scrolling) - video->DrawLine(screen.x+4, screen.h-SCROLL_BORDER, screen.w+screen.x-4, screen.h-SCROLL_BORDER, red); - else - video->DrawLine(screen.x+4, screen.h-SCROLL_BORDER, screen.w+screen.x-4, screen.h-SCROLL_BORDER, gray); - if (moveX < 0 && scrolling) - video->DrawLine(screen.x+SCROLL_BORDER, screen.y+4, screen.x+SCROLL_BORDER, screen.h+screen.y-4, red); - else - video->DrawLine(screen.x+SCROLL_BORDER, screen.y+4, screen.x+SCROLL_BORDER, screen.h+screen.y-4, gray); - if (moveX > 0 && scrolling) - video->DrawLine(screen.w+screen.x-SCROLL_BORDER, screen.y+4, screen.w+screen.x-SCROLL_BORDER, screen.h-4, red); - else - video->DrawLine(screen.w+screen.x-SCROLL_BORDER, screen.y+4, screen.w+screen.x-SCROLL_BORDER, screen.h-4, gray); -#endif -} - -/** inherited from Control, GameControl doesn't need it */ -int GameControl::SetText(const char* /*string*/, int /*pos*/) -{ - return 0; + 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 */ @@ -663,10 +666,6 @@ void GameControl::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) SelectActor(pc+1, true); break; #ifdef ANDROID - case 'o': - case 'p': - Control::OnKeyPress(Key, 0); - break; case 'c': // show containers in ANDROID, GEM_ALT is not possible to use DebugFlags |= DEBUG_SHOW_CONTAINERS; return; @@ -881,7 +880,7 @@ void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) area->MoveVisibleGroundPiles(p); break; case 'x': // shows coordinates on the map - printf( "%s [%d.%d]\n", area->GetScriptName(), p.x, p.y ); + print( "%s [%d.%d]\n", area->GetScriptName(), p.x, p.y ); break; case 'g'://shows loaded areas and other game information game->DebugDump(); @@ -997,22 +996,22 @@ void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) break; case '4': //show all traps and infopoints DebugFlags ^= DEBUG_SHOW_INFOPOINTS; - printf("Show traps and infopoints %s\n", DebugFlags & DEBUG_SHOW_INFOPOINTS ? "ON" : "OFF"); + print("Show traps and infopoints %s\n", DebugFlags & DEBUG_SHOW_INFOPOINTS ? "ON" : "OFF"); break; case '6': //show the lightmap DebugFlags ^= DEBUG_SHOW_LIGHTMAP; - printf("Show lightmap %s\n", DebugFlags & DEBUG_SHOW_LIGHTMAP ? "ON" : "OFF"); + print("Show lightmap %s\n", DebugFlags & DEBUG_SHOW_LIGHTMAP ? "ON" : "OFF"); break; case '7': //toggles fog of war core->FogOfWar ^= FOG_DRAWFOG; - printf("Show Fog-Of-War: %s\n", core->FogOfWar & FOG_DRAWFOG ? "ON" : "OFF"); + print("Show Fog-Of-War: %s\n", core->FogOfWar & FOG_DRAWFOG ? "ON" : "OFF"); break; case '8': //show searchmap over area core->FogOfWar ^= FOG_DRAWSEARCHMAP; - printf("Show searchmap %s\n", core->FogOfWar & FOG_DRAWSEARCHMAP ? "ON" : "OFF"); + print("Show searchmap %s\n", core->FogOfWar & FOG_DRAWSEARCHMAP ? "ON" : "OFF"); break; default: - printf( "KeyRelease:%d - %d\n", Key, Mod ); + print( "KeyRelease:%d - %d\n", Key, Mod ); break; } return; //return from cheatkeys @@ -1030,6 +1029,7 @@ void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) displaymsg->DisplayConstantString(STR_UNPAUSED,0xff0000); } break; +/* case 'm': core->GetGUIScriptEngine()->RunFunction("GUIMA","OpenMapWindow"); break; @@ -1042,6 +1042,13 @@ void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) 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; @@ -1052,6 +1059,7 @@ void GameControl::OnKeyRelease(unsigned char Key, unsigned short Mod) DebugFlags &= ~DEBUG_SHOW_CONTAINERS; break; default: + core->GetKeyMap()->ResolveKey(Key,0); break; } } @@ -1062,8 +1070,7 @@ void GameControl::DisplayTooltip() { Map* area = game->GetCurrentArea( ); if (area) { Actor *actor = area->GetActorByGlobalID(lastActorID); - if (actor && (actor->GetStat(IE_STATE_ID)&STATE_DEAD || actor->GetInternalFlag()&IF_JUSTDIED)) { - // checking IF_JUSTDIED is kind of horrid, but seems necessary + if (actor && (actor->GetStat(IE_STATE_ID)&STATE_DEAD || actor->GetInternalFlag()&IF_REALLYDIED)) { // no tooltips for dead actors! actor->SetOver( false ); lastActorID = 0; @@ -1230,61 +1237,61 @@ void GameControl::OnMouseOver(unsigned short x, unsigned short y) return; } -#ifdef TOUCHSCREEN - 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+SCROLL_BORDER); - if (region.PointInside(x, y)) { - // Check for end of map area - if (viewport.y > 0) - moveY = -mousescrollspd; - } - // Bottom scroll area - region=Region(XPos, Height-SCROLL_BORDER, 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+SCROLL_BORDER, Height); - if (region.PointInside(x, y)) { - // Check for end of map area - if(viewport.x > 0) - moveX = -mousescrollspd; - } - // Right scroll area - region=Region(Width-SCROLL_BORDER, 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 { + if (touchScrollAreasEnabled) { + int mousescrollspd = core->GetMouseScrollSpeed(); + Region region; + Map* map; + Point mapsize; + Region viewport = core->GetVideoDriver()->GetViewport(); moveX = 0; moveY = 0; - scrolling = false; - Video* video = core->GetVideoDriver(); - video->SetDragCursor(NULL); + // 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); + } } -#endif lastMouseX = x; lastMouseY = y; @@ -1461,38 +1468,35 @@ void GameControl::OnGlobalMouseMove(unsigned short x, unsigned short y) return; } -#ifndef TOUCHSCREEN - int mousescrollspd = core->GetMouseScrollSpeed(); + 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 (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; + if (moveX != 0 || moveY != 0) { + scrolling = true; + } else if (scrolling) { + scrolling = false; - Video* video = core->GetVideoDriver(); - video->SetDragCursor(NULL); + Video* video = core->GetVideoDriver(); + video->SetDragCursor(NULL); + } } -#else -(void)x; -(void)y; -#endif } void GameControl::UpdateScrolling() { @@ -1738,7 +1742,7 @@ void GameControl::HandleContainer(Container *container, Actor *actor) return; } - if ((target_mode == TARGET_MODE_PICK)) { + if (target_mode == TARGET_MODE_PICK) { TryToPick(actor, container); return; } @@ -1798,14 +1802,16 @@ bool GameControl::HandleActiveRegion(InfoPoint *trap, Actor * actor, Point &p) //don't bother with this region further return true; } - if ((target_mode == TARGET_MODE_PICK)) { + if (target_mode == TARGET_MODE_PICK) { TryToDisarm(actor, trap); return true; } switch(trap->Type) { case ST_TRAVEL: - actor->UseExit(trap->GetGlobalID()); + 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 @@ -1816,16 +1822,12 @@ bool GameControl::HandleActiveRegion(InfoPoint *trap, Actor * actor, Point &p) //reset trap and deactivated flags if (trap->Scripts[0]) { if (!(trap->Flags&TRAP_DEACTIVATED) ) { - trap->LastTriggerObject = trap->LastTrigger = actor->GetGlobalID(); - trap->ImmediateEvent(); + trap->AddTrigger(TriggerEntry(trigger_clicked, actor->GetGlobalID())); //directly feeding the event, even if there are actions in the queue - trap->Scripts[0]->Update(); - trap->ProcessActions(true); - //if reset trap flag not set, deactivate it - //hmm, better not, info triggers don't deactivate themselves on click - //if (!(trap->Flags&TRAP_RESET)) { - // trap->Flags|=TRAP_DEACTIVATED; - //} + //trap->Scripts[0]->Update(); + // FIXME + trap->ExecuteScript(1); + trap->ProcessActions(); } } else { if (trap->overHeadText) { @@ -1875,9 +1877,7 @@ void GameControl::OnMouseDown(unsigned short x, unsigned short y, unsigned short StartY = py; SelectionRect.w = 0; SelectionRect.h = 0; -#ifdef TOUCHSCREEN - touched=true; -#endif + if (touchScrollAreasEnabled) touched=true; } } @@ -1902,33 +1902,33 @@ void GameControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short B Map* area = game->GetCurrentArea( ); if (!area) return; -#ifdef TOUCHSCREEN - 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 ); + 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; } - free( ab ); - DrawSelectionRect = false; + return; } - return; } -#endif if (DrawSelectionRect) { Actor** ab; unsigned int count = area->GetActorInRect( ab, SelectionRect,true ); @@ -1999,11 +1999,10 @@ void GameControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short B while(i--) { game->selected[i]->UseExit(exitID); } - } else { - if (HandleActiveRegion(overInfoPoint, pc, p)) { - core->SetEventFlag(EF_RESETTARGET); - return; - } + } + if (HandleActiveRegion(overInfoPoint, pc, p)) { + core->SetEventFlag(EF_RESETTARGET); + return; } } @@ -2387,8 +2386,8 @@ void GameControl::HandleWindowHide(const char *WindowName, const char *WindowPos } return; } - printMessage("GameControl", "Invalid Window Index: ", LIGHT_RED); - printf("%s:%u\n",WindowName, index); + printMessage("GameControl", "Invalid Window Index: %s:%u\n", LIGHT_RED, + WindowName, index); } } } @@ -2440,8 +2439,8 @@ void GameControl::HandleWindowReveal(const char *WindowName, const char *WindowP } return; } - printMessage("GameControl", "Invalid Window Index ", LIGHT_RED); - printf("%s:%u\n",WindowName, index); + printMessage("GameControl", "Invalid Window Index %s:%u\n", LIGHT_RED, + WindowName, index); } } } @@ -2695,7 +2694,7 @@ Sprite2D* GameControl::GetScreenshot(bool show_gui) //copies a downscaled screenshot into a sprite for save game preview Sprite2D* GameControl::GetPreview() { - // We get preview by first taking a screenshot of size 640x405, + // 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? @@ -2708,27 +2707,20 @@ Sprite2D* GameControl::GetPreview() if (x < 0) { x = 0; } else { - w = 640; + w = 515; } if (y < 0) { y = 0; } else { - h = 405; + h = 385; } if (!x) y = 0; - int hf = HideGUI (); - signed char v = Owner->Visible; - Owner->Visible = WINDOW_VISIBLE; Draw (0, 0); - Owner->Visible = v; Sprite2D *screenshot = video->GetScreenshot( Region(x, y, w, h) ); - if (hf) { - UnhideGUI (); - } core->DrawWindows(); Sprite2D* preview = video->SpriteScaleDown ( screenshot, 5 ); diff --git a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h index 0ff21d3e1..8e5bf14cc 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/GameControl.h @@ -96,8 +96,6 @@ public: public: /** Draws the Control on the Output Display */ void Draw(unsigned short x, unsigned short y); - /** Sets the Text of the current control */ - int SetText(const char* string, int pos = 0); /** Sets multiple quicksaves flag*/ static void MultipleQuickSaves(int arg); void SetTracker(Actor *actor, ieDword dist); @@ -112,9 +110,12 @@ private: Region SelectionRect; short StartX, StartY; //int action; -#ifdef TOUCHSCREEN + + // 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) -#endif + unsigned int scrollAreasWidth; // scroll areas width + public: Door* overDoor; Container* overContainer; diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp index 4d67af4aa..6579e61f3 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/Label.cpp @@ -25,8 +25,10 @@ #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) { @@ -71,7 +73,7 @@ void Label::Draw(unsigned short x, unsigned short y) } /** This function sets the actual Label Text */ -int Label::SetText(const char* string, int /*pos*/) +void Label::SetText(const char* string) { if (Buffer ) free( Buffer ); @@ -95,7 +97,6 @@ int Label::SetText(const char* string, int /*pos*/) if (Owner) { Owner->Invalidate(); } - return 0; } /** Sets the Foreground Font Color */ void Label::SetColor(Color col, Color bac) @@ -119,7 +120,7 @@ void Label::SetAlignment(unsigned char Alignment) void Label::OnMouseUp(unsigned short x, unsigned short y, unsigned short /*Button*/, unsigned short /*Mod*/) { - //printf( "Label::OnMouseUp\n" ); + //print( "Label::OnMouseUp\n" ); if (( x <= Width ) && ( y <= Height )) { if (VarName[0] != 0) { core->GetDictionary()->SetAt( VarName, Value ); diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Label.h b/project/jni/application/gemrb/gemrb/core/GUI/Label.h index b0a841dfc..20ef5f9fc 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Label.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/Label.h @@ -51,7 +51,7 @@ public: /** Draws the Control on the Output Display */ void Draw(unsigned short x, unsigned short y); /** This function sets the actual Label Text */ - int SetText(const char* string, int pos = 0); + void SetText(const char* string); /** Sets the Foreground Font Color */ void SetColor(Color col, Color bac); /** Sets the Alignment of Text */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp index 4abd158ad..459c438e4 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.cpp @@ -22,9 +22,14 @@ #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 @@ -224,6 +229,11 @@ void MapControl::Draw(unsigned short XWin, unsigned short YWin) 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 @@ -269,18 +279,8 @@ void MapControl::Draw(unsigned short XWin, unsigned short YWin) } /** Key Press Event */ -void MapControl::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) +void MapControl::OnKeyPress(unsigned char /*Key*/, unsigned short /*Mod*/) { -#ifdef ANDROID - switch(Key) { - case 'o': - case 'p': - Control::OnKeyPress(Key, 0); - break; - } -#else -(void)Key; // unused, fool the compiler -#endif } /** Key Release Event */ @@ -289,7 +289,7 @@ void MapControl::OnKeyRelease(unsigned char Key, unsigned short Mod) switch (Key) { case '\t': //not GEM_TAB - printf( "TAB released\n" ); + print( "TAB released\n" ); return; case 'f': if (Mod & GEM_MOD_CTRL) @@ -471,7 +471,7 @@ void MapControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short Bu return; case MAP_VIEW_NOTES: //left click allows setting only when in MAP_SET_NOTE mode - if ((Button == GEM_MB_ACTION) ) { + if (Button == GEM_MB_ACTION) { ViewHandle(x,y); } ClickHandle(Button); @@ -499,10 +499,10 @@ void MapControl::OnSpecialKeyPress(unsigned char Key) ScrollY += 64; break; case GEM_ALT: - printf( "ALT pressed\n" ); + print( "ALT pressed\n" ); break; case GEM_TAB: - printf( "TAB pressed\n" ); + print( "TAB pressed\n" ); break; default: break; diff --git a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h index 1154bf8c1..44ecec887 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/MapControl.h @@ -79,8 +79,6 @@ public: void DrawFog(unsigned short XWin, unsigned short YWin); /** Compute parameters after changes in control's or screen geometry */ void Realize(); - /** Sets the Text of the current control */ - int SetText(const char* /*string*/, int /*pos*/) { return 0; } /** Key Press Event */ void OnKeyPress(unsigned char Key, unsigned short Mod); diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp index d31f58958..1c09586d1 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.cpp @@ -24,6 +24,7 @@ #include "Interface.h" #include "Video.h" +#include "GUI/Window.h" #include @@ -162,12 +163,6 @@ void Progressbar::SetSliderPos(int x, int y, int x2, int y2) CapYPos=y2; } -/* dummy virtual function */ -int Progressbar::SetText(const char* /*string*/, int /*pos*/) -{ - return 0; -} - bool Progressbar::SetEvent(int eventType, EventHandler handler) { Changed = true; diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h index 411ae5510..6a777c42f 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/Progressbar.h @@ -60,8 +60,6 @@ public: void SetBarCap(Sprite2D *img3); /** Sets the mos coordinates for the progressbar filler mos/cap */ void SetSliderPos(int x, int y, int x2, int y2); - /** Dummy function */ - int SetText(const char * string, int pos = 0); /** Redraws a progressbar which is associated with VariableName */ void RedrawProgressbar(const char *VariableName, int Sum); /** Set handler for specified event */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp index aea1b9833..3893c684f 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.cpp @@ -25,6 +25,8 @@ #include "Interface.h" #include "Variables.h" #include "Video.h" +#include "GUI/EventMgr.h" +#include "GUI/Window.h" ScrollBar::ScrollBar(void) { @@ -263,12 +265,6 @@ void ScrollBar::OnMouseOver(unsigned short /*x*/, unsigned short y) } } -/** Sets the Text of the current control */ -int ScrollBar::SetText(const char* /*string*/, int /*pos*/) -{ - return 0; -} - /** Sets the Maximum Value of the ScrollBar */ void ScrollBar::SetMax(unsigned short Max) { diff --git a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h index 4a2d172ac..3effd49c2 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/ScrollBar.h @@ -77,8 +77,6 @@ private: //Private attributes unsigned short Pos; /** Scroll Bar Status */ unsigned short State; - /** Sets the Text of the current control */ - int SetText(const char* string, int pos = 0); public: void SetImage(unsigned char type, Sprite2D* img); /** Sets the Maximum Value of the ScrollBar */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp index 09812ab3c..d9e24e2dd 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/Slider.cpp @@ -25,6 +25,7 @@ #include "Interface.h" #include "Variables.h" #include "Video.h" +#include "GUI/Window.h" #include @@ -273,12 +274,6 @@ void Slider::OnMouseOver(unsigned short x, unsigned short /*y*/) } } -/** Sets the Text of the current control */ -int Slider::SetText(const char* /*string*/, int /*pos*/) -{ - return 0; -} - /** Sets the slider change event */ bool Slider::SetEvent(int eventType, EventHandler handler) { diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Slider.h b/project/jni/application/gemrb/gemrb/core/GUI/Slider.h index 66f26ae0a..30636082a 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Slider.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/Slider.h @@ -60,8 +60,6 @@ public: void SetPosition(unsigned int pos); /** Sets the selected image */ void SetImage(unsigned char type, Sprite2D * img); - /** Sets the Text of the current control */ - int SetText(const char * string, int pos = 0); /** Sets the State of the Slider */ void SetState(int arg) { State=(unsigned char) arg; } /** Redraws a slider which is associated with VariableName */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp index b19ad5770..9f97eef79 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.cpp @@ -32,6 +32,8 @@ #include "Palette.h" #include "Variables.h" #include "Video.h" +#include "GUI/EventMgr.h" +#include "GUI/Window.h" #include "Scriptable/Actor.h" #include @@ -126,7 +128,7 @@ void TextArea::Draw(unsigned short x, unsigned short y) { unsigned long thisTime; - GetTime( thisTime); + thisTime = GetTickCount(); if (thisTime>starttime) { starttime = thisTime+ticks; smooth--; @@ -297,36 +299,26 @@ int TextArea::SetScrollBar(Control* ptr) } /** Sets the Actual Text */ -int TextArea::SetText(const char* text, int pos) +void TextArea::SetText(const char* text) { - if (pos==0) { - if (!text[0]) { - lines.clear(); - lrows.clear(); - } + if (!text[0]) { + Clear(); + } - if (lines.size() == 0) { - pos = -1; - } - } - if (pos >= ( int ) lines.size()) { - return -1; - } int newlen = ( int ) strlen( text ); - if (pos == -1) { + 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[pos] = (char *) realloc( lines[pos], newlen + 1 ); - memcpy( lines[pos], text, newlen + 1 ); + lines[0] = (char *) realloc( lines[0], newlen + 1 ); + memcpy( lines[0], text, newlen + 1 ); } CurPos = newlen; CurLine = lines.size()-1; UpdateControls(); - return 0; } void TextArea::SetMinRow(bool enable) @@ -479,7 +471,7 @@ void TextArea::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) Owner->Invalidate(); Changed = true; int len = GetRowLength(CurLine); - //printf("len: %d Before: %s\n",len, lines[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]; @@ -487,7 +479,7 @@ void TextArea::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) lines[CurLine][CurPos] = Key; lines[CurLine][len + 1] = 0; CurPos++; - //printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + //print("pos: %d After: %s\n",CurPos, lines[CurLine]); CalcRowCount(); RunEventHandler( TextAreaOnChange ); } @@ -577,7 +569,7 @@ void TextArea::OnSpecialKeyPress(unsigned char Key) break; case GEM_DELETE: len = GetRowLength(CurLine); - //printf("len: %d Before: %s\n",len, lines[CurLine]); + //print("len: %d Before: %s\n",len, lines[CurLine]); if (CurPos>=len) { //TODO: merge next line break; @@ -586,12 +578,12 @@ void TextArea::OnSpecialKeyPress(unsigned char Key) for (i = CurPos; i < len; i++) { lines[CurLine][i] = lines[CurLine][i + 1]; } - //printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + //print("pos: %d After: %s\n",CurPos, lines[CurLine]); break; case GEM_BACKSP: len = GetRowLength(CurLine); if (CurPos != 0) { - //printf("len: %d Before: %s\n",len, lines[CurLine]); + //print("len: %d Before: %s\n",len, lines[CurLine]); if (len<1) { break; } @@ -601,15 +593,15 @@ void TextArea::OnSpecialKeyPress(unsigned char Key) } lines[CurLine][len - 1] = 0; CurPos--; - //printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + //print("pos: %d After: %s\n",CurPos, lines[CurLine]); } else { if (CurLine) { //TODO: merge lines int oldline = CurLine; CurLine--; int old = GetRowLength(CurLine); - //printf("len: %d Before: %s\n",old, lines[CurLine]); - //printf("len: %d Before: %s\n",len, lines[oldline]); + //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]); @@ -617,13 +609,13 @@ void TextArea::OnSpecialKeyPress(unsigned char Key) lines.erase(lines.begin()+oldline); lrows.erase(lrows.begin()+oldline); CurPos = old; - //printf("pos: %d len: %d After: %s\n",CurPos, GetRowLength(CurLine), lines[CurLine]); + //print("pos: %d len: %d After: %s\n",CurPos, GetRowLength(CurLine), lines[CurLine]); } } break; case GEM_RETURN: //add an empty line after CurLine - //printf("pos: %d Before: %s\n",CurPos, lines[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 @@ -637,8 +629,8 @@ void TextArea::OnSpecialKeyPress(unsigned char Key) //move cursor to next line beginning CurLine++; CurPos=0; - //printf("len: %d After: %s\n",GetRowLength(CurLine-1), lines[CurLine-1]); - //printf("len: %d After: %s\n",GetRowLength(CurLine), lines[CurLine]); + //print("len: %d After: %s\n",GetRowLength(CurLine-1), lines[CurLine-1]); + //print("len: %d After: %s\n",GetRowLength(CurLine), lines[CurLine]); break; } CalcRowCount(); @@ -780,7 +772,7 @@ void TextArea::OnMouseOver(unsigned short /*x*/, unsigned short y) if (seltext != (int) i) core->RedrawAll(); seltext = ( int ) i; - //printf("CtrlId = 0x%08lx, seltext = %d, rows = %d, row = %d, r = %d\n", ControlID, i, rows, row, r); + //print("CtrlId = 0x%08lx, seltext = %d, rows = %d, row = %d, r = %d\n", ControlID, i, rows, row, r); return; } } @@ -788,7 +780,7 @@ void TextArea::OnMouseOver(unsigned short /*x*/, unsigned short y) core->RedrawAll(); } seltext = -1; - //printf("CtrlId = 0x%08lx, seltext = %d, rows %d, row %d, r = %d\n", ControlID, seltext, rows, row, r); + //print("CtrlId = 0x%08lx, seltext = %d, rows %d, row %d, r = %d\n", ControlID, seltext, rows, row, r); } /** Mouse Button Up */ @@ -822,13 +814,25 @@ void TextArea::OnMouseUp(unsigned short x, unsigned short y, unsigned short /*Bu RunEventHandler( TextAreaOnChange ); } -/** Copies the current TextArea content to another TextArea control */ -void TextArea::CopyTo(TextArea* ta) +void TextArea::SetText(const std::vector& text) { - ta->Clear(); - for (size_t i = 0; i < lines.size(); i++) { - ta->SetText( lines[i], -1 ); + 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) @@ -939,7 +943,7 @@ void TextArea::SetupScroll(unsigned long tck) } i = (unsigned int) lines.size(); Flags |= IE_GUI_TEXTAREA_SMOOTHSCROLL; - GetTime( starttime ); + starttime = GetTickCount(); if (RunEventHandler( TextAreaOutOfText )) { //event handler destructed this object? return; diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h index 2ba24a496..fe42f3d2c 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/TextArea.h @@ -71,7 +71,9 @@ public: /** Set the TextArea value to the line number containing the string parameter */ void SelectText(const char *select); /** Sets the Actual Text */ - int SetText(const char* text, int pos = 0); + 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 */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp index 969ea88f0..00a884dcc 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.cpp @@ -25,6 +25,12 @@ #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) { @@ -71,6 +77,9 @@ void TextEdit::Draw(unsigned short x, unsigned short y) //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 ); @@ -184,7 +193,7 @@ void TextEdit::OnSpecialKeyPress(unsigned char Key) } /** Sets the Text of the current control */ -int TextEdit::SetText(const char* string, int /*pos*/) +void TextEdit::SetText(const char* string) { strncpy( ( char * ) Buffer, string, max ); Buffer[max]=0; @@ -192,7 +201,6 @@ int TextEdit::SetText(const char* string, int /*pos*/) if (Owner) { Owner->Invalidate(); } - return 0; } void TextEdit::SetBufferLength(ieWord buflen) diff --git a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h index f92e91370..697b3062c 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/TextEdit.h @@ -63,7 +63,7 @@ public: /** Set BackGround */ void SetBackGround(Sprite2D* back); /** Sets the Text of the current control */ - int SetText(const char* string, int pos = 0); + void SetText(const char* string); /** Sets the Text of the current control */ const char* QueryText(); /** Sets the buffer length */ diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp b/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp index ed1395aaf..504bc1e19 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/Window.cpp @@ -24,6 +24,7 @@ #include "GUI/Control.h" #include "GUI/MapControl.h" #include "GUI/Progressbar.h" +#include "GUI/ScrollBar.h" #include "GUI/Slider.h" #include "win32def.h" diff --git a/project/jni/application/gemrb/gemrb/core/GUI/Window.h b/project/jni/application/gemrb/gemrb/core/GUI/Window.h index a4798ddee..450bc05cf 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/Window.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/Window.h @@ -29,15 +29,13 @@ #define WINDOW_H #include "GUI/Control.h" -#include "GUI/ScrollBar.h" -#include "GUI/TextArea.h" #include "exports.h" -#include "Sprite2D.h" - #include +class Sprite2D; + // Window Flags #define WF_CHANGED 1 //window changed #define WF_FRAME 2 //window has frame diff --git a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp index cca132fc9..f13b74aa7 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp +++ b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.cpp @@ -21,11 +21,14 @@ #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) @@ -341,10 +344,10 @@ void WorldMapControl::OnSpecialKeyPress(unsigned char Key) ScrollY += 64; break; case GEM_ALT: - printf( "ALT pressed\n" ); + print( "ALT pressed\n" ); break; case GEM_TAB: - printf( "TAB pressed\n" ); + print( "TAB pressed\n" ); break; } diff --git a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h index c02cef7f5..e0c08ad7c 100644 --- a/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h +++ b/project/jni/application/gemrb/gemrb/core/GUI/WorldMapControl.h @@ -66,8 +66,6 @@ public: void Draw(unsigned short x, unsigned short y); /** Sets the exit direction (we need this to calculate distances) */ void SetDirection(int direction); - /** Sets the Text of the current control */ - int SetText(const char* /*string*/, int /*pos*/) { return 0; } /** Set color for one type of area labels */ void SetColor(int which, Color color); int ScrollX, ScrollY; diff --git a/project/jni/application/gemrb/gemrb/core/Game.cpp b/project/jni/application/gemrb/gemrb/core/Game.cpp index 00009c481..d9903603b 100644 --- a/project/jni/application/gemrb/gemrb/core/Game.cpp +++ b/project/jni/application/gemrb/gemrb/core/Game.cpp @@ -29,10 +29,13 @@ #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" @@ -149,7 +152,7 @@ Game::~Game(void) } } -bool IsAlive(Actor *pc) +static bool IsAlive(Actor *pc) { if (pc->GetStat(IE_STATE_ID)&STATE_DEAD) { return false; @@ -312,6 +315,8 @@ void Game::ConsolidateParty() } for ( m = PCs.begin(); m != PCs.end(); ++m) { (*m)->RefreshEffects(NULL); + //TODO: how to set up bardsongs + (*m)->SetModalSpell((*m)->ModalState, 0); } } @@ -369,8 +374,7 @@ void Game::InitActorPos(Actor *actor) AutoTable strta("startpos"); if (!start || !strta) { - printMessage("Game","Game is missing character start data.\n",RED); - abort(); + error("Game", "Game is missing character start data.\n"); } // 0 - single player, 1 - tutorial, 2 - expansion ieDword playmode = 0; @@ -475,7 +479,7 @@ void Game::SetHotKey(unsigned long Key) Actor *actor = *m; if (actor->IsSelected()) { - actor->HotKey = (ieDword) Key; + actor->AddTrigger(TriggerEntry(trigger_hotkey, (ieDword) Key)); } } } @@ -769,7 +773,7 @@ int Game::LoadMap(const char* ResRef, bool loadscreen) if (!ds) { goto failedload; } - if(!mM->Open( ds, true )) { + if(!mM->Open(ds)) { goto failedload; } newMap = mM->GetMap(ResRef, IsDay()); @@ -1021,7 +1025,7 @@ int Game::GetXPFromCR(int cr) if (cr>=MAX_CRLEVEL) { cr=MAX_CRLEVEL-1; } - printf("Challenge Rating: %d, party level: %d ", cr, level); + print("Challenge Rating: %d, party level: %d ", cr, level); return crtable[level][cr]; } printMessage("Game","Cannot find moncrate.2da!\n", LIGHT_RED); @@ -1097,7 +1101,7 @@ bool Game::EveryoneNearPoint(Map *area, const Point &p, int flags) const return false; } if (Distance(p,PCs[i])>MAX_TRAVELING_DISTANCE) { -printf("Actor %s is not near!\n", PCs[i]->LongName); + print("Actor %s is not near!\n", PCs[i]->LongName); return false; } } @@ -1124,17 +1128,6 @@ void Game::PartyMemberDied(Actor *actor) } } -//reports if someone died -int Game::PartyMemberDied() const -{ - for (unsigned int i=0; iGetInternalFlag()&IF_JUSTDIED) { - return i; - } - } - return -1; -} - void Game::IncrementChapter() { //chapter first set to 0 (prologue) @@ -1285,8 +1278,7 @@ bool Game::EveryoneDead() const void Game::UpdateScripts() { - ExecuteScript( 1 ); - ProcessActions(false); + Update(); size_t idx; PartyAttack = false; @@ -1524,7 +1516,19 @@ void Game::RestParty(int checks, int dream, int hp) void Game::TimeStop(Actor* owner, ieDword end) { timestop_owner=owner; - timestop_end=GameTime+end; + 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 @@ -1549,7 +1553,6 @@ void Game::Infravision() //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 TimeStopTint={0xe0,0xe0,0xe0,0x20}; //greyscale 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 @@ -1558,9 +1561,6 @@ static const Color DarkTint={0x80,0x80,0xe0,0x10}; //slightly dark bluish const Color *Game::GetGlobalTint() const { - if (timestop_end>GameTime) { - return &TimeStopTint; - } Map *map = GetCurrentArea(); if (!map) return NULL; if (map->AreaFlags&AF_DREAM) { @@ -1617,7 +1617,7 @@ void Game::ChangeSong(bool always, bool force) } /* this method redraws weather. If update is false, -then the weather particles won't change (game paused) + then the weather particles won't change (game paused) */ void Game::DrawWeather(const Region &screen, bool update) { @@ -1717,21 +1717,21 @@ void Game::DebugDump() { size_t idx; - printf("Currently loaded areas:\n"); + print("Currently loaded areas:\n"); for(idx=0;idxGetScriptName()); + print("%s\n",map->GetScriptName()); } - printf("Current area: %s Previous area: %s\n", CurrentArea, PreviousArea); - printf("Global script: %s\n", Scripts[0]->GetName()); - printf("CombatCounter: %d\n", (int) CombatCounter); + print("Current area: %s Previous area: %s\n", CurrentArea, PreviousArea); + print("Global script: %s\n", Scripts[0]->GetName()); + print("CombatCounter: %d\n", (int) CombatCounter); - printf("Party size: %d\n", (int) PCs.size()); + print("Party size: %d\n", (int) PCs.size()); for(idx=0;idxShortName, actor->InParty, actor->Selected?"x":"-"); + print("Name: %s Order %d %s\n",actor->ShortName, actor->InParty, actor->Selected?"x":"-"); } } @@ -1755,3 +1755,7 @@ ieByte *Game::AllocateMazeData() 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 index 5ed080447..851d28d72 100644 --- a/project/jni/application/gemrb/gemrb/core/Game.h +++ b/project/jni/application/gemrb/gemrb/core/Game.h @@ -34,13 +34,16 @@ class Game; #include "ie_types.h" #include "Callback.h" -#include "Map.h" +#include "Scriptable/Scriptable.h" +#include "Scriptable/PCStatStruct.h" #include "Variables.h" -#include "Scriptable/Actor.h" #include +class Actor; +class Map; class Particles; +class TableMgr; //the size of the bestiary register #define BESTIARY_SIZE 260 @@ -420,8 +423,6 @@ public: /** returns true if no one moves */ bool EveryoneStopped() const; bool EveryoneNearPoint(Map *map, const Point &p, int flags) const; - /** returns true if a PC just died */ - int PartyMemberDied() const; /** a party member just died now */ void PartyMemberDied(Actor *); /** Increments chapter variable and refreshes kill stats */ @@ -449,6 +450,8 @@ public: 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, @@ -468,6 +471,8 @@ public: 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); diff --git a/project/jni/application/gemrb/gemrb/core/GameData.cpp b/project/jni/application/gemrb/gemrb/core/GameData.cpp index 038711cbd..f4c82b53f 100644 --- a/project/jni/application/gemrb/gemrb/core/GameData.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameData.cpp @@ -20,9 +20,12 @@ #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" @@ -32,9 +35,12 @@ #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" @@ -90,7 +96,7 @@ Actor *GameData::GetCreature(const char* ResRef, unsigned int PartySlot) return 0; PluginHolder actormgr(IE_CRE_CLASS_ID); - if (!actormgr->Open( ds, true )) { + if (!actormgr->Open(ds)) { return 0; } Actor* actor = actormgr->GetActor(PartySlot); @@ -106,11 +112,9 @@ int GameData::LoadCreature(const char* ResRef, unsigned int PartySlot, bool char char nPath[_MAX_PATH], fName[16]; snprintf( fName, sizeof(fName), "%s.chr", ResRef); PathJoin( nPath, core->GamePath, "characters", fName, NULL ); - FileStream *fs = new FileStream(); - fs -> Open( nPath, true ); - stream = (DataStream *) fs; + stream = FileStream::OpenFile(nPath); PluginHolder actormgr(IE_CRE_CLASS_ID); - if (!actormgr->Open( stream, true )) { + if (!actormgr->Open(stream)) { return -1; } actor = actormgr->GetActor(PartySlot); @@ -151,7 +155,7 @@ int GameData::LoadTable(const ieResRef ResRef) tables[ind].refcount++; return ind; } - //printf("(%s) Table not found... Loading from file\n", ResRef); + //print("(%s) Table not found... Loading from file\n", ResRef); DataStream* str = GetResource( ResRef, IE_2DA_CLASS_ID ); if (!str) { return -1; @@ -161,7 +165,7 @@ int GameData::LoadTable(const ieResRef ResRef) delete str; return -1; } - if (!tm->Open( str, true )) { + if (!tm->Open(str)) { return -1; } Table t; @@ -257,8 +261,7 @@ void GameData::FreePalette(Palette *&pal, const ieResRef name) } if (!name || !name[0]) { if(pal->named) { - printf("Palette is supposed to be named, but got no name!\n"); - abort(); + error("GameData", "Palette is supposed to be named, but got no name!\n"); } else { pal->Release(); pal=NULL; @@ -266,14 +269,11 @@ void GameData::FreePalette(Palette *&pal, const ieResRef name) return; } if (!pal->named) { - printf("Unnamed palette, it should be %s!\n", name); - abort(); + error("GameData", "Unnamed palette, it should be %s!\n", name); } res=PaletteCache.DecRef((void *) pal, name, true); if (res<0) { - printMessage( "Core", "Corrupted Palette cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Palette name is: %.8s\n", name); - abort(); + error("Core", "Corrupted Palette cache encountered (reference count went below zero), Palette name is: %.8s\n", name); } if (!res) { pal->Release(); @@ -293,7 +293,7 @@ Item* GameData::GetItem(const ieResRef resname) delete ( str ); return NULL; } - if (!sm->Open( str, true )) { + if (!sm->Open(str)) { return NULL; } @@ -316,9 +316,7 @@ void GameData::FreeItem(Item const *itm, const ieResRef name, bool free) res=ItemCache.DecRef((void *) itm, name, free); if (res<0) { - printMessage( "Core", "Corrupted Item cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Item name is: %.8s\n", name); - abort(); + error("Core", "Corrupted Item cache encountered (reference count went below zero), Item name is: %.8s\n", name); } if (res) return; if (free) delete itm; @@ -336,7 +334,7 @@ Spell* GameData::GetSpell(const ieResRef resname, bool silent) delete ( str ); return NULL; } - if (!sm->Open( str, true )) { + if (!sm->Open(str)) { return NULL; } @@ -358,8 +356,8 @@ void GameData::FreeSpell(Spell *spl, const ieResRef name, bool free) res=SpellCache.DecRef((void *) spl, name, free); if (res<0) { - printMessage( "Core", "Corrupted Spell cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Spell name is: %.8s or %.8s\n", name, spl->Name); + 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; @@ -378,7 +376,7 @@ Effect* GameData::GetEffect(const ieResRef resname) delete ( str ); return NULL; } - if (!em->Open( str, true )) { + if (!em->Open(str)) { return NULL; } @@ -397,9 +395,7 @@ void GameData::FreeEffect(Effect *eff, const ieResRef name, bool free) res=EffectCache.DecRef((void *) eff, name, free); if (res<0) { - printMessage( "Core", "Corrupted Effect cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Effect name is: %.8s\n", name); - abort(); + error("Core", "Corrupted Effect cache encountered (reference count went below zero), Effect name is: %.8s\n", name); } if (res) return; if (free) delete eff; @@ -413,7 +409,7 @@ ScriptedAnimation* GameData::GetScriptedAnimation( const char *effect, bool doub if (Exists( effect, IE_VVC_CLASS_ID, true ) ) { DataStream *ds = GetResource( effect, IE_VVC_CLASS_ID ); - ret = new ScriptedAnimation(ds, true); + ret = new ScriptedAnimation(ds); } else { AnimationFactory *af = (AnimationFactory *) GetFactoryResource( effect, IE_BAM_CLASS_ID, IE_NORMAL ); @@ -463,7 +459,8 @@ void* GameData::GetFactoryResource(const char* resname, SClass_ID type, PluginHolder ani(IE_BAM_CLASS_ID); if (!ani) return NULL; - ani->Open( ret, true ); + if (!ani->Open(ret)) + return NULL; AnimationFactory* af = ani->GetAnimationFactory( resname, mode ); factory->AddFactoryObject( af ); return af; @@ -482,9 +479,71 @@ void* GameData::GetFactoryResource(const char* resname, SClass_ID type, return NULL; } default: - printf( "\n" ); - printMessage( "KEYImporter", " ", WHITE ); - printf( "%s files are not supported.\n", core->TypeExt( type ) ); + 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 index e61a65eb0..30c9aaf68 100644 --- a/project/jni/application/gemrb/gemrb/core/GameData.h +++ b/project/jni/application/gemrb/gemrb/core/GameData.h @@ -24,11 +24,19 @@ #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; @@ -38,6 +46,7 @@ class ScriptedAnimation; class Spell; class Sprite2D; class TableMgr; +class Store; struct Table { Holder tm; @@ -90,6 +99,12 @@ public: /** 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; @@ -97,6 +112,8 @@ private: Cache PaletteCache; Factory* factory; std::vector tables; + typedef std::map StoreMap; + StoreMap stores; }; extern GEM_EXPORT GameData * gamedata; diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp index fb34e6c63..89c11ddf6 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/Actions.cpp @@ -27,11 +27,14 @@ #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" @@ -41,6 +44,7 @@ #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" @@ -457,7 +461,7 @@ void GameScript::TriggerActivation(Scriptable* Sender, Action* parameters) ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); } if (!ip || (ip->Type!=ST_TRIGGER && ip->Type!=ST_TRAVEL && ip->Type!=ST_PROXIMITY)) { - printf("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); + print("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); return; } InfoPoint *trigger = (InfoPoint *) ip; @@ -578,7 +582,7 @@ void GameScript::ExitPocketPlane(Scriptable* /*Sender*/, Action* /*parameters*/) if (act) { if (game->GetPlaneLocationCount() <= (unsigned int)i) { // what are we meant to do here? - printf("argh, couldn't restore party member %d!", i + 1); + print("argh, couldn't restore party member %d!", i + 1); continue; } GAMLocationEntry *gle = game->GetPlaneLocationEntry(i); @@ -678,7 +682,7 @@ void GameScript::CreateCreatureObjectDoor(Scriptable* Sender, Action* parameters { //we hack this to death strcpy(parameters->string1Parameter, "SPDIMNDR"); - CreateCreatureCore( Sender, parameters, CC_OFFSET | CC_CHECK_IMPASSABLE|CC_CHECK_OVERLAP | CC_PLAY_ANIM ); + CreateCreatureCore( Sender, parameters, CC_OBJECT | CC_CHECK_IMPASSABLE|CC_CHECK_OVERLAP | CC_PLAY_ANIM ); } //don't use offset from Sender @@ -1126,13 +1130,10 @@ void GameScript::MoveToPoint(Scriptable* Sender, Action* parameters) return; } Actor* actor = ( Actor* ) Sender; - //InMove can clear destination, so we need to save it - Point dest = actor->Destination; // try the actual move, if we are not already moving there if (!actor->InMove() || actor->Destination != parameters->pointParameter) { actor->WalkTo( parameters->pointParameter, 0 ); - dest = actor->Destination; } // give up if we can't move there (no path was found) @@ -1308,7 +1309,7 @@ void GameScript::RestorePartyLocation(Scriptable* /*Sender*/, Action* /*paramete if (act) { if (game->GetSavedLocationCount() <= (unsigned int)i) { // what are we meant to do here? - printf("argh, couldn't restore party member %d!", i + 1); + print("argh, couldn't restore party member %d!", i + 1); continue; } GAMLocationEntry *gle = game->GetSavedLocationEntry(i); @@ -1523,7 +1524,7 @@ void GameScript::DisplayStringHead(Scriptable* Sender, Action* parameters) Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); if (!target) { target=Sender; - printf("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); + print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); } DisplayStringCore(target, parameters->int0Parameter, DS_CONSOLE|DS_HEAD|DS_SPEECH ); @@ -1556,7 +1557,7 @@ void GameScript::FloatMessageFixed(Scriptable* Sender, Action* parameters) Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); if (!target) { target=Sender; - printf("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); + print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); } DisplayStringCore(target, parameters->int0Parameter, DS_CONSOLE|DS_HEAD); @@ -1567,7 +1568,7 @@ void GameScript::FloatMessageFixedRnd(Scriptable* Sender, Action* parameters) Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); if (!target) { target=Sender; - printf("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); + print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); } SrcVector *rndstr=LoadSrc(parameters->string0Parameter); @@ -1584,7 +1585,7 @@ void GameScript::FloatMessageRnd(Scriptable* Sender, Action* parameters) Scriptable* target = GetActorFromObject( Sender, parameters->objects[1] ); if (!target) { target=Sender; - printf("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); + print("DisplayStringHead/FloatMessage got no target, assuming Sender!\n"); } SrcVector *rndstr=LoadSrc(parameters->string0Parameter); @@ -1770,20 +1771,20 @@ void GameScript::SetMusic(Scriptable* Sender, Action* parameters) //optional integer parameter (isSpeech) void GameScript::PlaySound(Scriptable* Sender, Action* parameters) { - printf( "PlaySound(%s)\n", parameters->string0Parameter ); + 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) { - printf( "PlaySound(%s)\n", parameters->string0Parameter ); + print( "PlaySound(%s)\n", parameters->string0Parameter ); core->GetAudioDrv()->Play( parameters->string0Parameter, parameters->pointParameter.x, parameters->pointParameter.y ); } void GameScript::PlaySoundNotRanged(Scriptable* /*Sender*/, Action* parameters) { - printf( "PlaySound(%s)\n", parameters->string0Parameter ); + print( "PlaySound(%s)\n", parameters->string0Parameter ); core->GetAudioDrv()->Play( parameters->string0Parameter, 0, 0); } @@ -1903,7 +1904,7 @@ void GameScript::AmbientActivate(Scriptable* Sender, Action* parameters) anim = Sender->GetCurrentArea( )->GetAnimation( parameters->objects[1]->objectName ); } if (!anim) { - printf( "Script error: No Animation Named \"%s\" or \"%s\"\n", + print( "Script error: No Animation Named \"%s\" or \"%s\"\n", parameters->string0Parameter,parameters->objects[1]->objectName ); return; } @@ -1934,7 +1935,7 @@ void GameScript::StaticStart(Scriptable* Sender, Action* parameters) { AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); if (!anim) { - printf( "Script error: No Animation Named \"%s\"\n", + print( "Script error: No Animation Named \"%s\"\n", parameters->objects[1]->objectName ); return; } @@ -1945,7 +1946,7 @@ void GameScript::StaticStop(Scriptable* Sender, Action* parameters) { AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); if (!anim) { - printf( "Script error: No Animation Named \"%s\"\n", + print( "Script error: No Animation Named \"%s\"\n", parameters->objects[1]->objectName ); return; } @@ -1956,7 +1957,7 @@ void GameScript::StaticPalette(Scriptable* Sender, Action* parameters) { AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); if (!anim) { - printf( "Script error: No Animation Named \"%s\"\n", + print( "Script error: No Animation Named \"%s\"\n", parameters->objects[1]->objectName ); return; } @@ -2146,7 +2147,7 @@ void GameScript::NIDSpecial2(Scriptable* Sender, Action* /*parameters*/) } //travel direction passed to guiscript int direction = Sender->GetCurrentArea()->WhichEdge(actor->Pos); - printf("Travel direction returned: %d\n", direction); + print("Travel direction returned: %d\n", direction); if (direction==-1) { Sender->ReleaseCurrentAction(); return; @@ -2565,16 +2566,16 @@ void GameScript::Spell(Scriptable* Sender, Action* parameters) return; } - //if target was set, fire spell - if (Sender->LastTarget) { - Sender->CastSpellEnd(0); - Sender->ReleaseCurrentAction(); - return; - } - - //the target was converted to a point - if(!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2613,6 +2614,7 @@ void GameScript::Spell(Scriptable* Sender, Action* parameters) //stop doing anything else act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpell( spellres, tar, true ); if (duration != -1) Sender->SetWait(duration); @@ -2634,9 +2636,13 @@ void GameScript::SpellPoint(Scriptable* Sender, Action* parameters) return; } - //if target was set, fire spell - if (!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2657,6 +2663,7 @@ void GameScript::SpellPoint(Scriptable* Sender, Action* parameters) act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, true ); if (duration != -1) Sender->SetWait(duration); @@ -2683,16 +2690,16 @@ void GameScript::SpellNoDec(Scriptable* Sender, Action* parameters) } } - //if target was set, fire spell - if (Sender->LastTarget) { - Sender->CastSpellEnd(0); - Sender->ReleaseCurrentAction(); - return; - } - - //the target was converted to a point - if(!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2714,6 +2721,7 @@ void GameScript::SpellNoDec(Scriptable* Sender, Action* parameters) //stop doing anything else act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpell( spellres, tar, false ); if (duration != -1) Sender->SetWait(duration); @@ -2740,9 +2748,13 @@ void GameScript::SpellPointNoDec(Scriptable* Sender, Action* parameters) } } - //if target was set, fire spell - if (!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2756,6 +2768,7 @@ void GameScript::SpellPointNoDec(Scriptable* Sender, Action* parameters) act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, false ); if (duration != -1) Sender->SetWait(duration); @@ -2782,16 +2795,16 @@ void GameScript::ForceSpell(Scriptable* Sender, Action* parameters) } } - //if target was set, fire spell - if (Sender->LastTarget) { - Sender->CastSpellEnd(0); - Sender->ReleaseCurrentAction(); - return; - } - - //the target was converted to a point - if(!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2813,6 +2826,7 @@ void GameScript::ForceSpell(Scriptable* Sender, Action* parameters) //stop doing anything else act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpell (spellres, tar, false); if (duration != -1) Sender->SetWait(duration); @@ -2838,9 +2852,13 @@ void GameScript::ForceSpellPoint(Scriptable* Sender, Action* parameters) } } - //if target was set, fire spell - if (!Sender->LastTargetPos.isempty()) { - Sender->CastSpellPointEnd(0); + 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; } @@ -2854,6 +2872,7 @@ void GameScript::ForceSpellPoint(Scriptable* Sender, Action* parameters) act->SetModal(MS_NONE); } + Sender->CurrentActionState = 1; int duration = Sender->CastSpellPoint (spellres, parameters->pointParameter, false); if (duration != -1) Sender->SetWait(duration); @@ -2975,9 +2994,9 @@ void GameScript::ReallyForceSpellDead(Scriptable* Sender, Action* parameters) level = parameters->int1Parameter; } if (tar->Type==ST_ACTOR) { - Sender->CastSpellEnd(parameters->int1Parameter); + Sender->CastSpellEnd(level); } else { - Sender->CastSpellPointEnd(parameters->int1Parameter); + Sender->CastSpellPointEnd(level); } Sender->ReleaseCurrentAction(); } @@ -3387,18 +3406,18 @@ void GameScript::PlayDead(Scriptable* Sender, Action* parameters) return; } Actor* actor = ( Actor* ) Sender; + actor->CurrentActionInterruptable = false; - if (Sender->CurrentActionState == 0) { - // TODO: what if parameter is 0? see orphan2 + if (!Sender->CurrentActionTicks && parameters->int0Parameter) { + // set countdown on first run Sender->CurrentActionState = parameters->int0Parameter; actor->SetStance( IE_ANI_DIE ); - } else { - actor->CurrentActionState--; - if (Sender->CurrentActionState == 0) { - actor->SetStance( IE_ANI_GET_UP ); - Sender->ReleaseCurrentAction(); - } } + if (Sender->CurrentActionState <= 0) { + actor->SetStance( IE_ANI_GET_UP ); + Sender->ReleaseCurrentAction(); + } + actor->CurrentActionState--; } void GameScript::PlayDeadInterruptable(Scriptable* Sender, Action* parameters) @@ -3408,17 +3427,17 @@ void GameScript::PlayDeadInterruptable(Scriptable* Sender, Action* parameters) return; } Actor* actor = ( Actor* ) Sender; - if (Sender->CurrentActionState == 0) { - // TODO: what if parameter is 0? see orphan2 + + if (!Sender->CurrentActionTicks && parameters->int0Parameter) { + // set countdown on first run Sender->CurrentActionState = parameters->int0Parameter; actor->SetStance( IE_ANI_DIE ); - } else { - actor->CurrentActionState--; - if (Sender->CurrentActionState == 0) { - actor->SetStance( IE_ANI_GET_UP ); - Sender->ReleaseCurrentAction(); - } } + 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 */ @@ -3863,7 +3882,7 @@ void GameScript::MakeUnselectable(Scriptable* Sender, Action* parameters) void GameScript::Debug(Scriptable* /*Sender*/, Action* parameters) { InDebug=parameters->int0Parameter; - printMessage("GameScript",parameters->string0Parameter,YELLOW); + printMessage("GameScript","%s",YELLOW,parameters->string0Parameter); } void GameScript::IncrementProficiency(Scriptable* Sender, Action* parameters) @@ -4269,7 +4288,10 @@ void GameScript::CreateItem(Scriptable *Sender, Action* parameters) } CREItem *item = new CREItem(); - CreateItemCore(item, parameters->string0Parameter, parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); + if (!CreateItemCore(item, parameters->string0Parameter, parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter)) { + delete item; + return; + } if (tar->Type==ST_CONTAINER) { myinv->AddItem(item); } else { @@ -4300,7 +4322,10 @@ void GameScript::CreateItemNumGlobal(Scriptable *Sender, Action* parameters) } int value = CheckVariable( Sender, parameters->string0Parameter ); CREItem *item = new CREItem(); - CreateItemCore(item, parameters->string1Parameter, value, 0, 0); + if (!CreateItemCore(item, parameters->string1Parameter, value, 0, 0)) { + delete item; + return; + } if (Sender->Type==ST_CONTAINER) { myinv->AddItem(item); } else { @@ -4328,7 +4353,10 @@ void GameScript::TakeItemReplace(Scriptable *Sender, Action* parameters) if (!item) { item = new CREItem(); } - CreateItemCore(item, parameters->string0Parameter, -1, 0, 0); + 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); @@ -4600,10 +4628,11 @@ void GameScript::PickPockets(Scriptable *Sender, Action* parameters) //noticed attempt displaymsg->DisplayConstantString(STR_PICKPOCKET_FAIL,0xffffff); if (core->HasFeature(GF_STEAL_IS_ATTACK) ) { - tar->LastAttacker = snd->GetGlobalID(); + tar->AddTrigger(TriggerEntry(trigger_attackedby, snd->GetGlobalID())); + tar->LastAttacker = snd->GetGlobalID(); // FIXME } else { //pickpocket failed trigger - tar->LastOpenFailed = snd->GetGlobalID(); + tar->AddTrigger(TriggerEntry(trigger_pickpocketfailed, snd->GetGlobalID())); } Sender->ReleaseCurrentAction(); return; @@ -4635,7 +4664,9 @@ void GameScript::PickPockets(Scriptable *Sender, Action* parameters) return; } CREItem *item = new CREItem(); - CreateItemCore(item, core->GoldResRef, money, 0, 0); + 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 { @@ -4763,6 +4794,16 @@ void GameScript::QuitGame(Scriptable* Sender, Action* parameters) 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) { @@ -4886,8 +4927,7 @@ void GameScript::RevealAreaOnMap(Scriptable* /*Sender*/, Action* parameters) { WorldMap *worldmap = core->GetWorldMap(); if (!worldmap) { - printf("Can't find worldmap!\n"); - abort(); + 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); @@ -4898,8 +4938,7 @@ void GameScript::HideAreaOnMap( Scriptable* /*Sender*/, Action* parameters) { WorldMap *worldmap = core->GetWorldMap(); if (!worldmap) { - printf("Can't find worldmap!\n"); - abort(); + 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); @@ -4911,7 +4950,7 @@ void GameScript::SendTrigger(Scriptable* Sender, Action* parameters) if (!tar) { return; } - tar->TriggerID=parameters->int0Parameter; + tar->AddTrigger(TriggerEntry(trigger_trigger, parameters->int0Parameter)); } void GameScript::Shout( Scriptable* Sender, Action* parameters) @@ -4957,8 +4996,7 @@ void GameScript::GiveOrder(Scriptable* Sender, Action* parameters) { Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); if (tar) { - tar->LastOrderer = Sender->GetGlobalID(); - tar->LastOrder = parameters->int0Parameter; + tar->AddTrigger(TriggerEntry(trigger_receivedorder, Sender->GetGlobalID(), parameters->int0Parameter)); } } @@ -5865,7 +5903,7 @@ void GameScript::SaveGame(Scriptable* /*Sender*/, Action* parameters) void GameScript::EscapeArea(Scriptable* Sender, Action* parameters) { if (InDebug&ID_ACTIONS) { - printf("EscapeArea/EscapeAreaMove\n"); + print("EscapeArea/EscapeAreaMove\n"); } if (Sender->Type!=ST_ACTOR) { Sender->ReleaseCurrentAction(); @@ -5893,7 +5931,7 @@ void GameScript::EscapeArea(Scriptable* Sender, Action* parameters) void GameScript::EscapeAreaNoSee(Scriptable* Sender, Action* parameters) { if (InDebug&ID_ACTIONS) { - printf("EscapeAreaNoSee\n"); + print("EscapeAreaNoSee\n"); } if (Sender->Type!=ST_ACTOR) { Sender->ReleaseCurrentAction(); @@ -6224,12 +6262,13 @@ void GameScript::SetNoOneOnTrigger(Scriptable* Sender, Action* parameters) ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); } if (!ip || (ip->Type!=ST_TRIGGER && ip->Type!=ST_TRAVEL && ip->Type!=ST_PROXIMITY)) { - printf("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); + print("Script error: No Trigger Named \"%s\"\n", parameters->objects[1]->objectName); return; } - ip->LastEntered = 0; + // FIXME: what does this do? clear triggers? + /*ip->LastEntered = 0; ip->LastTrigger = 0; - ip->LastTriggerObject = 0; + ip->LastTriggerObject = 0;*/ } void GameScript::UseDoor(Scriptable* Sender, Action* parameters) @@ -6348,7 +6387,8 @@ void GameScript::ChangeDestination(Scriptable* Sender, Action* parameters) { InfoPoint *ip = Sender->GetCurrentArea()->TMap->GetInfoPoint(parameters->objects[1]->objectName); if (ip && (ip->Type==ST_TRAVEL) ) { - strnlwrcpy(ip->Destination, parameters->string0Parameter, 32); + //alter the destination area, don't touch the entrance variable link + strnlwrcpy(ip->Destination, parameters->string0Parameter, sizeof(ieResRef)-1 ); } } @@ -6794,7 +6834,8 @@ void GameScript::ProtectObject(Scriptable* Sender, Action* parameters) Actor *scr = (Actor *)Sender; Actor *actor = (Actor *)tar; scr->LastFollowed = actor->GetGlobalID(); - scr->LastProtected = actor->GetGlobalID(); + scr->LastProtectee = actor->GetGlobalID(); + actor->LastProtector = scr->GetGlobalID(); //not exactly range scr->FollowOffset.x = parameters->int0Parameter; scr->FollowOffset.y = parameters->int0Parameter; @@ -7148,7 +7189,7 @@ void GameScript::SetToken2DA(Scriptable* /*Sender*/, Action* parameters) AutoTable tm(parameters->string0Parameter); if (!tm) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find %s.2da.\n", parameters->string0Parameter); + print( "Cannot find %s.2da.\n", parameters->string0Parameter); return; } diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp index 9fe3c6c31..26fa7fc43 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.cpp @@ -25,15 +25,18 @@ #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" @@ -239,24 +242,9 @@ bool ResolveItemName(ieResRef itemres, Actor *act, ieDword Slot) bool StoreHasItemCore(const ieResRef storename, const ieResRef itemname) { - bool had_nostore=false; - bool has_current=false; - ieResRef current; - ieDword owner = 0; CREItem item; - Store *store = core->GetCurrentStore(); - if (!store) { - had_nostore = true; - store = core->SetCurrentStore(storename, 0); - } else { - if (strnicmp(store->Name, storename, 8) ) { - //not the current store, we need some dirty hack - has_current = true; - strnlwrcpy(current, store->Name, 8); - owner = store->GetOwnerID(); - } - } + Store* store = gamedata->GetStore(storename); if (!store) { printMessage("GameScript","Store cannot be opened!\n", LIGHT_RED); return false; @@ -267,12 +255,7 @@ bool StoreHasItemCore(const ieResRef storename, const ieResRef itemname) if (store->FindItem(itemname, false) != (unsigned int)-1) { ret=true; } - if (has_current) { - //setting back old store (this will save our current store) - core->SetCurrentStore(current, owner); - } else if (had_nostore) { - core->CloseCurrentStore(); - } + // Don't call gamedata->SaveStore, we don't change it, and it remains cached. return ret; } @@ -368,7 +351,7 @@ void DisplayStringCore(Scriptable* Sender, int Strref, int flags) memset(&sb,0,sizeof(sb)); Sound[0]=0; - printf( "Displaying string on: %s\n", Sender->GetScriptName() ); + 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); @@ -599,8 +582,8 @@ void CreateCreatureCore(Scriptable* Sender, Action* parameters, int flags) } if (!ab) { - printMessage("GameScript","Failed to create creature! ",LIGHT_RED); - printf("(missing creature file %s?)\n", parameters->string0Parameter); + printMessage("GameScript", "Failed to create creature! (missing creature file %s?)\n", LIGHT_RED, + parameters->string0Parameter); // maybe this should abort()? return; } @@ -725,7 +708,7 @@ void EscapeAreaCore(Scriptable* Sender, const Point &p, const char* area, const //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()) printf("At least it said so...\n"); + if (!Sender->InMove()) print("At least it said so...\n"); return; } } @@ -737,13 +720,12 @@ void EscapeAreaCore(Scriptable* Sender, const Point &p, const char* area, const // 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"," ", WHITE); - printf("Executing %s in EscapeAreaCore\n", Tmp); + 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) { - printf("But wait a bit... (%d)\n", wait); + print("But wait a bit... (%d)\n", wait); Sender->SetWait(wait); } Sender->ReleaseCurrentAction(); @@ -825,7 +807,7 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) int seeflag = GA_NO_DEAD; if (InDebug&ID_VARIABLES) { - printf("BeginDialog core\n"); + print("BeginDialog core\n"); } if (Flags & BD_OWN) { tar = GetStoredActorFromObject( Sender, parameters->objects[1], seeflag); @@ -835,23 +817,23 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) scr = Sender; } if (!scr) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Speaker for dialog couldn't be found (Sender: %s, Type: %d) Flags:%d.\n", Sender->GetScriptName(), Sender->Type, Flags); + 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"," ",LIGHT_RED); - printf("Target for dialog couldn't be found (Sender: %s, Type: %d).\n", Sender->GetScriptName(), Sender->Type); + 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(); } - printf ("Target object: "); + print ("Target object: "); if (parameters->objects[1]) { parameters->objects[1]->Dump(); } else { - printf("\n"); + print("\n"); } Sender->ReleaseCurrentAction(); return; @@ -862,8 +844,8 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) speaker = NULL; target = (Actor *) tar; if ((Flags & BD_CHECKDIST) && !CanSee(scr, target, false, seeflag) ) { - printMessage("GameScript"," ",LIGHT_RED); - printf("CanSee returned false! Speaker (%s, type %d) and target are:\n", scr->GetScriptName(), scr->Type); + 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(); } @@ -876,7 +858,7 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) speaker = (Actor *) scr; if (speaker->GetStat(IE_STATE_ID)&STATE_DEAD) { printMessage("GameScript"," ",LIGHT_RED); - printf("Speaker is dead, cannot start dialogue. Speaker and target are:\n"); + print("Speaker is dead, cannot start dialogue. Speaker and target are:\n"); speaker->DebugDump(); target->DebugDump(); Sender->ReleaseCurrentAction(); @@ -1032,7 +1014,7 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) } } - int ret; + bool ret; if (Dialog[0]) { //increasing NumTimesTalkedTo or NumTimesInteracted @@ -1046,28 +1028,24 @@ void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) ret = gc->dialoghandler->InitDialog( scr, tar, Dialog); } else { - ret = -1; + ret = false; } - if (ret<0) { - Sender->ReleaseCurrentAction(); + Sender->ReleaseCurrentAction(); + + if (!ret) { if (Flags & BD_NOEMPTY) { return; } displaymsg->DisplayConstantStringName(STR_NOTHINGTOSAY,0xff0000,tar); return; } - - //this is a bit fishy - Sender->SetWait(1); - Sender->ReleaseCurrentAction(); - } void MoveBetweenAreasCore(Actor* actor, const char *area, const Point &position, int face, bool adjust) { - printMessage("GameScript", " ", WHITE); - printf("MoveBetweenAreas: %s to %s [%d.%d] face: %d\n", actor->GetName(0), area,position.x,position.y, face); + 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? @@ -1139,11 +1117,12 @@ void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, boo Sender->ReleaseCurrentAction(); } -void CreateItemCore(CREItem *item, const char *resref, int a, int b, int c) +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); - core->ResolveRandomItem(item); + if (!core->ResolveRandomItem(item)) + return false; if (a==-1) { //use the default charge counts of the item Item *origitem = gamedata->GetItem(item->ItemResRef); @@ -1160,6 +1139,7 @@ void CreateItemCore(CREItem *item, const char *resref, int a, int b, int c) item->Usages[2]=(ieWord) c; } item->Flags=0; + return true; } //It is possible to attack CONTAINERS/DOORS as well!!! @@ -1264,8 +1244,8 @@ static int GetIdsValue(const char *&symbol, const char *idsname) if (!valHook) { //FIXME:missing ids file!!! if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Missing IDS file %s for symbol %s!\n",idsname, symbol); + printMessage("GameScript", "Missing IDS file %s for symbol %s!\n", LIGHT_RED, + idsname, symbol); } return -1; } @@ -1363,11 +1343,11 @@ Action* GenerateActionCore(const char *src, const char *str, unsigned short acti //Here is the Action; Now we need to evaluate the parameters, if any if (*str!=')') while (*str) { if (*(str+1)!=':') { - printf("Warning, parser was sidetracked: %s\n",str); + print("Warning, parser was sidetracked: %s\n",str); } switch (*str) { default: - printf("Invalid type: %s\n",str); + print("Invalid type: %s\n",str); //str++; delete newAction; return NULL; @@ -1460,7 +1440,7 @@ Action* GenerateActionCore(const char *src, const char *str, unsigned short acti case 'o': //Object if (objectCount==3) { - printf("Invalid object count!\n"); + print("Invalid object count!\n"); //abort(); delete newAction; return NULL; @@ -1514,7 +1494,7 @@ Action* GenerateActionCore(const char *src, const char *str, unsigned short acti if (mergestrings) { str++; if (*str!='s') { - printf("Invalid mergestrings:%s\n",str); + print("Invalid mergestrings:%s\n",str); //abort(); delete newAction; return NULL; @@ -1644,9 +1624,7 @@ void FreeSrc(SrcVector *poi, const ieResRef key) { int res = SrcCache.DecRef((void *) poi, key, true); if (res<0) { - printMessage( "GameScript", "Corrupted Src cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Src name is: %.8s\n", key); - abort(); + error("GameScript", "Corrupted Src cache encountered (reference count went below zero), Src name is: %.8s\n", key); } if (!res) { delete poi; @@ -1733,11 +1711,11 @@ Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int //Here is the Trigger; Now we need to evaluate the parameters if (*str!=')') while (*str) { if (*(str+1)!=':') { - printf("Warning, parser was sidetracked: %s\n",str); + print("Warning, parser was sidetracked: %s\n",str); } switch (*str) { default: - printf("Invalid type: %s\n",str); + print("Invalid type: %s\n",str); //str++; delete newTrigger; return NULL; @@ -1833,7 +1811,7 @@ Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int if (mergestrings) { str++; if (*str!='s') { - printf("Invalid mergestrings:%s\n",str); + print("Invalid mergestrings:%s\n",str); //abort(); delete newTrigger; return NULL; @@ -1880,7 +1858,7 @@ void SetVariable(Scriptable* Sender, const char* VarName, const char* Context, i char newVarName[8+33]; if (InDebug&ID_VARIABLES) { - printf( "Setting variable(\"%s%s\", %d)\n", Context, + print( "Setting variable(\"%s%s\", %d)\n", Context, VarName, value ); } @@ -1906,8 +1884,8 @@ void SetVariable(Scriptable* Sender, const char* VarName, const char* Context, i map->locals->SetAt( VarName, value, NoCreate); } else if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s %s in setvariable\n",Context, VarName); + printMessage("GameScript", "Invalid variable %s %s in setvariable\n", YELLOW, + Context, VarName); } } else { @@ -1927,7 +1905,7 @@ void SetVariable(Scriptable* Sender, const char* VarName, ieDword value) } if (InDebug&ID_VARIABLES) { - printf( "Setting variable(\"%s\", %d)\n", VarName, value ); + print( "Setting variable(\"%s\", %d)\n", VarName, value ); } strncpy( newVarName, VarName, 6 ); newVarName[6]=0; @@ -1950,8 +1928,8 @@ void SetVariable(Scriptable* Sender, const char* VarName, ieDword value) map->locals->SetAt( poi, value, NoCreate); } else if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s in setvariable\n",VarName); + printMessage("GameScript", "Invalid variable %s in setvariable\n", YELLOW, + VarName); } } else { @@ -1976,14 +1954,14 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid) if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { Sender->GetCurrentArea()->locals->Lookup( poi, value ); if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s: %d\n",VarName, value); + print("CheckVariable %s: %d\n",VarName, value); } return value; } if (strnicmp( newVarName, "LOCALS", 6 ) == 0) { Sender->locals->Lookup( poi, value ); if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s: %d\n",VarName, value); + print("CheckVariable %s: %d\n",VarName, value); } return value; } @@ -1991,7 +1969,7 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid) if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { game->kaputz->Lookup( poi, value ); if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s: %d\n",VarName, value); + print("CheckVariable %s: %d\n",VarName, value); } return value; } @@ -2004,15 +1982,15 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid) *valid=false; } if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s in checkvariable\n",VarName); + printMessage("GameScript", "Invalid variable %s in checkvariable\n", YELLOW, + VarName); } } } else { game->locals->Lookup( poi, value ); } if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s: %d\n",VarName, value); + print("CheckVariable %s: %d\n",VarName, value); } return value; } @@ -2027,14 +2005,14 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Conte if (strnicmp( newVarName, "MYAREA", 6 ) == 0) { Sender->GetCurrentArea()->locals->Lookup( VarName, value ); if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s%s: %d\n",Context, VarName, value); + 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) { - printf("CheckVariable %s%s: %d\n",Context, VarName, value); + print("CheckVariable %s%s: %d\n",Context, VarName, value); } return value; } @@ -2042,7 +2020,7 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Conte if (HasKaputz && !strnicmp(newVarName,"KAPUTZ",6) ) { game->kaputz->Lookup( VarName, value ); if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s%s: %d\n",Context, VarName, value); + print("CheckVariable %s%s: %d\n",Context, VarName, value); } return value; } @@ -2055,15 +2033,15 @@ ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Conte *valid=false; } if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s %s in checkvariable\n",Context, VarName); + printMessage("GameScript", "Invalid variable %s %s in checkvariable\n", YELLOW, + Context, VarName); } } } else { game->locals->Lookup( VarName, value ); } if (InDebug&ID_VARIABLES) { - printf("CheckVariable %s%s: %d\n",Context, VarName, value); + print("CheckVariable %s%s: %d\n",Context, VarName, value); } return value; } @@ -2172,8 +2150,7 @@ unsigned int GetSpellDistance(const ieResRef spellres, Scriptable *Sender) Spell* spl = gamedata->GetSpell( spellres ); if (!spl) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Spell couldn't be found:%.8s.\n", spellres); + printMessage("GameScript", "Spell couldn't be found:%.8s.\n", LIGHT_RED, spellres); return 0; } dist = spl->GetCastingDistance(Sender); @@ -2195,8 +2172,7 @@ unsigned int GetItemDistance(const ieResRef itemres, int header) Item* itm = gamedata->GetItem( itemres ); if (!itm) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Item couldn't be found:%.8s.\n", itemres); + printMessage("GameScript", "Item couldn't be found:%.8s.\n", LIGHT_RED, itemres); return 0; } dist=itm->GetCastingDistance(header); @@ -2224,7 +2200,7 @@ void SetupWishCore(Scriptable *Sender, int column, int picks) AutoTable tm("wish"); if (!tm) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find wish.2da.\n"); + print( "Cannot find wish.2da.\n"); return; } diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h index fe3a9bfd0..1bcffd738 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h +++ b/project/jni/application/gemrb/gemrb/core/GameScript/GSUtils.h @@ -80,7 +80,7 @@ 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); -void CreateItemCore(CREItem *item, const char *resref, int a, int b, int c); +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); diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp index 9c15f1b68..55ea267fc 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.cpp @@ -29,6 +29,7 @@ #include "GameData.h" #include "Interface.h" #include "PluginMgr.h" +#include "TableMgr.h" //debug flags // 1 - cache @@ -225,6 +226,7 @@ static const TriggerLink triggernames[] = { {"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}, @@ -506,7 +508,7 @@ static const ActionLink actionnames[] = { {"debug", GameScript::Debug, 0}, {"debugoutput", GameScript::Debug, 0}, {"deletejournalentry", GameScript::RemoveJournalEntry, 0}, - {"demoend", GameScript::QuitGame, 0}, //same for now + {"demoend", GameScript::DemoEnd, 0}, //same for now {"destroyalldestructableequipment", GameScript::DestroyAllDestructableEquipment, 0}, {"destroyallequipment", GameScript::DestroyAllEquipment, 0}, {"destroygold", GameScript::DestroyGold, 0}, @@ -1133,8 +1135,8 @@ static const IDSLink* FindIdentifier(const char* idsname) } } - printMessage( "GameScript"," ", YELLOW ); - printf( "Couldn't assign ids target: %.*s\n", len, idsname ); + printMessage("GameScript", "Couldn't assign ids target: %.*s\n", YELLOW, + len, idsname ); return NULL; } @@ -1271,9 +1273,9 @@ void printFunction(Holder table, int index) int len = strchr(str,'(')-str; if (len<0) { - printf("%d %s\n", value, str); + print("%d %s\n", value, str); } else { - printf("%d %.*s\n", value, len, str); + print("%d %.*s\n", value, len, str); } } @@ -1296,16 +1298,14 @@ void InitializeIEScript() int gaT = core->LoadSymbol( "gemact" ); AutoTable objNameTable("script"); if (tT < 0 || aT < 0 || oT < 0 || !objNameTable) { - printMessage( "GameScript","A critical scripting file is missing!\n",LIGHT_RED ); - abort(); + 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) { - printMessage( "GameScript","A critical scripting file is damaged!\n",LIGHT_RED ); - abort(); + error("GameScript", "A critical scripting file is damaged!\n"); } int i; @@ -1314,8 +1314,7 @@ void InitializeIEScript() ObjectIDSCount = atoi( objNameTable->QueryField() ); if (ObjectIDSCount<0 || ObjectIDSCount>MAX_OBJECT_FIELDS) { - printMessage("GameScript","The IDS Count shouldn't be more than 10!\n",LIGHT_RED); - abort(); + error("GameScript", "The IDS Count shouldn't be more than 10!\n"); } ObjectIDSTableNames = (ieResRef *) malloc( sizeof(ieResRef) * ObjectIDSCount ); @@ -1333,8 +1332,7 @@ void InitializeIEScript() } MaxObjectNesting = atoi( objNameTable->QueryField( 1 ) ); if (MaxObjectNesting<0 || MaxObjectNesting>MAX_NESTING) { - printMessage("GameScript","The Object Nesting Count shouldn't be more than 5!\n", LIGHT_RED); - abort(); + error("GameScript", "The Object Nesting Count shouldn't be more than 5!\n"); } HasAdditionalRect = ( atoi( objNameTable->QueryField( 2 ) ) != 0 ); ExtraParametersCount = atoi( objNameTable->QueryField( 3 ) ); @@ -1355,31 +1353,32 @@ void InitializeIEScript() while (j--) { i = triggersTable->GetValueIndex( j ); const TriggerLink* poi = FindTrigger(triggersTable->GetStringIndex( j )); - //maybe we should watch for this bit? - //bool triggerflag = i & 0x4000; + + bool was_condition = (i & 0x4000); i &= 0x3fff; if (i >= MAX_TRIGGERS) { - printMessage("GameScript"," ", RED); - printf("trigger %d (%s) is too high, ignoring\n", i, triggersTable->GetStringIndex( j ) ); + 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"," ", YELLOW); - printf("%s is in collision with ", triggersTable->GetStringIndex( j ) ); + printMessage("GameScript", "%s is in collision with ", YELLOW, + triggersTable->GetStringIndex( j ) ); printFunction(triggersTable,triggersTable->FindValue(triggersTable->GetValueIndex( j ))); - //printFunction(triggersTable->GetStringIndex(triggersTable->FindValue(triggersTable->GetValueIndex( j )) )); } else { if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ", WHITE); - printf("%s is a synonym of ", triggersTable->GetStringIndex( j ) ); + printMessage("GameScript", "%s is a synonym of ", WHITE, + triggersTable->GetStringIndex( j ) ); printFunction(triggersTable,triggersTable->FindValue(triggersTable->GetValueIndex( j ))); - //printFunction(triggersTable->GetStringIndex(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); @@ -1387,6 +1386,8 @@ void InitializeIEScript() } 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++) { @@ -1402,38 +1403,38 @@ void InitializeIEScript() for (i = 0; triggernames[i].Name; i++) { if (f == triggernames[i].Function) { if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ", WHITE); - printf("%s is a synonym of %s\n", triggersTable->GetStringIndex( j ), triggernames[i].Name ); + 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); -//->GetStringIndex(j) ); } j = actionsTable->GetSize(); while (j--) { i = actionsTable->GetValueIndex( j ); if (i >= MAX_ACTIONS) { - printMessage("GameScript"," ", RED); - printf("action %d (%s) is too high, ignoring\n", i, actionsTable->GetStringIndex( j ) ); + 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"," ", YELLOW); - printf("%s is in collision with ", actionsTable->GetStringIndex( j ) ); + 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"," ", WHITE); - printf("%s is a synonym of ", actionsTable->GetStringIndex( j ) ); + 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 )) ) ); } @@ -1459,8 +1460,8 @@ void InitializeIEScript() while (j--) { i = overrideActionsTable->GetValueIndex( j ); if (i >= MAX_ACTIONS) { - printMessage("GameScript"," ", RED); - printf("action %d (%s) is too high, ignoring\n", i, overrideActionsTable->GetStringIndex( j ) ); + printMessage("GameScript", "action %d (%s) is too high, ignoring\n", RED, + i, overrideActionsTable->GetStringIndex( j ) ); continue; } const ActionLink *poi = FindAction( overrideActionsTable->GetStringIndex( j )); @@ -1468,8 +1469,8 @@ void InitializeIEScript() continue; } if (actions[i]) { - printMessage("GameScript"," ", WHITE); - printf("%s overrides existing action ", overrideActionsTable->GetStringIndex( j ) ); + 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 )) ) ); } @@ -1491,8 +1492,8 @@ void InitializeIEScript() for (i = 0; actionnames[i].Name; i++) { if (f == actionnames[i].Function) { if (InDebug&ID_ACTIONS) { - printMessage("GameScript"," ", WHITE); - printf("%s is a synonym of %s\n", actionsTable->GetStringIndex( j ), actionnames[i].Name ); + printMessage("GameScript", "%s is a synonym of %s\n", WHITE, + actionsTable->GetStringIndex( j ), actionnames[i].Name ); break; } } @@ -1508,20 +1509,20 @@ void InitializeIEScript() while (j--) { i = objectsTable->GetValueIndex( j ); if (i >= MAX_OBJECTS) { - printMessage("GameScript"," ", RED); - printf("object %d (%s) is too high, ignoring\n", i, objectsTable->GetStringIndex( j ) ); + 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"," ", YELLOW); - printf("%s is in collision with ", objectsTable->GetStringIndex( j ) ); + 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"," ", WHITE); - printf("%s is a synonym of ", objectsTable->GetStringIndex( j ) ); + 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 )) ) ); } @@ -1547,8 +1548,8 @@ void InitializeIEScript() if (f) { for (i = 0; objectnames[i].Name; i++) { if (f == objectnames[i].Function) { - printMessage("GameScript"," ", WHITE); - printf("%s is a synonym of %s\n", objectsTable->GetStringIndex( j ), objectnames[i].Name ); + printMessage("GameScript", "%s is a synonym of %s\n", WHITE, + objectsTable->GetStringIndex( j ), objectnames[i].Name ); break; } } @@ -1561,29 +1562,54 @@ void InitializeIEScript() int instantTableIndex = core->LoadSymbol("instant"); if (instantTableIndex < 0) { - printMessage("GameScript", "Couldn't find instant symbols!\n", LIGHT_RED); - abort(); + error("GameScript", "Couldn't find instant symbols!\n"); } Holder instantTable = core->GetSymbol(instantTableIndex); if (!instantTable) { - printMessage("GameScript", "Couldn't load instant symbols!\n", LIGHT_RED); - abort(); + error("GameScript", "Couldn't load instant symbols!\n"); } j = instantTable->GetSize(); while (j--) { i = instantTable->GetValueIndex( j ); if (i >= MAX_ACTIONS) { - printMessage("GameScript"," ", RED); - printf("instant action %d (%s) is too high, ignoring\n", i, instantTable->GetStringIndex( j ) ); + printMessage("GameScript", "instant action %d (%s) is too high, ignoring\n", RED, + i, instantTable->GetStringIndex( j ) ); continue; } if (!actions[i]) { - printMessage("GameScript"," ", YELLOW); - printf("instant action %d (%s) doesn't exist, ignoring\n", i, instantTable->GetStringIndex( j ) ); + 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 *******************************/ @@ -1605,17 +1631,15 @@ GameScript::~GameScript(void) //set 3. parameter to true if you want instant free //and possible death if (InDebug&ID_REFERENCE) { - printf("One instance of %s is dropped from %d.\n", Name, BcsCache.RefCount(Name) ); + print("One instance of %s is dropped from %d.\n", Name, BcsCache.RefCount(Name) ); } int res = BcsCache.DecRef(script, Name, true); if (res<0) { - printMessage( "GameScript", "Corrupted Script cache encountered (reference count went below zero), ", LIGHT_RED ); - printf( "Script name is: %.8s\n", Name); - abort(); + error("GameScript", "Corrupted Script cache encountered (reference count went below zero), Script name is: %.8s\n", Name); } if (!res) { - //printf("Freeing script %s because its refcount has reached 0.\n", Name); + //print("Freeing script %s because its refcount has reached 0.\n", Name); script->Release(); } script = NULL; @@ -1631,7 +1655,7 @@ Script* GameScript::CacheScript(ieResRef ResRef, bool AIScript) Script *newScript = (Script *) BcsCache.GetResource(ResRef); if ( newScript ) { if (InDebug&ID_REFERENCE) { - printf("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); + print("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); } return newScript; } @@ -1649,7 +1673,7 @@ Script* GameScript::CacheScript(ieResRef ResRef, bool AIScript) newScript = new Script( ); BcsCache.SetAt( ResRef, (void *) newScript ); if (InDebug&ID_REFERENCE) { - printf("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); + print("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); } while (true) { @@ -1725,8 +1749,7 @@ static Object* DecodeObject(const char* line) oB->objectFields[i + ObjectFieldsCount] = ParseInt( line ); } if (*line != 'O' || *(line + 1) != 'B') { - printMessage( "GameScript","Got confused parsing object line: ", YELLOW ); - printf("%s\n", origline); + 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()) { @@ -1807,7 +1830,7 @@ bool GameScript::Update(bool *continuing, bool *done) //lastRunTime = thisTime; if(!(MySelf->GetInternalFlag()&IF_ACTIVE) ) { - return true; + return false; } bool continueExecution = false; @@ -1825,7 +1848,7 @@ bool GameScript::Update(bool *continuing, bool *done) if (MySelf->GetInternalFlag()&IF_NOINT) { // we presumably don't want any further execution? if (done) *done = true; - return true; + return false; } if (lastAction==a) { @@ -1834,7 +1857,7 @@ bool GameScript::Update(bool *continuing, bool *done) // interactions with Continue() (lastAction here is always // the first block encountered), needs more testing //if (done) *done = true; - return true; + return false; } //movetoobjectfollow would break if this isn't called @@ -1852,11 +1875,11 @@ bool GameScript::Update(bool *continuing, bool *done) if (continuing) *continuing = continueExecution; if (!continueExecution) { if (done) *done = true; - break; + return true; } } } - return true; + return continueExecution; } //IE simply takes the first action's object for cutscene object @@ -1901,7 +1924,7 @@ void GameScript::EvaluateAllBlocks() rS->responses[0]->Execute(target); // TODO: this will break blocking instants, if there are any target->ReleaseCurrentAction(); - } else if (InDebug&ID_CUTSCENE) { + } 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(); @@ -1957,14 +1980,14 @@ Response* GameScript::ReadResponse(DataStream* stream) } Response* rE = new Response(); rE->weight = 0; - int count = stream->ReadLine( line, 1024 ); + 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); - count = stream->ReadLine( line, 1024 ); + stream->ReadLine( line, 1024 ); aC->actionID = (unsigned short)strtoul(line, NULL,10); for (int i = 0; i < 3; i++) { stream->ReadLine( line, 1024 ); @@ -2078,13 +2101,13 @@ int Trigger::Evaluate(Scriptable* Sender) if (!func) { triggers[triggerID] = GameScript::False; printMessage("GameScript"," ",YELLOW); - printf("Unhandled trigger code: 0x%04x %s\n", + print("Unhandled trigger code: 0x%04x %s\n", triggerID, tmpstr ); return 0; } if (InDebug&ID_TRIGGERS) { printMessage("GameScript"," ",YELLOW); - printf( "Executing trigger code: 0x%04x %s\n", + print( "Executing trigger code: 0x%04x %s\n", triggerID, tmpstr ); } int ret = func( Sender, this ); @@ -2156,7 +2179,7 @@ int Response::Execute(Scriptable* Sender) void PrintAction(int actionID) { - printf("Action: %d %s\n", actionID , actionsTable->GetValue(actionID) ); + print("Action: %d %s\n", actionID , actionsTable->GetValue(actionID) ); } void GameScript::ExecuteAction(Scriptable* Sender, Action* aC) @@ -2171,8 +2194,8 @@ void GameScript::ExecuteAction(Scriptable* Sender, Action* aC) if (scr) { if (InDebug&ID_ACTIONS) { - printMessage("GameScript"," ",YELLOW); - printf("Sender: %s-->override: %s\n",Sender->GetScriptName(), scr->GetScriptName() ); + printMessage("GameScript", "Sender: %s-->override: %s\n", YELLOW, + Sender->GetScriptName(), scr->GetScriptName() ); } scr->ReleaseCurrentAction(); scr->AddAction(ParamCopyNoOverride(aC)); @@ -2196,7 +2219,7 @@ void GameScript::ExecuteAction(Scriptable* Sender, Action* aC) if (InDebug&ID_ACTIONS) { printMessage("GameScript"," ",YELLOW); PrintAction(actionID); - printf("Sender: %s\n",Sender->GetScriptName() ); + print("Sender: %s\n",Sender->GetScriptName() ); } ActionFunction func = actions[actionID]; if (func) { @@ -2227,7 +2250,7 @@ void GameScript::ExecuteAction(Scriptable* Sender, Action* aC) if (actionflags[actionID] & AF_IMMEDIATE) { //this action never entered the action queue, therefore shouldn't be freed if (aC->GetRef()!=1) { - printf("Immediate action got queued!\n"); + print("Immediate action got queued!\n"); PrintAction(actionID); abort(); } @@ -2246,8 +2269,7 @@ Trigger* GenerateTrigger(char* String) { strlwr( String ); if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ",YELLOW); - printf("Compiling:%s\n",String); + printMessage("GameScript", "Compiling:%s\n", YELLOW, String); } int negate = 0; if (*String == '!') { @@ -2257,16 +2279,14 @@ Trigger* GenerateTrigger(char* String) int len = strlench(String,'(')+1; //including ( int i = triggersTable->FindString(String, len); if (i<0) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Invalid scripting trigger: %s\n", String); + 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"," ",LIGHT_RED); - printf("Malformed scripting trigger: %s\n", String); + printMessage("GameScript", "Malformed scripting trigger: %s\n", LIGHT_RED, String); return NULL; } return trigger; @@ -2276,8 +2296,7 @@ Action* GenerateAction(char* String) { strlwr( String ); if (InDebug&ID_ACTIONS) { - printMessage("GameScript"," ",YELLOW); - printf("Compiling:%s\n",String); + printMessage("GameScript", "Compiling:%s\n", YELLOW, String); } int len = strlench(String,'(')+1; //including ( char *src = String+len; @@ -2294,8 +2313,7 @@ Action* GenerateAction(char* String) if (i<0) { i = actionsTable->FindString(String, len); if (i < 0) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Invalid scripting action: %s\n", String); + printMessage("GameScript", "Invalid scripting action: %s\n", LIGHT_RED, String); return NULL; } str = actionsTable->GetStringIndex( i )+len; @@ -2303,8 +2321,7 @@ Action* GenerateAction(char* String) } Action *action = GenerateActionCore( src, str, actionID); if (!action) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Malformed scripting action: %s\n", String); + printMessage("GameScript", "Malformed scripting action: %s\n", LIGHT_RED, String); return NULL; } return action; diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.h b/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.h index 874aa00e5..a98282b4b 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.h +++ b/project/jni/application/gemrb/gemrb/core/GameScript/GameScript.h @@ -106,7 +106,7 @@ class GameScript; #define GSASSERT(f,c) \ if(!(f)) \ { \ - printf("Assertion failed: %s [0x%08lX] Line %d",#f, c, __LINE__); \ + print("Assertion failed: %s [0x%08lX] Line %d",#f, c, __LINE__); \ abort(); \ } @@ -146,7 +146,7 @@ class GEM_EXPORT Object { public: Object() { - objectName[0] = 0; + memset( objectName, 0, 65 ); memset( objectFields, 0, MAX_OBJECT_FIELDS * sizeof( int ) ); memset( objectFilters, 0, MAX_NESTING * sizeof( int ) ); @@ -171,19 +171,19 @@ public: GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); if(objectName[0]) { - printf("Object: %s\n",objectName); + print("Object: %s\n",objectName); return; } - printf("IDS Targeting: "); + print("IDS Targeting: "); for(i=0;iDump(); } else { - printf("No object\n"); + print("No object\n"); } - printf("\n"); + print("\n"); } void Release() @@ -290,8 +292,8 @@ public: objects[0] = NULL; objects[1] = NULL; objects[2] = NULL; - string0Parameter[0] = 0; - string1Parameter[0] = 0; + memset(string0Parameter, 0, 65); + memset(string1Parameter, 0, 65); int0Parameter = 0; pointParameter.null(); int1Parameter = 0; @@ -334,25 +336,25 @@ public: int i; GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); - printf("Int0: %d, Int1: %d, Int2: %d\n",int0Parameter, int1Parameter, int2Parameter); - printf("String0: %s, String1: %s\n", string0Parameter?string0Parameter:"", string1Parameter?string1Parameter:""); + 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]) { - printf( "%d. ",i+1); + print( "%d. ",i+1); objects[i]->Dump(); } else { - printf( "%d. Object - NULL\n",i+1); + print( "%d. Object - NULL\n",i+1); } } - printf("RefCount: %d\n", RefCount); + print("RefCount: %d\n", RefCount); } void Release() { GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); if (!RefCount) { - printf( "WARNING!!! Double Freeing in %s: Line %d\n", __FILE__, + print( "WARNING!!! Double Freeing in %s: Line %d\n", __FILE__, __LINE__ ); abort(); } @@ -367,7 +369,7 @@ public: GSASSERT( canary == (unsigned long) 0xdeadbeef, canary ); RefCount++; if (RefCount >= 65536) { - printf( "Refcount increased to: %d in action %d\n", RefCount, + print( "Refcount increased to: %d in action %d\n", RefCount, actionID ); abort(); } @@ -386,7 +388,7 @@ public: for (size_t c = 0; c < actions.size(); c++) { if (actions[c]) { if (actions[c]->GetRef()>2) { - printf("Residue action %d with refcount %d\n", actions[c]->actionID, actions[c]->GetRef()); + print("Residue action %d with refcount %d\n", actions[c]->actionID, actions[c]->GetRef()); } actions[c]->Release(); actions[c] = NULL; @@ -503,6 +505,7 @@ 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 { @@ -786,6 +789,7 @@ public: //Script Functions 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); @@ -1037,6 +1041,7 @@ public: 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); diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp index be43aff7d..78ddc6a91 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.cpp @@ -24,13 +24,14 @@ #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 */ -inline static Targets* ReturnScriptableAsTarget(Scriptable *sc) +static inline Targets* ReturnScriptableAsTarget(Scriptable *sc) { if (!sc) return NULL; Targets *tgts = new Targets(); @@ -39,7 +40,7 @@ inline static Targets* ReturnScriptableAsTarget(Scriptable *sc) } /* do IDS filtering: [PC], [ENEMY], etc */ -inline static bool DoObjectIDSCheck(Object *oC, Actor *ac, bool *filtered) { +static inline bool DoObjectIDSCheck(Object *oC, Actor *ac, bool *filtered) { for (int j = 0; j < ObjectIDSCount; j++) { if (!oC->objectFields[j]) { continue; @@ -47,8 +48,7 @@ inline static bool DoObjectIDSCheck(Object *oC, Actor *ac, bool *filtered) { *filtered = true; IDSFunction func = idtargets[j]; if (!func) { - printMessage("GameScript"," ", YELLOW); - printf("Unimplemented IDS targeting opcode: %d\n", j); + printMessage("GameScript", "Unimplemented IDS targeting opcode: %d\n", YELLOW, j); continue; } if (!func( ac, oC->objectFields[j] ) ) { @@ -59,15 +59,15 @@ inline static bool DoObjectIDSCheck(Object *oC, Actor *ac, bool *filtered) { } /* do object filtering: Myself, LastAttackerOf(Player1), etc */ -inline static Targets *DoObjectFiltering(Scriptable *Sender, Targets *tgts, Object *oC, int ga_flags) { +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"," ", YELLOW); - printf("Unknown object filter: %d %s\n", filterid, objectsTable->GetValue(filterid)); + printMessage("GameScript", "Unknown object filter: %d %s\n", YELLOW, + filterid, objectsTable->GetValue(filterid)); continue; } @@ -82,7 +82,7 @@ inline static Targets *DoObjectFiltering(Scriptable *Sender, Targets *tgts, Obje static EffectRef fx_protection_creature_ref = { "Protection:Creature", -1 }; -inline static bool DoObjectChecks(Map *map, Scriptable *Sender, Actor *target, int &dist, bool ignoreinvis=false) +static inline bool DoObjectChecks(Map *map, Scriptable *Sender, Actor *target, int &dist, bool ignoreinvis=false) { dist = SquaredMapDistance(Sender, target); diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h index a01fa2253..f069d6bb9 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h +++ b/project/jni/application/gemrb/gemrb/core/GameScript/Matching.h @@ -24,6 +24,8 @@ #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); diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp index 2cc9b3b31..05beeba7f 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/Objects.cpp @@ -137,8 +137,8 @@ Targets *GameScript::Gabber(Scriptable* /*Sender*/, Targets *parameters, int ga_ Targets *GameScript::LastTrigger(Scriptable *Sender, Targets *parameters, int ga_flags) { parameters->Clear(); - if (Sender->LastTriggerObject) { - Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTriggerObject); + if (Sender->LastTrigger) { + Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); parameters->AddTarget(target, 0, ga_flags); } return parameters; @@ -252,7 +252,7 @@ Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters, int ga } } parameters->Clear(); - if (actor) { + /*if (actor) { ieWord tmp = actor->LastProtected; Map *cm = Sender->GetCurrentArea(); int i = cm->GetActorCount(true); @@ -262,6 +262,12 @@ Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters, int ga 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; } @@ -276,7 +282,7 @@ Targets *GameScript::ProtectedBy(Scriptable *Sender, Targets *parameters, int ga } parameters->Clear(); if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtected); + Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtectee); if (target) { parameters->AddTarget(target, 0, ga_flags); } @@ -325,7 +331,7 @@ Targets *GameScript::LastAttackerOf(Scriptable *Sender, Targets *parameters, int } parameters->Clear(); if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHitter); + Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastAttacker); if (target) { parameters->AddTarget(target, 0, ga_flags); } @@ -379,7 +385,7 @@ Targets *GameScript::LastTalkedToBy(Scriptable *Sender, Targets *parameters, int } parameters->Clear(); if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTalkedTo); + Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTalker); if (target) { parameters->AddTarget(target, 0, ga_flags); } diff --git a/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp b/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp index da8f35ee6..4f8f79e1e 100644 --- a/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp +++ b/project/jni/application/gemrb/gemrb/core/GameScript/Triggers.cpp @@ -29,6 +29,7 @@ #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 @@ -811,20 +812,12 @@ int GameScript::GlobalTimerStarted(Scriptable* Sender, Trigger* parameters) int GameScript::WasInDialog(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->GetInternalFlag()&IF_WASINDIALOG) { - Sender->SetBitTrigger(BT_WASINDIALOG); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_wasindialog); } int GameScript::OnCreation(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->GetInternalFlag()&IF_ONCREATION) { - Sender->SetBitTrigger(BT_ONCREATION); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_oncreation); } int GameScript::NumItemsParty(Scriptable* /*Sender*/, Trigger* parameters) @@ -1549,16 +1542,12 @@ int GameScript::Or(Scriptable* /*Sender*/, Trigger* parameters) int GameScript::TriggerTrigger(Scriptable* Sender, Trigger* parameters) { - if(Sender->TriggerID==(ieDword) parameters->int0Parameter) { - Sender->AddTrigger (&Sender->TriggerID); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_trigger, parameters->int0Parameter); } int GameScript::WalkedToTrigger(Scriptable* Sender, Trigger* parameters) { - Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); + /*Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); if (!target) { return 0; } @@ -1575,293 +1564,72 @@ int GameScript::WalkedToTrigger(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger (&Sender->LastTrigger); return 1; } - return 0; + return 0;*/ + return Sender->MatchTriggerWithObject(trigger_walkedtotrigger, parameters->objectParameter); } int GameScript::Clicked(Scriptable* Sender, Trigger* parameters) { - //now objects suicide themselves if they are empty objects - //so checking an empty object is easier - if (parameters->objectParameter == NULL) { - if (Sender->LastTrigger) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastTrigger, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_clicked, parameters->objectParameter); } int GameScript::Disarmed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_DOOR: case ST_CONTAINER: case ST_PROXIMITY: - break; - default: - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastDisarmed) { - Sender->AddTrigger (&Sender->LastDisarmed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastDisarmed, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastDisarmed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_disarmed, parameters->objectParameter); } //stealing from a store failed, owner triggered int GameScript::StealFailed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_ACTOR: - break; - default: - return 0; - } - // maybe check if Sender is a shopkeeper??? - - if (parameters->objectParameter == NULL) { - if (Sender->LastDisarmFailed) { - Sender->AddTrigger (&Sender->LastDisarmFailed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastDisarmFailed, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastDisarmFailed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_disarmfailed, parameters->objectParameter); } int GameScript::PickpocketFailed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_ACTOR: - break; - default: - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastOpenFailed) { - Sender->AddTrigger (&Sender->LastOpenFailed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastOpenFailed, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastOpenFailed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_pickpocketfailed, parameters->objectParameter); } int GameScript::PickLockFailed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_DOOR: case ST_CONTAINER: - break; - default: - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastPickLockFailed) { - Sender->AddTrigger (&Sender->LastPickLockFailed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastPickLockFailed, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastPickLockFailed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_picklockfailed, parameters->objectParameter); } int GameScript::OpenFailed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_DOOR: case ST_CONTAINER: - break; - default: - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastOpenFailed) { - Sender->AddTrigger (&Sender->LastOpenFailed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastOpenFailed, parameters->objectParameter -)) { - Sender->AddTrigger (&Sender->LastOpenFailed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_failedtoopen, parameters->objectParameter); } int GameScript::DisarmFailed(Scriptable* Sender, Trigger* parameters) { - switch(Sender->Type) { - case ST_DOOR: case ST_CONTAINER: case ST_PROXIMITY: - break; - default: - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastDisarmFailed) { - Sender->AddTrigger (&Sender->LastDisarmFailed); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastDisarmFailed, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastDisarmFailed); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_disarmfailed, parameters->objectParameter); } //opened for doors/containers (using lastEntered) int GameScript::Opened(Scriptable* Sender, Trigger* parameters) { - Door *door; - - switch (Sender->Type) { - case ST_DOOR: - door = (Door *) Sender; - if (!door->IsOpen()) { - return 0; - } - break; - case ST_CONTAINER: - break; - default: - return 0; - } - - if (parameters->objectParameter == NULL) { - if (Sender->LastEntered) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastEntered, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_opened, parameters->objectParameter); } //closed for doors (using lastTrigger) int GameScript::Closed(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type != ST_DOOR) { - return 0; - } - Door *door = (Door *) Sender; - if (door->IsOpen()) { - return 0; - } - - if (parameters->objectParameter == NULL) { - if (Sender->LastTrigger) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastTrigger, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_closed, parameters->objectParameter); } //unlocked for doors/containers (using lastUnlocked) int GameScript::Unlocked(Scriptable* Sender, Trigger* parameters) { - Door *door; - - switch (Sender->Type) { - case ST_DOOR: - door = (Door *) Sender; - if ((door->Flags&DOOR_LOCKED) ) { - return 0; - } - break; - case ST_CONTAINER: - break; - default: - return 0; - } - - if (parameters->objectParameter == NULL) { - if (Sender->LastUnlocked) { - Sender->AddTrigger (&Sender->LastUnlocked); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastUnlocked, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastUnlocked); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_unlocked, parameters->objectParameter); } int GameScript::Entered(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type != ST_PROXIMITY) { - return 0; - } - InfoPoint *ip = (InfoPoint *) Sender; - if (!ip->Trapped) { - return 0; - } - - if (parameters->objectParameter == NULL) { - if (Sender->LastEntered) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastEntered, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_entered, parameters->objectParameter); } int GameScript::HarmlessEntered(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type != ST_PROXIMITY) { - return 0; - } - if (parameters->objectParameter == NULL) { - if (Sender->LastEntered) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; - } - if (MatchActor(Sender, Sender->LastEntered, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastEntered); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_harmlessentered, parameters->objectParameter); } int GameScript::IsOverMe(Scriptable* Sender, Trigger* parameters) @@ -1944,68 +1712,32 @@ int GameScript::CreatureHidden(Scriptable* Sender, Trigger* /*parameters*/) } int GameScript::BecameVisible(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *act=(Actor *) Sender; - if (act->GetInternalFlag()&IF_BECAMEVISIBLE) { - //set trigger to erase - act->SetBitTrigger(BT_BECAMEVISIBLE); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_becamevisible); } int GameScript::Die(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor *act=(Actor *) Sender; - if (act->GetInternalFlag()&IF_JUSTDIED) { - //set trigger to erase - act->SetBitTrigger(BT_DIE); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_die); } int GameScript::Died(Scriptable* Sender, Trigger* parameters) { - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type!=ST_ACTOR) { - return 0; - } - Actor *act=(Actor *) tar; - if (act->GetInternalFlag()&IF_JUSTDIED) { - //set trigger to erase - act->SetBitTrigger(BT_DIE); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_died, parameters->objectParameter); } -int GameScript::PartyMemberDied(Scriptable* /*Sender*/, Trigger* /*parameters*/) +int GameScript::PartyMemberDied(Scriptable* Sender, Trigger* parameters) { - Game *game = core->GetGame(); - int i = game->PartyMemberDied(); - if (i==-1) { - return 0; - } - //set trigger to erase - game->GetPC(i,false)->SetBitTrigger(BT_DIE); - return 1; + return Sender->MatchTriggerWithObject(trigger_partymemberdied, parameters->objectParameter); } -int GameScript::NamelessBitTheDust(Scriptable* /*Sender*/, Trigger* /*parameters*/) +int GameScript::NamelessBitTheDust(Scriptable* Sender, Trigger* /*parameters*/) { - Actor* actor = core->GetGame()->GetPC(0, false); - if (actor->GetInternalFlag()&IF_JUSTDIED) { - //set trigger to clear - actor->SetBitTrigger(BT_DIE); - return 1; - } - return 0; + 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) @@ -2450,6 +2182,7 @@ int GameScript::See(Scriptable* Sender, Trigger* parameters) 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); } @@ -2697,9 +2430,9 @@ int GameScript::OpenState(Scriptable* Sender, Trigger* parameters) Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); if (!tar) { if (InDebug&ID_TRIGGERS) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Couldn't find door/container:%s\n", parameters->objectParameter? parameters->objectParameter->objectName:""); - printf("Sender: %s\n", Sender->GetScriptName() ); + printMessage("GameScript", "Couldn't find door/container:%s\n", LIGHT_RED, + parameters->objectParameter? parameters->objectParameter->objectName:""); + print("Sender: %s\n", Sender->GetScriptName() ); } return 0; } @@ -2716,8 +2449,8 @@ int GameScript::OpenState(Scriptable* Sender, Trigger* parameters) } default:; //to remove a warning } - printMessage("GameScript"," ",LIGHT_RED); - printf("Not a door/container:%s\n", tar->GetScriptName()); + printMessage("GameScript", "Not a door/container:%s\n", LIGHT_RED, + tar->GetScriptName()); return 0; } @@ -2725,9 +2458,9 @@ int GameScript::IsLocked(Scriptable * Sender, Trigger *parameters) { Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); if (!tar) { - printMessage("GameScript"," ",LIGHT_RED); - printf("Couldn't find door/container:%s\n", parameters->objectParameter? parameters->objectParameter->objectName:""); - printf("Sender: %s\n", Sender->GetScriptName() ); + 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) { @@ -2743,8 +2476,8 @@ int GameScript::IsLocked(Scriptable * Sender, Trigger *parameters) } default:; //to remove a warning } - printMessage("GameScript"," ",LIGHT_RED); - printf("Not a door/container:%s\n", tar->GetScriptName()); + printMessage("GameScript", "Not a door/container:%s\n", LIGHT_RED, + tar->GetScriptName()); return 0; } @@ -3397,18 +3130,7 @@ int GameScript::TimeLT(Scriptable* /*Sender*/, Trigger* parameters) int GameScript::HotKey(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type != ST_ACTOR) { - return 0; - } - Actor *scr = (Actor *) Sender; - // FIXME: this is never going to work on 64 bit archs ... - int ret = (unsigned long) scr->HotKey == (unsigned long) parameters->int0Parameter; - //probably we need to implement a trigger mechanism, clear - //the hotkey only when the triggerblock was evaluated as true - if (ret) { - Sender->AddTrigger (&scr->HotKey); - } - return ret; + return Sender->MatchTrigger(trigger_hotkey, parameters->int0Parameter); } int GameScript::CombatCounter(Scriptable* /*Sender*/, Trigger* parameters) @@ -3428,20 +3150,7 @@ int GameScript::CombatCounterLT(Scriptable* /*Sender*/, Trigger* parameters) int GameScript::TrapTriggered(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type != ST_TRIGGER) { - return 0; - } -/* matchactor would do this, hmm - Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); - if (!tar || tar->Type != ST_ACTOR) { - return 0; - } -*/ - if (MatchActor(Sender, Sender->LastTrigger, parameters->objectParameter)) { - Sender->AddTrigger (&Sender->LastTrigger); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_traptriggered, parameters->objectParameter); } int GameScript::InteractingWith(Scriptable* Sender, Trigger* parameters) @@ -3473,7 +3182,7 @@ int GameScript::LastPersonTalkedTo(Scriptable* Sender, Trigger* parameters) return 0; } Actor *scr = (Actor *) Sender; - if (MatchActor(Sender, scr->LastTalkedTo, parameters->objectParameter)) { + if (MatchActor(Sender, scr->LastTalker, parameters->objectParameter)) { return 1; } return 0; @@ -3525,7 +3234,8 @@ int GameScript::IsFacingObject(Scriptable* Sender, Trigger* parameters) int GameScript::AttackedBy(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type!=ST_ACTOR) { + return Sender->MatchTriggerWithObject(trigger_attackedby, parameters->objectParameter, parameters->int0Parameter); + /*if (Sender->Type!=ST_ACTOR) { return 0; } Actor *scr = (Actor *) Sender; @@ -3550,12 +3260,13 @@ int GameScript::AttackedBy(Scriptable* Sender, Trigger* parameters) } } delete tgts; - return ret; + return ret;*/ } int GameScript::TookDamage(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->Type!=ST_ACTOR) { + return Sender->MatchTrigger(trigger_tookdamage); + /*if (Sender->Type!=ST_ACTOR) { return 0; } Actor* actor = ( Actor* ) Sender; @@ -3564,43 +3275,17 @@ int GameScript::TookDamage(Scriptable* Sender, Trigger* /*parameters*/) Sender->AddTrigger(&actor->LastHitter); return 1; } - return 0; + return 0;*/ } int GameScript::HitBy(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (parameters->int0Parameter) { - if (!(parameters->int0Parameter&actor->LastDamageType) ) { - return 0; - } - } - if (MatchActor(Sender, actor->LastHitter, parameters->objectParameter)) { - Sender->AddTrigger(&actor->LastHitter); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_attackedby, parameters->objectParameter, parameters->int0Parameter); } int GameScript::Heard(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (parameters->int0Parameter) { - if (parameters->int0Parameter!=actor->LastShout) { - return 0; - } - } - if (MatchActor(Sender, actor->LastHeard, parameters->objectParameter)) { - Sender->AddTrigger(&actor->LastHeard); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_heard, parameters->objectParameter, parameters->int0Parameter); } int GameScript::LastMarkedObject_Trigger(Scriptable* Sender, Trigger* parameters) @@ -3645,7 +3330,8 @@ int GameScript::HelpEX(Scriptable* Sender, Trigger* parameters) return 0; } if (actor->GetStat(stat)==help->GetStat(stat) ) { - Sender->AddTrigger(&actor->LastHelp); + // FIXME + //Sender->AddTrigger(&actor->LastHelp); return 1; } return 0; @@ -3653,30 +3339,18 @@ int GameScript::HelpEX(Scriptable* Sender, Trigger* parameters) int GameScript::Help_Trigger(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (MatchActor(Sender, actor->LastHelp, parameters->objectParameter)) { - Sender->AddTrigger(&actor->LastHelp); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_help, parameters->objectParameter); } int GameScript::ReceivedOrder(Scriptable* Sender, Trigger* parameters) { - if (MatchActor(Sender, Sender->LastOrderer, parameters->objectParameter) && - parameters->int0Parameter==Sender->LastOrder) { - Sender->AddTrigger(&Sender->LastOrderer); - return 1; - } - return 0; + return Sender->MatchTriggerWithObject(trigger_receivedorder, parameters->objectParameter, parameters->int0Parameter); } int GameScript::Joins(Scriptable* Sender, Trigger* parameters) { - if(Sender->Type!=ST_ACTOR) { + return Sender->MatchTriggerWithObject(trigger_joins, parameters->objectParameter); + /*if(Sender->Type!=ST_ACTOR) { return 0; } Actor * actor = ( Actor* ) Sender; @@ -3688,12 +3362,13 @@ int GameScript::Joins(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&actor->PCStats->LastJoined); return 1; } - return 0; + return 0;*/ } int GameScript::Leaves(Scriptable* Sender, Trigger* parameters) { - if(Sender->Type!=ST_ACTOR) { + return Sender->MatchTriggerWithObject(trigger_leaves, parameters->objectParameter); + /*if(Sender->Type!=ST_ACTOR) { return 0; } Actor * actor = ( Actor* ) Sender; @@ -3705,7 +3380,7 @@ int GameScript::Leaves(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&actor->PCStats->LastLeft); return 1; } - return 0; + return 0;*/ } int GameScript::FallenPaladin(Scriptable* Sender, Trigger* /*parameters*/) @@ -4115,13 +3790,8 @@ int GameScript::Delay( Scriptable* Sender, Trigger* parameters) if (delay<=1) { return 1; } - ieDword time1=Sender->lastDelay/1000/delay; - ieDword time2=Sender->lastRunTime/1000/delay; - if (time1!=time2) { - return 1; - } - return 0; + return (Sender->ScriptTicks % delay) <= Sender->IdleTicks; } int GameScript::TimeOfDay(Scriptable* /*Sender*/, Trigger* parameters) @@ -4164,11 +3834,7 @@ int GameScript::RandomStatCheck(Scriptable* Sender, Trigger* parameters) int GameScript::PartyRested(Scriptable* Sender, Trigger* /*parameters*/) { - if (Sender->GetInternalFlag()&IF_PARTYRESTED) { - Sender->SetBitTrigger(BT_PARTYRESTED); - return 1; - } - return 0; + return Sender->MatchTrigger(trigger_partyrested); } int GameScript::IsWeaponRanged(Scriptable* Sender, Trigger* parameters) @@ -4344,7 +4010,8 @@ int GameScript::SystemVariable_Trigger(Scriptable* Sender, Trigger* parameters) int GameScript::SpellCast(Scriptable* Sender, Trigger* parameters) { - if(parameters->int0Parameter) { + 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; @@ -4354,12 +4021,13 @@ int GameScript::SpellCast(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&Sender->LastCasterSeen); return 1; } - return 0; + return 0;*/ } int GameScript::SpellCastPriest(Scriptable* Sender, Trigger* parameters) { - if(parameters->int0Parameter) { + 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; @@ -4369,12 +4037,13 @@ int GameScript::SpellCastPriest(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&Sender->LastCasterSeen); return 1; } - return 0; + return 0;*/ } int GameScript::SpellCastInnate(Scriptable* Sender, Trigger* parameters) { - if(parameters->int0Parameter) { + 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; @@ -4384,12 +4053,13 @@ int GameScript::SpellCastInnate(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&Sender->LastCasterSeen); return 1; } - return 0; + return 0;*/ } int GameScript::SpellCastOnMe(Scriptable* Sender, Trigger* parameters) { - if(parameters->int0Parameter) { + return Sender->MatchTriggerWithObject(trigger_spellcastonme, parameters->objectParameter, parameters->int0Parameter); + /*if(parameters->int0Parameter) { if ((ieDword) parameters->int0Parameter!=Sender->LastSpellOnMe) { return 0; } @@ -4398,7 +4068,7 @@ int GameScript::SpellCastOnMe(Scriptable* Sender, Trigger* parameters) Sender->AddTrigger(&Sender->LastCasterOnMe); return 1; } - return 0; + return 0;*/ } int GameScript::CalendarDay(Scriptable* /*Sender*/, Trigger* parameters) @@ -4429,15 +4099,7 @@ int GameScript::CalendarDayLT(Scriptable* /*Sender*/, Trigger* parameters) } //NT Returns true only if the active CRE was turned by the specified priest or paladin. -int GameScript::TurnedBy(Scriptable* Sender, Trigger* /*parameters*/) +int GameScript::TurnedBy(Scriptable* Sender, Trigger* parameters) { - if (Sender->Type!=ST_ACTOR) { - return 0; - } - Actor* actor = ( Actor* ) Sender; - if (MatchActor(Sender, actor->LastTurner, NULL)) { - Sender->AddTrigger(&actor->LastTurner); - return 1; - } - return 0; + 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 index 64d2c74b7..1319d68b3 100644 --- a/project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp +++ b/project/jni/application/gemrb/gemrb/core/GlobalTimer.cpp @@ -59,7 +59,7 @@ void GlobalTimer::Freeze() unsigned long thisTime; unsigned long advance; - GetTime( thisTime ); + thisTime = GetTickCount(); advance = thisTime - startTime; if ( advance < interval) { return; @@ -155,7 +155,7 @@ bool GlobalTimer::Update() UpdateAnimations(); - GetTime( thisTime ); + thisTime = GetTickCount(); if (!startTime) { startTime = thisTime; @@ -265,7 +265,7 @@ void GlobalTimer::AddAnimation(ControlAnimation* ctlanim, unsigned long time) AnimationRef* anim; unsigned long thisTime; - GetTime( thisTime ); + thisTime = GetTickCount(); time += thisTime; // if there are no free animation reference objects, @@ -309,7 +309,7 @@ void GlobalTimer::RemoveAnimation(ControlAnimation* ctlanim) void GlobalTimer::UpdateAnimations() { unsigned long thisTime; - GetTime( thisTime ); + thisTime = GetTickCount(); while (animations.begin() + first_animation != animations.end()) { AnimationRef* anim = animations[first_animation]; if (anim->ctlanim == NULL) { diff --git a/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp b/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp index c38c4866f..3275d3e13 100644 --- a/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp +++ b/project/jni/application/gemrb/gemrb/core/ImageMgr.cpp @@ -42,8 +42,8 @@ Bitmap* ImageMgr::GetBitmap() unsigned int width = GetWidth(); Bitmap *data = new Bitmap(width, height); - printMessage("ImageMgr", "Don't know how to handle 24bit bitmap from ", WHITE); - printf( "%s...", str->filename ); + printMessage("ImageMgr", "Don't know how to handle 24bit bitmap from %s...", WHITE, + str->filename ); printStatus( "ERROR", LIGHT_RED ); Sprite2D *spr = GetSprite2D(); @@ -80,8 +80,8 @@ Image* ImageMgr::GetImage() void ImageMgr::GetPalette(int /*colors*/, Color* /*pal*/) { - printMessage("ImageMgr", "Can't get non-existant palette from ", WHITE); - printf("%s... ", str->filename); + printMessage("ImageMgr", "Can't get non-existant palette from %s... ", WHITE, + str->filename); printStatus("ERROR", LIGHT_RED); } diff --git a/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp b/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp new file mode 100644 index 000000000..e39eb6891 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/IndexedArchive.cpp @@ -0,0 +1,29 @@ +/* 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 new file mode 100644 index 000000000..3938ceee9 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/IndexedArchive.h @@ -0,0 +1,36 @@ +/* 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 index b7c1ee4d6..374ecc956 100644 --- a/project/jni/application/gemrb/gemrb/core/IniSpawn.cpp +++ b/project/jni/application/gemrb/gemrb/core/IniSpawn.cpp @@ -25,10 +25,12 @@ #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" @@ -58,7 +60,7 @@ IniSpawn::~IniSpawn() } } -Holder GetIniFile(const ieResRef DefaultArea) +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)) { @@ -76,13 +78,13 @@ Holder GetIniFile(const ieResRef DefaultArea) } PluginHolder ini(IE_INI_CLASS_ID); - ini->Open(inifile, true ); //autofree + ini->Open(inifile); return ini; } /*** initializations ***/ -inline int CountElements(const char *s, char separator) +static inline int CountElements(const char *s, char separator) { int ret = 1; while(*s) { @@ -92,7 +94,7 @@ inline int CountElements(const char *s, char separator) return ret; } -inline void GetElements(const char *s, ieResRef *storage, int count) +static inline void GetElements(const char *s, ieResRef *storage, int count) { while(count--) { ieResRef *field = storage+count; @@ -110,7 +112,7 @@ inline void GetElements(const char *s, ieResRef *storage, int count) } } -inline void GetElements(const char *s, ieVariable *storage, int count) +static inline void GetElements(const char *s, ieVariable *storage, int count) { while(count--) { ieVariable *field = storage+count; @@ -205,8 +207,7 @@ void IniSpawn::ReadCreature(DataFileMgr *inifile, const char *crittername, Critt critter.CreFile=new ieResRef[critter.creaturecount]; GetElements(s, critter.CreFile, critter.creaturecount); } else { - printMessage( "IniSpawn"," ", LIGHT_RED); - printf("Invalid spawn entry: %s\n", crittername); + printMessage("IniSpawn", "Invalid spawn entry: %s\n", LIGHT_RED, crittername); } s = inifile->GetKeyAsString(crittername,"point_select",NULL); diff --git a/project/jni/application/gemrb/gemrb/core/Interface.cpp b/project/jni/application/gemrb/gemrb/core/Interface.cpp index 2f85d9cc2..36643353f 100644 --- a/project/jni/application/gemrb/gemrb/core/Interface.cpp +++ b/project/jni/application/gemrb/gemrb/core/Interface.cpp @@ -44,13 +44,15 @@ #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 "PluginMgr.h" +#include "PluginLoader.h" #include "PluginMgr.h" #include "ProjectileServer.h" #include "SaveGameIterator.h" @@ -64,13 +66,16 @@ #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" @@ -114,7 +119,7 @@ Interface::Interface(int iargc, char* iargv[]) hConsole = GetStdHandle( STD_OUTPUT_HANDLE ); #endif textcolor( LIGHT_WHITE ); - printf( "GemRB Core Version v%s Loading...\n", VERSION_GEMRB ); + print( "GemRB Core Version v%s Loading...\n", VERSION_GEMRB ); // default to the correct endianswitch ieWord endiantest = 1; @@ -139,6 +144,7 @@ Interface::Interface(int iargc, char* iargv[]) sgiterator = NULL; game = NULL; calendar = NULL; + keymap = NULL; worldmap = NULL; CurrentStore = NULL; CurrentContainer = NULL; @@ -184,6 +190,7 @@ Interface::Interface(int iargc, char* iargv[]) SkipIntroVideos = false; DrawFPS = false; KeepCache = false; + TouchScrollAreas = false; TooltipDelay = 100; IgnoreOriginalINI = 0; FullScreen = 0; @@ -269,7 +276,7 @@ static void ReleaseItemList(void *poi) delete ((ItemList *) poi); } -void FreeAbilityTables() +static void FreeAbilityTables() { if (strmod) { free(strmod); @@ -335,6 +342,7 @@ Interface::~Interface(void) delete game; delete calendar; delete worldmap; + delete keymap; FreeAbilityTables(); @@ -358,7 +366,6 @@ Interface::~Interface(void) ReleaseMemoryActor(); EffectQueue_ReleaseMemory(); CharAnimations::ReleaseMemory(); - delete CurrentStore; FreeResRefTable(DefSound, DSCount); @@ -659,7 +666,7 @@ void Interface::HandleFlags() } } -bool GenerateAbilityTables() +static bool GenerateAbilityTables() { FreeAbilityTables(); @@ -1106,7 +1113,7 @@ void Interface::Main() Font* fps = GetFont( ( unsigned int ) 0 ); char fpsstring[40]={"???.??? fps"}; unsigned long frame = 0, time, timebase; - GetTime(timebase); + timebase = GetTickCount(); double frames = 0.0; Palette* palette = CreatePalette( white, black ); do { @@ -1122,10 +1129,10 @@ void Interface::Main() HandleGUIBehaviour(); GameLoop(); - DrawWindows(); + DrawWindows(true); if (DrawFPS) { frame++; - GetTime( time ); + time = GetTickCount(); if (time - timebase > 1000) { frames = ( frame * 1000.0 / ( time - timebase ) ); timebase = time; @@ -1154,7 +1161,7 @@ int Interface::ReadResRefTable(const ieResRef tablename, ieResRef *&data) AutoTable tm(tablename); if (!tm) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find %s.2da.\n",tablename ); + print( "Cannot find %s.2da.\n",tablename ); return 0; } count = tm->GetRowCount(); @@ -1174,7 +1181,7 @@ int Interface::LoadSprites() ieDword i; int size; if (!IsAvailable( IE_2DA_CLASS_ID )) { - printf( "No 2DA Importer Available.\nTermination in Progress...\n" ); + print( "No 2DA Importer Available.\nTermination in Progress...\n" ); return GEM_ERROR; } @@ -1305,13 +1312,13 @@ int Interface::LoadSprites() AutoTable tab("fonts"); if (!tab) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find fonts.2da.\nTermination in Progress...\n" ); + 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 ); - printf( "No BAM Importer Available.\nTermination in Progress...\n" ); + print( "No BAM Importer Available.\nTermination in Progress...\n" ); return GEM_ERROR; } DataStream* str = NULL; @@ -1322,7 +1329,7 @@ int Interface::LoadSprites() 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, true )) { + if (!bamint->Open(str)) { continue; } Font* fnt = bamint->GetFont(); @@ -1357,18 +1364,18 @@ int Interface::LoadSprites() return GEM_ERROR; } if (GetFont( ButtonFont ) == NULL) { - printMessage( "Core", "ButtonFont not loaded: ", WHITE ); - printf("%s ", ButtonFont); + printMessage("Core", "ButtonFont not loaded: %s ", WHITE, + ButtonFont); printStatus( "WARNING", YELLOW ); } if (GetFont( MovieFont ) == NULL) { - printMessage( "Core", "MovieFont not loaded: ", WHITE ); - printf("%s ", MovieFont); + printMessage("Core", "MovieFont not loaded: %s ", WHITE, + MovieFont); printStatus( "WARNING", YELLOW ); } if (GetFont( TooltipFont ) == NULL) { - printMessage( "Core", "TooltipFont not loaded: ", WHITE ); - printf("%s ", TooltipFont); + printMessage("Core", "TooltipFont not loaded: %s ", WHITE, + TooltipFont); printStatus( "WARNING", YELLOW ); } } @@ -1433,7 +1440,7 @@ int Interface::Init() } printMessage( "Core", "Starting Plugin Manager...\n", WHITE ); PluginMgr *plugin = PluginMgr::Get(); - plugin->LoadPlugins(PluginsPath); + LoadPlugins(PluginsPath); if (plugin && plugin->GetPluginCount()) { printMessage( "Core", "Plugin Loading Complete...", WHITE ); printStatus( "OK", LIGHT_GREEN ); @@ -1449,7 +1456,6 @@ int Interface::Init() srand( ( unsigned int ) t ); #ifdef _DEBUG FileStreamPtrCount = 0; - CachedFileStreamPtrCount = 0; #endif printMessage( "Core", "GemRB Core Initialization...\n", WHITE ); printStatus( "OK", LIGHT_GREEN ); @@ -1457,12 +1463,12 @@ int Interface::Init() video = ( Video * ) PluginMgr::Get()->GetDriver(&Video::ID, VideoDriverName.c_str()); if (!video) { printStatus( "ERROR", LIGHT_RED ); - printf( "No Video Driver Available.\nTermination in Progress...\n" ); + print( "No Video Driver Available.\nTermination in Progress...\n" ); return GEM_ERROR; } if (video->Init() == GEM_ERROR) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot Initialize Video Driver.\nTermination in Progress...\n" ); + print( "Cannot Initialize Video Driver.\nTermination in Progress...\n" ); return GEM_ERROR; } Color defcolor={255,255,255,200}; @@ -1472,7 +1478,7 @@ int Interface::Init() { printMessage( "Core", "Initializing Search Path...", WHITE ); if (!IsAvailable( PLUGIN_RESOURCE_DIRECTORY )) { - printf( "no DirectoryImporter! " ); + print( "no DirectoryImporter! " ); printStatus( "ERROR", LIGHT_RED ); return GEM_ERROR; } @@ -1483,29 +1489,29 @@ int Interface::Init() gamedata->AddSource(path, "Cache", PLUGIN_RESOURCE_DIRECTORY); PathJoin( path, GemRBOverridePath, "override", GameType, NULL); - gamedata->AddSource(path, "GemRB Override", PLUGIN_RESOURCE_DIRECTORY); + 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_DIRECTORY); + 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_DIRECTORY); + gamedata->AddSource(path, "shared GemRB Override", PLUGIN_RESOURCE_CACHEDDIRECTORY); PathJoin( path, GamePath, GameOverridePath, NULL); - gamedata->AddSource(path, "Override", PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, "Override", PLUGIN_RESOURCE_CACHEDDIRECTORY); PathJoin( path, GamePath, GameSoundsPath, NULL); - gamedata->AddSource(path, "Sounds", PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, "Sounds", PLUGIN_RESOURCE_CACHEDDIRECTORY); PathJoin( path, GamePath, GameScriptsPath, NULL); - gamedata->AddSource(path, "Scripts", PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, "Scripts", PLUGIN_RESOURCE_CACHEDDIRECTORY); PathJoin( path, GamePath, GamePortraitsPath, NULL); - gamedata->AddSource(path, "Portraits", PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, "Portraits", PLUGIN_RESOURCE_CACHEDDIRECTORY); PathJoin( path, GamePath, GameDataPath, NULL); - gamedata->AddSource(path, "Data", PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, "Data", PLUGIN_RESOURCE_CACHEDDIRECTORY); //IWD2 movies are on the CD but not in the BIF char *description = strdup("CD1/data"); @@ -1513,7 +1519,7 @@ int Interface::Init() for (size_t j=0;jAddSource(path, description, PLUGIN_RESOURCE_DIRECTORY); + gamedata->AddSource(path, description, PLUGIN_RESOURCE_CACHEDDIRECTORY); } } free(description); @@ -1549,12 +1555,12 @@ int Interface::Init() // 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_DIRECTORY, RM_REPLACE_SAME_SOURCE); + gamedata->AddSource(path, "GemRB Override", PLUGIN_RESOURCE_CACHEDDIRECTORY, RM_REPLACE_SAME_SOURCE); } printMessage( "Core", "Reading Game Options...\n", WHITE ); if (!LoadGemRBINI()) { - printf( "Cannot Load INI\nTermination in Progress...\n" ); + print( "Cannot Load INI\nTermination in Progress...\n" ); return GEM_ERROR; } @@ -1577,13 +1583,13 @@ int Interface::Init() projserv = new ProjectileServer(); if (!projserv->GetHighestProjectileNumber()) { printStatus( "ERROR", LIGHT_RED ); - printf( "No projectiles are available...\n" ); + print( "No projectiles are available...\n" ); } printMessage( "Core", "Checking for Dialogue Manager...", WHITE ); if (!IsAvailable( IE_TLK_CLASS_ID )) { printStatus( "ERROR", LIGHT_RED ); - printf( "No TLK Importer Available.\nTermination in Progress...\n" ); + print( "No TLK Importer Available.\nTermination in Progress...\n" ); return GEM_ERROR; } printStatus( "OK", LIGHT_GREEN ); @@ -1591,15 +1597,14 @@ int Interface::Init() printMessage( "Core", "Loading Dialog.tlk file...", WHITE ); char strpath[_MAX_PATH]; PathJoin( strpath, GamePath, dialogtlk, NULL ); - FileStream* fs = new FileStream(); - if (!fs->Open( strpath, true )) { + FileStream* fs = FileStream::OpenFile(strpath); + if (!fs) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find Dialog.tlk.\nTermination in Progress...\n" ); - delete fs; + print( "Cannot find Dialog.tlk.\nTermination in Progress...\n" ); return GEM_ERROR; } printStatus( "OK", LIGHT_GREEN ); - strings->Open( fs, true ); + strings->Open(fs); { printMessage( "Core", "Loading Palettes...\n", WHITE ); @@ -1621,7 +1626,7 @@ int Interface::Init() if (!IsAvailable( IE_BAM_CLASS_ID )) { printStatus( "ERROR", LIGHT_RED ); - printf( "No BAM Importer Available.\nTermination in Progress...\n" ); + print( "No BAM Importer Available.\nTermination in Progress...\n" ); return GEM_ERROR; } @@ -1629,7 +1634,7 @@ int Interface::Init() DSCount = ReadResRefTable ("defsound", DefSound); if (DSCount == 0) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find defsound.2da.\nTermination in Progress...\n" ); + print( "Cannot find defsound.2da.\nTermination in Progress...\n" ); return GEM_ERROR; } @@ -1690,6 +1695,7 @@ int Interface::Init() //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(); @@ -1727,7 +1733,7 @@ int Interface::Init() 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, true )) { + if (!INIresdata->Open(ds)) { printStatus( "ERROR", LIGHT_RED ); } else { printStatus( "OK", LIGHT_GREEN ); @@ -1735,14 +1741,12 @@ int Interface::Init() } if (HasFeature( GF_HAS_PARTY_INI )) { - printMessage( "Core", "Loading precreated teams setup...\n", - WHITE ); + printMessage( "Core", "Loading precreated teams setup...\n", WHITE ); INIparty = PluginHolder(IE_INI_CLASS_ID); - FileStream* fs = new FileStream(); char tINIparty[_MAX_PATH]; PathJoin( tINIparty, GamePath, "Party.ini", NULL ); - fs->Open( tINIparty, true ); - if (!INIparty->Open( fs, true )) { + FileStream* fs = FileStream::OpenFile( tINIparty ); + if (!INIparty->Open(fs)) { printStatus( "ERROR", LIGHT_RED ); } else { printStatus( "OK", LIGHT_GREEN ); @@ -1754,29 +1758,25 @@ int Interface::Init() } if (HasFeature( GF_HAS_BEASTS_INI )) { - printMessage( "Core", "Loading beasts definition File...\n", - WHITE ); + printMessage( "Core", "Loading beasts definition File...\n", WHITE ); INIbeasts = PluginHolder(IE_INI_CLASS_ID); - FileStream* fs = new FileStream(); char tINIbeasts[_MAX_PATH]; PathJoin( tINIbeasts, GamePath, "beast.ini", NULL ); // FIXME: crashes if file does not open - fs->Open( tINIbeasts, true ); - if (!INIbeasts->Open( fs, true )) { + 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 ); + printMessage( "Core", "Loading quests definition File...\n", WHITE ); INIquests = PluginHolder(IE_INI_CLASS_ID); - FileStream* fs2 = new FileStream(); char tINIquests[_MAX_PATH]; PathJoin( tINIquests, GamePath, "quests.ini", NULL ); // FIXME: crashes if file does not open - fs2->Open( tINIquests, true ); - if (!INIquests->Open( fs2, true )) { + FileStream* fs2 = FileStream::OpenFile( tINIquests ); + if (!INIquests->Open(fs2)) { printStatus( "ERROR", LIGHT_RED ); } else { printStatus( "OK", LIGHT_GREEN ); @@ -1784,6 +1784,7 @@ int Interface::Init() } game = NULL; calendar = NULL; + keymap = NULL; timer = new GlobalTimer(); printMessage( "Core", "Bringing up the Global Timer...", WHITE ); @@ -1898,6 +1899,14 @@ int Interface::Init() 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; @@ -1932,124 +1941,124 @@ const char* Interface::TypeExt(SClass_ID type) const { switch (type) { case IE_2DA_CLASS_ID: - return ".2da"; + return "2da"; case IE_ACM_CLASS_ID: - return ".acm"; + return "acm"; case IE_ARE_CLASS_ID: - return ".are"; + return "are"; case IE_BAM_CLASS_ID: - return ".bam"; + return "bam"; case IE_BCS_CLASS_ID: - return ".bcs"; + return "bcs"; case IE_BS_CLASS_ID: - return ".bs"; + return "bs"; case IE_BIF_CLASS_ID: - return ".bif"; + return "bif"; case IE_BIO_CLASS_ID: if (HasFeature(GF_BIOGRAPHY_RES)) { - return ".res"; + return "res"; } - return ".bio"; + return "bio"; case IE_BMP_CLASS_ID: - return ".bmp"; + return "bmp"; case IE_PNG_CLASS_ID: - return ".png"; + return "png"; case IE_CHR_CLASS_ID: - return ".chr"; + return "chr"; case IE_CHU_CLASS_ID: - return ".chu"; + return "chu"; case IE_CRE_CLASS_ID: - return ".cre"; + return "cre"; case IE_DLG_CLASS_ID: - return ".dlg"; + return "dlg"; case IE_EFF_CLASS_ID: - return ".eff"; + return "eff"; case IE_GAM_CLASS_ID: - return ".gam"; + return "gam"; case IE_IDS_CLASS_ID: - return ".ids"; + return "ids"; case IE_INI_CLASS_ID: - return ".ini"; + return "ini"; case IE_ITM_CLASS_ID: - return ".itm"; + return "itm"; case IE_MOS_CLASS_ID: - return ".mos"; + return "mos"; case IE_MUS_CLASS_ID: - return ".mus"; + return "mus"; case IE_MVE_CLASS_ID: - return ".mve"; + return "mve"; case IE_OGG_CLASS_ID: - return ".ogg"; + return "ogg"; case IE_PLT_CLASS_ID: - return ".plt"; + return "plt"; case IE_PRO_CLASS_ID: - return ".pro"; + return "pro"; case IE_SAV_CLASS_ID: - return ".sav"; + return "sav"; case IE_SPL_CLASS_ID: - return ".spl"; + return "spl"; case IE_SRC_CLASS_ID: - return ".src"; + return "src"; case IE_STO_CLASS_ID: - return ".sto"; + return "sto"; case IE_TIS_CLASS_ID: - return ".tis"; + return "tis"; case IE_TLK_CLASS_ID: - return ".tlk"; + return "tlk"; case IE_TOH_CLASS_ID: - return ".toh"; + return "toh"; case IE_TOT_CLASS_ID: - return ".tot"; + return "tot"; case IE_VAR_CLASS_ID: - return ".var"; + return "var"; case IE_VVC_CLASS_ID: - return ".vvc"; + return "vvc"; case IE_WAV_CLASS_ID: - return ".wav"; + return "wav"; case IE_WED_CLASS_ID: - return ".wed"; + return "wed"; case IE_WFX_CLASS_ID: - return ".wfx"; + return "wfx"; case IE_WMP_CLASS_ID: - return ".wmp"; + return "wmp"; } return NULL; } @@ -2138,16 +2147,14 @@ bool Interface::LoadConfig(void) return true; } - PathJoin( path, UserDir, name, NULL ); - strcat( path, ".cfg" ); + PathJoinExt( path, UserDir, name, "cfg" ); if (LoadConfig( path )) { return true; } #ifdef SYSCONFDIR - PathJoin( path, SYSCONFDIR, name, NULL ); - strcat( path, ".cfg" ); + PathJoinExt( path, SYSCONFDIR, name, "cfg" ); if (LoadConfig( path )) { return true; @@ -2159,16 +2166,14 @@ bool Interface::LoadConfig(void) return false; } - PathJoin( path, UserDir, PACKAGE, NULL ); - strcat( path, ".cfg" ); + PathJoinExt( path, UserDir, PACKAGE, "cfg" ); if (LoadConfig( path )) { return true; } #ifdef SYSCONFDIR - PathJoin( path, SYSCONFDIR, PACKAGE, NULL ); - strcat( path, ".cfg" ); + PathJoinExt( path, SYSCONFDIR, PACKAGE, "cfg" ); if (LoadConfig( path )) { return true; @@ -2189,26 +2194,26 @@ bool Interface::LoadConfig(void) bool Interface::LoadConfig(const char* filename) { - FILE* config; size_t i; printMessage("Config","Trying to open ", WHITE); textcolor(LIGHT_WHITE); - printf("%s ", filename); - config = fopen( filename, "rb" ); + print("%s ", filename); + FileStream* config = FileStream::OpenFile(filename); if (config == NULL) { printStatus("NOT FOUND", YELLOW); return false; } - char line[1024]; - char *name, *nameend, *value, *valueend; //once GemRB own format is working well, this might be set to 0 SaveAsOriginal = 1; int lineno = 0; - while (!feof( config )) { - if (! fgets( line, sizeof(line), config )) { // also if len == size(line) + while (config->Remains()) { + char line[1024]; + char *name, *nameend, *value, *valueend; + + if (config->ReadLine(line, _MAX_PATH) == -1) { break; } lineno++; @@ -2224,7 +2229,7 @@ bool Interface::LoadConfig(const char* filename) value = strchr( name, '=' ); if (!value || value == name) { - printf( "Invalid line %d\n", lineno ); + print( "Invalid line %d\n", lineno ); continue; } @@ -2268,6 +2273,7 @@ bool Interface::LoadConfig(const char* filename) 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) { \ @@ -2321,7 +2327,7 @@ bool Interface::LoadConfig(const char* filename) } } } - fclose( config ); + delete config; // WARNING: Don't move ResolveFilePath into the loop // Otherwise, it won't obey CaseSensitive set at the end @@ -2408,13 +2414,13 @@ bool Interface::LoadConfig(const char* filename) } //FixPath( SavePath, false ); - //mkdir( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); - //chmod( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); + //MakeDirectory(SavePath); FixPath( SavePath, true ); FixPath( CachePath, false ); - mkdir( CachePath, S_IREAD|S_IWRITE|S_IEXEC ); - chmod( CachePath, S_IREAD|S_IWRITE|S_IEXEC ); + if (!MakeDirectory(CachePath)) { + error("Core", "Unable to create cache directory '%s'", CachePath); + } printStatus( "OK", LIGHT_GREEN ); @@ -2425,8 +2431,7 @@ bool Interface::LoadConfig(const char* filename) } if ( StupidityDetector( CachePath )) { - printMessage("Core"," ",LIGHT_RED); - printf( "Cache path %s doesn't exist, not a folder or contains alien files!\n", CachePath ); + printMessage("Core", "Cache path %s doesn't exist, not a folder or contains alien files!\n", LIGHT_RED, CachePath ); return false; } if (!KeepCache) DelTree((const char *) CachePath, false); @@ -2435,12 +2440,6 @@ bool Interface::LoadConfig(const char* filename) return true; } -static void upperlower(int upper, int lower) -{ - pl_uppercase[lower]=(ieByte) upper; - pl_lowercase[upper]=(ieByte) lower; -} - static const char *game_flags[GF_COUNT+1]={ "HasKaputz", //0 GF_HAS_KAPUTZ "AllStringsTagged", //1 GF_ALL_STRINGS_TAGGED @@ -2516,16 +2515,16 @@ bool Interface::LoadGemRBINI() return false; } - printMessage( "Core", "Loading game type-specific GemRB setup...\n", WHITE ); - printf( "%s",inifile->originalfile); + printMessage("Core", "Loading game type-specific GemRB setup...\n%s", WHITE, + inifile->originalfile); if (!IsAvailable( IE_INI_CLASS_ID )) { printStatus( "ERROR", LIGHT_RED ); - printf( "[Core]: No INI Importer Available.\n" ); + print( "[Core]: No INI Importer Available.\n" ); return false; } PluginHolder ini(IE_INI_CLASS_ID); - ini->Open( inifile, true ); //autofree + ini->Open(inifile); printStatus( "OK", LIGHT_GREEN ); @@ -2620,7 +2619,10 @@ bool Interface::LoadGemRBINI() if (s) { const char *s2 = strchr(s,','); if (s2) { - upperlower(atoi(s), atoi(s2+1) ); + unsigned char upper = atoi(s); + unsigned char lower = atoi(s2+1); + pl_uppercase[lower] = upper; + pl_lowercase[upper] = lower; } } } @@ -2631,12 +2633,11 @@ bool Interface::LoadGemRBINI() for (i=0;iGetKeyAsInt( "resources", game_flags[i], 0 ), i ); //printMessage("Option", "", GREEN); - //printf("%s = %s\n", game_flags[i], HasFeature(i)?"yes":"no"); + //print("%s = %s\n", game_flags[i], HasFeature(i)?"yes":"no"); } ForceStereo = ini->GetKeyAsInt( "resources", "ForceStereo", 0 ); @@ -2871,13 +2872,11 @@ bool Interface::LoadWindowPack(const char* name) { DataStream* stream = gamedata->GetResource( name, IE_CHU_CLASS_ID ); if (stream == NULL) { - printMessage( "Interface", "Error: Cannot find ", LIGHT_RED ); - printf( "%s.chu\n", name ); + printMessage("Interface", "Error: Cannot find %s.chu\n", LIGHT_RED, name ); return false; } - if (!GetWindowMgr()->Open( stream, true )) { - printMessage( "Interface", "Error: Cannot Load ", LIGHT_RED ); - printf( "%s.chu\n", name ); + if (!GetWindowMgr()->Open(stream)) { + printMessage("Interface", "Error: Cannot Load %s.chu\n", LIGHT_RED, name ); return false; } @@ -2950,8 +2949,6 @@ int Interface::CreateWindow(unsigned short WindowID, int XPos, int YPos, unsigne ResourceHolder mos(Background); if (mos != NULL) { win->SetBackGround( mos->GetSprite2D(), true ); - } else { - printf( "[Core]: Cannot Load BackGround, skipping\n" ); } } @@ -3055,23 +3052,6 @@ int Interface::AdjustScrolling(unsigned short WindowIndex, return 0; } -/** Set the Text of a Control */ -int Interface::SetText(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->SetText( string ); -} /** Set the Tooltip text of a Control */ int Interface::SetTooltip(unsigned short WindowIndex, unsigned short ControlIndex, const char* string) @@ -3242,12 +3222,12 @@ void Interface::GameLoop(void) update_scripts = !(gc->GetDialogueFlags() & DF_FREEZE_SCRIPTS); } - update_scripts = GSUpdate(update_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 (update_scripts) { + if (do_update) { if ( game->selected.size() > 0 ) { gc->ChangeMap(GetFirstSelectedPC(true), false); } @@ -3316,7 +3296,7 @@ void Interface::HandleGUIBehaviour(void) } } -void Interface::DrawWindows(void) +void Interface::DrawWindows(bool allow_delete) { //here comes the REAL drawing of windows if (ModalWindow) { @@ -3334,10 +3314,12 @@ void Interface::DrawWindows(void) Window* win = windows[t]; if (win != NULL) { if (win->Visible == WINDOW_INVALID) { - topwin.erase(topwin.begin()+i); - evntmgr->DelWindow( win ); - delete win; - windows[t]=NULL; + if (allow_delete) { + topwin.erase(topwin.begin()+i); + evntmgr->DelWindow( win ); + delete win; + windows[t]=NULL; + } } else if (win->Visible) { win->DrawWindow(); } @@ -3548,7 +3530,7 @@ int Interface::LoadSymbol(const char* ResRef) delete str; return -1; } - if (!sm->Open( str, true )) { + if (!sm->Open(str)) { return -1; } Symbol s; @@ -3719,7 +3701,7 @@ int Interface::GetPortraits(TextArea* ta, bool smallorlarge) if (!dir) { return -1; } - printf( "Looking in %s\n", Path ); + print( "Looking in %s\n", Path ); do { char *name = dir.GetName(); if (name[0] == '.') @@ -3751,7 +3733,7 @@ int Interface::GetCharSounds(TextArea* ta) if (!dir) { return -1; } - printf( "Looking in %s\n", Path ); + print( "Looking in %s\n", Path ); do { char *name = dir.GetName(); if (name[0] == '.') @@ -3780,7 +3762,7 @@ int Interface::GetCharacters(TextArea* ta) if (!dir) { return -1; } - printf( "Looking in %s\n", Path ); + print( "Looking in %s\n", Path ); do { char *name = dir.GetName(); if (name[0] == '.') @@ -3799,45 +3781,36 @@ int Interface::GetCharacters(TextArea* ta) bool Interface::LoadINI(const char* filename) { - FILE* config; - config = fopen( filename, "rb" ); + FileStream* config = FileStream::OpenFile(filename); if (config == NULL) { return false; } char name[65], value[_MAX_PATH + 3]; - while (!feof( config )) { - name[0] = 0; - value[0] = 0; - char rem; + while (config->Remains()) { + char line[_MAX_PATH]; - if (fread( &rem, 1, 1, config ) != 1) + if (config->ReadLine(line, _MAX_PATH) == -1) break; - if (( rem == '#' ) || - ( rem == '[' ) || - ( rem == '\r' ) || - ( rem == '\n' ) || - ( rem == ';' )) { - if (rem == '\r') { - fgetc( config ); - continue; - } else if (rem == '\n') - continue; - - //it should always return zero - if (fscanf( config, "%*[^\r\n]%*[\r\n]" )!=0) - break; + if ((line[0] == '#') || + ( line[0] == '[' ) || + ( line[0] == '\r' ) || + ( line[0] == '\n' ) || + ( line[0] == ';' )) { continue; } - fseek( config, -1, SEEK_CUR ); + + name[0] = 0; + value[0] = 0; + //the * element is not counted - if (fscanf( config, "%[^=]=%[^\r\n]%*[\r\n]", name, value )!=2) + if (sscanf( line, "%[^=]=%[^\r\n]", name, value )!=2) continue; if (( value[0] >= '0' ) && ( value[0] <= '9' )) { vars->SetAt( name, atoi( value ) ); } } - fclose( config ); + delete config; return true; } @@ -3848,7 +3821,7 @@ void Interface::SetCutSceneMode(bool active) if (gc) { // don't mess with controls/etc if we're already in a cutscene - if (active == (gc->GetScreenFlags()&SF_CUTSCENE)) + if (active == (bool)(gc->GetScreenFlags()&SF_CUTSCENE)) return; gc->SetCutSceneMode( active ); @@ -3939,6 +3912,7 @@ void Interface::LoadGame(SaveGame *sg, int ver_override) // Yes, it uses goto. Other ways seemed too awkward for me. + gamedata->SaveAllStores(); strings->CloseAux(); tokens->RemoveAll(NULL); //clearing the token dictionary @@ -3989,7 +3963,7 @@ void Interface::LoadGame(SaveGame *sg, int ver_override) if (!gam_mgr) goto cleanup; - if (!gam_mgr->Open( gam_str, true )) + if (!gam_mgr->Open(gam_str)) goto cleanup; new_game = gam_mgr->LoadGame(new Game(), ver_override); @@ -4002,7 +3976,7 @@ void Interface::LoadGame(SaveGame *sg, int ver_override) if (!wmp_mgr) goto cleanup; - if (!wmp_mgr->Open( wmp_str1, wmp_str2, true )) + if (!wmp_mgr->Open(wmp_str1, wmp_str2)) goto cleanup; new_worldmap = wmp_mgr->GetWorldMapArray( ); @@ -4013,7 +3987,7 @@ void Interface::LoadGame(SaveGame *sg, int ver_override) LoadProgress(20); // Unpack SAV (archive) file to Cache dir if (sav_str) { - PluginHolder ai(IE_BIF_CLASS_ID); + PluginHolder ai(IE_SAV_CLASS_ID); if (ai) { if (ai->DecompressSaveGame(sav_str) != GEM_OK) { goto cleanup; @@ -4061,7 +4035,7 @@ void Interface::UpdateMasterScript() 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, true )) { + if (!wmp_mgr->Open(wmp_str1, wmp_str2)) { delete wmp_str1; delete wmp_str2; } @@ -4442,7 +4416,7 @@ void Interface::RemoveFromCache(const ieResRef resref, SClass_ID ClassID) { char filename[_MAX_PATH]; - snprintf(filename, _MAX_PATH, "%s%.8s%s", CachePath, resref, TypeExt( ClassID ) ); + PathJoinExt(filename, CachePath, resref, TypeExt(ClassID)); unlink ( filename); } @@ -4455,7 +4429,7 @@ bool Interface::StupidityDetector(const char* Pt) strcpy( Path, Pt ); DirectoryIterator dir(Path); if (!dir) { - printf("\n**cannot open**\n"); + print("\n**cannot open**\n"); return true; } do { @@ -4467,11 +4441,11 @@ bool Interface::StupidityDetector(const char* Pt) if (name[1] == '.' && name[2] == '\0') continue; } - printf("\n**contains another dir**\n"); + print("\n**contains another dir**\n"); return true; //a directory in there??? } if (ProtectedExtension(name) ) { - printf("\n**contains alien files**\n"); + print("\n**contains alien files**\n"); return true; //an executable file in there??? } } while (++dir); @@ -4662,6 +4636,10 @@ bool Interface::ResolveRandomItem(CREItem *itm) void* lookup; if ( !RtRows->Lookup( 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; @@ -4696,8 +4674,8 @@ bool Interface::ResolveRandomItem(CREItem *itm) } itm->Usages[0]=(ieWord) Roll(j,k,0); } - printMessage("Interface"," ",LIGHT_RED); - printf("Loop detected while generating random item:%s\n",itm->ItemResRef); + printMessage("Interface", "Loop detected while generating random item:%s\n", LIGHT_RED, + itm->ItemResRef); return false; } @@ -4785,43 +4763,16 @@ Store *Interface::GetCurrentStore() return CurrentStore; } -int Interface::CloseCurrentStore() +void Interface::CloseCurrentStore() { - if ( !CurrentStore ) { - return -1; - } - PluginHolder sm(IE_STO_CLASS_ID); - if (sm == NULL) { - return -1; - } - int size = sm->GetStoredFileSize (CurrentStore); - 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( CurrentStore->Name, IE_STO_CLASS_ID ); - int ret = sm->PutStore (&str, CurrentStore); - if (ret <0) { - printMessage("Core"," ", YELLOW); - printf("Store removed: %s\n", CurrentStore->Name); - RemoveFromCache(CurrentStore->Name, IE_STO_CLASS_ID); - } - } else { - printMessage("Core"," ", YELLOW); - printf("Store removed: %s\n", CurrentStore->Name); - RemoveFromCache(CurrentStore->Name, IE_STO_CLASS_ID); - } - //make sure the stream isn't connected to sm, or it will be double freed - delete CurrentStore; + gamedata->SaveStore(CurrentStore); CurrentStore = NULL; - return 0; } Store *Interface::SetCurrentStore(const ieResRef resname, ieDword owner) { - if ( CurrentStore ) { - if ( !strnicmp(CurrentStore->Name, resname, 8) ) { + if (CurrentStore) { + if (!strnicmp(CurrentStore->Name, resname, 8)) { return CurrentStore; } @@ -4829,25 +4780,10 @@ Store *Interface::SetCurrentStore(const ieResRef resname, ieDword owner) CloseCurrentStore(); } - DataStream* str = gamedata->GetResource( resname, IE_STO_CLASS_ID ); - PluginHolder sm(IE_STO_CLASS_ID); - if (sm == NULL) { - delete ( str ); - return NULL; - } - if (!sm->Open( str, true )) { - return NULL; - } - - // FIXME - should use some already allocated in core - // not really, only one store is open at a time, then it is - // unloaded, we don't really have to cache it, it will be saved in - // Cache anyway! - CurrentStore = sm->GetStore( new Store() ); + CurrentStore = gamedata->GetStore(resname); if (CurrentStore == NULL) { return NULL; } - strnlwrcpy(CurrentStore->Name, resname, 8); if (owner) { CurrentStore->SetOwnerID(owner); } @@ -4865,12 +4801,11 @@ int Interface::GetMouseScrollSpeed() { ieStrRef Interface::GetRumour(const ieResRef dlgref) { PluginHolder dm(IE_DLG_CLASS_ID); - dm->Open( gamedata->GetResource( dlgref, IE_DLG_CLASS_ID ), true ); + dm->Open(gamedata->GetResource(dlgref, IE_DLG_CLASS_ID)); Dialog *dlg = dm->GetDialog(); if (!dlg) { - printMessage("Interface"," ", LIGHT_RED); - printf( "Cannot load dialog: %s\n", dlgref ); + printMessage("Interface", "Cannot load dialog: %s\n", LIGHT_RED, dlgref); return (ieStrRef) -1; } Scriptable *pc=game->GetPC( game->GetSelectedPCSingle(), false ); @@ -4884,24 +4819,6 @@ ieStrRef Interface::GetRumour(const ieResRef dlgref) return ret; } -void Interface::DoTheStoreHack(Store *s) -{ - size_t size = s->PurchasedCategoriesCount * sizeof( ieDword ); - s->purchased_categories=(ieDword *) malloc(size); - - size = s->CuresCount * sizeof( STOCure ); - s->cures=(STOCure *) malloc(size); - - size = s->DrinksCount * sizeof( STODrink ); - s->drinks=(STODrink *) malloc(size); - - for(size=0;sizeItemsCount;size++) { - STOItem *si = new STOItem(); - memset(si, 0, sizeof(STOItem) ); - s->items.push_back( si ); - } -} - //plays stock sound listed in defsound.2da void Interface::PlaySound(int index) { @@ -5080,13 +4997,13 @@ int Interface::SwapoutArea(Map *map) str.Create( map->GetScriptName(), IE_ARE_CLASS_ID ); int ret = mm->PutArea (&str, map); if (ret <0) { - printMessage("Core"," ", YELLOW); - printf("Area removed: %s\n", map->GetScriptName()); + printMessage("Core", "Area removed: %s\n", YELLOW, + map->GetScriptName()); RemoveFromCache(map->GetScriptName(), IE_ARE_CLASS_ID); } } else { - printMessage("Core"," ", YELLOW); - printf("Area removed: %s\n", map->GetScriptName()); + 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 @@ -5115,8 +5032,7 @@ int Interface::WriteCharacter(const char *name, Actor *actor) int ret = gm->PutActor(&str, actor, true); if (ret <0) { - printMessage("Core"," ", YELLOW); - printf("Character cannot be saved: %s\n", name); + printMessage("Core", "Character cannot be saved: %s\n", YELLOW, name); return -1; } } @@ -5150,13 +5066,11 @@ int Interface::WriteGame(const char *folder) str.Create( folder, GameNameResRef, IE_GAM_CLASS_ID ); int ret = gm->PutGame (&str, game); if (ret <0) { - printMessage("Core"," ", YELLOW); - printf("Game cannot be saved: %s\n", folder); + printMessage("Core", "Game cannot be saved: %s\n", YELLOW, folder); return -1; } } else { - printMessage("Core"," ", YELLOW); - printf("Internal error, game cannot be saved: %s\n", folder); + printMessage("Core", "Internal error, game cannot be saved: %s\n", YELLOW, folder); return -1; } return 0; @@ -5197,8 +5111,7 @@ int Interface::WriteWorldMap(const char *folder) ret = wmm->PutWorldMap (&str1, &str2, worldmap); } if (ret <0) { - printMessage("Core"," ", YELLOW); - printf("Internal error, worldmap cannot be saved: %s\n", folder); + printMessage("Core", "Internal error, worldmap cannot be saved: %s\n", YELLOW, folder); return -1; } return 0; @@ -5213,8 +5126,7 @@ int Interface::CompressSave(const char *folder) if (!dir) { return -1; } - //BIF and SAV are the same - PluginHolder ai(IE_BIF_CLASS_ID); + 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 @@ -5230,7 +5142,7 @@ int Interface::CompressSave(const char *folder) char dtmp[_MAX_PATH]; dir.GetFullPath(dtmp); FileStream fs; - fs.Open(dtmp, true); + fs.Open(dtmp); ai->AddToSaveGame(&str, &fs); } } while (++dir); @@ -5464,8 +5376,7 @@ ieDword Interface::TranslateStat(const char *stat_name) Holder sym = GetSymbol( symbol ); ieDword stat = (ieDword) sym->GetValue( stat_name ); if (stat==(ieDword) ~0) { - printMessage("Core"," ",YELLOW); - printf("Cannot translate symbol: %s\n", stat_name); + printMessage("Core", "Cannot translate symbol: %s\n", YELLOW, stat_name); } return stat; } @@ -5513,7 +5424,6 @@ void Interface::SetNextScript(const char *script) void Interface::SanityCheck(const char *ver) { if (strcmp(ver, VERSION_GEMRB)) { - printf("version check failed: core version %s doesn't match caller's version %s\n", VERSION_GEMRB, ver); - abort(); + 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 index 2e6180174..f8d86189f 100644 --- a/project/jni/application/gemrb/gemrb/core/Interface.h +++ b/project/jni/application/gemrb/gemrb/core/Interface.h @@ -26,19 +26,16 @@ #ifndef INTERFACE_H #define INTERFACE_H -//skip messy warnings in MSVC6 -#include "win32def.h" - #include "SClassID.h" #include "exports.h" #include "Cache.h" #include "Callback.h" -#include "GlobalTimer.h" #include "Holder.h" #include #include +#include #ifdef _MSC_VER // No SFINAE #include "Audio.h" @@ -49,6 +46,7 @@ #include "StringMgr.h" #include "SymbolMgr.h" #include "Video.h" +#include "WindowMgr.h" #endif class Actor; @@ -67,9 +65,11 @@ class Factory; class Font; class Game; class GameControl; +class GlobalTimer; class ITMExtHeader; class Image; class Item; +class KeyMap; class Label; class Map; class MusicMgr; @@ -82,6 +82,7 @@ class SaveGameIterator; class ScriptEngine; class ScriptedAnimation; class Spell; +class Sprite2D; class Store; class StringMgr; class SymbolMgr; @@ -349,6 +350,7 @@ private: EventHandler TickHook; int SpecialSpellsCount; SpellDescType *SpecialSpells; + KeyMap *keymap; public: Holder strings; GlobalTimer * timer; @@ -432,8 +434,6 @@ public: int GetControl(unsigned short WindowIndex, unsigned long ControlID) const; /** Adjust the scrolling of the control (if applicable) */ int AdjustScrolling(unsigned short WindowIndex, unsigned short ControlIndex, short x, short y); - /** Set the Text of a Control */ - int SetText(unsigned short WindowIndex, unsigned short ControlIndex, const char * string); /** Set the Tooltip text of a Control */ int SetTooltip(unsigned short WindowIndex, unsigned short ControlIndex, const char * string); /** sets tooltip to be displayed */ @@ -524,6 +524,12 @@ public: return calendar; } + /** Gets the KeyMap class */ + KeyMap * GetKeyMap() const + { + return keymap; + } + /** Gets the WorldMap class, returns the current worldmap or the first worldmap containing the area*/ WorldMap * GetWorldMap(const char *area = NULL); void SetWindowFrame(int i, Sprite2D *Picture); @@ -587,7 +593,7 @@ public: int CloseCurrentContainer(); void SetCurrentContainer(Actor *actor, Container *arg, bool flag=false); Store *GetCurrentStore(); - int CloseCurrentStore(); + void CloseCurrentStore(); Store *SetCurrentStore(const ieResRef resname, ieDword owner); void SetMouseScrollSpeed(int speed); int GetMouseScrollSpeed(); @@ -601,7 +607,6 @@ public: void FreeITMExt(ITMExtHeader *p, Effect *e); void FreeSPLExt(SPLExtHeader *p, Effect *e); WorldMapArray *NewWorldMapArray(int count); - void DoTheStoreHack(Store *s); /** plays stock gui sound referenced by index */ void PlaySound(int idx); /** returns the first selected PC, if forced is set, then it returns @@ -745,7 +750,7 @@ public: unsigned int TooltipDelay; int IgnoreOriginalINI; unsigned int FogOfWar; - bool CaseSensitive, GameOnCD, SkipIntroVideos, DrawFPS; + bool CaseSensitive, GameOnCD, SkipIntroVideos, DrawFPS, TouchScrollAreas; bool GUIEnhancements; bool KeepCache; Variables *plugin_flags; @@ -754,7 +759,7 @@ public: /** returns true if the game is paused */ bool IsFreezed(); /** Draws the Visible windows in the Windows Array */ - void DrawWindows(void); + void DrawWindows(bool allow_delete = false); /** Sends a termination signal to the Video Driver */ bool Quit(void); /** CheatKey support */ @@ -794,7 +799,6 @@ public: #ifdef _DEBUG int FileStreamPtrCount; - int CachedFileStreamPtrCount; #endif }; diff --git a/project/jni/application/gemrb/gemrb/core/Inventory.cpp b/project/jni/application/gemrb/gemrb/core/Inventory.cpp index 087943737..8025f263d 100644 --- a/project/jni/application/gemrb/gemrb/core/Inventory.cpp +++ b/project/jni/application/gemrb/gemrb/core/Inventory.cpp @@ -26,11 +26,13 @@ #include "win32def.h" #include "strrefs.h" +#include "CharAnimations.h" #include "DisplayMessage.h" #include "Game.h" #include "GameData.h" #include "Interface.h" #include "Item.h" +#include "Map.h" #include "ScriptEngine.h" #include "Scriptable/Actor.h" @@ -55,9 +57,7 @@ static int MagicBit = 0; static void InvalidSlot(int slot) { - printMessage("Inventory"," ",LIGHT_RED); - printf("Invalid slot: %d!\n",slot); - abort(); + error("Inventory", "Invalid slot: %d!\n", slot); } //This inline function returns both an item pointer and the slot data. @@ -154,7 +154,7 @@ CREItem *Inventory::GetItem(unsigned int slot) //This hack sets the charge counters for non-rechargeable items, //if their charge is zero -inline void HackCharges(CREItem *item) +static inline void HackCharges(CREItem *item) { Item *itm = gamedata->GetItem( item->ItemResRef ); if (itm) { @@ -228,24 +228,24 @@ void Inventory::CalculateWeight() } //if item is stacked mark it as so - if (itm->StackAmount) { + if (itm->MaxStackAmount) { slot->Flags |= IE_INV_ITEM_STACKED; } slot->Weight = itm->Weight; - slot->StackAmount = itm->StackAmount; + slot->MaxStackAmount = itm->MaxStackAmount; gamedata->FreeItem( itm, slot->ItemResRef, false ); } else { - printMessage( "Inventory", " ", LIGHT_RED); - printf("Invalid item: %s!\n", slot->ItemResRef); + printMessage("Inventory", "Invalid item: %s!\n", LIGHT_RED, + slot->ItemResRef); slot->Weight = 0; } } else { slot->Flags &= ~IE_INV_ITEM_ACQUIRED; } if (slot->Weight > 0) { - Weight += slot->Weight * ((slot->Usages[0] && slot->StackAmount > 1) ? slot->Usages[0] : 1); + Weight += slot->Weight * ((slot->Usages[0] && slot->MaxStackAmount > 1) ? slot->Usages[0] : 1); } } Changed = false; @@ -303,7 +303,7 @@ void Inventory::SetInventoryType(int arg) void Inventory::SetSlotCount(unsigned int size) { if (Slots.size()) { - printf("Inventory size changed???\n"); + print("Inventory size changed???\n"); //we don't allow reassignment, //if you want this, delete the previous Slots here abort(); @@ -350,7 +350,7 @@ int Inventory::CountItems(const char *resref, bool stacks) const continue; } if (resref && resref[0]) { - if (!strnicmp(resref, item->ItemResRef, 8) ) + if (strnicmp(resref, item->ItemResRef, 8) ) continue; } if (stacks && (item->Flags&IE_INV_ITEM_STACKED) ) { @@ -638,17 +638,16 @@ int Inventory::AddSlotItem(CREItem* item, int slot, int slottype) } CREItem *myslot = Slots[slot]; - if (ItemsAreCompatible( myslot, item )) { + if (myslot->MaxStackAmount > 1 && ItemsAreCompatible(myslot, item)) { //calculate with the max movable stock int chunk = item->Usages[0]; - int newamount = myslot->Usages[0]+chunk; - if (newamount>myslot->StackAmount) { - newamount=myslot->StackAmount; - chunk = item->Usages[0]-newamount; + if (myslot->Usages[0] + chunk > myslot->MaxStackAmount) { + chunk = myslot->MaxStackAmount - myslot->Usages[0]; } if (!chunk) { - return -1; + return ASI_FAILED; } + assert(chunk > 0); myslot->Flags |= IE_INV_ITEM_ACQUIRED; myslot->Usages[0] = (ieWord) (myslot->Usages[0] + chunk); item->Usages[0] = (ieWord) (item->Usages[0] - chunk); @@ -745,6 +744,7 @@ int Inventory::AddStoreItem(STOItem* item, int action) } item->PurchasedAmount--; } + CalculateWeight(); return ret; } @@ -970,7 +970,7 @@ bool Inventory::EquipItem(unsigned int slot) int effect = core->QuerySlotEffects( slot ); Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) { - printf("Invalid item Equipped: %s Slot: %d\n", item->ItemResRef, slot); + print("Invalid item Equipped: %s Slot: %d\n", item->ItemResRef, slot); return false; } switch (effect) { @@ -1381,7 +1381,7 @@ int Inventory::FindCandidateSlot(int slottype, size_t first_slot, const char *re } // check if the item fits in this slot, we use the cached // stackamount value - if (item->Usages[0]StackAmount) { + if (item->Usages[0]MaxStackAmount) { return (int) i; } } @@ -1398,7 +1398,7 @@ void Inventory::AddSlotItemRes(const ieResRef ItemResRef, int SlotID, int Charge TmpItem->Usages[1]=(ieWord) Charge1; TmpItem->Usages[2]=(ieWord) Charge2; TmpItem->Flags=0; - if (core->ResolveRandomItem(TmpItem) && gamedata->Exists(TmpItem->ItemResRef, IE_ITM_CLASS_ID)) { + if (core->ResolveRandomItem(TmpItem)) { AddSlotItem( TmpItem, SlotID ); } else { delete TmpItem; @@ -1416,7 +1416,7 @@ void Inventory::SetSlotItemRes(const ieResRef ItemResRef, int SlotID, int Charge TmpItem->Usages[1]=(ieWord) Charge1; TmpItem->Usages[2]=(ieWord) Charge2; TmpItem->Flags=0; - if (core->ResolveRandomItem(TmpItem) && gamedata->Exists(TmpItem->ItemResRef, IE_ITM_CLASS_ID)) { + if (core->ResolveRandomItem(TmpItem)) { SetSlotItem( TmpItem, SlotID ); } else { delete TmpItem; @@ -1448,7 +1448,7 @@ void Inventory::BreakItemSlot(ieDword slot) void Inventory::dump() { - printf( "INVENTORY:\n" ); + print( "INVENTORY:\n" ); for (unsigned int i = 0; i < Slots.size(); i++) { CREItem* itm = Slots[i]; @@ -1456,13 +1456,13 @@ void Inventory::dump() continue; } - printf ( "%2u: %8.8s - (%d %d %d) Fl:0x%x Wt: %d x %dLb\n", i, itm->ItemResRef, itm->Usages[0], itm->Usages[1], itm->Usages[2], itm->Flags, itm->StackAmount, itm->Weight ); + print ( "%2u: %8.8s - (%d %d %d) Fl:0x%x Wt: %d x %dLb\n", i, itm->ItemResRef, itm->Usages[0], itm->Usages[1], itm->Usages[2], itm->Flags, itm->MaxStackAmount, itm->Weight ); } - printf( "Equipped: %d\n", Equipped ); + print( "Equipped: %d\n", Equipped ); Changed = true; CalculateWeight(); - printf( "Total weight: %d\n", Weight ); + print( "Total weight: %d\n", Weight ); } void Inventory::EquipBestWeapon(int flags) @@ -1795,7 +1795,7 @@ void Inventory::ChargeAllItems(int hours) } } -#define ITM_STEALING (IE_INV_ITEM_UNSTEALABLE | IE_INV_ITEM_MOVABLE | IE_INV_ITEM_EQUIPPED) +#define ITM_STEALING (IE_INV_ITEM_UNSTEALABLE | IE_INV_ITEM_MOVABLE | IE_INV_ITEM_EQUIPPED) //0x442 unsigned int Inventory::FindStealableItem() { unsigned int slot; @@ -1804,7 +1804,7 @@ unsigned int Inventory::FindStealableItem() slot = core->Roll(1, Slots.size(),-1); inc = slot&1?1:-1; - printf("Start Slot: %d, increment: %d\n", slot, inc); + print("Start Slot: %d, increment: %d\n", slot, inc); //as the unsigned value underflows, it will be greater than Slots.size() for(;slotRange; diff --git a/project/jni/application/gemrb/gemrb/core/Item.h b/project/jni/application/gemrb/gemrb/core/Item.h index d3952689d..31f5fe935 100644 --- a/project/jni/application/gemrb/gemrb/core/Item.h +++ b/project/jni/application/gemrb/gemrb/core/Item.h @@ -180,7 +180,7 @@ public: ieByte unknown3; ieDword KitUsability; ieDword Price; - ieWord StackAmount; + ieWord MaxStackAmount; ieResRef ItemIcon; ieWord LoreToID; ieResRef GroundIcon; diff --git a/project/jni/application/gemrb/gemrb/core/ItemMgr.h b/project/jni/application/gemrb/gemrb/core/ItemMgr.h index 10136897d..7bcfbc70e 100644 --- a/project/jni/application/gemrb/gemrb/core/ItemMgr.h +++ b/project/jni/application/gemrb/gemrb/core/ItemMgr.h @@ -41,7 +41,7 @@ class GEM_EXPORT ItemMgr : public Plugin { public: ItemMgr(void); virtual ~ItemMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Item* GetItem(Item *s) = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/KeyMap.cpp b/project/jni/application/gemrb/gemrb/core/KeyMap.cpp new file mode 100644 index 000000000..814ee56ba --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/KeyMap.cpp @@ -0,0 +1,157 @@ +/* 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 "KeyMap.h" +#include "win32def.h" +#include "Interface.h" +#include "TableMgr.h" +#include "ScriptEngine.h" +#include "System/FileStream.h" + +#define KEYLENGTH 64 + +Function::Function(const char *m, const char *f, int g) +{ + strncpy(module, m, sizeof(module)); + strncpy(function, f, sizeof(function)); + group = g; +} + +KeyMap::KeyMap() +{ + keymap.SetType(GEM_VARIABLES_POINTER); +} + +void ReleaseFunction(void *fun) +{ + delete (Function *) fun; +} + +KeyMap::~KeyMap() +{ + keymap.RemoveAll(ReleaseFunction); +} + +bool KeyMap::InitializeKeyMap(const char *inifile, const char *tablefile) +{ + AutoTable kmtable(tablefile); + + if (!kmtable) { + return false; + } + + char tINIkeymap[_MAX_PATH]; + PathJoin( tINIkeymap, core->GamePath, inifile, NULL ); + FileStream* config = FileStream::OpenFile( tINIkeymap ); + + if (config == NULL) { + printMessage("KeyMap","There is no '%s' file...\n", YELLOW, inifile); + return false; + } + char name[KEYLENGTH+1], 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; + + //ignore possible space after the =, sadly we cannot do the same with + //spaces before it + if (sscanf( line, "%[^=]= %[^\r\n]", name, value )!=2) + continue; + + strnlwrcpy(name,name,KEYLENGTH); + //remove trailing spaces (bg1 ini file contains them) + char *nameend = name + strlen( name ) - 1; + while (nameend >= name && strchr( " \t\r\n", *nameend )) { + *nameend-- = '\0'; + } + + //change internal spaces to underscore + for(int c=0;c1 || keymap.Lookup(value, tmp) ) { + print("Ignoring key %s\n", value); + continue; + } + + const char *module; + const char *function; + const char *group; + + if (kmtable->GetRowIndex(name)>=0 ) { + module = kmtable->QueryField(name, "MODULE"); + function = kmtable->QueryField(name, "FUNCTION"); + group = kmtable->QueryField(name, "GROUP"); + } else { + module = kmtable->QueryField("Default","MODULE"); + function = kmtable->QueryField("Default","FUNCTION"); + group = kmtable->QueryField("Default","GROUP"); + } + fun = new Function(module, function, atoi(group)); + keymap.SetAt(value, fun); + print("Adding key %s with function %s::%s\n", value, module, function); + } + delete config; + return true; +} + +//group can be: +//main gamecontrol +void KeyMap::ResolveKey(int key, int group) +{ + Function *fun; + void *tmp; + char keystr[2]; + + keystr[0]=(char) key; + keystr[1]=0; + + print("Looking up key: %c (%s) \n", key, keystr); + + if (!keymap.Lookup(keystr, tmp) ) { + return; + } + fun = (Function *) tmp; + + if (fun->group!=group) { + return; + } + + printMessage("KeyMap", " ", WHITE); + print("RunFunction(%s::%s)\n",fun->module, fun->function); + core->GetGUIScriptEngine()->RunFunction(fun->module, fun->function); +} + diff --git a/project/jni/application/gemrb/gemrb/core/KeyMap.h b/project/jni/application/gemrb/gemrb/core/KeyMap.h new file mode 100644 index 000000000..816796358 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/KeyMap.h @@ -0,0 +1,48 @@ +/* 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. + * + * + */ + +#ifndef KEYMAP_H +#define KEYMAP_H + +#include "exports.h" +#include "Variables.h" + +class Variables; + +class GEM_EXPORT KeyMap { +private: + Variables keymap; +public: + KeyMap(); + ~KeyMap(); + bool InitializeKeyMap(const char *inifile, const char *keyfile); + void ResolveKey(int key, int group); +}; + +class Function { +public: + char module[16]; + char function[32]; + int group; + + Function(const char *m, const char *f, int g); +}; + +#endif diff --git a/project/jni/application/gemrb/gemrb/core/Makefile.am b/project/jni/application/gemrb/gemrb/core/Makefile.am index 26bea7942..72897f446 100644 --- a/project/jni/application/gemrb/gemrb/core/Makefile.am +++ b/project/jni/application/gemrb/gemrb/core/Makefile.am @@ -51,15 +51,18 @@ libgemrb_core_la_SOURCES = \ GameScript/Objects.cpp \ GameScript/Triggers.cpp \ GlobalTimer.cpp \ + FileCache.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 \ @@ -69,6 +72,7 @@ libgemrb_core_la_SOURCES = \ PalettedImageMgr.cpp \ Particles.cpp \ Plugin.cpp \ + PluginLoader.cpp \ PluginMgr.cpp \ Polygon.cpp \ Projectile.cpp \ @@ -99,10 +103,12 @@ libgemrb_core_la_SOURCES = \ StoreMgr.cpp \ StringMgr.cpp \ SymbolMgr.cpp \ - System/CachedFileStream.cpp \ System/DataStream.cpp \ System/FileStream.cpp \ + System/Logging.cpp \ System/MemoryStream.cpp \ + System/SlicedStream.cpp \ + System/String.cpp \ System/VFS.cpp \ TableMgr.cpp \ Tile.cpp \ diff --git a/project/jni/application/gemrb/gemrb/core/Map.cpp b/project/jni/application/gemrb/gemrb/core/Map.cpp index f89036c80..4610c7c4a 100644 --- a/project/jni/application/gemrb/gemrb/core/Map.cpp +++ b/project/jni/application/gemrb/gemrb/core/Map.cpp @@ -30,6 +30,7 @@ #include "DisplayMessage.h" #include "Game.h" #include "GameData.h" +#include "IniSpawn.h" #include "Interface.h" #include "MapMgr.h" #include "MusicMgr.h" @@ -37,6 +38,7 @@ #include "Palette.h" #include "Particles.h" #include "PathFinder.h" +#include "PluginMgr.h" #include "Projectile.h" #include "ScriptedAnimation.h" #include "TileMap.h" @@ -45,6 +47,7 @@ #include "strrefs.h" #include "GameScript/GSUtils.h" #include "GUI/GameControl.h" +#include "GUI/Window.h" #include "Scriptable/Container.h" #include "Scriptable/Door.h" #include "Scriptable/InfoPoint.h" @@ -73,7 +76,7 @@ static int LargeFog; static TerrainSounds *terrainsounds=NULL; static int tsndcount = -1; -void ReleaseSpawnGroup(void *poi) +static void ReleaseSpawnGroup(void *poi) { delete (SpawnGroup *) poi; } @@ -95,7 +98,7 @@ void Map::ReleaseMemory() } } -inline static AnimationObjectType SelectObject(Actor *actor, int q, AreaAnimation *a, ScriptedAnimation *sca, Particles *spark, Projectile *pro) +static inline AnimationObjectType SelectObject(Actor *actor, int q, AreaAnimation *a, ScriptedAnimation *sca, Particles *spark, Projectile *pro) { int actorh; if (actor) { @@ -148,7 +151,7 @@ inline static AnimationObjectType SelectObject(Actor *actor, int q, AreaAnimatio //returns true if creature must be embedded in the area //npcs in saved game shouldn't be embedded either -inline static bool MustSave(Actor *actor) +static inline bool MustSave(Actor *actor) { if (actor->Persistent()) { return false; @@ -159,7 +162,7 @@ inline static bool MustSave(Actor *actor) } //Preload spawn group entries (creature resrefs that reference groups of creatures) -void InitSpawnGroups() +static void InitSpawnGroups() { ieResRef GroupName; int i; @@ -193,7 +196,7 @@ void InitSpawnGroups() } //Preload the searchmap configuration -void InitPathFinder() +static void InitPathFinder() { PathFinderInited = true; tsndcount = 0; @@ -229,7 +232,7 @@ void InitPathFinder() } } -void AddLOS(int destx, int desty, int slot) +static void AddLOS(int destx, int desty, int slot) { for (int i=0;iHasFeature(GF_SMALL_FOG); @@ -466,8 +469,7 @@ void Map::MoveToNewArea(const char *area, const char *entrance, unsigned int dir } Map* map = game->GetMap(area, false); if (!map) { - printMessage("Map", " ", LIGHT_RED); - printf("Invalid map: %s\n",area); + printMessage("Map", "Invalid map: %s\n", LIGHT_RED, area); command[0]=0; return; } @@ -494,8 +496,8 @@ void Map::MoveToNewArea(const char *area, const char *entrance, unsigned int dir Y = map->TMap->YCellCount * 32; } else { // crashes in original engine - printMessage("Map", " ", YELLOW); - printf( "WARNING!!! EntryPoint '%s' does not exist and direction %d is invalid\n", entrance, direction ); + printMessage("Map", "WARNING!!! EntryPoint '%s' does not exist and direction %d is invalid\n", YELLOW, + entrance, direction); X = map->TMap->XCellCount * 64; Y = map->TMap->YCellCount * 64; } @@ -516,7 +518,7 @@ void Map::MoveToNewArea(const char *area, const char *entrance, unsigned int dir pc->ClearPath(); pc->ClearActions(); pc->AddAction( GenerateAction( command ) ); - pc->ProcessActions(true); + pc->ProcessActions(); } } return; @@ -534,7 +536,7 @@ void Map::MoveToNewArea(const char *area, const char *entrance, unsigned int dir pc->ClearPath(); pc->ClearActions(); pc->AddAction( GenerateAction( command ) ); - pc->ProcessActions(true); + pc->ProcessActions(); } } return; @@ -543,7 +545,7 @@ void Map::MoveToNewArea(const char *area, const char *entrance, unsigned int dir actor->ClearPath(); actor->ClearActions(); actor->AddAction( GenerateAction( command ) ); - actor->ProcessActions(true); + actor->ProcessActions(); } void Map::UseExit(Actor *actor, InfoPoint *ip) @@ -572,9 +574,10 @@ void Map::UseExit(Actor *actor, InfoPoint *ip) return; } if (ip->Scripts[0]) { - ip->LastTriggerObject = ip->LastTrigger = ip->LastEntered = actor->GetGlobalID(); + ip->AddTrigger(TriggerEntry(trigger_entered, actor->GetGlobalID())); + // FIXME ip->ExecuteScript( 1 ); - ip->ProcessActions(true); + ip->ProcessActions(); } } @@ -626,19 +629,20 @@ void Map::UpdateScripts() } // fuzzie added this check because some area scripts (eg, AR1600 when - // escaping Brynnlaw) were executing after they were meant to be done, + // escaping Brynnlaw) were executing after they were meant to be done, // and this seems the nicest way of handling that for now - it's quite // possibly wrong (so if you have problems, revert this and find // another way) if (has_pcs) { //Run all the Map Scripts (as in the original) //The default area script is in the last slot anyway - ExecuteScript( MAX_SCRIPTS ); + //ExecuteScript( MAX_SCRIPTS ); + Update(); } - + //Execute Pending Actions //if it is only here, then the drawing will fail - ProcessActions(false); + ProcessActions(); // If scripts frozen, return. // This fixes starting a new IWD game. The above ProcessActions pauses the @@ -650,8 +654,11 @@ void Map::UpdateScripts() int q=Qcount[PR_SCRIPT]; Game *game = core->GetGame(); + bool timestop = game->IsTimestopActive(); + if (!timestop) { + game->timestop_owner = NULL; + } Actor *timestop_owner = game->timestop_owner; - bool timestop = game->timestop_end>game->GameTime; while (q--) { Actor* actor = queue[PR_SCRIPT][q]; @@ -660,8 +667,9 @@ void Map::UpdateScripts() actor->no_more_steps = true; continue; } - if (timestop && actor!=timestop_owner && actor->Modified[IE_DISABLETIMESTOP] ) { + if (timestop && actor!=timestop_owner && actor->Modified[IE_DISABLETIMESTOP] == 0) { actor->no_more_steps = true; + actor->ClearPath(); //HACK: prevents jumping when timestop ends continue; } @@ -679,6 +687,9 @@ void Map::UpdateScripts() } } actor->no_more_steps = false; + if (actor->Immobile()) { + actor->ClearPath(); //HACK: prevents jumping when effect ends + } /* * we run scripts all at once because one of the actions in ProcessActions @@ -691,7 +702,7 @@ void Map::UpdateScripts() * point, etc), but i did it this way for now because it seems least painful * and we should probably be staggering the script executions anyway */ - actor->ExecuteScript( MAX_SCRIPTS ); + actor->Update(); } @@ -707,8 +718,6 @@ void Map::UpdateScripts() Actor* actor = queue[PR_SCRIPT][q]; if (actor->no_more_steps) continue; - actor->ProcessActions(false); - actor->UpdateActorState(game->GameTime); actor->inventory.CalculateWeight(); @@ -731,7 +740,7 @@ void Map::UpdateScripts() } else if (avatar->WalkScale) { speed = avatar->WalkScale; } else { - //printf("no walkscale for anim %d!\n", actor->BaseStats[IE_ANIMATION_ID]); + //print("no walkscale for anim %d!\n", actor->BaseStats[IE_ANIMATION_ID]); } } } @@ -767,10 +776,7 @@ void Map::UpdateScripts() Door* door = TMap->GetDoor( doorCount++ ); if (!door) break; - if (door->Scripts[0]) - door->ExecuteScript( 1 ); - //Execute Pending Actions - door->ProcessActions(false); + door->Update(); } //Check if we need to start some container scripts @@ -779,10 +785,7 @@ void Map::UpdateScripts() Container* container = TMap->GetContainer( containerCount++ ); if (!container) break; - if (container->Scripts[0]) - container->ExecuteScript( 1 ); - //Execute Pending Actions - container->ProcessActions(false); + container->Update(); } //Check if we need to start some trap scripts @@ -799,15 +802,7 @@ void Map::UpdateScripts() //If this InfoPoint is a Switch Trigger if (ip->Type == ST_TRIGGER) { - //Check if this InfoPoint was activated - if (ip->LastTrigger) { - if (wasActive && ip->Scripts[0]) { - //Run the InfoPoint script - ip->ExecuteScript( 1 ); - } - } - //Execute Pending Actions - ip->ProcessActions(false); + ip->Update(); continue; } @@ -844,14 +839,12 @@ void Map::UpdateScripts() } if (wasActive) { - ip->ExecuteScript( 1 ); //Play the PST specific enter sound if (wasActive&TRAP_USEPOINT) { core->GetAudioDrv()->Play(ip->EnterWav, ip->TrapLaunch.x, ip->TrapLaunch.y); } + ip->Update(); } - //Execute Pending Actions - ip->ProcessActions(false); } } @@ -862,7 +855,7 @@ void Map::ResolveTerrainSound(ieResRef &sound, Point &Pos) { memcpy(sound, terrainsounds[i].Sounds[type], sizeof(ieResRef) ); return; } - } + } } bool Map::DoStepForActor(Actor *actor, int speed, ieDword time) { @@ -1069,7 +1062,15 @@ void Map::DrawMap(Region screen) } if (!bgoverride) { - int rain; + int rain, flags; + + if (game->IsTimestopActive()) { + flags = TILE_GREY; + } + else if (AreaFlags&AF_DREAM) { + flags = TILE_SEPIA; + } else flags = 0; + if (HasWeather()) { //zero when the weather particles are all gone rain = game->weather->GetPhase()-P_EMPTY; @@ -1077,13 +1078,12 @@ void Map::DrawMap(Region screen) rain = 0; } - TMap->DrawOverlays( screen, rain ); + TMap->DrawOverlays( screen, rain, flags ); //Draw Outlines DrawHighlightables( screen ); } - Region vp = video->GetViewport(); //if it is only here, then the scripting will fail? GenerateQueues(); SortQueues(); @@ -1261,11 +1261,10 @@ void Map::AddAnimation(AreaAnimation* panim) anim->InitAnimation(); aniIterator iter; - + int Height = anim->GetHeight(); -printf("Adding %s at height %d, Pos: %d.%d\n", anim->Name, Height, anim->Pos.x, anim->Pos.y); for(iter=animations.begin(); (iter!=animations.end()) && ((*iter)->GetHeight()AddTrigger(TriggerEntry(trigger_heard, actor->GetGlobalID(), shoutID)); listener->LastHeard = actor->GetGlobalID(); - listener->LastShout = shoutID; } else { + listener->AddTrigger(TriggerEntry(trigger_help, actor->GetGlobalID())); listener->LastHelp = actor->GetGlobalID(); } } @@ -2122,30 +2122,30 @@ void Map::DebugDump(bool show_actors) const { size_t i; - printf( "DebugDump of Area %s:\n", scriptName ); - printf ("Scripts:"); + print( "DebugDump of Area %s:\n", scriptName ); + print ("Scripts:"); for (i = 0; i < MAX_SCRIPTS; i++) { const char* poi = ""; if (Scripts[i]) { poi = Scripts[i]->GetName(); } - printf( " %.8s", poi ); + print( " %.8s", poi ); } - printf( "Area Global ID: %d\n", GetGlobalID()); - printf( "OutDoor: %s\n", YESNO(AreaType & AT_OUTDOOR ) ); - printf( "Day/Night: %s\n", YESNO(AreaType & AT_DAYNIGHT ) ); - printf( "Extended night: %s\n", YESNO(AreaType & AT_EXTENDED_NIGHT ) ); - printf( "Weather: %s\n", YESNO(AreaType & AT_WEATHER ) ); - printf( "Area Type: %d\n", AreaType & (AT_CITY|AT_FOREST|AT_DUNGEON) ); - printf( "Can rest: %s\n", YESNO(AreaType & AT_CAN_REST) ); + print( "Area Global ID: %d\n", GetGlobalID()); + print( "OutDoor: %s\n", YESNO(AreaType & AT_OUTDOOR ) ); + print( "Day/Night: %s\n", YESNO(AreaType & AT_DAYNIGHT ) ); + print( "Extended night: %s\n", YESNO(AreaType & AT_EXTENDED_NIGHT ) ); + print( "Weather: %s\n", YESNO(AreaType & AT_WEATHER ) ); + print( "Area Type: %d\n", AreaType & (AT_CITY|AT_FOREST|AT_DUNGEON) ); + print( "Can rest: %s\n", YESNO(AreaType & AT_CAN_REST) ); if (show_actors) { - printf("\n"); + print("\n"); i = actors.size(); while (i--) { if (!(actors[i]->GetInternalFlag()&(IF_JUSTDIED|IF_REALLYDIED))) { - printf("Actor: %s at %d.%d\n", actors[i]->GetName(1), actors[i]->Pos.x, actors[i]->Pos.y); + print("Actor: %s at %d.%d\n", actors[i]->GetName(1), actors[i]->Pos.x, actors[i]->Pos.y); } } } @@ -2326,7 +2326,7 @@ PathNode* Map::RunAway(const Point &s, const Point &d, unsigned int size, unsign unsigned int Cost = MapSet[y * Width + x] + NormalCost; if (Cost > PathLen) { - //printf("Path not found!\n"); + //print("Path not found!\n"); break; } SetupNode( x - 1, y - 1, size, Cost ); @@ -2669,12 +2669,12 @@ PathNode* Map::FindPath(const Point &s, const Point &d, unsigned int size, int M if (pos == pos2) { //We've found _a_ path - //printf("GOAL!!!\n"); + //print("GOAL!!!\n"); break; } unsigned int Cost = MapSet[y * Width + x] + NormalCost; if (Cost > 65500) { - //printf("Path not found!\n"); + //print("Path not found!\n"); break; } SetupNode( x - 1, y - 1, size, Cost ); @@ -2828,8 +2828,8 @@ int Map::WhichEdge(const Point &s) unsigned int sX=s.x/16; unsigned int sY=s.y/12; if (!(GetBlocked( sX, sY )&PATH_MAP_TRAVEL)) { - printMessage("Map"," ",YELLOW); - printf("This isn't a travel region [%d.%d]?\n",sX, sY); + printMessage("Map", "This isn't a travel region [%d.%d]?\n", YELLOW, + sX, sY); return -1; } sX*=Height; @@ -3498,7 +3498,7 @@ Animation *AreaAnimation::GetAnimationPiece(AnimationFactory *af, int animCycle) if (!anim) anim = af->GetCycle( 0 ); if (!anim) { - printf("Cannot load animation: %s\n", BAM); + print("Cannot load animation: %s\n", BAM); return NULL; } //this will make the animation stop when the game is stopped @@ -3520,7 +3520,7 @@ void AreaAnimation::InitAnimation() AnimationFactory* af = ( AnimationFactory* ) gamedata->GetFactoryResource( BAM, IE_BAM_CLASS_ID ); if (!af) { - printf("Cannot load animation: %s\n", BAM); + print("Cannot load animation: %s\n", BAM); return; } @@ -3664,15 +3664,20 @@ void Map::SeeSpellCast(Scriptable *caster, ieDword spell) return; } - LastCasterSeen = caster->GetGlobalID(); - LastSpellSeen = spell; + // FIXME: this seems clearly wrong, but matches old gemrb behaviour + unsigned short triggerType = trigger_spellcast; + if (spell >= 3000) + triggerType = trigger_spellcastinnate; + else if (spell < 2000) + triggerType = trigger_spellcastpriest; + + caster->AddTrigger(TriggerEntry(triggerType, caster->GetGlobalID(), spell)); size_t i = actors.size(); while (i--) { Actor* witness = actors[i]; if (CanSee(witness, caster, true, 0)) { - witness->LastSpellSeen=LastSpellSeen; - witness->LastCasterSeen=LastCasterSeen; + caster->AddTrigger(TriggerEntry(triggerType, caster->GetGlobalID(), spell)); } } } diff --git a/project/jni/application/gemrb/gemrb/core/Map.h b/project/jni/application/gemrb/gemrb/core/Map.h index 7e830c6f0..68e24634c 100644 --- a/project/jni/application/gemrb/gemrb/core/Map.h +++ b/project/jni/application/gemrb/gemrb/core/Map.h @@ -26,10 +26,6 @@ class Map; #include "exports.h" #include "globals.h" -#include "Bitmap.h" -#include "Image.h" -#include "IniSpawn.h" -#include "SpriteCover.h" #include "Scriptable/Scriptable.h" #include @@ -38,11 +34,17 @@ class Actor; class Ambient; class Animation; class AnimationFactory; +class Bitmap; +class CREItem; class GameControl; +class Image; +class IniSpawn; +class Palette; class Particles; struct PathNode; class Projectile; class ScriptedAnimation; +class SpriteCover; class TileMap; class Wall_Polygon; diff --git a/project/jni/application/gemrb/gemrb/core/MapMgr.h b/project/jni/application/gemrb/gemrb/core/MapMgr.h index c709e707f..a6d5fd63f 100644 --- a/project/jni/application/gemrb/gemrb/core/MapMgr.h +++ b/project/jni/application/gemrb/gemrb/core/MapMgr.h @@ -27,10 +27,10 @@ #ifndef MAPMGR_H #define MAPMGR_H -#include "Map.h" #include "Plugin.h" -#include "Scriptable/Scriptable.h" -#include "System/DataStream.h" + +class DataStream; +class Map; /** * @class MapMgr @@ -41,7 +41,7 @@ class GEM_EXPORT MapMgr : public Plugin { public: MapMgr(void); virtual ~MapMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual bool ChangeMap(Map *map, bool day_or_night) = 0; virtual Map* GetMap(const char* ResRef, bool day_or_night) = 0; diff --git a/project/jni/application/gemrb/gemrb/core/Palette.cpp b/project/jni/application/gemrb/gemrb/core/Palette.cpp index 11690f119..62f5e8299 100644 --- a/project/jni/application/gemrb/gemrb/core/Palette.cpp +++ b/project/jni/application/gemrb/gemrb/core/Palette.cpp @@ -46,6 +46,16 @@ void Palette::CreateShadedAlphaChannel() } alpha = true; } + +void Palette::Brighten() +{ + for (int i = 0; i<256;i++) { + col[i].r = (col[i].r+256)/2; + col[i].g = (col[i].g+256)/2; + col[i].b = (col[i].b+256)/2; + col[i].a = (col[i].a+256)/2; + } +} Palette* Palette::Copy() { diff --git a/project/jni/application/gemrb/gemrb/core/Palette.h b/project/jni/application/gemrb/gemrb/core/Palette.h index ba857d173..c610d34fb 100644 --- a/project/jni/application/gemrb/gemrb/core/Palette.h +++ b/project/jni/application/gemrb/gemrb/core/Palette.h @@ -85,6 +85,7 @@ public: } void CreateShadedAlphaChannel(); + void Brighten(); void SetupPaperdollColours(const ieDword* Colors, unsigned int type); void SetupRGBModification(const Palette* src, const RGBModifier* mods, diff --git a/project/jni/application/gemrb/gemrb/core/Particles.cpp b/project/jni/application/gemrb/gemrb/core/Particles.cpp index ce3195fbe..0b804e397 100644 --- a/project/jni/application/gemrb/gemrb/core/Particles.cpp +++ b/project/jni/application/gemrb/gemrb/core/Particles.cpp @@ -20,9 +20,11 @@ #include "Particles.h" -#include "Interface.h" -#include "Video.h" +#include "CharAnimations.h" #include "Game.h" +#include "Interface.h" +#include "TableMgr.h" +#include "Video.h" Color sparkcolors[MAX_SPARK_COLOR][MAX_SPARK_PHASE]; bool inited = false; @@ -31,7 +33,7 @@ bool inited = false; static int spark_color_indices[SPARK_COUNT]={12,5,0,6,1,8,2,7,9,3,4,10,11}; -void TranslateColor(const char *value, Color &color) +static void TranslateColor(const char *value, Color &color) { int r = 0; int g = 0; @@ -50,7 +52,7 @@ void TranslateColor(const char *value, Color &color) color.b=b; } -void InitSparks() +static void InitSparks() { int i,j; AutoTable tab("sprklclr"); diff --git a/project/jni/application/gemrb/gemrb/core/Plugin.h b/project/jni/application/gemrb/gemrb/core/Plugin.h index 12121035c..b565ddd89 100644 --- a/project/jni/application/gemrb/gemrb/core/Plugin.h +++ b/project/jni/application/gemrb/gemrb/core/Plugin.h @@ -31,7 +31,6 @@ #include "exports.h" #include "Holder.h" -#include "PluginMgr.h" #include "TypeID.h" #include @@ -47,19 +46,4 @@ public: virtual ~Plugin(void); }; -template -class PluginHolder : public Holder { -public: - PluginHolder() - { - } - PluginHolder(PluginID id) - : Holder(static_cast(PluginMgr::Get()->GetPlugin(id))) - { - } - ~PluginHolder() - { - } -}; - #endif diff --git a/project/jni/application/gemrb/gemrb/core/PluginLoader.cpp b/project/jni/application/gemrb/gemrb/core/PluginLoader.cpp new file mode 100644 index 000000000..e6d8ac358 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/PluginLoader.cpp @@ -0,0 +1,239 @@ +/* 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 "PluginLoader.h" + +#include "SClassID.h" // For PluginID +#include "win32def.h" + +#include "Variables.h" +#include "Interface.h" +#include "PluginMgr.h" + +#include +#include +#include +#include + +#ifdef WIN32 +#include +#include +#else +#include +#include +#include +#include +#endif + +#ifdef WIN32 +typedef HMODULE LibHandle; +#else +typedef void *LibHandle; +#endif + +class PluginMgr; + +struct PluginDesc { + LibHandle handle; + PluginID ID; + const char *Description; + bool (*Register)(PluginMgr*); +}; + +typedef const char* (*Version_t)(void); +typedef const char* (*Description_t)(void); +typedef PluginID (*ID_t)(); +typedef bool (* Register_t)(PluginMgr*); + +#ifdef HAVE_FORBIDDEN_OBJECT_TO_FUNCTION_CAST +#include +typedef void *(* voidvoid)(void); +static inline voidvoid my_dlsym(void *handle, const char *symbol) +{ + void *value = dlsym(handle,symbol); + voidvoid ret; + assert(sizeof(ret)==sizeof(value) ); + memcpy(&ret, &value, sizeof(ret) ); + return ret; +} +#else +#define my_dlsym dlsym +#endif + +#ifdef WIN32 +#define FREE_PLUGIN( handle ) FreeLibrary( handle ) +#define GET_PLUGIN_SYMBOL( handle, name ) GetProcAddress( handle, name ) +#define PRINT_DLERROR +#else +#define FREE_PLUGIN( handle ) dlclose( handle ) +#define GET_PLUGIN_SYMBOL( handle, name ) my_dlsym( handle, name ) +#define PRINT_DLERROR print( "%s\n", dlerror() ) +#endif + +/** Return names of all *.so or *.dll files in the given directory */ +#ifdef WIN32 +static bool FindFiles( char* path, std::list &files ) +{ + //The windows _findfirst/_findnext functions allow the use of wildcards so we'll use them :) + struct _finddata_t c_file; + long hFile; + strcat( path, "*.dll" ); + if (( hFile = ( long ) _findfirst( path, &c_file ) ) == -1L) //If there is no file matching our search + return false; + + do { + files.push_back( strdup( c_file.name )); + } while (_findnext( hFile, &c_file ) == 0); + + _findclose( hFile ); + return true; +} + +#else // ! WIN32 + +bool static FindFiles( char* path, std::list &files ) +{ + DirectoryIterator dir(path); + if (!dir) //If we cannot open the Directory + return false; + + do { + const char *name = dir.GetName(); + if (fnmatch( "*.so", name, 0 ) != 0) //If the current file has no ".so" extension, skip it + continue; + files.push_back( strdup( name )); + } while (++dir); + + return true; +} +#endif // ! WIN32 + +void LoadPlugins(char* pluginpath) +{ + std::set libs; + + printMessage("PluginMgr", "Loading Plugins from %s\n", WHITE, pluginpath); + + char path[_MAX_PATH]; + strcpy( path, pluginpath ); + + std::list< char * > files; + if (! FindFiles( path, files )) + return; + + //Iterate through all the available modules to load + int file_count = files.size (); // keeps track of first-pass files + while (! files.empty()) { + char* file = files.front(); + files.pop_front(); + file_count--; + + PathJoin( path, pluginpath, file, NULL ); + printBracket( "PluginMgr", LIGHT_WHITE ); + print( ": Loading: " ); + textcolor( LIGHT_WHITE ); + print( "%s", path ); + textcolor( WHITE ); + print( "..." ); + + + ieDword flags = 0; + core->plugin_flags->Lookup (file, flags); + + // module is sent to the back + if ((flags == PLF_DELAY) && (file_count >= 0)) { + printStatus( "DELAYING", YELLOW ); + files.push_back( file ); + continue; + } + + // We do not need the basename anymore now + free( file ); + + // module is skipped + if (flags == PLF_SKIP) { + printStatus( "SKIPPING", YELLOW ); + continue; + } + + + + // Try to load the Module +#ifdef WIN32 + HMODULE hMod = LoadLibrary( path ); +#else + // Note: the RTLD_GLOBAL is necessary to export symbols to modules + // which python may have to dlopen (-wjp, 20060716) + // (to reproduce, try 'import bz2' or another .so module) + void* hMod = dlopen( path, RTLD_NOW | RTLD_GLOBAL ); +#endif + if (hMod == NULL) { + printBracket( "ERROR", LIGHT_RED ); + print( "\nCannot Load Module, Skipping...\n" ); + PRINT_DLERROR; + continue; + } + + //printStatus( "OK", LIGHT_GREEN ); + //using C bindings, so we don't need to jump through extra hoops + //with the symbol name + Version_t LibVersion = ( Version_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Version" ); + Description_t Description = ( Description_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Description" ); + ID_t ID = ( ID_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_ID" ); + Register_t Register = ( Register_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Register" ); + + //printMessage( "PluginMgr", "Checking Plugin Version...", WHITE ); + if (LibVersion==NULL) { + printStatus( "ERROR", LIGHT_RED ); + print( "Invalid Plug-in, Skipping...\n" ); + FREE_PLUGIN( hMod ); + continue; + } + if (strcmp(LibVersion(), VERSION_GEMRB) ) { + printStatus( "ERROR", LIGHT_RED ); + print( "Plug-in Version not valid, Skipping...\n" ); + FREE_PLUGIN( hMod ); + continue; + } + + PluginDesc desc = { hMod, ID(), Description(), Register }; + + //printStatus( "OK", LIGHT_GREEN ); + //printMessage( "PluginMgr", "Loading Exports for ", WHITE ); + print( " " ); + textcolor( LIGHT_WHITE ); + print( "%s", desc.Description ); + textcolor( WHITE ); + print( "..." ); + printStatus( "OK", LIGHT_GREEN ); + if (libs.find(desc.ID) != libs.end()) { + printMessage( "PluginMgr", "Plug-in Already Loaded! ", WHITE ); + printStatus( "SKIPPING", YELLOW ); + FREE_PLUGIN( hMod ); + continue; + } + if (desc.Register != NULL) { + if (!desc.Register(PluginMgr::Get())) { + printMessage( "PluginMgr", "Plug-in Registration Failed! Perhaps a duplicate? ", WHITE ); + printStatus( "SKIPPING", YELLOW ); + FREE_PLUGIN( hMod ); + } + } + libs.insert(desc.ID); + } +} diff --git a/project/jni/application/gemrb/gemrb/core/PluginLoader.h b/project/jni/application/gemrb/gemrb/core/PluginLoader.h new file mode 100644 index 000000000..f68fbc705 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/PluginLoader.h @@ -0,0 +1,32 @@ +/* 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 PLUGINLOADER_H +#define PLUGINLOADER_H + +/** + * Loads GemRB plugins from shared libraries or DLLs. + * + * It goes over all appropriately named files in PluginPath directory + * and tries to load them one after another. + */ +void LoadPlugins(char* pluginpath); + +#endif diff --git a/project/jni/application/gemrb/gemrb/core/PluginMgr.cpp b/project/jni/application/gemrb/gemrb/core/PluginMgr.cpp index 8b31b1551..19d183053 100644 --- a/project/jni/application/gemrb/gemrb/core/PluginMgr.cpp +++ b/project/jni/application/gemrb/gemrb/core/PluginMgr.cpp @@ -14,60 +14,14 @@ * 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 "PluginMgr.h" #include "win32def.h" -#include "Interface.h" #include "Plugin.h" #include "ResourceDesc.h" -#include "Variables.h" // FIXME: this should be in Interface.h instead - -#include -#include -#ifdef WIN32 -#include -#include -#else -#include -#include -#include -#include -#endif - -typedef const char* (*Version_t)(void); -typedef const char* (*Description_t)(void); -typedef PluginID (*ID_t)(); -typedef bool (* Register_t)(PluginMgr*); - -#ifdef HAVE_FORBIDDEN_OBJECT_TO_FUNCTION_CAST -#include -typedef void *(* voidvoid)(void); -inline voidvoid my_dlsym(void *handle, const char *symbol) -{ - void *value = dlsym(handle,symbol); - voidvoid ret; - assert(sizeof(ret)==sizeof(value) ); - memcpy(&ret, &value, sizeof(ret) ); - return ret; -} -#else -#define my_dlsym dlsym -#endif - -#ifdef WIN32 -#define FREE_PLUGIN( handle ) FreeLibrary( handle ) -#define GET_PLUGIN_SYMBOL( handle, name ) GetProcAddress( handle, name ) -#define PRINT_DLERROR -#else -#define FREE_PLUGIN( handle ) dlclose( handle ) -#define GET_PLUGIN_SYMBOL( handle, name ) my_dlsym( handle, name ) -#define PRINT_DLERROR printf( "%s\n", dlerror() ) -#endif PluginMgr *PluginMgr::Get() { @@ -79,172 +33,10 @@ PluginMgr::PluginMgr() { } -void PluginMgr::LoadPlugins(char* pluginpath) +PluginMgr::~PluginMgr() { - printMessage( "PluginMgr", "Loading Plugins from ", WHITE ); - printf( "%s\n", pluginpath ); - - char path[_MAX_PATH]; - strcpy( path, pluginpath ); - - std::list< char * > files; - if (! FindFiles( path, files )) - return; - - //Iterate through all the available modules to load - int file_count = files.size (); // keeps track of first-pass files - while (! files.empty()) { - char* file = files.front(); - files.pop_front(); - file_count--; - - PathJoin( path, pluginpath, file, NULL ); - printBracket( "PluginMgr", LIGHT_WHITE ); - printf( ": Loading: " ); - textcolor( LIGHT_WHITE ); - printf( "%s", path ); - textcolor( WHITE ); - printf( "..." ); - - - ieDword flags = 0; - core->plugin_flags->Lookup (file, flags); - - // module is sent to the back - if ((flags == PLF_DELAY) && (file_count >= 0)) { - printStatus( "DELAYING", YELLOW ); - files.push_back( file ); - continue; - } - - // We do not need the basename anymore now - free( file ); - - // module is skipped - if (flags == PLF_SKIP) { - printStatus( "SKIPPING", YELLOW ); - continue; - } - - - - // Try to load the Module -#ifdef WIN32 - HMODULE hMod = LoadLibrary( path ); -#else - // Note: the RTLD_GLOBAL is necessary to export symbols to modules - // which python may have to dlopen (-wjp, 20060716) - // (to reproduce, try 'import bz2' or another .so module) - void* hMod = dlopen( path, RTLD_NOW | RTLD_GLOBAL ); -#endif - if (hMod == NULL) { - printBracket( "ERROR", LIGHT_RED ); - printf( "\nCannot Load Module, Skipping...\n" ); - PRINT_DLERROR; - continue; - } - - //printStatus( "OK", LIGHT_GREEN ); - //using C bindings, so we don't need to jump through extra hoops - //with the symbol name - Version_t LibVersion = ( Version_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Version" ); - Description_t Description = ( Description_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Description" ); - ID_t ID = ( ID_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_ID" ); - Register_t Register = ( Register_t ) GET_PLUGIN_SYMBOL( hMod, "GemRBPlugin_Register" ); - - //printMessage( "PluginMgr", "Checking Plugin Version...", WHITE ); - if (LibVersion==NULL) { - printStatus( "ERROR", LIGHT_RED ); - printf( "Invalid Plug-in, Skipping...\n" ); - FREE_PLUGIN( hMod ); - continue; - } - if (strcmp(LibVersion(), VERSION_GEMRB) ) { - printStatus( "ERROR", LIGHT_RED ); - printf( "Plug-in Version not valid, Skipping...\n" ); - FREE_PLUGIN( hMod ); - continue; - } - - PluginDesc desc = { hMod, ID(), Description(), Register }; - - //printStatus( "OK", LIGHT_GREEN ); - //printMessage( "PluginMgr", "Loading Exports for ", WHITE ); - printf( " " ); - textcolor( LIGHT_WHITE ); - printf( "%s", desc.Description ); - textcolor( WHITE ); - printf( "..." ); - printStatus( "OK", LIGHT_GREEN ); - if (libs.find(desc.ID) != libs.end()) { - printMessage( "PluginMgr", "Plug-in Already Loaded! ", WHITE ); - printStatus( "SKIPPING", YELLOW ); - FREE_PLUGIN( hMod ); - continue; - } - if (desc.Register != NULL) { - if (!desc.Register(this)) { - printMessage( "PluginMgr", "Plug-in Registration Failed! Perhaps a duplicate? ", WHITE ); - printStatus( "SKIPPING", YELLOW ); - FREE_PLUGIN( hMod ); - } - } - libs[desc.ID] = desc; - } } -PluginMgr::~PluginMgr(void) -{ -//don't free the shared libraries in debug mode, so valgrind can resolve the stack trace -#ifndef _DEBUG - for (unsigned int i = 0; i < libs.size(); i++) { -#ifdef WIN32 - FreeLibrary(libs[i].handle); -#else - // dlclose(libs[i].handle); -#endif - } -#endif -} - -#ifdef WIN32 -bool -PluginMgr::FindFiles( char* path, std::list &files ) -{ - //The windows _findfirst/_findnext functions allow the use of wildcards so we'll use them :) - struct _finddata_t c_file; - long hFile; - strcat( path, "*.dll" ); - if (( hFile = ( long ) _findfirst( path, &c_file ) ) == -1L) //If there is no file matching our search - return false; - - do { - files.push_back( strdup( c_file.name )); - } while (_findnext( hFile, &c_file ) == 0); - - _findclose( hFile ); - return true; -} - -#else // ! WIN32 - -bool -PluginMgr::FindFiles( char* path, std::list &files ) -{ - DirectoryIterator dir(path); - if (!dir) //If we cannot open the Directory - return false; - - do { - const char *name = dir.GetName(); - if (fnmatch( "*.so", name, 0 ) != 0) //If the current file has no ".so" extension, skip it - continue; - files.push_back( strdup( name )); - } while (++dir); - - return true; -} -#endif // ! WIN32 bool PluginMgr::IsAvailable(SClass_ID plugintype) const { diff --git a/project/jni/application/gemrb/gemrb/core/PluginMgr.h b/project/jni/application/gemrb/gemrb/core/PluginMgr.h index ff0d88cf7..8142d00bf 100644 --- a/project/jni/application/gemrb/gemrb/core/PluginMgr.h +++ b/project/jni/application/gemrb/gemrb/core/PluginMgr.h @@ -32,6 +32,7 @@ #include "globals.h" #include "iless.h" #include "win32def.h" +#include "Holder.h" #include "ResourceDesc.h" @@ -40,12 +41,6 @@ #include #include -#ifdef WIN32 -typedef HINSTANCE LibHandle; -#else -typedef void *LibHandle; -#endif - class Plugin; class Resource; class TypeID; @@ -64,19 +59,11 @@ public: public: /** Return global instance of PluginMgr */ static PluginMgr* Get(); - void LoadPlugins(char* pluginpath); private: PluginMgr(); public: // HACK: MSVC6 is buggy. - ~PluginMgr(void); + ~PluginMgr(); private: - struct PluginDesc { - LibHandle handle; - PluginID ID; - const char *Description; - bool (*Register)(PluginMgr*); - }; - std::map< PluginID, PluginDesc> libs; std::map< SClass_ID, PluginFunc> plugins; std::map< const TypeID*, std::vector > resources; /** Array of initializer functions */ @@ -86,12 +73,10 @@ private: typedef std::map driver_map; std::map drivers; public: - /** Return names of all *.so or *.dll files in the given directory */ - bool FindFiles( char* path, std::list< char* > &files); + size_t GetPluginCount() const { return plugins.size(); } bool IsAvailable(SClass_ID plugintype) const; Plugin* GetPlugin(SClass_ID plugintype) const; - size_t GetPluginCount() const { return plugins.size(); } /** * Register class plugin. @@ -150,4 +135,19 @@ public: Plugin* GetDriver(const TypeID* type, const char* name); }; +template +class PluginHolder : public Holder { +public: + PluginHolder() + { + } + PluginHolder(PluginID id) + : Holder(static_cast(PluginMgr::Get()->GetPlugin(id))) + { + } + ~PluginHolder() + { + } +}; + #endif diff --git a/project/jni/application/gemrb/gemrb/core/Polygon.cpp b/project/jni/application/gemrb/gemrb/core/Polygon.cpp index 2128a1d22..860e521be 100644 --- a/project/jni/application/gemrb/gemrb/core/Polygon.cpp +++ b/project/jni/application/gemrb/gemrb/core/Polygon.cpp @@ -123,20 +123,20 @@ bool Gem_Polygon::PointIn(int tx, int ty) const // returns twice the area of triangle a, b, c. // (can also be negative depending on orientation of a,b,c) -inline int area2(const Point& a, const Point& b, const Point& c) +static inline int area2(const Point& a, const Point& b, const Point& c) { return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y); } // return (c is to the left of a-b) -inline bool left(const Point& a, const Point& b, const Point& c) +static inline bool left(const Point& a, const Point& b, const Point& c) { return (area2(a, b, c) > 0); } // { return (c is collinear with a-b) -inline bool collinear(const Point& a, const Point& b, const Point& c) +static inline bool collinear(const Point& a, const Point& b, const Point& c) { return (area2(a, b, c) == 0); } @@ -219,15 +219,13 @@ struct ScanlineInt { }; - void Gem_Polygon::ComputeTrapezoids() { if (count < 3) return; //the loader never should load such a large polygon, //because the polygon count is supposed to be a 16 bit value if (count > 65535) { - printMessage("Polygon", "Invalid Polygon!\n", LIGHT_RED); - abort(); + error("Polygon", "Invalid Polygon!\n"); } trapezoids.clear(); diff --git a/project/jni/application/gemrb/gemrb/core/Projectile.cpp b/project/jni/application/gemrb/gemrb/core/Projectile.cpp index b63f075d8..3d3f3dcb9 100644 --- a/project/jni/application/gemrb/gemrb/core/Projectile.cpp +++ b/project/jni/application/gemrb/gemrb/core/Projectile.cpp @@ -22,12 +22,17 @@ #include "win32def.h" +#include "AnimationFactory.h" #include "Audio.h" #include "DisplayMessage.h" #include "Game.h" #include "GameData.h" +#include "GlobalTimer.h" +#include "Image.h" #include "Interface.h" #include "ProjectileServer.h" +#include "Scriptable/Actor.h" +#include "Sprite2D.h" #include "Video.h" #include @@ -250,14 +255,17 @@ void Projectile::GetPaletteCopy(Animation *anim[], Palette *&pal) } } -void Projectile::SetBlend() +void Projectile::SetBlend(int brighten) { GetPaletteCopy(travel, palette); if (!palette) return; if (!palette->alpha) { palette->CreateShadedAlphaChannel(); - } + } + if (brighten) { + palette->Brighten(); + } } //create another projectile with type-1 (iterate magic missiles and call lightning) @@ -409,8 +417,8 @@ void Projectile::Setup() light = core->GetVideoDriver()->CreateLight(LightX, LightZ); } if (TFlags&PTF_BLEND) { - SetBlend(); - } + SetBlend(TFlags&PTF_BRIGHTEN); + } if (SFlags&PSF_FLYING) { ZPos = FLY_HEIGHT; } diff --git a/project/jni/application/gemrb/gemrb/core/Projectile.h b/project/jni/application/gemrb/gemrb/core/Projectile.h index 16e899d13..19cd794fc 100644 --- a/project/jni/application/gemrb/gemrb/core/Projectile.h +++ b/project/jni/application/gemrb/gemrb/core/Projectile.h @@ -32,6 +32,7 @@ #include "ie_types.h" #include "CharAnimations.h" //contains MAX_ORIENT +#include "EffectQueue.h" #include "Map.h" #include "Palette.h" #include "PathFinder.h" @@ -67,7 +68,8 @@ #define PTF_TINT 8 //tint projectile #define PTF_SHADOW 32 //has shadow bam #define PTF_LIGHT 64 //has light shadow -#define PTF_BLEND 128 //blend colours +#define PTF_BLEND 128 //blend colours (use alpha) +#define PTF_BRIGHTEN 256 //brighten alpha //projectile extended travel flags (gemrb specific) #define PEF_BOUNCE 1 //bounce from walls (lightning bolt) @@ -359,7 +361,7 @@ private: void CreateOrientedAnimations(Animation **anims, AnimationFactory *af, int Seq); void GetPaletteCopy(Animation *anim[], Palette *&pal); void GetSmokeAnim(); - void SetBlend(); + void SetBlend(int brighten); //apply spells and effects on the target, only in single travel mode //area effect projectiles call a separate single travel projectile for each affected target void Payload(); diff --git a/project/jni/application/gemrb/gemrb/core/ProjectileMgr.h b/project/jni/application/gemrb/gemrb/core/ProjectileMgr.h index 2233d1fc4..848e0a59b 100644 --- a/project/jni/application/gemrb/gemrb/core/ProjectileMgr.h +++ b/project/jni/application/gemrb/gemrb/core/ProjectileMgr.h @@ -29,7 +29,7 @@ class GEM_EXPORT ProjectileMgr : public Plugin { public: ProjectileMgr(void); virtual ~ProjectileMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Projectile* GetProjectile( Projectile *) = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/ProjectileServer.cpp b/project/jni/application/gemrb/gemrb/core/ProjectileServer.cpp index c3a2e807f..c08349578 100644 --- a/project/jni/application/gemrb/gemrb/core/ProjectileServer.cpp +++ b/project/jni/application/gemrb/gemrb/core/ProjectileServer.cpp @@ -22,6 +22,7 @@ #include "GameData.h" #include "Interface.h" +#include "PluginMgr.h" #include "ProjectileMgr.h" #include "SymbolMgr.h" @@ -121,7 +122,7 @@ Projectile *ProjectileServer::GetProjectile(unsigned int idx) delete ( str ); return CreateDefaultProjectile(idx); } - if (!sm->Open( str, true )) { + if (!sm->Open(str)) { return CreateDefaultProjectile(idx); } Projectile *pro = new Projectile(); @@ -238,8 +239,7 @@ void ProjectileServer::AddSymbols(Holder projlist) { } if (value >= (unsigned int)projectilecount) { // this should never happen! - printMessage("ProjectileServer","Too high projectilenumber while adding projectiles\n", RED); - abort(); + error("ProjectileServer", "Too high projectilenumber while adding projectiles\n"); } strnuprcpy(projectiles[value].resname, projlist->GetStringIndex(rows), 8); } diff --git a/project/jni/application/gemrb/gemrb/core/ProjectileServer.h b/project/jni/application/gemrb/gemrb/core/ProjectileServer.h index d53f99c12..23212de3c 100644 --- a/project/jni/application/gemrb/gemrb/core/ProjectileServer.h +++ b/project/jni/application/gemrb/gemrb/core/ProjectileServer.h @@ -23,7 +23,6 @@ #include "exports.h" -#include "PluginMgr.h" #include "Projectile.h" class SymbolMgr; diff --git a/project/jni/application/gemrb/gemrb/core/Region.cpp b/project/jni/application/gemrb/gemrb/core/Region.cpp index 0ab46be6b..6bf88e391 100644 --- a/project/jni/application/gemrb/gemrb/core/Region.cpp +++ b/project/jni/application/gemrb/gemrb/core/Region.cpp @@ -27,25 +27,6 @@ Point::Point(void) //memset(this, 0, sizeof(*this)); } -Point::~Point(void) -{ -} - -Point::Point(const Point& pnt) -{ - x=pnt.x; - y=pnt.y; - //memcpy(this, &pnt, sizeof(*this)); -} - -Point& Point::operator=(const Point& pnt) -{ - x = pnt.x; - y = pnt.y; - //memcpy(this, &pnt, sizeof(*this)); - return *this; -} - bool Point::operator==(const Point& pnt) { if (( x == pnt.x ) && ( y == pnt.y )) { @@ -113,27 +94,6 @@ Region::Region(void) x = y = w = h = 0; } -Region::~Region(void) -{ -} - -Region::Region(const Region& rgn) -{ - x = rgn.x; - y = rgn.y; - w = rgn.w; - h = rgn.h; -} - -Region& Region::operator=(const Region& rgn) -{ - x = rgn.x; - y = rgn.y; - w = rgn.w; - h = rgn.h; - return *this; -} - bool Region::operator==(const Region& rgn) { if (( x == rgn.x ) && ( y == rgn.y ) && ( w == rgn.w ) && ( h == rgn.h )) { diff --git a/project/jni/application/gemrb/gemrb/core/Region.h b/project/jni/application/gemrb/gemrb/core/Region.h index 675663b00..759aa8de0 100644 --- a/project/jni/application/gemrb/gemrb/core/Region.h +++ b/project/jni/application/gemrb/gemrb/core/Region.h @@ -39,11 +39,8 @@ class GEM_EXPORT Point { public: Point(void); - Point(const Point& pnt); Point(short x, short y); - ~Point(void); - Point& operator=(const Point& pnt); bool operator==(const Point &pnt); bool operator!=(const Point &pnt); @@ -76,14 +73,11 @@ public: class GEM_EXPORT Region { public: Region(void); - ~Region(void); int x; int y; int w; int h; - Region(const Region& rgn); Region(const Point& p, int w, int h); - Region& operator=(const Region& rgn); bool operator==(const Region& rgn); bool operator!=(const Region& rgn); Region(int x, int y, int w, int h); diff --git a/project/jni/application/gemrb/gemrb/core/ResourceManager.cpp b/project/jni/application/gemrb/gemrb/core/ResourceManager.cpp index 95c131e58..47aa5277b 100644 --- a/project/jni/application/gemrb/gemrb/core/ResourceManager.cpp +++ b/project/jni/application/gemrb/gemrb/core/ResourceManager.cpp @@ -59,7 +59,7 @@ static void PrintPossibleFiles(const char* ResRef, const TypeID *type) { const std::vector& types = PluginMgr::Get()->GetResourceDesc(type); for (size_t j = 0; j < types.size(); j++) { - printf("%s%s ", ResRef, types[j].GetExt()); + print("%s.%s ", ResRef, types[j].GetExt()); } } @@ -74,8 +74,8 @@ bool ResourceManager::Exists(const char *ResRef, SClass_ID type, bool silent) co } } if (!silent) { - printMessage( "ResourceManager", "Searching for ", WHITE ); - printf( "%s%s...", ResRef, core->TypeExt( type ) ); + printMessage("ResourceManager", "Searching for %s.%s...", WHITE, + ResRef, core->TypeExt(type)); printStatus( "NOT FOUND", YELLOW ); } return false; @@ -95,9 +95,8 @@ bool ResourceManager::Exists(const char *ResRef, const TypeID *type, bool silent } } if (!silent) { - printMessage( "ResourceManager", "Searching for ", WHITE ); - printf( "%s... ", ResRef ); - printf("Tried "); + printMessage("ResourceManager", "Searching for %s... ", WHITE, ResRef); + print("Tried "); PrintPossibleFiles(ResRef,type); printStatus( "NOT FOUND", YELLOW ); } @@ -109,8 +108,8 @@ DataStream* ResourceManager::GetResource(const char* ResRef, SClass_ID type, boo if (ResRef[0] == '\0') return NULL; if (!silent) { - printMessage( "ResourceManager", "Searching for ", WHITE ); - printf( "%s%s...", ResRef, core->TypeExt( type ) ); + printMessage("ResourceManager", "Searching for %s.%s...", WHITE, + ResRef, core->TypeExt(type)); } for (size_t i = 0; i < searchPath.size(); i++) { DataStream *ds = searchPath[i]->GetResource(ResRef, type); @@ -132,8 +131,7 @@ Resource* ResourceManager::GetResource(const char* ResRef, const TypeID *type, b if (ResRef[0] == '\0') return NULL; if (!silent) { - printMessage( "ResourceManager", "Searching for ", WHITE ); - printf( "%s... ", ResRef ); + printMessage("ResourceManager", "Searching for %s... ", WHITE, ResRef); } const std::vector &types = PluginMgr::Get()->GetResourceDesc(type); for (size_t j = 0; j < types.size(); j++) { @@ -143,7 +141,7 @@ Resource* ResourceManager::GetResource(const char* ResRef, const TypeID *type, b Resource *res = types[j].Create(str); if (res) { if (!silent) { - printf( "%s%s...", ResRef, types[j].GetExt() ); + print( "%s.%s...", ResRef, types[j].GetExt() ); printStatus( searchPath[i]->GetDescription(), GREEN ); } return res; @@ -152,7 +150,7 @@ Resource* ResourceManager::GetResource(const char* ResRef, const TypeID *type, b } } if (!silent) { - printf("Tried "); + print("Tried "); PrintPossibleFiles(ResRef,type); printStatus( "ERROR", LIGHT_RED ); } diff --git a/project/jni/application/gemrb/gemrb/core/SaveGame.h b/project/jni/application/gemrb/gemrb/core/SaveGame.h index ce7460d0d..b92190338 100644 --- a/project/jni/application/gemrb/gemrb/core/SaveGame.h +++ b/project/jni/application/gemrb/gemrb/core/SaveGame.h @@ -25,9 +25,10 @@ #include "Holder.h" #include "ResourceManager.h" -#include "System/FileStream.h" +#include "System/VFS.h" class ImageMgr; +class Sprite2D; class GEM_EXPORT SaveGame : public Held { public: diff --git a/project/jni/application/gemrb/gemrb/core/SaveGameIterator.cpp b/project/jni/application/gemrb/gemrb/core/SaveGameIterator.cpp index ced734a6b..f2406c6c9 100644 --- a/project/jni/application/gemrb/gemrb/core/SaveGameIterator.cpp +++ b/project/jni/application/gemrb/gemrb/core/SaveGameIterator.cpp @@ -29,9 +29,14 @@ #include "ImageMgr.h" #include "ImageWriter.h" #include "Interface.h" +#include "PluginMgr.h" #include "SaveGameMgr.h" +#include "Sprite2D.h" +#include "TableMgr.h" #include "Video.h" #include "GUI/GameControl.h" +#include "Scriptable/Actor.h" +#include "System/FileStream.h" #if defined(__HAIKU__) #include @@ -227,8 +232,8 @@ static bool IsSaveGameSlot(const char* Path, const char* slotname) if (cnt != 2) { //The matcher didn't match: either this is not a valid dir //or the SAVEGAME_DIRECTORY_MATCHER needs updating. - printMessage( "SaveGameIterator", " ", LIGHT_RED ); - printf( "Invalid savegame directory '%s' in %s.\n", slotname, Path ); + printMessage("SaveGameIterator", "Invalid savegame directory '%s' in %s.\n", LIGHT_RED, + slotname, Path); return false; } @@ -240,23 +245,20 @@ static bool IsSaveGameSlot(const char* Path, const char* slotname) PathJoinExt(ftmp, dtmp, core->GameNameResRef, "bmp"); if (access( ftmp, R_OK )) { - printMessage("SaveGameIterator"," ",YELLOW); - printf("Ignoring slot %s because of no appropriate preview!\n", dtmp); + printMessage("SaveGameIterator", "Ignoring slot %s because of no appropriate preview!\n", YELLOW, dtmp); return false; } PathJoinExt(ftmp, dtmp, core->WorldMapName[0], "wmp"); if (access( ftmp, R_OK )) { - printMessage("SaveGameIterator"," ",YELLOW); - printf("Ignoring slot %s because of no appropriate worldmap!\n", dtmp); + printMessage("SaveGameIterator", "Ignoring slot %s because of no appropriate worldmap!\n", YELLOW, dtmp); return false; } /* we might need something here as well PathJoinExt(ftmp, dtmp, core->WorldMapName[1], "wmp"); if (access( ftmp, R_OK )) { - printMessage("SaveGameIterator"," ",YELLOW); - printf("Ignoring slot %s because of no appropriate worldmap!\n", dtmp); + printMessage("SaveGameIterator", "Ignoring slot %s because of no appropriate worldmap!\n", YELLOW, dtmp); return false; } */ @@ -275,8 +277,10 @@ bool SaveGameIterator::RescanSaveGames() DirectoryIterator dir(Path); // create the save game directory at first access if (!dir) { - mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); - chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); + if (!MakeDirectory(Path)) { + printMessage("SaveGameIterator", "Unable to create save game directory '%s'", RED, Path); + return false; + } dir.Rewind(); } if (!dir) { //If we cannot open the Directory @@ -334,7 +338,7 @@ Holder SaveGameIterator::BuildSaveGame(const char *slotname) int cnt = sscanf( slotname, SAVEGAME_DIRECTORY_MATCHER, &savegameNumber, savegameName ); //maximum pathlength == 240, without 8+3 filenames if ( (cnt != 2) || (strlen(Path)>240) ) { - printf( "Invalid savegame directory '%s' in %s.\n", slotname, Path ); + print( "Invalid savegame directory '%s' in %s.\n", slotname, Path ); return NULL; } @@ -405,6 +409,8 @@ static bool DoSaveGame(const char *Path) } } + gamedata->SaveAllStores(); + //compress files in cache named: .STO and .ARE //no .CRE would be saved in cache if (core->CompressSave(Path)) { @@ -448,7 +454,7 @@ static bool DoSaveGame(const char *Path) return true; } -int CanSave() +static int CanSave() { //some of these restrictions might not be needed Store * store = core->GetCurrentStore(); @@ -502,13 +508,16 @@ int CanSave() return 0; } -static void CreateSavePath(char *Path, int index, const char *slotname) +static bool CreateSavePath(char *Path, int index, const char *slotname) WARN_UNUSED; +static bool CreateSavePath(char *Path, int index, const char *slotname) { PathJoin( Path, core->SavePath, SaveDir(), NULL ); //if the path exists in different case, don't make it again - mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); - chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); + if (!MakeDirectory(Path)) { + printMessage("SaveGameIterator", "Unable to create save game directory '%s'", RED, Path); + return false; + } //keep the first part we already determined existing char dir[_MAX_PATH]; @@ -516,8 +525,11 @@ static void CreateSavePath(char *Path, int index, const char *slotname) PathJoin(Path, Path, dir, NULL); //this is required in case the old slot wasn't recognised but still there core->DelTree(Path, false); - mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); - chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); + if (!MakeDirectory(Path)) { + printMessage("SaveGameIterator", "Unable to create save game directory '%s'", RED, Path); + return false; + } + return true; } int SaveGameIterator::CreateSaveGame(int index, bool mqs) @@ -548,9 +560,16 @@ int SaveGameIterator::CreateSaveGame(int index, bool mqs) } } char Path[_MAX_PATH]; - CreateSavePath(Path, index, slotname); GameControl *gc = core->GetGameControl(); + if (!CreateSavePath(Path, index, slotname)) { + displaymsg->DisplayConstantString(STR_CANTSAVE, 0xbcefbc); + if (gc) { + gc->SetDisplayText(STR_CANTSAVE, 30); + } + return -1; + } + if (!DoSaveGame(Path)) { displaymsg->DisplayConstantString(STR_CANTSAVE, 0xbcefbc); if (gc) { @@ -605,7 +624,13 @@ int SaveGameIterator::CreateSaveGame(Holder save, const char *slotname } char Path[_MAX_PATH]; - CreateSavePath(Path, index, slotname); + if (!CreateSavePath(Path, index, slotname)) { + displaymsg->DisplayConstantString(STR_CANTSAVE, 0xbcefbc); + if (gc) { + gc->SetDisplayText(STR_CANTSAVE, 30); + } + return -1; + } if (!DoSaveGame(Path)) { displaymsg->DisplayConstantString(STR_CANTSAVE, 0xbcefbc); diff --git a/project/jni/application/gemrb/gemrb/core/SaveGameMgr.h b/project/jni/application/gemrb/gemrb/core/SaveGameMgr.h index 20cb91124..b0e2894a6 100644 --- a/project/jni/application/gemrb/gemrb/core/SaveGameMgr.h +++ b/project/jni/application/gemrb/gemrb/core/SaveGameMgr.h @@ -28,7 +28,7 @@ class GEM_EXPORT SaveGameMgr : public Plugin { public: SaveGameMgr(void); virtual ~SaveGameMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Game* LoadGame(Game *newGame, int ver_override = 0) = 0; virtual int GetStoredFileSize(Game *game) = 0; diff --git a/project/jni/application/gemrb/gemrb/core/ScriptEngine.h b/project/jni/application/gemrb/gemrb/core/ScriptEngine.h index 94ec6b64f..44dabd5e7 100644 --- a/project/jni/application/gemrb/gemrb/core/ScriptEngine.h +++ b/project/jni/application/gemrb/gemrb/core/ScriptEngine.h @@ -32,7 +32,7 @@ public: /** Load Script */ virtual bool LoadScript(const char* filename) = 0; /** Run Function */ - virtual bool RunFunction(const char *ModuleName, const char* FunctionName, bool error=true, int intparam=-1) = 0; + virtual bool RunFunction(const char *ModuleName, const char* FunctionName, bool report_error=true, int intparam=-1) = 0; /** Exec a single String */ virtual void ExecString(const char* string) = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.cpp b/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.cpp index 61f8a9a19..afd5c1e1d 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.cpp +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.cpp @@ -31,10 +31,14 @@ #include "win32def.h" #include "Audio.h" //pst (react to death sounds) +#include "Bitmap.h" +#include "DataFileMgr.h" #include "DialogHandler.h" // checking for dialog #include "Game.h" +#include "GlobalTimer.h" #include "DisplayMessage.h" #include "GameData.h" +#include "Image.h" #include "Interface.h" #include "Item.h" #include "PolymorphCache.h" // stupid polymorph cache hack @@ -42,6 +46,7 @@ #include "ProjectileServer.h" #include "ScriptEngine.h" #include "Spell.h" +#include "Sprite2D.h" #include "TableMgr.h" #include "Video.h" #include "damages.h" @@ -333,22 +338,10 @@ Actor::Actor() LongStrRef = (ieStrRef) -1; ShortStrRef = (ieStrRef) -1; - LastProtected = 0; - LastFollowed = 0; - LastCommander = 0; - LastHelp = 0; - LastSeen = 0; - LastMarked = 0; - LastMarkedSpell = 0; - LastHeard = 0; PCStats = NULL; - LastCommand = 0; //used by order - LastShout = 0; //used by heard - LastDamage = 0; + //LastDamage = 0; LastDamageType = 0; - LastTurner = 0; LastExit = 0; - HotKey = 0; attackcount = 0; secondround = 0; attacksperround = 0; @@ -510,8 +503,7 @@ void Actor::SetAnimationID(unsigned int AnimID) if (core->HasFeature(GF_ONE_BYTE_ANIMID) ) { if ((AnimID&0xf000)==0xe000) { if (BaseStats[IE_COLORCOUNT]) { - printMessage("Actor"," ",YELLOW); - printf("Animation ID %x is supposed to be real colored (no recoloring), patched creature\n", AnimID); + printMessage("Actor", "Animation ID %x is supposed to be real colored (no recoloring), patched creature\n", YELLOW, AnimID); } BaseStats[IE_COLORCOUNT]=0; } @@ -520,8 +512,7 @@ void Actor::SetAnimationID(unsigned int AnimID) if(anims->ResRef[0] == 0) { delete anims; anims = NULL; - printMessage("Actor", " ",LIGHT_RED); - printf("Missing animation for %s\n",LongName); + printMessage("Actor", "Missing animation for %s\n", LIGHT_RED, LongName); return; } anims->SetOffhandRef(ShieldRef); @@ -552,8 +543,7 @@ void Actor::SetAnimationID(unsigned int AnimID) if (anim && anim[0]) { SetBase(IE_MOVEMENTRATE, anim[0]->GetFrameCount()) ; } else { - printMessage("Actor", "Unable to determine movement rate for animation ", YELLOW); - printf("%04x!\n", AnimID); + printMessage("Actor", "Unable to determine movement rate for animation %04x!\n", YELLOW, AnimID); } } @@ -616,6 +606,7 @@ void Actor::SetCircleSize() case EA_ENEMY: case EA_GOODBUTRED: case EA_EVILCUTOFF: + case EA_CHARMEDPC: color = &red; color_index = 1; break; @@ -1649,7 +1640,7 @@ static void InitActorTables() if (tm && !core->HasFeature(GF_LEVELSLOT_PER_CLASS)) { AutoTable hptm; //iwd2 just uses levelslotsiwd2 instead - printf("Examining classes.2da\n"); + print("Examining classes.2da\n"); //when searching the levelslots, you must search for //levelslots[BaseStats[IE_CLASS]-1] as there is no class id of 0 @@ -1664,16 +1655,16 @@ static void InitActorTables() continue; tmpindex--; - printf("\tID: %d ", tmpindex); + print("\tID: %d ", tmpindex); //only create the array if it isn't yet made //i.e. barbarians would overwrite fighters in bg2 if (levelslots[tmpindex]) { - printf ("Already Found!\n"); + print ("Already Found!\n"); continue; } const char* classname = tm->GetRowName(i); - printf("Name: %s ", classname); + print("Name: %s ", classname); int classis = 0; //default all levelslots to 0 levelslots[tmpindex] = (int *) calloc(ISCLASSES, sizeof(int)); @@ -1683,7 +1674,7 @@ static void InitActorTables() if (!tmpclass) { classis = IsClassFromName(classname); if (classis>=0) { - printf("Classis: %d ", classis); + print("Classis: %d ", classis); levelslots[tmpindex][classis] = IE_LEVEL; //get the max hp con bonus hptm.load(tm->QueryField(i, 6)); @@ -1692,7 +1683,7 @@ static void InitActorTables() int rollscolumn = hptm->GetColumnIndex("ROLLS"); while (atoi(hptm->QueryField(tmphp, rollscolumn))) tmphp++; - printf("TmpHP: %d ", tmphp); + print("TmpHP: %d ", tmphp); if (tmphp) maxhpconbon[tmpindex] = tmphp; } } @@ -1732,7 +1723,7 @@ static void InitActorTables() levelslots[tmpindex][classis] = tmplevel; } } - printf("Classis: %d ", classis); + print("Classis: %d ", classis); //warrior take presedence if (!foundwarrior) { @@ -1771,8 +1762,8 @@ static void InitActorTables() free(classnames); classnames = NULL; } - printf("HPCON: %d ", maxhpconbon[tmpindex]); - printf("DS: %d\n", dualswap[tmpindex]); + print("HPCON: %d ", maxhpconbon[tmpindex]); + print("DS: %d\n", dualswap[tmpindex]); } /*this could be enabled to ensure all levelslots are filled with at least 0's; *however, the access code should ensure this never happens @@ -1782,7 +1773,7 @@ static void InitActorTables() } }*/ } - printf("Finished examining classes.2da\n"); + print("Finished examining classes.2da\n"); //pre-cache hit/damage/speed bonuses for weapons tm.load("wspecial"); @@ -1921,20 +1912,20 @@ static void InitActorTables() } } - //initializing the skill->stats conversion table (used in iwd2) - tm.load("skillsta"); - if (tm) { - int rowcount = tm->GetRowCount(); - skillcount = rowcount; - if (rowcount) { - skillstats = (int *) malloc(rowcount * sizeof(int) ); - skillabils = (int *) malloc(rowcount * sizeof(int) ); - while(rowcount--) { - skillstats[rowcount]=core->TranslateStat(tm->QueryField(rowcount,0)); - skillabils[rowcount]=core->TranslateStat(tm->QueryField(rowcount,1)); - } - } - } + //initializing the skill->stats conversion table (used in iwd2) + tm.load("skillsta"); + if (tm) { + int rowcount = tm->GetRowCount(); + skillcount = rowcount; + if (rowcount) { + skillstats = (int *) malloc(rowcount * sizeof(int) ); + skillabils = (int *) malloc(rowcount * sizeof(int) ); + while(rowcount--) { + skillstats[rowcount]=core->TranslateStat(tm->QueryField(rowcount,0)); + skillabils[rowcount]=core->TranslateStat(tm->QueryField(rowcount,1)); + } + } + } } void Actor::SetLockedPalette(const ieDword *gradients) @@ -1973,7 +1964,7 @@ void Actor::PlayDamageAnimation(int type, bool hit) { int i; - printf("Damage animation type: %d\n", type); + print("Damage animation type: %d\n", type); switch(type) { case 0: case 1: case 2: case 3: //blood @@ -2246,8 +2237,12 @@ void Actor::RefreshEffects(EffectQueue *fx) //move this further down if needed PrevStats = NULL; + for (std::list::iterator m = triggers.begin(); m != triggers.end (); m++) { + m->flags |= TEF_PROCESSED_EFFECTS; + } + // IE_CLASS is >classcount for non-PCs/NPCs - if (BaseStats[IE_CLASS] <= (ieDword)classcount) + if (BaseStats[IE_CLASS] > 0 && BaseStats[IE_CLASS] <= (ieDword)classcount) RefreshPCStats(); for (i=0;iType==ST_ACTOR) { + AddTrigger(TriggerEntry(trigger_hitby, hitter->GetGlobalID())); LastHitter=hitter->GetGlobalID(); } else { //Maybe it should be something impossible like 0xffff, and use 'Someone' @@ -2719,6 +2718,12 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype) DisplayCombatFeedback(damage, resisted, damagetype, hitter); + // instant chunky death if the actor is petrified or frozen + if (Modified[IE_STATE_ID] & (STATE_FROZEN|STATE_PETRIFIED) && !Modified[IE_DISABLECHUNKING]) { + damage = 123456; // arbitrarily high for death; won't be displayed + LastDamageType |= DAMAGE_CHUNKING; + } + if (BaseStats[IE_HITPOINTS] <= (ieDword) damage) { // common fists do normal damage, but cause sleeping for a round instead of death if ((damagetype & DAMAGE_STUNNING) && Modified[IE_MINHITPOINTS] <= 0) { @@ -2749,6 +2754,7 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype) if (Modified[IE_CLASS] == CLASS_INNOCENT) { Actor *act=NULL; if (!hitter) { + // TODO: check this hitter = area->GetActorByGlobalID(LastHitter); } @@ -2764,10 +2770,10 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype) } } - LastDamage=damage; + //LastDamage=damage; InternalFlags|=IF_ACTIVE; int chp = (signed) BaseStats[IE_HITPOINTS]; - int damagelevel = 0; + int damagelevel = 0; //FIXME: this level is never used if (damage<10) { damagelevel = 1; } else { @@ -2820,8 +2826,7 @@ void Actor::DisplayCombatFeedback (unsigned int damage, int resisted, int damage } if (damage > 0 && resisted != DR_IMMUNE) { - printMessage("Actor", " ", GREEN); - printf("%d damage taken.\n", damage); + printMessage("Actor", "%d damage taken.\n", GREEN, damage); if (detailed) { // 3 choices depending on resistance and boni @@ -2846,7 +2851,7 @@ void Actor::DisplayCombatFeedback (unsigned int damage, int resisted, int damage displaymsg->DisplayConstantStringName(STR_DAMAGE1, 0xffffff, this); } } else if (core->HasFeature(GF_ONSCREEN_TEXT) ) { - if(0) printf("TODO: pst floating text\n"); + if(0) print("TODO: pst floating text\n"); } else if (!displaymsg->HasStringReference(STR_DAMAGE2) || !hitter || hitter->Type != ST_ACTOR) { // bg1 and iwd // or any traps or self-infliction (also for bg1) @@ -2865,8 +2870,7 @@ void Actor::DisplayCombatFeedback (unsigned int damage, int resisted, int damage } } else { if (resisted == DR_IMMUNE) { - printMessage("Actor", " ", GREEN); - printf("is immune to damage type: %s.\n", type_name); + printMessage("Actor", "is immune to damage type: %s.\n", GREEN, type_name); if (hitter && hitter->Type == ST_ACTOR) { if (detailed) { // was immune to my damage @@ -2897,13 +2901,13 @@ void Actor::PlayWalkSound() ieDword thisTime; ieResRef Sound; - GetTime(thisTime); + thisTime = GetTickCount(); if (thisTimeGetWalkSoundCount(); if (!cnt) return; cnt=core->Roll(1,cnt,-1); - strnuprcpy(Sound, anims->GetWalkSound(), sizeof(ieResRef) ); + strnuprcpy(Sound, anims->GetWalkSound(), sizeof(ieResRef)-1 ); area->ResolveTerrainSound(Sound, Pos); if (cnt) { int len = strlen(Sound); @@ -2954,7 +2958,7 @@ void Actor::DumpMaxValues() SymbolMgr *sym = core->GetSymbol( symbol ); for(int i=0;iGetValue(i), maximum_values[i]); + print("%d (%s) %d\n", i, sym->GetValue(i), maximum_values[i]); } } #endif @@ -2963,46 +2967,46 @@ void Actor::DebugDump() { unsigned int i; - printf( "Debugdump of Actor %s (%s, %s):\n", LongName, ShortName, GetName(-1) ); - printf ("Scripts:"); + print( "Debugdump of Actor %s (%s, %s):\n", LongName, ShortName, GetName(-1) ); + print ("Scripts:"); for (i = 0; i < MAX_SCRIPTS; i++) { const char* poi = ""; if (Scripts[i]) { poi = Scripts[i]->GetName(); } - printf( " %.8s", poi ); + print( " %.8s", poi ); } - printf( "\nArea: %.8s ", Area ); - printf( "Dialog: %.8s\n", Dialog ); - printf( "Global ID: %d PartySlot: %d\n", GetGlobalID(), InParty); - printf( "Script name:%.32s Current action: %d\n", scriptName, CurrentAction ? CurrentAction->actionID : -1); - printf( "TalkCount: %d ", TalkCount ); - printf( "Allegiance: %d current allegiance:%d\n", BaseStats[IE_EA], Modified[IE_EA] ); - printf( "Class: %d current class:%d\n", BaseStats[IE_CLASS], Modified[IE_CLASS] ); - printf( "Race: %d current race:%d\n", BaseStats[IE_RACE], Modified[IE_RACE] ); - printf( "Gender: %d current gender:%d\n", BaseStats[IE_SEX], Modified[IE_SEX] ); - printf( "Specifics: %d current specifics:%d\n", BaseStats[IE_SPECIFIC], Modified[IE_SPECIFIC] ); - printf( "Alignment: %x current alignment:%x\n", BaseStats[IE_ALIGNMENT], Modified[IE_ALIGNMENT] ); - printf( "Morale: %d current morale:%d\n", BaseStats[IE_MORALE], Modified[IE_MORALE] ); - printf( "Moralebreak:%d Morale recovery:%d\n", Modified[IE_MORALEBREAK], Modified[IE_MORALERECOVERYTIME] ); - printf( "Visualrange:%d (Explorer: %d)\n", Modified[IE_VISUALRANGE], Modified[IE_EXPLORE] ); - printf( "Levels: %d/%d/%d (average %d)\n", Modified[IE_LEVEL], Modified[IE_LEVEL2], Modified[IE_LEVEL3], GetXPLevel(true) ); - printf( "current HP:%d\n", BaseStats[IE_HITPOINTS] ); - printf( "Mod[IE_ANIMATION_ID]: 0x%04X\n", Modified[IE_ANIMATION_ID] ); - printf( "Colors: "); + print( "\nArea: %.8s ", Area ); + print( "Dialog: %.8s\n", Dialog ); + print( "Global ID: %d PartySlot: %d\n", GetGlobalID(), InParty); + print( "Script name:%.32s Current action: %d\n", scriptName, CurrentAction ? CurrentAction->actionID : -1); + print( "TalkCount: %d ", TalkCount ); + print( "Allegiance: %d current allegiance:%d\n", BaseStats[IE_EA], Modified[IE_EA] ); + print( "Class: %d current class:%d\n", BaseStats[IE_CLASS], Modified[IE_CLASS] ); + print( "Race: %d current race:%d\n", BaseStats[IE_RACE], Modified[IE_RACE] ); + print( "Gender: %d current gender:%d\n", BaseStats[IE_SEX], Modified[IE_SEX] ); + print( "Specifics: %d current specifics:%d\n", BaseStats[IE_SPECIFIC], Modified[IE_SPECIFIC] ); + print( "Alignment: %x current alignment:%x\n", BaseStats[IE_ALIGNMENT], Modified[IE_ALIGNMENT] ); + print( "Morale: %d current morale:%d\n", BaseStats[IE_MORALE], Modified[IE_MORALE] ); + print( "Moralebreak:%d Morale recovery:%d\n", Modified[IE_MORALEBREAK], Modified[IE_MORALERECOVERYTIME] ); + print( "Visualrange:%d (Explorer: %d)\n", Modified[IE_VISUALRANGE], Modified[IE_EXPLORE] ); + print( "Levels: %d/%d/%d (average %d)\n", Modified[IE_LEVEL], Modified[IE_LEVEL2], Modified[IE_LEVEL3], GetXPLevel(true) ); + print( "current HP:%d\n", BaseStats[IE_HITPOINTS] ); + print( "Mod[IE_ANIMATION_ID]: 0x%04X\n", Modified[IE_ANIMATION_ID] ); + print( "Colors: "); if (core->HasFeature(GF_ONE_BYTE_ANIMID) ) { for(i=0;iGetGlobalID(); + AddTrigger(TriggerEntry(trigger_turnedby, cleric->GetGlobalID())); if (turnlevel >= level+TURN_DEATH_LVL_MOD) { if (gamedata->Exists("panic", IE_SPL_CLASS_ID)) { core->ApplySpell("panic", this, cleric, level); } else { - printf("Panic from turning!\n"); + print("Panic from turning!\n"); Panic(cleric, PANIC_RUNAWAY); } } @@ -3246,7 +3250,7 @@ void Actor::Turn(Scriptable *cleric, ieDword turnlevel) //determine alignment (if equals, then no turning) - LastTurner = cleric->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_turnedby, cleric->GetGlobalID())); //determine panic or destruction/control //we get the modified level @@ -3267,7 +3271,7 @@ void Actor::Turn(Scriptable *cleric, ieDword turnlevel) } Die(cleric); } else if (turnlevel >= level+TURN_PANIC_LVL_MOD) { - printf("Panic from turning!\n"); + print("Panic from turning!\n"); Panic(cleric, PANIC_RUNAWAY); } } @@ -3349,13 +3353,15 @@ void Actor::Die(Scriptable *killer) if (area) area->ClearSearchMapFor(this); - //JUSTDIED will be removed when the Die() trigger executed + //JUSTDIED will be removed after the first script check //otherwise it is the same as REALLYDIED InternalFlags|=IF_REALLYDIED|IF_JUSTDIED; SetStance( IE_ANI_DIE ); + AddTrigger(TriggerEntry(trigger_die)); Actor *act=NULL; if (!killer) { + // TODO: is this right? killer = area->GetActorByGlobalID(LastHitter); } @@ -3549,10 +3555,9 @@ bool Actor::CheckOnDeath() if (InternalFlags&IF_CLEANUP) { return true; } - if (InternalFlags&IF_JUSTDIED) { - if (lastRunTime == 0 || CurrentAction || GetNextAction()) { - return false; //actor is currently dying, let him die first - } + // FIXME + if (InternalFlags&IF_JUSTDIED || CurrentAction || GetNextAction()) { + return false; //actor is currently dying, let him die first } if (!(InternalFlags&IF_REALLYDIED) ) { return false; @@ -3795,9 +3800,11 @@ void Actor::InitStatsOnLoad() } inventory.CalculateWeight(); CreateDerivedStats(); - Modified[IE_CON]=BaseStats[IE_CON]; // used by GetHpAdjustment - ieDword hp = BaseStats[IE_HITPOINTS] + GetHpAdjustment(GetXPLevel(false)); - BaseStats[IE_HITPOINTS]=hp; + if (BaseStats[IE_CLASS] > 0 && BaseStats[IE_CLASS] <= (ieDword)classcount) { + Modified[IE_CON]=BaseStats[IE_CON]; // used by GetHpAdjustment + ieDword hp = BaseStats[IE_HITPOINTS] + GetHpAdjustment(GetXPLevel(false)); + BaseStats[IE_HITPOINTS]=hp; + } SetupFist(); //initial setup of modified stats memcpy(Modified,BaseStats, sizeof(Modified)); @@ -3847,7 +3854,7 @@ bool Actor::ValidTarget(int ga_flags) const break; } if (ga_flags&GA_NO_DEAD) { - if (InternalFlags&IF_JUSTDIED) return false; + if (InternalFlags&IF_REALLYDIED) return false; if (Modified[IE_STATE_ID] & STATE_DEAD) return false; } if (ga_flags&GA_SELECT) { @@ -3877,7 +3884,7 @@ void Actor::GetNextAnimation() if (RowNum<0) RowNum = CharAnimations::GetAvatarsCount() - 1; int NewAnimID = CharAnimations::GetAvatarStruct(RowNum)->AnimID; - printf ("AnimID: %04X\n", NewAnimID); + print ("AnimID: %04X\n", NewAnimID); SetBase( IE_ANIMATION_ID, NewAnimID); } @@ -3887,7 +3894,7 @@ void Actor::GetPrevAnimation() if (RowNum>=CharAnimations::GetAvatarsCount() ) RowNum = 0; int NewAnimID = CharAnimations::GetAvatarStruct(RowNum)->AnimID; - printf ("AnimID: %04X\n", NewAnimID); + print ("AnimID: %04X\n", NewAnimID); SetBase( IE_ANIMATION_ID, NewAnimID); } @@ -3995,7 +4002,7 @@ void Actor::GetNextStance() static int Stance = IE_ANI_AWAKE; if (--Stance < 0) Stance = MAX_ANIMS-1; - printf ("StanceID: %d\n", Stance); + print ("StanceID: %d\n", Stance); SetStance( Stance ); } @@ -4165,6 +4172,7 @@ int Actor::GetAttackStyle() const void Actor::AttackedBy( Actor *attacker) { + AddTrigger(TriggerEntry(trigger_attackedby, attacker->GetGlobalID())); LastAttacker = attacker->GetGlobalID(); } @@ -4183,7 +4191,7 @@ void Actor::StopAttack() { SetStance(IE_ANI_READY); secondround = 0; - InternalFlags|=IF_TARGETGONE; //this is for the trigger! + //InternalFlags|=IF_TARGETGONE; //this is for the trigger! if (InParty) { core->Autopause(AP_NOTARGET); } @@ -4200,6 +4208,10 @@ int Actor::Immobile() const if (GetStat(IE_STATE_ID) & STATE_STILL) { return 1; } + Game *game = core->GetGame(); + if (game && game->TimeStoppedFor(this)) { + return 1; + } return 0; } @@ -4238,8 +4250,8 @@ void Actor::InitRound(ieDword gameTime) roundTime = gameTime; //print a little message :) - printMessage("InitRound", " ", WHITE); - printf("Name: %s | Attacks: %d | Start: %d\n", ShortName, attacksperround, gameTime); + printMessage("InitRound", "Name: %s | Attacks: %d | Start: %d\n", WHITE, + ShortName, attacksperround, gameTime); // this might not be the right place, but let's give it a go if (attacksperround && InParty) { @@ -4568,7 +4580,7 @@ void Actor::PerformAttack(ieDword gameTime) return; } - printf("Performattack for %s, target is: %s\n", ShortName, target->ShortName); + print("Performattack for %s, target is: %s\n", ShortName, target->ShortName); //which hand is used //we do apr - attacksleft so we always use the main hand first @@ -4629,15 +4641,15 @@ void Actor::PerformAttack(ieDword gameTime) printMessage("Attack","(Main) ", GREEN); } if (attacksperround) { - printf("Left: %d | ", attackcount); - printf("Next: %d ", nextattack); + print("Left: %d | ", attackcount); + print("Next: %d ", nextattack); } int roll = LuckyRoll(1, ATTACKROLL, 0); if (roll==1) { //critical failure printBracket("Critical Miss", RED); - printf("\n"); + print("\n"); displaymsg->DisplayConstantStringName(STR_CRITICAL_MISS, 0xffffff, this); DisplayStringCore(this, VB_CRITMISS, DS_CONSOLE|DS_CONST ); if (Flags&WEAPON_RANGED) {//no need for this with melee weapon! @@ -4662,16 +4674,16 @@ void Actor::PerformAttack(ieDword gameTime) if (hittingheader->DiceThrown<256) { damage += LuckyRoll(hittingheader->DiceThrown, hittingheader->DiceSides, 0, LR_CRITICAL); damage += DamageBonus; - printf("| Damage %dd%d%+d = %d ",hittingheader->DiceThrown, hittingheader->DiceSides, DamageBonus, damage); + print("| Damage %dd%d%+d = %d ",hittingheader->DiceThrown, hittingheader->DiceSides, DamageBonus, damage); } else { - printf("| No Damage"); + print("| No Damage"); damage = 0; } if (roll >= (ATTACKROLL - (int) GetStat(IE_CRITICALHITBONUS) - CriticalBonus)) { //critical success printBracket("Critical Hit", GREEN); - printf("\n"); + print("\n"); displaymsg->DisplayConstantStringName(STR_CRITICAL_HIT, 0xffffff, this); DisplayStringCore(this, VB_CRITHIT, DS_CONSOLE|DS_CONST ); ModifyDamage (target, this, damage, resisted, weapon_damagetype[damagetype], &wi, true); @@ -4699,11 +4711,11 @@ void Actor::PerformAttack(ieDword gameTime) } ResetState(); printBracket("Missed", LIGHT_RED); - printf("\n"); + print("\n"); return; } printBracket("Hit", GREEN); - printf("\n"); + print("\n"); ModifyDamage (target, this, damage, resisted, weapon_damagetype[damagetype], &wi, false); UseItem(wi.slot, Flags&WEAPON_RANGED?-2:-1, target, 0, damage); ResetState(); @@ -4789,7 +4801,7 @@ void Actor::ModifyDamage(Actor *target, Scriptable *hitter, int &damage, int &re std::multimap::iterator it; it = core->DamageInfoMap.find(damagetype); if (it == core->DamageInfoMap.end()) { - printf("Unhandled damagetype:%d\n", damagetype); + print("Unhandled damagetype:%d\n", damagetype); } else if (it->second.resist_stat == 0) { // damage type without a resistance stat } else { @@ -4800,11 +4812,11 @@ void Actor::ModifyDamage(Actor *target, Scriptable *hitter, int &damage, int &re int bonus = ((Actor *)hitter)->fxqueue.SpecificDamageBonus(it->second.iwd_mod_type); if (bonus) { resisted -= int (damage * bonus / 100.0); - printf("Bonus damage of %d (%+d%%), neto: %d\n", int (damage * bonus / 100.0), bonus, -resisted); + print("Bonus damage of %d (%+d%%), neto: %d\n", int (damage * bonus / 100.0), bonus, -resisted); } } damage -= resisted; - printf("Resisted %d of %d at %d%% resistance to %d\n", resisted, damage+resisted, target->GetSafeStat(it->second.resist_stat), damagetype); + print("Resisted %d of %d at %d%% resistance to %d\n", resisted, damage+resisted, target->GetSafeStat(it->second.resist_stat), damagetype); if (damage <= 0) resisted = DR_IMMUNE; } } @@ -4867,9 +4879,6 @@ void Actor::UpdateActorState(ieDword gameTime) { //apply the modal effect on the beginning of each round if ((((gameTime-roundTime)%core->Time.round_size)==0)) { - //we can set this to 0 - modalTime = gameTime; - // handle lingering modal spells like bardsong in iwd2 if (modalSpellLingering && LingeringModalSpell[0]) { modalSpellLingering--; @@ -4883,6 +4892,16 @@ void Actor::UpdateActorState(ieDword gameTime) { return; } + // some states and timestop disable modal actions + // interestingly the original doesn't include STATE_DISABLED, STATE_FROZEN/STATE_PETRIFIED + ieDword state = Modified[IE_STATE_ID]; + if (Immobile() || (state & (STATE_CONFUSED | STATE_DEAD | STATE_HELPLESS | STATE_PANIC | STATE_BERSERK | STATE_SLEEP))) { + return; + } + + //we can set this to 0 + modalTime = gameTime; + if (!ModalSpell[0]) { printMessage("Actor","Modal Spell Effect was not set!\n", YELLOW); ModalSpell[0]='*'; @@ -5111,6 +5130,13 @@ void Actor::DrawActorSprite(const Region &screen, int cx, int cy, const Region& int PartCount = ca->GetTotalPartCount(); Video* video = core->GetVideoDriver(); Region vp = video->GetViewport(); + unsigned int flags = TranslucentShadows ? BLIT_TRANSSHADOW : 0; + if (!ca->lockPalette) flags |= BLIT_TINTED; + Game* game = core->GetGame(); + // when time stops, almost everything turns dull grey, the caster and immune actors being the most notable exceptions + if (game->TimeStoppedFor(this)) { + flags |= BLIT_GREY; + } // display current frames in the right order const int* zOrder = ca->GetZOrder(Face); @@ -5133,10 +5159,6 @@ void Actor::DrawActorSprite(const Region &screen, int cx, int cy, const Region& } assert(newsc->Covers(cx, cy, nextFrame->XPos, nextFrame->YPos, nextFrame->Width, nextFrame->Height)); - unsigned int flags = TranslucentShadows ? BLIT_TRANSSHADOW : 0; - - if (!ca->lockPalette) flags|=BLIT_TINTED; - video->BlitGameSprite( nextFrame, cx + screen.x, cy + screen.y, flags, tint, newsc, ca->GetPartPalette(partnum), &screen); } @@ -5155,7 +5177,7 @@ bool Actor::ShouldHibernate() { return false; if (LastTarget) //currently attacking someone return false; - if (!lastRunTime) // haven't had a chance to run a script + if (InternalFlags&IF_JUSTDIED) // didn't have a chance to run a script return false; if (CurrentAction) return false; @@ -5617,12 +5639,11 @@ void Actor::GetSoundFrom2DA(ieResRef Sound, unsigned int index) const index = 36; break; default: - printMessage("Actor","TODO:", YELLOW); - printf("Cannot determine 2DA rowcount for index: %d\n", index); + printMessage("Actor", "TODO:Cannot determine 2DA rowcount for index: %d\n", YELLOW, index); return; } - printMessage("Actor"," ", WHITE); - printf("Getting sound 2da %.8s entry: %s\n", anims->ResRef, tab->GetRowName(index) ); + printMessage("Actor", "Getting sound 2da %.8s entry: %s\n", WHITE, + anims->ResRef, tab->GetRowName(index) ); int col = core->Roll(1,tab->GetColumnCount(index),-1); strnlwrcpy(Sound, tab->QueryField (index, col), 8); } @@ -5758,7 +5779,7 @@ void Actor::SetSoundFolder(const char *soundset) char filepath[_MAX_PATH]; strnlwrcpy(PCStats->SoundFolder, soundset, 32); - PathJoin(filepath,core->GamePath,"sounds",PCStats->SoundFolder,0); + PathJoin(filepath, core->GamePath, "sounds", PCStats->SoundFolder, NULL); char file[_MAX_PATH]; if (FileGlob(file, filepath, "?????01")) { file[5] = '\0'; @@ -6320,7 +6341,7 @@ int Actor::CheckUsability(Item *item) const } stat = ResolveTableValue(itemuse[i].table, stat, mcol, itemuse[i].vcol); if (stat&itemvalue) { - //printf("failed usability: itemvalue %d, stat %d, stat value %d\n", itemvalue, itemuse[i].stat, stat); + //print("failed usability: itemvalue %d, stat %d, stat value %d\n", itemvalue, itemuse[i].stat, stat); return STR_CANNOT_USE_ITEM; } } @@ -6540,7 +6561,7 @@ void Actor::CreateDerivedStatsBG() } else { backstabdamagemultiplier = (backstabdamagemultiplier+7)/4; } - printf("\n"); + print("\n"); if (backstabdamagemultiplier>7) backstabdamagemultiplier=7; } } @@ -6576,7 +6597,7 @@ void Actor::CreateDerivedStatsIWD2() } else { backstabdamagemultiplier = (BaseStats[IE_LEVELTHIEF]+1)/2; } - printf("\n"); + print("\n"); if (backstabdamagemultiplier>7) backstabdamagemultiplier=7; } @@ -6878,7 +6899,7 @@ void Actor::CureInvisibility() //not sure, but better than nothing if (! (Modified[IE_STATE_ID]&state_invisible)) { - InternalFlags|=IF_BECAMEVISIBLE; + AddTrigger(TriggerEntry(trigger_becamevisible)); } } } diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.h b/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.h index 5b54b5bf1..32bde7ca1 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.h +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Actor.h @@ -28,15 +28,16 @@ #include "exports.h" #include "ie_types.h" -#include "Animation.h" #include "Audio.h" -#include "CharAnimations.h" #include "EffectQueue.h" -#include "ScriptedAnimation.h" +#include "Palette.h" #include #include +class Animation; +class CharAnimations; +class DataFileMgr; class Map; class ScriptedAnimation; struct PolymorphCache; @@ -275,25 +276,6 @@ public: ieDword ModalState; int PathTries; //the # of previous tries to pick up a new walkpath public: - #define LastTarget LastDisarmFailed - //ieDword LastTarget; use lastdisarmfailed - #define LastAttacker LastDisarmed - //ieDword LastAttacker; use lastdisarmed - #define LastHitter LastEntered - //ieDword LastHitter; use lastentered - #define LastSummoner LastTrigger - //ieDword LastSummoner; use lasttrigger - #define LastTalkedTo LastUnlocked - //ieDword LastTalkedTo; use lastunlocked - ieDword LastProtected; - ieDword LastFollowed; - ieDword LastCommander; - ieDword LastHelp; - ieDword LastSeen; - ieDword LastMarked; //no idea if non-actors could mark objects - int LastMarkedSpell; //a spell number to cast - ieDword LastHeard; - ieDword HotKey; ieDword LastExit; //the global ID of the exit to be used char ShieldRef[2]; char HelmetRef[2]; @@ -303,11 +285,7 @@ public: bool GotLUFeedback; int WMLevelMod; - int LastCommand; //lastcommander - int LastShout; //lastheard - int LastDamage; //lasthitter - int LastDamageType;//lasthitter - ieDword LastTurner; + int LastDamageType; Point FollowOffset;//follow lastfollowed at this offset Point HomeLocation;//spawnpoint, return here after rest diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Container.cpp b/project/jni/application/gemrb/gemrb/core/Scriptable/Container.cpp index e2f675774..f547a5d46 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Container.cpp +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Container.cpp @@ -31,6 +31,7 @@ #include "Map.h" #include "Projectile.h" #include "Spell.h" +#include "Sprite2D.h" #include "SpriteCover.h" #include "TileMap.h" #include "Video.h" @@ -196,6 +197,7 @@ void Container::RefreshGroundIcons() while (i--) { CREItem *slot = inventory.GetSlotItem(i); //borrowed reference Item *itm = gamedata->GetItem( slot->ItemResRef ); //cached reference + if (!itm) continue; //well, this is required in PST, needs more work if some other //game is broken by not using -1,0 groundicons[i] = gamedata->GetBAMSprite( itm->GroundIcon, 0, 0 ); @@ -224,6 +226,7 @@ int Container::IsOpen() const void Container::TryPickLock(Actor *actor) { + core->PlaySound(DS_PICKLOCK); if (LockDifficulty == 100) { if (OpenFail != (ieDword)-1) { displaymsg->DisplayStringName(OpenFail, 0xbcefbc, actor, IE_STR_SOUND|IE_STR_SPEECH); @@ -234,12 +237,12 @@ void Container::TryPickLock(Actor *actor) } if (actor->GetStat(IE_LOCKPICKING)DisplayConstantStringName(STR_LOCKPICK_FAILED, 0xbcefbc, actor); - LastPickLockFailed = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_picklockfailed, actor->GetGlobalID())); return; } SetContainerLocked(false); displaymsg->DisplayConstantStringName(STR_LOCKPICK_DONE, 0xd7d7be, actor); - LastUnlocked = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_unlocked, actor->GetGlobalID())); ImmediateEvent(); int xp = actor->CalculateExperience(XP_LOCKPICK, actor->GetXPLevel(1)); Game *game = core->GetGame(); @@ -262,24 +265,24 @@ void Container::TryBashLock(Actor *actor) displaymsg->DisplayConstantStringName(STR_CONTBASH_DONE, 0xd7d7be, actor); SetContainerLocked(false); //Is this really useful ? - LastUnlocked = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_unlocked, actor->GetGlobalID())); ImmediateEvent(); } void Container::DebugDump() const { - printf( "Debugdump of Container %s\n", GetScriptName() ); - printf( "Container Global ID: %d\n", GetGlobalID()); - printf( "Position: %d.%d\n", Pos.x, Pos.y); - printf( "Type: %d, Locked: %s, LockDifficulty: %d\n", Type, YESNO(Flags&CONT_LOCKED), LockDifficulty ); - printf( "Flags: %d, Trapped: %s, Detected: %d\n", Flags, YESNO(Trapped), TrapDetected ); - printf( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, + print( "Debugdump of Container %s\n", GetScriptName() ); + print( "Container Global ID: %d\n", GetGlobalID()); + print( "Position: %d.%d\n", Pos.x, Pos.y); + print( "Type: %d, Locked: %s, LockDifficulty: %d\n", Type, YESNO(Flags&CONT_LOCKED), LockDifficulty ); + print( "Flags: %d, Trapped: %s, Detected: %d\n", Flags, YESNO(Trapped), TrapDetected ); + print( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, TrapRemovalDiff ); const char *name = "NONE"; if (Scripts[0]) { name = Scripts[0]->GetName(); } - printf( "Script: %s, Key: %s\n", name, KeyResRef ); + print( "Script: %s, Key: %s\n", name, KeyResRef ); // FIXME: const_cast const_cast(inventory).dump(); } diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Container.h b/project/jni/application/gemrb/gemrb/core/Scriptable/Container.h index 39fd7bb01..c581bfd30 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Container.h +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Container.h @@ -21,6 +21,7 @@ #ifndef CONTAINER_H #define CONTAINER_H +#include "Inventory.h" #include "Scriptable.h" //container flags diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Door.cpp b/project/jni/application/gemrb/gemrb/core/Scriptable/Door.cpp index 33df7bdaf..18118d59c 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Door.cpp +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Door.cpp @@ -105,23 +105,23 @@ void Door::UpdateDoor() Pos.x = outline->BBox.x + outline->BBox.w/2; Pos.y = outline->BBox.y + outline->BBox.h/2; - unsigned char oval, cval; - oval = PATH_MAP_IMPASSABLE; + unsigned char pmdflags; + if (Flags & DOOR_TRANSPARENT) { - cval = PATH_MAP_DOOR_IMPASSABLE; + pmdflags = PATH_MAP_DOOR_IMPASSABLE; } else { //both door flags are needed here, one for transparency the other //is for passability - cval = PATH_MAP_DOOR_OPAQUE|PATH_MAP_DOOR_IMPASSABLE; + pmdflags = PATH_MAP_DOOR_OPAQUE|PATH_MAP_DOOR_IMPASSABLE; } if (Flags &DOOR_OPEN) { ImpedeBlocks(cibcount, closed_ib, 0); - ImpedeBlocks(oibcount, open_ib, cval); + ImpedeBlocks(oibcount, open_ib, pmdflags); } else { ImpedeBlocks(oibcount, open_ib, 0); - ImpedeBlocks(cibcount, closed_ib, cval); + ImpedeBlocks(cibcount, closed_ib, pmdflags); } InfoPoint *ip = area->TMap->GetInfoPoint(LinkedInfo); @@ -252,14 +252,14 @@ void Door::SetDoorOpen(int Open, int playsound, ieDword ID) area->JumpActors(true); } if (Open) { - LastEntered = ID; //used as lastOpener + AddTrigger(TriggerEntry(trigger_opened, ID)); // in PS:T, opening a door does not unlock it if (!core->HasFeature(GF_REVERSE_DOOR)) { SetDoorLocked(false,playsound); } } else { - LastTriggerObject = LastTrigger = ID; //used as lastCloser + AddTrigger(TriggerEntry(trigger_closed, ID)); } ToggleTiles(Open, playsound); //synchronising other data with the door state @@ -325,11 +325,10 @@ void Highlightable::TryDisarm(Actor *actor) { if (!Trapped || !TrapDetected) return; - LastTriggerObject = LastTrigger = actor->GetGlobalID(); int skill = actor->GetStat(IE_TRAPS); if (skill/2+core->Roll(1,skill/2,0)>TrapRemovalDiff) { - LastDisarmed = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_disarmed, actor->GetGlobalID())); //trap removed Trapped = 0; displaymsg->DisplayConstantStringName(STR_DISARM_DONE, 0xd7d7be, actor); @@ -338,13 +337,14 @@ void Highlightable::TryDisarm(Actor *actor) game->ShareXP(xp, SX_DIVIDE); } else { displaymsg->DisplayConstantStringName(STR_DISARM_FAIL, 0xd7d7be, actor); - TriggerTrap(skill, LastTrigger); + TriggerTrap(skill, actor->GetGlobalID()); } ImmediateEvent(); } void Door::TryPickLock(Actor *actor) { + core->PlaySound(DS_PICKLOCK); if (LockDifficulty == 100) { if (OpenStrRef != (ieDword)-1) { displaymsg->DisplayStringName(OpenStrRef, 0xbcefbc, actor, IE_STR_SOUND|IE_STR_SPEECH); @@ -355,12 +355,12 @@ void Door::TryPickLock(Actor *actor) } if (actor->GetStat(IE_LOCKPICKING)DisplayConstantStringName(STR_LOCKPICK_FAILED, 0xbcefbc, actor); - LastPickLockFailed = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_picklockfailed, actor->GetGlobalID())); return; } SetDoorLocked( false, true); displaymsg->DisplayConstantStringName(STR_LOCKPICK_DONE, 0xd7d7be, actor); - LastUnlocked = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_unlocked, actor->GetGlobalID())); ImmediateEvent(); int xp = actor->CalculateExperience(XP_LOCKPICK, actor->GetXPLevel(1)); Game *game = core->GetGame(); @@ -383,27 +383,27 @@ void Door::TryBashLock(Actor *actor) displaymsg->DisplayConstantStringName(STR_DOORBASH_DONE, 0xd7d7be, actor); SetDoorLocked(false, true); //Is this really useful ? - LastUnlocked = actor->GetGlobalID(); + AddTrigger(TriggerEntry(trigger_unlocked, actor->GetGlobalID())); ImmediateEvent(); } void Door::DebugDump() const { - printf( "Debugdump of Door %s:\n", GetScriptName() ); - printf( "Door Global ID: %d\n", GetGlobalID()); - printf( "Position: %d.%d\n", Pos.x, Pos.y); - printf( "Door Open: %s\n", YESNO(IsOpen())); - printf( "Door Locked: %s\n", YESNO(Flags&DOOR_LOCKED)); - printf( "Door Trapped: %s\n", YESNO(Trapped)); + print( "Debugdump of Door %s:\n", GetScriptName() ); + print( "Door Global ID: %d\n", GetGlobalID()); + print( "Position: %d.%d\n", Pos.x, Pos.y); + print( "Door Open: %s\n", YESNO(IsOpen())); + print( "Door Locked: %s\n", YESNO(Flags&DOOR_LOCKED)); + print( "Door Trapped: %s Difficulty: %d\n", YESNO(Trapped), TrapRemovalDiff); if (Trapped) { - printf( "Trap Permanent: %s Detectable: %s\n", YESNO(Flags&DOOR_RESET), YESNO(Flags&DOOR_DETECTABLE) ); + print( "Trap Permanent: %s Detectable: %s\n", YESNO(Flags&DOOR_RESET), YESNO(Flags&DOOR_DETECTABLE) ); } - printf( "Secret door: %s (Found: %s)\n", YESNO(Flags&DOOR_SECRET),YESNO(Flags&DOOR_FOUND)); + print( "Secret door: %s (Found: %s)\n", YESNO(Flags&DOOR_SECRET),YESNO(Flags&DOOR_FOUND)); const char *Key = GetKey(); const char *name = "NONE"; if (Scripts[0]) { name = Scripts[0]->GetName(); } - printf( "Script: %s, Key (%s) removed: %s, Dialog: %s\n", name, Key?Key:"NONE", YESNO(Flags&DOOR_KEY), Dialog ); + print( "Script: %s, Key (%s) removed: %s, Dialog: %s\n", name, Key?Key:"NONE", YESNO(Flags&DOOR_KEY), Dialog ); } diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Door.h b/project/jni/application/gemrb/gemrb/core/Scriptable/Door.h index 5d6e4db82..c0c51b69a 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Door.h +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Door.h @@ -23,6 +23,8 @@ #include "Scriptable.h" +class TileOverlay; + //door flags #define DOOR_OPEN 1 #define DOOR_LOCKED 2 diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.cpp b/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.cpp index 0199bc7d0..832f672ff 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.cpp +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.cpp @@ -36,6 +36,7 @@ #include "Video.h" #include "GameScript/GSUtils.h" #include "GUI/GameControl.h" +#include "GUI/Window.h" #include #include @@ -52,7 +53,6 @@ InfoPoint::InfoPoint(void) TrapRemovalDiff = 0; TrapDetected = 0; TrapLaunch.empty(); - EnterWav[0] = 0; } InfoPoint::~InfoPoint(void) @@ -88,23 +88,6 @@ int InfoPoint::CheckTravel(Actor *actor) return CT_ACTIVE; } -//detect this trap, using a skill, skill could be set to 256 for 'sure' -//skill is the all around modified trap detection skill -//a trapdetectiondifficulty of 100 means impossible detection short of a spell -void Highlightable::DetectTrap(int skill) -{ - if (!CanDetectTrap()) return; - if (!Scripts[0]) return; - if ((skill>=100) && (skill!=256) ) skill = 100; - if (skill/2+core->Roll(1,skill/2,0)>TrapDetectionDiff) { - SetTrapDetected(1); //probably could be set to the player #? - } -} - -bool Highlightable::PossibleToSeeTrap() const -{ - return CanDetectTrap(); -} bool InfoPoint::PossibleToSeeTrap() const { @@ -141,24 +124,6 @@ bool Highlightable::VisibleTrap(int see_all) const return false; } -//trap that will fire now -bool Highlightable::TriggerTrap(int /*skill*/, ieDword ID) -{ - if (!Trapped) { - return false; - } - //actually this could be script name[0] - if (!Scripts[0] && !EnterWav[0]) { - return false; - } - LastTriggerObject = LastTrigger = LastEntered = ID; - ImmediateEvent(); - if (!TrapResets()) { - Trapped = false; - } - return true; -} - //trap that will fire now bool InfoPoint::TriggerTrap(int skill, ieDword ID) { @@ -170,7 +135,8 @@ bool InfoPoint::TriggerTrap(int skill, ieDword ID) } if (!Trapped) { // we have to set Entered somewhere, here seems best.. - LastEntered = ID; + // FIXME: likely not best :) + AddTrigger(TriggerEntry(trigger_entered, ID)); return true; } else if (Highlightable::TriggerTrap(skill, ID)) { if (!Trapped) { @@ -234,31 +200,31 @@ void InfoPoint::DebugDump() const { switch (Type) { case ST_TRIGGER: - printf( "Debugdump of InfoPoint Region %s:\n", GetScriptName() ); + print( "Debugdump of InfoPoint Region %s:\n", GetScriptName() ); break; case ST_PROXIMITY: - printf( "Debugdump of Trap Region %s:\n", GetScriptName() ); + print( "Debugdump of Trap Region %s:\n", GetScriptName() ); break; case ST_TRAVEL: - printf( "Debugdump of Travel Region %s:\n", GetScriptName() ); + print( "Debugdump of Travel Region %s:\n", GetScriptName() ); break; default: - printf( "Debugdump of Unsupported Region %s:\n", GetScriptName() ); + print( "Debugdump of Unsupported Region %s:\n", GetScriptName() ); break; } - printf( "Region Global ID: %d\n", GetGlobalID()); - printf( "Position: %d.%d\n", Pos.x, Pos.y); + print( "Region Global ID: %d\n", GetGlobalID()); + print( "Position: %d.%d\n", Pos.x, Pos.y); switch(Type) { case ST_TRAVEL: - printf( "Destination Area: %s Entrance: %s\n", Destination, EntranceName); + print( "Destination Area: %s Entrance: %s\n", Destination, EntranceName); break; case ST_PROXIMITY: - printf( "TrapDetected: %d, Trapped: %s\n", TrapDetected, YESNO(Trapped)); - printf( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, + print( "TrapDetected: %d, Trapped: %s\n", TrapDetected, YESNO(Trapped)); + print( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, TrapRemovalDiff ); break; case ST_TRIGGER: - printf ( "InfoString: %s\n", overHeadText ); + print ( "InfoString: %s\n", overHeadText ); break; default:; } @@ -266,7 +232,8 @@ void InfoPoint::DebugDump() const if (Scripts[0]) { name = Scripts[0]->GetName(); } - printf( "Script: %s, Key: %s, Dialog: %s\n", name, KeyResRef, Dialog ); - printf( "Active: %s\n", YESNO(InternalFlags&IF_ACTIVE)); + print( "Script: %s, Key: %s, Dialog: %s\n", name, KeyResRef, Dialog ); + print( "Deactivated: %s\n", YESNO(Flags&TRAP_DEACTIVATED)); + print( "Active: %s\n", YESNO(InternalFlags&IF_ACTIVE)); } diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.h b/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.h index 0eb628278..6ef5b904a 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.h +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/InfoPoint.h @@ -62,7 +62,6 @@ public: ieStrRef StrRef; Point UsePoint; Point TalkPos; - }; #endif diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.cpp b/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.cpp index e1bd727eb..07878f6cb 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.cpp +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.cpp @@ -28,6 +28,7 @@ #include "GameData.h" #include "Interface.h" #include "Item.h" +#include "Font.h" #include "Map.h" #include "Projectile.h" #include "Spell.h" @@ -35,7 +36,9 @@ #include "TileMap.h" #include "Video.h" #include "GameScript/GSUtils.h" +#include "GameScript/Matching.h" // MatchActor #include "GUI/GameControl.h" +#include "GUI/Window.h" #include "Scriptable/InfoPoint.h" #include @@ -60,49 +63,59 @@ Scriptable::Scriptable(ScriptableType type) textDisplaying = 0; timeStartDisplaying = 0; scriptName[0] = 0; - TriggerID = 0; //used by SendTrigger - LastTriggerObject = LastTrigger = 0; - LastEntered = 0; - LastDisarmed = 0; - LastDisarmFailed = 0; - LastUnlocked = 0; - LastOpenFailed = 0; - LastPickLockFailed = 0; + + LastAttacker = 0; + LastCommander = 0; + LastProtector = 0; + LastProtectee = 0; + LastTargetedBy = 0; + LastHitter = 0; + LastHelp = 0; + LastTrigger = 0; + LastSeen = 0; + LastTalker = 0; + LastHeard = 0; + LastSummoner = 0; + LastFollowed = 0; + LastMarked = 0; + LastMarkedSpell = 0; + DialogName = 0; CurrentAction = NULL; CurrentActionState = 0; CurrentActionTarget = 0; CurrentActionInterruptable = true; + CurrentActionTicks = 0; UnselectableTimer = 0; - startTime = 0; //executing scripts - lastRunTime = 0; //evaluating scripts - lastDelay = 0; + Ticks = 0; + AdjustedTicks = 0; + ScriptTicks = 0; + IdleTicks = 0; + TriggerCountdown = 0; Dialog[0] = 0; globalID = ++globalActorCounter; - interval = ( 1000 / AI_UPDATE_TIME ); WaitCounter = 0; if (Type == ST_ACTOR) { - InternalFlags = IF_VISIBLE | IF_ONCREATION | IF_USEDSAVE; + InternalFlags = IF_VISIBLE | IF_USEDSAVE; } else { - InternalFlags = IF_ACTIVE | IF_VISIBLE | IF_ONCREATION | IF_NOINT; + InternalFlags = IF_ACTIVE | IF_VISIBLE | IF_NOINT; } area = 0; Pos.x = 0; Pos.y = 0; - LastCasterOnMe = 0; LastSpellOnMe = 0xffffffff; - LastCasterSeen = 0; - LastSpellSeen = 0xffffffff; SpellHeader = -1; SpellResRef[0] = 0; + LastTarget = 0; LastTargetPos.empty(); locals = new Variables(); locals->SetType( GEM_VARIABLES_INT ); locals->ParseKey( 1 ); InitTriggers(); + AddTrigger(TriggerEntry(trigger_oncreation)); memset( script_timers,0, sizeof(script_timers)); } @@ -157,8 +170,7 @@ void Scriptable::SetMap(Map *map) { if (map && (map->GetCurrentArea()!=map)) { //a map always points to itself (if it is a real map) - printMessage("Scriptable","Invalid map set!\n",LIGHT_RED); - abort(); + error("Scriptable", "Invalid map set!\n"); } area = map; } @@ -169,8 +181,7 @@ void Scriptable::SetMap(Map *map) void Scriptable::SetScript(const ieResRef aScript, int idx, bool ai) { if (idx >= MAX_SCRIPTS) { - printMessage("Scriptable","Invalid script index!\n",LIGHT_RED); - abort(); + error("Scriptable", "Invalid script index!\n"); } if (Scripts[idx]) { delete Scripts[idx]; @@ -270,12 +281,13 @@ void Scriptable::DrawOverheadText(const Region &screen) void Scriptable::DelayedEvent() { - lastRunTime = core->GetGame()->Ticks; + // FIXME: do we need this? + // lastRunTime = core->GetGame()->Ticks; } void Scriptable::ImmediateEvent() { - lastRunTime = 0; + InternalFlags |= IF_FORCEUPDATE; } bool Scriptable::IsPC() const @@ -288,6 +300,62 @@ bool Scriptable::IsPC() const return false; } +void Scriptable::Update() +{ + Ticks++; + AdjustedTicks++; + + TickScripting(); + + ProcessActions(); +} + +void Scriptable::TickScripting() +{ + // Stagger script updates. + if (Ticks % 16 != globalID % 16) + return; + + ieDword actorState = 0; + if (Type == ST_ACTOR) + actorState = ((Actor *)this)->Modified[IE_STATE_ID]; + + // Dead actors only get one chance to run a new script. + if ((actorState & STATE_DEAD) && !(InternalFlags & IF_JUSTDIED)) + return; + + ScriptTicks++; + + // If no action is running, we've had triggers set recently or we haven't checked recently, do a script update. + bool needsUpdate = (!CurrentAction) || (TriggerCountdown > 0) || (IdleTicks > 15); + + // Also do a script update if one was forced.. + if (InternalFlags & IF_FORCEUPDATE) { + needsUpdate = true; + InternalFlags &= ~IF_FORCEUPDATE; + } + // TODO: force for all on-screen actors + + // Charmed actors don't get frequent updates. + if ((actorState & STATE_CHARMED) && (IdleTicks < 5)) + needsUpdate = false; + + if (!needsUpdate) { + IdleTicks++; + return; + } + + if (triggers.size()) + TriggerCountdown = 5; + IdleTicks = 0; + InternalFlags &= ~IF_JUSTDIED; + if (TriggerCountdown > 0) + TriggerCountdown--; + // TODO: set TriggerCountdown once we have real triggers + + ExecuteScript(MAX_SCRIPTS); +} + void Scriptable::ExecuteScript(int scriptCount) { // area scripts still run for at least the current area, in bg1 (see ar2631, confirmed by testing) @@ -309,21 +377,8 @@ void Scriptable::ExecuteScript(int scriptCount) return; } - // only allow death scripts to run once, hopefully? - // this is probably terrible logic which needs moving elsewhere - if ((lastRunTime != 0) && (InternalFlags & IF_JUSTDIED)) { - return; - } bool changed = false; - ieDword thisTime = core->GetGame()->Ticks; - if (( thisTime - lastRunTime ) < 1000) { - return; - } - - lastDelay = lastRunTime; - lastRunTime = thisTime; - // if party AI is disabled, don't run non-override scripts if (Type == ST_ACTOR && ((Actor *) this)->InParty && (core->GetGame()->ControlStatus & CS_PARTY_AI)) scriptCount = 1; @@ -339,6 +394,8 @@ void Scriptable::ExecuteScript(int scriptCount) /* scripts are not concurrent, see WAITPC override script for example */ if (done) break; } + + // FIXME: completely wrong place for this! if (changed && UnselectableTimer) { UnselectableTimer--; if (!UnselectableTimer) { @@ -355,7 +412,7 @@ void Scriptable::ExecuteScript(int scriptCount) void Scriptable::AddAction(Action* aC) { if (!aC) { - printf( "[GameScript]: NULL action encountered for %s!\n",scriptName ); + print( "[GameScript]: NULL action encountered for %s!\n",scriptName ); return; } @@ -378,7 +435,7 @@ void Scriptable::AddAction(Action* aC) void Scriptable::AddActionInFront(Action* aC) { if (!aC) { - printf( "[GameScript]: NULL action encountered for %s!\n",scriptName ); + print( "[GameScript]: NULL action encountered for %s!\n",scriptName ); return; } InternalFlags|=IF_ACTIVE; @@ -433,16 +490,11 @@ void Scriptable::ReleaseCurrentAction() CurrentActionState = 0; CurrentActionTarget = 0; CurrentActionInterruptable = true; + CurrentActionTicks = 0; } -void Scriptable::ProcessActions(bool force) +void Scriptable::ProcessActions() { - unsigned long thisTime = core->GetGame()->Ticks; - - if (!force && (( thisTime - startTime ) < interval)) { - return; - } - startTime = thisTime; if (WaitCounter) { WaitCounter--; if (WaitCounter) return; @@ -452,6 +504,8 @@ void Scriptable::ProcessActions(bool force) CurrentActionInterruptable = true; if (!CurrentAction) { CurrentAction = PopNextAction(); + } else { + CurrentActionTicks++; } if (!CurrentAction) { ClearActions(); @@ -472,9 +526,10 @@ void Scriptable::ProcessActions(bool force) break; } } - if (InternalFlags&IF_IDLE) { + // FIXME + /*if (InternalFlags&IF_IDLE) { Deactivate(); - } + }*/ } bool Scriptable::InMove() const @@ -498,7 +553,7 @@ unsigned long Scriptable::GetWait() const void Scriptable::LeaveDialog() { - InternalFlags |=IF_WASINDIALOG; + AddTrigger(TriggerEntry(trigger_wasindialog)); } void Scriptable::Hide() @@ -538,7 +593,8 @@ void Scriptable::Activate() void Scriptable::PartyRested() { - InternalFlags |=IF_PARTYRESTED; + //InternalFlags |=IF_PARTYRESTED; + AddTrigger(TriggerEntry(trigger_partyrested)); } ieDword Scriptable::GetInternalFlag() @@ -548,13 +604,14 @@ ieDword Scriptable::GetInternalFlag() void Scriptable::InitTriggers() { - tolist.clear(); - bittriggers = 0; + //tolist.clear(); + //bittriggers = 0; + triggers.clear(); } void Scriptable::ClearTriggers() { - for (TriggerObjects::iterator m = tolist.begin(); m != tolist.end (); m++) { + /*for (TriggerObjects::iterator m = tolist.begin(); m != tolist.end (); m++) { *(*m) = 0; } if (!bittriggers) { @@ -577,18 +634,64 @@ void Scriptable::ClearTriggers() } if (bittriggers & BT_PARTYRESTED) { InternalFlags &= ~IF_PARTYRESTED; - } + }*/ InitTriggers(); } -void Scriptable::SetBitTrigger(ieDword bittrigger) +/*void Scriptable::SetBitTrigger(ieDword bittrigger) { bittriggers |= bittrigger; +}*/ + +void Scriptable::AddTrigger(TriggerEntry trigger) +{ + triggers.push_back(trigger); + ImmediateEvent(); + + assert(trigger.triggerID < MAX_TRIGGERS); + if (triggerflags[trigger.triggerID] & TF_SAVED) + LastTrigger = trigger.param1; } -void Scriptable::AddTrigger(ieDword *actorref) -{ - tolist.push_back(actorref); +bool Scriptable::MatchTrigger(unsigned short id, ieDword param) { + for (std::list::iterator m = triggers.begin(); m != triggers.end (); m++) { + TriggerEntry &trigger = *m; + if (trigger.triggerID != id) + continue; + if (param && trigger.param1 != param) + continue; + return true; + } + + return false; +} + +bool Scriptable::MatchTriggerWithObject(unsigned short id, class Object *obj, ieDword param) { + for (std::list::iterator m = triggers.begin(); m != triggers.end (); m++) { + TriggerEntry &trigger = *m; + if (trigger.triggerID != id) + continue; + if (param && trigger.param2 != param) + continue; + if (!MatchActor(this, trigger.param1, obj)) + continue; + return true; + } + + return false; +} + +const TriggerEntry *Scriptable::GetMatchingTrigger(unsigned short id, unsigned int notflags) { + for (std::list::iterator m = triggers.begin(); m != triggers.end (); m++) { + TriggerEntry &trigger = *m; + if (trigger.triggerID != id) + continue; + if (notflags & trigger.flags) + continue; + return &*m; + } + + return NULL; } static EffectRef fx_set_invisible_state_ref = { "State:Invisible", -1 }; @@ -742,7 +845,7 @@ void Scriptable::CreateProjectile(const ieResRef SpellResRef, ieDword tgt, int l } if (tgt) { - area->AddProjectile(pro, origin, LastTarget, fake); + area->AddProjectile(pro, origin, tgt, fake); } else { area->AddProjectile(pro, origin, LastTargetPos); } @@ -758,10 +861,10 @@ void Scriptable::CreateProjectile(const ieResRef SpellResRef, ieDword tgt, int l char tmp[100]; const char* msg = core->GetString(displaymsg->GetStringReference(STR_ACTION_CAST), 0); const char* spell = core->GetString(spl->SpellName); - if (LastTarget) { - target = area->GetActorByGlobalID(LastTarget); + if (tgt) { + target = area->GetActorByGlobalID(tgt); if (!target) { - target=core->GetGame()->GetActorByGlobalID(LastTarget); + target=core->GetGame()->GetActorByGlobalID(tgt); } } if (stricmp(spell, "")) { @@ -773,22 +876,25 @@ void Scriptable::CreateProjectile(const ieResRef SpellResRef, ieDword tgt, int l displaymsg->DisplayStringName(tmp, 0xffffff, this); } - if(LastTarget) { + if (tgt) { if (target && (Type==ST_ACTOR) ) { + target->AddTrigger(TriggerEntry(trigger_spellcastonme, caster->GetGlobalID(), spellnum)); target->LastSpellOnMe = spellnum; - target->LastCasterOnMe = caster->GetGlobalID(); // don't cure invisibility if this is a self targetting invisibility spell // like shadow door //can't check GetEffectBlock, since it doesn't construct the queue for selftargetting spells bool invis = false; unsigned int opcode = EffectQueue::ResolveEffect(fx_set_invisible_state_ref); - for (unsigned int i=0; i < spl->ext_headers[SpellHeader].FeatureCount; i++) { - if (spl->GetExtHeader(SpellHeader)->features[i].Opcode == opcode) { - invis = true; - break; + SPLExtHeader *seh = spl->GetExtHeader(SpellHeader); + if (seh) { + for (unsigned int i=0; i < seh->FeatureCount; i++) { + if (seh->features[i].Opcode == opcode) { + invis = true; + break; + } } } - if (invis && spl->GetExtHeader(SpellHeader)->Target == TARGET_SELF) { + if (invis && seh && seh->Target == TARGET_SELF) { //pass } else { caster->CureInvisibility(); @@ -1283,8 +1389,8 @@ bool Scriptable::TimerExpired(ieDword ID) void Scriptable::StartTimer(ieDword ID, ieDword expiration) { if (ID>=MAX_TIMER) { - printMessage("Scriptable", " ", RED); - printf("Timer id %d exceeded MAX_TIMER %d\n", ID, MAX_TIMER); + printMessage("Scriptable", "Timer id %d exceeded MAX_TIMER %d\n", RED, + ID, MAX_TIMER); return; } script_timers[ID]= core->GetGame()->GameTime + expiration*AI_UPDATE_TIME; @@ -1348,7 +1454,7 @@ void Selectable::DrawCircle(const Region &vp) //doing a time dependent flashing of colors //if it is too fast, increase the 6 to 7 unsigned long step; - GetTime( step ); + step = GetTickCount(); step = tp_steps [(step >> 6) & 7]; mix.a = overColor.a; mix.r = (overColor.r*step+selectedColor.r*(8-step))/8; @@ -1452,6 +1558,7 @@ Highlightable::Highlightable(ScriptableType type) Highlight = false; Cursor = IE_CURSOR_NORMAL; KeyResRef[0] = 0; + EnterWav[0] = 0; } Highlightable::~Highlightable(void) @@ -1482,6 +1589,23 @@ void Highlightable::SetCursor(unsigned char CursorIndex) Cursor = CursorIndex; } +//trap that will fire now +bool Highlightable::TriggerTrap(int /*skill*/, ieDword ID) +{ + if (!Trapped) { + return false; + } + //actually this could be script name[0] + if (!Scripts[0] && !EnterWav[0]) { + return false; + } + AddTrigger(TriggerEntry(trigger_entered, ID)); + if (!TrapResets()) { + Trapped = false; + } + return true; +} + bool Highlightable::TryUnlock(Actor *actor, bool removekey) { const char *Key = GetKey(); Actor *haskey = NULL; @@ -1521,6 +1645,23 @@ bool Highlightable::TryUnlock(Actor *actor, bool removekey) { return true; } +//detect this trap, using a skill, skill could be set to 256 for 'sure' +//skill is the all around modified trap detection skill +//a trapdetectiondifficulty of 100 means impossible detection short of a spell +void Highlightable::DetectTrap(int skill) +{ + if (!CanDetectTrap()) return; + if (!Scripts[0]) return; + if ((skill>=100) && (skill!=256) ) skill = 100; + if (skill/2+core->Roll(1,skill/2,0)>TrapDetectionDiff) { + SetTrapDetected(1); //probably could be set to the player #? + } +} + +bool Highlightable::PossibleToSeeTrap() const +{ + return CanDetectTrap(); +} /***************** * Movable Class * @@ -1625,7 +1766,7 @@ void Movable::SetStance(unsigned int arg) } else { StanceID=IE_ANI_AWAKE; // - printf("Tried to set invalid stance id (%u)\n", arg); + print("Tried to set invalid stance id (%u)\n", arg); } } @@ -1684,7 +1825,7 @@ bool Movable::DoStep(unsigned int walk_speed, ieDword time) step = path; timeStartStep = time; } else if (step->Next && (( time - timeStartStep ) >= walk_speed)) { - //printf("[New Step] : Orientation = %d\n", step->orient); + //print("[New Step] : Orientation = %d\n", step->orient); step = step->Next; timeStartStep = timeStartStep + walk_speed; } @@ -1902,7 +2043,7 @@ void Movable::DrawTargetPoint(const Region &vp) // generates "step" from sequence 3 2 1 0 1 2 3 4 // updated each 1/15 sec unsigned long step; - GetTime( step ); + step = GetTickCount(); step = tp_steps [(step >> 6) & 7]; step = step + 1; diff --git a/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.h b/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.h index 0e5a0c991..788f4d165 100644 --- a/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.h +++ b/project/jni/application/gemrb/gemrb/core/Scriptable/Scriptable.h @@ -23,11 +23,6 @@ #include "exports.h" -#include "CharAnimations.h" -#include "Inventory.h" -#include "PathFinder.h" -#include "Sprite2D.h" -#include "TileOverlay.h" #include "Variables.h" #include @@ -40,10 +35,13 @@ class GameScript; class Gem_Polygon; class Highlightable; class InfoPoint; +class Map; class Movable; +struct PathNode; class Scriptable; class Selectable; class Spell; +class Sprite2D; class SpriteCover; #define MAX_SCRIPTS 8 @@ -93,20 +91,21 @@ class SpriteCover; #define IF_RUNNING 128 //actor is running //these bits could be set by a WalkTo #define IF_RUNFLAGS (IF_RUNNING|IF_NORECTICLE|IF_NOINT) -#define IF_BECAMEVISIBLE 0x100//actor just became visible (trigger event) +//#define IF_BECAMEVISIBLE 0x100//actor just became visible (trigger event) #define IF_INITIALIZED 0x200 #define IF_USEDSAVE 0x400 //actor needed saving throws -#define IF_TARGETGONE 0x800 //actor's target is gone (trigger event) +//#define IF_TARGETGONE 0x800 //actor's target is gone (trigger event) #define IF_USEEXIT 0x1000 // #define IF_INTRAP 0x2000 //actor is currently in a trap (intrap trigger event) -#define IF_WASINDIALOG 0x4000 //actor just left dialog +//#define IF_WASINDIALOG 0x4000 //actor just left dialog //scriptable flags #define IF_ACTIVE 0x10000 #define IF_VISIBLE 0x40000 -#define IF_ONCREATION 0x80000 +//#define IF_ONCREATION 0x80000 #define IF_IDLE 0x100000 -#define IF_PARTYRESTED 0x200000 //party rested trigger event +//#define IF_PARTYRESTED 0x200000 //party rested trigger event +#define IF_FORCEUPDATE 0x400000 //the actor should stop attacking #define IF_STOPATTACK (IF_JUSTDIED|IF_REALLYDIED|IF_CLEANUP|IF_IDLE) @@ -135,7 +134,80 @@ class SpriteCover; typedef enum ScriptableType { ST_ACTOR = 0, ST_PROXIMITY = 1, ST_TRIGGER = 2, ST_TRAVEL = 3, ST_DOOR = 4, ST_CONTAINER = 5, ST_AREA = 6, ST_GLOBAL = 7 } ScriptableType; -typedef std::list TriggerObjects; +enum { + trigger_acquired = 0x1, + trigger_attackedby = 0x2, + trigger_help = 0x3, + trigger_joins = 0x4, + trigger_leaves = 0x5, + trigger_receivedorder = 0x6, + trigger_said = 0x7, + trigger_turnedby = 0x8, + trigger_unusable = 0x9, + trigger_hitby = 0x20, + trigger_hotkey = 0x21, + trigger_timerexpired = 0x22, + trigger_trigger = 0x24, + trigger_die = 0x25, + trigger_targetunreachable = 0x26, + trigger_heard = 0x2f, + trigger_becamevisible = 0x33, + trigger_oncreation = 0x36, + trigger_died = 0x4a, + trigger_killed = 0x4b, + trigger_entered = 0x4c, + trigger_opened = 0x52, + trigger_closed = 0x53, + trigger_detected = 0x54, + trigger_reset = 0x55, + trigger_disarmed = 0x56, + trigger_unlocked = 0x57, + trigger_breakingpoint = 0x5c, + trigger_pickpocketfailed = 0x5d, + trigger_stealfailed = 0x5e, + trigger_disarmfailed = 0x5f, + trigger_picklockfailed = 0x60, + trigger_clicked = 0x70, + trigger_triggerclick = 0x79, // pst + trigger_traptriggered = 0x87, // bg2 + trigger_partymemberdied = 0x88, // bg2 + trigger_spellcast = 0x91, // bg2 + trigger_partyrested = 0x93, // bg2 + trigger_vacant = 0x94, // pst + trigger_summoned = 0x97, // bg2 + trigger_harmlessopened = 0x9d, // pst + trigger_harmlessclosed = 0x9e, // pst + trigger_harmlessentered = 0x9f, // pst + trigger_spellcastonme = 0xa1, // bg2 + trigger_nulldialog = 0xa4, // pst + trigger_wasindialog = 0xa5, // pst + trigger_spellcastpriest = 0xa6, // bg2 + trigger_spellcastinnate = 0xa7, // bg2 + trigger_namelessbitthedust = 0xab, // pst + trigger_failedtoopen = 0xaf, // pst + trigger_tookdamage = 0xcc, // bg2 + trigger_walkedtotrigger = 0xd6 // bg2 +}; + +// flags for TriggerEntry +enum { + // has the effect queue (if any) been processed since this trigger + // was added? (for fx_cast_spell_on_condition) + TEF_PROCESSED_EFFECTS = 1 +}; + +struct TriggerEntry { + TriggerEntry(unsigned short id) : triggerID(id), param1(0), param2(0), flags(0) { } + TriggerEntry(unsigned short id, ieDword p1) : triggerID(id), param1(p1), param2(0), flags(0) { } + TriggerEntry(unsigned short id, ieDword p1, ieDword p2) : triggerID(id), param1(p1), param2(p2), flags(0) { } + + unsigned short triggerID; + ieDword param1; + ieDword param2; + unsigned int flags; +}; + +//typedef std::list TriggerObjects; //#define SEA_RESET 0x00000002 //#define SEA_PARTY_REQUIRED 0x00000004 @@ -145,16 +217,13 @@ public: Scriptable(ScriptableType type); virtual ~Scriptable(void); private: - TriggerObjects tolist; - ieDword bittriggers; - unsigned long startTime; - unsigned long interval; unsigned long WaitCounter; // script_timers should probably be a std::map to // conserve memory (usually at most 2 ids are used) ieDword script_timers[MAX_TIMER]; ieDword globalID; protected: //let Actor access this + std::list triggers; Map *area; ieVariable scriptName; ieDword InternalFlags; //for triggers @@ -166,18 +235,24 @@ public: int CurrentActionState; ieDword CurrentActionTarget; bool CurrentActionInterruptable; + ieDword CurrentActionTicks; - // Timing state for ExecuteScript. - ieDword lastDelay; - ieDword lastRunTime; + // The number of times this was updated. + ieDword Ticks; + // The same, after adjustment for being slowed/hasted. + ieDword AdjustedTicks; + // The number of times UpdateActions() was run. + ieDword ScriptTicks; + // The number of times since UpdateActions() tried to do anything. + ieDword IdleTicks; + // The countdown for forced activation by triggers. + ieDword TriggerCountdown; Variables* locals; ScriptableType Type; Point Pos; ieStrRef DialogName; - //play this wav file when stepping on the trap - ieResRef EnterWav; GameScript* Scripts[MAX_SCRIPTS]; @@ -190,22 +265,27 @@ public: ieDword UnselectableTimer; // Stored objects. - ieDword TriggerID; //for sendtrigger - ieDword LastTrigger; // also LastClosed - ieDword LastTriggerObject; // hack until someone fixes triggers - ieDword LastEntered; // also LastOpened - ieDword LastDisarmed; // also LastAttacker - ieDword LastDisarmFailed; //also LastTarget - ieDword LastUnlocked; - ieDword LastOpenFailed; // also LastPickpocketFailed - ieDword LastPickLockFailed; - int LastOrder; - ieDword LastOrderer; - ieDword LastSpellOnMe; //Last spell cast on this scriptable - ieDword LastCasterOnMe; //Last spellcaster on this scriptable - ieDword LastSpellSeen; //Last spell seen to be cast - ieDword LastCasterSeen; //Last spellcaster seen + ieDword LastAttacker; + ieDword LastCommander; + ieDword LastProtector; + ieDword LastProtectee; + ieDword LastTargetedBy; + ieDword LastHitter; + ieDword LastHelp; + ieDword LastTrigger; + ieDword LastSeen; + ieDword LastTalker; + ieDword LastHeard; + ieDword LastSummoner; + ieDword LastFollowed; // gemrb extension (LeaderOf) + ieDword LastMarked; // iwd2 + int LastMarkedSpell; // iwd2 + + // this is used by GUIScript :( + ieDword LastSpellOnMe; //Last spell cast on this scriptable + + ieDword LastTarget; Point LastTargetPos; int SpellHeader; ieResRef SpellResRef; @@ -241,7 +321,9 @@ public: //call this to enable script running as soon as possible void ImmediateEvent(); bool IsPC() const; - void ExecuteScript(int scriptCount); + virtual void Update(); + void TickScripting(); + virtual void ExecuteScript(int scriptCount); void AddAction(Action* aC); void AddActionInFront(Action* aC); Action* GetCurrentAction() const { return CurrentAction; } @@ -250,13 +332,15 @@ public: void ClearActions(); void ReleaseCurrentAction(); bool InMove() const; - void ProcessActions(bool force); + void ProcessActions(); //these functions handle clearing of triggers that resulted a //true condition (whole triggerblock returned true) void InitTriggers(); void ClearTriggers(); - void SetBitTrigger(ieDword bittrigger); - void AddTrigger(ieDword *actorref); + void AddTrigger(TriggerEntry trigger); + bool MatchTrigger(unsigned short id, ieDword param = 0); + bool MatchTriggerWithObject(unsigned short id, class Object *obj, ieDword param = 0); + const TriggerEntry *GetMatchingTrigger(unsigned short id, unsigned int notflags = 0); /* re/draws overhead text on the map screen */ void DrawOverheadText(const Region &screen); /* check if casting is allowed at all */ @@ -334,6 +418,8 @@ public: ieWord Trapped; ieWord TrapDetected; ieResRef KeyResRef; + //play this wav file when stepping on the trap (on PST) + ieResRef EnterWav; public: bool IsOver(const Point &Pos) const; void DrawOutline() const; diff --git a/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.cpp b/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.cpp index f1c9d9e16..9586840ea 100644 --- a/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.cpp +++ b/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.cpp @@ -25,10 +25,14 @@ #include "win32def.h" +#include "Animation.h" +#include "AnimationFactory.h" #include "Audio.h" #include "Game.h" #include "GameData.h" #include "Interface.h" +#include "Map.h" +#include "Sprite2D.h" #include "Video.h" #define ILLEGAL 0 // @@ -226,7 +230,7 @@ void ScriptedAnimation::LoadAnimationFactory(AnimationFactory *af, int gettwin) } /* Creating animation from VVC */ -ScriptedAnimation::ScriptedAnimation(DataStream* stream, bool autoFree) +ScriptedAnimation::ScriptedAnimation(DataStream* stream) { Init(); if (!stream) { @@ -237,9 +241,8 @@ ScriptedAnimation::ScriptedAnimation(DataStream* stream, bool autoFree) stream->Read( Signature, 8); if (strncmp( Signature, "VVC V1.0", 8 ) != 0) { - printf( "Not a valid VVC File\n" ); - if (autoFree) - delete( stream ); + print( "Not a valid VVC File\n" ); + delete stream; return; } ieResRef Anim1ResRef; @@ -383,9 +386,7 @@ ScriptedAnimation::ScriptedAnimation(DataStream* stream, bool autoFree) SetPhase(P_ONSET); - if (autoFree) { - delete( stream ); - } + delete stream; } ScriptedAnimation::~ScriptedAnimation(void) diff --git a/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.h b/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.h index 088a8bf8b..69fe14a5f 100644 --- a/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.h +++ b/project/jni/application/gemrb/gemrb/core/ScriptedAnimation.h @@ -22,12 +22,15 @@ #include "exports.h" -#include "AnimationFactory.h" #include "Audio.h" -#include "Map.h" #include "Palette.h" #include "SpriteCover.h" -#include "System/DataStream.h" + +class Animation; +class AnimationFactory; +class DataStream; +class Map; +class Sprite2D; //scripted animation flags #define S_ANI_PLAYONCE 8 //(same as area animation) @@ -72,7 +75,7 @@ class GEM_EXPORT ScriptedAnimation { public: ScriptedAnimation(); ~ScriptedAnimation(void); - ScriptedAnimation(DataStream* stream, bool autoFree = true); + ScriptedAnimation(DataStream* stream); void Init(); void LoadAnimationFactory(AnimationFactory *af, int gettwin = 0); void Override(ScriptedAnimation *templ); diff --git a/project/jni/application/gemrb/gemrb/core/Spell.cpp b/project/jni/application/gemrb/gemrb/core/Spell.cpp index 06512ebf1..69aeea51e 100644 --- a/project/jni/application/gemrb/gemrb/core/Spell.cpp +++ b/project/jni/application/gemrb/gemrb/core/Spell.cpp @@ -196,8 +196,8 @@ Projectile *Spell::GetProjectile(Scriptable *self, int header, const Point &targ { SPLExtHeader *seh = GetExtHeader(header); if (!seh) { - printMessage("Spell", "Cannot retrieve spell header!!! ",RED); - printf("required header: %d, maximum: %d\n", header, (int) ExtHeaderCount); + printMessage("Spell", "Cannot retrieve spell header!!! required header: %d, maximum: %d\n", RED, + header, (int) ExtHeaderCount); return NULL; } Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(seh->ProjectileAnimation); @@ -225,8 +225,8 @@ unsigned int Spell::GetCastingDistance(Scriptable *Sender) const int idx = GetHeaderIndexFromLevel(level); SPLExtHeader *seh = GetExtHeader(idx); if (!seh) { - printMessage("Spell", "Cannot retrieve spell header!!! ",RED); - printf("required header: %d, maximum: %d\n", idx, (int) ExtHeaderCount); + printMessage("Spell", "Cannot retrieve spell header!!! required header: %d, maximum: %d\n", RED, + idx, (int) ExtHeaderCount); return 0; } diff --git a/project/jni/application/gemrb/gemrb/core/SpellMgr.h b/project/jni/application/gemrb/gemrb/core/SpellMgr.h index 44c10325f..15fbaba59 100644 --- a/project/jni/application/gemrb/gemrb/core/SpellMgr.h +++ b/project/jni/application/gemrb/gemrb/core/SpellMgr.h @@ -40,7 +40,7 @@ class GEM_EXPORT SpellMgr : public Plugin { public: SpellMgr(void); virtual ~SpellMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Spell* GetSpell(Spell *spl, bool silent=false) = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/Spellbook.cpp b/project/jni/application/gemrb/gemrb/core/Spellbook.cpp index b910faf67..9c2f0ddcb 100644 --- a/project/jni/application/gemrb/gemrb/core/Spellbook.cpp +++ b/project/jni/application/gemrb/gemrb/core/Spellbook.cpp @@ -164,7 +164,7 @@ bool Spellbook::HaveSpell(int spellid, ieDword flags) if (atoi(ms->SpellResRef+4)==spellid) { if (flags&HS_DEPLETE) { if (DepleteSpell(ms) && (sorcerer & (1<SpellResRef); } } return true; @@ -231,7 +231,7 @@ bool Spellbook::HaveSpell(const char *resref, ieDword flags) } if (flags&HS_DEPLETE) { if (DepleteSpell(ms) && (sorcerer & (1<SpellResRef); } } return true; @@ -285,7 +285,7 @@ unsigned int Spellbook::GetTotalMemorizedSpellsCount() const for (int type = 0; type < NUM_BOOK_TYPES; type++) { unsigned int level = GetSpellLevelCount(type); while(level--) { - total += GetMemorizedSpellsCount(type, level); + total += GetMemorizedSpellsCount(type, level, false); } } return total; @@ -470,25 +470,69 @@ CREKnownSpell* Spellbook::GetKnownSpell(int type, unsigned int level, unsigned i return spells[type][level]->known_spells[index]; } -unsigned int Spellbook::GetMemorizedSpellsCount(int type) const +unsigned int Spellbook::GetMemorizedSpellsCount(int type, bool real) const { unsigned int count = 0; size_t i=GetSpellLevelCount(type); while(i--) { - count += (unsigned int) spells[type][i]->memorized_spells.size(); + if (real) { + int j = spells[type][i]->memorized_spells.size(); + while(j--) { + if (spells[type][i]->memorized_spells[j]->Flags) count++; + } + } else { + count += (unsigned int) spells[type][i]->memorized_spells.size(); + } } return count; } -unsigned int Spellbook::GetMemorizedSpellsCount(int type, unsigned int level) const +unsigned int Spellbook::GetMemorizedSpellsCount(int type, unsigned int level, bool real) const { if (type >= NUM_BOOK_TYPES) return 0; if (level >= GetSpellLevelCount(type)) return 0; + if (real) { + unsigned int count = 0; + int j = spells[type][level]->memorized_spells.size(); + while(j--) { + if (spells[type][level]->memorized_spells[j]->Flags) count++; + } + return count; + } return (unsigned int) spells[type][level]->memorized_spells.size(); } +unsigned int Spellbook::GetMemorizedSpellsCount(const ieResRef name, int type, bool real) const +{ + if (type >= NUM_BOOK_TYPES) + return 0; + int t; + if (type<0) { + t = NUM_BOOK_TYPES-1; + } else { + t = type; + } + + int j = 0; + while(t>=0) { + unsigned int level = GetSpellLevelCount(t); + while(level--) { + int i = spells[t][level]->memorized_spells.size(); + while(i--) { + CREMemorizedSpell *cms = spells[t][level]->memorized_spells[i]; + + if (strnicmp(cms->SpellResRef, name, sizeof(ieResRef) ) ) continue; + if (!real || cms->Flags) j++; + } + } + if (type>=0) break; + t--; + } + return j; +} + CREMemorizedSpell* Spellbook::GetMemorizedSpell(int type, unsigned int level, unsigned int index) const { if (type >= NUM_BOOK_TYPES || level >= GetSpellLevelCount(type) || index >= spells[type][level]->memorized_spells.size()) @@ -755,7 +799,7 @@ bool Spellbook::DepleteSpell(int type) for (unsigned int k = 0; k < sm->memorized_spells.size(); k++) { if (DepleteSpell( sm->memorized_spells[k] )) { if (sorcerer & (1<memorized_spells[k]->SpellResRef); } return true; } @@ -764,19 +808,23 @@ bool Spellbook::DepleteSpell(int type) return false; } -void Spellbook::DepleteLevel(CRESpellMemorization* sm) +void Spellbook::DepleteLevel(CRESpellMemorization* sm, const ieResRef except) { size_t cnt = sm->memorized_spells.size(); ieResRef last={""}; + for (size_t i = 0; i < cnt && cnt>0; i++) { CREMemorizedSpell *cms = sm->memorized_spells[i]; //sorcerer spells are created in orderly manner - if (strncmp(last,cms->SpellResRef,8) ) { + if (cms->Flags && strncmp(last,cms->SpellResRef,8) && strncmp(except,cms->SpellResRef,8)) { memcpy(last, cms->SpellResRef, sizeof(ieResRef) ); + cms->Flags=0; +/* delete cms; sm->memorized_spells.erase(sm->memorized_spells.begin()+i); i--; cnt--; +*/ } } } @@ -799,7 +847,7 @@ bool Spellbook::DepleteSpell(int type, unsigned int page, unsigned int slot) CREMemorizedSpell* cms = sm->memorized_spells[slot]; ret = DepleteSpell(cms); if (ret && (sorcerer & (1<SpellResRef); } return ret; @@ -878,6 +926,20 @@ unsigned int Spellbook::GetSpellInfoSize(int type) return count; } +bool Spellbook::FindSpellInfo(SpellExtHeader *array, ieResRef spellname) +{ + memset(array, 0, sizeof(SpellExtHeader) ); + if (spellinfo.size() == 0) { + GenerateSpellInfo(); + } + for (unsigned int i = 0; ispellname, spellname, sizeof(ieResRef) ) ) continue; + memcpy(array, spellinfo[i], sizeof(SpellExtHeader)); + return true; + } + return false; +} + SpellExtHeader *Spellbook::FindSpellInfo(unsigned int level, unsigned int type, const ieResRef spellname) { size_t i = spellinfo.size(); @@ -908,16 +970,16 @@ void Spellbook::AddSpellInfo(unsigned int sm_level, unsigned int sm_type, const seh = new SpellExtHeader; spellinfo.push_back( seh ); - + memcpy(seh->spellname, spellname, sizeof(ieResRef) ); int ehc; - + for (ehc = 0; ehc < spl->ExtHeaderCount-1; ehc++) { if (levelext_headers[ehc+1].RequiredLevel) { break; } } - + SPLExtHeader *ext_header = spl->ext_headers+ehc; seh->headerindex = ehc; seh->level = sm_level; @@ -989,27 +1051,27 @@ void Spellbook::dump() { unsigned int k; - printf( "SPELLBOOK:\n" ); + print( "SPELLBOOK:\n" ); for (int i = 0; i < NUM_BOOK_TYPES; i++) { for (unsigned int j = 0; j < spells[i].size(); j++) { CRESpellMemorization* sm = spells[i][j]; if (sm->known_spells.size()) - printf( " Known spells:\n" ); + print( " Known spells:\n" ); for (k = 0; k < sm->known_spells.size(); k++) { CREKnownSpell* spl = sm->known_spells[k]; if (!spl) continue; - printf ( " %2d: %8s L: %d T: %d\n", k, spl->SpellResRef, spl->Level, spl->Type ); + print ( " %2d: %8s L: %d T: %d\n", k, spl->SpellResRef, spl->Level, spl->Type ); } if (sm->memorized_spells.size()) - printf( " Memorized spells:\n" ); + print( " Memorized spells:\n" ); for (k = 0; k < sm->memorized_spells.size (); k++) { CREMemorizedSpell* spl = sm->memorized_spells[k]; if (!spl) continue; - printf ( " %2u: %8s %x\n", k, spl->SpellResRef, spl->Flags ); + print ( " %2u: %8s %x\n", k, spl->SpellResRef, spl->Flags ); } } } diff --git a/project/jni/application/gemrb/gemrb/core/Spellbook.h b/project/jni/application/gemrb/gemrb/core/Spellbook.h index 97c962e1c..4feeba153 100644 --- a/project/jni/application/gemrb/gemrb/core/Spellbook.h +++ b/project/jni/application/gemrb/gemrb/core/Spellbook.h @@ -138,7 +138,7 @@ private: /** Sets spell from memorized as 'already-cast' */ bool DepleteSpell(CREMemorizedSpell* spl); /** Depletes a sorcerer type spellpage by one */ - void DepleteLevel(CRESpellMemorization* sm); + void DepleteLevel(CRESpellMemorization* sm, const ieResRef except); /** Adds a single spell to the spell info list */ void AddSpellInfo(unsigned int level, unsigned int type, const ieResRef name, unsigned int idx); /** regenerates the spellinfo list */ @@ -195,8 +195,9 @@ public: /** adds a spell to the book, returns experience if learned */ int LearnSpell(Spell *spell, int memo); CREKnownSpell* GetKnownSpell(int type, unsigned int level, unsigned int index) const; - unsigned int GetMemorizedSpellsCount(int type) const; - unsigned int GetMemorizedSpellsCount(int type, unsigned int level) const; + unsigned int GetMemorizedSpellsCount(int type, bool real) const; + unsigned int GetMemorizedSpellsCount(int type, unsigned int level, bool real) const; + unsigned int GetMemorizedSpellsCount(const ieResRef name, int type, bool real) const; CREMemorizedSpell* GetMemorizedSpell(int type, unsigned int level, unsigned int index) const; int GetMemorizableSpellsCount(int type, unsigned int level, bool bonus) const; @@ -241,6 +242,10 @@ public: /** lists spells of a type */ bool GetSpellInfo(SpellExtHeader *array, int type, int startindex, int count); + + /** find the first spell matching resref */ + bool FindSpellInfo(SpellExtHeader *array, ieResRef spellname); + /** Dumps spellbook to stdout for debugging */ void dump(); }; diff --git a/project/jni/application/gemrb/gemrb/core/Store.cpp b/project/jni/application/gemrb/gemrb/core/Store.cpp index 5d60994b6..a61568110 100644 --- a/project/jni/application/gemrb/gemrb/core/Store.cpp +++ b/project/jni/application/gemrb/gemrb/core/Store.cpp @@ -197,12 +197,13 @@ STOItem *Store::FindItem(CREItem *item, bool exact) if (strnicmp(item->ItemResRef, temp->ItemResRef, 8) ) { continue; } - if(exact) { + if (exact) { + // Infinite supply means we don't have to worry about keeping track of amounts. if (temp->InfiniteSupply==-1) { return temp; } - //check if we could simply merge the item into the stock or need a new entry - if ((temp->StackAmount>=99) || memcmp(temp->Usages, item->Usages, sizeof(item->Usages))) { + // Check if we have a non-stackable item with a different number of charges. + if (item->MaxStackAmount < 2 && memcmp(temp->Usages, item->Usages, sizeof(item->Usages))) { continue; } } @@ -245,7 +246,21 @@ void Store::AddItem(CREItem *item) if (temp) { if (temp->InfiniteSupply!=-1) { - temp->StackAmount++; + if (item->MaxStackAmount > 1) { + // Stacked, so increase usages. + ieDword newAmount = 1; + if (item->Usages[0] != temp->Usages[0] && item->Usages[0] > 0) { + // Stack sizes differ! + // For now, we do what bg2 does and just round up. + newAmount = item->Usages[0] / temp->Usages[0]; + if (item->Usages[0] % temp->Usages[0]) + newAmount++; + } + temp->AmountInStock += newAmount; + } else { + // Not stacked, so just increase the amount. + temp->AmountInStock++; + } } return; } @@ -255,6 +270,12 @@ void Store::AddItem(CREItem *item) //a real class from struct, make sure the fields are cleared memset( temp, 0, sizeof (STOItem ) ); memcpy( temp, item, sizeof( CREItem ) ); + temp->AmountInStock = 1; + if (temp->MaxStackAmount > 1 && temp->Usages[0] > 1) { + // For now, we do what bg2 does and add new items in stacks of 1. + temp->AmountInStock = item->Usages[0]; + temp->Usages[0] = 1; + } items.push_back (temp ); ItemsCount++; } @@ -262,8 +283,7 @@ void Store::AddItem(CREItem *item) void Store::RemoveItem( unsigned int idx ) { if (items.size()!=ItemsCount) { - printMessage("Store","Inconsistent store", LIGHT_RED); - abort(); + error("Store", "Inconsistent store"); } if (ItemsCount<=idx) { return; diff --git a/project/jni/application/gemrb/gemrb/core/Store.h b/project/jni/application/gemrb/gemrb/core/Store.h index aaabd35a8..776bf9876 100644 --- a/project/jni/application/gemrb/gemrb/core/Store.h +++ b/project/jni/application/gemrb/gemrb/core/Store.h @@ -69,7 +69,7 @@ struct STOItem { ieDword Flags; // 2 cached values from associated item. LEAVE IT SIGNED! int Weight; - int StackAmount; + int MaxStackAmount; ieDword AmountInStock; ieDwordSigned InfiniteSupply; // V1.1 diff --git a/project/jni/application/gemrb/gemrb/core/StoreMgr.h b/project/jni/application/gemrb/gemrb/core/StoreMgr.h index 16a7070bc..b83b732aa 100644 --- a/project/jni/application/gemrb/gemrb/core/StoreMgr.h +++ b/project/jni/application/gemrb/gemrb/core/StoreMgr.h @@ -41,11 +41,10 @@ class GEM_EXPORT StoreMgr : public Plugin { public: StoreMgr(void); virtual ~StoreMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Store* GetStore(Store *s) = 0; - virtual int GetStoredFileSize(Store *s) = 0; - virtual int PutStore(DataStream* stream, Store *s) = 0; + virtual bool PutStore(DataStream* stream, Store *s) = 0; }; #endif diff --git a/project/jni/application/gemrb/gemrb/core/StringMgr.h b/project/jni/application/gemrb/gemrb/core/StringMgr.h index be18bd1e3..a7713406d 100644 --- a/project/jni/application/gemrb/gemrb/core/StringMgr.h +++ b/project/jni/application/gemrb/gemrb/core/StringMgr.h @@ -52,7 +52,7 @@ public: virtual ~StringMgr(void); virtual void OpenAux() = 0; virtual void CloseAux() = 0; - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual char* GetString(ieStrRef strref, unsigned int flags = 0) = 0; virtual StringBlock GetStringBlock(ieStrRef strref, unsigned int flags = 0) = 0; virtual void FreeString(char *str) = 0; diff --git a/project/jni/application/gemrb/gemrb/core/SymbolMgr.h b/project/jni/application/gemrb/gemrb/core/SymbolMgr.h index ebf339912..d45bd3b00 100644 --- a/project/jni/application/gemrb/gemrb/core/SymbolMgr.h +++ b/project/jni/application/gemrb/gemrb/core/SymbolMgr.h @@ -14,8 +14,6 @@ * 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. - * - * */ /** @@ -24,13 +22,9 @@ * @author The GemRB Project */ - #ifndef SYMBOLMGR_H #define SYMBOLMGR_H -/** GetValue returns this if text is not found in arrays */ -#define SYMBOL_VALUE_NOT_LOCATED -65535 - #include "Plugin.h" #include "System/DataStream.h" @@ -43,7 +37,8 @@ class GEM_EXPORT SymbolMgr : public Plugin { public: SymbolMgr(void); virtual ~SymbolMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; + /// Returns -1 if string isn't found. virtual int GetValue(const char* text) const = 0; virtual char* GetValue(int val) const = 0; virtual char* GetStringIndex(unsigned int Index) const = 0; diff --git a/project/jni/application/gemrb/gemrb/core/System/DataStream.cpp b/project/jni/application/gemrb/gemrb/core/System/DataStream.cpp index 71c0f193b..473aa1e0f 100644 --- a/project/jni/application/gemrb/gemrb/core/System/DataStream.cpp +++ b/project/jni/application/gemrb/gemrb/core/System/DataStream.cpp @@ -24,6 +24,8 @@ #include +static const char* GEM_ENCRYPTION_KEY = "\x88\xa8\x8f\xba\x8a\xd3\xb9\xf5\xed\xb1\xcf\xea\xaa\xe4\xb5\xfb\xeb\x82\xf9\x90\xca\xc9\xb5\xe7\xdc\x8e\xb7\xac\xee\xf7\xe0\xca\x8e\xea\xca\x80\xce\xc5\xad\xb7\xc4\xd0\x84\x93\xd5\xf0\xeb\xc8\xb4\x9d\xcc\xaf\xa5\x95\xba\x99\x87\xd2\x9d\xe3\x91\xba\x90\xca"; + static bool EndianSwitch = false; DataStream::DataStream(void) @@ -49,7 +51,7 @@ bool DataStream::IsEndianSwitch() /** Returns true if the stream is encrypted */ bool DataStream::CheckEncrypted() { - ieWord two; + ieWord two = 0x0000; // if size < 2, two won't be initialized Seek( 0, GEM_STREAM_START ); Read( &two, 2 ); if (two == 0xFFFF) { @@ -183,3 +185,36 @@ int DataStream::WriteResRef(const ieResRef src) { return Write( src, 8); } + +int DataStream::ReadLine(void* buf, unsigned int maxlen) +{ + // FIXME: eof? + if (!maxlen) { + return 0; + } + unsigned char * p = ( unsigned char * ) buf; + if (Pos >= size) { + p[0]=0; + return -1; + } + unsigned int i = 0; + while (i < ( maxlen - 1 )) { + char ch; + Read(&ch, 1); + if (( ( char ) ch ) == '\n') + break; + if (( ( char ) ch ) == '\t') + ch = ' '; + if (( ( char ) ch ) != '\r') + p[i++] = ch; + if (Pos == size) + break; + } + p[i] = 0; + return i; +} + +DataStream* DataStream::Clone() +{ + return NULL; +} diff --git a/project/jni/application/gemrb/gemrb/core/System/DataStream.h b/project/jni/application/gemrb/gemrb/core/System/DataStream.h index e20c1183e..2321a7fb4 100644 --- a/project/jni/application/gemrb/gemrb/core/System/DataStream.h +++ b/project/jni/application/gemrb/gemrb/core/System/DataStream.h @@ -68,10 +68,17 @@ public: /** Returns true if the stream is encrypted */ bool CheckEncrypted(); void ReadDecrypted(void* buf, unsigned int size); - virtual int ReadLine(void* buf, unsigned int maxlen) = 0; + int ReadLine(void* buf, unsigned int maxlen); /** Endian Switch setup */ static void SetEndianSwitch(int par); static bool IsEndianSwitch(); + /** Create a copy of this stream. + * + * Returns NULL on failure. + **/ + virtual DataStream* Clone(); +private: + DataStream(const DataStream&); }; #endif // ! DATASTREAM_H diff --git a/project/jni/application/gemrb/gemrb/core/System/FileStream.cpp b/project/jni/application/gemrb/gemrb/core/System/FileStream.cpp index eeeabc103..d24ee0bdf 100644 --- a/project/jni/application/gemrb/gemrb/core/System/FileStream.cpp +++ b/project/jni/application/gemrb/gemrb/core/System/FileStream.cpp @@ -24,147 +24,226 @@ #include "Interface.h" +#ifdef WIN32 +struct FileStream::File { +private: + HANDLE file; +public: + File() : file() {} + void Close() { CloseHandle(file); } + size_t Length() { + LARGE_INTEGER size; + DWORD high; + DWORD low = GetFileSize(file, &high); + if (low != 0xFFFFFFFF || GetLastError() == NO_ERROR) { + size.LowPart = low; + size.HighPart = high; + return size.QuadPart; + } + return 0; + } + bool OpenRO(const char *name) { + file = CreateFile(name, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (file != INVALID_HANDLE_VALUE); + } + bool OpenRW(const char *name) { + file = CreateFile(name, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (file != INVALID_HANDLE_VALUE); + } + bool OpenNew(const char *name) { + file = CreateFile(name, + GENERIC_WRITE, + FILE_SHARE_READ, + NULL, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL); + return (file != INVALID_HANDLE_VALUE); + } + size_t Read(void* ptr, size_t length) { + unsigned long read; + if (!ReadFile(file, ptr, length, &read, NULL)) + return 0; + return read; + } + size_t Write(const void* ptr, size_t length) { + unsigned long wrote; + if (!WriteFile(file, ptr, length, &wrote, NULL)) + return 0; + return wrote; + } + bool SeekStart(int offset) + { + return SetFilePointer(file, offset, NULL, FILE_BEGIN) != 0xffffffff; + } + bool SeekCurrent(int offset) + { + return SetFilePointer(file, offset, NULL, FILE_CURRENT) != 0xffffffff; + } + bool SeekEnd(int offset) + { + return SetFilePointer(file, offset, NULL, FILE_END) != 0xffffffff; + } +}; +#else +struct FileStream::File { +private: + FILE* file; +public: + File() : file(NULL) {} + void Close() { fclose(file); } + size_t Length() { + fseek(file, 0, SEEK_END); + size_t size = ftell(file); + fseek(file, 0, SEEK_SET); + return size; + } + bool OpenRO(const char *name) { + return (file = fopen(name, "rb")); + } + bool OpenRW(const char *name) { + return (file = fopen(name, "r+b")); + } + bool OpenNew(const char *name) { + return (file = fopen(name, "wb")); + } + size_t Read(void* ptr, size_t length) { + return fread(ptr, 1, length, file); + } + size_t Write(const void* ptr, size_t length) { + return fwrite(ptr, 1, length, file); + } + bool SeekStart(int offset) + { + return !fseek(file, offset, SEEK_SET); + } + bool SeekCurrent(int offset) + { + return !fseek(file, offset, SEEK_CUR); + } + bool SeekEnd(int offset) + { + return !fseek(file, offset, SEEK_END); + } +}; +#endif + FileStream::FileStream(void) { opened = false; created = false; - str = NULL; - autoFree = false; + str = new File(); +} + +DataStream* FileStream::Clone() +{ + return OpenFile(originalfile); } FileStream::~FileStream(void) { - if (autoFree && str) { -#ifdef _DEBUG - core->FileStreamPtrCount--; -#endif - _fclose( str ); - } - str = NULL; + Close(); + delete str; } -bool FileStream::Open(const char* fname, bool aF) +void FileStream::Close() { - if (str && autoFree) { + if (opened) { #ifdef _DEBUG core->FileStreamPtrCount--; #endif - _fclose( str ); - str = NULL; + str->Close(); } + opened = false; + created = false; +} + +void FileStream::FindLength() +{ + size = str->Length(); + Pos = 0; +} + +bool FileStream::Open(const char* fname) +{ + Close(); if (!file_exists(fname)) { return false; } - autoFree = aF; - str = _fopen( fname, "rb" ); - if (str == NULL) { + if (!str->OpenRO(fname)) { return false; } #ifdef _DEBUG core->FileStreamPtrCount++; #endif - startpos = 0; opened = true; created = false; - //FIXME: this is a very lame way to tell the file length - _fseek( str, 0, SEEK_END ); - size = _ftell( str ); - _fseek( str, 0, SEEK_SET ); + FindLength(); ExtractFileFromPath( filename, fname ); strncpy( originalfile, fname, _MAX_PATH); - Pos = 0; return true; } -bool FileStream::Modify(const char* fname, bool aF) +bool FileStream::Modify(const char* fname) { - if (str && autoFree) { -#ifdef _DEBUG - core->FileStreamPtrCount--; -#endif - _fclose( str ); - } - autoFree = aF; - str = _fopen( fname, "r+b" ); - if (str == NULL) { + Close(); + + if (!str->OpenRW(fname)) { return false; } #ifdef _DEBUG core->FileStreamPtrCount++; #endif - startpos = 0; opened = true; created = true; - //FIXME: this is a very lame way to tell the file length - _fseek( str, 0, SEEK_END ); - size = _ftell( str ); - _fseek( str, 0, SEEK_SET ); + FindLength(); ExtractFileFromPath( filename, fname ); strncpy( originalfile, fname, _MAX_PATH); Pos = 0; return true; } -bool FileStream::Open(_FILE* stream, int spos, int maxsize, bool aF) -{ - if (str && autoFree) { -#ifdef _DEBUG - core->FileStreamPtrCount--; -#endif - _fclose( str ); - } - autoFree = aF; - str = stream; - if (str == NULL) { - return false; - } -#ifdef _DEBUG - core->FileStreamPtrCount++; -#endif - startpos = spos; - opened = true; - created = false; - size = maxsize; - filename[0]=0; - originalfile[0]=0; - _fseek( str, spos, SEEK_SET ); - Pos = 0; - return true; -} - //Creating file in the cache -//Create is ALWAYS autofree bool FileStream::Create(const char* fname, SClass_ID ClassID) { return Create(core->CachePath, fname, ClassID); } -//Creating file outside of the cache bool FileStream::Create(const char *folder, const char* fname, SClass_ID ClassID) { - if (str && autoFree) { -#ifdef _DEBUG - core->FileStreamPtrCount--; -#endif - _fclose( str ); - } - autoFree = true; + char path[_MAX_PATH]; + char filename[_MAX_PATH]; ExtractFileFromPath( filename, fname ); - strcpy( originalfile, folder ); - strcat( originalfile, SPathDelimiter); - strcat( originalfile, filename ); - strcat( originalfile, core->TypeExt( ClassID ) ); - str = _fopen( originalfile, "wb" ); - if (str == NULL) { + PathJoinExt(path, folder, filename, core->TypeExt(ClassID)); + return Create(path); +} + +//Creating file outside of the cache +bool FileStream::Create(const char *path) +{ + Close(); + + ExtractFileFromPath( filename, path ); + strncpy(originalfile, path, _MAX_PATH); + + if (!str->OpenNew(originalfile)) { return false; } opened = true; created = true; Pos = 0; size = 0; - startpos = 0; return true; } @@ -178,7 +257,7 @@ int FileStream::Read(void* dest, unsigned int length) if (Pos+length>size ) { return GEM_ERROR; } - size_t c = _fread( dest, 1, length, str ); + size_t c = str->Read(dest, length); if (c != length) { return GEM_ERROR; } @@ -196,7 +275,7 @@ int FileStream::Write(const void* src, unsigned int length) } // do encryption here if needed - size_t c = _fwrite( src, 1, length, str ); + size_t c = str->Write(src, length); if (c != length) { return GEM_ERROR; } @@ -214,16 +293,16 @@ int FileStream::Seek(int newpos, int type) } switch (type) { case GEM_STREAM_END: - _fseek( str, startpos + size - newpos, SEEK_SET); + str->SeekStart(size - newpos); Pos = size - newpos; break; case GEM_CURRENT_POS: - _fseek( str, newpos, SEEK_CUR ); + str->SeekCurrent(newpos); Pos += newpos; break; case GEM_STREAM_START: - _fseek( str, startpos + newpos, SEEK_SET ); + str->SeekStart(newpos); Pos = newpos; break; @@ -231,51 +310,18 @@ int FileStream::Seek(int newpos, int type) return GEM_ERROR; } if (Pos>size) { - printf("[Streams]: Invalid seek position %ld in file %s (limit: %ld)\n",Pos, filename, size); + print("[Streams]: Invalid seek position %ld in file %s (limit: %ld)\n",Pos, filename, size); return GEM_ERROR; } return GEM_OK; } -/** No descriptions */ -int FileStream::ReadLine(void* buf, unsigned int maxlen) +FileStream* FileStream::OpenFile(const char* filename) { - if(!maxlen) { - return 0; - } - unsigned char * p = ( unsigned char * ) buf; - if (_feof( str )) { - p[0]=0; - return -1; - } - if (Pos >= size) { - p[0]=0; - return -1; - } - unsigned int i = 0; - while (i < ( maxlen - 1 )) { - int ch = _fgetc( str ); - if (Pos == size) - break; - if (Encrypted) { - ch ^= GEM_ENCRYPTION_KEY[Pos & 63]; - } - Pos++; - if (( ( char ) ch ) == '\n') - break; - if (( ( char ) ch ) == '\t') - ch = ' '; - if (( ( char ) ch ) != '\r') - p[i++] = ch; - //Warning:this feof implementation reads forward one byte - if (_feof( str )) - break; - } - p[i] = 0; - return i; -} + FileStream *fs = new FileStream(); + if (fs->Open(filename)) + return fs; -unsigned long FileStream::GetStartPos() const -{ - return startpos; + delete fs; + return NULL; } diff --git a/project/jni/application/gemrb/gemrb/core/System/FileStream.h b/project/jni/application/gemrb/gemrb/core/System/FileStream.h index 8c8a28a33..d225d0457 100644 --- a/project/jni/application/gemrb/gemrb/core/System/FileStream.h +++ b/project/jni/application/gemrb/gemrb/core/System/FileStream.h @@ -40,24 +40,31 @@ class GEM_EXPORT FileStream : public DataStream { private: - bool autoFree; - unsigned long startpos; - _FILE* str; + struct File; + File* str; bool opened, created; public: FileStream(void); ~FileStream(void); + DataStream* Clone(); - bool Open(const char* filename, bool autoFree = true); - bool Open(_FILE* stream, int startpos, int size, bool autoFree = false); - bool Modify(const char* filename, bool autoFree = true); + bool Open(const char* filename); + bool Modify(const char* filename); bool Create(const char* folder, const char* filename, SClass_ID ClassID); bool Create(const char* filename, SClass_ID ClassID); + bool Create(const char* filename); int Read(void* dest, unsigned int length); int Write(const void* src, unsigned int length); int Seek(int pos, int startpos); - unsigned long GetStartPos() const; - int ReadLine(void* buf, unsigned int maxlen); +public: + /** Opens the specifed file. + * + * Returns NULL, if the file can't be opened. + */ + static FileStream* OpenFile(const char* filename); +private: + void FindLength(); + void Close(); }; #endif // ! FILESTREAM_H diff --git a/project/jni/application/gemrb/gemrb/core/System/Logging.cpp b/project/jni/application/gemrb/gemrb/core/System/Logging.cpp new file mode 100644 index 000000000..ed86c27f7 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/Logging.cpp @@ -0,0 +1,187 @@ +/* GemRB - Infinity Engine Emulator + * Copyright (C) 2011 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 "System/Logging.h" + +#include +#include + +#ifdef ANDROID +#include +#endif + +#ifdef WIN32 +# define ADV_TEXT +# include +#endif + +void vprint(const char *message, va_list ap) +{ +#if (!defined(WIN32) || defined(__MINGW32__)) +# ifdef ANDROID + __android_log_vprint(ANDROID_LOG_INFO, "printf:", message, ap); +# else + vprintf(message, ap); +# endif +#else + // Don't try to be smart. + // Assume this is long enough. If not, message will be truncated. + // MSVC6 has old vsnprintf that doesn't give length + char buff[_MAX_PATH]; + vsnprintf(buff, _MAX_PATH, message, ap); + cprintf("%s", buff); +#endif +} + +void print(const char *message, ...) +{ + va_list ap; + + va_start(ap, message); + vprint(message, ap); + va_end(ap); +} + +#ifndef NOCOLOR +#ifdef WIN32 +static int colors[] = { + 0, + FOREGROUND_RED, + FOREGROUND_GREEN, + FOREGROUND_GREEN | FOREGROUND_RED, + FOREGROUND_BLUE, + FOREGROUND_RED | FOREGROUND_BLUE, + FOREGROUND_BLUE | FOREGROUND_GREEN, + FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED, + (RED | FOREGROUND_INTENSITY), + (GREEN | FOREGROUND_INTENSITY), + (GREEN | RED | FOREGROUND_INTENSITY), + (BLUE | FOREGROUND_INTENSITY), + (MAGENTA | FOREGROUND_INTENSITY), + (CYAN | FOREGROUND_INTENSITY), + (WHITE | FOREGROUND_INTENSITY), + WHITE +}; +#else +static const char* colors[] = { + "\033[0m", + "\033[0m\033[30;40m", + "\033[0m\033[31;40m", + "\033[0m\033[32;40m", + "\033[0m\033[33;40m", + "\033[0m\033[34;40m", + "\033[0m\033[35;40m", + "\033[0m\033[36;40m", + "\033[0m\033[37;40m", + "\033[1m\033[31;40m", + "\033[1m\033[32;40m", + "\033[1m\033[33;40m", + "\033[1m\033[34;40m", + "\033[1m\033[35;40m", + "\033[1m\033[36;40m", + "\033[1m\033[37;40m" +}; +#endif +#endif + + +void textcolor(log_color c) +{ +#ifdef NOCOLOR + if (c) while (0) ; +#else +#ifdef WIN32 + SetConsoleTextAttribute(hConsole, colors[c]); +#else + print("%s", colors[c]); +#endif +#endif +} + +#ifndef ANDROID +void printBracket(const char* status, log_color color) +{ + textcolor(WHITE); + print("["); + textcolor(color); + print("%s", status); + textcolor(WHITE); + print("]"); +} + +void printStatus(const char* status, log_color color) +{ + printBracket(status, color); + print("\n"); +} + +void printMessage(const char* owner, const char* message, log_color color, ...) +{ + printBracket(owner, LIGHT_WHITE); + print(": "); + textcolor(color); + va_list ap; + + va_start(ap, color); + vprint(message, ap); + va_end(ap); +} + +void error(const char* owner, const char* message, ...) +{ + // FIXME: Merge with printMessage? + printBracket(owner, LIGHT_WHITE); + print(": "); + textcolor(LIGHT_RED); + va_list ap; + + va_start(ap, message); + vprint(message, ap); + va_end(ap); + + exit(1); +} +#else /* !ANDROID */ +void printBracket(const char* status, log_color color) +{ +} + +void printStatus(const char* status, log_color color) +{ + __android_log_print(ANDROID_LOG_INFO, "GemRB", "[%s]", status); +} + +void printMessage(const char* owner, const char* message, log_color color, ...) +{ + // FIXME: We drop owner on the floor. + va_list ap; + va_start(ap, message); + __android_log_vprint(ANDROID_LOG_INFO, "GemRB", message, ap); + va_end(ap); +} + +void error(const char* owner, const char* message, ...) +{ + // FIXME: We drop owner on the floor. + va_list ap; + va_start(ap, message); + __android_log_vprint(ANDROID_LOG_INFO, "GemRB", message, ap); + va_end(ap); + exit(1); +}; +#endif diff --git a/project/jni/application/gemrb/gemrb/core/System/Logging.h b/project/jni/application/gemrb/gemrb/core/System/Logging.h new file mode 100644 index 000000000..72cb0f427 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/Logging.h @@ -0,0 +1,92 @@ +/* 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 logging.h + * Logging definitions. + * @author The GemRB Project + */ + + +#ifndef LOGGING_H +#define LOGGING_H + +#include "exports.h" +#include "win32def.h" + +#if defined(ANDROID) +# include +// FIXME: Are these include necesary? +# include +# include +#elif defined(WIN32) +extern GEM_EXPORT HANDLE hConsole; +#else //WIN32 +# include +# include +# include +#endif + +enum log_color { + DEFAULT, + BLACK, + RED, + GREEN, + BROWN, + BLUE, + MAGENTA, + CYAN, + WHITE, + LIGHT_RED, + LIGHT_GREEN, + YELLOW, + LIGHT_BLUE, + LIGHT_MAGENTA, + LIGHT_CYAN, + LIGHT_WHITE +}; + + +GEM_EXPORT void print(const char* message, ...) +#if defined(__GNUC__) + __attribute__ ((format(printf, 1, 2))) +#endif + ; +GEM_EXPORT void textcolor(log_color); +GEM_EXPORT void printBracket(const char *status, log_color color); +GEM_EXPORT void printStatus(const char* status, log_color color); +GEM_EXPORT void printMessage(const char* owner, const char* message, log_color color, ...) +#if defined(__GNUC__) + __attribute__ ((format(printf, 2, 4))) +#endif + ; + +GEM_EXPORT void error(const char* owner, const char* message, ...) +#if defined(__GNUC__) + __attribute__ ((format(printf, 2, 3), noreturn)) +#endif + ; + +// poison printf +#if (__GNUC__ >= 4 && (__GNUC_MINOR__ >= 5 || __GNUC__ > 4)) +extern "C" int printf(const char* message, ...) __attribute__ ((deprecated("GemRB doesn't use printf; use print instead."))); +#elif __GNUC__ >= 4 +extern "C" int printf(const char* message, ...) __attribute__ ((deprecated)); +#endif + +#endif diff --git a/project/jni/application/gemrb/gemrb/core/System/MemoryStream.cpp b/project/jni/application/gemrb/gemrb/core/System/MemoryStream.cpp index 1ce9656f5..eed152cd7 100644 --- a/project/jni/application/gemrb/gemrb/core/System/MemoryStream.cpp +++ b/project/jni/application/gemrb/gemrb/core/System/MemoryStream.cpp @@ -21,90 +21,78 @@ #include "System/MemoryStream.h" #include "win32def.h" +#include "errors.h" -#include +#include "Interface.h" -MemoryStream::MemoryStream(void* buffer, int length, bool autoFree) +MemoryStream::MemoryStream(char *name, void* data, unsigned long size) + : data((char*)data) { - ptr = buffer; - size = length; - Pos = 0; - strcpy( filename, "" ); - this->autoFree = autoFree; + this->size = size; + ExtractFileFromPath(filename, name); + strncpy(originalfile, name, _MAX_PATH); } -MemoryStream::~MemoryStream(void) +MemoryStream::~MemoryStream() { - if (autoFree) { - free( ptr ); - } + free(data); +} + +DataStream* MemoryStream::Clone() +{ + void *copy = malloc(size); + memcpy(copy, data, size); + return new MemoryStream(originalfile, copy, size); } int MemoryStream::Read(void* dest, unsigned int length) { - if (length + Pos > size) { + //we don't allow partial reads anyway, so it isn't a problem that + //i don't adjust length here (partial reads are evil) + if (Pos+length>size ) { return GEM_ERROR; } - ieByte* p = ( ieByte* ) ptr + Pos; - memcpy( dest, p, length ); + + memcpy(dest, data + Pos + (Encrypted ? 2 : 0), length); if (Encrypted) { ReadDecrypted( dest, length ); } Pos += length; - return GEM_OK; + return length; +} + +int MemoryStream::Write(const void* src, unsigned int length) +{ + if (Pos+length>size ) { + //error("MemoryStream", "We don't support appending to memory streams yet."); + return GEM_ERROR; + } + memcpy(data+Pos, src, length); + Pos += length; + return length; } int MemoryStream::Seek(int newpos, int type) { switch (type) { case GEM_CURRENT_POS: - if (( Pos + newpos ) > size) { - printf("[Streams]: Invalid seek\n"); - return GEM_ERROR; - } Pos += newpos; break; case GEM_STREAM_START: - if ((unsigned long) newpos > size) { - printf("[Streams]: Invalid seek\n"); - return GEM_ERROR; - } Pos = newpos; break; + case GEM_STREAM_END: + Pos = size - newpos; + default: return GEM_ERROR; } + //we went past the buffer + if (Pos>size) { + print("[Streams]: Invalid seek position: %ld (limit: %ld)\n", Pos, size); + return GEM_ERROR; + } return GEM_OK; } - -/** No descriptions */ -int MemoryStream::ReadLine(void* buf, unsigned int maxlen) -{ - if(!maxlen) { - return 0; - } - unsigned char * p = ( unsigned char * ) buf; - if (Pos >= size) { - p[0]=0; - return -1; - } - unsigned int i = 0; - while (i < ( maxlen - 1 )) { - ieByte ch = *( ( ieByte* ) ptr + Pos ); - if (Pos == size) - break; - if (Encrypted) - p[i] ^= GEM_ENCRYPTION_KEY[Pos & 63]; - Pos++; - if (( ( char ) ch ) == '\n') - break; - if (( ( char ) ch ) == '\t') - ch = ' '; - if (( ( char ) ch ) != '\r') - p[i++] = ch; - } - p[i] = 0; - return i; -} diff --git a/project/jni/application/gemrb/gemrb/core/System/MemoryStream.h b/project/jni/application/gemrb/gemrb/core/System/MemoryStream.h index adda37f19..43b2e21bd 100644 --- a/project/jni/application/gemrb/gemrb/core/System/MemoryStream.h +++ b/project/jni/application/gemrb/gemrb/core/System/MemoryStream.h @@ -18,41 +18,25 @@ * */ -/** - * @file MemoryStream.h - * Declares MemoryStream class, stream reading/writing data from/to a buffer in memory. - * @author The GemRB Project - */ - - #ifndef MEMORYSTREAM_H #define MEMORYSTREAM_H #include "System/DataStream.h" #include "exports.h" -#include "globals.h" -/** - * @class MemoryStream - * Reads and writes data from/to a buffer in memory. - */ - -class GEM_EXPORT MemoryStream : public DataStream { +class GEM_EXPORT MemoryStream : public DataStream +{ private: - void* ptr; - //unsigned long length; - bool autoFree; + char *data; public: - MemoryStream(void* buffer, int length, bool autoFree = true); - ~MemoryStream(void); + MemoryStream(char *name, void* data, unsigned long size); + ~MemoryStream(); + DataStream* Clone(); + int Read(void* dest, unsigned int length); - int Write(const void * /*src*/, unsigned int /*length*/) - { - return GEM_ERROR; - } + int Write(const void* src, unsigned int length); int Seek(int pos, int startpos); - int ReadLine(void* buf, unsigned int maxlen); }; -#endif // ! MEMORYSTREAM_H +#endif diff --git a/project/jni/application/gemrb/gemrb/core/System/SlicedStream.cpp b/project/jni/application/gemrb/gemrb/core/System/SlicedStream.cpp new file mode 100644 index 000000000..64d201409 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/SlicedStream.cpp @@ -0,0 +1,126 @@ +/* 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 "System/SlicedStream.h" + +#include "System/MemoryStream.h" + +#include "win32def.h" +#include "errors.h" + +#include "Interface.h" + +SlicedStream::SlicedStream(DataStream* str, int startpos, int size) +{ + this->str = str->Clone(); + assert(this->str); + this->size = size; + this->startpos = startpos; + strncpy(originalfile, str->originalfile, _MAX_PATH); + strncpy(filename, str->filename, sizeof(filename)); + this->str->Seek(this->startpos, GEM_STREAM_START); +} + +SlicedStream::~SlicedStream() +{ + delete str; +} + +DataStream* SlicedStream::Clone() +{ + return new SlicedStream(str, startpos, size); +} + +int SlicedStream::Read(void* dest, unsigned int length) +{ + //we don't allow partial reads anyway, so it isn't a problem that + //i don't adjust length here (partial reads are evil) + if (Pos+length>size ) { + return GEM_ERROR; + } + + //str->Seek(startpos + Pos + (Encrypted ? 2 : 0), GEM_STREAM_START); + unsigned int c = (unsigned int) str->Read(dest, length); + if (c != length) { + return GEM_ERROR; + } + if (Encrypted) { + ReadDecrypted( dest, c ); + } + Pos += c; + return c; +} + +int SlicedStream::Write(const void* src, unsigned int length) +{ + //str->Seek(startpos + Pos, GEM_STREAM_START); + unsigned int c = (unsigned int) Write(src, length); + if (c != length) { + return GEM_ERROR; + } + Pos += c; + //this is needed only if you want to Seek in a written file + if (Pos>size) { + size = Pos; + } + return c; +} + +int SlicedStream::Seek(int newpos, int type) +{ + switch (type) { + case GEM_CURRENT_POS: + Pos += newpos; + break; + + case GEM_STREAM_START: + Pos = newpos; + break; + + default: + return GEM_ERROR; + } + str->Seek(startpos + Pos /*+ (Encrypted ? 2 : 0)*/, GEM_STREAM_START); + //we went past the buffer + if (Pos>size) { + print("[Streams]: Invalid seek position: %ld (limit: %ld)\n",Pos, size); + return GEM_ERROR; + } + return GEM_OK; +} + +DataStream* SliceStream(DataStream* str, unsigned long startpos, unsigned long size, bool preservepos) +{ + if (size <= 16384) { + // small (or empty) substream, just read it into a buffer instead of expensive file I/O + unsigned long oldpos; + if (preservepos) + oldpos = str->GetPos(); + str->Seek(startpos, GEM_STREAM_START); + char *data = (char*)malloc(size); + str->Read(data, size); + if (preservepos) + str->Seek(oldpos, GEM_STREAM_START); + + DataStream *mem = new MemoryStream(str->originalfile, data, size); + return mem; + } else + return new SlicedStream(str, startpos, size); +} diff --git a/project/jni/application/gemrb/gemrb/core/System/SlicedStream.h b/project/jni/application/gemrb/gemrb/core/System/SlicedStream.h new file mode 100644 index 000000000..df11ec487 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/SlicedStream.h @@ -0,0 +1,46 @@ +/* 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 SLICEDSTREAM_H +#define SLICEDSTREAM_H + +#include "System/DataStream.h" + +#include "exports.h" + +class GEM_EXPORT SlicedStream : public DataStream +{ +private: + bool autoFree; + unsigned long startpos; + DataStream* str; +public: + SlicedStream(DataStream* cfs, int startpos, int size); + ~SlicedStream(); + DataStream* Clone(); + + int Read(void* dest, unsigned int length); + int Write(const void* src, unsigned int length); + int Seek(int pos, int startpos); +}; + +GEM_EXPORT DataStream* SliceStream(DataStream* str, unsigned long startpos, unsigned long size, bool preservepos = false); + +#endif diff --git a/project/jni/application/gemrb/gemrb/core/System/String.cpp b/project/jni/application/gemrb/gemrb/core/System/String.cpp new file mode 100644 index 000000000..a209cf35e --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/String.cpp @@ -0,0 +1,145 @@ +/* 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 "System/String.h" + +#include "exports.h" + +#include +#ifdef WIN32 +#include "win32def.h" +#ifdef _DEBUG +#include +#include +#endif +#endif + +unsigned char pl_uppercase[256]; +unsigned char pl_lowercase[256]; + +// these 3 functions will copy a string to a zero terminated string with a maximum length +void strnlwrcpy(char *dest, const char *source, int count, bool pad) +{ + while(count--) { + *dest++ = pl_lowercase[(unsigned char) *source]; + if(!*source++) { + if (!pad) + return; + while(count--) *dest++=0; + break; + } + } + *dest=0; +} + +void strnuprcpy(char* dest, const char *source, int count) +{ + while(count--) { + *dest++ = pl_uppercase[(unsigned char) *source]; + if(!*source++) { + while(count--) *dest++=0; + break; + } + } + *dest=0; +} + +// this one also filters spaces, used to copy resrefs and variables +void strnspccpy(char* dest, const char *source, int count, bool upper) +{ + memset(dest,0,count); + while(count--) { + char c; + if (upper) + c = pl_uppercase[(unsigned char) *source]; + else + c = pl_lowercase[(unsigned char) *source]; + if (c!=' ') { + *dest++=c; + } + if(!*source++) { + return; + } + } +} + +#ifndef HAVE_STRNLEN +int strnlen(const char* string, int maxlen) +{ + if (!string) { + return -1; + } + int i = 0; + while (maxlen-- > 0) { + if (!string[i]) + break; + i++; + } + return i; +} +#endif // ! HAVE_STRNLEN + +/** Returns the length of string (up to a delimiter) */ +GEM_EXPORT int strlench(const char* string, char ch) +{ + int i; + for (i = 0; string[i] && string[i] != ch; i++) + ; + return i; +} + +//// Compatibility functions +#ifndef HAVE_STRNDUP +GEM_EXPORT char* strndup(const char* s, size_t l) +{ + size_t len = strlen( s ); + if (len < l) { + l = len; + } + char* string = ( char* ) malloc( l + 1 ); + strncpy( string, s, l ); + string[l] = 0; + return string; +} +#endif + +#ifdef WIN32 + +#else + +char* strupr(char* string) +{ + char* s; + if (string) { + for (s = string; *s; ++s) + *s = toupper( *s ); + } + return string; +} + +char* strlwr(char* string) +{ + char* s; + if (string) { + for (s = string; *s; ++s) + *s = tolower( *s ); + } + return string; +} + +#endif // ! WIN32 diff --git a/project/jni/application/gemrb/gemrb/core/System/String.h b/project/jni/application/gemrb/gemrb/core/System/String.h new file mode 100644 index 000000000..af2a187d4 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/core/System/String.h @@ -0,0 +1,56 @@ +/* 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 STRING_H +#define STRING_H + +#include "exports.h" + +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifndef WIN32 +# define stricmp strcasecmp +# define strnicmp strncasecmp +#endif + +/* this function will work with pl/cz special characters */ + +extern unsigned char pl_uppercase[256]; +extern unsigned char pl_lowercase[256]; + +GEM_EXPORT void strnlwrcpy(char* d, const char *s, int l, bool pad = true); +GEM_EXPORT void strnuprcpy(char* d, const char *s, int l); +GEM_EXPORT void strnspccpy(char* d, const char *s, int l, bool upper = false); +#ifndef HAVE_STRNLEN +GEM_EXPORT int strnlen(const char* string, int maxlen); +#endif +GEM_EXPORT int strlench(const char* string, char ch); +#ifndef HAVE_STRNDUP +GEM_EXPORT char* strndup(const char* s, size_t l); +#endif + +#ifndef WIN32 +GEM_EXPORT char* strupr(char* string); +GEM_EXPORT char* strlwr(char* string); +#endif + +#endif diff --git a/project/jni/application/gemrb/gemrb/core/System/VFS.cpp b/project/jni/application/gemrb/gemrb/core/System/VFS.cpp index 4e6d34894..c316716e1 100644 --- a/project/jni/application/gemrb/gemrb/core/System/VFS.cpp +++ b/project/jni/application/gemrb/gemrb/core/System/VFS.cpp @@ -33,6 +33,7 @@ #include #include +#include #ifndef WIN32 #include @@ -62,7 +63,7 @@ struct dirent { // buffer which readdir returns static dirent de; -DIR* opendir(const char* filename) +static DIR* opendir(const char* filename) { DIR* dirp = ( DIR* ) malloc( sizeof( DIR ) ); dirp->is_first = 1; @@ -73,7 +74,7 @@ DIR* opendir(const char* filename) return dirp; } -dirent* readdir(DIR* dirp) +static dirent* readdir(DIR* dirp) { struct _finddata_t c_file; @@ -93,154 +94,12 @@ dirent* readdir(DIR* dirp) return &de; } -void closedir(DIR* dirp) +static void closedir(DIR* dirp) { _findclose( dirp->hFile ); free( dirp ); } - -_FILE* _fopen(const char* filename, const char* mode) -{ - DWORD OpenFlags = 0; - DWORD AccessFlags = 0; - DWORD ShareFlags = 0; - - while (*mode) { - if (( *mode == 'w' ) || ( *mode == 'W' )) { - OpenFlags |= OPEN_ALWAYS; - AccessFlags |= GENERIC_WRITE; - ShareFlags |= FILE_SHARE_READ; - } else if (( *mode == 'r' ) || ( *mode == 'R' )) { - OpenFlags |= OPEN_EXISTING; - AccessFlags |= GENERIC_READ; - ShareFlags |= FILE_SHARE_READ|FILE_SHARE_WRITE; - } else if (( *mode == 'a' ) || ( *mode == 'A' )) { - OpenFlags |= OPEN_ALWAYS; - AccessFlags |= GENERIC_READ|GENERIC_WRITE; - ShareFlags |= FILE_SHARE_READ|FILE_SHARE_WRITE; - } else if (*mode == '+') { - AccessFlags |= GENERIC_READ|GENERIC_WRITE; - ShareFlags |= FILE_SHARE_READ|FILE_SHARE_WRITE; - } - mode++; - } - HANDLE hFile = CreateFile( filename, AccessFlags, ShareFlags, NULL, - OpenFlags, FILE_ATTRIBUTE_NORMAL, NULL ); - if (hFile == INVALID_HANDLE_VALUE) { - return NULL; - } - _FILE* ret = ( _FILE* ) malloc( sizeof( _FILE ) ); - ret->hFile = hFile; - return ret; -} - -size_t _fread(void* ptr, size_t size, size_t n, _FILE* stream) -{ - if (!stream) { - return ( size_t ) 0; - } - unsigned long read; - if (!ReadFile( stream->hFile, ptr, ( unsigned long ) ( size * n ), &read, - NULL )) { - return ( size_t ) 0; - } - return ( size_t ) read; -} - -size_t _fwrite(const void* ptr, size_t size, size_t n, _FILE* stream) -{ - if (!stream) { - return ( size_t ) 0; - } - unsigned long wrote; - if (!WriteFile( stream->hFile, ptr, ( unsigned long ) ( size * n ), - &wrote, NULL )) { - return ( size_t ) 0; - } - return ( size_t ) wrote; -} - -size_t _fseek(_FILE* stream, long offset, int whence) -{ - if (!stream) { - return ( size_t ) 1; - } - unsigned long method; - switch (whence) { - case SEEK_SET: - method = FILE_BEGIN; - break; - case SEEK_CUR: - method = FILE_CURRENT; - break; - case SEEK_END: - method = FILE_END; - break; - default: - return ( size_t ) 1; - } - if (SetFilePointer( stream->hFile, offset, NULL, method ) == 0xffffffff) { - return ( size_t ) 1; - } - return ( size_t ) 0; -} - -int _fgetc(_FILE* stream) -{ - if (!stream) { - return 0; - } - unsigned char tmp; - unsigned long read; - BOOL bResult = ReadFile( stream->hFile, &tmp, ( unsigned long ) 1, &read, - NULL ); - if (bResult && read) { - return ( int ) tmp; - } - return EOF; -} - -long int _ftell(_FILE* stream) -{ - if (!stream) { - return EOF; - } - unsigned long pos = SetFilePointer( stream->hFile, 0, NULL, FILE_CURRENT ); - if (pos == 0xffffffff) { - return -1L; - } - return ( long int ) pos; -} - -int _feof(_FILE* stream) -{ - if (!stream) { - return 0; - } - unsigned char tmp; - unsigned long read; - BOOL bResult = ReadFile( stream->hFile, &tmp, ( unsigned long ) 1, &read, - NULL ); - if (bResult && ( read == 0 )) { - return 1; - } //EOF - bResult = SetFilePointer( stream->hFile, -1, NULL, FILE_CURRENT ); - return 0; -} - -int _fclose(_FILE* stream) -{ - if (!stream) { - return EOF; - } - if (!CloseHandle( stream->hFile )) { - return EOF; - } - free( stream ); - return 0; -} - #endif // WIN32 @@ -289,13 +148,19 @@ char* PathAppend (char* target, const char* name) target[len++] = PathDelimiter; target[len] = 0; } + // strip possible leading backslash, since it is not ignored on all platforms + // totl has '\data\zcMHar.bif' in the key file, and also the CaseSensitive + // code breaks with that extra slash, so simple fix: remove it + if (name[0] == '\\') { + name = name+1; + } strncat( target+len, name, _MAX_PATH - len - 1 ); return target; } -bool FindInDir(const char* Dir, char *Filename) +static bool FindInDir(const char* Dir, char *Filename) { // First test if there's a Filename with exactly same name // and if yes, return it and do not search in the Dir @@ -330,15 +195,16 @@ bool FindInDir(const char* Dir, char *Filename) bool PathJoin (char *target, const char *base, ...) { - va_list ap; - va_start(ap, base); - if (base == NULL) { target[0] = '\0'; return false; } + if (base != target) { + strcpy(target, base); + } - strcpy(target, base); + va_list ap; + va_start(ap, base); while (char *source = va_arg(ap, char*)) { char *slash; @@ -361,8 +227,10 @@ bool PathJoin (char *target, const char *base, ...) source = slash + 1; } while (slash); } + va_end( ap ); return true; + finish: while (char *source = va_arg(ap, char*)) { PathAppend(target, source); @@ -402,7 +270,7 @@ void FixPath (char *path, bool needslash) path[i] = 0; } -int strmatch(const char *string, const char *mask) +static int strmatch(const char *string, const char *mask) { while(*mask) { if (*mask!='?') { @@ -489,6 +357,24 @@ void ExtractFileFromPath(char *file, const char *full_path) strcpy(file, full_path); } +bool MakeDirectory(const char* path) +{ +#ifdef WIN32 +#define mkdir(path, mode) _mkdir(path) +#endif + if (mkdir(path, S_IREAD|S_IWRITE|S_IEXEC) < 0) { + if (errno != EEXIST) { + return false; + } + } + // Ignore errors from chmod + chmod(path, S_IREAD|S_IWRITE|S_IEXEC); + return true; +#ifdef WIN32 +#undef mkdir +#endif +} + DirectoryIterator::DirectoryIterator(const char *path) : Directory(NULL), Entry(NULL), Path(path) { @@ -504,10 +390,8 @@ DirectoryIterator::~DirectoryIterator() bool DirectoryIterator::IsDirectory() { char dtmp[_MAX_PATH]; - struct stat fst; GetFullPath(dtmp); - stat( dtmp, &fst ); - return S_ISDIR( fst.st_mode ); + return dir_exists(dtmp); } char* DirectoryIterator::GetName() @@ -536,3 +420,4 @@ void DirectoryIterator::Rewind() else Entry = readdir(static_cast(Directory)); } + diff --git a/project/jni/application/gemrb/gemrb/core/System/VFS.h b/project/jni/application/gemrb/gemrb/core/System/VFS.h index d78cb2828..94e83d7d7 100644 --- a/project/jni/application/gemrb/gemrb/core/System/VFS.h +++ b/project/jni/application/gemrb/gemrb/core/System/VFS.h @@ -53,34 +53,10 @@ #ifdef WIN32 -typedef struct _FILE { - HANDLE hFile; -} _FILE; - -GEM_EXPORT _FILE* _fopen(const char* filename, const char* mode); -GEM_EXPORT size_t _fread(void* ptr, size_t size, size_t n, _FILE* stream); -GEM_EXPORT size_t _fwrite(const void* ptr, size_t size, size_t n, - _FILE* stream); -GEM_EXPORT size_t _fseek(_FILE* stream, long offset, int whence); -GEM_EXPORT int _fgetc(_FILE* stream); -GEM_EXPORT long int _ftell(_FILE* stream); -GEM_EXPORT int _feof(_FILE* stream); -GEM_EXPORT int _fclose(_FILE* stream); -#define mkdir(path, rights) _mkdir(path) #define ResolveFilePath(p) #else // ! WIN32 -#define _FILE FILE -#define _fopen fopen -#define _fread fread -#define _fwrite fwrite -#define _fseek fseek -#define _fgetc fgetc -#define _ftell ftell -#define _feof feof -#define _fclose fclose - /** Handle ~ -> $HOME mapping and do initial case-sensitity check */ GEM_EXPORT void ResolveFilePath(char* FilePath); GEM_EXPORT void ResolveFilePath(std::string& FilePath); @@ -125,12 +101,16 @@ GEM_EXPORT bool file_exists(const char* path); * char filepath[_MAX_PATH]; * PathJoin( filepath, core->GUIScriptsPath, core->GameType, 'GUIDefines.py', NULL ); */ -GEM_EXPORT bool PathJoin (char* target, const char* base, ...); +GEM_EXPORT bool PathJoin (char* target, const char* base, ...) SENTINEL; GEM_EXPORT bool PathJoinExt (char* target, const char* dir, const char* file, const char* ext = NULL); GEM_EXPORT void FixPath (char *path, bool needslash); GEM_EXPORT void ExtractFileFromPath(char *file, const char *full_path); +GEM_EXPORT char* PathAppend (char* target, const char* name); + +GEM_EXPORT bool MakeDirectory(const char* path) WARN_UNUSED; + class GEM_EXPORT DirectoryIterator { public: /** diff --git a/project/jni/application/gemrb/gemrb/core/TableMgr.h b/project/jni/application/gemrb/gemrb/core/TableMgr.h index 5e38557b2..18054e6d5 100644 --- a/project/jni/application/gemrb/gemrb/core/TableMgr.h +++ b/project/jni/application/gemrb/gemrb/core/TableMgr.h @@ -65,7 +65,7 @@ public: virtual int FindTableValue(unsigned int column, const char* value, int start = 0) const = 0; /** Opens a Table File */ - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; }; /** diff --git a/project/jni/application/gemrb/gemrb/core/TileMap.cpp b/project/jni/application/gemrb/gemrb/core/TileMap.cpp index ae2fc7a22..62716de9f 100644 --- a/project/jni/application/gemrb/gemrb/core/TileMap.cpp +++ b/project/jni/application/gemrb/gemrb/core/TileMap.cpp @@ -205,12 +205,12 @@ void TileMap::AddRainOverlay(TileOverlay* overlay) rain_overlays.push_back( overlay ); } -void TileMap::DrawOverlays(Region screen, int rain) +void TileMap::DrawOverlays(Region screen, int rain, int flags) { if (rain) { - overlays[0]->Draw( screen, rain_overlays ); + overlays[0]->Draw( screen, rain_overlays, flags ); } else { - overlays[0]->Draw( screen, overlays ); + overlays[0]->Draw( screen, overlays, flags ); } } @@ -513,8 +513,8 @@ int TileMap::CleanupContainer(Container *container) return 1; } } - printMessage("TileMap", " ", LIGHT_RED); - printf("Invalid container cleanup: %s\n", container->GetScriptName()); + printMessage("TileMap", "Invalid container cleanup: %s\n", LIGHT_RED, + container->GetScriptName()); return 1; } diff --git a/project/jni/application/gemrb/gemrb/core/TileMap.h b/project/jni/application/gemrb/gemrb/core/TileMap.h index ad97d10c7..b02c43390 100644 --- a/project/jni/application/gemrb/gemrb/core/TileMap.h +++ b/project/jni/application/gemrb/gemrb/core/TileMap.h @@ -90,7 +90,7 @@ public: void ClearOverlays(); void AddOverlay(TileOverlay* overlay); void AddRainOverlay(TileOverlay* overlay); - void DrawOverlays(Region screen, int rain); + void DrawOverlays(Region screen, int rain, int flags); void DrawFogOfWar(ieByte* explored_mask, ieByte* visible_mask, Region viewport); Point GetMapSize(); public: diff --git a/project/jni/application/gemrb/gemrb/core/TileMapMgr.h b/project/jni/application/gemrb/gemrb/core/TileMapMgr.h index 433377507..f32f44272 100644 --- a/project/jni/application/gemrb/gemrb/core/TileMapMgr.h +++ b/project/jni/application/gemrb/gemrb/core/TileMapMgr.h @@ -29,7 +29,7 @@ class GEM_EXPORT TileMapMgr : public Plugin { public: TileMapMgr(void); virtual ~TileMapMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual TileMap* GetTileMap(TileMap *tm) = 0; virtual ieWord* GetDoorIndices(char* ResRef, int* count, bool& BaseClosed) = 0; diff --git a/project/jni/application/gemrb/gemrb/core/TileOverlay.cpp b/project/jni/application/gemrb/gemrb/core/TileOverlay.cpp index 475192e7f..303ea0ea1 100644 --- a/project/jni/application/gemrb/gemrb/core/TileOverlay.cpp +++ b/project/jni/application/gemrb/gemrb/core/TileOverlay.cpp @@ -20,6 +20,8 @@ #include "TileOverlay.h" +//#include "Game.h" // needed only for TILE_GREY below +#include "GlobalTimer.h" #include "Interface.h" #include "Video.h" @@ -72,7 +74,7 @@ void TileOverlay::BumpViewport(const Region &viewport, Region &vp) } } -void TileOverlay::Draw(Region viewport, std::vector< TileOverlay*> &overlays) +void TileOverlay::Draw(Region viewport, std::vector< TileOverlay*> &overlays, int flags) { Video* vid = core->GetVideoDriver(); Region vp = vid->GetViewport(); @@ -95,7 +97,7 @@ void TileOverlay::Draw(Region viewport, std::vector< TileOverlay*> &overlays) anim = tile->anim[0]; } vid->BlitTile( anim->NextFrame(), 0, viewport.x + ( x * 64 ), - viewport.y + ( y * 64 ), &viewport, false ); + viewport.y + ( y * 64 ), &viewport, flags ); if (!tile->om || tile->tileIndex) { continue; } @@ -112,7 +114,7 @@ void TileOverlay::Draw(Region viewport, std::vector< TileOverlay*> &overlays) tile->anim[0]->NextFrame(), viewport.x + ( x * 64 ), viewport.y + ( y * 64 ), - &viewport, false ); + &viewport, flags ); } else { Sprite2D* mask = 0; if (tile->anim[1]) @@ -121,7 +123,7 @@ void TileOverlay::Draw(Region viewport, std::vector< TileOverlay*> &overlays) mask, viewport.x + ( x * 64 ), viewport.y + ( y * 64 ), - &viewport, true ); + &viewport, TILE_HALFTRANS | flags ); } } } diff --git a/project/jni/application/gemrb/gemrb/core/TileOverlay.h b/project/jni/application/gemrb/gemrb/core/TileOverlay.h index 642f1d39a..681c2c30c 100644 --- a/project/jni/application/gemrb/gemrb/core/TileOverlay.h +++ b/project/jni/application/gemrb/gemrb/core/TileOverlay.h @@ -39,7 +39,7 @@ public: TileOverlay(int Width, int Height); ~TileOverlay(void); void AddTile(Tile* tile); - void Draw(Region viewport, std::vector< TileOverlay*> &overlays); + void Draw(Region viewport, std::vector< TileOverlay*> &overlays, int flags); void BumpViewport(const Region &viewport, Region &vp); }; diff --git a/project/jni/application/gemrb/gemrb/core/TileSetMgr.h b/project/jni/application/gemrb/gemrb/core/TileSetMgr.h index 0cc21dc85..a909da975 100644 --- a/project/jni/application/gemrb/gemrb/core/TileSetMgr.h +++ b/project/jni/application/gemrb/gemrb/core/TileSetMgr.h @@ -29,7 +29,7 @@ class GEM_EXPORT TileSetMgr : public Plugin { public: TileSetMgr(void); virtual ~TileSetMgr(void); - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; virtual Tile* GetTile(unsigned short* indexes, int count, unsigned short* secondary = NULL) = 0; }; diff --git a/project/jni/application/gemrb/gemrb/core/Variables.cpp b/project/jni/application/gemrb/gemrb/core/Variables.cpp index 9be058f16..802b64686 100644 --- a/project/jni/application/gemrb/gemrb/core/Variables.cpp +++ b/project/jni/application/gemrb/gemrb/core/Variables.cpp @@ -426,8 +426,7 @@ void Variables::SetAt(const char* key, ieDword value, bool nocreate) assert( m_type == GEM_VARIABLES_INT ); if (( pAssoc = GetAssocAt( key, nHash ) ) == NULL) { if (nocreate) { - printMessage("Variables", " ", YELLOW); - printf("Cannot create new variable: %s\n", key); + printMessage("Variables", "Cannot create new variable: %s\n", YELLOW, key); return; } @@ -480,7 +479,7 @@ void Variables::LoadInitialValues(const char* name) // we only support PST's var.var for now PathJoin( nPath, core->GamePath, "var.var", NULL ); FileStream fs; - if (!fs.Open( nPath, true )) { + if (!fs.Open(nPath)) { return; } @@ -500,7 +499,8 @@ void Variables::LoadInitialValues(const char* name) // is it the type we want? if not, skip if (strnicmp(buffer, name, 6)) continue; // copy variable (types got 2 extra spaces, and the name is padded too) - strnspccpy(varname,buffer+8,32); + // (true = uppercase, needed for original engine save compat, see 315b8f2e) + strnspccpy(varname,buffer+8,32, true); SetAt(varname, value); } } diff --git a/project/jni/application/gemrb/gemrb/core/Variables.h b/project/jni/application/gemrb/gemrb/core/Variables.h index db392a8f3..d3a59e083 100644 --- a/project/jni/application/gemrb/gemrb/core/Variables.h +++ b/project/jni/application/gemrb/gemrb/core/Variables.h @@ -27,6 +27,8 @@ #include "globals.h" #include "win32def.h" +#include + #ifndef ReleaseFun typedef void (*ReleaseFun)(void *); #endif diff --git a/project/jni/application/gemrb/gemrb/core/Video.cpp b/project/jni/application/gemrb/gemrb/core/Video.cpp index 22eeb17c0..d056070e4 100644 --- a/project/jni/application/gemrb/gemrb/core/Video.cpp +++ b/project/jni/application/gemrb/gemrb/core/Video.cpp @@ -25,6 +25,7 @@ #include "Audio.h" #include "Interface.h" #include "Palette.h" +#include "Sprite2D.h" #include @@ -45,6 +46,11 @@ Video::~Video(void) { } +bool Video::ToggleFullscreenMode() +{ + return SetFullscreenMode(!fullscreen); +} + /** Set Event Manager */ void Video::SetEventMgr(EventMgr* evnt) { diff --git a/project/jni/application/gemrb/gemrb/core/Video.h b/project/jni/application/gemrb/gemrb/core/Video.h index 1560e5e89..e080cbd7e 100644 --- a/project/jni/application/gemrb/gemrb/core/Video.h +++ b/project/jni/application/gemrb/gemrb/core/Video.h @@ -29,18 +29,19 @@ #include "globals.h" -#include "Animation.h" #include "Plugin.h" -#include "Polygon.h" #include "ScriptedAnimation.h" -#include "GUI/EventMgr.h" class AnimationFactory; +class EventMgr; +class Font; +class Gem_Polygon; class Palette; class SpriteCover; +class Wall_Polygon; // Note: not all these flags make sense together. Specifically: -// NOSHADOW overrides TRANSSHADOW +// NOSHADOW overrides TRANSSHADOW, and BLIT_GREY overrides BLIT_RED enum SpriteBlitFlags { BLIT_HALFTRANS = IE_VVC_TRANSPARENT, // 2 BLIT_BLENDED = IE_VVC_BLENDED, // 8; not implemented in SDLVideo yet @@ -56,6 +57,13 @@ enum SpriteBlitFlags { // Note: bits 29,30,31 are used by SDLVideo internally }; +// TILE_GREY overrides TILE_SEPIA +enum TileBlitFlags { + TILE_HALFTRANS = 1, + TILE_GREY = 2, + TILE_SEPIA = 4 +}; + //disable mouse flags #define MOUSE_DISABLED 1 #define MOUSE_GRAYED 2 @@ -79,9 +87,9 @@ public: virtual int CreateDisplay(int width, int height, int bpp, bool fullscreen) = 0; /** Sets window title of GemRB window */ virtual void SetDisplayTitle(char* title, char* icon) = 0; - /** Toggles GemRB between fullscreen and windowed mode. - * 0 = windowed, 1 = fullscreen, -1 (default) = toggle */ - virtual bool ToggleFullscreenMode(int set_reset=-1) = 0; + /** Toggles GemRB between fullscreen and windowed mode. */ + bool ToggleFullscreenMode(); + virtual bool SetFullscreenMode(bool set) = 0; /** Swaps displayed and back buffers */ virtual int SwapBuffers(void) = 0; /** Grabs and releases mouse cursor within GemRB window */ @@ -106,7 +114,7 @@ public: virtual bool SupportsBAMSprites() { return false; } virtual void FreeSprite(Sprite2D* &spr) = 0; virtual Sprite2D* DuplicateSprite(const Sprite2D* spr) = 0; - virtual void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, bool trans) = 0; + virtual void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags) = 0; virtual void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, const Region* clip = NULL) = 0; diff --git a/project/jni/application/gemrb/gemrb/core/WindowMgr.h b/project/jni/application/gemrb/gemrb/core/WindowMgr.h index 61a3a377d..17b82c46b 100644 --- a/project/jni/application/gemrb/gemrb/core/WindowMgr.h +++ b/project/jni/application/gemrb/gemrb/core/WindowMgr.h @@ -28,8 +28,9 @@ #define WINDOWMGR_H #include "Plugin.h" -#include "GUI/Window.h" -#include "System/DataStream.h" + +class DataStream; +class Window; /** * @class WindowMgr @@ -42,7 +43,7 @@ public: WindowMgr(); virtual ~WindowMgr(); /** This function loads all available windows from the 'stream' parameter. */ - virtual bool Open(DataStream* stream, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream) = 0; /** Returns the i-th window in the Previously Loaded Stream */ virtual Window* GetWindow(unsigned int i) = 0; /** Returns the number of available windows */ diff --git a/project/jni/application/gemrb/gemrb/core/WorldMap.cpp b/project/jni/application/gemrb/gemrb/core/WorldMap.cpp index c2face07e..012a61581 100644 --- a/project/jni/application/gemrb/gemrb/core/WorldMap.cpp +++ b/project/jni/application/gemrb/gemrb/core/WorldMap.cpp @@ -24,6 +24,7 @@ #include "Game.h" #include "Interface.h" +#include "TableMgr.h" #include "Video.h" #include @@ -105,7 +106,7 @@ Sprite2D *WMPAreaEntry::GetMapIcon(AnimationFactory *bam) } MapIcon = bam->GetFrame((ieWord) frame, (ieByte) IconSeq); if (!MapIcon) { - printf("WMPAreaEntry::GetMapIcon failed for frame %d, seq %d\n", frame, IconSeq); + print("WMPAreaEntry::GetMapIcon failed for frame %d, seq %d\n", frame, IconSeq); return NULL; } if (color>=0) { @@ -302,15 +303,13 @@ int WorldMap::CalculateDistances(const ieResRef AreaName, int direction) } if (direction<0 || direction>3) { - printMessage("WorldMap","", LIGHT_RED); - printf("CalculateDistances for invalid direction: %s\n", AreaName); + printMessage("WorldMap", "CalculateDistances for invalid direction: %s\n", LIGHT_RED, AreaName); return -1; } unsigned int i; if (!GetArea(AreaName, i)) { - printMessage("WorldMap","", LIGHT_RED); - printf("CalculateDistances for invalid Area: %s\n", AreaName); + printMessage("WorldMap", "CalculateDistances for invalid Area: %s\n", LIGHT_RED, AreaName); return -1; } if (Distances) { @@ -320,8 +319,7 @@ int WorldMap::CalculateDistances(const ieResRef AreaName, int direction) free(GotHereFrom); } - printMessage("WorldMap","", GREEN); - printf("CalculateDistances for Area: %s\n", AreaName); + printMessage("WorldMap", "CalculateDistances for Area: %s\n", GREEN, AreaName); size_t memsize =sizeof(int) * area_entries.size(); Distances = (int *) malloc( memsize ); @@ -345,8 +343,8 @@ int WorldMap::CalculateDistances(const ieResRef AreaName, int direction) int j=ae->AreaLinksIndex[d]; int k=j+ae->AreaLinksCount[d]; if ((size_t) k>area_links.size()) { - printMessage("WorldMap","The worldmap file is corrupted... and it would crash right now!\n",RED); - printf("Entry #: %d Direction: %d\n",i,d); + printMessage("WorldMap", "The worldmap file is corrupted... and it would crash right now!\nEntry #: %d Direction: %d\n", RED, + i, d); break; } for(;j walkpath; - printf("Gathering path information for: %s\n", AreaName); + print("Gathering path information for: %s\n", AreaName); while (GotHereFrom[i]!=-1) { - printf("Adding path to %d\n", i); + print("Adding path to %d\n", i); walkpath.push_back(area_links[GotHereFrom[i]]); i = WhoseLinkAmI(GotHereFrom[i]); if (i==(ieDword) -1) { - printf("Something has been screwed up here (incorrect path)!\n"); - abort(); + error("WorldMap", "Something has been screwed up here (incorrect path)!\n"); } } - printf("Walkpath size is: %d\n",(int) walkpath.size()); + print("Walkpath size is: %d\n",(int) walkpath.size()); if (!walkpath.size()) { return NULL; } @@ -488,7 +484,7 @@ void WorldMap::UpdateAreaVisibility(const ieResRef AreaName, int direction) if (!ae) return; //we are here, so we visited and it is visible too (i guess) - printf("Updated Area visibility: %s (visited, and visible)\n", AreaName); + print("Updated Area visibility: %s (visited, and visible)\n", AreaName); ae->SetAreaStatus(WMP_ENTRY_VISITED|WMP_ENTRY_VISIBLE, BM_OR); if (direction<0 || direction>3) @@ -498,7 +494,7 @@ void WorldMap::UpdateAreaVisibility(const ieResRef AreaName, int direction) WMPAreaLink* al = area_links[ae->AreaLinksIndex[direction]+i]; WMPAreaEntry* ae2 = area_entries[al->AreaIndex]; if (ae2->GetAreaStatus()&WMP_ENTRY_ADJACENT) { - printf("Updated Area visibility: %s (accessible, and visible)\n", ae2->AreaName); + print("Updated Area visibility: %s (accessible, and visible)\n", ae2->AreaName); ae2->SetAreaStatus(WMP_ENTRY_VISIBLE|WMP_ENTRY_ACCESSIBLE, BM_OR); } } diff --git a/project/jni/application/gemrb/gemrb/core/WorldMap.h b/project/jni/application/gemrb/gemrb/core/WorldMap.h index f8cce256f..556a41b7a 100644 --- a/project/jni/application/gemrb/gemrb/core/WorldMap.h +++ b/project/jni/application/gemrb/gemrb/core/WorldMap.h @@ -83,7 +83,7 @@ private: public: ieResRef AreaName; ieResRef AreaResRef; - char AreaLongName[32]; + ieVariable AreaLongName; ieDword IconSeq; ieDword X; ieDword Y; @@ -101,7 +101,7 @@ public: struct WMPAreaLink { ieDword AreaIndex; - char DestEntryPoint[32]; + ieVariable DestEntryPoint; ieDword DistanceScale; ieDword DirectionFlags; //where will the player appear on dest. area ieResRef EncounterAreaResRef[5]; diff --git a/project/jni/application/gemrb/gemrb/core/WorldMapMgr.h b/project/jni/application/gemrb/gemrb/core/WorldMapMgr.h index 80eed4c42..e66f6adfe 100644 --- a/project/jni/application/gemrb/gemrb/core/WorldMapMgr.h +++ b/project/jni/application/gemrb/gemrb/core/WorldMapMgr.h @@ -40,7 +40,7 @@ class GEM_EXPORT WorldMapMgr : public Plugin { public: WorldMapMgr(void); virtual ~WorldMapMgr(void); - virtual bool Open(DataStream* stream1, DataStream* stream2, bool autoFree = true) = 0; + virtual bool Open(DataStream* stream1, DataStream* stream2) = 0; virtual WorldMapArray* GetWorldMapArray() = 0; virtual int GetStoredFileSize(WorldMapArray *wmap, unsigned int index) = 0; diff --git a/project/jni/application/gemrb/gemrb/includes/HashMap.h b/project/jni/application/gemrb/gemrb/includes/HashMap.h new file mode 100644 index 000000000..573064421 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/includes/HashMap.h @@ -0,0 +1,455 @@ +/* GemRB - Infinity Engine Emulator + * Copyright (C) 2011 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 HASHMAP_H +#define HASHMAP_H + +#include +#include +#include + +#include "System/Logging.h" + +// dumps stats upon destruction +//#define HASHMAP_DEBUG + +template +struct HashKey { + static inline unsigned int hash(const T &key); + static inline bool equals(const T &a, const T &b); + static inline void copy(T &a, const T &b); +}; + +#define HASHMAP_DEFINE_TRIVIAL_HASHKEY(T) \ + template<> \ + inline unsigned int HashKey::hash(const T &key) \ + { \ + return static_cast(key); \ + } \ + template<> \ + inline bool HashKey::equals(const T &a, const T &b) \ + { \ + return a == b; \ + } \ + template<> \ + inline void HashKey::copy(T &a, const T &b) \ + { \ + a = b; \ + } + +// MSVC6 is convinced that this the same as char[1] from StringMap.h +//HASHMAP_DEFINE_TRIVIAL_HASHKEY(char); +//HASHMAP_DEFINE_TRIVIAL_HASHKEY(signed char); +//HASHMAP_DEFINE_TRIVIAL_HASHKEY(unsigned char); + +HASHMAP_DEFINE_TRIVIAL_HASHKEY(short) +HASHMAP_DEFINE_TRIVIAL_HASHKEY(unsigned short) +HASHMAP_DEFINE_TRIVIAL_HASHKEY(int) +HASHMAP_DEFINE_TRIVIAL_HASHKEY(unsigned int) +HASHMAP_DEFINE_TRIVIAL_HASHKEY(long) +HASHMAP_DEFINE_TRIVIAL_HASHKEY(unsigned long) + +#undef HASHMAP_DEFINE_TRIVIAL_HASHKEY + +template > +class HashMap { +public: + HashMap(); + ~HashMap(); + + void init(unsigned int tableSize, unsigned int blockSize); + + // sets a value and returns true if an existing entry has been replaced + bool set(const Key &key, const Value &value); + const Value *get(const Key &key) const; + bool has(const Key &key) const; + + bool remove(const Key &key); + void clear(); + +protected: + struct Entry { + Key key; + Value value; + Entry *next; + }; + + inline bool isInitialized() const; + + inline Entry *popAvailable(); + inline void pushAvailable(Entry *e); + inline unsigned int getMapPosByHash(unsigned int hash) const; + inline unsigned int getMapPosByKey(const Key &key) const; + inline Entry *getBucketByHash(unsigned int hash) const; + inline Entry *getBucketByKey(const Key &key) const; + + // walks from e and looks for key. if a match is found, its in + // result->next, else result is the end of the list. + inline Entry *findPredecessor(const Key &key, Entry *e) const; + // just for stats, usable by derived classes + inline void incAccesses() const; + +private: + unsigned int _tableSize; + unsigned int _blockSize; + std::deque _blocks; + Entry **_buckets; + Entry *_available; + + void allocBlock(); + +#ifdef HASHMAP_DEBUG + struct Debug { + unsigned int allocs; + unsigned int accesses; + }; + + mutable Debug _debug; +public: + void dumpStats(const char* description); +#endif +}; + +template +HashMap::HashMap() : + _tableSize(0), + _blockSize(0), + _blocks(), + _buckets(NULL), + _available(NULL) +{ +#ifdef HASHMAP_DEBUG + memset(&_debug, 0, sizeof(_debug)); +#endif +} + +template +HashMap::~HashMap() +{ + clear(); +} + +template +void HashMap::init(unsigned int tableSize, unsigned int blockSize) +{ + clear(); + + if (tableSize < 1) + return; + + _tableSize = tableSize; + if (_tableSize < 16) + _tableSize = 16; + + // even sucks for distribution + _tableSize |= 1u; + + _blockSize = blockSize; + if (_blockSize < 4) + _blockSize = 4; + + _buckets = new Entry *[_tableSize]; + + memset(_buckets, 0, sizeof(Entry *) * _tableSize); + +#ifdef HASHMAP_DEBUG + memset(&_debug, 0, sizeof(_debug)); +#endif +} + +template +bool HashMap::set(const Key &key, const Value &value) +{ + if (!isInitialized()) + error("HashMap", "Not initialized\n"); + + unsigned int p = getMapPosByKey(key); + Entry *e; + + // set as root if empty + if (!_buckets[p]) { + e = popAvailable(); + Hash::copy(e->key, key); + e->value = value; + + _buckets[p] = e; + + return false; + } + + e = _buckets[p]; + + // check root + if (Hash::equals(e->key, key)) { + e->value = value; + return true; + } + + // walk list + e = findPredecessor(key, e); + Entry *hit = e->next; + + // replace match + if (hit) { + hit->value = value; + return true; + } + + // append new + hit = popAvailable(); + Hash::copy(hit->key, key); + hit->value = value; + e->next = hit; + + return false; +} + +template +const Value *HashMap::get(const Key &key) const +{ + if (!isInitialized()) + return NULL; + + incAccesses(); + + for (Entry *e = getBucketByKey(key); e; e = e->next) + if (Hash::equals(e->key, key)) + return &e->value; + + return NULL; +} + +template +bool HashMap::has(const Key &key) const +{ + return get(key) != NULL; +} + +template +inline bool HashMap::remove(const Key &key) +{ + if (!isInitialized()) + return false; + + unsigned int p = getMapPosByKey(key); + Entry *e = _buckets[p]; + + if (!e) + return false; + + // check root + if (Hash::equals(e->key, key)) { + _buckets[p] = e->next; + pushAvailable(e); + + return true; + } + + // walk the list + e = findPredecessor(key, e); + Entry *hit = e->next; + + if (!hit) + return false; + + e->next = hit->next; + pushAvailable(hit); + + return true; +} + +template +void HashMap::clear() +{ + if (!isInitialized()) + return; + +#ifdef HASHMAP_DEBUG + dumpStats(); +#endif + + _available = NULL; + + delete[] _buckets; + _buckets = NULL; + + while (!_blocks.empty()) { + delete[] _blocks.front(); + _blocks.pop_front(); + } +} + +template +bool inline HashMap::isInitialized() const +{ + return _buckets != NULL; +} + +template +inline typename HashMap::Entry *HashMap::popAvailable() +{ + if (!_available) + allocBlock(); + + Entry *e = _available; + _available = e->next; + + e->next = NULL; + + return e; +} + +template +inline void HashMap::pushAvailable(Entry *e) { + e->next = _available; + _available = e; +} + +template +inline unsigned int HashMap::getMapPosByHash(unsigned int hash) const +{ + return hash % _tableSize; +} + +template +inline unsigned int HashMap::getMapPosByKey(const Key &key) const +{ + return getMapPosByHash(Hash::hash(key)); +} + +template +inline typename HashMap::Entry *HashMap::getBucketByHash(unsigned int hash) const +{ + return _buckets[getMapPosByHash(hash)]; +} + +template +inline typename HashMap::Entry *HashMap::getBucketByKey(const Key &key) const +{ + return _buckets[getMapPosByKey(key)]; +} + +template +inline typename HashMap::Entry *HashMap::findPredecessor(const Key &key, Entry *e) const +{ + for (; e->next; e = e->next) + if (Hash::equals(e->next->key, key)) + break; + + return e; +} + +template +inline void HashMap::incAccesses() const +{ +#ifdef HASHMAP_DEBUG + _debug.accesses++; +#endif +} + +template +void HashMap::allocBlock() +{ + Entry *block = new Entry[_blockSize]; + + _blocks.push_back(block); + + for (unsigned int i = 0; i < _blockSize; ++i) + pushAvailable(block++); + +#ifdef HASHMAP_DEBUG + _debug.allocs++; +#endif +} + +#ifdef HASHMAP_DEBUG +template +void HashMap::dumpStats(const char* description) +{ + if (!isInitialized()) + return; + + unsigned int entries = 0; + unsigned int collisions = 0; + unsigned int empty = 0; + unsigned int eq1 = 0; + unsigned int eq2 = 0; + unsigned int gt2 = 0; + unsigned int gt4 = 0; + unsigned int gt8 = 0; + unsigned int largest = 0; + + Entry **b = _buckets; + for (unsigned int i = 0; i < _tableSize; ++i, ++b) { + if (!(*b)) { + empty++; + continue; + } + + unsigned int c = 0; + for (Entry *e = *b; e; c++, entries++, e = e->next) + ; + + if (c > 8) + gt8++; + else if (c > 4) + gt4++; + else if (c > 2) + gt2++; + else if (c > 1) + eq2++; + else + eq1++; + + if (c > 1) + collisions += c; + + if (c > largest) + largest++; + } + + unsigned int bytes = sizeof(*this) + + _tableSize * sizeof(Entry *) + + _blocks.size() * sizeof(Entry) * _blockSize; + + printMessage("HashMap", "stats for %s:\n" + "size\t\t%u\n" + "allocs\t\t%u\n" + "accesses\t%u\n" + "entries\t\t%u\n" + "collisions\t%u\n" + "empty buckets\t%u\n" + "=1 buckets\t%u\n" + "=2 buckets\t%u\n" + ">2 buckets\t%u\n" + ">4 buckets\t%u\n" + ">8 buckets\t%u\n" + "largest bucket\t%u\n" + "memsize\t\t%ukb\n", + DEFAULT, description, + _tableSize, _debug.allocs, _debug.accesses, + entries, collisions, empty, eq1, eq2, gt2, + gt4, gt8, largest, bytes / 1024); + + memset(&_debug, 0, sizeof(_debug)); +} +#endif + +#endif diff --git a/project/jni/application/gemrb/gemrb/includes/SClassID.h b/project/jni/application/gemrb/gemrb/includes/SClassID.h index b82d71ce9..776dbca79 100644 --- a/project/jni/application/gemrb/gemrb/includes/SClassID.h +++ b/project/jni/application/gemrb/gemrb/includes/SClassID.h @@ -82,6 +82,7 @@ enum { PLUGIN_OPCODES_TORMENT, PLUGIN_RESOURCE_KEY, PLUGIN_RESOURCE_DIRECTORY, + PLUGIN_RESOURCE_CACHEDDIRECTORY, PLUGIN_IMAGE_WRITER_BMP, PLUGIN_COMPRESSION_ZLIB }; diff --git a/project/jni/application/gemrb/gemrb/includes/StringMap.h b/project/jni/application/gemrb/gemrb/includes/StringMap.h new file mode 100644 index 000000000..4805e1e16 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/includes/StringMap.h @@ -0,0 +1,127 @@ +/* GemRB - Infinity Engine Emulator + * Copyright (C) 2011 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 STRINGMAP_H +#define STRINGMAP_H + +#include + +#include "ie_types.h" + +#include "System/String.h" +#include "HashMap.h" + +// Use "StringMap" for mapping std::strings to std::strings. +// This does not limit the length of either the keys nor values, but at the +// cost of (re)allocs for each string. +// +// Use HashMap to use fixed-sized char arrays as keys. +// This has the advantage that HashMap will alloc the char array as part of +// its blocks. + +template<> +struct HashKey { + // hash without std::string construction + static inline unsigned int hash(const char *key) + { + unsigned int h = 0; + + while (*key) + h = (h << 5) + h + tolower(*key++); + + return h; + } + + static inline unsigned int hash(const std::string &key) + { + return hash(key.c_str()); + } + + // equal check without std::string construction + static inline bool equals(const std::string &a, const char *b) + { + return stricmp(a.c_str(), b) == 0; + } + + static inline bool equals(const std::string &a, const std::string &b) + { + return equals(a, b.c_str()); + } + + static inline void copy(std::string &a, const std::string &b) + { + a = b; + } +}; + +class StringMap : public HashMap { +public: + // lookup without std::string construction + const std::string *get(const char *key) const + { + if (!isInitialized()) + return NULL; + + incAccesses(); + + for (Entry *e = getBucketByHash(HashKey::hash(key)); e; e = e->next) + if (HashKey::equals(e->key, key)) + return &e->value; + + return NULL; + } + + // lookup without std::string construction + bool has(const char *key) const + { + return get(key) != NULL; + } +}; + +// disabled, msvc6 hates it +#if 0 +template +struct HashKey { + typedef char array[size]; + + static inline unsigned int hash(const array &key) + { + unsigned int h = 0; + const char *c = key; + + for (unsigned int i = 0; *c && i < size; ++i) + h = (h << 5) + h + tolower(*c++); + + return h; + } + + static inline bool equals(const array &a, const array &b) + { + return strnicmp(a, b, size) == 0; + } + + static inline void copy(array &a, const array &b) + { + strncpy(a, b, size); + } +}; +#endif + +#endif diff --git a/project/jni/application/gemrb/gemrb/includes/defsounds.h b/project/jni/application/gemrb/gemrb/includes/defsounds.h index 7ce8dc042..76e8288bb 100644 --- a/project/jni/application/gemrb/gemrb/includes/defsounds.h +++ b/project/jni/application/gemrb/gemrb/includes/defsounds.h @@ -39,6 +39,7 @@ #define DS_CLOSE_FAIL 8 #define DS_ITEM_GONE 9 #define DS_FOUNDSECRET 10 +#define DS_PICKLOCK 11 #define DS_RAIN 20 #define DS_SNOW 21 diff --git a/project/jni/application/gemrb/gemrb/includes/exports.h b/project/jni/application/gemrb/gemrb/includes/exports.h index 0faa7f12a..6b40d6ea4 100644 --- a/project/jni/application/gemrb/gemrb/includes/exports.h +++ b/project/jni/application/gemrb/gemrb/includes/exports.h @@ -21,6 +21,15 @@ #ifndef EXPORTS_H #define EXPORTS_H +/** + * @file exports.h + * This file contains global compiler configuration. + * + * It should not contain any declarations or includes, + * only compiler dependent macros and pragmas. + */ + +/// Symbol visibility macros #ifdef WIN32 # ifdef GEM_BUILD_DLL # define GEM_EXPORT __declspec(dllexport) @@ -38,11 +47,37 @@ #endif #ifndef GEM_EXPORT -#define GEM_EXPORT +# define GEM_EXPORT #endif #ifndef GEM_EXPORT_DLL -#define GEM_EXPORT_DLL extern "C" +# define GEM_EXPORT_DLL extern "C" +#endif + +/// Semantic Warning Macros +#ifdef __GNUC__ +# define WARN_UNUSED __attribute__ ((warn_unused_result)) +# define SENTINEL __attribute__ ((sentinel)) +#else +# define WARN_UNUSED +# define SENTINEL +#endif + +/// Disable silly MSVC warnings +#if _MSC_VER >= 1000 +// 4251 disables the annoying warning about missing dll interface in templates +# pragma warning( disable: 4251 521 ) +# pragma warning( disable: 4275 ) +// disables annoying warning caused by STL:Map in msvc 6.0 +# if _MSC_VER < 7000 +# pragma warning(disable:4786) +# endif +#endif + +/// Make sure we don't like to static libraries +/// This causes hard to debug errors due to multiple heaps. +#if defined(_MSC_VER) && !defined(_DLL) +# error GemRB must be dynamically linked with runtime libraries on win32. #endif #endif diff --git a/project/jni/application/gemrb/gemrb/includes/globals.h b/project/jni/application/gemrb/gemrb/includes/globals.h index a34c470ff..62197de89 100644 --- a/project/jni/application/gemrb/gemrb/includes/globals.h +++ b/project/jni/application/gemrb/gemrb/includes/globals.h @@ -52,10 +52,9 @@ #include "errors.h" #include "win32def.h" -#include "AnimStructures.h" -#include "System/DataStream.h" #include "Region.h" -#include "Sprite2D.h" +#include "System/DataStream.h" +#include "System/String.h" #include #include @@ -82,10 +81,6 @@ #define BM_XOR 3 #define BM_NAND 4 //gemrb extension -//IDS Importer Defines -#define IDS_VALUE_NOT_LOCATED -65535 // GetValue returns this if text is not found in arrays ... this needs to be a unique number that does not exist in the value[] array -#define GEM_ENCRYPTION_KEY "\x88\xa8\x8f\xba\x8a\xd3\xb9\xf5\xed\xb1\xcf\xea\xaa\xe4\xb5\xfb\xeb\x82\xf9\x90\xca\xc9\xb5\xe7\xdc\x8e\xb7\xac\xee\xf7\xe0\xca\x8e\xea\xca\x80\xce\xc5\xad\xb7\xc4\xd0\x84\x93\xd5\xf0\xeb\xc8\xb4\x9d\xcc\xaf\xa5\x95\xba\x99\x87\xd2\x9d\xe3\x91\xba\x90\xca" - /////feature flags #define GF_HAS_KAPUTZ 0 //pst #define GF_ALL_STRINGS_TAGGED 1 //bg1, pst, iwd1 @@ -166,17 +161,6 @@ class Scriptable; class Actor; -/* this function will work with pl/cz special characters */ - -extern unsigned char pl_uppercase[256]; -extern unsigned char pl_lowercase[256]; - -GEM_EXPORT void strnlwrcpy(char* d, const char *s, int l); -GEM_EXPORT void strnuprcpy(char* d, const char *s, int l); -GEM_EXPORT void strnspccpy(char* d, const char *s, int l); -#ifndef HAVE_STRNLEN -GEM_EXPORT int strnlen(const char* string, int maxlen); -#endif GEM_EXPORT unsigned char GetOrient(const Point &s, const Point &d); GEM_EXPORT unsigned int Distance(const Point pos, const Point pos2); GEM_EXPORT unsigned int Distance(const Point pos, Scriptable *b); @@ -189,27 +173,15 @@ GEM_EXPORT unsigned int PersonalDistance(Scriptable *a, Scriptable *b); GEM_EXPORT unsigned int SquaredPersonalDistance(Scriptable *a, Scriptable *b); GEM_EXPORT unsigned int SquaredMapDistance(Scriptable *a, Scriptable *b); GEM_EXPORT int EARelation(Scriptable *a, Actor *b); -GEM_EXPORT bool dir_exists(const char* path); -GEM_EXPORT int strlench(const char* string, char ch); -#ifndef HAVE_STRNDUP -GEM_EXPORT char* strndup(const char* s, size_t l); -#endif #ifndef WIN32 -GEM_EXPORT char* strupr(char* string); -GEM_EXPORT char* strlwr(char* string); -#endif - -#ifdef WIN32 -#define GetTime(store) store = GetTickCount() -#else #include -#define GetTime(store) \ - { \ - struct timeval tv; \ - gettimeofday(&tv, NULL); \ - store = (tv.tv_usec/1000) + (tv.tv_sec*1000); \ - } +inline unsigned long GetTickCount() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return (tv.tv_usec/1000) + (tv.tv_sec*1000); +} #endif inline int MIN(int a, int b) diff --git a/project/jni/application/gemrb/gemrb/includes/plugindef.h b/project/jni/application/gemrb/gemrb/includes/plugindef.h index 72a74e75e..6d9caba9f 100644 --- a/project/jni/application/gemrb/gemrb/includes/plugindef.h +++ b/project/jni/application/gemrb/gemrb/includes/plugindef.h @@ -30,7 +30,7 @@ * #include "plugindef.h" * * GEMRB_PLUGIN(0xD768B1, "BMP File Reader") - * PLUGIN_IE_RESOURCE(BMPImporter, ".bmp", IE_BMP_CLASS_ID) + * PLUGIN_IE_RESOURCE(BMPImporter, "bmp", IE_BMP_CLASS_ID) * END_PLUGIN() * @endcode * diff --git a/project/jni/application/gemrb/gemrb/includes/win32def.h b/project/jni/application/gemrb/gemrb/includes/win32def.h index 5b676e090..7c0fbdabc 100644 --- a/project/jni/application/gemrb/gemrb/includes/win32def.h +++ b/project/jni/application/gemrb/gemrb/includes/win32def.h @@ -30,43 +30,24 @@ #include "exports.h" +#include "System/String.h" + #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include -# if _MSC_VER >= 1000 -// 4251 disables the annoying warning about missing dll interface in templates -# pragma warning( disable: 4251 521 ) -# pragma warning( disable: 4275 ) -//disables annoying warning caused by STL:Map in msvc 6.0 -# if _MSC_VER < 7000 -# pragma warning(disable:4786) -# endif -# endif - -# if defined(__MINGW32__) && ! defined(HAVE_SNPRINTF) -# define HAVE_SNPRINTF 1 -# endif - #else //WIN32 # ifndef ANDROID # include # endif # include # include -# include -# define stricmp strcasecmp -# define strnicmp strncasecmp #endif //WIN32 -#ifndef HAVE_SNPRINTF -# ifdef WIN32 -# define snprintf _snprintf -# define HAVE_SNPRINTF 1 -# else -# include "System/snprintf.h" -# endif +#if defined(WIN32) && !defined(__MINGW32__) +# define snprintf _snprintf +# define vsnprintf _vsnprintf #endif #include "System/VFS.h" @@ -84,5 +65,5 @@ #define M_PI_2 1.57079632679489661923 // pi/2 #endif -#include "logging.h" +#include "System/Logging.h" #endif //! WIN32DEF_H diff --git a/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.cpp index fcb046ffa..74e372f0d 100644 --- a/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.cpp @@ -30,30 +30,20 @@ p2DAImporter::p2DAImporter(void) { - str = NULL; - autoFree = false; } p2DAImporter::~p2DAImporter(void) { - if (str && autoFree) { - delete( str ); - } for (unsigned int i = 0; i < ptrs.size(); i++) { free( ptrs[i] ); } } -bool p2DAImporter::Open(DataStream* stream, bool autoFree) +bool p2DAImporter::Open(DataStream* str) { - if (stream == NULL) { + if (str == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } - str = stream; - this->autoFree = autoFree; char Signature[SIGNLENGTH]; str->CheckEncrypted(); @@ -110,6 +100,7 @@ bool p2DAImporter::Open(DataStream* stream, bool autoFree) row++; } } + delete str; return true; } diff --git a/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.h b/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.h index 0e83b5c42..360418db8 100644 --- a/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/2DAImporter/2DAImporter.h @@ -26,13 +26,13 @@ #include "globals.h" #include +#include typedef std::vector< char*> RowEntry; class p2DAImporter : public TableMgr { private: DataStream* str; - bool autoFree; std::vector< char*> colNames; std::vector< char*> rowNames; std::vector< char*> ptrs; @@ -41,7 +41,7 @@ private: public: p2DAImporter(void); ~p2DAImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); /** Returns the actual number of Rows in the Table */ inline ieDword GetRowCount() const { diff --git a/project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.cpp b/project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.cpp index f0c5f9cf5..252c24240 100644 --- a/project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/ACMReader/ACMReader.cpp @@ -112,6 +112,6 @@ int ACMReader::read_samples(short* buffer, int count) #include "plugindef.h" GEMRB_PLUGIN(0x10373EE, "ACM File Importer") -PLUGIN_IE_RESOURCE(ACMReader, ".acm", (ieWord)IE_ACM_CLASS_ID) -PLUGIN_IE_RESOURCE(ACMReader, ".wav", (ieWord)IE_WAV_CLASS_ID) +PLUGIN_IE_RESOURCE(ACMReader, "acm", (ieWord)IE_ACM_CLASS_ID) +PLUGIN_IE_RESOURCE(ACMReader, "wav", (ieWord)IE_WAV_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.cpp index 45e1a81ad..ff29eff11 100644 --- a/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.cpp @@ -33,15 +33,17 @@ #include "ImageMgr.h" #include "Interface.h" #include "Palette.h" +#include "PluginMgr.h" #include "ProjectileServer.h" #include "TileMapMgr.h" #include "Video.h" #include "GameScript/GameScript.h" +#include "GUI/Window.h" #include "Scriptable/Container.h" #include "Scriptable/Door.h" #include "Scriptable/InfoPoint.h" -#include "System/CachedFileStream.h" #include "System/FileStream.h" +#include "System/SlicedStream.h" #define DEF_OPEN 0 #define DEF_CLOSE 1 @@ -70,7 +72,7 @@ Holder INInote; ResRefToStrRef *tracks = NULL; int trackcount = 0; -void ReleaseMemory() +static void ReleaseMemory() { INInote.release(); @@ -78,17 +80,16 @@ void ReleaseMemory() tracks = NULL; } -void ReadAutonoteINI() +static void ReadAutonoteINI() { INInote = PluginHolder(IE_INI_CLASS_ID); - FileStream* fs = new FileStream(); char tINInote[_MAX_PATH]; PathJoin( tINInote, core->GamePath, "autonote.ini", NULL ); - fs->Open( tINInote, true ); - INInote->Open( fs, true ); + FileStream* fs = FileStream::OpenFile( tINInote ); + INInote->Open(fs); } -int GetTrackString(const ieResRef areaName) +static int GetTrackString(const ieResRef areaName) { int i; bool trackflag = displaymsg->HasStringReference(STR_TRACKING); @@ -123,7 +124,6 @@ int GetTrackString(const ieResRef areaName) AREImporter::AREImporter(void) { - autoFree = false; str = NULL; if (Sounds[0][0] == UNINITIALIZED_BYTE) { memset( Sounds, 0, sizeof( Sounds ) ); @@ -141,22 +141,17 @@ AREImporter::AREImporter(void) AREImporter::~AREImporter(void) { - if (autoFree) { - delete str; - } + delete str; Sounds[0][0]=UNINITIALIZED_BYTE; } -bool AREImporter::Open(DataStream* stream, bool autoFree) +bool AREImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (this->autoFree) { - delete str; - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); @@ -253,7 +248,7 @@ bool AREImporter::ChangeMap(Map *map, bool day_or_night) } tm = tmm->GetTileMap(tm); if (!tm) { - printf( "[AREImporter]: No Tile Map Available.\n" ); + print( "[AREImporter]: No Tile Map Available.\n" ); return false; } @@ -273,7 +268,7 @@ bool AREImporter::ChangeMap(Map *map, bool day_or_night) ResourceHolder lm(TmpResRef); if (!lm) { - printf( "[AREImporter]: No lightmap available.\n" ); + print( "[AREImporter]: No lightmap available.\n" ); return false; } @@ -292,8 +287,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) Map* map = new Map(); if(!map) { - printf("Can't allocate map (out of memory).\n"); - abort(); + error("AREImporter", "Can't allocate map (out of memory).\n"); } if (core->SaveAsOriginal) { map->version = bigheader; @@ -321,7 +315,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } if (!core->IsAvailable( IE_WED_CLASS_ID )) { - printf( "[AREImporter]: No Tile Map Manager Available.\n" ); + print( "[AREImporter]: No Tile Map Manager Available.\n" ); return NULL; } ieResRef TmpResRef; @@ -339,7 +333,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) //there was no tilemap set yet, so lets just send a NULL TileMap* tm = tmm->GetTileMap(NULL); if (!tm) { - printf( "[AREImporter]: No Tile Map Available.\n" ); + print( "[AREImporter]: No Tile Map Available.\n" ); return NULL; } @@ -368,7 +362,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) ResourceHolder lm(TmpResRef); if (!lm) { - printf( "[AREImporter]: No lightmap available.\n" ); + print( "[AREImporter]: No lightmap available.\n" ); return NULL; } @@ -376,7 +370,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) ResourceHolder sr(TmpResRef); if (!sr) { - printf( "[AREImporter]: No searchmap available.\n" ); + print( "[AREImporter]: No searchmap available.\n" ); return NULL; } @@ -384,7 +378,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) ResourceHolder hm(TmpResRef); if (!hm) { - printf( "[AREImporter]: No heightmap available.\n" ); + print( "[AREImporter]: No heightmap available.\n" ); return NULL; } @@ -415,7 +409,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) str->ReadWord( &map->RestHeader.DayChance ); str->ReadWord( &map->RestHeader.NightChance ); - printf( "Loading regions\n" ); + print( "Loading regions\n" ); core->LoadProgress(70); //Loading InfoPoints for (i = 0; i < InfoPointsCount; i++) { @@ -523,7 +517,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } } - printf( "Loading containers\n" ); + print( "Loading containers\n" ); //Loading Containers for (i = 0; i < ContainersCount; i++) { str->Seek( ContainersOffset + ( i * 0xC0 ), GEM_STREAM_START ); @@ -630,7 +624,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) c->OpenFail = OpenFail; } - printf( "Loading doors\n" ); + print( "Loading doors\n" ); //Loading Doors for (i = 0; i < DoorsCount; i++) { str->Seek( DoorsOffset + ( i * 0xc8 ), GEM_STREAM_START ); @@ -833,7 +827,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) door->SetDialog(Dialog); } - printf( "Loading spawnpoints\n" ); + print( "Loading spawnpoints\n" ); //Loading SpawnPoints for (i = 0; i < SpawnCount; i++) { str->Seek( SpawnOffset + (i*0xc8), GEM_STREAM_START ); @@ -888,11 +882,11 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } core->LoadProgress(75); - printf( "Loading actors\n" ); + print( "Loading actors\n" ); //Loading Actors str->Seek( ActorOffset, GEM_STREAM_START ); if (!core->IsAvailable( IE_CRE_CLASS_ID )) { - printf( "[AREImporter]: No Actor Manager Available, skipping actors\n" ); + print( "[AREImporter]: No Actor Manager Available, skipping actors\n" ); } else { PluginHolder actmgr(IE_CRE_CLASS_ID); for (i = 0; i < ActorCount; i++) { @@ -943,13 +937,12 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) //actually, Flags&1 signs that the creature //is not loaded yet, so !(Flags&1) means it is embedded if (CreOffset != 0 && !(Flags&1) ) { - CachedFileStream *fs = new CachedFileStream( (CachedFileStream *) str, CreOffset, CreSize, true); - crefile = (DataStream *) fs; + crefile = SliceStream( str, CreOffset, CreSize, true ); } else { crefile = gamedata->GetResource( CreResRef, IE_CRE_CLASS_ID ); } - if(!actmgr->Open( crefile, true )) { - printf("Couldn't read actor: %s!\n", CreResRef); + if(!actmgr->Open(crefile)) { + print("Couldn't read actor: %s!\n", CreResRef); continue; } ab = actmgr->GetActor(0); @@ -984,11 +977,11 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } core->LoadProgress(90); - printf( "Loading animations\n" ); + print( "Loading animations\n" ); //Loading Animations str->Seek( AnimOffset, GEM_STREAM_START ); if (!core->IsAvailable( IE_BAM_CLASS_ID )) { - printf( "[AREImporter]: No Animation Manager Available, skipping animations\n" ); + print( "[AREImporter]: No Animation Manager Available, skipping animations\n" ); } else { for (i = 0; i < AnimCount; i++) { AreaAnimation* anim = new AreaAnimation(); @@ -1023,7 +1016,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } } - printf( "Loading entrances\n" ); + print( "Loading entrances\n" ); //Loading Entrances str->Seek( EntrancesOffset, GEM_STREAM_START ); for (i = 0; i < EntrancesCount; i++) { @@ -1038,7 +1031,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) map->AddEntrance( Name, XPos, YPos, Face ); } - printf( "Loading variables\n" ); + print( "Loading variables\n" ); map->locals->LoadInitialValues(ResRef); //Loading Variables str->Seek( VariablesOffset, GEM_STREAM_START ); @@ -1053,7 +1046,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) map->locals->SetAt( Name, Value ); } - printf( "Loading ambients\n" ); + print( "Loading ambients\n" ); str->Seek( AmbiOffset, GEM_STREAM_START ); for (i = 0; i < AmbiCount; i++) { int j; @@ -1093,7 +1086,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) map->AddAmbient(ambi); } - printf( "Loading automap notes\n" ); + print( "Loading automap notes\n" ); str->Seek( NoteOffset, GEM_STREAM_START ); //this feature exists in all blackisle games but not in bioware games @@ -1168,7 +1161,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } //this is a ToB feature (saves the unexploded projectiles) - printf( "Loading traps\n" ); + print( "Loading traps\n" ); for (i = 0; i < TrapCount; i++) { ieResRef TrapResRef; ieDword TrapEffOffset; @@ -1193,8 +1186,8 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) str->Read( &Owner,1 ); int TrapEffectCount = TrapSize/0x108; if(TrapEffectCount*0x108!=TrapSize) { - printMessage("AREImporter", " ", LIGHT_RED); - printf("TrapEffectSize in game: %d != %d. Clearing it\n", TrapSize, TrapEffectCount*0x108); + printMessage("AREImporter", "TrapEffectSize in game: %d != %d. Clearing it\n", LIGHT_RED, + TrapSize, TrapEffectCount*0x108); continue; } //The projectile is always created, the worst that can happen @@ -1205,7 +1198,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) //This could be wrong on msvc7 with its separate memory managers EffectQueue *fxqueue = new EffectQueue(); - CachedFileStream *fs = new CachedFileStream( (CachedFileStream *) str, TrapEffOffset, TrapSize, true); + DataStream *fs = new SlicedStream( str, TrapEffOffset, TrapSize); ReadEffects((DataStream *) fs,fxqueue, TrapEffectCount); Actor * caster = core->GetGame()->FindPC(PartyID); @@ -1218,7 +1211,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) map->AddProjectile( pro, pos, pos); } - printf( "Loading tiles\n" ); + print( "Loading tiles\n" ); //Loading Tiled objects (if any) str->Seek( TileOffset, GEM_STREAM_START ); for (i = 0; i < TileCount; i++) { @@ -1241,7 +1234,7 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) map->TMap->AddTile( ID, Name, Flags, NULL,0, NULL, 0 ); } - printf( "Loading explored bitmap\n" ); + print( "Loading explored bitmap\n" ); i = map->GetExploredMapSize(); if (ExploredBitmapSize==i) { map->ExploredBitmap = (ieByte *) malloc(i); @@ -1250,15 +1243,15 @@ Map* AREImporter::GetMap(const char *ResRef, bool day_or_night) } else { if( ExploredBitmapSize ) { - printMessage("AREImporter", " ", LIGHT_RED); - printf("ExploredBitmapSize in game: %d != %d. Clearing it\n", ExploredBitmapSize, i); + printMessage("AREImporter", "ExploredBitmapSize in game: %d != %d. Clearing it\n", LIGHT_RED, + ExploredBitmapSize, i); } ExploredBitmapSize = i; map->ExploredBitmap = (ieByte *) calloc(i, 1); } map->VisibleBitmap = (ieByte *) calloc(i, 1); - printf( "Loading wallgroups\n"); + print( "Loading wallgroups\n"); map->SetWallGroups( tmm->GetPolygonsCount(),tmm->GetWallGroups() ); //setting up doors for (i=0;i eM(IE_EFF_CLASS_ID); - eM->Open( ds, true ); + eM->Open(ds); for (i = 0; i < EffectsCount; i++) { Effect fx; diff --git a/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.h b/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.h index db801547a..d5fbdd3c0 100644 --- a/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/AREImporter/AREImporter.h @@ -23,13 +23,14 @@ #include "MapMgr.h" +#include "Map.h" // proIterator class Animation; class AnimationFactory; +class EffectQueue; class AREImporter : public MapMgr { private: DataStream* str; - bool autoFree; int bigheader; ieResRef WEDResRef; ieDword LastSave; @@ -57,7 +58,7 @@ private: public: AREImporter(void); ~AREImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); bool ChangeMap(Map *map, bool day_or_night); Map* GetMap(const char* ResRef, bool day_or_night); int GetStoredFileSize(Map *map); diff --git a/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.cpp index 853115866..f5b374725 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.cpp @@ -30,17 +30,18 @@ #include "win32def.h" -#include "Compressor.h" +#include "FileCache.h" +#include "Font.h" #include "GameData.h" #include "Interface.h" #include "Palette.h" +#include "Sprite2D.h" #include "Video.h" #include "System/FileStream.h" BAMImporter::BAMImporter(void) { str = NULL; - autoFree = false; frames = NULL; cycles = NULL; palette = NULL; @@ -50,72 +51,35 @@ BAMImporter::BAMImporter(void) BAMImporter::~BAMImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; delete[] frames; delete[] cycles; gamedata->FreePalette(palette); } -bool BAMImporter::Open(DataStream* stream, bool autoFree) +bool BAMImporter::Open(DataStream* stream) { unsigned int i; if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; delete[] frames; delete[] cycles; gamedata->FreePalette(palette); str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "BAMCV1 ", 8 ) == 0) { - //Check if Decompressed file has already been Cached - char cpath[_MAX_PATH]; - strcpy( cpath, core->CachePath ); - strcat( cpath, stream->filename ); - FILE* exist_in_cache = fopen( cpath, "rb" ); - if (exist_in_cache) { - //File was previously cached, using local copy - if (autoFree) { - delete( str ); - } - fclose( exist_in_cache ); - FileStream* s = new FileStream(); - s->Open( cpath ); - str = s; - str->Read( Signature, 8 ); - } else { - //No file found in Cache, Decompressing and storing for further use - str->Seek( 4, GEM_CURRENT_POS ); - - if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) { - printf( "No Compression Manager Available.\nCannot Load Compressed Bam File.\n" ); - return false; - } - FILE* newfile = fopen( cpath, "wb" ); - if (!newfile) { - printMessage("BAMImporter", " ", RED); - printf( "Cannot write %s.\n", cpath ); - return false; - } - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - comp->Decompress( newfile, str ); - fclose( newfile ); - if (autoFree) - delete( str ); - FileStream* s = new FileStream(); - s->Open( cpath ); - str = s; - str->Read( Signature, 8 ); - } + str->Seek( 4, GEM_CURRENT_POS ); + DataStream* cached = CacheCompressedStream(stream, stream->filename); + delete str; + if (!cached) + return false; + str = cached; + str->Read( Signature, 8 ); } if (strncmp( Signature, "BAM V1 ", 8 ) != 0) { return false; @@ -244,7 +208,7 @@ void* BAMImporter::GetFramePixels(unsigned short findex) // into override/ dir? if (i + ( *p ) + 1 > pixelcount) { memset( &Buffer[i], CompressedColorIndex, pixelcount - i ); - printf ("Broken frame %d\n", findex); + print ("Broken frame %d\n", findex); } else { memset( &Buffer[i], CompressedColorIndex, ( *p ) + 1 ); } diff --git a/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.h b/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.h index be59c3560..dc2ada4ea 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/BAMImporter/BAMImporter.h @@ -39,7 +39,6 @@ class Palette; class BAMImporter : public AnimationMgr { private: DataStream* str; - bool autoFree; FrameEntry* frames; CycleEntry* cycles; ieWord FramesCount; @@ -57,7 +56,7 @@ private: public: BAMImporter(void); ~BAMImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); int GetCycleSize(unsigned char Cycle); AnimationFactory* GetAnimationFactory(const char* ResRef, unsigned char mode = IE_NORMAL); diff --git a/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.cpp index ccee8596c..4f92c0446 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.cpp @@ -23,8 +23,10 @@ #include "win32def.h" #include "Compressor.h" +#include "FileCache.h" #include "Interface.h" -#include "System/CachedFileStream.h" +#include "PluginMgr.h" +#include "System/SlicedStream.h" #include "System/FileStream.h" BIFImporter::BIFImporter(void) @@ -47,91 +49,46 @@ BIFImporter::~BIFImporter(void) } } -int BIFImporter::DecompressSaveGame(DataStream *compressed) +bool BIFImporter::DecompressBIF(DataStream* compressed, const char* path) { - char Signature[8]; - compressed->Read( Signature, 8 ); - if (strncmp( Signature, "SAV V1.0", 8 ) ) { - return GEM_ERROR; + print( "Decompressing\n" ); + if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) + return false; + PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); + ieDword unCompBifSize; + compressed->ReadDword( &unCompBifSize ); + print( "\nDecompressing file: [..........]" ); + fflush(stdout); + FileStream out; + if (!out.Create(path)) { + printMessage("BIFImporter", "Cannot write %s.\n", RED, path); + return false; } - int All = compressed->Remains(); - int Current; - if (!All) return GEM_ERROR; - do { - ieDword fnlen, complen, declen; - compressed->ReadDword( &fnlen ); - char* fname = ( char* ) malloc( fnlen ); - compressed->Read( fname, fnlen ); - strlwr(fname); + ieDword finalsize = 0; + int laststep = 0; + while (finalsize < unCompBifSize) { + ieDword complen, declen; compressed->ReadDword( &declen ); compressed->ReadDword( &complen ); - PathJoin( path, core->CachePath, fname, NULL ); - printf( "Decompressing %s\n",fname ); - free( fname ); - if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) - return GEM_ERROR; - FILE *in_cache = fopen( path, "wb" ); - if (!in_cache) { - printMessage("BIFImporter", " ", RED); - printf( "Cannot write %s.\n", path ); - return GEM_ERROR; + if (comp->Decompress( &out, compressed, complen ) != GEM_OK) { + return false; } - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - if (comp->Decompress( in_cache, compressed, complen ) != GEM_OK) { - return GEM_ERROR; + finalsize = out.GetPos(); + if (( int ) ( finalsize * ( 10.0 / unCompBifSize ) ) != laststep) { + laststep++; + print( "\b\b\b\b\b\b\b\b\b\b\b" ); + int l; + + for (l = 0; l < laststep; l++) + print( "|" ); + for (; l < 10; l++)//l starts from laststep + print( "." ); + print( "]" ); + fflush(stdout); } - fclose( in_cache ); - Current = compressed->Remains(); - //starting at 20% going up to 70% - core->LoadProgress( 20+(All-Current)*50/All ); } - while(Current); - return GEM_OK; -} - -//this one can create .sav files only -int BIFImporter::CreateArchive(DataStream *compressed) -{ - if (stream) { - delete( stream ); - stream = NULL; - } - if (!compressed) { - return GEM_ERROR; - } - char Signature[8]; - - memcpy(Signature,"SAV V1.0",8); - compressed->Write(Signature, 8); - - return GEM_OK; -} - -int BIFImporter::AddToSaveGame(DataStream *str, DataStream *uncompressed) -{ - ieDword fnlen, declen, complen; - - fnlen = strlen(uncompressed->filename)+1; - declen = uncompressed->Size(); - str->WriteDword( &fnlen); - str->Write( uncompressed->filename, fnlen); - str->WriteDword( &declen); - //baaah, we dump output right in the stream, we get the compressed length - //only after the compressed data was written - complen = 0xcdcdcdcd; //placeholder - unsigned long Pos = str->GetPos(); //storing the stream position - str->WriteDword( &complen); - - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - comp->Compress( str, uncompressed ); - - //writing compressed length (calculated) - unsigned long Pos2 = str->GetPos(); - complen = Pos2-Pos-sizeof(ieDword); //calculating the compressed stream size - str->Seek(Pos, GEM_STREAM_START); //going back to the placeholder - str->WriteDword( &complen); //updating size - str->Seek(Pos2, GEM_STREAM_START);//resuming work - return GEM_OK; + print( "\n" ); + return true; } int BIFImporter::OpenArchive(const char* filename) @@ -140,19 +97,21 @@ int BIFImporter::OpenArchive(const char* filename) delete( stream ); stream = NULL; } - FILE* in_cache = fopen( filename, "rb" ); - if( !in_cache) { + FileStream* file = FileStream::OpenFile(filename); + if( !file) { return GEM_ERROR; } char Signature[8]; - if (fread( &Signature, 1, 8, in_cache ) != 8) { - fclose ( in_cache ); + if (file->Read(Signature, 8) == GEM_ERROR) { + delete file; return GEM_ERROR; } - fclose( in_cache ); + delete file; //normal bif, not in cache if (strncmp( Signature, "BIFFV1 ", 8 ) == 0) { - stream = new CachedFileStream( filename ); + stream = CacheFile( filename ); + if (!stream) + return GEM_ERROR; stream->Read( Signature, 8 ); strcpy( path, filename ); ReadBIF(); @@ -160,8 +119,9 @@ int BIFImporter::OpenArchive(const char* filename) } //not found as normal bif //checking compression type - FileStream* compressed = new FileStream(); - compressed->Open( filename, true ); + FileStream* compressed = FileStream::OpenFile( filename ); + if (!compressed) + return GEM_ERROR; compressed->Read( Signature, 8 ); if (strncmp( Signature, "BIF V1.0", 8 ) == 0) { ieDword fnlen, complen, declen; @@ -171,39 +131,12 @@ int BIFImporter::OpenArchive(const char* filename) strlwr(fname); compressed->ReadDword( &declen ); compressed->ReadDword( &complen ); - PathJoin( path, core->CachePath, fname, NULL ); + print( "Decompressing\n" ); + stream = CacheCompressedStream(compressed, fname, complen); free( fname ); - in_cache = fopen( path, "rb" ); - if (in_cache) { - //printf("Found in Cache\n"); - fclose( in_cache ); - delete( compressed ); - stream = new CachedFileStream( path ); - stream->Read( Signature, 8 ); - if (strncmp( Signature, "BIFFV1 ", 8 ) == 0) - ReadBIF(); - else - return GEM_ERROR; - return GEM_OK; - } - printf( "Decompressing\n" ); - if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) { - printMessage("BIFImporter", "No Compression Manager Available.", RED); - return GEM_ERROR; - } - in_cache = fopen( path, "wb" ); - if (!in_cache) { - printMessage("BIFImporter", " ", RED); - printf( "Cannot write %s.\n", path ); - return GEM_ERROR; - } - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - if (comp->Decompress( in_cache, compressed, complen ) != GEM_OK) { - return GEM_ERROR; - } - fclose( in_cache ); delete( compressed ); - stream = new CachedFileStream( path ); + if (!stream) + return GEM_ERROR; stream->Read( Signature, 8 ); if (strncmp( Signature, "BIFFV1 ", 8 ) == 0) ReadBIF(); @@ -213,62 +146,29 @@ int BIFImporter::OpenArchive(const char* filename) } if (strncmp( Signature, "BIFCV1.0", 8 ) == 0) { - //printf("'BIFCV1.0' Compressed File Found\n"); + //print("'BIFCV1.0' Compressed File Found\n"); PathJoin( path, core->CachePath, compressed->filename, NULL ); - in_cache = fopen( path, "rb" ); - if (in_cache) { - //printf("Found in Cache\n"); - fclose( in_cache ); + if (file_exists(path)) { + //print("Found in Cache\n"); delete( compressed ); - stream = new CachedFileStream( path ); + stream = FileStream::OpenFile(path); + if (!stream) + return GEM_ERROR; stream->Read( Signature, 8 ); if (strncmp( Signature, "BIFFV1 ", 8 ) == 0) { - ReadBIF(); + ReadBIF(); } else return GEM_ERROR; return GEM_OK; } - printf( "Decompressing\n" ); - if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) - return GEM_ERROR; - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - ieDword unCompBifSize; - compressed->ReadDword( &unCompBifSize ); - printf( "\nDecompressing file: [..........]" ); - fflush(stdout); - in_cache = fopen( path, "wb" ); - if (!in_cache) { - printMessage("BIFImporter", " ", RED); - printf( "Cannot write %s.\n", path ); + if (!DecompressBIF(compressed, path)) { + delete( compressed ); return GEM_ERROR; } - ieDword finalsize = 0; - int laststep = 0; - while (finalsize < unCompBifSize) { - ieDword complen, declen; - compressed->ReadDword( &declen ); - compressed->ReadDword( &complen ); - if (comp->Decompress( in_cache, compressed, complen ) != GEM_OK) { - return GEM_ERROR; - } - finalsize = ftell( in_cache ); - if (( int ) ( finalsize * ( 10.0 / unCompBifSize ) ) != laststep) { - laststep++; - printf( "\b\b\b\b\b\b\b\b\b\b\b" ); - int l; - - for (l = 0; l < laststep; l++) - printf( "|" ); - for (; l < 10; l++)//l starts from laststep - printf( "." ); - printf( "]" ); - fflush(stdout); - } - } - printf( "\n" ); - fclose( in_cache ); delete( compressed ); - stream = new CachedFileStream( path ); + stream = FileStream::OpenFile(path); + if (!stream) + return GEM_ERROR; stream->Read( Signature, 8 ); if (strncmp( Signature, "BIFFV1 ", 8 ) == 0) ReadBIF(); @@ -286,7 +186,7 @@ DataStream* BIFImporter::GetStream(unsigned long Resource, unsigned long Type) unsigned int srcResLoc = Resource & 0xFC000; for (unsigned int i = 0; i < tentcount; i++) { if (( tentries[i].resLocator & 0xFC000 ) == srcResLoc) { - return new CachedFileStream( stream, tentries[i].dataOffset, + return SliceStream( stream, tentries[i].dataOffset, tentries[i].tileSize * tentries[i].tilesCount ); } } @@ -294,7 +194,7 @@ DataStream* BIFImporter::GetStream(unsigned long Resource, unsigned long Type) ieDword srcResLoc = Resource & 0x3FFF; for (ieDword i = 0; i < fentcount; i++) { if (( fentries[i].resLocator & 0x3FFF ) == srcResLoc) { - return new CachedFileStream( stream, fentries[i].dataOffset, + return SliceStream( stream, fentries[i].dataOffset, fentries[i].fileSize ); } } diff --git a/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.h b/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.h index eaabc321e..e7ca29a9a 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/BIFImporter/BIFImporter.h @@ -21,11 +21,11 @@ #ifndef BIFIMPORTER_H #define BIFIMPORTER_H -#include "ArchiveImporter.h" +#include "IndexedArchive.h" #include "globals.h" -#include "System/CachedFileStream.h" +#include "System/DataStream.h" struct FileEntry { ieDword resLocator; @@ -44,22 +44,20 @@ struct TileEntry { ieWord u1; //Unknown Field }; -class BIFImporter : public ArchiveImporter { +class BIFImporter : public IndexedArchive { private: char path[_MAX_PATH]; FileEntry* fentries; TileEntry* tentries; ieDword fentcount, tentcount; - CachedFileStream* stream; + DataStream* stream; public: BIFImporter(void); ~BIFImporter(void); - int DecompressSaveGame(DataStream *compressed); - int AddToSaveGame(DataStream *str, DataStream *uncompressed); int OpenArchive(const char* filename); - int CreateArchive(DataStream *compressed); DataStream* GetStream(unsigned long Resource, unsigned long Type); private: + static bool DecompressBIF(DataStream* compressed, const char* path); void ReadBIF(void); }; diff --git a/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.cpp b/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.cpp index 5a7da6e9e..071edce8e 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/BIKPlayer.cpp @@ -1503,7 +1503,7 @@ int BIKPlayer::DecodeVideoFrame(void *data, int data_size) } break; default: - printf("Incorrect 16x16 block type!\n"); + print("Incorrect 16x16 block type!\n"); return -1; } bx++; @@ -1586,7 +1586,7 @@ int BIKPlayer::DecodeVideoFrame(void *data, int data_size) c_bundle[BINK_SRC_COLORS].cur_ptr += 64; break; default: - printf("Unknown block type!\n"); + print("Unknown block type!\n"); return -1; } } @@ -1613,5 +1613,5 @@ int BIKPlayer::DecodeVideoFrame(void *data, int data_size) #include "plugindef.h" GEMRB_PLUGIN(0x316E2EDE, "BIK Video Player") -PLUGIN_RESOURCE(BIKPlayer, ".mve") +PLUGIN_RESOURCE(BIKPlayer, "mve") END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.cpp b/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.cpp index 5ef416a47..bbaa2738a 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/BIKPlayer/GetBitContext.cpp @@ -158,7 +158,7 @@ void GetBitContext::merge( uint8_t *dst, uint8_t *src, int size) void GetBitContext::debug(const char *prefix) { - printf("%s: %d\n", prefix, index); + print("%s: %d\n", prefix, index); } //VLC specific code from bitstream.c diff --git a/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.cpp index 284aa00c7..d82c90333 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.cpp @@ -93,8 +93,7 @@ bool BMPImporter::Open(DataStream* stream) //str->ReadDword(&ColorsUsed ); //str->ReadDword(&ColorsImportant ); if (Compression != 0) { - printMessage( "BMPImporter"," ", LIGHT_RED); - printf( "Compressed %d-bits Image, not supported.\n", BitCount ); + printMessage("BMPImporter", "Compressed %d-bits Image, not supported.\n", LIGHT_RED, BitCount); return false; } //COLORTABLE @@ -136,8 +135,7 @@ bool BMPImporter::Open(DataStream* stream) PaddedRowLength = ( Width >> 1 ); break; default: - printMessage( "BMPImporter"," ", LIGHT_RED); - printf( "BitCount %d is not supported.\n", BitCount ); + printMessage("BMPImporter", "BitCount %d is not supported.\n", LIGHT_RED, BitCount); return false; } //if(BitCount!=4) @@ -274,8 +272,7 @@ Bitmap* BMPImporter::GetBitmap() } break; case 24: - printMessage("BMPImporter", "Don't know how to handle 24bit bitmap from ", WHITE); - printf( "%s...", str->filename ); + printMessage("BMPImporter", "Don't know how to handle 24bit bitmap from %s...", WHITE, str->filename); printStatus( "ERROR", LIGHT_RED ); for (y = 0; y < Height; y++) { for (unsigned int x = 0; x < Width; x++) { @@ -288,8 +285,36 @@ Bitmap* BMPImporter::GetBitmap() return data; } +Image* BMPImporter::GetImage() +{ + Image *data = new Image(Width,Height); + + unsigned char *p = ( unsigned char * ) pixels; + switch (BitCount) { + case 8: + unsigned int y; + for (y = 0; y < Height; y++) { + for (unsigned int x = 0; x < Width; x++) { + data->SetPixel(x,y,Palette[p[y*Width + x]%NumColors]); + } + } + break; + case 24: + for (y = 0; y < Height; y++) { + for (unsigned int x = 0; x < Width; x++) { + unsigned idx = 3*(y*Width + x); + Color c = {p[idx+2], p[idx+1], p[idx+0], 0xFF}; + data->SetPixel(x,y,c); + } + } + break; + } + + return data; +} + #include "plugindef.h" GEMRB_PLUGIN(0xD768B1, "BMP File Reader") -PLUGIN_IE_RESOURCE(BMPImporter, ".bmp", (ieWord)IE_BMP_CLASS_ID) +PLUGIN_IE_RESOURCE(BMPImporter, "bmp", (ieWord)IE_BMP_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.h b/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.h index 2470a3556..94028a491 100644 --- a/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/BMPImporter/BMPImporter.h @@ -44,6 +44,7 @@ public: bool Open(DataStream* stream); Sprite2D* GetSprite2D(); virtual Bitmap* GetBitmap(); + virtual Image* GetImage(); void GetPalette(int colors, Color* pal); int GetWidth() { return (int) Width; } diff --git a/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.cpp index 4d9609d04..5cdc488b2 100644 --- a/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.cpp @@ -34,31 +34,26 @@ #include "GUI/Slider.h" #include "GUI/TextArea.h" #include "GUI/TextEdit.h" +#include "GUI/Window.h" CHUImporter::CHUImporter() { str = NULL; - autoFree = false; } CHUImporter::~CHUImporter() { - if (autoFree) { - delete str; - } + delete str; } /** This function loads all available windows from the 'stream' parameter. */ -bool CHUImporter::Open(DataStream* stream, bool autoFree) +bool CHUImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (this->autoFree) { - delete str; - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "CHUIV1 ", 8 ) != 0) { @@ -106,8 +101,7 @@ Window* CHUImporter::GetWindow(unsigned int wid) ResourceHolder mos(MosFile); if (mos != NULL) { win->SetBackGround( mos->GetSprite2D(), true ); - } else - printMessage( "CHUImporter","Cannot Load BackGround, skipping\n",YELLOW ); + } } if (!core->IsAvailable( IE_BAM_CLASS_ID )) { printMessage( "CHUImporter","No BAM Importer Available, skipping controls\n",LIGHT_RED ); diff --git a/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.h b/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.h index 512bb7397..e8b577f3d 100644 --- a/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/CHUImporter/CHUImporter.h @@ -42,7 +42,7 @@ public: /** Returns the i-th window in the Previously Loaded Stream */ Window* GetWindow(unsigned int i); /** This function loads all available windows from the 'stream' parameter. */ - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); }; #endif diff --git a/project/jni/application/gemrb/gemrb/plugins/CMakeLists.txt b/project/jni/application/gemrb/gemrb/plugins/CMakeLists.txt index 6c48216d3..ce29b3a23 100644 --- a/project/jni/application/gemrb/gemrb/plugins/CMakeLists.txt +++ b/project/jni/application/gemrb/gemrb/plugins/CMakeLists.txt @@ -29,6 +29,7 @@ ADD_SUBDIRECTORY( PLTImporter ) ADD_SUBDIRECTORY( PNGImporter ) ADD_SUBDIRECTORY( PROImporter ) ADD_SUBDIRECTORY( PSTOpcodes ) +ADD_SUBDIRECTORY( SAVImporter ) ADD_SUBDIRECTORY( SDLAudio ) ADD_SUBDIRECTORY( SDLVideo ) ADD_SUBDIRECTORY( SPLImporter ) diff --git a/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.cpp index a28e3010b..d41b7b38b 100644 --- a/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.cpp @@ -26,6 +26,8 @@ #include "EffectMgr.h" #include "GameData.h" #include "Interface.h" +#include "PluginMgr.h" +#include "TableMgr.h" #include "GameScript/GameScript.h" #include @@ -170,7 +172,7 @@ int ResolveSpellName(ieResRef name, int level, ieIWD2SpellType type) } //input: index, level, type, kit -const ieResRef *ResolveSpellIndex(int index, int level, ieIWD2SpellType type, int kit) +static const ieResRef *ResolveSpellIndex(int index, int level, ieIWD2SpellType type, int kit) { const ieResRef *ret; @@ -231,7 +233,7 @@ const ieResRef *ResolveSpellIndex(int index, int level, ieIWD2SpellType type, in return NULL; } -void ReleaseMemoryCRE() +static void ReleaseMemoryCRE() { if (randcolors) { delete [] randcolors; @@ -338,7 +340,6 @@ static void InitSpellbook() CREImporter::CREImporter(void) { str = NULL; - autoFree = false; TotSCEFF = 0xff; CREVersion = 0xff; InitSpellbook(); @@ -346,21 +347,16 @@ CREImporter::CREImporter(void) CREImporter::~CREImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool CREImporter::Open(DataStream* stream, bool aF) +bool CREImporter::Open(DataStream* stream) { - if (str && this->autoFree) { - delete( str ); - } - str = stream; - autoFree = aF; if (stream == NULL) { return false; } + delete str; + str = stream; char Signature[8]; str->Read( Signature, 8 ); IsCharacter = false; @@ -394,8 +390,7 @@ bool CREImporter::Open(DataStream* stream, bool aF) return true; } - printMessage( "CREImporter"," ",LIGHT_RED); - printf("Not a CRE File or File Version not supported: %8.8s\n", Signature ); + printMessage("CREImporter", "Not a CRE File or File Version not supported: %8.8s\n", LIGHT_RED, Signature); return false; } @@ -794,9 +789,7 @@ Actor* CREImporter::GetActor(unsigned char is_in_party) break; default: Inventory_Size=0; - printMessage("CREImporter","Unknown creature signature: ", RED); - printf("%d\n", CREVersion); - abort(); + error("CREImporter", "Unknown creature signature: %d\n", CREVersion); } // Read saved effects @@ -1056,8 +1049,7 @@ void CREImporter::ReadInventory(Actor *act, unsigned int Inventory_Size) ieWord index = indices[i++]; if (index != 0xffff) { if (index>=ItemsCount) { - printMessage("CREImporter"," ",LIGHT_RED); - printf("Invalid item index (%d) in creature!\n", index); + printMessage("CREImporter", "Invalid item index (%d) in creature!\n", LIGHT_RED, index); continue; } //20 is the size of CREItem on disc (8+2+3x2+4) @@ -1068,8 +1060,7 @@ void CREImporter::ReadInventory(Actor *act, unsigned int Inventory_Size) if (item) { act->inventory.SetSlotItem(item, Slot); } else { - printMessage("CREImporter"," ",LIGHT_RED); - printf("Invalid item index (%d) in creature!\n", index); + printMessage("CREImporter", "Invalid item index (%d) in creature!\n", LIGHT_RED, index); } } } @@ -1114,15 +1105,15 @@ void CREImporter::ReadInventory(Actor *act, unsigned int Inventory_Size) memorized_spells[k] = NULL; continue; } - printf("[CREImporter]: Duplicate memorized spell (%d) in creature!\n", k); + print("[CREImporter]: Duplicate memorized spell (%d) in creature!\n", k); } } i=KnownSpellsCount; while(i--) { if (known_spells[i]) { - printMessage("CREImporter"," ", YELLOW); - printf("Dangling spell in creature: %s!\n", known_spells[i]->SpellResRef); + printMessage("CREImporter", "Dangling spell in creature: %s!\n", YELLOW, + known_spells[i]->SpellResRef); delete known_spells[i]; } } @@ -1131,8 +1122,8 @@ void CREImporter::ReadInventory(Actor *act, unsigned int Inventory_Size) i=MemorizedSpellsCount; while(i--) { if (memorized_spells[i]) { - printMessage("CREImporter"," ", YELLOW); - printf("Dangling spell in creature: %s!\n", memorized_spells[i]->SpellResRef); + printMessage("CREImporter", "Dangling spell in creature: %s!\n", YELLOW, + memorized_spells[i]->SpellResRef); delete memorized_spells[i]; } } @@ -1467,8 +1458,8 @@ void CREImporter::GetIWD2Spellpage(Actor *act, ieIWD2SpellType type, int level, sm->memorized_spells.push_back(memory); } } else { - printMessage("CREImporter","Unresolved spell index: ", LIGHT_RED); - printf("%d level:%d, type: %d\n", spellindex, level+1, type); + printMessage("CREImporter", "Unresolved spell index: %d level:%d, type: %d\n", LIGHT_RED, + spellindex, level+1, type); } } str->ReadDword(&tmpDword); @@ -2691,7 +2682,7 @@ int CREImporter::PutSpellPages( DataStream *stream, Actor *actor) tmpWord = i; stream->WriteWord( &tmpWord); stream->WriteDword( &SpellIndex); - tmpDword = actor->spellbook.GetMemorizedSpellsCount(i,j); + tmpDword = actor->spellbook.GetMemorizedSpellsCount(i,j, false); stream->WriteDword( &tmpDword); SpellIndex += tmpDword; } @@ -2705,7 +2696,7 @@ int CREImporter::PutMemorizedSpells(DataStream *stream, Actor *actor) for (int i=0;ispellbook.GetSpellLevelCount(i); for (unsigned int j=0;jspellbook.GetMemorizedSpellsCount(i,j); + unsigned int count = actor->spellbook.GetMemorizedSpellsCount(i,j, false); for (unsigned int k=0;kspellbook.GetMemorizedSpell(i,j,k); diff --git a/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.h b/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.h index a0417e15b..1ac0086de 100644 --- a/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/CREImporter/CREImporter.h @@ -22,6 +22,10 @@ #define CREIMPORTER_H #include "ActorMgr.h" +#include "Spellbook.h" + +class CREItem; +struct Effect; #define IE_CRE_GEMRB 0 #define IE_CRE_V1_0 10 //bg1 @@ -33,7 +37,6 @@ class CREImporter : public ActorMgr { private: DataStream* str; - bool autoFree; unsigned char CREVersion; ieDword KnownSpellsOffset; ieDword KnownSpellsCount; @@ -61,7 +64,7 @@ private: public: CREImporter(void); ~CREImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Actor* GetActor(unsigned char is_in_party); //returns saved size, updates internal offsets before save diff --git a/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.cpp index 576831bfb..55a3a0023 100644 --- a/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.cpp @@ -29,27 +29,21 @@ DLGImporter::DLGImporter(void) { str = NULL; - autoFree = false; Version = 0; } DLGImporter::~DLGImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool DLGImporter::Open(DataStream* stream, bool autoFree) +bool DLGImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strnicmp( Signature, "DLG V1.0", 8 ) != 0) { @@ -166,7 +160,7 @@ DialogTransition* DLGImporter::GetTransition(unsigned int index) const static char** GetStrings(char* string, unsigned int& count); -Condition* GetCondition(char* string) +static Condition* GetCondition(char* string) { unsigned int count; char **lines = GetStrings( string, count ); @@ -175,13 +169,13 @@ Condition* GetCondition(char* string) Trigger *trigger = GenerateTrigger(lines[i]); if (!trigger) { printMessage( "DLGImporter", "Can't compile trigger: " ,YELLOW); - printf("%s\n", lines[i]); + print("%s\n", lines[i]); } else { condition->triggers.push_back(trigger); } - free(lines[i]); + free( lines[i] ); } - free(lines); + free( lines ); return condition; } @@ -206,7 +200,7 @@ Condition* DLGImporter::GetStateTrigger(unsigned int index) const str->Read( string, Length ); string[Length] = 0; Condition *condition = GetCondition(string); - free(string); + free( string ); return condition; } @@ -248,17 +242,19 @@ std::vector DLGImporter::GetAction(unsigned int index) const Action *action = GenerateAction(lines[i]); if (!action) { printMessage( "DLGImporter", "Can't compile action: " ,YELLOW); - printf("%s\n", lines[i]); + print("%s\n", lines[i]); } else { action->IncRef(); actions.push_back(action); } - free(lines[i]); + free( lines[i] ); } + free( lines ); + free( string ); return actions; } -int GetActionLength(const char* string) +static int GetActionLength(const char* string) { int i; int level = 0; @@ -303,7 +299,7 @@ int GetActionLength(const char* string) pst's FORGE.DLG (trigger split across two lines), bg2's SAHIMP02.DLG (missing quotemark in string), bg2's QUAYLE.DLG (missing closing bracket) */ -char** GetStrings(char* string, unsigned int& count) +static char** GetStrings(char* string, unsigned int& count) { int col = 0; int level = 0; diff --git a/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.h b/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.h index 10cade568..8a0b7fc25 100644 --- a/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/DLGImporter/DLGImporter.h @@ -53,7 +53,6 @@ struct VarOffset { class DLGImporter : public DialogMgr { private: DataStream* str; - bool autoFree; ieDword StatesCount; ieDword StatesOffset; ieDword TransitionsCount; @@ -70,7 +69,7 @@ private: public: DLGImporter(void); ~DLGImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Dialog* GetDialog() const; private: DialogState* GetDialogState(Dialog *d, unsigned int index) const; diff --git a/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.cpp index 9a4ba399c..d2a448289 100644 --- a/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.cpp @@ -37,6 +37,9 @@ DirectoryImporter::~DirectoryImporter(void) bool DirectoryImporter::Open(const char *dir, const char *desc) { + if (!dir_exists(dir)) + return false; + free(description); description = strdup(desc); strcpy(path, dir); @@ -47,29 +50,21 @@ static bool FindIn(const char *Path, const char *ResRef, const char *Type) { char p[_MAX_PATH], f[_MAX_PATH] = {0}; strcpy(f, ResRef); - strcat(f, Type); strlwr(f); - return PathJoin(p, Path, f, NULL); + return PathJoinExt(p, Path, f, Type); } static FileStream *SearchIn(const char * Path,const char * ResRef, const char *Type) { char p[_MAX_PATH], f[_MAX_PATH] = {0}; strcpy(f, ResRef); - strcat(f, Type); strlwr(f); - if (!PathJoin(p, Path, f, NULL)) + if (!PathJoinExt(p, Path, f, Type)) return NULL; - FileStream * fs = new FileStream(); - if(!fs) return NULL; - if(!fs->Open(p, true)) { - delete fs; - return NULL; - } - return fs; + return FileStream::OpenFile(p); } bool DirectoryImporter::HasResource(const char* resname, SClass_ID type) @@ -92,8 +87,93 @@ DataStream* DirectoryImporter::GetResource(const char* resname, const ResourceDe return SearchIn( path, resname, type.GetExt() ); } +CachedDirectoryImporter::CachedDirectoryImporter() +{ +} + +CachedDirectoryImporter::~CachedDirectoryImporter() +{ +} + +bool CachedDirectoryImporter::Open(const char *dir, const char *desc) +{ + if (!DirectoryImporter::Open(dir, desc)) + return false; + + Refresh(); + + return true; +} + +void CachedDirectoryImporter::Refresh() +{ + cache.clear(); + + DirectoryIterator it(path); + if (!it) + return; + + char buf[_MAX_PATH]; + do { + if (it.IsDirectory()) + continue; + const char *name = it.GetName(); + strnlwrcpy(buf, name, _MAX_PATH, false); + if (cache.find(buf) != cache.end()) { + printMessage("CachedDirectoryImporter", "Duplicate '%s' files in '%s' directory", LIGHT_RED, buf, path); + } + cache[buf] = name; + } while (++it); +} + +static const char *ConstructFilename(const char* resname, const char* ext) +{ + static char buf[_MAX_PATH]; + strnlwrcpy(buf, resname, _MAX_PATH-4, false); + strcat(buf, "."); + strcat(buf, ext); + return buf; +} + +bool CachedDirectoryImporter::HasResource(const char* resname, SClass_ID type) +{ + const char* filename = ConstructFilename(resname, core->TypeExt(type)); + return (cache.find(filename) != cache.end()); +} + +bool CachedDirectoryImporter::HasResource(const char* resname, const ResourceDesc &type) +{ + const char* filename = ConstructFilename(resname, type.GetExt()); + return (cache.find(filename) != cache.end()); +} + +DataStream* CachedDirectoryImporter::GetResource(const char* resname, SClass_ID type) +{ + const char* filename = ConstructFilename(resname, core->TypeExt(type)); + std::map::const_iterator it = cache.find(filename); + if (it == cache.end()) + return NULL; + char buf[_MAX_PATH]; + strcpy(buf, path); + PathAppend(buf, it->second.c_str()); + return FileStream::OpenFile(buf); +} + +DataStream* CachedDirectoryImporter::GetResource(const char* resname, const ResourceDesc &type) +{ + const char* filename = ConstructFilename(resname, type.GetExt()); + std::map::const_iterator it = cache.find(filename); + if (it == cache.end()) + return NULL; + char buf[_MAX_PATH]; + strcpy(buf, path); + PathAppend(buf, it->second.c_str()); + return FileStream::OpenFile(buf); +} + #include "plugindef.h" GEMRB_PLUGIN(0xAB4534, "Directory Importer") PLUGIN_CLASS(PLUGIN_RESOURCE_DIRECTORY, DirectoryImporter) +PLUGIN_CLASS(PLUGIN_RESOURCE_CACHEDDIRECTORY, CachedDirectoryImporter) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.h b/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.h index 46a0c8475..fde1e4d9b 100644 --- a/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/DirectoryImporter/DirectoryImporter.h @@ -29,8 +29,9 @@ class Resource; class ResourceDesc; class DirectoryImporter : public ResourceSource { -private: +protected: char path[_MAX_PATH]; + public: DirectoryImporter(void); ~DirectoryImporter(void); @@ -43,4 +44,23 @@ public: DataStream* GetResource(const char* resname, const ResourceDesc &type); }; +class CachedDirectoryImporter : public DirectoryImporter { +protected: + std::map cache; + +public: + CachedDirectoryImporter(); + ~CachedDirectoryImporter(); + + bool Open(const char *dir, const char *desc); + void Refresh(); + /** predicts the availability of a resource */ + bool HasResource(const char* resname, SClass_ID type); + bool HasResource(const char* resname, const ResourceDesc &type); + /** returns resource */ + DataStream* GetResource(const char* resname, SClass_ID type); + DataStream* GetResource(const char* resname, const ResourceDesc &type); +}; + + #endif diff --git a/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.cpp index 5da8be8a6..5fa273749 100644 --- a/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.cpp @@ -63,7 +63,7 @@ bool EFFImporter::Open(DataStream* stream, bool autoFree) //if level>than maximum affected or levelDiceSides > 0 || fx->DiceThrown > 0) { fx->MinAffectedLevel = fx->DiceThrown; fx->MaxAffectedLevel = fx->DiceSides; @@ -197,23 +197,25 @@ void EFFImporter::PutEffectV2(DataStream *stream, const Effect *fx) { stream->WriteDword( &fx->Duration); stream->WriteWord( &fx->Probability1); stream->WriteWord( &fx->Probability2); - stream->WriteResRef(fx->Resource); + if (fx->IsVariable) { + stream->Write( filling,8 ); + } else { + stream->WriteResRef(fx->Resource); + } stream->WriteDword( &fx->DiceThrown ); stream->WriteDword( &fx->DiceSides ); stream->WriteDword( &fx->SavingThrowType ); stream->WriteDword( &fx->SavingThrowBonus ); - //isvariable - stream->Write( filling,4 ); + stream->WriteWord( &fx->IsVariable ); + stream->Write( filling,2 ); // SaveForHalfDamage stream->WriteDword( &fx->PrimaryType ); - stream->Write( filling,12 ); + stream->Write( filling,12 ); // MinAffectedLevel, MaxAffectedLevel, Resistance stream->WriteDword( &fx->Resistance ); stream->WriteDword( &fx->Parameter3 ); stream->WriteDword( &fx->Parameter4 ); stream->Write( filling,8 ); if (fx->IsVariable) { - stream->Write(fx->Resource+8, 8); - //resource1-4 are used as a continuous memory - stream->Write(((ieByte *) fx->Resource)+16, 8); + stream->Write( filling,16 ); } else { stream->WriteResRef(fx->Resource2); stream->WriteResRef(fx->Resource3); @@ -231,7 +233,14 @@ void EFFImporter::PutEffectV2(DataStream *stream, const Effect *fx) { stream->WriteDword( &fx->Projectile ); tmpDword1 = (ieDword) fx->InventorySlot; stream->WriteDword( &tmpDword1 ); - stream->Write( filling,40 ); //12+32+8 + if (fx->IsVariable) { + //resource1-4 are used as a continuous memory + stream->Write(fx->Resource, 32); + } else { + stream->Write( filling,32 ); + } + stream->WriteDword( &fx->CasterLevel); + stream->Write( filling,4); stream->WriteDword( &fx->SecondaryType ); stream->Write( filling,60 ); } diff --git a/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.h b/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.h index b97825761..ef5b5e44f 100644 --- a/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/EFFImporter/EFFImporter.h @@ -36,6 +36,8 @@ private: public: EFFImporter(void); ~EFFImporter(void); + // We need this autoFree, since Effects are included inline + // in other file types, without a size header. bool Open(DataStream* stream, bool autoFree = true); Effect* GetEffect(Effect *fx); Effect* GetEffectV1(Effect *fx); diff --git a/project/jni/application/gemrb/gemrb/plugins/FXOpcodes/FXOpcodes.cpp b/project/jni/application/gemrb/gemrb/plugins/FXOpcodes/FXOpcodes.cpp index ee921da60..256eecf76 100644 --- a/project/jni/application/gemrb/gemrb/plugins/FXOpcodes/FXOpcodes.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/FXOpcodes/FXOpcodes.cpp @@ -29,9 +29,11 @@ #include "EffectQueue.h" #include "Game.h" #include "GameData.h" +#include "GlobalTimer.h" #include "Interface.h" #include "PolymorphCache.h" // fx_polymorph #include "Projectile.h" //needs for clearair +#include "ScriptedAnimation.h" #include "Spell.h" //needed for fx_cast_spell feedback #include "TileMap.h" //needs for knock! #include "damages.h" @@ -65,6 +67,7 @@ #define PI_BOUNCE 65 #define PI_BOUNCE2 67 +#define PI_CONTINGENCY 75 #define PI_BLOODRAGE 76 //iwd2 #define PI_MAZE 78 #define PI_PRISON 79 @@ -435,7 +438,7 @@ static EffectDesc effectnames[] = { { "AlwaysBackstab", fx_always_backstab_modifier, 0, -1 }, { "AnimationIDModifier", fx_animation_id_modifier, 0, -1 }, { "AnimationStateChange", fx_animation_stance, 0, -1 }, - { "ApplyEffect", fx_apply_effect, 0, -1 }, + { "ApplyEffect", fx_apply_effect, EFFECT_NO_ACTOR, -1 }, { "ApplyEffectCurse", fx_apply_effect_curse, 0, -1 }, { "ApplyEffectItem", fx_apply_effect_item, 0, -1 }, { "ApplyEffectItemType", fx_apply_effect_item_type, 0, -1 }, @@ -884,7 +887,7 @@ inline void HandlePercentageDamage(Effect *fx, Actor *target) { // 0x00 ACVsDamageTypeModifier int fx_ac_vs_damage_type_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_ac_vs_damage_type_modifier (%2d): AC Modif: %d ; Type: %d ; MinLevel: %d ; MaxLevel: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2, (int) fx->DiceSides, (int) fx->DiceThrown ); + if (0) print( "fx_ac_vs_damage_type_modifier (%2d): AC Modif: %d ; Type: %d ; MinLevel: %d ; MaxLevel: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2, (int) fx->DiceSides, (int) fx->DiceThrown ); //check level was pulled outside as a common functionality //CHECK_LEVEL(); @@ -930,7 +933,7 @@ int fx_ac_vs_damage_type_modifier (Scriptable* /*Owner*/, Actor* target, Effect* // 0x01 AttacksPerRoundModifier int fx_attacks_per_round_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_attacks_per_round_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_attacks_per_round_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int tmp = (signed) fx->Parameter1; if (fx->Parameter2!=2) { if (tmp>10) tmp=10; @@ -957,7 +960,7 @@ static EffectRef fx_display_portrait_icon_ref = { "Icon:Display", -1 }; int fx_cure_sleep_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_sleep_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_sleep_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_SLEEP ); target->fxqueue.RemoveAllEffects(fx_set_sleep_state_ref); target->fxqueue.RemoveAllEffectsWithParam(fx_display_portrait_icon_ref, PI_SLEEP); @@ -968,7 +971,7 @@ int fx_cure_sleep_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // this effect sets the STATE_BERSERK bit, but bg2 actually ignores the bit int fx_set_berserk_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_berserk_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_berserk_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); // atleast how and bg2 allow this to only work on pcs if (!core->HasFeature(GF_3ED_RULES) && !target->InParty) { return FX_NOT_APPLIED; @@ -1018,7 +1021,7 @@ static EffectRef fx_set_berserk_state_ref = { "State:Berserk", -1 }; int fx_cure_berserk_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_berserk_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_berserk_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_BERSERK ); target->fxqueue.RemoveAllEffects(fx_set_berserk_state_ref); return FX_NOT_APPLIED; @@ -1028,7 +1031,7 @@ int fx_cure_berserk_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xf1 ControlCreature (iwd2) int fx_set_charmed_state (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_set_charmed_state (%2d): General: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_charmed_state (%2d): General: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //blood rage berserking gives immunity to charm (in iwd2) if (target->HasSpellState(SS_BLOODRAGE)) { @@ -1127,7 +1130,7 @@ int fx_set_charmed_state (Scriptable* Owner, Actor* target, Effect* fx) // 0x06 CharismaModifier int fx_charisma_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_charisma_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_charisma_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { BASE_MOD( IE_CHR ); @@ -1141,7 +1144,7 @@ int fx_charisma_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // this effect might not work in pst, they don't have separate weapon slots int fx_set_color_gradient (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_color_gradient (%2d): Gradient: %d, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_color_gradient (%2d): Gradient: %d, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); EffectQueue::HackColorEffects(target, fx); target->SetColor( fx->Parameter2, fx->Parameter1 ); return FX_APPLIED; @@ -1150,7 +1153,7 @@ int fx_set_color_gradient (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 08 Color:SetRGB int fx_set_color_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_color_rgb (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_color_rgb (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); EffectQueue::HackColorEffects(target, fx); ieDword location = fx->Parameter2 & 0xff; target->SetColorMod(location, RGBModifier::ADD, -1, fx->Parameter1 >> 8, @@ -1161,7 +1164,7 @@ int fx_set_color_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 08 Color:SetRGBGlobal int fx_set_color_rgb_global (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_color_rgb_global (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_color_rgb_global (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->SetColorMod(0xff, RGBModifier::ADD, -1, fx->Parameter1 >> 8, fx->Parameter1 >> 16, fx->Parameter1 >> 24); @@ -1172,7 +1175,7 @@ int fx_set_color_rgb_global (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 09 Color:PulseRGB int fx_set_color_pulse_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_color_pulse_rgb (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_color_pulse_rgb (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); EffectQueue::HackColorEffects(target, fx); ieDword location = fx->Parameter2 & 0xff; int speed = (fx->Parameter2 >> 16) & 0xFF; @@ -1186,7 +1189,7 @@ int fx_set_color_pulse_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 09 Color:PulseRGBGlobal (pst variant) int fx_set_color_pulse_rgb_global (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_color_pulse_rgb_global (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_color_pulse_rgb_global (%2d): RGB: %x, Location: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int speed = (fx->Parameter2 >> 16) & 0xFF; target->SetColorMod(0xff, RGBModifier::ADD, speed, @@ -1199,7 +1202,7 @@ int fx_set_color_pulse_rgb_global (Scriptable* /*Owner*/, Actor* target, Effect* // 0x0A ConstitutionModifier int fx_constitution_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_constitution_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_constitution_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { BASE_MOD( IE_CON ); @@ -1214,7 +1217,7 @@ static EffectRef fx_poisoned_state_ref = { "State:Poisoned", -1 }; int fx_cure_poisoned_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_poisoned_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_poisoned_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //all three steps are present in bg2 and iwd2 BASE_STATE_CURE( STATE_POISONED ); target->fxqueue.RemoveAllEffects( fx_poisoned_state_ref ); @@ -1226,7 +1229,7 @@ int fx_cure_poisoned_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // this is a very important effect int fx_damage (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damage (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_damage (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //save for half damage type ieDword damagetype = fx->Parameter2>>16; ieDword modtype = fx->Parameter2&3; @@ -1243,7 +1246,7 @@ int fx_damage (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x0d Death int fx_death (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_death (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_death (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword damagetype = 0; switch (fx->Parameter2) { case 1: @@ -1296,7 +1299,7 @@ int fx_death (Scriptable* Owner, Actor* target, Effect* fx) // 0xE Cure:Defrost int fx_cure_frozen_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_frozen_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_frozen_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_FROZEN ); return FX_NOT_APPLIED; } @@ -1335,7 +1338,7 @@ int SpellAbilityDieRoll(Actor *target, int which) int fx_dexterity_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_dexterity_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dexterity_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ////how cat's grace: value is based on class if (fx->Parameter2==3) { @@ -1356,7 +1359,7 @@ static EffectRef fx_set_slow_state_ref = { "State:Slowed", -1 }; // this function removes slowed state, or sets hasted state int fx_set_hasted_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_hasted_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_set_hasted_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->fxqueue.RemoveAllEffects(fx_set_slow_state_ref); target->fxqueue.RemoveAllEffectsWithParam( fx_display_portrait_icon_ref, PI_SLOWED ); if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { @@ -1397,7 +1400,7 @@ int fx_set_hasted_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11 CurrentHPModifier int fx_current_hp_modifier (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_current_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_current_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter2&0x10000) { Point p(fx->PosX, fx->PosY); @@ -1429,7 +1432,7 @@ int fx_current_hp_modifier (Scriptable* Owner, Actor* target, Effect* fx) // 1,4 and 2,5 are analogous to them, but with different modifiers int fx_maximum_hp_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_maximum_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_maximum_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //state_exploding is different in PST, probably not needed anyway if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN|STATE_ACID|STATE_FLAME) ) { @@ -1496,7 +1499,7 @@ int fx_maximum_hp_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x13 IntelligenceModifier int fx_intelligence_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_intelligence_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_intelligence_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { BASE_MOD( IE_INT ); @@ -1549,7 +1552,7 @@ int fx_set_invisible_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x15 LoreModifier int fx_lore_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_lore_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_lore_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_LORE ); return FX_APPLIED; @@ -1558,7 +1561,7 @@ int fx_lore_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x16 LuckModifier int fx_luck_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_luck_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_luck_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_LUCK ); STAT_MOD( IE_DAMAGELUCK ); @@ -1568,7 +1571,7 @@ int fx_luck_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x17 MoraleModifier int fx_morale_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_morale_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_morale_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //FIXME: in bg2 this is hacked to set param1=10, param2=1, we might need some flag for this STAT_MOD( IE_MORALE ); @@ -1578,7 +1581,7 @@ int fx_morale_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x18 State:Panic int fx_set_panic_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_panic_state (%2d)\n", fx->Opcode ); + if (0) print( "fx_set_panic_state (%2d)\n", fx->Opcode ); if (target->HasSpellState(SS_BLOODRAGE)) { return FX_NOT_APPLIED; @@ -1598,7 +1601,13 @@ int fx_set_panic_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x19 State:Poisoned int fx_set_poisoned_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_poisoned_state (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_poisoned_state (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + + int count = target->fxqueue.CountEffects(fx_poisoned_state_ref, fx->Parameter1, fx->Parameter2, fx->Resource); + if (count > 1) { + return FX_APPLIED; + } + STATE_SET( STATE_POISONED ); ieDword damage; @@ -1649,7 +1658,7 @@ static EffectRef fx_pst_jumble_curse_ref = { "JumbleCurse", -1 }; // gemrb extension: if the resource field is filled, it will remove curse only from the specified item int fx_remove_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_curse (%2d): Resource: %s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_remove_curse (%2d): Resource: %s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); switch(fx->Parameter2) { @@ -1691,7 +1700,7 @@ int fx_remove_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x1b AcidResistanceModifier int fx_acid_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_acid_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_acid_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTACID ); return FX_APPLIED; @@ -1700,7 +1709,7 @@ int fx_acid_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x1c ColdResistanceModifier int fx_cold_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cold_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cold_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTCOLD ); return FX_APPLIED; @@ -1709,7 +1718,7 @@ int fx_cold_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x1d ElectricityResistanceModifier int fx_electricity_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_electricity_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_electricity_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTELECTRICITY ); return FX_APPLIED; @@ -1718,7 +1727,7 @@ int fx_electricity_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Ef // 0x1e FireResistanceModifier int fx_fire_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fire_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_fire_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTFIRE ); return FX_APPLIED; @@ -1727,7 +1736,7 @@ int fx_fire_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x1f MagicDamageResistanceModifier int fx_magic_damage_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_magic_damage_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_magic_damage_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MAGICDAMAGERESISTANCE ); return FX_APPLIED; @@ -1736,7 +1745,7 @@ int fx_magic_damage_resistance_modifier (Scriptable* /*Owner*/, Actor* target, E // 0x20 Cure:Death int fx_cure_dead_state (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_dead_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_dead_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //call this only if the target is dead, otherwise some variables can get wrong if (STATE_GET(STATE_DEAD) ) { Point p(fx->PosX, fx->PosY); @@ -1748,7 +1757,7 @@ int fx_cure_dead_state (Scriptable* Owner, Actor* target, Effect* fx) // 0x21 SaveVsDeathModifier int fx_save_vs_death_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_vs_death_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_vs_death_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_SAVEVSDEATH, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -1757,7 +1766,7 @@ int fx_save_vs_death_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x22 SaveVsWandsModifier int fx_save_vs_wands_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_vs_wands_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_vs_wands_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_SAVEVSWANDS, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -1766,7 +1775,7 @@ int fx_save_vs_wands_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x23 SaveVsPolyModifier int fx_save_vs_poly_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_vs_poly_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_vs_poly_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_SAVEVSPOLY, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -1775,7 +1784,7 @@ int fx_save_vs_poly_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x24 SaveVsBreathModifier int fx_save_vs_breath_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_vs_breath_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_vs_breath_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_SAVEVSBREATH, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -1784,7 +1793,7 @@ int fx_save_vs_breath_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x25 SaveVsSpellsModifier int fx_save_vs_spell_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_vs_spell_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_vs_spell_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_SAVEVSSPELL, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -1793,7 +1802,7 @@ int fx_save_vs_spell_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x26 State:Silenced int fx_set_silenced_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_silenced_state (%2d)\n", fx->Opcode ); + if (0) print( "fx_set_silenced_state (%2d)\n", fx->Opcode ); STATE_SET( STATE_SILENCED ); return FX_APPLIED; } @@ -1805,7 +1814,7 @@ static EffectRef fx_animation_stance_ref = { "AnimationStateChange", -1 }; // FIXME: this is probably a persistent effect int fx_set_unconscious_state (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_set_unconscious_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_set_unconscious_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (target->HasSpellState(SS_BLOODRAGE)) { return FX_NOT_APPLIED; @@ -1838,7 +1847,7 @@ static EffectRef fx_set_haste_state_ref = { "State:Hasted", -1 }; int fx_set_slowed_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_slowed_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_slowed_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //iwd2 free action or aegis disables this effect if (target->HasSpellState(SS_FREEACTION)) return FX_NOT_APPLIED; @@ -1861,7 +1870,7 @@ int fx_set_slowed_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x29 Sparkle int fx_sparkle (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_sparkle (%2d): Sparkle colour: %d ; Sparkle type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_sparkle (%2d): Sparkle colour: %d ; Sparkle type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!target) { return FX_NOT_APPLIED; } @@ -1879,7 +1888,7 @@ int fx_sparkle (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x2A WizardSpellSlotsModifier int fx_bonus_wizard_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bonus_wizard_spells (%2d): Spell Add: %d ; Spell Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_bonus_wizard_spells (%2d): Spell Add: %d ; Spell Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int i=1; //if param2 is 0, then double spells up to param1 @@ -1910,7 +1919,7 @@ int fx_bonus_wizard_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x2B Cure:Petrification int fx_cure_petrified_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_petrified_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_petrified_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_PETRIFIED ); return FX_NOT_APPLIED; } @@ -1918,7 +1927,7 @@ int fx_cure_petrified_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x2C StrengthModifier int fx_strength_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_strength_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_strength_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ////how strength: value is based on class ////pst power of one also depends on this! @@ -1955,7 +1964,7 @@ int power_word_stun_iwd2(Actor *target, Effect *fx) int fx_set_stun_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_stun_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_stun_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //actually the original engine just skips this effect if the target is dead if ( STATE_GET(STATE_DEAD) ) { @@ -1987,7 +1996,7 @@ static EffectRef fx_hold_creature_no_icon_ref = { "State:HoldNoIcon", -1 }; int fx_cure_stun_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_stun_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_stun_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_STUNNED ); target->fxqueue.RemoveAllEffects(fx_set_stun_state_ref); target->fxqueue.RemoveAllEffects(fx_hold_creature_no_icon_ref); @@ -2002,7 +2011,7 @@ static EffectRef fx_set_invisible_state_ref = { "State:Invisible", -1 }; int fx_cure_invisible_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_invisible_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_invisible_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!STATE_GET(STATE_NONDET)) { if (pstflags) { BASE_STATE_CURE( STATE_PST_INVIS ); @@ -2019,7 +2028,7 @@ static EffectRef fx_set_silenced_state_ref = { "State:Silenced", -1 }; int fx_cure_silenced_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_silenced_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_silenced_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_SILENCED ); target->fxqueue.RemoveAllEffects(fx_set_silenced_state_ref); return FX_NOT_APPLIED; @@ -2028,7 +2037,7 @@ int fx_cure_silenced_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x31 WisdomModifier int fx_wisdom_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_wisdom_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_wisdom_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { BASE_MOD( IE_WIS ); @@ -2041,7 +2050,7 @@ int fx_wisdom_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x32 Color:BriefRGB int fx_brief_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_brief_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_brief_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int speed = (fx->Parameter2 >> 16) & 0xff; target->SetColorMod(0xff, RGBModifier::ADD, speed, @@ -2054,7 +2063,7 @@ int fx_brief_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x33 Color:DarkenRGB int fx_darken_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_darken_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_darken_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); EffectQueue::HackColorEffects(target, fx); ieDword location = fx->Parameter2 & 0xff; target->SetColorMod(location, RGBModifier::TINT, -1, fx->Parameter1 >> 8, @@ -2065,7 +2074,7 @@ int fx_darken_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x34 Color:GlowRGB int fx_glow_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_glow_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_glow_rgb (%2d): RGB: %d, Location and speed: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); EffectQueue::HackColorEffects(target, fx); ieDword location = fx->Parameter2 & 0xff; target->SetColorMod(location, RGBModifier::BRIGHTEN, -1, @@ -2080,7 +2089,7 @@ static EffectRef fx_animation_id_modifier_ref = { "AnimationIDModifier", -1 }; int fx_animation_id_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_animation_id_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_animation_id_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: //non permanent animation change @@ -2100,7 +2109,7 @@ int fx_animation_id_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x36 ToHitModifier int fx_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_TOHIT, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; @@ -2111,7 +2120,7 @@ static EffectRef fx_death_ref = { "Death", -1 }; int fx_kill_creature_type (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_kill_creature_type (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_kill_creature_type (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (EffectQueue::match_ids( target, fx->Parameter2, fx->Parameter1) ) { //convert it to a death opcode or apply the new effect? fx->Opcode = EffectQueue::ResolveEffect(fx_death_ref); @@ -2137,7 +2146,7 @@ static int al_switch_law[16]={0,0x31,0x32,0x33,0,0x21,0x22,0x23,0,0x11,0x12,0x13 static int al_switch_good[16]={0,0x13,0x12,0x11,0,0x23,0x22,0x21,0,0x33,0x32,0x31}; int fx_alignment_invert (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_alignment_invert (%2d)\n", fx->Opcode ); + if (0) print( "fx_alignment_invert (%2d)\n", fx->Opcode ); register ieDword newalign = target->GetStat( IE_ALIGNMENT ); //compress the values. GNE is the first 2 bits originally //LNC is the 4/5. bits. @@ -2160,7 +2169,7 @@ int fx_alignment_invert (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x39 Alignment:Change int fx_alignment_change (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_alignment_change (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_alignment_change (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_ALIGNMENT, fx->Parameter2 ); return FX_APPLIED; } @@ -2168,7 +2177,7 @@ int fx_alignment_change (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x3a DispelEffects int fx_dispel_effects (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_dispel_effects (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dispel_effects (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieResRef Removed; ieDword level; @@ -2196,7 +2205,7 @@ int fx_dispel_effects (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x3B StealthModifier int fx_stealth_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_stealth_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_stealth_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_STEALTH ); return FX_APPLIED; @@ -2205,7 +2214,7 @@ int fx_stealth_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x3C MiscastMagicModifier int fx_miscast_magic_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_miscast_magic_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_miscast_magic_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 3: @@ -2234,7 +2243,7 @@ int fx_miscast_magic_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // and in iwd it doesn't really follow the stat_mod convention (quite lame) int fx_alchemy_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_alchemy_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_alchemy_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch(fx->Parameter2) { case 0: @@ -2253,7 +2262,7 @@ int fx_alchemy_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x3E PriestSpellSlotsModifier int fx_bonus_priest_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bonus_priest_spells (%2d): Spell Add: %d ; Spell Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_bonus_priest_spells (%2d): Spell Add: %d ; Spell Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int i=1; //if param2 is 0, then double spells up to param1 @@ -2284,7 +2293,7 @@ int fx_bonus_priest_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x3F State:Infravision int fx_set_infravision_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_infravision_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_infravision_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STATE_SET( STATE_INFRA ); return FX_APPLIED; } @@ -2294,7 +2303,7 @@ static EffectRef fx_set_infravision_state_ref = { "State:Infravision", -1 }; int fx_cure_infravision_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_infravision_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_infravision_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_INFRA ); target->fxqueue.RemoveAllEffects(fx_set_infravision_state_ref); return FX_NOT_APPLIED; @@ -2303,7 +2312,7 @@ int fx_cure_infravision_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x41 State:Blur int fx_set_blur_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_blur_state (%2d)\n", fx->Opcode ); + if (0) print( "fx_set_blur_state (%2d)\n", fx->Opcode ); //death stops this effect if (STATE_GET( STATE_DEAD) ) { return FX_NOT_APPLIED; @@ -2323,7 +2332,7 @@ int fx_set_blur_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x42 TransparencyModifier int fx_transparency_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_transparency_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_transparency_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //maybe this needs some timing switch (fx->Parameter2) { @@ -2352,7 +2361,7 @@ static int eamods[]={EAM_ALLY,EAM_ALLY,EAM_DEFAULT,EAM_ALLY,EAM_DEFAULT,EAM_ENEM int fx_summon_creature (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_creature (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_summon_creature (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); //summon creature (resource), play vvc (resource2) //creature's lastsummoner is Owner @@ -2375,7 +2384,7 @@ int fx_summon_creature (Scriptable* Owner, Actor* target, Effect* fx) // 0x44 UnsummonCreature int fx_unsummon_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_unsummon_creature (%2d)\n", fx->Opcode ); + if (0) print( "fx_unsummon_creature (%2d)\n", fx->Opcode ); //to be compatible with the original engine, unsummon doesn't work with PC's //but it works on anything else @@ -2396,7 +2405,7 @@ int fx_unsummon_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x45 State:Nondetection int fx_set_nondetection_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_nondetection_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_nondetection_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STATE_SET( STATE_NONDET ); return FX_APPLIED; } @@ -2406,7 +2415,7 @@ static EffectRef fx_set_nondetection_state_ref = { "State:Nondetection", -1 }; int fx_cure_nondetection_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_nondetection_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_nondetection_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_NONDET ); target->fxqueue.RemoveAllEffects(fx_set_nondetection_state_ref); return FX_NOT_APPLIED; @@ -2415,7 +2424,7 @@ int fx_cure_nondetection_state (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x47 SexModifier int fx_sex_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_sex_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_sex_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword value; if (fx->Parameter2) { value = fx->Parameter1; @@ -2438,7 +2447,7 @@ int fx_sex_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x48 AIIdentifierModifier int fx_ids_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_ids_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_ids_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: STAT_SET(IE_EA, fx->Parameter1); @@ -2471,7 +2480,7 @@ int fx_ids_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x49 DamageBonusModifier int fx_damage_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damage_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_damage_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_DAMAGEBONUS ); return FX_APPLIED; @@ -2480,7 +2489,7 @@ int fx_damage_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x4a State:Blind int fx_set_blind_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_blind_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_blind_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //pst power word blind projectile support if (fx->Parameter2==1) { @@ -2513,7 +2522,7 @@ static EffectRef fx_set_blind_state_ref = { "State:Blind", -1 }; int fx_cure_blind_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_blind_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_blind_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_BLIND ); target->fxqueue.RemoveAllEffects(fx_set_blind_state_ref); return FX_NOT_APPLIED; @@ -2522,7 +2531,7 @@ int fx_cure_blind_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x4c State:Feeblemind int fx_set_feebleminded_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_feebleminded_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_feebleminded_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STATE_SET( STATE_FEEBLE ); STAT_SET( IE_INT, 3); if (enhanced_effects) { @@ -2536,7 +2545,7 @@ static EffectRef fx_set_feebleminded_state_ref = { "State:Feeblemind", -1 }; int fx_cure_feebleminded_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_feebleminded_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_feebleminded_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_FEEBLE ); target->fxqueue.RemoveAllEffects(fx_set_feebleminded_state_ref); target->fxqueue.RemoveAllEffectsWithParam(fx_display_portrait_icon_ref, PI_FEEBLEMIND); @@ -2544,13 +2553,19 @@ int fx_cure_feebleminded_state (Scriptable* /*Owner*/, Actor* target, Effect* fx } // 0x4e State:Diseased +static EffectRef fx_diseased_state_ref = { "State:Diseased", -1 }; int fx_set_diseased_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_diseased_state (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_diseased_state (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { return FX_NOT_APPLIED; } + int count = target->fxqueue.CountEffects(fx_diseased_state_ref, fx->Parameter1, fx->Parameter2, fx->Resource); + if (count > 1) { + return FX_APPLIED; + } + //setting damage to 0 because not all types do damage ieDword damage = 0; @@ -2612,11 +2627,9 @@ int fx_set_diseased_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x4f Cure:Disease -static EffectRef fx_diseased_state_ref = { "State:Diseased", -1 }; - int fx_cure_diseased_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_diseased_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_diseased_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //STATE_CURE( STATE_DISEASED ); //the bit flagged as disease is actually the active state. so this is even more unlikely to be used as advertised target->fxqueue.RemoveAllEffects( fx_diseased_state_ref ); //this is what actually happens in bg2 return FX_NOT_APPLIED; @@ -2627,7 +2640,7 @@ int fx_cure_diseased_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // none of the engines care about stacking int fx_set_deaf_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_deaf_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_deaf_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //gemrb fix if (target->SetSpellState(SS_DEAF)) return FX_APPLIED; @@ -2649,7 +2662,7 @@ int fx_set_deaf_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_set_deaf_state_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_deaf_state_iwd2 (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_deaf_state_iwd2 (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //gemrb fix if (target->SetSpellState(SS_DEAF)) return FX_APPLIED; @@ -2675,7 +2688,7 @@ static EffectRef fx_deaf_state_iwd2_ref = { "State:DeafnessIWD2", -1 }; //removes the deafness effect int fx_cure_deaf_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_deaf_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_deaf_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveAllEffects(fx_deaf_state_ref); target->fxqueue.RemoveAllEffects(fx_deaf_state_iwd2_ref); @@ -2685,7 +2698,7 @@ int fx_cure_deaf_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x52 SetAIScript int fx_set_ai_script (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_ai_state (%2d): Resource: %s, Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_set_ai_state (%2d): Resource: %s, Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); target->SetScript (fx->Resource, fx->Parameter2); return FX_NOT_APPLIED; } @@ -2693,7 +2706,7 @@ int fx_set_ai_script (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x53 Protection:Projectile int fx_protection_from_projectile (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_from_projectile (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_from_projectile (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_IMMUNITY, IMM_PROJECTILE); return FX_APPLIED; } @@ -2701,7 +2714,7 @@ int fx_protection_from_projectile (Scriptable* /*Owner*/, Actor* target, Effect* // 0x54 MagicalFireResistanceModifier int fx_magical_fire_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_magical_fire_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_magical_fire_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTMAGICFIRE ); return FX_APPLIED; @@ -2710,7 +2723,7 @@ int fx_magical_fire_resistance_modifier (Scriptable* /*Owner*/, Actor* target, E // 0x55 MagicalColdResistanceModifier int fx_magical_cold_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_magical_cold_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_magical_cold_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTMAGICCOLD ); return FX_APPLIED; @@ -2719,7 +2732,7 @@ int fx_magical_cold_resistance_modifier (Scriptable* /*Owner*/, Actor* target, E // 0x56 SlashingResistanceModifier int fx_slashing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_slashing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_slashing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTSLASHING ); return FX_APPLIED; @@ -2728,7 +2741,7 @@ int fx_slashing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effec // 0x57 CrushingResistanceModifier int fx_crushing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_crushing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_crushing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTCRUSHING ); return FX_APPLIED; @@ -2737,7 +2750,7 @@ int fx_crushing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effec // 0x58 PiercingResistanceModifier int fx_piercing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_piercing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_piercing_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTPIERCING ); return FX_APPLIED; @@ -2746,7 +2759,7 @@ int fx_piercing_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effec // 0x59 MissilesResistanceModifier int fx_missiles_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_missiles_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_missiles_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTMISSILE ); return FX_APPLIED; @@ -2755,7 +2768,7 @@ int fx_missiles_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effec // 0x5A OpenLocksModifier int fx_open_locks_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_open_locks_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_open_locks_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_LOCKPICKING ); return FX_APPLIED; @@ -2764,7 +2777,7 @@ int fx_open_locks_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x5B FindTrapsModifier int fx_find_traps_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_find_traps_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_find_traps_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_TRAPS ); return FX_APPLIED; @@ -2773,7 +2786,7 @@ int fx_find_traps_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x5C PickPocketsModifier int fx_pick_pockets_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_pick_pockets_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_pick_pockets_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_PICKPOCKET ); return FX_APPLIED; @@ -2782,7 +2795,7 @@ int fx_pick_pockets_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x5D FatigueModifier int fx_fatigue_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fatigue_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_fatigue_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_FATIGUE ); // TODO: fatigue has a negative effect on luck -> add fatigmod.2da support @@ -2792,7 +2805,7 @@ int fx_fatigue_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x5E IntoxicationModifier int fx_intoxication_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_intoxication_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_intoxication_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_INTOXICATION ); return FX_APPLIED; @@ -2801,7 +2814,7 @@ int fx_intoxication_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x5F TrackingModifier int fx_tracking_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_tracking_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_tracking_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_TRACKING ); return FX_APPLIED; @@ -2810,7 +2823,7 @@ int fx_tracking_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x60 LevelModifier int fx_level_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_level_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_level_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_LEVEL ); return FX_APPLIED; @@ -2819,7 +2832,7 @@ int fx_level_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x61 StrengthBonusModifier int fx_strength_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_strength_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_strength_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_STREXTRA ); return FX_APPLIED; @@ -2828,23 +2841,20 @@ int fx_strength_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x62 State:Regenerating int fx_set_regenerating_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_regenerating_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_regenerating_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); int damage; int tmp = fx->Parameter1; ieDword gameTime = core->GetGame()->GameTime; - ieDword nextHeal; - if (!fx->Parameter3) { - //hack to ensure our first call gets through - nextHeal = gameTime-1; + if (fx->FirstApply) { + //ensure our first call gets through } else { - nextHeal = fx->Parameter3; + //we can have multiple calls at the same gameTime, so we + //just go to gameTime+1 to ensure one call + ieDword nextHeal = fx->Parameter3; + if (nextHeal>=gameTime) return FX_APPLIED; } - //we can have multiple calls at the same gameTime, so we - //just go to gameTime+1 to ensure one call - if (nextHeal>=gameTime) return FX_APPLIED; - HandlePercentageDamage(fx, target); switch(fx->Parameter2) { @@ -2855,16 +2865,16 @@ int fx_set_regenerating_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) tmp *= core->Time.round_sec; //fall case RPD_SECONDS: //restore param3 hp every param1 seconds - fx->Parameter3 = nextHeal + tmp*AI_UPDATE_TIME; + fx->Parameter3 = gameTime + tmp*AI_UPDATE_TIME; damage = 1; break; case RPD_PERCENT: // handled in HandlePercentageDamage case RPD_POINTS: //restore param1 hp every second? that's crazy! damage = fx->Parameter1; - fx->Parameter3 = nextHeal + AI_UPDATE_TIME; + fx->Parameter3 = gameTime + AI_UPDATE_TIME; break; default: - fx->Parameter3 = nextHeal + AI_UPDATE_TIME; + fx->Parameter3 = gameTime + AI_UPDATE_TIME; damage = 1; break; } @@ -2878,7 +2888,7 @@ int fx_set_regenerating_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x63 SpellDurationModifier int fx_spell_duration_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_spell_duration_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_spell_duration_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: @@ -2895,14 +2905,14 @@ int fx_spell_duration_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x64 Protection:Creature int fx_generic_effect (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_generic_effect (%2d): Param1: %d, Param2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_generic_effect (%2d): Param1: %d, Param2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); return FX_APPLIED; } // 0x65 Protection:Opcode int fx_protection_opcode (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_opcode (%2d): Opcode: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_opcode (%2d): Opcode: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR(IE_IMMUNITY, IMM_OPCODE); return FX_APPLIED; } @@ -2910,7 +2920,7 @@ int fx_protection_opcode (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x66 Protection:SpellLevel int fx_protection_spelllevel (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_spelllevel (%2d) Level: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_protection_spelllevel (%2d) Level: %d\n", fx->Opcode, fx->Parameter1); int value = fx->Parameter1; if (value<9) { @@ -2924,7 +2934,7 @@ int fx_protection_spelllevel (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x67 ChangeName int fx_change_name (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_change_name_modifier (%2d): StrRef: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_change_name_modifier (%2d): StrRef: %d\n", fx->Opcode, fx->Parameter1 ); //this also changes the base stat target->SetName(fx->Parameter1, 0); return FX_NOT_APPLIED; @@ -2933,7 +2943,7 @@ int fx_change_name (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x68 ExperienceModifier int fx_experience_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_experience_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_experience_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //FIXME: this has mode too //target->AddExperience (fx->Parameter1); STAT_MOD( IE_XP ); @@ -2945,7 +2955,7 @@ int fx_experience_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //no one uses it, though. To keep the function, the default branch will do the subtraction int fx_gold_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_gold_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_gold_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!target->InParty) { STAT_MOD( IE_GOLD ); return FX_NOT_APPLIED; @@ -2974,7 +2984,7 @@ int fx_gold_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x6a MoraleBreakModifier int fx_morale_break_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_morale_break_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_morale_break_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD(IE_MORALEBREAK); return FX_PERMANENT; //permanent morale break doesn't stick } @@ -2982,7 +2992,7 @@ int fx_morale_break_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x6b PortraitChange int fx_portrait_change (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_portrait_change (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_portrait_change (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->SetPortrait( fx->Resource, fx->Parameter2); return FX_NOT_APPLIED; } @@ -2990,7 +3000,7 @@ int fx_portrait_change (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x6c ReputationModifier int fx_reputation_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_reputation_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_reputation_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD(IE_REPUTATION); return FX_NOT_APPLIED; //needs testing } @@ -3049,7 +3059,7 @@ int fx_equip_item (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x72 Dither int fx_dither (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_dither (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dither (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //this effect doesn't work in any engine versions return FX_NOT_APPLIED; } @@ -3122,7 +3132,7 @@ int fx_detect_alignment (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 1 reveal area in pattern int fx_reveal_area (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_reveal_area (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_reveal_area (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); Map *map = NULL; if (target) { @@ -3146,7 +3156,7 @@ int fx_reveal_area (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x76 Reveal:Creatures int fx_reveal_creatures (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_reveal_creatures (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_reveal_creatures (%2d): Value: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //reveals creatures (not working in original IE) return FX_NOT_APPLIED; } @@ -3156,7 +3166,7 @@ static EffectRef fx_mirror_image_modifier_ref = { "MirrorImageModifier", -1 }; int fx_mirror_image (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_mirror_image (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_mirror_image (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword images; if (fx->Parameter2) { @@ -3192,7 +3202,7 @@ int fx_mirror_image (Scriptable* Owner, Actor* target, Effect* fx) // 0x78 Protection:Weapons int fx_immune_to_weapon (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_immune_to_weapon (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_immune_to_weapon (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!fx->FirstApply) return FX_APPLIED; int level; @@ -3258,7 +3268,7 @@ int fx_immune_to_weapon (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) int fx_visual_animation_effect (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { //this is an unknown effect - if (0) printf( "fx_visual_animation_effect (%2d)\n", fx->Opcode ); + if (0) print( "fx_visual_animation_effect (%2d)\n", fx->Opcode ); return FX_NOT_APPLIED; } @@ -3267,7 +3277,7 @@ static EffectRef fx_remove_inventory_item_ref = { "Item:RemoveInventory", -1 }; int fx_create_inventory_item (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_create_inventory_item (%2d)\n", fx->Opcode ); + if (0) print( "fx_create_inventory_item (%2d)\n", fx->Opcode ); target->inventory.AddSlotItemRes( fx->Resource, SLOT_ONLYINVENTORY, fx->Parameter1, fx->Parameter3, fx->Parameter4 ); if ((fx->TimingMode&0xff) == FX_DURATION_INSTANT_LIMITED) { //if this effect has expiration, then it will remain as a remove_item @@ -3282,7 +3292,7 @@ int fx_create_inventory_item (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x7b Item:RemoveInventory int fx_remove_inventory_item (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_inventory_item (%2d)\n", fx->Opcode ); + if (0) print( "fx_remove_inventory_item (%2d)\n", fx->Opcode ); //FIXME: now equipped items are only wielded weapons //why would it not let equipped items to be destructed? target->inventory.DestroyItem(fx->Resource,IE_INV_ITEM_EQUIPPED,1); @@ -3293,7 +3303,7 @@ int fx_remove_inventory_item (Scriptable* /*Owner*/, Actor* target, Effect* fx) // iwd2 has several options int fx_dimension_door (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_dimension_door (%2d) Type:%d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_dimension_door (%2d) Type:%d\n", fx->Opcode, fx->Parameter2 ); Point p; switch(fx->Parameter2) @@ -3330,17 +3340,17 @@ int fx_dimension_door (Scriptable* Owner, Actor* target, Effect* fx) // 0x7d Unlock int fx_knock (Scriptable* Owner, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_knock (%2d) [%d.%d]\n", fx->Opcode, fx->PosX, fx->PosY ); + if (0) print( "fx_knock (%2d) [%d.%d]\n", fx->Opcode, fx->PosX, fx->PosY ); Map *map = Owner->GetCurrentArea(); if (!map) { return FX_NOT_APPLIED; } Point p(fx->PosX, fx->PosY); -printf("KNOCK Pos: %d.%d\n", fx->PosX, fx->PosY); +print("KNOCK Pos: %d.%d\n", fx->PosX, fx->PosY); Door *door = map->TMap->GetDoorByPosition(p); if (door) { -printf("Got a door\n"); +print("Got a door\n"); if (door->LockDifficulty<100) { door->SetDoorLocked(false, true); } @@ -3348,7 +3358,7 @@ printf("Got a door\n"); } Container *container = map->TMap->GetContainerByPosition(p); if (container) { -printf("Got a container\n"); +print("Got a container\n"); if(container->LockDifficulty<100) { container->SetContainerLocked(false); } @@ -3361,7 +3371,7 @@ printf("Got a container\n"); // 0xb0 MovementRateModifier2 int fx_movement_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_movement_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_movement_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //iwd2 freeaction disables only 0xb0, who cares if (target->HasSpellState(SS_FREEACTION)) return FX_NOT_APPLIED; @@ -3380,7 +3390,7 @@ static const ieResRef monster_summoning_2da[FX_MS]={"MONSUM01","MONSUM02","MONSU // 0x7f MonsterSummoning int fx_monster_summoning (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_monster_summoning (%2d): Number: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_monster_summoning (%2d): Number: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //check the summoning limit? if (!Owner) { return FX_NOT_APPLIED; @@ -3445,7 +3455,7 @@ int fx_monster_summoning (Scriptable* Owner, Actor* target, Effect* fx) // 0x80 State:Confused int fx_set_confused_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_confused_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_confused_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (target->HasSpellState(SS_BLOODRAGE)) { return FX_NOT_APPLIED; @@ -3469,7 +3479,7 @@ int fx_set_confused_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x81 AidNonCumulative int fx_set_aid_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_aid_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_aid_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!fx->Parameter2) { fx->Parameter2=core->Roll(fx->Parameter1,8,0); } @@ -3503,7 +3513,7 @@ static EffectRef fx_bane_ref = { "Bane", -1 }; int fx_set_bless_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_bless_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_bless_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (STATE_GET (STATE_BLESS) ) //bless is non cumulative return FX_NOT_APPLIED; @@ -3524,7 +3534,7 @@ int fx_set_bless_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x83 ChantNonCumulative int fx_set_chant_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_chant_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_chant_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (STATE_GET (STATE_CHANT) ) //chant is non cumulative return FX_NOT_APPLIED; @@ -3537,7 +3547,7 @@ int fx_set_chant_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x84 HolyNonCumulative int fx_set_holy_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_holy_state (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_set_holy_state (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1 ); if (STATE_GET (STATE_HOLY) ) //holy power is non cumulative return FX_NOT_APPLIED; @@ -3557,7 +3567,7 @@ int fx_set_holy_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x85 LuckNonCumulative int fx_luck_non_cumulative (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_luck_non_cumulative (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_luck_non_cumulative (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1); if (STATE_GET (STATE_LUCK) ) //this luck is non cumulative return FX_NOT_APPLIED; @@ -3571,7 +3581,7 @@ int fx_luck_non_cumulative (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x85 LuckCumulative (iwd2) int fx_luck_cumulative (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_luck_cumulative (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_luck_cumulative (%2d): Modifier: %d\n", fx->Opcode, fx->Parameter1); target->SetSpellState(SS_LUCK); STAT_ADD( IE_LUCK, fx->Parameter1 ); @@ -3582,7 +3592,7 @@ int fx_luck_cumulative (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x86 State:Petrification int fx_set_petrified_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_petrified_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_petrified_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_SET( STATE_PETRIFIED ); return FX_NOT_APPLIED; //permanent effect @@ -3622,7 +3632,7 @@ void CopyPolymorphStats(Actor *source, Actor *target) int fx_polymorph (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_polymorph_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_polymorph_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!gamedata->Exists(fx->Resource,IE_CRE_CLASS_ID)) { //kill all polymorph effects @@ -3675,7 +3685,7 @@ int fx_polymorph (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x88 ForceVisible int fx_force_visible (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_force_visible (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_force_visible (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (pstflags) { BASE_STATE_CURE(STATE_PST_INVIS); @@ -3690,7 +3700,7 @@ int fx_force_visible (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x89 ChantBadNonCumulative int fx_set_chantbad_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_chantbad_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_chantbad_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (STATE_GET (STATE_CHANTBAD) ) //chant is non cumulative return FX_NOT_APPLIED; @@ -3703,7 +3713,7 @@ int fx_set_chantbad_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x8A AnimationStateChange int fx_animation_stance (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_animation_stance (%2d): Stance: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_animation_stance (%2d): Stance: %d\n", fx->Opcode, fx->Parameter2 ); //this effect works only on living actors if ( !STATE_GET(STATE_DEAD) ) { @@ -3719,7 +3729,7 @@ static EffectRef fx_protection_from_display_string_ref = { "Protection:String", int fx_display_string (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_display_string (%2d): StrRef: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_display_string (%2d): StrRef: %d\n", fx->Opcode, fx->Parameter1 ); if(fx->Resource[0]) { //TODO: create a single list reader that handles src and 2da too SrcVector *rndstr=LoadSrc(fx->Resource); @@ -3751,7 +3761,7 @@ static const int xpos_by_direction[16]={0,-10,-12,-14,-16,-14,-12,-10,0,10,12,14 int fx_casting_glow (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_casting_glow (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_casting_glow (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (cgcount<0) { cgcount = core->ReadResRefTable("cgtable",casting_glows); } @@ -3788,7 +3798,7 @@ int fx_casting_glow (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x8d VisualSpellHit int fx_visual_spell_hit (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_visual_spell_hit (%2d): Target: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_visual_spell_hit (%2d): Target: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (shcount<0) { shcount = core->ReadResRefTable("shtable",spell_hits); } @@ -3820,7 +3830,7 @@ int fx_visual_spell_hit (Scriptable* /*Owner*/, Actor* target, Effect* fx) sca->PlayOnce(); map->AddVVCell(sca); } else { - printf("fx_visual_spell_hit: Unhandled Type: %d\n", fx->Parameter2); + print("fx_visual_spell_hit: Unhandled Type: %d\n", fx->Parameter2); } return FX_NOT_APPLIED; } @@ -3828,7 +3838,7 @@ int fx_visual_spell_hit (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x8e Icon:Display int fx_display_portrait_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_display_string (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_display_string (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->AddPortraitIcon(fx->Parameter2); return FX_APPLIED; } @@ -3836,7 +3846,7 @@ int fx_display_portrait_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x8f Item:CreateInSlot int fx_create_item_in_slot (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_create_item_in_slot (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_create_item_in_slot (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); //create item and set it in target's slot target->inventory.SetSlotItemRes( fx->Resource, core->QuerySlot(fx->Parameter2), fx->Parameter1, fx->Parameter3, fx->Parameter4 ); if ((fx->TimingMode&0xff) == FX_DURATION_INSTANT_LIMITED) { @@ -3852,7 +3862,7 @@ int fx_create_item_in_slot (Scriptable* /*Owner*/, Actor* target, Effect* fx) // different in iwd2 and the rest (maybe also in how: 0-7?) int fx_disable_button (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disable_button (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_disable_button (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); // iwd2 has a flexible action bar, so there are more possible parameter values // only values 0-5 match the bg2 constants (which map to ACT_*) @@ -3885,7 +3895,7 @@ static ieDword dsc_bits_iwd2[7]={1, 14, 6, 2, 4, 8, 16}; static ieDword dsc_bits_bg2[7]={1, 4, 2, 8, 16, 14, 6}; int fx_disable_spellcasting (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disable_spellcasting (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_disable_spellcasting (%2d): Button: %d\n", fx->Opcode, fx->Parameter2 ); bool display_warning = false; ieDword tmp = fx->Parameter2+1; @@ -3913,7 +3923,7 @@ int fx_disable_spellcasting (Scriptable* /*Owner*/, Actor* target, Effect* fx) //1 -> 2 (cleric) //2 -> 8 (innate) //3 -> 16 (class) - if (tmp<31) { + if (tmp<7) { STAT_BIT_OR(IE_CASTING, dsc_bits_bg2[tmp] ); } } @@ -3927,7 +3937,7 @@ int fx_disable_spellcasting (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x92 Spell:Cast int fx_cast_spell (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_cast_spell (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_cast_spell (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); if (fx->Parameter2) { //apply spell on target core->ApplySpell(fx->Resource, target, Owner, fx->Parameter1); @@ -3956,7 +3966,7 @@ int fx_cast_spell (Scriptable* Owner, Actor* target, Effect* fx) // 0x93 Spell:Learn int fx_learn_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_learn_spell (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_learn_spell (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); //parameter1 is unused, gemrb lets you to make it not give XP //probably we should also let this via a game flag if we want //full compatibility with bg1 @@ -3967,7 +3977,7 @@ int fx_learn_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x94 Spell:CastSpellPoint int fx_cast_spell_point (Scriptable* Owner, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_cast_spell_point (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_cast_spell_point (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); // save the current spell ref, so the rest of its effects can be applied afterwards ieResRef OldSpellResRef; memcpy(OldSpellResRef, Owner->SpellResRef, sizeof(OldSpellResRef)); @@ -3983,7 +3993,7 @@ int fx_cast_spell_point (Scriptable* Owner, Actor* /*target*/, Effect* fx) // 0x95 Identify int fx_identify (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_identify (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_identify (%2d): Resource:%s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); if (target->InParty) { BASE_SET (IE_IDENTIFYMODE, 1); core->SetEventFlag(EF_IDENTIFY); @@ -4000,7 +4010,7 @@ int fx_identify (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 3 - detect secret doors by luck int fx_find_traps (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_find_traps (%2d)\n", fx->Opcode ); + if (0) print( "fx_find_traps (%2d)\n", fx->Opcode ); //reveal trapped containers, doors, triggers that are in the visible range ieDword range = target->GetStat(IE_VISUALRANGE)*10; ieDword skill; @@ -4072,7 +4082,7 @@ int fx_find_traps (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x97 ReplaceCreature int fx_replace_creature (Scriptable* Owner, Actor* target, Effect *fx) { - if (0) printf( "fx_replace_creature (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_replace_creature (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); //this safeguard exists in the original engine too if (!gamedata->Exists(fx->Resource,IE_CRE_CLASS_ID)) { @@ -4107,7 +4117,7 @@ int fx_replace_creature (Scriptable* Owner, Actor* target, Effect *fx) // 0x98 PlayMovie int fx_play_movie (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_play_movie (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_play_movie (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); core->PlayMovie (fx->Resource); return FX_NOT_APPLIED; } @@ -4119,7 +4129,7 @@ static const ieDword fullwhite[7]={ICE_GRADIENT,ICE_GRADIENT,ICE_GRADIENT,ICE_GR int fx_set_sanctuary_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { //iwd and bg are a bit different, but we solve the whole stuff in a single opcode - if (0) printf( "fx_set_sanctuary_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_sanctuary_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (target->HasSpellState(SS_SANCTUARY)) return FX_NOT_APPLIED; if (!fx->Parameter2) { fx->Parameter2=1; @@ -4138,7 +4148,7 @@ int fx_set_sanctuary_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9a Overlay:Entangle int fx_set_entangle_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_entangle_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_entangle_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //iwd2 effects that disable entangle if (target->HasSpellState(SS_FREEACTION)) return FX_NOT_APPLIED; @@ -4154,7 +4164,7 @@ int fx_set_entangle_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9b Overlay:MinorGlobe int fx_set_minorglobe_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_minorglobe_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_minorglobe_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //the resisted levels are stored in minor globe (bit 2-) //the globe effect is stored in the first bit STAT_BIT_OR_PCF( IE_MINORGLOBE, 1); @@ -4164,7 +4174,7 @@ int fx_set_minorglobe_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9c Overlay:ShieldGlobe int fx_set_shieldglobe_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_shieldglobe_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_shieldglobe_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //the shield vanishes on dead if (STATE_GET(STATE_DEAD) ) { return FX_NOT_APPLIED; @@ -4176,7 +4186,7 @@ int fx_set_shieldglobe_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9d Overlay:Web int fx_set_web_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_web_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_web_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //iwd2 effects that disable web if (target->HasSpellState(SS_FREEACTION)) return FX_NOT_APPLIED; @@ -4192,7 +4202,7 @@ int fx_set_web_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9e Overlay:Grease int fx_set_grease_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_grease_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_grease_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //iwd2 effects that disable grease if (target->HasSpellState(SS_FREEACTION)) return FX_NOT_APPLIED; @@ -4207,7 +4217,7 @@ int fx_set_grease_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x9f MirrorImageModifier int fx_mirror_image_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_mirror_image_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_mirror_image_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); if (STATE_GET(STATE_DEAD) ) { return FX_NOT_APPLIED; } @@ -4235,7 +4245,7 @@ static EffectRef fx_sanctuary_state_ref = { "Overlay:Sanctuary", -1 }; int fx_cure_sanctuary_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_sanctuary_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_sanctuary_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_SANCTUARY, 0); target->fxqueue.RemoveAllEffects(fx_sanctuary_state_ref); return FX_NOT_APPLIED; @@ -4246,7 +4256,7 @@ static EffectRef fx_set_panic_state_ref = { "State:Panic", -1 }; int fx_cure_panic_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_panic_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_panic_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_PANIC ); target->fxqueue.RemoveAllEffects(fx_set_panic_state_ref); return FX_NOT_APPLIED; @@ -4257,7 +4267,7 @@ static EffectRef fx_hold_creature_ref = { "State:Hold", -1 }; int fx_cure_hold_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_hold_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_hold_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //note that this effect doesn't remove 185 (another hold effect) target->fxqueue.RemoveAllEffects( fx_hold_creature_ref ); target->fxqueue.RemoveAllEffects(fx_hold_creature_no_icon_ref); @@ -4270,7 +4280,7 @@ static EffectRef fx_movement_modifier_ref = { "MovementRateModifier2", -1 }; int fx_cure_slow_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_slow_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_slow_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveAllEffects( fx_movement_modifier_ref ); // STATE_CURE( STATE_SLOWED ); return FX_NOT_APPLIED; @@ -4281,7 +4291,7 @@ static EffectRef fx_intoxication_ref = { "IntoxicationModifier", -1 }; int fx_cure_intoxication (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_intoxication (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_intoxication (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveAllEffects( fx_intoxication_ref ); BASE_SET(IE_INTOXICATION,0); return FX_NOT_APPLIED; @@ -4290,7 +4300,7 @@ int fx_cure_intoxication (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xa5 PauseTarget int fx_pause_target (Scriptable* /*Owner*/, Actor * target, Effect* fx) { - if (0) printf( "fx_pause_target (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_pause_target (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_CASTERHOLD ); return FX_PERMANENT; } @@ -4298,7 +4308,7 @@ int fx_pause_target (Scriptable* /*Owner*/, Actor * target, Effect* fx) // 0xa6 MagicResistanceModifier int fx_magic_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_magic_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_magic_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTMAGIC ); return FX_APPLIED; @@ -4307,7 +4317,7 @@ int fx_magic_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* // 0xa7 MissileHitModifier int fx_missile_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_missile_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_missile_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MISSILEHITBONUS ); return FX_APPLIED; @@ -4318,7 +4328,7 @@ int fx_missile_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // removes creature specified by resource key (gemrb extension) int fx_remove_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_creature (%2d)\n", fx->Opcode); + if (0) print( "fx_remove_creature (%2d)\n", fx->Opcode); Map *map = NULL; @@ -4345,7 +4355,7 @@ int fx_remove_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xa9 Icon:Disable int fx_disable_portrait_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disable_portrait_icon (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_disable_portrait_icon (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->DisablePortraitIcon(fx->Parameter2); return FX_APPLIED; } @@ -4353,7 +4363,7 @@ int fx_disable_portrait_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xaa DamageAnimation int fx_damage_animation (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damage_animation (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_damage_animation (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //Parameter1 is a gemrb extension target->PlayDamageAnimation(fx->Parameter2, !fx->Parameter1); @@ -4363,7 +4373,7 @@ int fx_damage_animation (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xab Spell:Add int fx_add_innate (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_add_innate (%2d): Resource: %s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_add_innate (%2d): Resource: %s Mode: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); target->LearnSpell(fx->Resource, fx->Parameter2^LS_MEMO); //this is an instant, so it shouldn't stick return FX_NOT_APPLIED; @@ -4373,7 +4383,7 @@ int fx_add_innate (Scriptable* /*Owner*/, Actor* target, Effect* fx) //gemrb extension: deplete spell by resref int fx_remove_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_spell (%2d): Resource: %s Type:%d\n", fx->Opcode, fx->Resource, fx->Parameter2); + if (0) print( "fx_remove_spell (%2d): Resource: %s Type:%d\n", fx->Opcode, fx->Resource, fx->Parameter2); switch (fx->Parameter2) { default: target->spellbook.RemoveSpell(fx->Resource); @@ -4394,7 +4404,7 @@ int fx_remove_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xad PoisonResistanceModifier int fx_poison_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_poison_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_poison_resistance_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_RESISTPOISON ); return FX_APPLIED; @@ -4403,7 +4413,7 @@ int fx_poison_resistance_modifier (Scriptable* /*Owner*/, Actor* target, Effect* //0xae PlaySound int fx_playsound (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_playsound (%s)", fx->Resource ); + if (0) print( "fx_playsound (%s)", fx->Resource ); //this is probably inaccurate if (target) { core->GetAudioDrv()->Play(fx->Resource, target->Pos.x, target->Pos.y); @@ -4418,7 +4428,7 @@ int fx_playsound (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xfb State:Hold4 int fx_hold_creature_no_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_hold_creature_no_icon (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_hold_creature_no_icon (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //actually the original engine just skips this effect if the target is dead if ( STATE_GET(STATE_DEAD) ) { @@ -4439,7 +4449,7 @@ int fx_hold_creature_no_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) //(0x6d/0x1a8 for iwd2) int fx_hold_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_hold_creature (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_hold_creature (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //actually the original engine just skips this effect if the target is dead if ( STATE_GET(STATE_DEAD) ) { @@ -4463,37 +4473,44 @@ int fx_hold_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xb0 see: fx_movement_modifier //0xb1 ApplyEffect -int fx_apply_effect (Scriptable* /*Owner*/, Actor* target, Effect* fx) +int fx_apply_effect (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_apply_effect (%2d) %s", fx->Opcode, fx->Resource ); + if (0) print( "fx_apply_effect (%2d) %s", fx->Opcode, fx->Resource ); //this effect executes a file effect in place of this effect //the file effect inherits the target and the timingmode, but gets //a new chance to roll percents - int ret = FX_NOT_APPLIED; - if (!target) { - return ret; + if (target && !EffectQueue::match_ids( target, fx->Parameter2, fx->Parameter1) ) { + return FX_NOT_APPLIED; } - if (EffectQueue::match_ids( target, fx->Parameter2, fx->Parameter1) ) { - Point p(fx->PosX, fx->PosY); - //apply effect, if the effect is a goner, then kill - //this effect too - Effect *newfx = core->GetEffect(fx->Resource, fx->Power, p); - if (newfx) { - Effect *myfx = new Effect; - memcpy(myfx, newfx, sizeof(Effect)); - myfx->random_value = core->Roll(1,100,-1); - myfx->Target = FX_TARGET_PRESET; - myfx->TimingMode = fx->TimingMode; - myfx->Duration = fx->Duration; - myfx->CasterID = fx->CasterID; - ret = target->fxqueue.ApplyEffect(target, myfx, fx->FirstApply, !fx->Parameter3); - fx->Parameter3 = 1; - delete myfx; - } - //newfx is a borrowed reference don't delete it + Point p(fx->PosX, fx->PosY); + + //apply effect, if the effect is a goner, then kill + //this effect too + Effect *newfx = core->GetEffect(fx->Resource, fx->Power, p); + if (!newfx) + return FX_NOT_APPLIED; + + Effect *myfx = new Effect; + memcpy(myfx, newfx, sizeof(Effect)); + myfx->random_value = core->Roll(1,100,-1); + myfx->Target = FX_TARGET_PRESET; + myfx->TimingMode = fx->TimingMode; + myfx->Duration = fx->Duration; + myfx->CasterID = fx->CasterID; + + int ret; + if (target) { + ret = target->fxqueue.ApplyEffect(target, myfx, fx->FirstApply, !fx->Parameter3); + } else { + EffectQueue fxqueue; + fxqueue.SetOwner(Owner); + ret = fxqueue.ApplyEffect(NULL, myfx, fx->FirstApply, !fx->Parameter3); } + + fx->Parameter3 = 1; + delete myfx; return ret; } @@ -4505,7 +4522,7 @@ int fx_apply_effect (Scriptable* /*Owner*/, Actor* target, Effect* fx) // b6 generic effect ApplyEffectItem int fx_apply_effect_item (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf("fx_apply_effect_item (%2d) (%.8s)\n", fx->Opcode, fx->Resource); + if (0) print("fx_apply_effect_item (%2d) (%.8s)\n", fx->Opcode, fx->Resource); if (target->inventory.HasItem(fx->Resource, 0) ) { core->ApplySpell(fx->Resource2, target, Owner, fx->Parameter1); return FX_NOT_APPLIED; @@ -4516,7 +4533,7 @@ int fx_apply_effect_item (Scriptable* Owner, Actor* target, Effect* fx) // b7 generic effect ApplyEffectItemType int fx_apply_effect_item_type (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf("fx_apply_effect_item (%2d), Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print("fx_apply_effect_item (%2d), Type: %d\n", fx->Opcode, fx->Parameter2); if (target->inventory.HasItemType(fx->Parameter2) ) { core->ApplySpell(fx->Resource, target, Owner, fx->Parameter1); return FX_NOT_APPLIED; @@ -4527,7 +4544,7 @@ int fx_apply_effect_item_type (Scriptable* Owner, Actor* target, Effect* fx) // b8 DontJumpModifier int fx_dontjump_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_dontjump_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_dontjump_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_DONOTJUMP, fx->Parameter2 ); return FX_APPLIED; } @@ -4537,7 +4554,7 @@ int fx_dontjump_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xba MoveToArea int fx_move_to_area (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_move_to_area (%2d) %s", fx->Opcode, fx->Resource ); + if (0) print( "fx_move_to_area (%2d) %s", fx->Opcode, fx->Resource ); //delay effect until the target has finished the previous move to an area //hopefully this fixes an evil bug Map *map = target->GetCurrentArea(); @@ -4555,7 +4572,7 @@ int fx_move_to_area (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_local_variable (Scriptable* /*Owner*/, Actor* target, Effect* fx) { //this is a hack, the variable name spreads across the resources - if (0) printf( "fx_local_variable (%2d) %s=%d", fx->Opcode, fx->Resource, fx->Parameter1 ); + if (0) print( "fx_local_variable (%2d) %s=%d", fx->Opcode, fx->Resource, fx->Parameter1 ); target->locals->SetAt(fx->Resource, fx->Parameter1); //local variable effects are not applied, they will be resaved though return FX_NOT_APPLIED; @@ -4564,7 +4581,7 @@ int fx_local_variable (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xbc AuraCleansingModifier int fx_auracleansing_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_auracleansing_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_auracleansing_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_AURACLEANSING, fx->Parameter2 ); return FX_APPLIED; } @@ -4572,7 +4589,7 @@ int fx_auracleansing_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xbd CastingSpeedModifier int fx_castingspeed_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_castingspeed_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_castingspeed_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_MOD( IE_MENTALSPEED ); return FX_APPLIED; } @@ -4580,7 +4597,7 @@ int fx_castingspeed_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xbe PhysicalSpeedModifier int fx_attackspeed_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_attackspeed_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_attackspeed_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_MOD( IE_PHYSICALSPEED ); return FX_APPLIED; } @@ -4589,7 +4606,7 @@ int fx_attackspeed_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // gemrb extension: if the resource key is set, apply param1 as a percentual modifier int fx_castinglevel_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_castinglevel_modifier (%2d) Value:%d Type:%d", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_castinglevel_modifier (%2d) Value:%d Type:%d", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: if (fx->Resource[0]) { @@ -4624,7 +4641,7 @@ static EffectRef fx_maximum_hp_modifier_ref = { "MaximumHPModifier", -1 }; int fx_find_familiar (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_find_familiar (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_find_familiar (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (!target) { return FX_NOT_APPLIED; @@ -4716,7 +4733,7 @@ int fx_find_familiar (Scriptable* Owner, Actor* target, Effect* fx) // 0xc1 InvisibleDetection int fx_see_invisible_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_see_invisible_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_see_invisible_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_SEEINVISIBLE, fx->Parameter2 ); return FX_APPLIED; } @@ -4724,7 +4741,7 @@ int fx_see_invisible_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xc2 IgnoreDialogPause int fx_ignore_dialogpause_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_ignore_dialogpause_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_ignore_dialogpause_modifier (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_IGNOREDIALOGPAUSE, fx->Parameter2 ); return FX_APPLIED; } @@ -4736,7 +4753,7 @@ static EffectRef fx_constitution_modifier_ref = { "ConstitutionModifier", -1 }; int fx_familiar_constitution_loss (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_familiar_constitution_loss (%2d): Loss: %d\n", fx->Opcode,(signed) fx->Parameter1 ); + if (0) print( "fx_familiar_constitution_loss (%2d): Loss: %d\n", fx->Opcode,(signed) fx->Parameter1 ); if (! (STAT_GET(IE_STATE_ID)&STATE_NOSAVE)) { return FX_APPLIED; } @@ -4766,7 +4783,7 @@ int fx_familiar_constitution_loss (Scriptable* /*Owner*/, Actor* target, Effect* //0xc4 FamiliarMarker int fx_familiar_marker (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_familiar_marker (%2d)\n", fx->Opcode ); + if (0) print( "fx_familiar_marker (%2d)\n", fx->Opcode ); if (! (STAT_GET(IE_STATE_ID)&STATE_NOSAVE)) { core->GetGame()->familiarBlock=true; return FX_APPLIED; @@ -4778,7 +4795,7 @@ int fx_familiar_marker (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xc5 Bounce:Projectile int fx_bounce_projectile (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_projectile (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_projectile (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_PROJECTILE ); return FX_APPLIED; } @@ -4786,7 +4803,7 @@ int fx_bounce_projectile (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xc6 Bounce:Opcode int fx_bounce_opcode (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_opcode (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_opcode (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_OPCODE ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -4795,7 +4812,7 @@ int fx_bounce_opcode (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xc7 Bounce:SpellLevel int fx_bounce_spelllevel (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_spellevel (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_spellevel (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_LEVEL ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -4804,7 +4821,7 @@ int fx_bounce_spelllevel (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xc8 Bounce:SpellLevelDec int fx_bounce_spelllevel_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_spellevel_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_spellevel_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_LEVEL_DEC ); target->AddPortraitIcon(PI_BOUNCE); return FX_APPLIED; @@ -4813,7 +4830,7 @@ int fx_bounce_spelllevel_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xc9 Protection:SpellLevelDec int fx_protection_spelllevel_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_spelllevel_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_spelllevel_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_IMMUNITY, IMM_LEVEL_DEC ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -4822,7 +4839,7 @@ int fx_protection_spelllevel_dec (Scriptable* /*Owner*/, Actor* target, Effect* //0xca Bounce:School int fx_bounce_school (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_school (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_school (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_SCHOOL ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -4831,7 +4848,7 @@ int fx_bounce_school (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xcb Bounce:SecondaryType int fx_bounce_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_secondary_type (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_secondary_type (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_SECTYPE ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -4840,7 +4857,7 @@ int fx_bounce_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xcc //resist school int fx_protection_school (Scriptable* /*Owner*/, Actor* target, Effect *fx) { - if (0) printf( "fx_protection_school (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_school (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_IMMUNITY, IMM_SCHOOL); return FX_APPLIED; } @@ -4848,7 +4865,7 @@ int fx_protection_school (Scriptable* /*Owner*/, Actor* target, Effect *fx) // 0xcd //resist sectype int fx_protection_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect *fx) { - if (0) printf( "fx_protection_secondary_type (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_secondary_type (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_IMMUNITY, IMM_SECTYPE); return FX_APPLIED; } @@ -4856,7 +4873,7 @@ int fx_protection_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect * //0xce Protection:Spell int fx_resist_spell (Scriptable* /*Owner*/, Actor* target, Effect *fx) { - if (0) printf( "fx_resist_spell (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_resist_spell (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); if (strnicmp(fx->Resource,fx->Source,sizeof(fx->Resource)) ) { STAT_BIT_OR( IE_IMMUNITY, IMM_RESOURCE); return FX_APPLIED; @@ -4868,7 +4885,7 @@ int fx_resist_spell (Scriptable* /*Owner*/, Actor* target, Effect *fx) // ??? Protection:SpellDec int fx_resist_spell_dec (Scriptable* /*Owner*/, Actor* target, Effect *fx) { - if (0) printf( "fx_resist_spell_dec (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_resist_spell_dec (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); if (strnicmp(fx->Resource,fx->Source,sizeof(fx->Resource)) ) { STAT_BIT_OR( IE_IMMUNITY, IMM_RESOURCE_DEC); return FX_APPLIED; @@ -4880,7 +4897,7 @@ int fx_resist_spell_dec (Scriptable* /*Owner*/, Actor* target, Effect *fx) // 0xcf Bounce:Spell int fx_bounce_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_spell (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_spell (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_RESOURCE ); return FX_APPLIED; } @@ -4888,7 +4905,7 @@ int fx_bounce_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) // ??? Bounce:SpellDec int fx_bounce_spell_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_spell (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_spell (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_RESOURCE_DEC ); return FX_APPLIED; } @@ -4898,7 +4915,7 @@ int fx_bounce_spell_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) // it allowed only setting it, and only by one instance int fx_minimum_hp_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_minimum_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_minimum_hp_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MINHITPOINTS ); return FX_APPLIED; @@ -4907,7 +4924,7 @@ int fx_minimum_hp_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xd1 PowerWordKill int fx_power_word_kill (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_power_word_kill (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_power_word_kill (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword limit = 60; if (fx->Parameter1) { @@ -4926,7 +4943,7 @@ int fx_power_word_kill (Scriptable* Owner, Actor* target, Effect* fx) //0xd2 PowerWordStun int fx_power_word_stun (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_power_word_stun (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_power_word_stun (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword limit = 90; if (fx->Parameter1) { @@ -4954,7 +4971,7 @@ int fx_power_word_stun (Scriptable* Owner, Actor* target, Effect* fx) //0xd3 State:Imprisonment (avatar removal plus portrait icon) int fx_imprisonment (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_imprisonment (%2d)\n", fx->Opcode ); + if (0) print( "fx_imprisonment (%2d)\n", fx->Opcode ); target->SetMCFlag(MC_HIDDEN, BM_OR); target->AddPortraitIcon(PI_PRISON); return FX_APPLIED; @@ -4966,7 +4983,7 @@ static EffectRef fx_maze_ref = { "Maze", -1 }; int fx_freedom (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_freedom (%2d)\n", fx->Opcode ); + if (0) print( "fx_freedom (%2d)\n", fx->Opcode ); target->fxqueue.RemoveAllEffects( fx_imprisonment_ref ); target->fxqueue.RemoveAllEffects( fx_maze_ref ); return FX_NOT_APPLIED; @@ -4975,7 +4992,7 @@ int fx_freedom (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xd5 Maze int fx_maze (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_maze (%2d)\n", fx->Opcode ); + if (0) print( "fx_maze (%2d)\n", fx->Opcode ); if (!fx->Parameter2 && fx->FirstApply) { //get the maze dice number (column 3) int stat = target->GetSafeStat(IE_INT); @@ -4992,7 +5009,7 @@ int fx_maze (Scriptable* /*Owner*/, Actor* target, Effect* fx) //GemRB extension: if fx->Parameter1 is set, it is the bitfield of spell types (could be priest spells) int fx_select_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_select_spell (%2d) %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_select_spell (%2d) %d\n", fx->Opcode, fx->Parameter2 ); Spellbook *sb = &target->spellbook; if(fx->Parameter2) { //all known spells, no need to memorize @@ -5019,7 +5036,7 @@ int fx_select_spell (Scriptable* /*Owner*/, Actor* target, Effect* fx) static EffectRef fx_protection_from_animation_ref = { "Protection:Animation", -1 }; int fx_play_visual_effect (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_play_visual_effect (%2d): Resource: %s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_play_visual_effect (%2d): Resource: %s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); //this is in the original engine (dead actors lose this effect) if (STATE_GET( STATE_DEAD) ) { @@ -5084,7 +5101,7 @@ static EffectRef fx_leveldrain_ref = { "LevelDrainModifier", -1 }; // FIXME: BG2 level drain uses parameter3 to decrease the MaxHp, and parameter4 to decrease level. (unset) int fx_leveldrain_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_leveldrain_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_leveldrain_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); //never subtract more than the maximum hitpoints ieDword x = STAT_GET(IE_MAXHITPOINTS)-1; @@ -5113,7 +5130,7 @@ static EffectRef fx_sleep_ref = { "State:Sleep", -1 }; int fx_power_word_sleep (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_power_word_sleep (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_power_word_sleep (%2d): HP: %d Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword limit = 20; if (fx->Parameter1) { @@ -5139,7 +5156,7 @@ int fx_power_word_sleep (Scriptable* Owner, Actor* target, Effect* fx) // 0xda StoneSkinModifier int fx_stoneskin_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_stoneskin_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_stoneskin_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); if (!fx->Parameter1) { return FX_NOT_APPLIED; } @@ -5169,7 +5186,7 @@ int fx_dispel_school (Scriptable* /*Owner*/, Actor* target, Effect* fx) { ieResRef Removed; - if (0) printf( "fx_dispel_school (%2d): Level: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dispel_school (%2d): Level: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveLevelEffects(Removed, fx->Parameter1, RL_MATCHSCHOOL, fx->Parameter2); return FX_NOT_APPLIED; } @@ -5178,7 +5195,7 @@ int fx_dispel_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect* fx) { ieResRef Removed; - if (0) printf( "fx_dispel_secondary_type (%2d): Level: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dispel_secondary_type (%2d): Level: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveLevelEffects(Removed, fx->Parameter1, RL_MATCHSECTYPE, fx->Parameter2); return FX_NOT_APPLIED; } @@ -5186,7 +5203,7 @@ int fx_dispel_secondary_type (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xde RandomTeleport int fx_teleport_field (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_teleport_field (%2d): Distance: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_teleport_field (%2d): Distance: %d\n", fx->Opcode, fx->Parameter1 ); Map *map = target->GetCurrentArea(); if (!map) { @@ -5203,7 +5220,7 @@ int fx_teleport_field (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xdf //Protection:SchoolDec int fx_protection_school_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_school_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_school_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (fx->Parameter1) { STAT_BIT_OR( IE_IMMUNITY, IMM_SCHOOL_DEC ); return FX_APPLIED; @@ -5215,7 +5232,7 @@ int fx_protection_school_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_cure_leveldrain (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_leveldrain (%2d)\n", fx->Opcode ); + if (0) print( "fx_cure_leveldrain (%2d)\n", fx->Opcode ); //all level drain removed at once??? //if not, then find old effect, remove a number target->fxqueue.RemoveAllEffects( fx_leveldrain_ref ); @@ -5226,7 +5243,7 @@ int fx_cure_leveldrain (Scriptable* /*Owner*/, Actor* target, Effect* fx) //gemrb special: speed and color are custom int fx_reveal_magic (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_reveal_magic (%2d)\n", fx->Opcode ); + if (0) print( "fx_reveal_magic (%2d)\n", fx->Opcode ); if (target->fxqueue.HasAnyDispellableEffect()) { if (!fx->Parameter1) { fx->Parameter1=0xff00; //blue @@ -5244,7 +5261,7 @@ int fx_reveal_magic (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xe2 Protection:SecondaryTypeDec int fx_protection_secondary_type_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_secondary_type_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_protection_secondary_type_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (fx->Parameter1) { STAT_BIT_OR( IE_IMMUNITY, IMM_SECTYPE_DEC ); return FX_APPLIED; @@ -5255,7 +5272,7 @@ int fx_protection_secondary_type_dec (Scriptable* /*Owner*/, Actor* target, Effe //0xe3 Bounce:SchoolDecrement int fx_bounce_school_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_school_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_school_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_SCHOOL_DEC ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -5264,7 +5281,7 @@ int fx_bounce_school_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xe4 Bounce:SecondaryTypeDecrement int fx_bounce_secondary_type_dec (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bounce_secondary_type_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_bounce_secondary_type_dec (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); STAT_BIT_OR( IE_BOUNCE, BNC_SECTYPE_DEC ); target->AddPortraitIcon(PI_BOUNCE2); return FX_APPLIED; @@ -5275,7 +5292,7 @@ int fx_dispel_school_one (Scriptable* /*Owner*/, Actor* target, Effect* fx) { ieResRef Removed; - if (0) printf( "fx_dispel_school_one (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dispel_school_one (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveLevelEffects(Removed, fx->Parameter1, RL_MATCHSCHOOL|RL_REMOVEFIRST, fx->Parameter2); return FX_NOT_APPLIED; } @@ -5285,7 +5302,7 @@ int fx_dispel_secondary_type_one (Scriptable* /*Owner*/, Actor* target, Effect* { ieResRef Removed; - if (0) printf( "fx_dispel_secondary_type_one (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_dispel_secondary_type_one (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveLevelEffects(Removed, fx->Parameter1, RL_MATCHSECTYPE|RL_REMOVEFIRST, fx->Parameter2); return FX_NOT_APPLIED; } @@ -5293,7 +5310,7 @@ int fx_dispel_secondary_type_one (Scriptable* /*Owner*/, Actor* target, Effect* //0xe7 Timestop int fx_timestop (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_timestop (%2d)\n", fx->Opcode); + if (0) print( "fx_timestop (%2d)\n", fx->Opcode); core->GetGame()->TimeStop(target, fx->Duration); return FX_NOT_APPLIED; } @@ -5301,92 +5318,159 @@ int fx_timestop (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xe8 CastSpellOnCondition int fx_cast_spell_on_condition (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_cast_spell_on_condition (%2d): Target: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cast_spell_on_condition (%2d): Target: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + /* + * This is used for Fire Shield, etc, to cast spells when certain + * triggers are true. It is also used for contingencies, which set + * Parameter3 and expect some special processing. + * In the original engine, this constructs a 'contingency list' in the + * target's stats, which is checked in two cases: every 100 ticks + * (for 0x4xxx-type triggers) and every time a trigger is added (for + * other triggers). + * Instead, we handle the first type directly here in the effect + * itself, and the normal type by marking triggers with the flag + * TEF_PROCESSED_EFFECTS after every effect run, so we can tell that + * only triggers without the flag should be checked. + * Conveniently, since contingency versions self-destruct and + * non-contingency versions are only allowed to run once per + * frame, we need only check a single trigger per effect run. + */ if (fx->FirstApply && fx->Parameter3) { + // TODO: display strings + target->spellbook.HaveSpell( fx->Resource, HS_DEPLETE ); target->spellbook.HaveSpell( fx->Resource2, HS_DEPLETE ); target->spellbook.HaveSpell( fx->Resource3, HS_DEPLETE ); target->spellbook.HaveSpell( fx->Resource4, HS_DEPLETE ); } - //get subject of check + if (fx->Parameter3) { + target->AddPortraitIcon(PI_CONTINGENCY); + } + + // TODO: resist source spell, if any + + // get the actor to cast spells at Actor *actor = NULL; Map *map = target->GetCurrentArea(); - switch(fx->Parameter1) { - //self - case 0: actor = target; break; - //last attacker - case 1: actor = map->GetActorByGlobalID(target->LastHitter); break; - //nearest enemy - //fix this! - //case 2: actor = map->GetActorByGlobalID(target->LastSeen); break; - case 2: actor = GetNearestEnemyOf(map, target, 0); break; - //nearest creature - case 3: actor = map->GetActorByGlobalID(target->LastSeen); break; + switch (fx->Parameter1) { + case 0: + // Myself + actor = target; + break; + case 1: + // LastHitter + actor = map->GetActorByGlobalID(target->LastHitter); + break; + case 2: + // NearestEnemyOf + actor = GetNearestEnemyOf(map, target, 0); + break; + case 3: + // Nearest? + actor = map->GetActorByGlobalID(target->LastSeen); + break; } + if (!actor) { return FX_APPLIED; } - int condition; - //check condition - switch(fx->Parameter2) { - case COND_GOTHIT: //on hit - condition = target->LastDamage; + + bool condition; + bool per_round = true; // 4xxx trigger? + const TriggerEntry *entry = NULL; + + // check the condition + switch (fx->Parameter2) { + case COND_GOTHIT: + // HitBy([ANYONE]) + // TODO: should we ignore this for self-hits in non-contingency mode? + entry = target->GetMatchingTrigger(trigger_hitby, TEF_PROCESSED_EFFECTS); + per_round = false; break; - case COND_NEAR: // - condition = PersonalDistance(actor, target)<30; + case COND_NEAR: + // See(NearestEnemyOf()) + // FIXME + condition = PersonalDistance(actor, target) < 30; break; case COND_HP_HALF: - condition = actor->GetBase(IE_HITPOINTS)GetStat(IE_MAXHITPOINTS)/2; + // HPPercentLT(Myself, 50) + condition = target->GetBase(IE_HITPOINTS) < (target->GetStat(IE_MAXHITPOINTS) / 2); break; case COND_HP_QUART: - condition = actor->GetBase(IE_HITPOINTS)GetStat(IE_MAXHITPOINTS)/4; + // HPPercentLT(Myself, 25) + condition = target->GetBase(IE_HITPOINTS) < (target->GetStat(IE_MAXHITPOINTS) / 4); break; case COND_HP_LOW: - condition = actor->GetBase(IE_HITPOINTS)GetStat(IE_MAXHITPOINTS)/10; + // HPPercentLT(Myself, 10) + condition = target->GetBase(IE_HITPOINTS) < (target->GetStat(IE_MAXHITPOINTS) / 10); break; case COND_HELPLESS: - condition = actor->GetStat(IE_STATE_ID) & STATE_CANTMOVE; + // StateCheck(Myself, STATE_HELPLESS) + condition = (bool)(target->GetStat(IE_STATE_ID) & STATE_CANTMOVE); break; case COND_POISONED: - condition = actor->GetStat(IE_STATE_ID) & STATE_POISONED; + // StateCheck(Myself, STATE_POISONED) + condition = (bool)(target->GetStat(IE_STATE_ID) & STATE_POISONED); break; - case COND_ATTACKED: // once per round - condition = actor->LastHitter; + case COND_ATTACKED: + // AttackedBy([ANYONE]) + entry = target->GetMatchingTrigger(trigger_attackedby, TEF_PROCESSED_EFFECTS); + per_round = false; break; - case COND_NEAR4: // closer than 4' - condition = PersonalDistance(actor, target)<4; + case COND_NEAR4: + // PersonalSpaceDistance([ANYONE], 4) + // FIXME + condition = PersonalDistance(actor, target) < 4; break; - case COND_NEAR10: // closer than 10' - condition = PersonalDistance(actor, target)<10; + case COND_NEAR10: + // PersonalSpaceDistance([ANYONE], 10) + // FIXME + condition = PersonalDistance(target, actor) < 10; break; case COND_EVERYROUND: - condition = 1; + condition = true; break; case COND_TOOKDAMAGE: - condition = actor->LastDamage; + // TookDamage() + entry = target->GetMatchingTrigger(trigger_tookdamage, TEF_PROCESSED_EFFECTS); + per_round = false; break; default: - condition = 0; + condition = false; + } + + if (per_round) { + // This is a 4xxx trigger which is only checked every round. + if (Owner->AdjustedTicks % core->Time.round_size) + condition = false; + } else { + // This is a normal trigger which gets a single opportunity every frame. + condition = (entry != NULL); } if (condition) { + // The trigger was evaluated as true, cast the spells now. + // TODO: fail remaining spells if an earlier one fails? core->ApplySpell(fx->Resource, actor, Owner, fx->Power); core->ApplySpell(fx->Resource2, actor, Owner, fx->Power); core->ApplySpell(fx->Resource3, actor, Owner, fx->Power); core->ApplySpell(fx->Resource4, actor, Owner, fx->Power); + if (fx->Parameter3) { + // Contingencies only run once, remove ourselves. return FX_NOT_APPLIED; } } + return FX_APPLIED; } // 0xe9 Proficiency int fx_proficiency (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_proficiency (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_proficiency (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter2>=MAX_STATS) return FX_NOT_APPLIED; @@ -5402,7 +5486,7 @@ static EffectRef fx_contingency_ref = { "CastSpellOnCondition", -1 }; int fx_create_contingency (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_create_contingency (%2d): Level: %d, Count: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_create_contingency (%2d): Level: %d, Count: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (target->fxqueue.HasEffectWithSource(fx_contingency_ref, fx->Source)) { displaymsg->DisplayConstantStringName(STR_CONTDUP, 0xf0f0f0, target); @@ -5429,7 +5513,7 @@ int fx_create_contingency (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xeb WingBuffet int fx_wing_buffet (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_wing_buffet (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_wing_buffet (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //create movement in actor ieDword dir; @@ -5465,7 +5549,7 @@ int fx_puppet_master (Scriptable* /*Owner*/, Actor* target, Effect* fx) { const char * resref = NULL; - if (0) printf( "fx_puppet_master (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_puppet_master (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET (IE_PUPPETMASTERTYPE, fx->Parameter1); //copyself doesn't copy scripts, so the script clearing code is not needed @@ -5529,7 +5613,7 @@ int fx_puppet_master (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xed PuppetMarker int fx_puppet_marker (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_puppet_marker (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_puppet_marker (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //actually the Type is in parameter2 and the ID is in parameter1 //but for some reason the defines are in the opposite order STAT_SET (IE_PUPPETTYPE, fx->Parameter1); //cb4 - the ID of the controller @@ -5540,7 +5624,7 @@ int fx_puppet_marker (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xee Disintegrate int fx_disintegrate (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disintegrate (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_disintegrate (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (EffectQueue::match_ids( target, fx->Parameter2, fx->Parameter1) ) { //convert it to a death opcode or apply the new effect? fx->Opcode = EffectQueue::ResolveEffect(fx_death_ref); @@ -5564,7 +5648,7 @@ int fx_disintegrate (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_farsee (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_farsee (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_farsee (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); Map *map = target->GetCurrentArea(); if (!map) { return FX_APPLIED; @@ -5601,7 +5685,7 @@ int fx_farsee (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xf0 Icon:Remove int fx_remove_portrait_icon (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_portrait_icon (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_remove_portrait_icon (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->fxqueue.RemoveAllEffectsWithParam( fx_display_portrait_icon_ref, fx->Parameter2 ); return FX_NOT_APPLIED; } @@ -5612,7 +5696,7 @@ static EffectRef fx_confused_state_ref = { "State:Confused", -1 }; int fx_cure_confused_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_cure_confused_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_cure_confused_state (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); BASE_STATE_CURE( STATE_CONFUSED ); target->fxqueue.RemoveAllEffects(fx_confused_state_ref); //FIXME:oddly enough, HoW removes the confused icon @@ -5630,7 +5714,7 @@ int fx_cure_confused_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xf3 DrainItems (this is disabled in ToB) int fx_drain_items (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_drain_items (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_drain_items (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword i=fx->Parameter1; while (i--) { //deplete magic item = 0 @@ -5642,7 +5726,7 @@ int fx_drain_items (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xf4 DrainSpells int fx_drain_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_drain_spells (%2d): Count: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_drain_spells (%2d): Count: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword i=fx->Parameter1; if (fx->Parameter2) { while(i--) { @@ -5662,21 +5746,21 @@ int fx_drain_spells (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xf5 CheckForBerserk int fx_checkforberserk_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_checkforberserk_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_checkforberserk_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_CHECKFORBERSERK, fx->Parameter2 ); return FX_APPLIED; } // 0xf6 BerserkStage1Modifier int fx_berserkstage1_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_berserkstage1_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_berserkstage1_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_BERSERKSTAGE1, fx->Parameter2 ); return FX_APPLIED; } // 0xf7 BerserkStage2Modifier int fx_berserkstage2_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_berserkstage2_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_berserkstage2_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_BERSERKSTAGE2, fx->Parameter2 ); STATE_SET (STATE_BERSERK); return FX_APPLIED; @@ -5693,7 +5777,7 @@ int fx_berserkstage2_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xfa DamageLuckModifier int fx_damageluck_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damageluck_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_damageluck_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_DAMAGELUCK ); return FX_APPLIED; } @@ -5702,7 +5786,7 @@ int fx_damageluck_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_change_bardsong (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_change_bardsong (%2d): %s\n", fx->Opcode, fx->Resource); + if (0) print( "fx_change_bardsong (%2d): %s\n", fx->Opcode, fx->Resource); memcpy(target->BardSong, fx->Resource, 8); return FX_APPLIED; } @@ -5710,7 +5794,7 @@ int fx_change_bardsong (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0xfc SetTrap int fx_set_area_effect (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_set_trap (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_trap (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword skill, roll; Map *map; @@ -5771,7 +5855,7 @@ int fx_set_area_effect (Scriptable* Owner, Actor* target, Effect* fx) // 0xfd SetMapNote int fx_set_map_note (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_set_map_note (%2d): StrRef: %d Color: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_map_note (%2d): StrRef: %d Color: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); Scriptable *marker = target?target:Owner; Map *map = marker->GetCurrentArea(); if (!map) return FX_APPLIED; //delay effect @@ -5784,7 +5868,7 @@ int fx_set_map_note (Scriptable* Owner, Actor* target, Effect* fx) // 0xfe RemoveMapNote int fx_remove_map_note (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_map_note (%2d)\n", fx->Opcode); + if (0) print( "fx_remove_map_note (%2d)\n", fx->Opcode); Scriptable *marker = target?target:Owner; Map *map = marker->GetCurrentArea(); if (!map) return FX_APPLIED; //delay effect @@ -5796,7 +5880,7 @@ int fx_remove_map_note (Scriptable* Owner, Actor* target, Effect* fx) // 0xff Item:CreateDays int fx_create_item_days (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_create_item_days (%2d)\n", fx->Opcode ); + if (0) print( "fx_create_item_days (%2d)\n", fx->Opcode ); target->inventory.AddSlotItemRes( fx->Resource, SLOT_ONLYINVENTORY, fx->Parameter1, fx->Parameter3, fx->Parameter4 ); if ((fx->TimingMode&0xff) == FX_DURATION_INSTANT_LIMITED) { //if this effect has expiration, then it will remain as a remove_item @@ -5814,7 +5898,7 @@ int fx_create_item_days (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x100 Sequencer:Store int fx_store_spell_sequencer(Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_store_spell_sequencer (%2d)\n", fx->Opcode ); + if (0) print( "fx_store_spell_sequencer (%2d)\n", fx->Opcode ); //just display the spell sequencer portrait icon target->AddPortraitIcon(PI_SEQUENCER); if (fx->FirstApply && fx->Parameter3) { @@ -5831,7 +5915,7 @@ static EffectRef fx_spell_sequencer_active_ref = { "Sequencer:Store", -1 }; int fx_create_spell_sequencer(Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_create_spell_sequencer (%2d): Level: %d, Count: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_create_spell_sequencer (%2d): Level: %d, Count: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (target->fxqueue.HasEffectWithSource(fx_spell_sequencer_active_ref, fx->Source)) { displaymsg->DisplayConstantStringName(STR_SEQDUP, 0xf0f0f0, target); return FX_NOT_APPLIED; @@ -5852,7 +5936,7 @@ int fx_create_spell_sequencer(Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_activate_spell_sequencer(Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_activate_spell_sequencer (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_activate_spell_sequencer (%2d): Resource: %s\n", fx->Opcode, fx->Resource ); if (Owner->Type!=ST_ACTOR) { return FX_NOT_APPLIED; } @@ -5873,7 +5957,7 @@ int fx_activate_spell_sequencer(Scriptable* Owner, Actor* target, Effect* fx) // 0x103 SpellTrap (Protection:SpellLevelDec + recall spells) int fx_spelltrap(Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_spelltrap (%2d): Count: %d, Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_spelltrap (%2d): Count: %d, Level: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter3) { target->RestoreSpellLevel(fx->Parameter3, 0); fx->Parameter3=0; @@ -5891,21 +5975,21 @@ int fx_spelltrap(Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x138 Crash138 int fx_crash (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_crash (%2d): Param1: %d, Param2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_crash (%2d): Param1: %d, Param2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); return FX_NOT_APPLIED; } // 0x105 RestoreSpells int fx_restore_spell_level(Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_restore_spell_level (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_restore_spell_level (%2d): Level: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->RestoreSpellLevel(fx->Parameter1, fx->Parameter2); return FX_NOT_APPLIED; } // 0x106 VisualRangeModifier int fx_visual_range_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_visual_range_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_visual_range_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_VISUALRANGE ); return FX_APPLIED; } @@ -5913,7 +5997,7 @@ int fx_visual_range_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x107 BackstabModifier int fx_backstab_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_visual_range_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_visual_range_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //this is how it is done in the original engine, i don't know why they would do this //ctrl-r would probably remove it otherwise //Why they didn't fix it in the spell/item is beyond me @@ -5963,7 +6047,7 @@ int fx_modify_global_variable (Scriptable* /*Owner*/, Actor* /*target*/, Effect* strnuprcpy(fx->Resource,"RETURN_TO_LONELYWOOD",32); } - if (0) printf( "fx_modify_global_variable (%2d): Variable: %s Value: %d Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_modify_global_variable (%2d): Variable: %s Value: %d Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter2) { ieDword var = 0; //use resource memory area as variable name @@ -5979,7 +6063,7 @@ static EffectRef immunity_effect_ref = { "Protection:Spell", -1 }; int fx_remove_immunity(Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_immunity (%2d): %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_remove_immunity (%2d): %s\n", fx->Opcode, fx->Resource ); target->fxqueue.RemoveAllEffectsWithResource(immunity_effect_ref, fx->Resource); return FX_NOT_APPLIED; } @@ -5988,7 +6072,7 @@ int fx_remove_immunity(Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x10c ExploreModifier int fx_explore_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_explore_modifier (%2d)\n", fx->Opcode ); + if (0) print( "fx_explore_modifier (%2d)\n", fx->Opcode ); if (fx->Parameter2) { //gemrb modifier STAT_SET (IE_EXPLORE, fx->Parameter1); @@ -6000,7 +6084,7 @@ int fx_explore_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x10d ScreenShake int fx_screenshake (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_screenshake (%2d): Strength: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_screenshake (%2d): Strength: %d\n", fx->Opcode, fx->Parameter1 ); core->timer->SetScreenShake( fx->Parameter1, fx->Parameter1, fx->Parameter1); return FX_APPLIED; } @@ -6010,7 +6094,7 @@ static EffectRef fx_pause_caster_modifier_ref = { "PauseTarget", -1 }; int fx_unpause_caster (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_unpause_caster (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_unpause_caster (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); target->fxqueue.RemoveAllEffects(fx_pause_caster_modifier_ref); return FX_NOT_APPLIED; } @@ -6018,7 +6102,7 @@ int fx_unpause_caster (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x10f SummonDisable (bg2) int fx_summon_disable (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_disable (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_summon_disable (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET(IE_SUMMONDISABLE, 1); STAT_SET(IE_CASTERHOLD, 1); if (fx->Parameter2==1) { @@ -6038,7 +6122,7 @@ int fx_apply_effect_repeat (Scriptable* Owner, Actor* target, Effect* fx) { ieDword i; //moved here because msvc6 cannot handle it otherwise - if (0) printf( "fx_apply_effect_repeat (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_apply_effect_repeat (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); Point p(fx->PosX, fx->PosY); Effect *newfx = core->GetEffect(fx->Resource, fx->Power, p); @@ -6068,12 +6152,12 @@ int fx_apply_effect_repeat (Scriptable* Owner, Actor* target, Effect* fx) } break; case 3: //once every Param1 second - if (fx->Parameter1 && (core->GetGame()->GameTime%fx->Parameter1)) { + if (fx->Parameter1 && !(core->GetGame()->GameTime%(fx->Parameter1*AI_UPDATE_TIME))) { core->ApplyEffect(newfx, target, Owner); } break; case 4: //param3 times every Param1 second - if (fx->Parameter1 && (core->GetGame()->GameTime%fx->Parameter1)) { + if (fx->Parameter1 && !(core->GetGame()->GameTime%(fx->Parameter1*AI_UPDATE_TIME))) { for (i=0;iParameter3;i++) { core->ApplyEffect(newfx, target, Owner); } @@ -6090,7 +6174,7 @@ int fx_remove_projectile (Scriptable* /*Owner*/, Actor* target, Effect* fx) ieDword *projectilelist; //instant effect - if (0) printf( "fx_remove_projectile (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_remove_projectile (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!target) return FX_NOT_APPLIED; Map *area = target->GetCurrentArea(); @@ -6140,7 +6224,7 @@ int fx_remove_projectile (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x112 TeleportToTarget int fx_teleport_to_target (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_teleport_to_target (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_teleport_to_target (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (STATE_GET(STATE_DEAD)) { return FX_NOT_APPLIED; } @@ -6164,7 +6248,7 @@ int fx_teleport_to_target (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x113 HideInShadowsModifier int fx_hide_in_shadows_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_hide_in_shadows_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_hide_in_shadows_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_HIDEINSHADOWS ); return FX_APPLIED; } @@ -6172,7 +6256,7 @@ int fx_hide_in_shadows_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x114 DetectIllusionsModifier int fx_detect_illusion_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_detect_illusion_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_detect_illusion_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_DETECTILLUSIONS ); return FX_APPLIED; } @@ -6180,14 +6264,14 @@ int fx_detect_illusion_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x115 SetTrapsModifier int fx_set_traps_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_traps_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_set_traps_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_SETTRAPS ); return FX_APPLIED; } // 0x116 ToHitBonusModifier int fx_to_hit_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); HandleBonus( target, IE_HITBONUS, fx->Parameter1, fx->TimingMode ); return FX_APPLIED; } @@ -6198,7 +6282,7 @@ static EffectRef fx_disable_button_ref = { "DisableButton", -1 }; int fx_renable_button (Scriptable* /*Owner*/, Actor* target, Effect* fx) { //removes the disable button effect - if (0) printf( "fx_renable_button (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_renable_button (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->fxqueue.RemoveAllEffectsWithParam( fx_disable_button_ref, fx->Parameter2 ); return FX_NOT_APPLIED; } @@ -6206,7 +6290,7 @@ int fx_renable_button (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x118 ForceSurgeModifier int fx_force_surge_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_force_surge_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_force_surge_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD_VAR( IE_FORCESURGE, MOD_ABSOLUTE ); return FX_APPLIED; } @@ -6214,7 +6298,7 @@ int fx_force_surge_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x119 WildSurgeModifier int fx_wild_surge_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_wild_surge_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_wild_surge_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_SURGEMOD ); return FX_APPLIED; } @@ -6222,7 +6306,7 @@ int fx_wild_surge_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11a ScriptingState int fx_scripting_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_scripting_state (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_scripting_state (%2d): Value: %d, Stat: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //original engine didn't check boundaries, causing crashes //we allow only positive indices (some extra stats are still addressable) @@ -6237,7 +6321,7 @@ int fx_scripting_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11b ApplyEffectCurse int fx_apply_effect_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_apply_effect_curse (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_apply_effect_curse (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //this effect executes a file effect in place of this effect //the file effect inherits the target and the timingmode, but gets @@ -6272,7 +6356,7 @@ int fx_apply_effect_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11c MeleeHitModifier int fx_melee_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_melee_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_melee_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MELEETOHIT ); return FX_APPLIED; } @@ -6280,7 +6364,7 @@ int fx_melee_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11d MeleeDamageModifier int fx_melee_damage_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_melee_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_melee_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MELEEDAMAGE ); return FX_APPLIED; } @@ -6288,7 +6372,7 @@ int fx_melee_damage_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x11e MissileDamageModifier int fx_missile_damage_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_missile_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_missile_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MISSILEDAMAGE ); return FX_APPLIED; } @@ -6296,7 +6380,7 @@ int fx_missile_damage_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x11f NoCircleState int fx_no_circle_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_missile_damage_modifier (%2d)\n", fx->Opcode); + if (0) print( "fx_missile_damage_modifier (%2d)\n", fx->Opcode); STAT_SET( IE_NOCIRCLE, 1 ); return FX_APPLIED; } @@ -6304,7 +6388,7 @@ int fx_no_circle_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x120 FistHitModifier int fx_fist_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fist_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_fist_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_FISTHIT ); return FX_APPLIED; } @@ -6312,14 +6396,14 @@ int fx_fist_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x121 FistDamageModifier int fx_fist_damage_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fist_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_fist_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_FISTDAMAGE ); return FX_APPLIED; } //0x122 TitleModifier int fx_title_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fist_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_fist_damage_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter2) { STAT_SET( IE_TITLE2, fx->Parameter1 ); } else { @@ -6333,7 +6417,7 @@ int fx_title_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //make the bit correspond to it int fx_disable_overlay_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disable_overlay_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_disable_overlay_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_DISABLEOVERLAY, fx->Parameter1 ); return FX_APPLIED; } @@ -6342,7 +6426,7 @@ int fx_disable_overlay_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f //3 different games, 3 different methods of flagging this int fx_no_backstab_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_no_backstab_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_no_backstab_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //bg2 STAT_SET( IE_DISABLEBACKSTAB, fx->Parameter1 ); //how @@ -6354,7 +6438,7 @@ int fx_no_backstab_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x125 OffscreenAIModifier int fx_offscreenai_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_offscreenai_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_offscreenai_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_ENABLEOFFSCREENAI, fx->Parameter1 ); target->Activate(); return FX_APPLIED; @@ -6362,14 +6446,14 @@ int fx_offscreenai_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x126 ExistanceDelayModifier int fx_existance_delay_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_existance_delay_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_existance_delay_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_EXISTANCEDELAY, fx->Parameter1 ); return FX_APPLIED; } //0x127 DisableChunk int fx_disable_chunk_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disable_chunk_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_disable_chunk_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_DISABLECHUNKING, fx->Parameter1 ); return FX_APPLIED; } @@ -6378,7 +6462,7 @@ int fx_disable_chunk_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x128 Protection:Animation int fx_protection_from_animation (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_from_animation (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_protection_from_animation (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //remove vvc from actor if active target->RemoveVVCell(fx->Resource, false); return FX_APPLIED; @@ -6388,7 +6472,7 @@ int fx_protection_from_animation (Scriptable* /*Owner*/, Actor* target, Effect* //0x129 Protection:Turn int fx_protection_from_turn (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_non_interruptible_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_non_interruptible_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_SET( IE_NOTURNABLE, fx->Parameter1 ); return FX_APPLIED; } @@ -6399,7 +6483,7 @@ int fx_cutscene2 (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) Game *game; ieResRef resref; - if (0) printf( "fx_cutscene2 (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_cutscene2 (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (core->InCutSceneMode()) return FX_NOT_APPLIED; game = core->GetGame(); if (!game) return FX_NOT_APPLIED; @@ -6431,7 +6515,7 @@ int fx_cutscene2 (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //0x12b ChaosShieldModifier int fx_chaos_shield_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_chaos_shield_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_chaos_shield_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_ADD( IE_CHAOSSHIELD, fx->Parameter1 ); if (fx->Parameter2) { target->AddPortraitIcon(PI_CSHIELD); //162 @@ -6443,7 +6527,7 @@ int fx_chaos_shield_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x12c NPCBump int fx_npc_bump (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_npc_bump (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_npc_bump (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //unknown effect, but known stat position STAT_MOD( IE_NPCBUMP ); return FX_APPLIED; @@ -6451,14 +6535,14 @@ int fx_npc_bump (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x12d CriticalHitModifier int fx_critical_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_critical_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_critical_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_CRITICALHITBONUS ); return FX_APPLIED; } // 0x12e CanUseAnyItem int fx_can_use_any_item_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_can_use_any_item_modifier (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_can_use_any_item_modifier (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_CANUSEANYITEM, fx->Parameter2 ); return FX_APPLIED; @@ -6467,7 +6551,7 @@ int fx_can_use_any_item_modifier (Scriptable* /*Owner*/, Actor* target, Effect* // 0x12f AlwaysBackstab int fx_always_backstab_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_always_backstab_modifier (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_always_backstab_modifier (%2d): Value: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET( IE_ALWAYSBACKSTAB, fx->Parameter2 ); return FX_APPLIED; @@ -6476,7 +6560,7 @@ int fx_always_backstab_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x130 MassRaiseDead int fx_mass_raise_dead (Scriptable* Owner, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_mass_raise_dead (%2d)\n", fx->Opcode ); + if (0) print( "fx_mass_raise_dead (%2d)\n", fx->Opcode ); Game *game=core->GetGame(); @@ -6492,7 +6576,7 @@ int fx_mass_raise_dead (Scriptable* Owner, Actor* /*target*/, Effect* fx) // 0x131 OffhandHitModifier int fx_left_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_left_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_left_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_HITBONUSLEFT ); return FX_APPLIED; @@ -6501,7 +6585,7 @@ int fx_left_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x132 RightHitModifier int fx_right_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_right_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_right_to_hit_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_HITBONUSRIGHT ); return FX_APPLIED; @@ -6510,7 +6594,7 @@ int fx_right_to_hit_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x133 Reveal:Tracks int fx_reveal_tracks (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_reveal_tracks (%2d): Distance: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_reveal_tracks (%2d): Distance: %d\n", fx->Opcode, fx->Parameter1 ); Map *map = target->GetCurrentArea(); if (!map) return FX_APPLIED; if (!fx->Parameter2) { @@ -6531,7 +6615,7 @@ int fx_reveal_tracks (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x134 Protection:Tracking int fx_protection_from_tracking (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_from_tracking (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_protection_from_tracking (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_NOTRACKING ); //highlight creature??? return FX_APPLIED; @@ -6549,7 +6633,7 @@ int fx_modify_local_variable (Scriptable* /*Owner*/, Actor* target, Effect* fx) memmove(poi, fx->Resource4, 8); fx->IsVariable=1; } - if (0) printf( "fx_modify_local_variable (%2d): %s, Mod: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_modify_local_variable (%2d): %s, Mod: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); if (fx->Parameter2) { ieDword var = 0; //use resource memory area as variable name @@ -6564,7 +6648,7 @@ int fx_modify_local_variable (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 0x136 TimelessState int fx_timeless_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_timeless_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_timeless_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET(IE_DISABLETIMESTOP, fx->Parameter2); return FX_APPLIED; } @@ -6575,7 +6659,7 @@ int fx_generate_wish (Scriptable* Owner, Actor* target, Effect* fx) { ieResRef spl; - if (0) printf( "fx_generate_wish (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_generate_wish (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); if (!fx->Parameter2) { fx->Parameter2=IE_WIS; } @@ -6609,7 +6693,7 @@ int fx_generate_wish (Scriptable* Owner, Actor* target, Effect* fx) //0x138 //see fx_crash, this effect is not fully enabled in original bg2/tob int fx_immunity_sequester (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_immunity_sequester (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_immunity_sequester (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); //this effect is supposed to provide immunity against sequester (maze/etc?) STAT_SET(IE_NOSEQUESTER, fx->Parameter2); return FX_APPLIED; @@ -6619,7 +6703,7 @@ int fx_immunity_sequester (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x13a StoneSkin2Modifier int fx_golem_stoneskin_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_golem_stoneskin_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_golem_stoneskin_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter1 ); if (!fx->Parameter1) { return FX_NOT_APPLIED; } @@ -6636,7 +6720,7 @@ int fx_golem_stoneskin_modifier (Scriptable* /*Owner*/, Actor* target, Effect* f // 0x13b AvatarRemovalModifier (also 0x104 iwd) int fx_avatar_removal_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_avatar_removal_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_avatar_removal_modifier (%2d): Mod: %d\n", fx->Opcode, fx->Parameter2 ); STAT_SET(IE_AVATARREMOVAL, fx->Parameter2); return FX_APPLIED; } @@ -6644,7 +6728,7 @@ int fx_avatar_removal_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx // 0x13c MagicalRest (also 0x124 iwd) int fx_magical_rest (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_magical_rest (%2d)\n", fx->Opcode ); + if (0) print( "fx_magical_rest (%2d)\n", fx->Opcode ); //instant, full rest target->Rest(0); target->fxqueue.RemoveAllEffectsWithParam(fx_display_portrait_icon_ref, PI_FATIGUE); @@ -6661,7 +6745,7 @@ int fx_magical_rest (Scriptable* /*Owner*/, Actor* target, Effect* fx) // 3 fog int fx_change_weather (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - printf( "fx_change_weather (%2d): P1: %d\n", fx->Opcode, fx->Parameter1 ); + print( "fx_change_weather (%2d): P1: %d\n", fx->Opcode, fx->Parameter1 ); core->GetGame()->StartRainOrSnow(false, fx->Parameter1 & WB_MASK); @@ -6671,7 +6755,7 @@ int fx_change_weather (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) // unknown int fx_unknown (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - printf( "fx_unknown (%2d): P1: %d P2: %d ResRef: %s\n", fx->Opcode, fx->Parameter1, fx->Parameter2, fx->Resource ); + print( "fx_unknown (%2d): P1: %d P2: %d ResRef: %s\n", fx->Opcode, fx->Parameter1, fx->Parameter2, fx->Resource ); return FX_NOT_APPLIED; } diff --git a/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.cpp index b04942be8..59c23f7af 100644 --- a/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.cpp @@ -27,7 +27,10 @@ #include "GameData.h" #include "Interface.h" #include "MapMgr.h" -#include "System/MemoryStream.h" +#include "PluginMgr.h" +#include "TableMgr.h" +#include "Scriptable/Actor.h" +#include "System/SlicedStream.h" #include @@ -38,17 +41,14 @@ GAMImporter::GAMImporter(void) { str = NULL; - autoFree = false; } GAMImporter::~GAMImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool GAMImporter::Open(DataStream* stream, bool autoFree) +bool GAMImporter::Open(DataStream* stream) { if (stream == NULL) { return false; @@ -57,7 +57,6 @@ bool GAMImporter::Open(DataStream* stream, bool autoFree) return false; } str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "GAMEV0.0", 8 ) == 0) { @@ -319,15 +318,14 @@ Game* GAMImporter::LoadGame(Game *newGame, int ver_override) return newGame; } -void SanityCheck(ieWord a,ieWord &b,const char *message) +static void SanityCheck(ieWord a,ieWord &b,const char *message) { if (a==0xffff) { b=0xffff; return; } if (b==0xffff) { - printMessage("GAMImporter"," ",LIGHT_RED); - printf("Invalid Slot Enabler caught: %s!\n", message); + printMessage("GAMImporter", "Invalid Slot Enabler caught: %s!\n", LIGHT_RED, message); b=0; } } @@ -468,17 +466,11 @@ Actor* GAMImporter::GetActor(Holder aM, bool is_in_party ) tmpWord = is_in_party ? (pcInfo.PartyOrder + 1) : 0; if (pcInfo.OffsetToCRE) { - str->Seek( pcInfo.OffsetToCRE, GEM_STREAM_START ); - void* Buffer = malloc( pcInfo.CRESize ); - str->Read( Buffer, pcInfo.CRESize ); - //somehow autofree MemoryStream doesn't work on msvc 7.0 - //separate heap for dll's? - MemoryStream* ms = new MemoryStream( Buffer, pcInfo.CRESize, false ); + DataStream* ms = SliceStream( str, pcInfo.OffsetToCRE, pcInfo.CRESize ); if (ms) { - aM->Open( ms, true ); + aM->Open(ms); actor = aM->GetActor(tmpWord); } - free (Buffer); //torment has them as 0 or -1 if (pcInfo.Name[0]!=0 && pcInfo.Name[0]!=UNINITIALIZED_CHAR) { @@ -491,7 +483,7 @@ Actor* GAMImporter::GetActor(Holder aM, bool is_in_party ) //another plugin cannot free memory stream from this plugin //so auto free is a no-no if (ds) { - aM->Open( ds, true ); + aM->Open(ds); actor = aM->GetActor(pcInfo.PartyOrder); } } diff --git a/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.h b/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.h index fba05f0fe..d0dd5e61c 100644 --- a/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/GAMImporter/GAMImporter.h @@ -36,7 +36,6 @@ class GAMImporter : public SaveGameMgr { private: DataStream* str; - bool autoFree; int version; unsigned int PCSize; ieDword PCOffset, PCCount; @@ -51,7 +50,7 @@ private: public: GAMImporter(void); ~GAMImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Game* LoadGame(Game *newGame, int ver_override = 0); int GetStoredFileSize(Game *game); diff --git a/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.cpp b/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.cpp index d912e6ea4..4b699def6 100644 --- a/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.cpp @@ -41,19 +41,24 @@ #include "ResourceDesc.h" #include "SaveGameIterator.h" #include "Spell.h" +#include "TableMgr.h" #include "TileMap.h" #include "Video.h" #include "WorldMap.h" #include "GameScript/GSUtils.h" //checkvariable #include "GUI/Button.h" +#include "GUI/EventMgr.h" #include "GUI/GameControl.h" #include "GUI/Label.h" #include "GUI/MapControl.h" +#include "GUI/TextArea.h" #include "GUI/TextEdit.h" +#include "GUI/Window.h" #include "GUI/WorldMapControl.h" #include "Scriptable/Container.h" #include "Scriptable/Door.h" #include "Scriptable/InfoPoint.h" +#include "System/FileStream.h" #include "System/VFS.h" #include @@ -102,7 +107,7 @@ struct UsedItemType { typedef char EventNameType[17]; #define IS_DROP 0 -#define IS_GET 1 +#define IS_GET 1 typedef ieResRef ResRefPairs[2]; @@ -340,7 +345,7 @@ static CREItem *CreateCreItem(const char *ItemResRef, int Charge0, int Charge1, TmpItem->Usages[1]=(ieWord) Charge1; TmpItem->Usages[2]=(ieWord) Charge2; TmpItem->Flags=0; - if (core->ResolveRandomItem(TmpItem) && gamedata->Exists(TmpItem->ItemResRef, IE_ITM_CLASS_ID)) { + if (core->ResolveRandomItem(TmpItem)) { return TmpItem; } /* item couldn't be resolved */ @@ -620,8 +625,8 @@ static PyObject* GemRB_LoadWindowPack(PyObject * /*self*/, PyObject* args) if ( (width && (width>core->Width)) || (height && (height>core->Height)) ) { - printMessage("GUIScript","Screen is too small!\n",LIGHT_RED); - printf("This window requires %d x %d resolution.\n",width,height); + printMessage("GUIScript", "Screen is too small!\nThis window requires %d x %d resolution.\n", LIGHT_RED, + width, height); return RuntimeError("Please change your settings."); } Py_INCREF( Py_None ); @@ -1393,7 +1398,6 @@ static PyObject* GemRB_Control_SetText(PyObject * /*self*/, PyObject* args) PyObject* wi, * ci, * str; long WindowIndex, ControlIndex, StrRef; char* string; - int ret; if (!PyArg_UnpackTuple( args, "ref", 3, 3, &wi, &ci, &str )) { return AttributeError( GemRB_Control_SetText__doc ); @@ -1408,29 +1412,29 @@ static PyObject* GemRB_Control_SetText(PyObject * /*self*/, PyObject* args) WindowIndex = PyInt_AsLong( wi ); ControlIndex = PyInt_AsLong( ci ); + Control *ctrl = GetControl(WindowIndex, ControlIndex, -1); + if (!ctrl) { + return RuntimeError("Invalid Control"); + } + if (PyObject_TypeCheck( str, &PyString_Type )) { string = PyString_AsString( str ); if (string == NULL) { return RuntimeError("Null string received"); } - ret = core->SetText( (ieWord) WindowIndex, (ieWord) ControlIndex, string ); - if (ret == -1) { - return RuntimeError("Cannot set text"); - } + ctrl->SetText(string); } else { StrRef = PyInt_AsLong( str ); if (StrRef == -1) { - ret = core->SetText( (ieWord) WindowIndex, (ieWord) ControlIndex, GEMRB_STRING ); + ctrl->SetText(GEMRB_STRING); } else { char *tmpstr = core->GetString( StrRef ); - ret = core->SetText( (ieWord) WindowIndex, (ieWord) ControlIndex, tmpstr ); + ctrl->SetText(tmpstr); core->FreeString( tmpstr ); } - if (ret == -1) { - return RuntimeError("Cannot set text"); - } } - return PyInt_FromLong( ret ); + Py_INCREF(Py_None); + return Py_None; } PyDoc_STRVAR( GemRB_TextArea_Append__doc, @@ -3394,8 +3398,8 @@ static PyObject* GemRB_Button_SetPLT(PyObject * /*self*/, PyObject* args) gamedata->GetFactoryResource( ResRef, IE_BAM_CLASS_ID, IE_NORMAL ); if (!af) { - printMessage("GUISCript","PLT/BAM not found for ref: ",YELLOW); - printf("%s\n", ResRef); + printMessage("GUISCript", "PLT/BAM not found for ref: %s\n", YELLOW, + ResRef); textcolor(WHITE); if (type == 0) return NULL; @@ -3407,13 +3411,13 @@ static PyObject* GemRB_Button_SetPLT(PyObject * /*self*/, PyObject* args) Picture = af->GetPaperdollImage(col[0]==0xFFFFFFFF?0:col, Picture2,(unsigned int)type); if (Picture == NULL) { - printf ("Picture == NULL\n"); + print ("Picture == NULL\n"); return NULL; } } else { Picture = im->GetSprite2D(type, col); if (Picture == NULL) { - printf ("Picture == NULL\n"); + print ("Picture == NULL\n"); return NULL; } } @@ -3526,7 +3530,7 @@ static PyObject* GemRB_Control_SetAnimationPalette(PyObject * /*self*/, PyObject } PyDoc_STRVAR( GemRB_Control_SetAnimation__doc, -"SetAnimation(WindowIndex, ControlIndex, BAMResRef[, Cycle])\n\n" +"SetAnimation(WindowIndex, ControlIndex, BAMResRef[, Cycle, Blend])\n\n" "Sets the animation of a Control (usually a Button) from a BAM file. Optionally an animation cycle could be set too."); static PyObject* GemRB_Control_SetAnimation(PyObject * /*self*/, PyObject* args) @@ -3534,8 +3538,9 @@ static PyObject* GemRB_Control_SetAnimation(PyObject * /*self*/, PyObject* args) int wi, ci; char *ResRef; int Cycle = 0; + int Blend = 0; - if (!PyArg_ParseTuple( args, "iis|i", &wi, &ci, &ResRef, &Cycle )) { + if (!PyArg_ParseTuple( args, "iis|ii", &wi, &ci, &ResRef, &Cycle, &Blend )) { return AttributeError( GemRB_Control_SetAnimation__doc ); } @@ -3548,7 +3553,8 @@ static PyObject* GemRB_Control_SetAnimation(PyObject * /*self*/, PyObject* args) if (ctl->animation) { //if this control says the resource is the same //we wanted to set, we don't reset it - if(ctl->animation->SameResource(ResRef, Cycle)) { + //but we must reinitialize it, if it was play once + if(ctl->animation->SameResource(ResRef, Cycle) && !(ctl->Flags&IE_GUI_BUTTON_PLAYONCE)) { Py_INCREF( Py_None ); return Py_None; } @@ -3564,6 +3570,9 @@ static PyObject* GemRB_Control_SetAnimation(PyObject * /*self*/, PyObject* args) ControlAnimation* anim = new ControlAnimation( ctl, ResRef, Cycle ); + if (Blend) { + anim->SetBlend(true); + } anim->UpdateAnimation(); Py_INCREF( Py_None ); @@ -3814,8 +3823,8 @@ static PyObject* GemRB_CheckVar(PyObject * /*self*/, PyObject* args) return NULL; } long value =(long) CheckVariable(Sender, Variable, Context); - printMessage("GUISCript"," ",YELLOW); - printf("%s %s=%ld\n",Context, Variable, value); + printMessage("GUISCript", "%s %s=%ld\n", YELLOW, + Context, Variable, value); textcolor(WHITE); return PyInt_FromLong( value ); } @@ -5215,9 +5224,12 @@ static PyObject* GemRB_FillPlayerInfo(PyObject * /*self*/, PyObject* args) } int mastertable = gamedata->LoadTable( "avprefix" ); Holder mtm = gamedata->GetTable( mastertable ); + if (!mtm) { + return RuntimeError("Couldn't load avprefix table."); + } int count = mtm->GetRowCount(); if (count< 1 || count>8) { - return RuntimeError("Table is invalid." ); + return RuntimeError("avprefix table contains no entries." ); } const char *poi = mtm->QueryField( 0 ); // the base animation id @@ -5227,6 +5239,9 @@ static PyObject* GemRB_FillPlayerInfo(PyObject * /*self*/, PyObject* args) poi = mtm->QueryField( i ); int table = gamedata->LoadTable( poi ); Holder tm = gamedata->GetTable( table ); + if (!tm) { + return RuntimeError("Couldn't load an avprefix table."); + } int StatID = atoi( tm->QueryField() ); StatID = MyActor->GetBase( StatID ); poi = tm->QueryField( StatID ); @@ -5266,8 +5281,8 @@ PyObject *SetSpellIcon(int wi, int ci, const ieResRef SpellResRef, int type, int Spell* spell = gamedata->GetSpell( SpellResRef, 1 ); if (spell == NULL) { btn->SetPicture( NULL ); - printMessage( "GUIScript", " ", LIGHT_RED); - printf("Spell not found :%.8s", SpellResRef ); + printMessage("GUIScript", "Spell not found :%.8s", LIGHT_RED, + SpellResRef); //no incref here! return Py_None; } @@ -5485,9 +5500,7 @@ PyDoc_STRVAR( GemRB_LeaveStore__doc, static PyObject* GemRB_LeaveStore(PyObject * /*self*/, PyObject* /*args*/) { - if (core->CloseCurrentStore() ) { - return RuntimeError("Cannot save store!"); - } + core->CloseCurrentStore(); core->ResetEventFlag(EF_OPENSTORE); core->SetEventFlag(EF_PORTRAIT); Py_INCREF( Py_None ); @@ -5593,6 +5606,10 @@ static PyObject* GemRB_GetContainerItem(PyObject * /*self*/, PyObject* args) PyDict_SetItemString(dict, "Flags", PyInt_FromLong (ci->Flags)); Item *item = gamedata->GetItem( ci->ItemResRef ); + if (!item) { + Py_INCREF( Py_None ); + return Py_None; + } bool identified = ci->Flags & IE_INV_ITEM_IDENTIFIED; PyDict_SetItemString(dict, "ItemName", PyInt_FromLong( (signed) item->GetItemName( identified )) ); @@ -5860,8 +5877,8 @@ static PyObject* GemRB_IsValidStoreItem(PyObject * /*self*/, PyObject* args) } Item *item = gamedata->GetItem( ItemResRef ); if (!item) { - printMessage("GUIScript", " ", LIGHT_RED); - printf("Invalid resource reference: %s\n", ItemResRef); + printMessage("GUIScript", "Invalid resource reference: %s\n", LIGHT_RED, + ItemResRef); return PyInt_FromLong(0); } @@ -6069,8 +6086,6 @@ static PyObject* GemRB_ChangeStoreItem(PyObject * /*self*/, PyObject* args) if (!si->Expired && (si->Flags& IE_INV_ITEM_RESELLABLE)) { si->Flags &= ~IE_INV_ITEM_SELECTED; store->AddItem( si ); - STOItem *s = store->GetItem(store->FindItem(si->ItemResRef, true)); - s->AmountInStock++; } delete si; res = ASI_SUCCESS; @@ -6139,7 +6154,7 @@ static PyObject* GemRB_GetStoreItem(PyObject * /*self*/, PyObject* args) //calculate depreciation too //store->DepreciationRate, mount - if (item->StackAmount>1) { + if (item->MaxStackAmount>1) { price *= si->Usages[0]; } //is this correct? @@ -6336,9 +6351,9 @@ static PyObject* GemRB_EvaluateString(PyObject * /*self*/, PyObject* args) GET_GAME(); if (GameScript::EvaluateString( game->GetCurrentArea( ), String )) { - printf( "%s returned True\n", String ); + print( "%s returned True\n", String ); } else { - printf( "%s returned False\n", String ); + print( "%s returned False\n", String ); } Py_INCREF( Py_None ); return Py_None; @@ -6487,14 +6502,19 @@ PyDoc_STRVAR( GemRB_GetKnownSpell__doc, static PyObject* GemRB_GetKnownSpell(PyObject * /*self*/, PyObject* args) { - int PartyID, SpellType, Level, Index; + int PartyID, SpellType, Level, Index, global = 0; - if (!PyArg_ParseTuple( args, "iiii", &PartyID, &SpellType, &Level, &Index )) { + if (!PyArg_ParseTuple( args, "iiii|i", &PartyID, &SpellType, &Level, &Index, &global )) { return AttributeError( GemRB_GetKnownSpell__doc ); } GET_GAME(); - Actor* actor = game->FindPC( PartyID ); + Actor* actor; + if (global) { + actor = game->GetActorByGlobalID( PartyID ); + } else { + actor = game->FindPC( PartyID ); + } if (!actor) { return RuntimeError( "Actor not found!\n" ); } @@ -6513,7 +6533,7 @@ static PyObject* GemRB_GetKnownSpell(PyObject * /*self*/, PyObject* args) PyDoc_STRVAR( GemRB_GetMemorizedSpellsCount__doc, -"GetMemorizedSpellsCount(PartyID, SpellType[, Level, global])=>int\n\n" +"GetMemorizedSpellsCount(PartyID, SpellType, Level, castable[, global])=>int\n\n" "Returns number of spells of given type and level in PartyID's memory. " "If level is omitted then it returns the number of distinct spells memorised.\n" "If global is set, the actor will be looked up by its global ID instead of party slot."); @@ -6522,8 +6542,9 @@ static PyObject* GemRB_GetMemorizedSpellsCount(PyObject * /*self*/, PyObject* ar { int PartyID, SpellType, Level = -1; int global = 0; + bool castable; - if (!PyArg_ParseTuple( args, "ii|ii", &PartyID, &SpellType, &Level, &global )) { + if (!PyArg_ParseTuple( args, "iiii|i", &PartyID, &SpellType, &Level, &castable, &global )) { return AttributeError( GemRB_GetMemorizedSpellsCount__doc ); } GET_GAME(); @@ -6539,9 +6560,13 @@ static PyObject* GemRB_GetMemorizedSpellsCount(PyObject * /*self*/, PyObject* ar } if (Level<0) { - return PyInt_FromLong( actor->spellbook.GetSpellInfoSize( SpellType ) ); + if (castable) { + return PyInt_FromLong( actor->spellbook.GetSpellInfoSize( SpellType ) ); + } else { + return PyInt_FromLong( actor->spellbook.GetMemorizedSpellsCount( SpellType, false ) ); + } } else { - return PyInt_FromLong( actor->spellbook.GetMemorizedSpellsCount( SpellType, Level ) ); + return PyInt_FromLong( actor->spellbook.GetMemorizedSpellsCount( SpellType, Level, castable ) ); } } @@ -7020,7 +7045,7 @@ static PyObject* GemRB_GetItem(PyObject * /*self*/, PyObject* args) PyDict_SetItemString(dict, "ItemIcon", PyString_FromResRef (item->ItemIcon)); PyDict_SetItemString(dict, "DescIcon", PyString_FromResRef (item->DescriptionIcon)); PyDict_SetItemString(dict, "BrokenItem", PyString_FromResRef (item->ReplacementItem)); - PyDict_SetItemString(dict, "StackAmount", PyInt_FromLong (item->StackAmount)); + PyDict_SetItemString(dict, "MaxStackAmount", PyInt_FromLong (item->MaxStackAmount)); PyDict_SetItemString(dict, "Dialog", PyString_FromResRef (item->Dialog)); PyDict_SetItemString(dict, "DialogName", PyInt_FromLong ((signed)item->DialogName)); PyDict_SetItemString(dict, "Price", PyInt_FromLong (item->Price)); @@ -7383,17 +7408,8 @@ static PyObject* GemRB_DropDraggedItem(PyObject * /*self*/, PyObject* args) //release it only when fully placed if (res==ASI_SUCCESS) { core->ReleaseDraggedItem (); - } else { - // res == ASI_PARTIAL - // swap the items, so the existing one ends up being filled; - // the items are the same, so we just need to adjust the usage count - int usages = slotitem->Usages[0]; - CREItem *itm = actor->inventory.GetSlotItem(Slot); - if (itm) { - slotitem->Usages[0] = itm->Usages[0]; - itm->Usages[0] = usages; - } } + // res == ASI_PARTIAL //EquipItem (in AddSlotItem) already called RefreshEffects actor->ReinitQuickSlots(); //couldn't place item there, try swapping (only if slot is explicit) @@ -7600,7 +7616,7 @@ static PyObject* GemRB_SetMapDoor(PyObject * /*self*/, PyObject* args) GET_GAME(); GET_MAP(); - + Door *door = map->TMap->GetDoor(DoorName); if (!door) { return RuntimeError( "No such door!" ); @@ -8227,6 +8243,10 @@ static PyObject* GemRB_Window_SetupEquipmentIcons(PyObject * /*self*/, PyObject* if (item->UseIcon[0]) { Picture = gamedata->GetBAMSprite(item->UseIcon, 1, 0); + // try cycle 0 if cycle 1 doesn't exist + // (needed for e.g. sppr707b which is used by Daystar's Sunray) + if (!Picture) + Picture = gamedata->GetBAMSprite(item->UseIcon, 0, 0); } if (!Picture) { @@ -8282,6 +8302,9 @@ PyDoc_STRVAR( GemRB_Window_SetupSpellIcons__doc, "Offset is the ID of the first usable button.\n" "If global is set, the actor will be looked up by its global ID instead of party slot."); +//order is: mage, cleric, innate, class, song, (defaults to 1, item) +static int sections[]={2,4,8,16,16}; + static PyObject* GemRB_Window_SetupSpellIcons(PyObject * /*self*/, PyObject* args) { int wi, slot, Type; @@ -8341,6 +8364,7 @@ static PyObject* GemRB_Window_SetupSpellIcons(PyObject * /*self*/, PyObject* arg // but only if there are any spells of that type to disable int disabled_spellcasting = actor->GetStat(IE_CASTING); +//print("disable bits: %d\n", disabled_spellcasting); for (i=0;ispellname)/1000; - if (core->CheckSpecialSpell(spell->spellname, actor) || (disabled_spellcasting&(1<type>4?1:sections[spell->type]; + +//print("%s %d %d %s\n", spell->spellname, spell->type, type, (disabled_spellcasting&type) ? "disabled":"enabled" ); + if (core->CheckSpecialSpell(spell->spellname, actor) || (disabled_spellcasting&type) ) { btn->SetState(IE_GUI_BUTTON_DISABLED); btn->EnableBorder(1, IE_GUI_BUTTON_DISABLED); PyObject *Function = PyDict_GetItemString(dict, "UpdateActionsWindow"); @@ -8468,7 +8494,7 @@ static PyObject* GemRB_Window_SetupControls(PyObject * /*self*/, PyObject* args) for (int i=0;iGetControl(wi, i+Start); if (ci<0) { - printf("Couldn't find button #%d on Window #%d\n", i+Start, wi); + print("Couldn't find button #%d on Window #%d\n", i+Start, wi); return RuntimeError ("No such control!\n"); } int action = myrow[i]; @@ -8495,7 +8521,7 @@ static PyObject* GemRB_Window_SetupControls(PyObject * /*self*/, PyObject* args) } else { type = IE_SPELL_TYPE_INNATE; } - if (!actor->spellbook.GetMemorizedSpellsCount(type)) { + if (!actor->spellbook.GetMemorizedSpellsCount(type, true)) { state = IE_GUI_BUTTON_DISABLED; } break; @@ -8618,6 +8644,11 @@ static PyObject* GemRB_Window_SetupControls(PyObject * /*self*/, PyObject* args) ieResRef *poi = &actor->PCStats->QuickSpells[action-ACT_QSPELL1]; if ((*poi)[0]) { SetSpellIcon(wi, ci, *poi, 1, 1, i+1); + int mem = actor->spellbook.GetMemorizedSpellsCount(*poi, -1, true); + if (!mem) { + state = IE_GUI_BUTTON_DISABLED; + } + SetItemText(wi, ci, mem, true); } } break; @@ -8734,6 +8765,53 @@ static PyObject* GemRB_SetDefaultActions(PyObject * /*self*/, PyObject* args) return Py_None; } + +PyDoc_STRVAR( GemRB_SetupQuickSpell__doc, +"SetupQuickSpell(PartyID, spellslot, spellindex, type[, global])=>int\n\n" +"Set up a quick spell slot of a PC.\n\n" +"If global is set, the actor will be looked up by its global ID instead of party slot." +"It also returns the target type of the selected spell."); + +static PyObject* GemRB_SetupQuickSpell(PyObject * /*self*/, PyObject* args) +{ + SpellExtHeader spelldata; + int PartyID, which, slot, type; + int global = 0; + + if (!PyArg_ParseTuple( args, "iiii|i", &PartyID, &slot, &which, &type, &global )) { + return AttributeError( GemRB_SetupQuickSpell__doc ); + } + + GET_GAME(); + + Actor* actor; + if (global) { + actor = game->GetActorByGlobalID( PartyID ); + } else { + actor = game->FindPC( PartyID ); + } + if (!actor) { + return RuntimeError( "Actor not found!\n" ); + } + + if (!actor->PCStats) { + //no quick slots for this actor, is this an error? + //return RuntimeError( "Actor has no quickslots!\n" ); + Py_INCREF( Py_None ); + return Py_None; + } + + actor->spellbook.GetSpellInfo(&spelldata, type, which, 1); + if (!spelldata.spellname[0]) { + return RuntimeError( "Invalid parameter!\n" ); + } + + memcpy(actor->PCStats->QuickSpells[slot], spelldata.spellname, sizeof(ieResRef) ); + actor->PCStats->QuickSpellClass[slot] = type; + + return PyInt_FromLong( spelldata.Target ); +} + PyDoc_STRVAR( GemRB_SetupQuickSlot__doc, "SetupQuickSlot(PartyID, quickslot, inventoryslot[, headerindex, global])\n\n" "Set up a quick slot or weapon slot of a PC to use a weapon ability.\n\n" @@ -8950,17 +9028,30 @@ static PyObject* GemRB_SpellCast(PyObject * /*self*/, PyObject* args) } SpellExtHeader spelldata; // = SpellArray[spell]; - actor->spellbook.GetSpellInfo(&spelldata, type, spell, 1); - printf("Cast spell: %s\n", spelldata.spellname); - printf("Slot: %d\n", spelldata.slot); - printf("Type: %d\n", spelldata.type); + if (type==-2) { + //resolve quick spell slot + if (!actor->PCStats) { + //no quick slots for this actor, is this an error? + //return RuntimeError( "Actor has no quickslots!\n" ); + Py_INCREF( Py_None ); + return Py_None; + } + //quick spell type is available in actor->PCStats->QuickSpellClasses, if needed + actor->spellbook.FindSpellInfo(&spelldata, actor->PCStats->QuickSpells[spell]); + } else { + actor->spellbook.GetSpellInfo(&spelldata, type, spell, 1); + } + + print("Cast spell: %s\n", spelldata.spellname); + print("Slot: %d\n", spelldata.slot); + print("Type: %d\n", spelldata.type); //cannot make this const, because it will be freed char *tmp = core->GetString(spelldata.strref); - printf("Spellname: %s\n", tmp); + print("Spellname: %s\n", tmp); core->FreeString(tmp); - printf("Target: %d\n", spelldata.Target); - printf("Range: %d\n", spelldata.Range); + print("Target: %d\n", spelldata.Target); + print("Range: %d\n", spelldata.Range); if(! (1<GetVideoDriver()->ToggleFullscreenMode(fullscreen); + core->GetVideoDriver()->SetFullscreenMode(fullscreen); Py_INCREF( Py_None ); return Py_None; } @@ -9463,7 +9554,8 @@ static PyObject* GemRB_StealFailed(PyObject * /*self*/, PyObject* /*args*/) //not sure if this is ok //owner->LastAttacker = attacker->GetID(); - owner->LastDisarmFailed = attacker->GetGlobalID(); + //owner->LastDisarmFailed = attacker->GetGlobalID(); + owner->AddTrigger(TriggerEntry(trigger_stealfailed, attacker->GetGlobalID())); Py_INCREF( Py_None ); return Py_None; } @@ -10140,6 +10232,7 @@ static PyMethodDef GemRBMethods[] = { METHOD(SetTooltipDelay, METH_VARARGS), METHOD(SetupMaze, METH_VARARGS), METHOD(SetupQuickSlot, METH_VARARGS), + METHOD(SetupQuickSpell, METH_VARARGS), METHOD(SetVar, METH_VARARGS), METHOD(SoftEndPL, METH_NOARGS), METHOD(SpellCast, METH_VARARGS), @@ -10349,7 +10442,7 @@ bool GUIScript::Init(void) sprintf( string, "import sys" ); if (PyRun_SimpleString( string ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } @@ -10366,20 +10459,20 @@ bool GUIScript::Init(void) // Add generic script path early, so GameType detection works sprintf( string, "sys.path.append(\"%s\")", QuotePath( quoted, path )); if (PyRun_SimpleString( string ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } sprintf( string, "import GemRB\n"); if (PyRun_SimpleString( "import GemRB" ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } // FIXME: better would be to add GemRB.GetGamePath() or some such sprintf( string, "GemRB.GamePath = \"%s\"", QuotePath( quoted, core->GamePath )); if (PyRun_SimpleString( string ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } @@ -10396,15 +10489,15 @@ bool GUIScript::Init(void) } // GameType-specific import path must have a higher priority than - // the generic one, so insert it before it + // the generic one, so insert it before it sprintf( string, "sys.path.insert(-1, \"%s\")", QuotePath( quoted, path2 )); if (PyRun_SimpleString( string ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } sprintf( string, "GemRB.GameType = \"%s\"", core->GameType); if (PyRun_SimpleString( string ) == -1) { - printMessage( "GUIScript", string, RED ); + printMessage( "GUIScript", "%s", RED, string ); return false; } @@ -10416,20 +10509,18 @@ bool GUIScript::Init(void) #endif if (PyRun_SimpleString( "from GUIDefines import *" ) == -1) { - printMessage( "GUIScript", " ", RED ); - printf("Check if %s/GUIDefines.py exists! ", path); + printMessage("GUIScript", "Check if %s/GUIDefines.py exists! ", RED, path); return false; } if (PyRun_SimpleString( "from GUIClasses import *" ) == -1) { - printMessage( "GUIScript", " ", RED ); - printf("Check if %s/GUIClasses.py exists! ", path); + printMessage("GUIScript", "Check if %s/GUIClasses.py exists! ", RED, path); return false; } if (PyRun_SimpleString( "from GemRB import *" ) == -1) { printMessage( "GUIScript", " ", RED ); - printf("builtin GemRB module failed to load!!! "); + print("builtin GemRB module failed to load!!! "); return false; } @@ -10469,7 +10560,7 @@ bool GUIScript::Autodetect(void) const char *dirent = iter.GetName(); char module[_MAX_PATH]; - //printf("DE: %s\n", dirent); + //print("DE: %s\n", dirent); if (iter.IsDirectory() && dirent[0] != '.') { // NOTE: these methods subtly differ in sys.path content, need for __init__.py files ... // Method1: @@ -10498,8 +10589,7 @@ bool GUIScript::LoadScript(const char* filename) if (!Py_IsInitialized()) { return false; } - printMessage( "GUIScript", "Loading Script ", WHITE ); - printf( "%s...", filename ); + printMessage("GUIScript", "Loading Script %s...", WHITE, filename); char path[_MAX_PATH]; strcpy( path, filename ); @@ -10544,8 +10634,7 @@ PyObject *GUIScript::CallbackFunction(const char* fname, PyObject* pArgs) PyObject *pFunc = PyDict_GetItemString( pDict, (char *) fname ); /* pFunc: Borrowed reference */ if (( !pFunc ) || ( !PyCallable_Check( pFunc ) )) { - printMessage("GUIScript", " ", LIGHT_RED); - printf("%s is not callable!\n", fname); + printMessage("GUIScript", "%s is not callable!\n", LIGHT_RED, fname); return NULL; } PyObject *pValue = PyObject_CallObject( pFunc, pArgs ); @@ -10580,8 +10669,7 @@ bool GUIScript::RunFunction(const char *ModuleName, const char* FunctionName, bo /* pFunc: Borrowed reference */ if (( !pFunc ) || ( !PyCallable_Check( pFunc ) )) { if (error) { - printMessage( "GUIScript", "Missing function:", LIGHT_RED ); - printf("%s\n", FunctionName); + printMessage("GUIScript", "Missing function:%s\n", LIGHT_RED, FunctionName); } Py_DECREF(module); return false; @@ -10609,7 +10697,7 @@ bool GUIScript::RunFunction(const char *ModuleName, const char* FunctionName, bo void GUIScript::ExecFile(const char* file) { FileStream fs; - if (!fs.Open(file, true)) + if (!fs.Open(file)) return; int len = fs.Remains(); @@ -10677,3 +10765,4 @@ PyObject* GUIScript::ConstructObject(const char* type, PyObject* pArgs) GEMRB_PLUGIN(0x1B01BE6B, "GUI Script Engine (Python)") PLUGIN_CLASS(IE_GUI_SCRIPT_CLASS_ID, GUIScript) END_PLUGIN() + diff --git a/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.h b/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.h index 05d8bfdfa..4ea183b3f 100644 --- a/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.h +++ b/project/jni/application/gemrb/gemrb/plugins/GUIScript/GUIScript.h @@ -52,7 +52,7 @@ public: /** Load Script */ bool LoadScript(const char* filename); /** Run Function */ - bool RunFunction(const char *module, const char* fname, bool error=true, int intparam=-1); + bool RunFunction(const char *module, const char* fname, bool report_error=true, int intparam=-1); /** Exec a single File */ void ExecFile(const char* file); /** Exec a single String */ diff --git a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.cpp index 254582b62..e22815eb8 100644 --- a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.cpp @@ -29,31 +29,20 @@ IDSImporter::IDSImporter(void) { - str = NULL; - autoFree = false; } IDSImporter::~IDSImporter(void) { - if (str && autoFree) { - delete( str ); - } - for (unsigned int i = 0; i < ptrs.size(); i++) { free( ptrs[i] ); } } -bool IDSImporter::Open(DataStream* stream, bool autoFree) +bool IDSImporter::Open(DataStream* str) { - if (stream == NULL) { + if (str == NULL) { return false; } - if (str) { - return false; - } - str = stream; - this->autoFree = autoFree; str->CheckEncrypted(); char tmp[11]; @@ -89,6 +78,7 @@ bool IDSImporter::Open(DataStream* stream, bool autoFree) } } + delete str; return true; } diff --git a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.h b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.h index d91daf238..815117331 100644 --- a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporter.h @@ -23,6 +23,8 @@ #include "SymbolMgr.h" +#include + struct Pair { int val; char* str; @@ -30,16 +32,13 @@ struct Pair { class IDSImporter : public SymbolMgr { private: - DataStream* str; - bool autoFree; - std::vector< Pair> pairs; std::vector< char*> ptrs; public: IDSImporter(void); ~IDSImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); int GetValue(const char* txt) const; char* GetValue(int val) const; char* GetStringIndex(unsigned int Index) const; diff --git a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporterDefs.h b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporterDefs.h index 68e4af858..450325e59 100644 --- a/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporterDefs.h +++ b/project/jni/application/gemrb/gemrb/plugins/IDSImporter/IDSImporterDefs.h @@ -29,9 +29,3 @@ #define HEADER_BLANK 3 #define HEADER_RECORD 4 #define HEADER_ERROR -1 - -// need to transfer this to a header file in the includes dir: -//#define IDS_VALUE_NOT_LOCATED -65535 // GetValue returns this if text is not found in arrays ... this needs to be a unique number that does not exist in the value[] array - -// need to transfer this to a header file in the includes dir too: -//#define GEM_ENCRYPTION_KEY "\x88\xa8\x8f\xba\x8a\xd3\xb9\xf5\xed\xb1\xcf\xea\xaa\xe4\xb5\xfb\xeb\x82\xf9\x90\xca\xc9\xb5\xe7\xdc\x8e\xb7\xac\xee\xf7\xe0\xca\x8e\xea\xca\x80\xce\xc5\xad\xb7\xc4\xd0\x84\x93\xd5\xf0\xeb\xc8\xb4\x9d\xcc\xaf\xa5\x95\xba\x99\x87\xd2\x9d\xe3\x91\xba\x90\xca" diff --git a/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.cpp index e2b252a16..c73a376e0 100644 --- a/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.cpp @@ -26,29 +26,19 @@ INIImporter::INIImporter(void) { - str = NULL; - autoFree = false; } INIImporter::~INIImporter(void) { - if (str && autoFree) { - delete( str ); - } for (unsigned int i = 0; i < tags.size(); i++) delete( tags[i] ); } -bool INIImporter::Open(DataStream* stream, bool autoFree) +bool INIImporter::Open(DataStream* str) { - if (stream == NULL) { + if (str == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } - str = stream; - this->autoFree = autoFree; int cnt = 0; char* strbuf = ( char* ) malloc( 4097 ); INITag* lastTag = NULL; @@ -79,12 +69,13 @@ bool INIImporter::Open(DataStream* stream, bool autoFree) if (lastTag == NULL) continue; if (lastTag->AddLine( strbuf )) { - printMessage("INIImporter","", LIGHT_RED); - printf("Bad Line in file: %s, Section: [%s], Entry: '%s'\n", stream->filename, lastTag->GetTagName(), strbuf); + printMessage("INIImporter", "Bad Line in file: %s, Section: [%s], Entry: '%s'\n", LIGHT_RED, + str->filename, lastTag->GetTagName(), strbuf); } } while (true); free( strbuf ); + delete str; return true; } diff --git a/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.h b/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.h index 46c03206f..1fb8a6dc2 100644 --- a/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/INIImporter/INIImporter.h @@ -26,6 +26,7 @@ #include "globals.h" #include +#include struct INIPair { char* Name, * Value; @@ -180,14 +181,12 @@ public: class INIImporter : public DataFileMgr { private: - DataStream* str; - bool autoFree; std::vector< INITag*> tags; public: INIImporter(void); ~INIImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); int GetTagsCount() const { return ( int ) tags.size(); diff --git a/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.cpp index 742528a5a..66e22cdd9 100644 --- a/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.cpp @@ -24,31 +24,26 @@ #include "EffectMgr.h" #include "Interface.h" +#include "PluginMgr.h" ITMImporter::ITMImporter(void) { str = NULL; - autoFree = false; } ITMImporter::~ITMImporter(void) { - if (autoFree) { - delete str; - } + delete str; str = NULL; } -bool ITMImporter::Open(DataStream* stream, bool autoFree) +bool ITMImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (this->autoFree) { - delete str; - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "ITM V1 ", 8 ) == 0) { @@ -58,7 +53,7 @@ bool ITMImporter::Open(DataStream* stream, bool autoFree) } else if (strncmp( Signature, "ITM V2.0", 8 ) == 0) { version = 20; } else { - printf( "[ITMImporter]: This file is not a valid ITM File\n" ); + print( "[ITMImporter]: This file is not a valid ITM File\n" ); return false; } @@ -103,7 +98,7 @@ Item* ITMImporter::GetItem(Item *s) str->Read( &s->MinCharisma, 1 ); str->Read( &s->unknown3, 1 ); str->ReadDword( &s->Price ); - str->ReadWord( &s->StackAmount ); + str->ReadWord( &s->MaxStackAmount ); str->ReadResRef( s->ItemIcon ); str->ReadWord( &s->LoreToID ); str->ReadResRef( s->GroundIcon ); @@ -162,7 +157,7 @@ Item* ITMImporter::GetItem(Item *s) if (!core->IsAvailable( IE_BAM_CLASS_ID )) { - printf( "[ITMImporter]: No BAM Importer Available.\n" ); + print( "[ITMImporter]: No BAM Importer Available.\n" ); return NULL; } return s; diff --git a/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.h b/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.h index c188a5cc4..d1572493c 100644 --- a/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/ITMImporter/ITMImporter.h @@ -34,13 +34,12 @@ class ITMImporter : public ItemMgr { private: DataStream* str; - bool autoFree; int version; public: ITMImporter(void); ~ITMImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Item* GetItem(Item *s); private: void GetExtHeader(Item *s, ITMExtHeader* eh); diff --git a/project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp b/project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp index e55f6364a..59c80ee25 100644 --- a/project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp @@ -551,7 +551,7 @@ static inline void HandleBonus(Actor *target, int stat, int mod, int mode) // fx_ac_vs_damage_type_modifier_iwd2 int fx_ac_vs_damage_type_modifier_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_ac_vs_damage_type_modifier_iwd2 (%2d): AC Modif: %d ; Type: %d ; MinLevel: %d ; MaxLevel: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2, (int) fx->DiceSides, (int) fx->DiceThrown ); + if (0) print( "fx_ac_vs_damage_type_modifier_iwd2 (%2d): AC Modif: %d ; Type: %d ; MinLevel: %d ; MaxLevel: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2, (int) fx->DiceSides, (int) fx->DiceThrown ); //check level was pulled outside as a common functionality //CHECK_LEVEL(); @@ -601,7 +601,7 @@ int fx_ac_vs_damage_type_modifier_iwd2 (Scriptable* /*Owner*/, Actor* target, Ef // only the special type of 0 means a flat bonus int fx_damage_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damage_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_damage_bonus_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: @@ -631,7 +631,7 @@ int fx_damage_bonus_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) // in bg2 the effect is called: HolyNonCumulative int fx_draw_upon_holy_might (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_draw_upon_holy_might (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_draw_upon_holy_might (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (target->SetSpellState( SS_HOLYMIGHT)) return FX_NOT_APPLIED; STAT_ADD( IE_STR, fx->Parameter1); @@ -676,7 +676,7 @@ int fx_ironskins (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xe8 Colour:FadeRGB int fx_fade_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fade_rgb (%2d): RGB:%x\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_fade_rgb (%2d): RGB:%x\n", fx->Opcode, fx->Parameter1 ); int speed = (fx->Parameter2 >> 16) & 0xFF; target->SetColorMod(0xff, RGBModifier::ADD, speed, @@ -689,7 +689,7 @@ int fx_fade_rgb (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xe9 IWDVisualSpellHit int fx_iwd_visual_spell_hit (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_iwd_visual_spell_hit (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_iwd_visual_spell_hit (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (!Owner) { return FX_NOT_APPLIED; } @@ -713,7 +713,7 @@ int fx_iwd_visual_spell_hit (Scriptable* Owner, Actor* target, Effect* fx) //0xea ColdDamage (how) int fx_cold_damage (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_cold_damage (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_cold_damage (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); target->Damage(fx->Parameter1, DAMAGE_COLD, Owner); return FX_NOT_APPLIED; } @@ -725,7 +725,7 @@ int fx_cold_damage (Scriptable* Owner, Actor* target, Effect* fx) //it is the usual iwd/how style hack int fx_chill_touch (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_chill_touch (%2d)\n", fx->Opcode); + if (0) print( "fx_chill_touch (%2d)\n", fx->Opcode); target->Damage(fx->Parameter1, DAMAGE_COLD, Owner); if (STAT_GET(IE_GENERAL)==GEN_UNDEAD) { target->Panic(Owner, PANIC_RUNAWAY); @@ -737,7 +737,7 @@ int fx_chill_touch (Scriptable* Owner, Actor* target, Effect* fx) //the undead check is made by IDS targeting as it should be int fx_chill_touch_panic (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_chill_touch_panic (%2d)\n", fx->Opcode); + if (0) print( "fx_chill_touch_panic (%2d)\n", fx->Opcode); ieDword state; if (fx->Parameter2) { @@ -760,7 +760,7 @@ int fx_chill_touch_panic (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xed CrushingDamage (how) int fx_crushing_damage (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_crushing_damage (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_crushing_damage (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); target->Damage(fx->Parameter1, DAMAGE_CRUSHING, Owner); return FX_NOT_APPLIED; } @@ -768,7 +768,7 @@ int fx_crushing_damage (Scriptable* Owner, Actor* target, Effect* fx) //0xee SaveBonus int fx_save_bonus (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_save_bonus (%2d): Bonus %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_save_bonus (%2d): Bonus %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_SAVEVSDEATH ); STAT_MOD( IE_SAVEVSWANDS ); STAT_MOD( IE_SAVEVSPOLY ); @@ -787,7 +787,7 @@ int fx_slow_poison (Scriptable* /*Owner*/, Actor* target, Effect* fx) ieDword my_opcode; if (fx->Parameter2) my_opcode = EffectQueue::ResolveEffect(fx_wound_ref); else my_opcode = EffectQueue::ResolveEffect(fx_poison_ref); - if (0) printf( "fx_slow_poison (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_slow_poison (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); std::list< Effect* >::const_iterator f=target->fxqueue.GetFirstEffect(); Effect *poison; //this is intentionally an assignment @@ -827,7 +827,7 @@ ieResRef iwd_monster_2da[IWD_MSC]={"MSUMMO1","MSUMMO2","MSUMMO3","MSUMMO4", //0xf0 IWDMonsterSummoning int fx_iwd_monster_summoning (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_iwd_monster_summoning (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_iwd_monster_summoning (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); //check the summoning limit? @@ -851,7 +851,7 @@ int fx_iwd_monster_summoning (Scriptable* Owner, Actor* target, Effect* fx) //0xf1 VampiricTouch int fx_vampiric_touch (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_vampiric_touch (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_vampiric_touch (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); if (Owner->Type!=ST_ACTOR) { return FX_NOT_APPLIED; } @@ -882,7 +882,7 @@ ieResRef animate_dead_2da[IWD_AD]={"ADEAD","ADEADL"}; //0xf3 AnimateDead int fx_animate_dead (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_animate_dead (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_animate_dead (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); //check the summoning limit? if (!target) { return FX_NOT_APPLIED; @@ -911,7 +911,7 @@ int fx_animate_dead (Scriptable* Owner, Actor* target, Effect* fx) //f4 Prayer int fx_prayer (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_prayer (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_prayer (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); ieDword value; if (fx->Parameter2) @@ -939,7 +939,7 @@ int fx_prayer (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xf5 int fx_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_curse (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_curse (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (target->SetSpellState(SS_BADPRAYER)) return FX_NOT_APPLIED; EXTSTATE_SET(EXTSTATE_PRAYER_BAD); STAT_ADD( IE_TOHIT, -1); @@ -959,7 +959,7 @@ ieResRef summon_monster_2da[IWD_SM2]={"SLIZARD","STROLLS","SSHADOW","ISTALKE", int fx_summon_monster2 (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_monster2 (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_summon_monster2 (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); ieResRef monster; ieResRef hit; @@ -981,7 +981,7 @@ int fx_summon_monster2 (Scriptable* Owner, Actor* target, Effect* fx) //0xf7 BurningBlood (iwd) int fx_burning_blood (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_burning_blood (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_burning_blood (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1003,7 +1003,7 @@ int fx_burning_blood (Scriptable* Owner, Actor* target, Effect* fx) //0xf7 BurningBlood2 (how, iwd2) int fx_burning_blood2 (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_burning_blood2 (%2d): Count: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_burning_blood2 (%2d): Count: %d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1039,7 +1039,7 @@ ieResRef summon_shadow_monster_2da[IWD_SM2]={"SMONSTE","DSMONST","SHADES" }; int fx_summon_shadow_monster (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_shadow_monster (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_summon_shadow_monster (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); ieResRef monster; ieResRef hit; @@ -1060,7 +1060,7 @@ int fx_summon_shadow_monster (Scriptable* Owner, Actor* target, Effect* fx) //0xf9 Recitation int fx_recitation (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_recitation (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_recitation (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); ieDword value; if (fx->Parameter2) @@ -1088,7 +1088,7 @@ int fx_recitation (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xfa RecitationBad int fx_recitation_bad (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_recitation (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_recitation (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (target->SetSpellState(SS_BADRECIT)) return FX_NOT_APPLIED; EXTSTATE_SET(EXTSTATE_REC_BAD); STAT_ADD( IE_TOHIT, -2); @@ -1106,7 +1106,7 @@ static EffectRef fx_hold_creature_ref = { "State:Hold", -1 }; int fx_lich_touch (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_lich_touch (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_lich_touch (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (STAT_GET(IE_GENERAL)==GEN_UNDEAD) { return FX_NOT_APPLIED; } @@ -1153,7 +1153,7 @@ int fx_blinding_orb (Scriptable* Owner, Actor* target, Effect* fx) //0xfe RemoveEffects int fx_remove_effects (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_effects (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_remove_effects (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); switch(fx->Parameter2) { case 1: @@ -1171,7 +1171,7 @@ int fx_remove_effects (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xff SalamanderAura int fx_salamander_aura (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_salamander_aura (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); + if (0) print( "fx_salamander_aura (%2d): ResRef:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Parameter2 ); //inflicts damage calculated by dice values+parameter1 //creates damage opcode on everyone around. fx->Parameter2 - 0 fire, 1 - ice @@ -1205,14 +1205,14 @@ static EffectRef fx_immunity_resource_ref = { "Protection:Spell", -1 }; int fx_umberhulk_gaze (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_umberhulk_gaze (%2d): Duration: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_umberhulk_gaze (%2d): Duration: %d\n", fx->Opcode, fx->Parameter1); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { return FX_NOT_APPLIED; } fx->TimingMode=FX_DURATION_AFTER_EXPIRES; - fx->Duration=core->GetGame()->GameTime+7*15; + fx->Duration=core->GetGame()->GameTime+7*AI_UPDATE_TIME; //build effects to apply Effect * newfx1, *newfx2; @@ -1265,14 +1265,14 @@ static EffectRef fx_fear_ref = { "State:Panic", -1 }; int fx_zombielord_aura (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_zombie_lord_aura (%2d): Duration: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_zombie_lord_aura (%2d): Duration: %d\n", fx->Opcode, fx->Parameter1); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { return FX_NOT_APPLIED; } fx->TimingMode=FX_DURATION_AFTER_EXPIRES; - fx->Duration=core->GetGame()->GameTime+7*15; + fx->Duration=core->GetGame()->GameTime+7*AI_UPDATE_TIME; //build effects to apply Effect * newfx1, *newfx2; @@ -1321,7 +1321,7 @@ static int eamods[]={EAM_DEFAULT,EAM_SOURCEALLY,EAM_SOURCEENEMY}; int fx_summon_creature2 (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_creature2 (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_summon_creature2 (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); if (!target) { return FX_NOT_APPLIED; @@ -1360,7 +1360,7 @@ int fx_avatar_removal (Scriptable* /*Owner*/, Actor* target, Effect* /*fx*/) int fx_summon_pomab (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_summon_pomab (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_summon_pomab (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); if (!target) { return FX_NOT_APPLIED; @@ -1403,7 +1403,7 @@ int fx_summon_pomab (Scriptable* Owner, Actor* target, Effect* fx) //425 ControlUndead2 int fx_control_undead (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_control_undead (%2d): General: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_control_undead (%2d): General: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (fx->Parameter1 && (STAT_GET(IE_GENERAL)!=fx->Parameter1)) { return FX_NOT_APPLIED; } @@ -1451,7 +1451,7 @@ int fx_control_undead (Scriptable* Owner, Actor* target, Effect* fx) //0x108 StaticCharge int fx_static_charge(Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_static_charge (%2d): Count: %d \n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_static_charge (%2d): Count: %d \n", fx->Opcode, fx->Parameter1 ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1466,7 +1466,7 @@ int fx_static_charge(Scriptable* Owner, Actor* target, Effect* fx) //timing fx->TimingMode=FX_DURATION_DELAY_PERMANENT; - fx->Duration=core->GetGame()->GameTime+70*15; + fx->Duration=core->GetGame()->GameTime+70*AI_UPDATE_TIME; fx->Parameter1--; //iwd2 style @@ -1487,7 +1487,7 @@ static EffectRef fx_umberhulk_gaze_ref = { "UmberHulkGaze", -1 }; int fx_cloak_of_fear(Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_cloak_of_fear (%2d): Count: %d \n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_cloak_of_fear (%2d): Count: %d \n", fx->Opcode, fx->Parameter1 ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1500,7 +1500,7 @@ int fx_cloak_of_fear(Scriptable* Owner, Actor* target, Effect* fx) //timing (set up next fire) fx->TimingMode=FX_DURATION_DELAY_PERMANENT; - fx->Duration=core->GetGame()->GameTime+3*15; + fx->Duration=core->GetGame()->GameTime+3*AI_UPDATE_TIME; fx->Parameter1--; //iwd2 style @@ -1535,7 +1535,7 @@ int fx_cloak_of_fear(Scriptable* Owner, Actor* target, Effect* fx) //0x10c EyeOfTheMind int fx_eye_of_the_mind (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_the_mind (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_the_mind (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYEMIND)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_MIND); @@ -1547,7 +1547,7 @@ int fx_eye_of_the_mind (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x10d EyeOfTheSword int fx_eye_of_the_sword (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_the_sword (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_the_sword (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYESWORD)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_SWORD); @@ -1560,7 +1560,7 @@ int fx_eye_of_the_sword (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x10e EyeOfTheMage int fx_eye_of_the_mage (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_the_mage (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_the_mage (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYEMAGE)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_MAGE); @@ -1573,7 +1573,7 @@ int fx_eye_of_the_mage (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x10f EyeOfVenom int fx_eye_of_venom (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_venom (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_venom (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYEVENOM)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_VENOM); @@ -1586,7 +1586,7 @@ int fx_eye_of_venom (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x110 EyeOfTheSpirit int fx_eye_of_the_spirit (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_the_spirit (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_the_spirit (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYESPIRIT)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_SPIRIT); @@ -1599,7 +1599,7 @@ int fx_eye_of_the_spirit (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x111 EyeOfFortitude int fx_eye_of_fortitude (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_fortitude (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_fortitude (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYEFORTITUDE)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_FORT); @@ -1612,7 +1612,7 @@ int fx_eye_of_fortitude (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x112 EyeOfStone int fx_eye_of_stone (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_eye_of_stone (%2d)\n", fx->Opcode ); + if (0) print( "fx_eye_of_stone (%2d)\n", fx->Opcode ); if (target->SetSpellState( SS_EYESTONE)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_EYE_STONE); @@ -1626,7 +1626,7 @@ int fx_eye_of_stone (Scriptable* /*Owner*/, Actor* target, Effect* fx) int fx_remove_seven_eyes (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_seven_eyes (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_remove_seven_eyes (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); target->spellbook.RemoveSpell(SevenEyes[EYE_MIND]); target->spellbook.RemoveSpell(SevenEyes[EYE_SWORD]); target->spellbook.RemoveSpell(SevenEyes[EYE_MAGE]); @@ -1640,7 +1640,7 @@ int fx_remove_seven_eyes (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x114 RemoveEffect int fx_remove_effect (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_remove_effect (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_remove_effect (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); if (fx->Resource[0]) { target->fxqueue.RemoveAllEffectsWithResource(fx->Parameter2, fx->Resource); @@ -1659,7 +1659,7 @@ static EffectRef fx_dex_ref = { "DexterityModifier", -1 }; //0x115 SoulEater int fx_soul_eater (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_soul_eater (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_soul_eater (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); // Soul Eater has no effect on undead, constructs, and elemental creatures, // but this is handled in the spells via fx_resist_spell_and_message int damage = fx->Parameter1; @@ -1703,7 +1703,7 @@ int fx_soul_eater (Scriptable* Owner, Actor* target, Effect* fx) //FIXME: maybe it is cheaper to port effsof1/2 to how than having an alternate effect int fx_shroud_of_flame (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_shroud_of_flame (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_shroud_of_flame (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1749,7 +1749,7 @@ static ieResRef resref_sof2={"effsof2"}; //0x116 ShroudOfFlame (iwd2) int fx_shroud_of_flame2 (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_shroud_of_flame2 (%2d)\n", fx->Opcode ); + if (0) print( "fx_shroud_of_flame2 (%2d)\n", fx->Opcode ); //if the target is dead, this effect ceases to exist if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { @@ -1789,7 +1789,7 @@ int fx_shroud_of_flame2 (Scriptable* Owner, Actor* target, Effect* fx) //0x117 AnimalRage int fx_animal_rage (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_animal_rage (%2d): Mode: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_animal_rage (%2d): Mode: %d\n", fx->Opcode, fx->Parameter2 ); //param2==1 sets only the spell state if (fx->Parameter2) { @@ -1844,7 +1844,7 @@ int fx_animal_rage (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x118 TurnUndead how int fx_turn_undead (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_turn_undead (%2d): Level %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_turn_undead (%2d): Level %d\n", fx->Opcode, fx->Parameter1 ); if (fx->Parameter1) { target->Turn(Owner, fx->Parameter1); } else { @@ -1859,26 +1859,26 @@ int fx_turn_undead (Scriptable* Owner, Actor* target, Effect* fx) //0x118 TurnUndead2 iwd2 int fx_turn_undead2 (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_turn_undead2 (%2d): Level: %d Type %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_turn_undead2 (%2d): Level: %d Type %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: //command - target->LastTurner = Owner->GetGlobalID(); + target->AddTrigger(TriggerEntry(trigger_turnedby, Owner->GetGlobalID())); target->Panic(Owner, PANIC_RUNAWAY); break; case 1://rebuke + target->AddTrigger(TriggerEntry(trigger_turnedby, Owner->GetGlobalID())); if (target->SetSpellState(SS_REBUKED)) { //display string rebuked } STAT_SUB(IE_ARMORCLASS,4); - target->LastTurner = Owner->GetGlobalID(); break; case 2://destroy - target->LastTurner = Owner->GetGlobalID(); + target->AddTrigger(TriggerEntry(trigger_turnedby, Owner->GetGlobalID())); target->Die(Owner); break; case 3://panic - target->LastTurner = Owner->GetGlobalID(); + target->AddTrigger(TriggerEntry(trigger_turnedby, Owner->GetGlobalID())); target->Panic(Owner, PANIC_RUNAWAY); break; default://depends on caster @@ -1898,7 +1898,7 @@ int fx_turn_undead2 (Scriptable* Owner, Actor* target, Effect* fx) //0x119 VitriolicSphere int fx_vitriolic_sphere (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_vitriolic_sphere (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_vitriolic_sphere (%2d): Damage %d\n", fx->Opcode, fx->Parameter1 ); //timing if (core->GetGame()->GameTime%6) { return FX_APPLIED; @@ -1916,7 +1916,7 @@ int fx_vitriolic_sphere (Scriptable* Owner, Actor* target, Effect* fx) //0x11a SuppressHP int fx_suppress_hp (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_suppress_hp (%2d)\n", fx->Opcode); + if (0) print( "fx_suppress_hp (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_NOHPINFO)) return FX_APPLIED; EXTSTATE_SET(EXTSTATE_NO_HP); return FX_APPLIED; @@ -1925,7 +1925,7 @@ int fx_suppress_hp (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0x11b FloatText int fx_floattext (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_floattext (%2d): StrRef:%d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_floattext (%2d): StrRef:%d Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 1: @@ -1969,7 +1969,7 @@ static EffectRef fx_iwd_visual_spell_hit_ref = { "IWDVisualSpellHit", -1 }; int fx_mace_of_disruption (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_mace_of_disruption (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_mace_of_disruption (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); ieDword race = STAT_GET(IE_RACE); //golem / outer planar gets hit int chance = 0; @@ -2031,7 +2031,7 @@ int fx_mace_of_disruption (Scriptable* Owner, Actor* target, Effect* fx) //0x120 State:Set int fx_set_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_set_state (%2d): Type: %d\n", fx->Opcode, fx->Parameter2 ); //in IWD2 we have 176 states (original had 256) target->SetSpellState(fx->Parameter2); //in HoW this sets only the 10 last bits of extstate (until it runs out of bits) @@ -2047,7 +2047,7 @@ int fx_set_state (Scriptable* /*Owner*/, Actor* target, Effect* fx) //ToB has an effect which actually runs a hardcoded cutscene int fx_cutscene (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_cutscene (%2d)\n", fx->Opcode ); + if (0) print( "fx_cutscene (%2d)\n", fx->Opcode ); Game *game = core->GetGame(); game->locals->SetAt("GEM_ACTIVE", 1); return FX_NOT_APPLIED; @@ -2113,7 +2113,7 @@ int fx_resist_spell_and_message (Scriptable* Owner, Actor* target, Effect *fx) //otherwise: nothing int fx_rod_of_smithing (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_rod_of_smithing (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); + if (0) print( "fx_rod_of_smithing (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); int damage = 0; int five_percent = core->Roll(1,100,0)<5; @@ -2152,7 +2152,7 @@ int fx_rod_of_smithing (Scriptable* Owner, Actor* target, Effect* fx) //TODO: range, affected actors int fx_beholder_dispel_magic (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_beholder_dispel_magic (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_beholder_dispel_magic (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); if (!fx->Resource[0]) { strcpy(fx->Resource,"SPIN164"); } @@ -2180,7 +2180,7 @@ int fx_beholder_dispel_magic (Scriptable* Owner, Actor* target, Effect* fx) //TODO: range, affected actors, sound effect int fx_harpy_wail (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_harpy_wail (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_harpy_wail (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); if (!fx->Resource[0]) { strcpy(fx->Resource,"SPIN166"); } @@ -2212,7 +2212,7 @@ int fx_harpy_wail (Scriptable* Owner, Actor* target, Effect* fx) //TODO: range, affected actors int fx_jackalwere_gaze (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_jackalwere_gaze (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (0) print( "fx_jackalwere_gaze (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); if (!fx->Resource[0]) { strcpy(fx->Resource,"SPIN179"); } @@ -2241,7 +2241,7 @@ int fx_jackalwere_gaze (Scriptable* Owner, Actor* target, Effect* fx) //0x12a UseMagicDevice int fx_use_magic_device_modifier (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_use_magic_device_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_use_magic_device_modifier (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); STAT_MOD( IE_MAGICDEVICE ); return FX_APPLIED; } @@ -2263,7 +2263,7 @@ int fx_use_magic_device_modifier (Scriptable* /*Owner*/, Actor* target, Effect* //Create the effect which will contain the spell hit projectile and the cycle change command int fx_alter_animation (Scriptable* Owner, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_alter_animation (%2d)\n", fx->Opcode); + if (0) print( "fx_alter_animation (%2d)\n", fx->Opcode); Map *map = Owner->GetCurrentArea(); if (!map) { return FX_NOT_APPLIED; @@ -2308,7 +2308,7 @@ int fx_alter_animation (Scriptable* Owner, Actor* /*target*/, Effect* fx) //400 Hopelessness int fx_hopelessness (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_hopelessness (%2d)\n", fx->Opcode); + if (0) print( "fx_hopelessness (%2d)\n", fx->Opcode); if (target->HasSpellState(SS_BLOODRAGE)) { return FX_NOT_APPLIED; @@ -2323,7 +2323,7 @@ int fx_hopelessness (Scriptable* /*Owner*/, Actor* target, Effect* fx) //401 ProtectionFromEvil int fx_protection_from_evil (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_from_evil (%2d)\n", fx->Opcode); + if (0) print( "fx_protection_from_evil (%2d)\n", fx->Opcode); // if (target->SetSpellState( SS_PROTFROMEVIL)) return FX_APPLIED; target->AddPortraitIcon(PI_PROTFROMEVIL); @@ -2352,7 +2352,7 @@ int fx_add_effects_list (Scriptable* Owner, Actor* target, Effect* fx) //403 ArmorOfFaith static int fx_armor_of_faith (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_armor_of_faith (%2d) Amount: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_armor_of_faith (%2d) Amount: %d\n", fx->Opcode, fx->Parameter1); if (target->SetSpellState( SS_ARMOROFFAITH)) return FX_APPLIED; if (!fx->Parameter1) { fx->Parameter1=1; @@ -2378,7 +2378,7 @@ static EffectRef fx_unconscious_state_ref = { "State:Helpless", -1 }; int fx_nausea (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_nausea (%2d)\n", fx->Opcode); + if (0) print( "fx_nausea (%2d)\n", fx->Opcode); //FIXME: i'm not sure if this part is there //create the sleep effect only once? if (!fx->Parameter3 && Owner) { @@ -2401,7 +2401,7 @@ int fx_nausea (Scriptable* Owner, Actor* target, Effect* fx) //minimum stats in 3rd ed are 1, so this effect won't kill the target int fx_enfeeblement (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_enfeeblement (%2d)\n", fx->Opcode); + if (0) print( "fx_enfeeblement (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_ENFEEBLED)) return FX_APPLIED; target->AddPortraitIcon(PI_ENFEEBLEMENT); STAT_ADD(IE_STR, -15); @@ -2411,7 +2411,7 @@ int fx_enfeeblement (Scriptable* /*Owner*/, Actor* target, Effect* fx) //406 FireShield int fx_fireshield (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_fireshield (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_fireshield (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); if (fx->Parameter2) { if (target->SetSpellState( SS_ICESHIELD)) return FX_APPLIED; target->AddPortraitIcon(PI_ICESHIELD); @@ -2426,7 +2426,7 @@ int fx_fireshield (Scriptable* /*Owner*/, Actor* target, Effect* fx) //407 DeathWard int fx_death_ward (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_death_ward (%2d)\n", fx->Opcode); + if (0) print( "fx_death_ward (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_DEATHWARD)) return FX_APPLIED; target->AddPortraitIcon(PI_DEATHWARD); // is it ok? @@ -2436,7 +2436,7 @@ int fx_death_ward (Scriptable* /*Owner*/, Actor* target, Effect* fx) //408 HolyPower int fx_holy_power (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_holy_power (%2d)\n", fx->Opcode); + if (0) print( "fx_holy_power (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_HOLYPOWER)) return FX_APPLIED; if (enhanced_effects) { @@ -2449,7 +2449,7 @@ int fx_holy_power (Scriptable* /*Owner*/, Actor* target, Effect* fx) //409 RighteousWrath int fx_righteous_wrath (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_righteous_wrath (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_righteous_wrath (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); if (fx->Parameter2) { if (target->SetSpellState( SS_RIGHTEOUS2)) return FX_APPLIED; @@ -2496,7 +2496,7 @@ int fx_control (Scriptable* Owner, Actor* target, Effect* fx) //prot from evil deflects it if (target->fxqueue.HasEffect(fx_protection_from_evil_ref)) return FX_NOT_APPLIED; - if (0) printf( "fx_control (%2d)\n", fx->Opcode); + if (0) print( "fx_control (%2d)\n", fx->Opcode); bool enemyally = true; if (Owner->Type==ST_ACTOR) { enemyally = ((Actor *) Owner)->GetStat(IE_EA)>EA_GOODCUTOFF; //or evilcutoff? @@ -2527,7 +2527,7 @@ int fx_control (Scriptable* Owner, Actor* target, Effect* fx) int fx_visual_effect_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) { // - if (0) printf( "fx_visual_effect_iwd2 (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_visual_effect_iwd2 (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); unsigned int type = fx->Parameter2; if (type<32) { switch(type) { @@ -2560,7 +2560,7 @@ int fx_visual_effect_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) //414 ResilientSphere int fx_resilient_sphere (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_resilient_sphere (%2d)\n", fx->Opcode); + if (0) print( "fx_resilient_sphere (%2d)\n", fx->Opcode); target->SetSpellState(SS_HELD|SS_RESILIENT); STATE_SET(STATE_HELPLESS); if (enhanced_effects) { @@ -2573,7 +2573,7 @@ int fx_resilient_sphere (Scriptable* /*Owner*/, Actor* target, Effect* fx) //415 Barkskin int fx_barkskin (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_barkskin (%2d)\n", fx->Opcode); + if (0) print( "fx_barkskin (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_BARKSKIN)) return FX_APPLIED; int bonus; @@ -2597,7 +2597,7 @@ int fx_barkskin (Scriptable* /*Owner*/, Actor* target, Effect* fx) //416 BleedingWounds int fx_bleeding_wounds (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_bleeding_wounds (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_bleeding_wounds (%2d): Damage: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); //also this effect is executed every update ieDword damage; @@ -2639,7 +2639,7 @@ seconds: int fx_area_effect (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_area_effect (%2d) Radius: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2); + if (0) print( "fx_area_effect (%2d) Radius: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2); //this effect ceases to affect dead targets (probably on frozen and stoned too) Game *game = core->GetGame(); @@ -2691,7 +2691,7 @@ int fx_area_effect (Scriptable* Owner, Actor* target, Effect* fx) //418 FreeAction2 int fx_free_action_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_free_action_iwd2 (%2d)\n", fx->Opcode); + if (0) print( "fx_free_action_iwd2 (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_FREEACTION)) return FX_APPLIED; // immunity to the following effects, coded in the effects: @@ -2712,7 +2712,7 @@ int fx_free_action_iwd2 (Scriptable* /*Owner*/, Actor* target, Effect* fx) //same as the sleep effect, but different icon int fx_unconsciousness (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_unconsciousness (%2d): Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_unconsciousness (%2d): Type: %d\n", fx->Opcode, fx->Parameter2); STATE_SET(STATE_HELPLESS|STATE_SLEEP); if (fx->Parameter2) { target->SetSpellState(SS_NOAWAKE); @@ -2729,7 +2729,7 @@ int fx_unconsciousness (Scriptable* /*Owner*/, Actor* target, Effect* fx) //421 EntropyShield int fx_entropy_shield (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_entropy_shield (%2d)\n", fx->Opcode); + if (0) print( "fx_entropy_shield (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_ENTROPY)) return FX_APPLIED; if (!fx->Resource[0]) { strnuprcpy(fx->Resource, "entropy", sizeof(ieResRef)-1); @@ -2754,7 +2754,7 @@ int fx_entropy_shield (Scriptable* /*Owner*/, Actor* target, Effect* fx) //422 StormShell int fx_storm_shell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_storm_shell (%2d)\n", fx->Opcode); + if (0) print( "fx_storm_shell (%2d)\n", fx->Opcode); if (target->SetSpellState(SS_STORMSHELL)) return FX_APPLIED; STAT_ADD(IE_RESISTFIRE, 15); STAT_ADD(IE_RESISTCOLD, 15); @@ -2769,7 +2769,7 @@ int fx_storm_shell (Scriptable* /*Owner*/, Actor* target, Effect* fx) //423 ProtectionFromElements int fx_protection_from_elements (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_protection_from_elements (%2d)\n", fx->Opcode); + if (0) print( "fx_protection_from_elements (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_ELEMPROT)) return FX_APPLIED; target->AddPortraitIcon(PI_ELEMPROT); STAT_ADD(IE_RESISTFIRE, 15); @@ -2793,7 +2793,7 @@ int fx_aegis (Scriptable* /*Owner*/, Actor* target, Effect* fx) { ieDword tmp; - if (0) printf( "fx_aegis (%2d)\n", fx->Opcode); + if (0) print( "fx_aegis (%2d)\n", fx->Opcode); //gives immunity against: //0xda stoneskin //0x9a entangle @@ -2844,7 +2844,7 @@ int fx_aegis (Scriptable* /*Owner*/, Actor* target, Effect* fx) //427 ExecutionerEyes int fx_executioner_eyes (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_executioner_eyes (%2d)\n", fx->Opcode); + if (0) print( "fx_executioner_eyes (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_EXECUTIONER)) return FX_APPLIED; STAT_ADD(IE_CRITICALHITBONUS, 4); @@ -2864,7 +2864,7 @@ int fx_executioner_eyes (Scriptable* /*Owner*/, Actor* target, Effect* fx) //430 ProjectileUseEffectList int fx_projectile_use_effect_list (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_projectile_use_effect_list (%2d) Type: %d Spell:%s\n", fx->Opcode, fx->Parameter2, fx->Resource); + if (0) print( "fx_projectile_use_effect_list (%2d) Type: %d Spell:%s\n", fx->Opcode, fx->Parameter2, fx->Resource); if (!Owner) { return FX_NOT_APPLIED; @@ -2897,7 +2897,7 @@ int fx_projectile_use_effect_list (Scriptable* Owner, Actor* target, Effect* fx) int fx_energy_drain (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_energy_drain (%2d) Type: %d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_energy_drain (%2d) Type: %d\n", fx->Opcode, fx->Parameter1); if (!fx->Parameter1) { return FX_NOT_APPLIED; } @@ -2922,7 +2922,7 @@ int fx_energy_drain (Scriptable* /*Owner*/, Actor* target, Effect* fx) //432 TortoiseShell int fx_tortoise_shell (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_tortoise_shell (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_tortoise_shell (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); if (target->SetSpellState( SS_TORTOISE)) return FX_NOT_APPLIED; if (enhanced_effects) { target->AddPortraitIcon(PI_TORTOISE); @@ -2934,7 +2934,7 @@ int fx_tortoise_shell (Scriptable* /*Owner*/, Actor* target, Effect* fx) //433 Blink int fx_blink (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_blink (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_blink (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); if (target->SetSpellState( SS_BLINK)) return FX_APPLIED; @@ -2968,7 +2968,7 @@ int fx_blink (Scriptable* /*Owner*/, Actor* target, Effect* fx) //434 PersistentUseEffectList int fx_persistent_use_effect_list (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_persistent_use_effect_list (%2d) Interval: %d Resource: %.8s\n", fx->Opcode, fx->Parameter1, fx->Resource); + if (0) print( "fx_persistent_use_effect_list (%2d) Interval: %d Resource: %.8s\n", fx->Opcode, fx->Parameter1, fx->Resource); if (fx->Parameter3) { fx->Parameter3--; } else { @@ -2981,7 +2981,7 @@ int fx_persistent_use_effect_list (Scriptable* Owner, Actor* target, Effect* fx) //435 DayBlindness int fx_day_blindness (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_day_blindness (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_day_blindness (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); if (target->SetSpellState(SS_DAYBLINDNESS)) return FX_NOT_APPLIED; // medium hack (better than original) // the original used explicit race/subrace values @@ -3005,7 +3005,7 @@ int fx_day_blindness (Scriptable* Owner, Actor* target, Effect* fx) //436 DamageReduction int fx_damage_reduction (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_damage_reduction (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_damage_reduction (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); STAT_SET(IE_RESISTSLASHING, fx->Parameter2*5); STAT_SET(IE_RESISTCRUSHING, fx->Parameter2*5); STAT_SET(IE_RESISTPIERCING, fx->Parameter2*5); @@ -3016,7 +3016,7 @@ int fx_damage_reduction (Scriptable* /*Owner*/, Actor* target, Effect* fx) //modifies character animations to look like clerics of same gender/race int fx_disguise (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_disguise (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); + if (0) print( "fx_disguise (%2d) Amount: %d\n", fx->Opcode, fx->Parameter2); ieDword anim = BASE_GET(IE_ANIMATION_ID); if (anim>=0x6000 || anim<=0x6fff) { STAT_SET(IE_ANIMATION_ID, anim&0x600f); @@ -3034,7 +3034,7 @@ int fx_disguise (Scriptable* /*Owner*/, Actor* target, Effect* fx) //438 HeroicInspiration int fx_heroic_inspiration (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_heroic_inspiration (%2d)\n", fx->Opcode); + if (0) print( "fx_heroic_inspiration (%2d)\n", fx->Opcode); //+1 to all saves STAT_ADD( IE_SAVEFORTITUDE, 1); @@ -3052,7 +3052,7 @@ int fx_heroic_inspiration (Scriptable* /*Owner*/, Actor* target, Effect* fx) //440 BarbarianRage int fx_barbarian_rage (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_barbarian_rage (%2d) Amount:%d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_barbarian_rage (%2d) Amount:%d\n", fx->Opcode, fx->Parameter1); //TODO: implement this return FX_APPLIED; } @@ -3064,7 +3064,7 @@ int fx_barbarian_rage (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //443 MissileDamageReduction int fx_missile_damage_reduction (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_missile_damage_reduction (%2d) Amount:%d\n", fx->Opcode, fx->Parameter1); + if (0) print( "fx_missile_damage_reduction (%2d) Amount:%d\n", fx->Opcode, fx->Parameter1); STAT_SET(IE_RESISTMISSILE, fx->Parameter1); //TODO: didn't set the pluses return FX_APPLIED; @@ -3073,7 +3073,7 @@ int fx_missile_damage_reduction (Scriptable* /*Owner*/, Actor* target, Effect* f //444 TensersTransformation int fx_tenser_transformation (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_tenser_transformation (%2d)\n", fx->Opcode); + if (0) print( "fx_tenser_transformation (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_TENSER)) return FX_APPLIED; STAT_SUB(IE_ARMORCLASS, 2); @@ -3088,7 +3088,7 @@ int fx_tenser_transformation (Scriptable* /*Owner*/, Actor* target, Effect* fx) //446 SmiteEvil int fx_smite_evil (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_smite_evil (%2d)\n", fx->Opcode); + if (0) print( "fx_smite_evil (%2d)\n", fx->Opcode); target->SetSpellState(SS_SMITEEVIL); return FX_NOT_APPLIED; } @@ -3102,7 +3102,7 @@ static EffectRef fx_cha_ref = { "CharismaModifier", -1 }; int fx_restoration (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_restoration (%2d)\n", fx->Opcode); + if (0) print( "fx_restoration (%2d)\n", fx->Opcode); target->fxqueue.RemoveAllEffectsWithParam(fx_disease_ref, 4); target->fxqueue.RemoveAllEffectsWithParam(fx_disease_ref, 5); target->fxqueue.RemoveAllEffectsWithParam(fx_disease_ref, 6); @@ -3125,7 +3125,7 @@ int fx_restoration (Scriptable* /*Owner*/, Actor* target, Effect* fx) //448 AlicornLance int fx_alicorn_lance (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_alicorn_lance (%2d)\n", fx->Opcode); + if (0) print( "fx_alicorn_lance (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_ALICORNLANCE)) return FX_APPLIED; ////target->AddPortraitIcon(PI_ALICORN); //no portrait icon STAT_SUB(IE_ARMORCLASS, 2); @@ -3184,7 +3184,7 @@ Actor *GetRandomEnemySeen(Map *map, Actor *origin) int fx_call_lightning (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_call_lightning (%2d)\n", fx->Opcode); + if (0) print( "fx_call_lightning (%2d)\n", fx->Opcode); //this effect ceases to affect dead targets (probably on frozen and stoned too) if (STATE_GET(STATE_DEAD)) { @@ -3201,7 +3201,7 @@ int fx_call_lightning (Scriptable* /*Owner*/, Actor* target, Effect* fx) //timing fx->TimingMode=FX_DURATION_DELAY_PERMANENT; - fx->Duration=core->GetGame()->GameTime+70*15; + fx->Duration=core->GetGame()->GameTime+70*AI_UPDATE_TIME; fx->Parameter1--; //calculate victim (an opponent of target) @@ -3225,7 +3225,7 @@ int fx_call_lightning (Scriptable* /*Owner*/, Actor* target, Effect* fx) //450 GlobeInvulnerability int fx_globe_invulnerability (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_globe_invulnerability (%2d)\n", fx->Opcode); + if (0) print( "fx_globe_invulnerability (%2d)\n", fx->Opcode); int state; int icon; int value; @@ -3255,7 +3255,7 @@ int fx_globe_invulnerability (Scriptable* /*Owner*/, Actor* target, Effect* fx) //451 LowerResistance int fx_lower_resistance (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_lower_resistance (%2d)\n", fx->Opcode); + if (0) print( "fx_lower_resistance (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_LOWERRESIST)) return FX_APPLIED; STAT_SUB(IE_RESISTMAGIC, 15); @@ -3267,7 +3267,7 @@ static EffectRef fx_bless_ref = { "Bless", -1 }; int fx_bane (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_bane (%2d)\n", fx->Opcode); + if (0) print( "fx_bane (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_BANE)) return FX_NOT_APPLIED; //do this once @@ -3287,7 +3287,7 @@ static EffectRef fx_expertise_ref = { "Expertise", -1 }; int fx_power_attack (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_power_attack (%2d)\n", fx->Opcode); + if (0) print( "fx_power_attack (%2d)\n", fx->Opcode); if (fx->FirstApply) { if (target->HasSpellState(SS_EXPERTISE)) { @@ -3317,7 +3317,7 @@ int fx_expertise (Scriptable* /*Owner*/, Actor* target, Effect* fx) //expertise feat: //convert positive base attack bonus into AC (dodge bonus) //up to feat_expertise count (player's choice) - if (0) printf( "fx_expertise (%2d)\n", fx->Opcode); + if (0) print( "fx_expertise (%2d)\n", fx->Opcode); if (fx->FirstApply) { if (target->HasSpellState(SS_POWERATTACK)) { target->fxqueue.RemoveAllEffects(fx_powerattack_ref); @@ -3343,7 +3343,7 @@ static EffectRef fx_hamstring_ref = { "HamString", -1 }; int fx_arterial_strike (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_arterial_strike (%2d)\n", fx->Opcode); + if (0) print( "fx_arterial_strike (%2d)\n", fx->Opcode); if (fx->FirstApply) { if (target->HasSpellState(SS_HAMSTRING)) { target->fxqueue.RemoveAllEffects(fx_hamstring_ref); @@ -3361,7 +3361,7 @@ static EffectRef fx_arterialstrike_ref = { "ArterialStrike", -1 }; int fx_hamstring (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_hamstring (%2d)\n", fx->Opcode); + if (0) print( "fx_hamstring (%2d)\n", fx->Opcode); if (fx->FirstApply) { if (target->HasSpellState(SS_ARTERIAL)) { target->fxqueue.RemoveAllEffects(fx_arterialstrike_ref); @@ -3377,7 +3377,7 @@ int fx_hamstring (Scriptable* /*Owner*/, Actor* target, Effect* fx) //457 RapidShot int fx_rapid_shot (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_rapid_shot (%2d)\n", fx->Opcode); + if (0) print( "fx_rapid_shot (%2d)\n", fx->Opcode); if (target->SetSpellState( SS_RAPIDSHOT)) return FX_APPLIED; //TODO: return FX_APPLIED; diff --git a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.cpp b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.cpp index 73be141cc..34da66c45 100644 --- a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/Dictionary.cpp @@ -23,6 +23,7 @@ #include "globals.h" #include "win32def.h" +#include #include ///////////////////////////////////////////////////////////////////////////// diff --git a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.cpp index a444a492f..657938886 100644 --- a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.cpp @@ -23,7 +23,7 @@ #include "win32def.h" #include "globals.h" -#include "ArchiveImporter.h" +#include "IndexedArchive.h" #include "Interface.h" #include "ResourceDesc.h" #include "System/FileStream.h" @@ -102,7 +102,7 @@ static void FindBIF(BIFEntry *entry) if (!entry->cd) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find %s... Resource unavailable.\n", + print( "Cannot find %s... Resource unavailable.\n", entry->name ); entry->found = false; return; @@ -118,8 +118,7 @@ static void FindBIF(BIFEntry *entry) } } - printMessage( "KEYImporter", " ", WHITE ); - printf( "Cannot find %s...", entry->name ); + printMessage("KEYImporter", "Cannot find %s...", WHITE, entry->name); printStatus( "ERROR", LIGHT_RED ); } @@ -128,24 +127,22 @@ bool KEYImporter::Open(const char *resfile, const char *desc) free(description); description = strdup(desc); if (!core->IsAvailable( IE_BIF_CLASS_ID )) { - printf( "[ERROR]\nAn Archive Plug-in is not Available\n" ); + print( "[ERROR]\nAn Archive Plug-in is not Available\n" ); return false; } unsigned int i; // NOTE: Interface::Init has already resolved resfile. - printMessage( "KEYImporter", "Opening ", WHITE ); - printf( "%s...", resfile ); - FileStream* f = new FileStream(); - if (!f->Open( resfile )) { + printMessage("KEYImporter", "Opening %s...", WHITE, resfile); + FileStream* f = FileStream::OpenFile(resfile); + if (!f) { // Check for backslashes (false escape characters) // this check probably belongs elsewhere (e.g. ResolveFilePath) if (strstr( resfile, "\\ " )) { - printf("%s", "\nEscaped space(s) detected in path!. Do not escape spaces in your GamePath! " ); + print("%s", "\nEscaped space(s) detected in path!. Do not escape spaces in your GamePath! " ); } printStatus( "ERROR", LIGHT_RED ); printMessage( "KEYImporter", "Cannot open Chitin.key\n", LIGHT_RED ); textcolor( WHITE ); - delete( f ); return false; } printStatus( "OK", LIGHT_GREEN ); @@ -154,8 +151,7 @@ bool KEYImporter::Open(const char *resfile, const char *desc) f->Read( Signature, 8 ); if (strncmp( Signature, "KEY V1 ", 8 ) != 0) { printStatus( "ERROR", LIGHT_RED ); - printMessage( "KEYImporter", "File has an Invalid Signature.\n", - LIGHT_RED ); + printMessage( "KEYImporter", "File has an Invalid Signature.\n", LIGHT_RED ); textcolor( WHITE ); delete( f ); return false; @@ -168,10 +164,10 @@ bool KEYImporter::Open(const char *resfile, const char *desc) f->ReadDword( &BifOffset ); f->ReadDword( &ResOffset ); printMessage( "KEYImporter", " ", WHITE ); - printf( "BIF Files Count: %d (Starting at %d Bytes)\n", BifCount, + print( "BIF Files Count: %d (Starting at %d Bytes)\n", BifCount, BifOffset ); - printMessage( "KEYImporter", " ", WHITE ); - printf( "RES Count: %d (Starting at %d Bytes)\n", ResCount, ResOffset ); + printMessage("KEYImporter", "RES Count: %d (Starting at %d Bytes)\n", WHITE, + ResCount, ResOffset); f->Seek( BifOffset, GEM_STREAM_START ); ieDword BifLen, ASCIIZOffset; ieWord ASCIIZLen; @@ -190,14 +186,6 @@ bool KEYImporter::Open(const char *resfile, const char *desc) if (be.name[p] == '\\' || be.name[p] == ':') be.name[p] = PathDelimiter; } - if (be.name[0] == PathDelimiter) { - // totl has '\data\zcMHar.bif' in the key file, and the CaseSensitive - // code breaks with that extra slash, so simple fix: remove it - ASCIIZLen--; - for (int p = 0; p < ASCIIZLen; p++) - be.name[p] = be.name[p + 1]; - // (if you change this, try moving to ar9700 for testing) - } FindBIF(&be); biffiles.push_back( be ); } @@ -246,24 +234,25 @@ DataStream* KEYImporter::GetStream(const char *resname, ieWord type) if (type == 0) return NULL; if (resources.Lookup( resname, type, ResLocator )) { - int bifnum = ( ResLocator & 0xFFF00000 ) >> 20; + unsigned int bifnum = ( ResLocator & 0xFFF00000 ) >> 20; if (core->GameOnCD && (biffiles[bifnum].cd != 0)) FindBIFOnCD(&biffiles[bifnum]); if (!biffiles[bifnum].found) { - printf( "Cannot find %s... Resource unavailable.\n", + print( "Cannot find %s... Resource unavailable.\n", biffiles[bifnum].name ); return NULL; } - PluginHolder ai(IE_BIF_CLASS_ID); + PluginHolder ai(IE_BIF_CLASS_ID); if (ai->OpenArchive( biffiles[bifnum].path ) == GEM_ERROR) { - printf("Cannot open archive %s\n", biffiles[bifnum].path ); + print("Cannot open archive %s\n", biffiles[bifnum].path ); return NULL; } DataStream* ret = ai->GetStream( ResLocator, type ); if (ret) { strnlwrcpy( ret->filename, resname, 8 ); + strcat( ret->filename, "." ); strcat( ret->filename, core->TypeExt( type ) ); return ret; } diff --git a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.h b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.h index 4ea85f996..ec44820db 100644 --- a/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/KEYImporter/KEYImporter.h @@ -23,6 +23,9 @@ #include "ResourceSource.h" +#include "IndexedArchive.h" +#include "PluginMgr.h" + #include "Dictionary.h" #include @@ -45,7 +48,6 @@ struct BIFEntry { bool found; }; - class KEYImporter : public ResourceSource { private: std::vector< BIFEntry> biffiles; diff --git a/project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.cpp index 660e1f97c..6fd379b0d 100644 --- a/project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/MOSImporter/MOSImporter.cpp @@ -23,11 +23,9 @@ #include "RGBAColor.h" #include "win32def.h" -#include "Compressor.h" +#include "FileCache.h" #include "Interface.h" #include "Video.h" -#include "System/CachedFileStream.h" -#include "System/FileStream.h" static ieDword red_mask = 0xff000000; static ieDword green_mask = 0x00ff0000; @@ -52,36 +50,13 @@ bool MOSImporter::Open(DataStream* stream) char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "MOSCV1 ", 8 ) == 0) { - char cpath[_MAX_PATH]; - strcpy( cpath, core->CachePath ); - strcat( cpath, stream->filename ); - FILE* exist_in_cache = fopen( cpath, "rb" ); - if (exist_in_cache) { - //File was previously cached, using local copy - delete( str ); - fclose( exist_in_cache ); - FileStream* s = new FileStream(); - s->Open( cpath ); - str = s; - str->Read( Signature, 8 ); - } else { - //No file found in Cache, Decompressing and storing for further use - str->Seek( 4, GEM_CURRENT_POS ); - - if (!core->IsAvailable( PLUGIN_COMPRESSION_ZLIB )) { - printf( "No Compression Manager Available.\nCannot Load Compressed Mos File.\n" ); - return false; - } - FILE* newfile = fopen( cpath, "wb" ); - PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); - comp->Decompress( newfile, str ); - fclose( newfile ); - delete( str ); - FileStream* s = new FileStream(); - s->Open( cpath ); - str = s; - str->Read( Signature, 8 ); - } + str->Seek( 4, GEM_CURRENT_POS ); + DataStream* cached = CacheCompressedStream(stream, stream->filename); + delete str; + if (!cached) + return false; + str = cached; + str->Read( Signature, 8 ); } if (strncmp( Signature, "MOS V1 ", 8 ) != 0) { return false; @@ -151,5 +126,5 @@ Sprite2D* MOSImporter::GetSprite2D() #include "plugindef.h" GEMRB_PLUGIN(0x167B73E, "MOS File Importer") -PLUGIN_IE_RESOURCE(MOSImporter, ".mos", (ieWord)IE_MOS_CLASS_ID) +PLUGIN_IE_RESOURCE(MOSImporter, "mos", (ieWord)IE_MOS_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.cpp index 1bb6b1c2d..d440ec792 100644 --- a/project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/MUSImporter/MUSImporter.cpp @@ -74,9 +74,8 @@ bool MUSImporter::OpenPlaylist(const char* name) } char path[_MAX_PATH]; PathJoin(path, core->GamePath, musicsubfolder, name, NULL); - printMessage("MUSImporter", "", WHITE); - printf( "Loading %s...", path ); - if (!str->Open( path, true )) { + printMessage("MUSImporter", "Loading %s...", WHITE, path); + if (!str->Open(path)) { printStatus("NOT FOUND", LIGHT_RED ); return false; } @@ -318,7 +317,7 @@ void MUSImporter::PlayMusic(char* name) } else { core->GetAudioDrv()->Stop(); } - printf( "Playing: %s\n", FName ); + print( "Playing: %s\n", FName ); } bool MUSImporter::CurrentPlayList(const char* name) { diff --git a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.cpp b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.cpp index 6ff83ca0f..750fe8a4f 100644 --- a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/MVEPlayer.cpp @@ -104,7 +104,7 @@ int MVEPlay::doPlay() player.video_init(w, h); if (!player.start_playback()) { - printf("Failed to decode movie!\n"); + print("Failed to decode movie!\n"); return 1; } @@ -183,5 +183,5 @@ void MVEPlay::queueBuffer(int stream, unsigned short bits, #include "plugindef.h" GEMRB_PLUGIN(0x218963DC, "MVE Video Player") -PLUGIN_IE_RESOURCE(MVEPlay, ".mve", (ieWord)IE_MVE_CLASS_ID) +PLUGIN_IE_RESOURCE(MVEPlay, "mve", (ieWord)IE_MVE_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/gstmvedemux.h b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/gstmvedemux.h index c8908c297..c34b711fc 100644 --- a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/gstmvedemux.h +++ b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/gstmvedemux.h @@ -26,8 +26,8 @@ #include "globals.h" #define G_UNLIKELY(x) (x) -#define GST_WARNING printf -#define GST_ERROR printf +#define GST_WARNING print +#define GST_ERROR print /* Define GET function for unaligned memory */ #define _GST_GET(__data, __idx, __size, __shift) \ diff --git a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.cpp b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.cpp index b8edf7d11..79376a3b6 100644 --- a/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/MVEPlayer/mve_player.cpp @@ -80,7 +80,7 @@ MVEPlayer::~MVEPlayer() { if (audio_stream != -1) host->freeAudioStream(audio_stream); if (video_skippedframes) - printf("Warning: Had to drop %d video frame(s).\n", video_skippedframes); + print("Warning: Had to drop %d video frame(s).\n", video_skippedframes); } /* @@ -103,7 +103,7 @@ bool MVEPlayer::start_playback() { * The first two chunks contain audio and video initialisation, hopefully. */ if (!process_chunk() || !process_chunk()) { - printf("Error: Failed to read initial movie chunks.\n"); + print("Error: Failed to read initial movie chunks.\n"); return false; } @@ -147,7 +147,7 @@ bool MVEPlayer::request_data(unsigned int len) { bool MVEPlayer::verify_header() { if (!request_data(MVE_PREAMBLE_SIZE)) return false; if (memcmp(buffer, MVE_PREAMBLE, MVE_PREAMBLE_SIZE) != 0) { - printf("Error: MVE preamble didn't match\n"); + print("Error: MVE preamble didn't match\n"); return false; } return true; @@ -173,7 +173,7 @@ bool MVEPlayer::process_chunk() { } if (chunk_offset != chunk_size) { - printf("Error: Decoded past the end of an MVE chunk\n"); + print("Error: Decoded past the end of an MVE chunk\n"); return false; } @@ -228,7 +228,7 @@ bool MVEPlayer::process_segment(unsigned short len, unsigned char type, unsigned /* ignore these */ break; default: - printf("Warning: Skipping unknown segment type 0x%02x", type); + print("Warning: Skipping unknown segment type 0x%02x", type); } return true; @@ -297,8 +297,10 @@ void MVEPlayer::segment_create_timer() { void MVEPlayer::segment_video_init(unsigned char version) { unsigned short width = GST_READ_UINT16_LE(buffer) << 3; unsigned short height = GST_READ_UINT16_LE(buffer + 2) << 3; +/* count is unused unsigned short count = 1; if (version > 0) count = GST_READ_UINT16_LE(buffer + 4); +*/ unsigned short temp = 0; if (version > 1) temp = GST_READ_UINT16_LE(buffer + 6); truecolour = !!temp; @@ -339,7 +341,9 @@ void MVEPlayer::segment_video_palette() { host->setPalette((unsigned char *)palette - (3 * palette_start), palette_start, palette_count); } +//appears to be unused void MVEPlayer::segment_video_compressedpalette() { +#if 0 char *data = buffer; unsigned int i, j; @@ -360,6 +364,7 @@ void MVEPlayer::segment_video_compressedpalette() { } } } +#endif } void MVEPlayer::segment_video_codemap(unsigned short size) { @@ -419,7 +424,7 @@ void MVEPlayer::segment_audio_init(unsigned char version) { audio_stream = host->setAudioStream(); if (audio_stream == -1) { - printf("Error: MVE player couldn't open audio. Will play silently.\n"); + print("Error: MVE player couldn't open audio. Will play silently.\n"); playsound = false; return; } @@ -442,7 +447,7 @@ void MVEPlayer::segment_audio_init(unsigned char version) { if (audio_buffer) free(audio_buffer); audio_buffer = (short *)malloc(min_buffer_len); -/* printf("Movie audio: Sample rate %d, %d channels, %d bit, requested buffer size 0x%02x, %s\n", +/* print("Movie audio: Sample rate %d, %d channels, %d bit, requested buffer size 0x%02x, %s\n", audio_sample_rate, audio_num_channels, audio_sample_size, min_buffer_len, audio_compressed ? "compressed" : "uncompressed");*/ } diff --git a/project/jni/application/gemrb/gemrb/plugins/Makefile.am b/project/jni/application/gemrb/gemrb/plugins/Makefile.am index b5a736140..2b03970d0 100644 --- a/project/jni/application/gemrb/gemrb/plugins/Makefile.am +++ b/project/jni/application/gemrb/gemrb/plugins/Makefile.am @@ -30,6 +30,7 @@ SUBDIRS = \ PNGImporter \ PROImporter \ PSTOpcodes \ + SAVImporter \ SDLVideo \ SPLImporter \ STOImporter \ diff --git a/project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.cpp b/project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.cpp index 762ccfe8e..437dbd075 100644 --- a/project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/OGGReader/OGGReader.cpp @@ -124,5 +124,5 @@ int OGGReader::read_samples(short* buffer, int count) #include "plugindef.h" GEMRB_PLUGIN(0x18C310C3, "OGG File Importer") -PLUGIN_RESOURCE(OGGReader, ".ogg") +PLUGIN_RESOURCE(OGGReader, "ogg") END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp index c5c6c53c3..7cd0ee348 100644 --- a/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp @@ -269,7 +269,7 @@ int AmbientMgrAL::AmbientSource::enqueue() if (soundrefs.empty()) return -1; if (stream < 0) return -1; int index = rand() % soundrefs.size(); - //printf("Playing ambient %p, %s, %d/%ld on stream %d\n", (void*)this, soundrefs[index], index, soundrefs.size(), stream); + //print("Playing ambient %p, %s, %d/%ld on stream %d\n", (void*)this, soundrefs[index], index, soundrefs.size(), stream); return core->GetAudioDrv()->QueueAmbient(stream, soundrefs[index]); } diff --git a/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp index 4634342e9..883e4cdff 100644 --- a/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp @@ -28,8 +28,8 @@ bool checkALError(const char* msg, const char* status) { int error = alGetError(); if (error != AL_NO_ERROR) { - printMessage("OpenAL", msg, WHITE ); - printf (": 0x%x ", error); + printMessage("OpenAL", "%s", WHITE, msg); + print (": 0x%x ", error); printStatus(status, YELLOW); return true; } @@ -38,9 +38,9 @@ bool checkALError(const char* msg, const char* status) { void showALCError(const char* msg, const char* status, ALCdevice *device) { int error = alcGetError(device); - printMessage("OpenAL", msg, WHITE ); + printMessage("OpenAL", "%s", WHITE, msg ); if (error != AL_NO_ERROR) { - printf (": 0x%x ", error); + print (": 0x%x ", error); } printStatus(status, YELLOW); } @@ -171,11 +171,8 @@ bool OpenALAudioDriver::Init(void) int sources = CountAvailableSources(MAX_STREAMS+1); num_streams = sources - 1; - char buf[255]; - sprintf(buf, "Allocated %d streams.%s", num_streams, - (num_streams < MAX_STREAMS ? " (Fewer than desired.)" : "" ) ); - - printMessage( "OpenAL", buf, WHITE ); + printMessage( "OpenAL", "Allocated %d streams.%s", WHITE, + num_streams, (num_streams < MAX_STREAMS ? " (Fewer than desired.)" : "" )); stayAlive = true; musicThread = SDL_CreateThread( MusicManager, this ); @@ -298,7 +295,7 @@ ALuint OpenALAudioDriver::loadSound(const char *ResRef, unsigned int &time_lengt e->Length = ((cnt / riff_chans) * 1000) / samplerate; buffercache.SetAt(ResRef, (void*)e); - //printf("LoadSound: added %s to cache: %d. Cache size now %d\n", ResRef, e->Buffer, buffercache.GetCount()); + //print("LoadSound: added %s to cache: %d. Cache size now %d\n", ResRef, e->Buffer, buffercache.GetCount()); if (buffercache.GetCount() > BUFFER_CACHE_SIZE) { evictBuffer(); @@ -361,7 +358,7 @@ Holder OpenALAudioDriver::Play(const char* ResRef, int XPos, int YP alSourcef( speech.Source, AL_REFERENCE_DISTANCE, REFERENCE_DISTANCE ); checkALError("Unable to set speech parameters", "WARNING"); speech.free = false; - printf("speech.free: %d source:%d\n", speech.free,speech.Source); + print("speech.free: %d source:%d\n", speech.free,speech.Source); core->GetDictionary()->Lookup( "Volume Voices", volume ); alSourcef( speech.Source, AL_GAIN, 0.01f * volume ); @@ -508,7 +505,6 @@ bool OpenALAudioDriver::Stop() bool OpenALAudioDriver::Pause() { - ambim->deactivate(); SDL_mutexP( musicMutex ); if (!alIsSource( MusicSource )) { SDL_mutexV( musicMutex ); @@ -518,6 +514,7 @@ bool OpenALAudioDriver::Pause() checkALError("Unable to pause music source", "WARNING"); MusicPlaying = false; SDL_mutexV( musicMutex ); + ((AmbientMgrAL*) ambim)->deactivate(); #ifdef ANDROID al_android_pause_playback(); //call AudioTrack.pause() from JNI #endif @@ -529,7 +526,6 @@ bool OpenALAudioDriver::Resume() #ifdef ANDROID al_android_resume_playback(); //call AudioTrack.play() from JNI #endif - ambim->activate(); SDL_mutexP( musicMutex ); if (!alIsSource( MusicSource )) { SDL_mutexV( musicMutex ); @@ -539,6 +535,7 @@ bool OpenALAudioDriver::Resume() checkALError("Unable to resume music source", "WARNING"); MusicPlaying = true; SDL_mutexV( musicMutex ); + ((AmbientMgrAL*) ambim)->activate(); return true; } @@ -729,7 +726,7 @@ bool OpenALAudioDriver::evictBuffer() delete e; buffercache.Remove(k); - //printf("Removed buffer %s from ACMImp cache\n", k); + //print("Removed buffer %s from ACMImp cache\n", k); break; } ++n; diff --git a/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp.old b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp.old new file mode 100644 index 000000000..3b3ad1a35 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/plugins/OpenALAudio/OpenALAudio.cpp.old @@ -0,0 +1,924 @@ +/* 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 "OpenALAudio.h" + +#include "GameData.h" + +#include +#include + +bool checkALError(const char* msg, const char* status) { + int error = alGetError(); + if (error != AL_NO_ERROR) { + printMessage("OpenAL", msg, WHITE ); + printf (": 0x%x ", error); + printStatus(status, YELLOW); + return true; + } + return false; +} + +void showALCError(const char* msg, const char* status, ALCdevice *device) { + int error = alcGetError(device); + printMessage("OpenAL", msg, WHITE ); + if (error != AL_NO_ERROR) { + printf (": 0x%x ", error); + } + printStatus(status, YELLOW); +} + +void OpenALSoundHandle::SetPos(int XPos, int YPos) { + if (!parent) return; + + ALfloat SourcePos[] = { + (float) XPos, (float) YPos, 0.0f + }; + + alSourcefv(parent->Source, AL_POSITION, SourcePos); +} + +bool OpenALSoundHandle::Playing() { + if (!parent) return false; + + parent->ClearIfStopped(); + return parent != 0; +} + +void OpenALSoundHandle::Stop() { + if (!parent) return; + + parent->ForceClear(); +} + +void OpenALSoundHandle::StopLooping() { + if (!parent) return; + + alSourcei(parent->Source, AL_LOOPING, 0); +} + +void AudioStream::ClearProcessedBuffers() +{ + ALint processed = 0; + alGetSourcei( Source, AL_BUFFERS_PROCESSED, &processed ); + + checkALError("Failed to get processed buffers", "WARNING"); + + if (processed > 0) { + ALuint * b = new ALuint[processed]; + alSourceUnqueueBuffers( Source, processed, b ); + checkALError("Failed to unqueue buffers", "WARNING"); + + if (delete_buffers) { + alDeleteBuffers(processed, b); + checkALError("Failed to delete buffers", "WARNING"); + } + + delete[] b; + } + +} + +void AudioStream::ClearIfStopped() +{ + if (free || locked) return; + + if (!alIsSource(Source)) return; + + ALint state; + alGetSourcei( Source, AL_SOURCE_STATE, &state ); + if (!checkALError("Failed to check source state", "WARNING") && + state == AL_STOPPED) + { + ClearProcessedBuffers(); + alDeleteSources( 1, &Source ); + checkALError("Failed to delete source", "WARNING"); + Source = 0; + Buffer = 0; + free = true; + if (handle) { handle->Invalidate(); handle.release(); } + ambient = false; + locked = false; + delete_buffers = false; + } +} + +void AudioStream::ForceClear() +{ + if (!alIsSource(Source)) return; + + alSourceStop(Source); + checkALError("Failed to stop source", "WARNING"); + ClearProcessedBuffers(); + ClearIfStopped(); +} + +OpenALAudioDriver::OpenALAudioDriver(void) +{ + alutContext = NULL; + MusicPlaying = false; + music_memory = (short*) malloc(ACM_BUFFERSIZE); + MusicSource = 0; + memset(MusicBuffer, 0, MUSICBUFFERS*sizeof(ALuint)); + musicMutex = SDL_CreateMutex(); + ambim = NULL; +} + +bool OpenALAudioDriver::Init(void) +{ + ALCdevice *device; + ALCcontext *context; + + device = alcOpenDevice (NULL); + if (device == NULL) { + showALCError("Failed to open device", "ERROR", device); + return false; + } + + context = alcCreateContext (device, NULL); + if (context == NULL) { + showALCError("Failed to create context", "ERROR", device); + alcCloseDevice (device); + return false; + } + + if (!alcMakeContextCurrent (context)) { + showALCError("Failed to select context", "ERROR", device); + alcDestroyContext (context); + alcCloseDevice (device); + return false; + } + alutContext = context; + + //1 for speech + int sources = CountAvailableSources(MAX_STREAMS+1); + num_streams = sources - 1; + + char buf[255]; + sprintf(buf, "Allocated %d streams.%s", num_streams, + (num_streams < MAX_STREAMS ? " (Fewer than desired.)" : "" ) ); + + printMessage( "OpenAL", buf, WHITE ); + + stayAlive = true; + musicThread = SDL_CreateThread( MusicManager, this ); + + ambim = new AmbientMgrAL; + speech.free = true; + speech.ambient = false; + return true; +} + +int OpenALAudioDriver::CountAvailableSources(int limit) +{ + ALuint* src = new ALuint[limit+2]; + int i; + for (i = 0; i < limit+2; ++i) { + alGenSources(1, &src[i]); + if (alGetError() != AL_NO_ERROR) + break; + } + if (i > 0) + alDeleteSources(i, src); + delete[] src; + + // Leave two sources free for internal OpenAL usage + // (Might not be strictly necessary...) + i -= 2; + + checkALError("Error while auto-detecting number of sources", "WARNING"); + + // Return number of succesfully allocated sources + return i; +} + +OpenALAudioDriver::~OpenALAudioDriver(void) +{ + if (!ambim) { + // initialisation must have failed + return; + } + + for(int i =0; iLength; + return e->Buffer; + } + + //no cache entry... + alGenBuffers(1, &Buffer); + if (checkALError("Unable to create sound buffer", "ERROR")) { + return 0; + } + + ResourceHolder acm(ResRef); + if (!acm) { + alDeleteBuffers( 1, &Buffer ); + return 0; + } + int cnt = acm->get_length(); + int riff_chans = acm->get_channels(); + int samplerate = acm->get_samplerate(); + //multiply always by 2 because it is in 16 bits + int rawsize = cnt * 2; + short* memory = (short*) malloc(rawsize); + //multiply always with 2 because it is in 16 bits + int cnt1 = acm->read_samples( memory, cnt ) * 2; + //Sound Length in milliseconds + time_length = ((cnt / riff_chans) * 1000) / samplerate; + //it is always reading the stuff into 16 bits + alBufferData( Buffer, GetFormatEnum( riff_chans, 16 ), memory, cnt1, samplerate ); + free(memory); + + if (checkALError("Unable to fill buffer", "ERROR")) { + alDeleteBuffers( 1, &Buffer ); + checkALError("Error deleting buffer", "WARNING"); + return 0; + } + + e = new CacheEntry; + e->Buffer = Buffer; + e->Length = ((cnt / riff_chans) * 1000) / samplerate; + + buffercache.SetAt(ResRef, (void*)e); + //printf("LoadSound: added %s to cache: %d. Cache size now %d\n", ResRef, e->Buffer, buffercache.GetCount()); + + if (buffercache.GetCount() > BUFFER_CACHE_SIZE) { + evictBuffer(); + } + return Buffer; +} + +Holder OpenALAudioDriver::Play(const char* ResRef, int XPos, int YPos, unsigned int flags, unsigned int *length) +{ + ALuint Buffer; + unsigned int time_length; + + if(ResRef == NULL) { + if((flags & GEM_SND_SPEECH) && alIsSource(speech.Source)) { + //So we want him to be quiet... + alSourceStop( speech.Source ); + checkALError("Unable to stop speech", "WARNING"); + speech.ClearProcessedBuffers(); + } + return Holder(); + } + + Buffer = loadSound( ResRef, time_length ); + if (Buffer == 0) { + return Holder(); + } + + if (length) { + *length = time_length; + } + + ALuint Source; + ALfloat SourcePos[] = { + (float) XPos, (float) YPos, 0.0f + }; + ALfloat SourceVel[] = { + 0.0f, 0.0f, 0.0f + }; + + ieDword volume = 100; + + if (flags & GEM_SND_SPEECH) { + //speech has a single channel, if a new speech started + //we stop the previous one + if(!speech.free && alIsSource(speech.Source)) { + alSourceStop( speech.Source ); + checkALError("Unable to stop speech", "WARNING"); + speech.ClearProcessedBuffers(); + } + if(!alIsSource(speech.Source)) { + alGenSources( 1, &speech.Source ); + if (checkALError("Error creating source for speech", "ERROR")) { + return Holder(); + } + } + + alSourcef( speech.Source, AL_PITCH, 1.0f ); + alSourcefv( speech.Source, AL_VELOCITY, SourceVel ); + alSourcei( speech.Source, AL_LOOPING, 0 ); + alSourcef( speech.Source, AL_REFERENCE_DISTANCE, REFERENCE_DISTANCE ); + checkALError("Unable to set speech parameters", "WARNING"); + speech.free = false; + printf("speech.free: %d source:%d\n", speech.free,speech.Source); + + core->GetDictionary()->Lookup( "Volume Voices", volume ); + alSourcef( speech.Source, AL_GAIN, 0.01f * volume ); + alSourcei( speech.Source, AL_SOURCE_RELATIVE, flags & GEM_SND_RELATIVE ); + alSourcefv( speech.Source, AL_POSITION, SourcePos ); + assert(!speech.delete_buffers); + alSourcei( speech.Source, AL_BUFFER, Buffer ); + checkALError("Unable to set speech parameters", "WARNING"); + speech.Buffer = Buffer; + alSourcePlay( speech.Source ); + if (checkALError("Unable to play speech", "ERROR")) { + return Holder(); + } + speech.handle = new OpenALSoundHandle(&speech); + return speech.handle.get(); + } + + int stream = -1; + for (int i = 0; i < num_streams; i++) { + streams[i].ClearIfStopped(); + if (streams[i].free) { + stream = i; + break; + } + } + + if (stream == -1) { + // Failed to assign new sound. + // The buffercache will handle deleting Buffer. + return Holder(); + } + + // not speech + alGenSources( 1, &Source ); + if (checkALError("Unable to create source", "ERROR")) { + return Holder(); + } + + alSourcef( Source, AL_PITCH, 1.0f ); + alSourcefv( Source, AL_VELOCITY, SourceVel ); + alSourcei( Source, AL_LOOPING, (flags & GEM_SND_LOOPING ? 1 : 0) ); + alSourcef( Source, AL_REFERENCE_DISTANCE, REFERENCE_DISTANCE ); + core->GetDictionary()->Lookup( "Volume SFX", volume ); + alSourcef( Source, AL_GAIN, 0.01f * volume ); + alSourcei( Source, AL_SOURCE_RELATIVE, flags & GEM_SND_RELATIVE ); + alSourcefv( Source, AL_POSITION, SourcePos ); + assert(!streams[stream].delete_buffers); + alSourcei( Source, AL_BUFFER, Buffer ); + + if (checkALError("Unable to set sound parameters", "ERROR")) { + return Holder(); + } + + streams[stream].Buffer = Buffer; + streams[stream].Source = Source; + streams[stream].free = false; + alSourcePlay( Source ); + + if (checkALError("Unable to play sound", "ERROR")) { + return Holder(); + } + + streams[stream].handle = new OpenALSoundHandle(&streams[stream]); + return streams[stream].handle.get(); +} + +bool OpenALAudioDriver::IsSpeaking() +{ + speech.ClearIfStopped(); + return !speech.free; +} + +void OpenALAudioDriver::UpdateVolume(unsigned int flags) +{ + ieDword volume; + + if (flags & GEM_SND_VOL_MUSIC) { + SDL_mutexP( musicMutex ); + core->GetDictionary()->Lookup("Volume Music", volume); + if (alIsSource(MusicSource)) + alSourcef(MusicSource, AL_GAIN, volume * 0.01f); + SDL_mutexV(musicMutex); + } + + if (flags & GEM_SND_VOL_AMBIENTS) { + core->GetDictionary()->Lookup("Volume Ambients", volume); + ((AmbientMgrAL*) ambim)->UpdateVolume(volume); + } +} + +bool OpenALAudioDriver::CanPlay() +{ + return true; +} + +void OpenALAudioDriver::ResetMusics() +{ + MusicPlaying = false; + SDL_mutexP( musicMutex ); + if (alIsSource(MusicSource)) { + alSourceStop(MusicSource); + checkALError("Unable to stop music source", "WARNING"); + alDeleteSources(1, &MusicSource ); + checkALError("Unable to delete music source", "WARNING"); + MusicSource = 0; + for (int i=0; ideactivate(); + SDL_mutexP( musicMutex ); + if (!alIsSource( MusicSource )) { + SDL_mutexV( musicMutex ); + return false; + } + alSourcePause(MusicSource); + checkALError("Unable to pause music source", "WARNING"); + MusicPlaying = false; + SDL_mutexV( musicMutex ); +#ifdef ANDROID + al_android_pause_playback(); //call AudioTrack.pause() from JNI +#endif + return true; +} + +bool OpenALAudioDriver::Resume() +{ +#ifdef ANDROID + al_android_resume_playback(); //call AudioTrack.play() from JNI +#endif + ((AmbientMgrAL*) ambim)->activate(); + SDL_mutexP( musicMutex ); + if (!alIsSource( MusicSource )) { + SDL_mutexV( musicMutex ); + return false; + } + alSourcePlay(MusicSource); + checkALError("Unable to resume music source", "WARNING"); + MusicPlaying = true; + SDL_mutexV( musicMutex ); + return true; +} + +int OpenALAudioDriver::CreateStream(Holder newMusic) +{ + StackLock l(musicMutex, "musicMutex in CreateStream()"); + + // Free old MusicReader + MusicReader = newMusic; + if (!MusicReader) { + MusicPlaying = false; + } + + if (MusicBuffer[0] == 0) { + alGenBuffers( MUSICBUFFERS, MusicBuffer ); + if (checkALError("Unable to create music buffers", "ERROR")) { + return -1; + } + } + + if (MusicSource == 0) { + alGenSources( 1, &MusicSource ); + if (checkALError("Unable to create music source", "ERROR")) { + return -1; + } + + ALfloat SourcePos[] = { + 0.0f, 0.0f, 0.0f + }; + ALfloat SourceVel[] = { + 0.0f, 0.0f, 0.0f + }; + + ieDword volume; + core->GetDictionary()->Lookup( "Volume Music", volume ); + alSourcef( MusicSource, AL_PITCH, 1.0f ); + alSourcef( MusicSource, AL_GAIN, 0.01f * volume ); + alSourcei( MusicSource, AL_SOURCE_RELATIVE, 1 ); + alSourcefv( MusicSource, AL_POSITION, SourcePos ); + alSourcefv( MusicSource, AL_VELOCITY, SourceVel ); + alSourcei( MusicSource, AL_LOOPING, 0 ); + checkALError("Unable to set music parameters", "WARNING"); + } + + return 0; +} + +void OpenALAudioDriver::UpdateListenerPos(int XPos, int YPos ) +{ + alListener3f( AL_POSITION, (float) XPos, (float) YPos, 0.0f ); +} + +void OpenALAudioDriver::GetListenerPos(int &XPos, int &YPos ) +{ + ALfloat listen[3]; + alGetListenerfv( AL_POSITION, listen ); + if (checkALError("Unable to get listener pos", "ERROR")) return; + XPos = (int) listen[0]; + YPos = (int) listen[1]; +} + +bool OpenALAudioDriver::ReleaseStream(int stream, bool HardStop) +{ + if (streams[stream].free || !streams[stream].locked) + return false; + streams[stream].locked = false; + if (!HardStop) { + // it's now unlocked, so it will automatically be reclaimed when needed + return true; + } + + ALuint Source = streams[stream].Source; + alSourceStop(Source); + checkALError("Unable to stop source", "WARNING"); + streams[stream].ClearIfStopped(); + + return true; +} + +//This one is used for movies and ambients. +int OpenALAudioDriver::SetupNewStream( ieWord x, ieWord y, ieWord z, + ieWord gain, bool point, bool Ambient ) +{ + // Find a free (or finished) stream for this sound + int stream = -1; + for (int i = 0; i < num_streams; i++) { + streams[i].ClearIfStopped(); + if (streams[i].free) { + stream = i; + break; + } + } + if (stream == -1) return -1; + + ALuint source; + alGenSources(1, &source); + if (checkALError("Unable to create new source", "ERROR")) { + return -1; + } + + ALfloat position[] = { (float) x, (float) y, (float) z }; + alSourcef( source, AL_PITCH, 1.0f ); + alSourcefv( source, AL_POSITION, position ); + alSourcef( source, AL_GAIN, 0.01f * gain ); + alSourcei( source, AL_REFERENCE_DISTANCE, REFERENCE_DISTANCE ); + alSourcei( source, AL_ROLLOFF_FACTOR, point ? 1 : 0 ); + alSourcei( source, AL_LOOPING, 0 ); + checkALError("Unable to set stream parameters", "WARNING"); + + streams[stream].Buffer = 0; + streams[stream].Source = source; + streams[stream].free = false; + streams[stream].ambient = Ambient; + streams[stream].locked = true; + + return stream; +} + +int OpenALAudioDriver::QueueAmbient(int stream, const char* sound) +{ + if (streams[stream].free || !streams[stream].ambient) + return -1; + + ALuint source = streams[stream].Source; + + // first dequeue any processed buffers + streams[stream].ClearProcessedBuffers(); + + if (sound == 0) + return 0; + + unsigned int time_length; + ALuint Buffer = loadSound(sound, time_length); + if (0 == Buffer) { + return -1; + } + + assert(!streams[stream].delete_buffers); + + alSourceQueueBuffers(source, 1, &Buffer); + if (checkALError("Unable to queue ambient buffer","ERROR")) { + return -1; + } + + // play + ALint state; + alGetSourcei( source, AL_SOURCE_STATE, &state ); + if (!checkALError("Unable to query ambient source state", "ERROR") && + state != AL_PLAYING) + { // play on playing source would rewind it + alSourcePlay( source ); + if (checkALError("Unable to play ambient source", "ERROR")) + return -1; + } + + return time_length; +} + +void OpenALAudioDriver::SetAmbientStreamVolume(int stream, int volume) +{ + if (streams[stream].free || !streams[stream].ambient) + return; + + ALuint source = streams[stream].Source; + alSourcef( source, AL_GAIN, 0.01f * volume ); + checkALError("Unable to set ambient volume", "WARNING"); +} + +bool OpenALAudioDriver::evictBuffer() +{ + // Note: this function assumes the caller holds bufferMutex + + // Room for optimization: this is O(n^2) in the number of buffers + // at the tail that are used. It can be O(n) if LRUCache supports it. + + unsigned int n = 0; + void* p; + const char* k; + bool res; + + while ((res = buffercache.getLRU(n, k, p)) == true) { + CacheEntry* e = (CacheEntry*)p; + alDeleteBuffers(1, &e->Buffer); + if (alGetError() == AL_NO_ERROR) { + // Buffer was unused. An error would have indicated + // the buffer was still attached to a source. + + delete e; + buffercache.Remove(k); + + //printf("Removed buffer %s from ACMImp cache\n", k); + break; + } + ++n; + } + + return res; +} + +void OpenALAudioDriver::clearBufferCache(bool force) +{ + // Room for optimization: any method of iterating over the buffers + // would suffice. It doesn't have to be in LRU-order. + void* p; + const char* k; + int n = 0; + while (buffercache.getLRU(n, k, p)) { + CacheEntry* e = (CacheEntry*)p; + alDeleteBuffers(1, &e->Buffer); + if (force || alGetError() == AL_NO_ERROR) { + delete e; + buffercache.Remove(k); + } else + ++n; + } +} + +ALenum OpenALAudioDriver::GetFormatEnum(int channels, int bits) +{ + switch (channels) { + case 1: + if (bits == 8) + return AL_FORMAT_MONO8; + else + return AL_FORMAT_MONO16; + break; + + case 2: + if (bits == 8) + return AL_FORMAT_STEREO8; + else + return AL_FORMAT_STEREO16; + break; + } + return AL_FORMAT_MONO8; +} + +int OpenALAudioDriver::MusicManager(void* arg) +{ + OpenALAudioDriver* driver = (OpenALAudioDriver*) arg; + ALuint buffersreturned = 0; + ALboolean bFinished = AL_FALSE; + while (driver->stayAlive) { + SDL_Delay(30); + StackLock l(driver->musicMutex, "musicMutex in PlayListManager()"); + if (driver->MusicPlaying) { + ALint state; + alGetSourcei( driver->MusicSource, AL_SOURCE_STATE, &state ); + if (checkALError("Unable to query music source state", "ERROR")) { + driver->MusicPlaying = false; + return -1; + } + switch (state) { + default: + printMessage("OpenAL", "WARNING: Unhandled Music state", WHITE ); + printStatus("ERROR", YELLOW); + driver->MusicPlaying = false; + return -1; + case AL_INITIAL: + { + printMessage("OPENAL", "Music in INITIAL State. AutoStarting\n", WHITE ); + for (int i = 0; i < MUSICBUFFERS; i++) { + driver->MusicReader->read_samples( driver->music_memory, ACM_BUFFERSIZE >> 1 ); + alBufferData( driver->MusicBuffer[i], AL_FORMAT_STEREO16, + driver->music_memory, ACM_BUFFERSIZE, + driver->MusicReader->get_samplerate() ); + } + alSourceQueueBuffers( driver->MusicSource, MUSICBUFFERS, driver->MusicBuffer ); + if (alIsSource( driver->MusicSource )) { + alSourcePlay( driver->MusicSource ); + checkALError("Error playing music source", "ERROR"); + } + bFinished = AL_FALSE; + } + break; + case AL_STOPPED: + printMessage("OpenAL", "WARNING: Buffer Underrun. AutoRestarting Stream Playback\n", WHITE ); + if (alIsSource( driver->MusicSource )) { + alSourcePlay( driver->MusicSource ); + checkALError("Error playing music source", "ERROR"); + } + break; + case AL_PLAYING: + break; + } + ALint processed; + alGetSourcei( driver->MusicSource, AL_BUFFERS_PROCESSED, &processed ); + if (checkALError("Unable to query music source state", "ERROR")) { + driver->MusicPlaying = false; + return -1; + } + if (processed > 0) { + buffersreturned += processed; + while (processed) { + ALuint BufferID; + alSourceUnqueueBuffers( driver->MusicSource, 1, &BufferID ); + if (checkALError("Unable to unqueue music buffers", "ERROR")) { + driver->MusicPlaying = false; + return -1; + } + if (bFinished == AL_FALSE) { + int size = ACM_BUFFERSIZE; + int cnt = driver->MusicReader->read_samples( driver->music_memory, ACM_BUFFERSIZE >> 1 ); + size -= ( cnt * 2 ); + if (size != 0) + bFinished = AL_TRUE; + if (bFinished) { + printMessage("OpenAL", "Playing Next Music\n", WHITE ); + core->GetMusicMgr()->PlayNext(); + if (driver->MusicPlaying) { + printMessage( "OpenAL", "Queuing New Music\n", WHITE ); + driver->MusicReader->read_samples( ( driver->music_memory + cnt ), size >> 1 ); + bFinished = AL_FALSE; + } else { + printMessage( "OpenAL", "No Other Music to play\n", WHITE ); + memset( driver->music_memory + cnt, 0, size ); + driver->MusicPlaying = false; + break; + } + } + alBufferData( BufferID, AL_FORMAT_STEREO16, driver->music_memory, ACM_BUFFERSIZE, driver->MusicReader->get_samplerate() ); + if (checkALError("Unable to buffer music data", "ERROR")) { + driver->MusicPlaying = false; + return -1; + } + alSourceQueueBuffers( driver->MusicSource, 1, &BufferID ); + if (checkALError("Unable to queue music buffers", "ERROR")) { + driver->MusicPlaying = false; + return -1; + } + processed--; + } + } + } + } + } + return 0; +} + +//This one is used for movies, might be useful for others ? +void OpenALAudioDriver::QueueBuffer(int stream, unsigned short bits, + int channels, short* memory, + int size, int samplerate) +{ + ALuint Buffer; + + alGenBuffers(1, &Buffer); + if (checkALError("Unable to create buffer", "ERROR")) { + return; + } + + alBufferData(Buffer, GetFormatEnum(channels, bits), memory, size, samplerate); + if (checkALError("Unable to buffer data", "ERROR")) { + return; + } + + streams[stream].delete_buffers = true; + streams[stream].ClearProcessedBuffers(); + + alSourceQueueBuffers(streams[stream].Source, 1, &Buffer ); + if (checkALError("Unable to queue buffer", "ERROR")) { + return; + } + + ALenum state; + alGetSourcei(streams[stream].Source, AL_SOURCE_STATE, &state); + if (checkALError("Unable to query source state", "ERROR")) { + return; + } + + if (state != AL_PLAYING ) { + alSourcePlay(streams[stream].Source); + checkALError("Unable to play source", "ERROR"); + } + + return; +} + +#include "plugindef.h" + +GEMRB_PLUGIN(0x27DD67E0, "OpenAL Audio Driver") +PLUGIN_DRIVER(OpenALAudioDriver, "openal") +END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.cpp index c7ec0da6f..cc996bd99 100644 --- a/project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/PLTImporter/PLTImporter.cpp @@ -49,16 +49,18 @@ PLTImporter::~PLTImporter(void) } } -bool PLTImporter::Open(DataStream* stream) +bool PLTImporter::Open(DataStream* str) { - str = stream; + if (!str) { + return false; + } char Signature[8]; unsigned short unknown[4]; str->Read( Signature, 8 ); if (strncmp( Signature, "PLT V1 ", 8 ) != 0) { - printf( "[PLTImporter]: Not a valid PLT File.\n" ); + print( "[PLTImporter]: Not a valid PLT File.\n" ); return false; } @@ -68,7 +70,7 @@ bool PLTImporter::Open(DataStream* stream) pixels = malloc( Width * Height * 2 ); str->Read( pixels, Width * Height * 2 ); - + delete str; return true; } @@ -106,5 +108,5 @@ Sprite2D* PLTImporter::GetSprite2D(unsigned int type, ieDword paletteIndex[8]) #include "plugindef.h" GEMRB_PLUGIN(0x8D0C64F, "PLT File Importer") -PLUGIN_IE_RESOURCE(PLTImporter, ".plt", (ieWord)IE_PLT_CLASS_ID) +PLUGIN_IE_RESOURCE(PLTImporter, "plt", (ieWord)IE_PLT_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.cpp index 30afe7481..f39ff02bd 100644 --- a/project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/PNGImporter/PNGImporter.cpp @@ -213,5 +213,5 @@ void PNGImporter::GetPalette(int colors, Color* pal) #include "plugindef.h" GEMRB_PLUGIN(0x11C3EB12, "PNG File Importer") -PLUGIN_IE_RESOURCE(PNGImporter, ".png", (ieWord)IE_PNG_CLASS_ID) +PLUGIN_IE_RESOURCE(PNGImporter, "png", (ieWord)IE_PNG_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.cpp index 013cc75e0..481b90a44 100644 --- a/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.cpp @@ -28,33 +28,27 @@ PROImporter::PROImporter(void) { str = NULL; - autoFree = false; } PROImporter::~PROImporter(void) { - if (autoFree) { - delete str; - } + delete str; str = NULL; } -bool PROImporter::Open(DataStream* stream, bool autoFree) +bool PROImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (this->autoFree) { - delete str; - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "PRO V1.0", 8 ) == 0) { version = 10; } else { - printf( "[PROImporter]: This file is not a valid PRO File\n" ); + print( "[PROImporter]: This file is not a valid PRO File\n" ); return false; } diff --git a/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.h b/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.h index d6c7b91c1..7c22587e8 100644 --- a/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/PROImporter/PROImporter.h @@ -31,13 +31,12 @@ class PROImporter : public ProjectileMgr { private: DataStream* str; - bool autoFree; int version; public: PROImporter(void); ~PROImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Projectile* GetProjectile(Projectile *s); private: void GetAreaExtension(ProjectileExtension *s); diff --git a/project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp b/project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp index 477894e55..a11598eee 100644 --- a/project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp @@ -24,7 +24,10 @@ #include "EffectQueue.h" #include "Game.h" #include "GameData.h" +#include "GlobalTimer.h" #include "Interface.h" +#include "Map.h" +#include "TableMgr.h" #include "TileMap.h" #include "Video.h" //for tints #include "Scriptable/Actor.h" @@ -94,7 +97,7 @@ void RegisterTormentOpcodes() //retreat_from (works only in PST) - forces target to run away/walk away from Owner int fx_retreat_from (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_retreat_from (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_retreat_from (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); if (!Owner) { return FX_NOT_APPLIED; @@ -125,7 +128,7 @@ int fx_retreat_from (Scriptable* Owner, Actor* target, Effect* fx) //0xba fx_set_status int fx_set_status (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_set_status (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_set_status (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (fx->Parameter1) { if (fx->TimingMode==FX_DURATION_INSTANT_PERMANENT) { BASE_STATE_SET (fx->Parameter2); @@ -149,7 +152,7 @@ int fx_play_bam_blended (Scriptable* Owner, Actor* target, Effect* fx) { bool playonce; - if (0) printf( "fx_play_bam_blended (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_play_bam_blended (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (!Owner) Owner = target; if (!Owner) @@ -226,7 +229,7 @@ int fx_play_bam_not_blended (Scriptable* Owner, Actor* target, Effect* fx) bool playonce; bool doublehint; - if (0) printf( "fx_play_bam_not_blended (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_play_bam_not_blended (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (!Owner) Owner = target; if (!Owner) @@ -332,7 +335,7 @@ int fx_play_bam_not_blended (Scriptable* Owner, Actor* target, Effect* fx) //0xc0 fx_transfer_hp int fx_transfer_hp (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_transfer_hp (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_transfer_hp (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (Owner->Type!=ST_ACTOR) { return FX_NOT_APPLIED; } @@ -383,7 +386,7 @@ int fx_transfer_hp (Scriptable* Owner, Actor* target, Effect* fx) //0xc2 fx_flash_screen int fx_flash_screen (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_flash_screen (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_flash_screen (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); core->GetVideoDriver()->SetFadeColor(((unsigned char *) &fx->Parameter1)[0],((unsigned char *) &fx->Parameter1)[1],((unsigned char *) &fx->Parameter1)[2]); //this needs to be at least 2 for any effect core->timer->SetFadeFromColor(2); @@ -394,7 +397,7 @@ int fx_flash_screen (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //FIXME: implement bit4 which would mean duration int fx_tint_screen (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_tint_screen (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_tint_screen (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); int fromTime = fx->DiceSides; int toTime = fx->DiceSides; switch(fx->Parameter2&6) { @@ -410,7 +413,7 @@ int fx_tint_screen (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //it is a mystery, why they needed to make this effect int fx_special_effect (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_special_effect (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_special_effect (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); //param2 determines the effect's behaviour //0 - adder's kiss projectile (0xcd) // adds play bam and damage opcodes to the projectile @@ -439,7 +442,7 @@ int fx_special_effect (Scriptable* Owner, Actor* target, Effect* fx) //it plays multiple vvc's with a given delay and duration int fx_multiple_vvc (Scriptable* Owner, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_multiple_vvc (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_multiple_vvc (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); Map *area = Owner->GetCurrentArea(); if (!area) @@ -474,7 +477,7 @@ int fx_multiple_vvc (Scriptable* Owner, Actor* /*target*/, Effect* fx) //GemRB specific, to support BMP area background changes (desert hell projectile) int fx_change_background (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_change_background (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_change_background (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); Map *map = core->GetGame()->GetCurrentArea(); if (map) { map->SetBackground(fx->Resource, fx->Duration); @@ -486,7 +489,7 @@ int fx_change_background (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //0xc9 fx_overlay int fx_overlay (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_overlay (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_overlay (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); target->AddAnimation(fx->Resource,-1,0,true); //special effects based on fx_param2 return FX_NOT_APPLIED; @@ -499,7 +502,7 @@ int fx_overlay (Scriptable* /*Owner*/, Actor* target, Effect* fx) //but i would rather use the IWD2 method int fx_bless (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_curse (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_curse (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); //this bit is the same as the invisibility bit in other games //it should be considered what if we replace the pst invis bit //with this one (losing binary compatibility, gaining easier @@ -522,7 +525,7 @@ int fx_bless (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xcb fx_curse int fx_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_curse (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_curse (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); //this bit is the same as the invisibility bit in other games //it should be considered what if we replace the pst invis bit //with this one (losing binary compatibility, gaining easier @@ -545,7 +548,7 @@ static EffectRef fx_bless_ref = { "Bless", -1 }; int fx_prayer (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_prayer (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_prayer (%2d): Par1: %d\n", fx->Opcode, fx->Parameter1 ); int ea = target->GetStat(IE_EA); int type; if (ea>EA_EVILCUTOFF) type = 1; @@ -576,7 +579,7 @@ int fx_prayer (Scriptable* Owner, Actor* target, Effect* fx) //0xcd fx_move_view int fx_move_view (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_move_view (%2d): Speed: %d\n", fx->Opcode, fx->Parameter1 ); + if (0) print( "fx_move_view (%2d): Speed: %d\n", fx->Opcode, fx->Parameter1 ); Map *map = core->GetGame()->GetCurrentArea(); if (map) { core->timer->SetMoveViewPort( fx->PosX, fx->PosY, fx->Parameter1, true); @@ -587,7 +590,7 @@ int fx_move_view (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //0xce fx_embalm int fx_embalm (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_embalm (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_embalm (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (STATE_GET (STATE_EMBALM) ) //embalm is non cumulative return FX_NOT_APPLIED; STATE_SET( STATE_EMBALM ); @@ -610,7 +613,7 @@ int fx_embalm (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xcf fx_stop_all_action int fx_stop_all_action (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_stop_all_action (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); + if (0) print( "fx_stop_all_action (%2d): Par2: %d\n", fx->Opcode, fx->Parameter2 ); if (fx->Parameter2) { core->GetGame()->TimeStop(NULL, 0xffffffff); } else { @@ -625,7 +628,7 @@ int fx_iron_fist (Scriptable* /*Owner*/, Actor* target, Effect* fx) { ieDword p1,p2; - if (0) printf( "fx_iron_fist (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_iron_fist (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); switch (fx->Parameter2) { case 0: p1 = 3; p2 = 6; break; @@ -641,7 +644,7 @@ int fx_iron_fist (Scriptable* /*Owner*/, Actor* target, Effect* fx) //0xd1 fx_hostile_image int fx_hostile_image (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) { - if (0) printf( "fx_hostile_image (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_hostile_image (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); return FX_NOT_APPLIED; } @@ -650,7 +653,7 @@ static EffectRef fx_single_color_pulse_ref = { "Color:BriefRGB", -1 }; int fx_detect_evil (Scriptable* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_detect_evil (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + if (0) print( "fx_detect_evil (%2d): Par1: %d Par2: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); ieDword type = fx->Parameter2; //default is alignment/evil/speed 30/range 10 if (!type) type = 0x08031e0a; @@ -677,7 +680,7 @@ int fx_detect_evil (Scriptable* Owner, Actor* target, Effect* fx) //0xd3 fx_jumble_curse int fx_jumble_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_jumble_curse (%2d)\n", fx->Opcode ); + if (0) print( "fx_jumble_curse (%2d)\n", fx->Opcode ); if (STATE_GET( STATE_DEAD) ) { return FX_NOT_APPLIED; @@ -709,7 +712,7 @@ int fx_jumble_curse (Scriptable* /*Owner*/, Actor* target, Effect* fx) //In GemRB it is used in a custom spell int fx_speak_with_dead (Scriptable* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf("fx_speak_with_dead (%2d)\n", fx->Opcode ); + if (0) print("fx_speak_with_dead (%2d)\n", fx->Opcode ); if (!STATE_GET( STATE_DEAD) ) { return FX_NOT_APPLIED; } diff --git a/project/jni/application/gemrb/gemrb/plugins/SAVImporter/CMakeLists.txt b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/CMakeLists.txt new file mode 100644 index 000000000..e99bef02f --- /dev/null +++ b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/CMakeLists.txt @@ -0,0 +1 @@ +ADD_GEMRB_PLUGIN (SAVImporter SAVImporter.cpp) diff --git a/project/jni/application/gemrb/gemrb/plugins/SAVImporter/Makefile.am b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/Makefile.am new file mode 100644 index 000000000..825d8d923 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/Makefile.am @@ -0,0 +1,3 @@ +plugin_LTLIBRARIES = SAVImporter.la +SAVImporter_la_LDFLAGS = -module -avoid-version -shared +SAVImporter_la_SOURCES = SAVImporter.cpp SAVImporter.h diff --git a/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.cpp new file mode 100644 index 000000000..2c53d81b3 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.cpp @@ -0,0 +1,122 @@ +/* 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 "SAVImporter.h" + +#include "win32def.h" + +#include "Compressor.h" +#include "FileCache.h" +#include "Interface.h" +#include "PluginMgr.h" + +SAVImporter::SAVImporter() +{ +} + +SAVImporter::~SAVImporter() +{ +} + +int SAVImporter::DecompressSaveGame(DataStream *compressed) +{ + char Signature[8]; + compressed->Read( Signature, 8 ); + if (strncmp( Signature, "SAV V1.0", 8 ) ) { + return GEM_ERROR; + } + int All = compressed->Remains(); + int Current; + int percent, last_percent = 20; + if (!All) return GEM_ERROR; + do { + ieDword fnlen, complen, declen; + compressed->ReadDword( &fnlen ); + if (!fnlen) { + printMessage("SAVImporter", "Corrupt Save Detected\n", RED); + return GEM_ERROR; + } + char* fname = ( char* ) malloc( fnlen ); + compressed->Read( fname, fnlen ); + strlwr(fname); + compressed->ReadDword( &declen ); + compressed->ReadDword( &complen ); + print( "Decompressing %s\n", fname ); + DataStream* cached = CacheCompressedStream(compressed, fname, complen, true); + free( fname ); + if (!cached) + return GEM_ERROR; + delete cached; + Current = compressed->Remains(); + //starting at 20% going up to 70% + percent = (20 + (All - Current) * 50 / All); + if (percent - last_percent > 5) { + core->LoadProgress(percent); + last_percent = percent; + } + } + while(Current); + return GEM_OK; +} + +//this one can create .sav files only +int SAVImporter::CreateArchive(DataStream *compressed) +{ + if (!compressed) { + return GEM_ERROR; + } + char Signature[8]; + + memcpy(Signature,"SAV V1.0",8); + compressed->Write(Signature, 8); + + return GEM_OK; +} + +int SAVImporter::AddToSaveGame(DataStream *str, DataStream *uncompressed) +{ + ieDword fnlen, declen, complen; + + fnlen = strlen(uncompressed->filename)+1; + declen = uncompressed->Size(); + str->WriteDword( &fnlen); + str->Write( uncompressed->filename, fnlen); + str->WriteDword( &declen); + //baaah, we dump output right in the stream, we get the compressed length + //only after the compressed data was written + complen = 0xcdcdcdcd; //placeholder + unsigned long Pos = str->GetPos(); //storing the stream position + str->WriteDword( &complen); + + PluginHolder comp(PLUGIN_COMPRESSION_ZLIB); + comp->Compress( str, uncompressed ); + + //writing compressed length (calculated) + unsigned long Pos2 = str->GetPos(); + complen = Pos2-Pos-sizeof(ieDword); //calculating the compressed stream size + str->Seek(Pos, GEM_STREAM_START); //going back to the placeholder + str->WriteDword( &complen); //updating size + str->Seek(Pos2, GEM_STREAM_START);//resuming work + return GEM_OK; +} + +#include "plugindef.h" + +GEMRB_PLUGIN(0xCDF132C, "SAV File Importer") +PLUGIN_CLASS(IE_SAV_CLASS_ID, SAVImporter) +END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.h b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.h new file mode 100644 index 000000000..9f9404c29 --- /dev/null +++ b/project/jni/application/gemrb/gemrb/plugins/SAVImporter/SAVImporter.h @@ -0,0 +1,39 @@ +/* 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 SAVIMPORTER_H +#define SAVIMPORTER_H + +#include "ArchiveImporter.h" + +#include "globals.h" + +#include "System/DataStream.h" + +class SAVImporter : public ArchiveImporter { +public: + SAVImporter(void); + ~SAVImporter(void); + int DecompressSaveGame(DataStream *compressed); + int AddToSaveGame(DataStream *str, DataStream *uncompressed); + int CreateArchive(DataStream *compressed); +}; + +#endif diff --git a/project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp b/project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp index d3075529b..43e79f165 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/SDLAudio/SDLAudio.cpp @@ -138,7 +138,7 @@ Holder SDLAudio::Play(const char* ResRef, int XPos, int YPos, unsig // TODO: move this loading code somewhere central ResourceHolder acm(ResRef); if (!acm) { - printf("failed acm load\n"); + print("failed acm load\n"); return Holder(); } int cnt = acm->get_length(); @@ -170,7 +170,7 @@ Holder SDLAudio::Play(const char* ResRef, int XPos, int YPos, unsig // make SDL_mixer chunk Mix_Chunk *chunk = Mix_QuickLoad_RAW(cvt.buf, cvt.len*cvt.len_ratio); if (!chunk) { - printf("error loading chunk\n"); + print("error loading chunk\n"); return Holder(); } @@ -183,7 +183,7 @@ Holder SDLAudio::Play(const char* ResRef, int XPos, int YPos, unsig channel = Mix_PlayChannel(channel, chunk, 0); if (channel < 0) { SDL_mutexV(OurMutex); - printf("error playing channel\n"); + print("error playing channel\n"); return Holder(); } @@ -197,7 +197,7 @@ Holder SDLAudio::Play(const char* ResRef, int XPos, int YPos, unsig int SDLAudio::CreateStream(Holder newMusic) { - printf("SDLAudio setting new music\n"); + print("SDLAudio setting new music\n"); MusicReader = newMusic; // TODO @@ -295,7 +295,7 @@ int SDLAudio::SetupNewStream(ieWord x, ieWord y, ieWord z, (void)gain; (void)point; - printf("SDLAudio allocating stream\n"); + print("SDLAudio allocating stream\n"); // TODO: buggy MusicPlaying = false; @@ -316,7 +316,7 @@ bool SDLAudio::ReleaseStream(int stream, bool HardStop) return false; } - printf("SDLAudio releasing stream\n"); + print("SDLAudio releasing stream\n"); (void)HardStop; @@ -359,8 +359,8 @@ void SDLAudio::QueueBuffer(int stream, unsigned short bits, SDL_AudioCVT cvt; if (SDL_BuildAudioCVT(&cvt, (bits == 8 ? AUDIO_S8 : AUDIO_S16SYS), channels, samplerate, audio_format, audio_channels, audio_rate) == 0) { - printMessage("SDLAudio", "Couldn't convert video stream!\n", RED ); - printf("trying to convert %d bits, %d channels, %d rate\n", bits, channels, samplerate); + printMessage("SDLAudio", "Couldn't convert video stream!\ntrying to convert %d bits, %d channels, %d rate\n", RED, + bits, channels, samplerate); return; } cvt.buf = (Uint8*)malloc(size*cvt.len_mult); diff --git a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp index be87bcfc3..21a9696d2 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.cpp @@ -28,8 +28,11 @@ #include "GameData.h" #include "Interface.h" #include "Palette.h" +#include "Polygon.h" #include "SpriteCover.h" #include "GUI/Console.h" +#include "GUI/EventMgr.h" +#include "GUI/Window.h" #include #include @@ -47,7 +50,7 @@ SDLVideoDriver::SDLVideoDriver(void) xCorr = 0; yCorr = 0; lastTime = 0; - GetTime( lastMouseTime ); + lastMouseTime = GetTickCount(); backBuf=NULL; extra=NULL; subtitlestrref = 0; @@ -73,12 +76,12 @@ SDLVideoDriver::~SDLVideoDriver(void) int SDLVideoDriver::Init(void) { - //printf("[SDLVideoDriver]: Init..."); + //print("[SDLVideoDriver]: Init..."); if (SDL_InitSubSystem( SDL_INIT_VIDEO ) == -1) { - //printf("[ERROR]\n"); + //print("[ERROR]\n"); return GEM_ERROR; } - //printf("[OK]\n"); + //print("[OK]\n"); SDL_EnableUNICODE( 1 ); SDL_EnableKeyRepeat( 500, 50 ); SDL_ShowCursor( SDL_DISABLE ); @@ -141,13 +144,10 @@ void SDLVideoDriver::SetDisplayTitle(char* title, char* icon) SDL_WM_SetCaption( title, icon ); } -bool SDLVideoDriver::ToggleFullscreenMode(int set_reset) +bool SDLVideoDriver::SetFullscreenMode(bool set) { - if (set_reset==-1) { - set_reset=!fullscreen; - } - if (fullscreen != set_reset) { - fullscreen=set_reset; + if (fullscreen != set) { + fullscreen=set; SDL_WM_ToggleFullScreen( disp ); //readjust mouse to original position MoveMouse(CursorPos.x, CursorPos.y); @@ -171,10 +171,10 @@ int SDLVideoDriver::SwapBuffers(void) { int ret = GEM_OK; unsigned long time; - GetTime( time ); - if (( time - lastTime ) < 17) { - SDL_Delay( 17 - (time - lastTime) ); - GetTime( time ); + time = GetTickCount(); + if (( time - lastTime ) < 33) { + SDL_Delay( 33 - (time - lastTime) ); + time = GetTickCount(); } lastTime = time; @@ -214,7 +214,7 @@ int SDLVideoDriver::SwapBuffers(void) unsigned int delay = core->TooltipDelay; // The multiplication by 10 is there since the last, disabling slider position is the eleventh if (!ConsolePopped && (delay delay) { if (Evnt) @@ -266,7 +266,7 @@ int SDLVideoDriver::PollEvents() { break; case SDLK_f: if (modstate & GEM_MOD_CTRL) { - ToggleFullscreenMode(-1); + ToggleFullscreenMode(); } break; default: @@ -308,12 +308,16 @@ int SDLVideoDriver::PollEvents() { case SDLK_RIGHT: key = GEM_RIGHT; break; + case SDLK_DELETE: +#ifndef TARGET_OS_IPHONE + //iOS currently doesnt have a backspace so we use delete. + //This change should be future proof in the event they change delete + key = GEM_DELETE; + break; +#endif case SDLK_BACKSPACE: key = GEM_BACKSP; break; - case SDLK_DELETE: - key = GEM_DELETE; - break; case SDLK_RETURN: case SDLK_KP_ENTER: key = GEM_RETURN; @@ -816,7 +820,7 @@ void SDLVideoDriver::BlitSpriteRegion(const Sprite2D* spr, const Region& size, i } } -void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, bool trans) +void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags) { if (spr->BAM) { printMessage( "SDLVideo", "Tile blit not supported for this sprite\n", LIGHT_RED ); @@ -866,7 +870,7 @@ void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, } bool tint = false; - Color tintcol = {0,0,0,0}; + Color tintcol = {255,255,255,0}; if (core->GetGame()) { const Color* totint = core->GetGame()->GetGlobalTint(); @@ -882,27 +886,58 @@ void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, else \ BlitTile_internal(backBuf, x, y, rx, ry, w, h, data, pal, mask_data, ck, T, B); \ + if (flags & TILE_GREY) { - if (trans) { - TRBlender_HalfTrans B(backBuf->format); + if (flags & TILE_HALFTRANS) { + TRBlender_HalfTrans B(backBuf->format); - if (tint) { - TRTinter_Tint T(tintcol); + TRTinter_Grey T(tintcol); DO_BLIT } else { - TRTinter_NoTint T; + TRBlender_Opaque B(backBuf->format); + + TRTinter_Grey T(tintcol); DO_BLIT } + + } else if (flags & TILE_SEPIA) { + + if (flags & TILE_HALFTRANS) { + TRBlender_HalfTrans B(backBuf->format); + + TRTinter_Sepia T(tintcol); + DO_BLIT + } else { + TRBlender_Opaque B(backBuf->format); + + TRTinter_Sepia T(tintcol); + DO_BLIT + } + } else { - TRBlender_Opaque B(backBuf->format); - if (tint) { - TRTinter_Tint T(tintcol); - DO_BLIT + if (flags & TILE_HALFTRANS) { + TRBlender_HalfTrans B(backBuf->format); + + if (tint) { + TRTinter_Tint T(tintcol); + DO_BLIT + } else { + TRTinter_NoTint T; + DO_BLIT + } } else { - TRTinter_NoTint T; - DO_BLIT + TRBlender_Opaque B(backBuf->format); + + if (tint) { + TRTinter_Tint T(tintcol); + DO_BLIT + } else { + TRTinter_NoTint T; + DO_BLIT + } } + } #undef DO_BLIT @@ -1309,7 +1344,7 @@ void SDLVideoDriver::BlitGameSprite(const Sprite2D* spr, int x, int y, // tinted // covered -// printf("Unoptimized blit: %04X\n", flags); +// print("Unoptimized blit: %04X\n", flags); #define SPECIALPIXEL int ia=0; if ((remflags & BLIT_HALFTRANS) || (p == 1 && (remflags & BLIT_TRANSSHADOW))) ia = 1; if (p == 1 && (remflags & BLIT_NOSHADOW)) { } else @@ -1439,7 +1474,7 @@ void SDLVideoDriver::BlitGameSprite(const Sprite2D* spr, int x, int y, // transshadow (impossible with 32bpp) // palettealpha (always set) -// printf("Unoptimized blit: %04X\n", flags); +// print("Unoptimized blit: %04X\n", flags); #define SPECIALPIXEL int ia=0; if ((remflags & BLIT_HALFTRANS)) ia = 1; if (p == 1 && (remflags & BLIT_NOSHADOW)) { } else @@ -1555,8 +1590,8 @@ void SDLVideoDriver::SetDragCursor(Sprite2D* drag) Sprite2D* SDLVideoDriver::GetScreenshot( Region r ) { - int Width = r.w ? r.w : disp->w; - int Height = r.h ? r.h : disp->h; + unsigned int Width = r.w ? r.w : disp->w; + unsigned int Height = r.h ? r.h : disp->h; SDL_Rect src = {r.x, r.y, r.w, r.h}; @@ -1564,7 +1599,8 @@ Sprite2D* SDLVideoDriver::GetScreenshot( Region r ) 0xFF0000, 0x00FF00, 0x0000FF, 0x000000 ); SDL_BlitSurface( backBuf, (r.w && r.h) ? &src : NULL, surf, NULL); void* pixels = malloc( Width * Height * 3 ); - memcpy( pixels, surf->pixels, Width * Height * 3 ); + for (unsigned int y = 0; y < Height; y++) + memcpy( (char*)pixels+(Width * y * 3), (char*)surf->pixels+(surf->pitch * y), Width * 3 ); //freeing up temporary surface as we copied its pixels Sprite2D* screenshot = CreateSprite( Width, Height, 24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000, pixels, false, 0 ); SDL_FreeSurface(surf); @@ -1696,7 +1732,7 @@ inline void WritePixel(const long val, unsigned char *pixels, int BytesPerPixel) void SDLVideoDriver::SetPixel(short x, short y, const Color& color, bool clipped) { - //printf("x: %d; y: %d; XC: %d; YC: %d, VX: %d, VY: %d, VW: %d, VH: %d\n", x, y, xCorr, yCorr, Viewport.x, Viewport.y, Viewport.w, Viewport.h); + //print("x: %d; y: %d; XC: %d; YC: %d, VX: %d, VY: %d, VW: %d, VH: %d\n", x, y, xCorr, yCorr, Viewport.x, Viewport.y, Viewport.w, Viewport.h); if (clipped) { x += xCorr; y += yCorr; @@ -2333,7 +2369,7 @@ void SDLVideoDriver::GetMousePos(int &x, int &y) void SDLVideoDriver::MouseMovement(int x, int y) { - GetTime( lastMouseTime ); + lastMouseTime = GetTickCount(); if (DisableMouse&MOUSE_DISABLED) return; CursorPos.x = x; // - mouseAdjustX[CursorIndex]; @@ -2414,8 +2450,7 @@ void SDLVideoDriver::showFrame(unsigned char* buf, unsigned int bufw, sprite = SDL_CreateRGBSurfaceFrom( buf, bufw, bufh, 16, 2 * bufw, 0x7C00, 0x03E0, 0x001F, 0 ); } else { - sprite = SDL_CreateRGBSurfaceFrom( buf, bufw, bufh, 8, bufw, 0x7C00, - 0x03E0, 0x001F, 0 ); + sprite = SDL_CreateRGBSurfaceFrom( buf, bufw, bufh, 8, bufw, 0, 0, 0, 0 ); for (i = 0; i < 256; i++) { sprite->format->palette->colors[i].r = ( *pal++ ) << 2; @@ -2494,7 +2529,7 @@ int SDLVideoDriver::PollMovieEvents() case SDLK_q: return 1; case SDLK_f: - ToggleFullscreenMode(-1); + ToggleFullscreenMode(); break; default: break; diff --git a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.h b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.h index e24ad9f85..b67fa17d4 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.h +++ b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/SDLVideo.h @@ -25,6 +25,7 @@ #include "win32def.h" +#include #include class SDLVideoDriver : public Video { @@ -55,7 +56,7 @@ public: int Init(void); int CreateDisplay(int width, int height, int bpp, bool fullscreen); void SetDisplayTitle(char* title, char* icon); - bool ToggleFullscreenMode(int set_reset=-1); + bool SetFullscreenMode(bool set); int SwapBuffers(void); int PollEvents(); bool ToggleGrabInput(); @@ -82,7 +83,7 @@ public: bool SupportsBAMSprites() { return true; } void FreeSprite(Sprite2D* &spr); Sprite2D* DuplicateSprite(const Sprite2D* spr); - void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, bool trans); + void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags); void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, const Region* clip = NULL); void BlitSpriteRegion(const Sprite2D* spr, const Region& size, int x, int y, diff --git a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/TileRenderer.inl b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/TileRenderer.inl index 21825e091..86a8bccbd 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SDLVideo/TileRenderer.inl +++ b/project/jni/application/gemrb/gemrb/plugins/SDLVideo/TileRenderer.inl @@ -20,17 +20,46 @@ struct TRTinter_NoTint { - Uint8 r(Uint8 v) const { return v; } - Uint8 g(Uint8 v) const { return v; } - Uint8 b(Uint8 v) const { return v; } + void operator()(Uint8&, Uint8&, Uint8&) const { } }; struct TRTinter_Tint { TRTinter_Tint(const Color& t) : tint(t) { } - Uint8 r(Uint8 v) const { return (tint.r * v) >> 8; } - Uint8 g(Uint8 v) const { return (tint.g * v) >> 8; } - Uint8 b(Uint8 v) const { return (tint.b * v) >> 8; } + void operator()(Uint8& vr, Uint8& vg, Uint8& vb) const { + vr = (tint.r * vr) >> 8; + vg = (tint.g * vg) >> 8; + vb = (tint.b * vb) >> 8; + } + + Color tint; +}; + +struct TRTinter_Grey { + TRTinter_Grey(const Color& t) : tint(t) { } + + void operator()(Uint8& vr, Uint8& vg, Uint8& vb) const { + vr = (tint.r * vr) >> 10; + vg = (tint.g * vg) >> 10; + vb = (tint.b * vb) >> 10; + Uint8 a = vr + vg + vb; + vr = vg = vb = a; + } + + Color tint; +}; +struct TRTinter_Sepia { + TRTinter_Sepia(const Color& t) : tint(t) { } + + void operator()(Uint8& vr, Uint8& vg, Uint8& vb) const { + vr = (tint.r * vr) >> 10; + vg = (tint.g * vg) >> 10; + vb = (tint.b * vb) >> 10; + Uint8 a = vr + vg + vb; + vr = a + 21; // can't overflow, since a is at most 189 + vg = a; + vb = a < 32 ? 0 : a - 32; + } Color tint; }; @@ -77,9 +106,10 @@ static void BlitTile_internal(SDL_Surface* target, for (unsigned int i = 0; i < 256; ++i) { - Uint8 r = tint.r(pal[i].r); - Uint8 g = tint.g(pal[i].g); - Uint8 b = tint.b(pal[i].b); + Uint8 r = pal[i].r; + Uint8 g = pal[i].g; + Uint8 b = pal[i].b; + tint(r, g, b); opal[i] = (r >> target->format->Rloss) << target->format->Rshift | (g >> target->format->Gloss) << target->format->Gshift | (b >> target->format->Bloss) << target->format->Bshift; diff --git a/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.cpp index c8c9bfe01..6f6505798 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.cpp @@ -24,13 +24,14 @@ #include "EffectMgr.h" #include "Interface.h" +#include "PluginMgr.h" #include "TableMgr.h" //needed for autotable int *cgsounds = NULL; int cgcount = -1; //cannot call this at the time of initialization because the tablemanager isn't alive yet -void Initializer() +static void Initializer() { if (cgsounds) { free(cgsounds); @@ -40,7 +41,7 @@ void Initializer() AutoTable tm("cgtable"); if (!tm) { printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find cgtable.2da.\n"); + print( "Cannot find cgtable.2da.\n"); return; } cgcount = tm->GetRowCount(); @@ -50,14 +51,14 @@ void Initializer() } } -void ReleaseMemorySPL() +static void ReleaseMemorySPL() { free(cgsounds); cgsounds = NULL; cgcount = -1; } -int GetCGSound(ieDword CastingGraphics) +static int GetCGSound(ieDword CastingGraphics) { if (cgcount<0) { Initializer(); @@ -79,26 +80,20 @@ int GetCGSound(ieDword CastingGraphics) SPLImporter::SPLImporter(void) { str = NULL; - autoFree = false; } SPLImporter::~SPLImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool SPLImporter::Open(DataStream* stream, bool autoFree) +bool SPLImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "SPL V1 ", 8 ) == 0) { @@ -106,7 +101,7 @@ bool SPLImporter::Open(DataStream* stream, bool autoFree) } else if (strncmp( Signature, "SPL V2.0", 8 ) == 0) { version = 20; } else { - printf( "[SPLImporter]: This file is not a valid SPL File\n" ); + print( "[SPLImporter]: This file is not a valid SPL File\n" ); return false; } diff --git a/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.h b/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.h index 2b355bbc4..f4d0caa60 100644 --- a/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/SPLImporter/SPLImporter.h @@ -31,13 +31,12 @@ class SPLImporter : public SpellMgr { private: DataStream* str; - bool autoFree; int version; public: SPLImporter(void); ~SPLImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Spell* GetSpell(Spell *spl, bool silent=false); private: void GetExtHeader(Spell *s, SPLExtHeader* eh); diff --git a/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.cpp index 14dabd0b5..ae2fd76af 100644 --- a/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.cpp @@ -30,26 +30,20 @@ STOImporter::STOImporter(void) { str = NULL; - autoFree = false; } STOImporter::~STOImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool STOImporter::Open(DataStream* stream, bool autoFree) +bool STOImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "STORV1.0", 8 ) == 0) { @@ -62,7 +56,7 @@ bool STOImporter::Open(DataStream* stream, bool autoFree) //GemRB's internal version with all known fields supported version = 0; } else { - printf( "[STOImporter]: This file is not a valid STO File\n" ); + print( "[STOImporter]: This file is not a valid STO File\n" ); return false; } @@ -119,10 +113,20 @@ Store* STOImporter::GetStore(Store *s) memset( s->unknown3, 0, 80 ); } - //Allocation must be done in the same place as destruction. - //Yeah, this is intentionally so ugly, someone who doesn't like this - //may fix it. - core->DoTheStoreHack(s); + size_t size = s->PurchasedCategoriesCount * sizeof( ieDword ); + s->purchased_categories=(ieDword *) malloc(size); + + size = s->CuresCount * sizeof( STOCure ); + s->cures=(STOCure *) malloc(size); + + size = s->DrinksCount * sizeof( STODrink ); + s->drinks=(STODrink *) malloc(size); + + for(size=0;sizeItemsCount;size++) { + STOItem *si = new STOItem(); + memset(si, 0, sizeof(STOItem) ); + s->items.push_back( si ); + } str->Seek( s->PurchasedCategoriesOffset, GEM_STREAM_START ); GetPurchasedCategories( s ); @@ -166,9 +170,12 @@ void STOImporter::GetItem(STOItem *it) if (!it->AmountInStock) { it->AmountInStock = 1; } - //another hack-fix + // make sure the inventory knows that it needs to update flags+weight + it->Weight = -1; Item *item = gamedata->GetItem( it->ItemResRef ); if (item) { + it->MaxStackAmount = item->MaxStackAmount; + //another hack-fix if (!item->LoreToID) { it->Flags |= IE_INV_ITEM_IDENTIFIED; } @@ -221,7 +228,7 @@ void STOImporter::GetPurchasedCategories(Store* s) } //call this before any write, it updates offsets! -int STOImporter::GetStoredFileSize(Store *s) +void STOImporter::CalculateStoredFileSize(Store *s) { int headersize, itemsize; @@ -257,19 +264,16 @@ int STOImporter::GetStoredFileSize(Store *s) //items s->ItemsOffset = headersize; headersize += s->ItemsCount * itemsize; - - return headersize; } -int STOImporter::PutPurchasedCategories(DataStream *stream, Store* s) +void STOImporter::PutPurchasedCategories(DataStream *stream, Store* s) { for (unsigned int i = 0; i < s->PurchasedCategoriesCount; i++) { stream->WriteDword( s->purchased_categories+i ); } - return 0; } -int STOImporter::PutHeader(DataStream *stream, Store *s) +void STOImporter::PutHeader(DataStream *stream, Store *s) { char Signature[8]; ieDword tmpDword; @@ -321,10 +325,9 @@ int STOImporter::PutHeader(DataStream *stream, Store *s) stream->WriteDword( &tmpDword); stream->Write( s->unknown3, 80); //writing out original fillers } - return 0; } -int STOImporter::PutItems(DataStream *stream, Store *store) +void STOImporter::PutItems(DataStream *stream, Store *store) { for (unsigned int ic=0;icItemsCount;ic++) { STOItem *it = store->items[ic]; @@ -344,20 +347,18 @@ int STOImporter::PutItems(DataStream *stream, Store *store) stream->WriteDword( (ieDword *) &it->InfiniteSupply ); } } - return 0; } -int STOImporter::PutCures(DataStream *stream, Store *s) +void STOImporter::PutCures(DataStream *stream, Store *s) { for (unsigned int i=0;iCuresCount;i++) { STOCure *c = s->cures+i; stream->WriteResRef( c->CureResRef); stream->WriteDword( &c->Price); } - return 0; } -int STOImporter::PutDrinks(DataStream *stream, Store *s) +void STOImporter::PutDrinks(DataStream *stream, Store *s) { for (unsigned int i=0;iDrinksCount;i++) { STODrink *d = s->drinks+i; @@ -366,41 +367,23 @@ int STOImporter::PutDrinks(DataStream *stream, Store *s) stream->WriteDword( &d->Price); stream->WriteDword( &d->Strength); } - return 0; } //saves the store into a datastream, be it memory or file -int STOImporter::PutStore(DataStream *stream, Store *store) +bool STOImporter::PutStore(DataStream *stream, Store *store) { - int ret; - if (!stream || !store) { - return -1; + return false; } - ret = PutHeader( stream, store); - if (ret) { - return ret; - } + CalculateStoredFileSize(store); + PutHeader(stream, store); + PutDrinks(stream, store); + PutCures(stream, store); + PutPurchasedCategories(stream, store); + PutItems(stream, store); - ret = PutDrinks( stream, store); - if (ret) { - return ret; - } - - ret = PutCures( stream, store); - if (ret) { - return ret; - } - - ret = PutPurchasedCategories (stream, store); - if (ret) { - return ret; - } - - ret = PutItems( stream, store); - - return ret; + return true; } #include "plugindef.h" diff --git a/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.h b/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.h index c5c20250c..069813b4d 100644 --- a/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/STOImporter/STOImporter.h @@ -31,19 +31,18 @@ class STOImporter : public StoreMgr { private: DataStream* str; - bool autoFree; int version; public: STOImporter(void); ~STOImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Store* GetStore(Store *store); //returns saved size, updates internal offsets before save - int GetStoredFileSize(Store *st); + void CalculateStoredFileSize(Store *st); //saves file - int PutStore(DataStream *stream, Store *store); + bool PutStore(DataStream *stream, Store *store); private: void GetItem(STOItem *item); @@ -51,11 +50,11 @@ private: void GetCure(STOCure *cure); void GetPurchasedCategories(Store* s); - int PutItems(DataStream *stream, Store* s); - int PutDrinks(DataStream *stream, Store* s); - int PutCures(DataStream *stream, Store* s); - int PutPurchasedCategories(DataStream *stream, Store* s); - int PutHeader(DataStream *stream, Store *store); + void PutItems(DataStream *stream, Store* s); + void PutDrinks(DataStream *stream, Store* s); + void PutCures(DataStream *stream, Store* s); + void PutPurchasedCategories(DataStream *stream, Store* s); + void PutHeader(DataStream *stream, Store *store); }; diff --git a/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.cpp index 3a5cb1934..dfda94201 100644 --- a/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.cpp @@ -24,37 +24,32 @@ #include "win32def.h" #include "Interface.h" +#include "Sprite2D.h" #include "Video.h" TISImporter::TISImporter(void) { str = NULL; - autoFree = false; } TISImporter::~TISImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool TISImporter::Open(DataStream* stream, bool autoFree) +bool TISImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); headerShift = 0; if (Signature[0] == 'T' && Signature[1] == 'I' && Signature[2] == 'S') { if (strncmp( Signature, "TIS V1 ", 8 ) != 0) { - printf( "[TISImporter]: Not a Valid TIS File.\n" ); + print( "[TISImporter]: Not a Valid TIS File.\n" ); return false; } str->ReadDword( &TilesCount ); @@ -98,11 +93,11 @@ Sprite2D* TISImporter::GetTile(int index) // try to only report error once per file static TISImporter *last_corrupt = NULL; if (last_corrupt != this) { - /*printf("Invalid tile index: %d\n",index); - printf("FileSize: %ld\n", str->Size() ); - printf("Position: %ld\n", pos); - printf("Shift: %d\n", headerShift);*/ - printf("Corrupt WED file encountered; couldn't find any more tiles at tile %d\n", index); + /*print("Invalid tile index: %d\n",index); + print("FileSize: %ld\n", str->Size() ); + print("Position: %ld\n", pos); + print("Shift: %d\n", headerShift);*/ + print("Corrupt WED file encountered; couldn't find any more tiles at tile %d\n", index); last_corrupt = this; } diff --git a/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.h b/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.h index 0c049d9d6..db6436f9d 100644 --- a/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/TISImporter/TISImporter.h @@ -26,13 +26,12 @@ class TISImporter : public TileSetMgr { private: DataStream* str; - bool autoFree; ieDword headerShift; ieDword TilesCount, TilesSectionLen, TileSize; public: TISImporter(void); ~TISImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); Tile* GetTile(unsigned short* indexes, int count, unsigned short* secondary = NULL); Sprite2D* GetTile(int index); diff --git a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.cpp index ed5732fee..4377bf067 100644 --- a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.cpp @@ -27,7 +27,9 @@ #include "DialogHandler.h" #include "Game.h" #include "Interface.h" +#include "TableMgr.h" #include "GUI/GameControl.h" +#include "Scriptable/Actor.h" //set this to -1 if charname is gabber (iwd2) static int charname=0; @@ -53,7 +55,6 @@ TLKImporter::TLKImporter(void) } str = NULL; override = NULL; - autoFree = false; AutoTable tm("gender"); if (tm) { @@ -73,17 +74,14 @@ TLKImporter::TLKImporter(void) } } -void ReleaseGtEntry(void *poi) +static void ReleaseGtEntry(void *poi) { delete (gt_type *) poi; } TLKImporter::~TLKImporter(void) { - if (str && autoFree) { - delete( str ); - } - + delete str; gtmap.RemoveAll(ReleaseGtEntry); @@ -110,16 +108,13 @@ void TLKImporter::OpenAux() } } -bool TLKImporter::Open(DataStream* stream, bool autoFree) +bool TLKImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "TLK\x20V1\x20\x20", 8 ) != 0) { @@ -146,7 +141,7 @@ inline char* mystrncpy(char* dest, const char* source, int maxlength, 0 - PROTAGONIST 1-9 - PLAYERx */ -inline Actor *GetActorFromSlot(int slot) +static inline Actor *GetActorFromSlot(int slot) { if (slot==-1) { GameControl *gc = core->GetGameControl(); diff --git a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.h b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.h index c2a03e01b..e90b72d05 100644 --- a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TLKImporter.h @@ -28,7 +28,6 @@ class TLKImporter : public StringMgr { private: DataStream* str; - bool autoFree; //Data ieDword StrRefCount, Offset; @@ -41,7 +40,7 @@ public: void OpenAux(); /** purge string defs coming from saved game */ void CloseAux(); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); /** construct a new custom string */ ieStrRef UpdateString(ieStrRef strref, const char *newvalue); /** resolve a string reference */ diff --git a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.cpp b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.cpp index 74a149840..4f05ca38c 100644 --- a/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/TLKImporter/TlkOverride.cpp @@ -307,7 +307,7 @@ DataStream* CTlkOverride::GetAuxHdr(bool create) PathJoin( nPath, core->CachePath, "default.toh", NULL ); FileStream* fs = new FileStream(); retry: - if (fs->Modify( nPath, true )) { + if (fs->Modify(nPath)) { return fs; } if (create) { @@ -328,7 +328,7 @@ DataStream* CTlkOverride::GetAuxTlk(bool create) PathJoin( nPath, core->CachePath, "default.tot", NULL ); FileStream* fs = new FileStream(); retry: - if (fs->Modify( nPath, true )) { + if (fs->Modify(nPath)) { return fs; } if (create) { diff --git a/project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.cpp b/project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.cpp index 90c701014..4c564c51a 100644 --- a/project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/WAVReader/WAVReader.cpp @@ -189,5 +189,5 @@ bool WavPCMReader::Open(DataStream* stream) #include "plugindef.h" GEMRB_PLUGIN(0x11BB1288, "WAV File Importer") -PLUGIN_IE_RESOURCE(WavPCMReader, ".wav", (ieWord)IE_WAV_CLASS_ID) +PLUGIN_IE_RESOURCE(WavPCMReader, "wav", (ieWord)IE_WAV_CLASS_ID) END_PLUGIN() diff --git a/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.cpp index 802937dcc..f662ce717 100644 --- a/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.cpp @@ -32,6 +32,7 @@ #include "GameData.h" #include "Interface.h" +#include "PluginMgr.h" #include "TileSetMgr.h" struct wed_polygon { @@ -47,30 +48,24 @@ struct wed_polygon { WEDImporter::WEDImporter(void) { str = NULL; - autoFree = false; } WEDImporter::~WEDImporter(void) { - if (str && autoFree) { - delete( str ); - } + delete str; } -bool WEDImporter::Open(DataStream* stream, bool autoFree) +bool WEDImporter::Open(DataStream* stream) { if (stream == NULL) { return false; } - if (str && this->autoFree) { - delete( str ); - } + delete str; str = stream; - this->autoFree = autoFree; char Signature[8]; str->Read( Signature, 8 ); if (strncmp( Signature, "WED V1.3", 8 ) != 0) { - printf( "[WEDImporter]: This file is not a valid WED File\n" ); + print( "[WEDImporter]: This file is not a valid WED File\n" ); return false; } str->ReadDword( &OverlaysCount ); @@ -214,7 +209,7 @@ void WEDImporter::GetDoorPolygonCount(ieWord count, ieDword offset) ieDword basecount = offset-PolygonsOffset; if (basecount%WED_POLYGON_SIZE) { basecount+=WED_POLYGON_SIZE; - printf("[WEDImporter]: Found broken door polygon header!\n"); + print("[WEDImporter]: Found broken door polygon header!\n"); } ieDword polycount = basecount/WED_POLYGON_SIZE+count-WallPolygonsCount; if (polycount>DoorPolygonsCount) { @@ -249,7 +244,7 @@ ieWord* WEDImporter::GetDoorIndices(char* ResRef, int* count, bool& BaseClosed) //The door has no representation in the WED file if (i == DoorsCount) { *count = 0; - printf( "[WEDImporter]: Found door without WED entry!\n" ); + print( "[WEDImporter]: Found door without WED entry!\n" ); return NULL; } diff --git a/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.h b/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.h index f725b7841..3ddf3d1b0 100644 --- a/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/WEDImporter/WEDImporter.h @@ -36,7 +36,6 @@ class WEDImporter : public TileMapMgr { private: std::vector< Overlay> overlays; DataStream* str; - bool autoFree; ieDword OverlaysCount, DoorsCount, OverlaysOffset, SecHeaderOffset, DoorsOffset, DoorTilesOffset; ieDword WallPolygonsCount, PolygonsOffset, VerticesOffset, @@ -52,7 +51,7 @@ private: public: WEDImporter(void); ~WEDImporter(void); - bool Open(DataStream* stream, bool autoFree = true); + bool Open(DataStream* stream); //if tilemap already exists, don't create it TileMap* GetTileMap(TileMap *tm); ieWord* GetDoorIndices(char* ResRef, int* count, bool& BaseClosed); diff --git a/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.cpp b/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.cpp index 929c76b5a..012701243 100644 --- a/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.cpp @@ -30,41 +30,31 @@ WMPImporter::WMPImporter(void) { str1 = NULL; str2 = NULL; - autoFree = false; } WMPImporter::~WMPImporter(void) { - if (str1 && autoFree) { - delete( str1 ); - } - if (str2 && autoFree) { - delete( str2 ); - } + delete str1; + delete str2; } -bool WMPImporter::Open(DataStream* stream1, DataStream* stream2, bool autoFree) +bool WMPImporter::Open(DataStream* stream1, DataStream* stream2) { if ((stream1 == NULL) && (stream2 == NULL) ) { return false; } - if (str1 && this->autoFree) { - delete( str1 ); - } - if (str2 && this->autoFree) { - delete( str2 ); - } + delete str1; + delete str2; str1 = stream1; str2 = stream2; - this->autoFree = autoFree; char Signature[8]; if (str1) { str1->Read( Signature, 8 ); if (strncmp( Signature, "WMAPV1.0", 8 ) != 0) { - printMessage( "WMPImporter","This file is not a valid WMP File\n", LIGHT_RED); - printf( "-->%s<--\n", stream1->filename); + printMessage("WMPImporter", "This file is not a valid WMP File\n-->%s<--\n", LIGHT_RED, + stream1->filename); return false; } str1->ReadDword( &WorldMapsCount1 ); @@ -77,8 +67,8 @@ bool WMPImporter::Open(DataStream* stream1, DataStream* stream2, bool autoFree) if (str2) { str2->Read( Signature, 8 ); if (strncmp( Signature, "WMAPV1.0", 8 ) != 0) { - printMessage( "WMPImporter","This file is not a valid WMP File\n", LIGHT_RED); - printf( "-->%s<--\n", stream2->filename); + printMessage("WMPImporter", "This file is not a valid WMP File\n-->%s<--\n", LIGHT_RED, + stream2->filename); return false; } str2->ReadDword( &WorldMapsCount2 ); @@ -177,6 +167,7 @@ WMPAreaEntry* WMPImporter::GetAreaEntry(DataStream *str, WMPAreaEntry* ae) str->ReadResRef( ae->AreaName ); str->ReadResRef( ae->AreaResRef ); str->Read( ae->AreaLongName, 32 ); + ae->AreaLongName[32]=0; ieDword tmpDword; str->ReadDword( &tmpDword ); str->ReadDword( &ae->IconSeq ); @@ -201,6 +192,7 @@ WMPAreaLink* WMPImporter::GetAreaLink(DataStream *str, WMPAreaLink* al) { str->ReadDword( &al->AreaIndex ); str->Read( al->DestEntryPoint, 32 ); + al->DestEntryPoint[32]=0; str->ReadDword( &al->DistanceScale ); str->ReadDword( &al->DirectionFlags ); for (unsigned k = 0; k < 5; k++) { diff --git a/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.h b/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.h index 9c8d51597..b346528c1 100644 --- a/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.h +++ b/project/jni/application/gemrb/gemrb/plugins/WMPImporter/WMPImporter.h @@ -32,7 +32,6 @@ class WMPImporter : public WorldMapMgr { private: DataStream* str1; DataStream* str2; - bool autoFree; ieDword WorldMapsCount; ieDword WorldMapsCount1, WorldMapsCount2; @@ -41,7 +40,7 @@ private: public: WMPImporter(void); ~WMPImporter(void); - bool Open(DataStream* stream1, DataStream* stream2, bool autoFree = true); + bool Open(DataStream* stream1, DataStream* stream2); WorldMapArray *GetWorldMapArray(); int GetStoredFileSize(WorldMapArray *wmap, unsigned int index); diff --git a/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.cpp b/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.cpp index 858ae716c..6d2286c81 100644 --- a/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.cpp +++ b/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.cpp @@ -39,7 +39,7 @@ ZLibManager::~ZLibManager(void) #define OUTPUTSIZE 8192 // ZLib Decompression Routine -int ZLibManager::Decompress(FILE* dest, DataStream* source, unsigned int size_guess) const +int ZLibManager::Decompress(DataStream* dest, DataStream* source, unsigned int size_guess) const { unsigned char bufferin[INPUTSIZE], bufferout[OUTPUTSIZE]; z_stream stream; @@ -84,8 +84,7 @@ int ZLibManager::Decompress(FILE* dest, DataStream* source, unsigned int size_gu if (( result != Z_OK ) && ( result != Z_STREAM_END )) { return GEM_ERROR; } - if (fwrite( bufferout, 1, OUTPUTSIZE - stream.avail_out, dest ) < - OUTPUTSIZE - stream.avail_out) { + if (dest->Write(bufferout, OUTPUTSIZE - stream.avail_out) == GEM_ERROR) { return GEM_ERROR; } if (result == Z_STREAM_END) { diff --git a/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.h b/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.h index 784494cae..0beced8a9 100644 --- a/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.h +++ b/project/jni/application/gemrb/gemrb/plugins/ZLibManager/ZLibManager.h @@ -28,7 +28,7 @@ public: ZLibManager(void); ~ZLibManager(void); // ZLib Decompression Routine - int Decompress(FILE* dest, DataStream* source, unsigned int size_guess) const; + int Decompress(DataStream* dest, DataStream* source, unsigned int size_guess) const; // ZLib Compression int Compress(DataStream* dest, DataStream* source) const; };

EU<&w;456E-Thm;aKmw{PAwB-*dik)gSoz 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%0Dcs%TK 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