diff options
author | Kamil Zbróg | 2013-11-02 15:29:36 +0000 |
---|---|---|
committer | Kamil Zbróg | 2013-11-02 15:29:36 +0000 |
commit | 5d8e664b003b4d06f52500e530e0f566b3dc7139 (patch) | |
tree | 19bb88dea32b3dbc7f191d966920d332b228fc45 | |
parent | e72742d0e3c040869e57c559cbc6ed8504dd5d09 (diff) | |
parent | 7e1f280a9b56e48ea2e64a54018794c71bdefc51 (diff) | |
download | scummvm-rg350-5d8e664b003b4d06f52500e530e0f566b3dc7139.tar.gz scummvm-rg350-5d8e664b003b4d06f52500e530e0f566b3dc7139.tar.bz2 scummvm-rg350-5d8e664b003b4d06f52500e530e0f566b3dc7139.zip |
Merge remote-tracking branch 'origin/master' into prince
254 files changed, 3261 insertions, 2586 deletions
@@ -6,9 +6,9 @@ ScummVM Team PR Office --------- - Arnaud Boutonne - Public Relations Officer, Project - Administrator - Eugene Sandulenko - Project Leader + Arnaud Boutonne - Public Relations Officer, Project + Administrator + Eugene Sandulenko - Project Leader Core Team --------- @@ -19,30 +19,30 @@ ScummVM Team Retired Project Leaders ----------------------- James Brown - Vincent Hamm - ScummVM co-founder, Original Cruise/CinE - author + Vincent Hamm - ScummVM co-founder, Original Cruise/CinE + author Max Horn - Ludvig Strigeus - Original ScummVM and SimonVM author + Ludvig Strigeus - Original ScummVM and SimonVM author Engine Teams ------------ SCUMM: Torbjorn Andersson - James Brown - (retired) - Jonathan Gray - (retired) - Vincent Hamm - (retired) - Max Horn - (retired) + James Brown - (retired) + Jonathan Gray - (retired) + Vincent Hamm - (retired) + Max Horn - (retired) Travis Howell - Pawel Kolodziejski - Codecs, iMUSE, Smush, etc. - Gregory Montoir - (retired) - Eugene Sandulenko - FT INSANE, MM NES, MM C64, game detection, - Herc/CGA - Ludvig Strigeus - (retired) + Pawel Kolodziejski - Codecs, iMUSE, Smush, etc. + Gregory Montoir - (retired) + Eugene Sandulenko - FT INSANE, MM NES, MM C64, game + detection, Herc/CGA + Ludvig Strigeus - (retired) HE: - Jonathan Gray - (retired) + Jonathan Gray - (retired) Travis Howell - Gregory Montoir - (retired) + Gregory Montoir - (retired) Eugene Sandulenko AGI: @@ -50,17 +50,17 @@ ScummVM Team Matthew Hoops Filippos Karapetis Pawel Kolodziejski - Walter van Niftrik - (retired) + Walter van Niftrik - (retired) Kari Salminen Eugene Sandulenko - David Symonds - (retired) + David Symonds - (retired) AGOS: Torbjorn Andersson Paul Gilbert Travis Howell - Oliver Kiehl - (retired) - Ludvig Strigeus - (retired) + Oliver Kiehl - (retired) + Ludvig Strigeus - (retired) AVALANCHE: Peter Bozso @@ -71,9 +71,9 @@ ScummVM Team Paul Gilbert Cine: - Vincent Hamm - (retired) + Vincent Hamm - (retired) Pawel Kolodziejski - Gregory Montoir - (retired) + Gregory Montoir - (retired) Kari Salminen Eugene Sandulenko @@ -82,7 +82,7 @@ ScummVM Team CruisE: Paul Gilbert - Vincent Hamm - (retired) + Vincent Hamm - (retired) Draci: Denis Kasak @@ -96,7 +96,7 @@ ScummVM Team Torbjorn Andersson Bertrand Augereau Filippos Karapetis - Vladimir Menshakov - (retired) + Vladimir Menshakov - (retired) Willem Jan Palenstijn Gob: @@ -120,10 +120,10 @@ ScummVM Team Eugene Sandulenko Kyra: - Torbjorn Andersson - VQA Player + Torbjorn Andersson - VQA Player Oystein Eftevaag Florian Kagerer - Gregory Montoir - (retired) + Gregory Montoir - (retired) Johannes Schickel Lastexpress: @@ -161,14 +161,14 @@ ScummVM Team Matthew Hoops Queen: - David Eriksson - (retired) - Gregory Montoir - (retired) + David Eriksson - (retired) + Gregory Montoir - (retired) Joost Peters SAGA: Torbjorn Andersson - Daniel Balsom - Original engine reimplementation author - (retired) + Daniel Balsom - Original engine reimplementation author + (retired) Filippos Karapetis Andrew Kurushin Eugene Sandulenko @@ -176,46 +176,46 @@ ScummVM Team SCI: Greg Frieger Paul Gilbert - Max Horn - (retired) + Max Horn - (retired) Filippos Karapetis Martin Kiewitz - Walter van Niftrik - (retired) + Walter van Niftrik - (retired) Willem Jan Palenstijn Jordi Vilalta Prat Lars Skovlund Sky: - Robert Goeffringmann - (retired) - Oliver Kiehl - (retired) + Robert Goeffringmann - (retired) + Oliver Kiehl - (retired) Joost Peters Sword1: - Fabio Battaglia - PSX version support - Thierry Crozat - Mac version support - Robert Goeffringmann - (retired) + Fabio Battaglia - PSX version support + Thierry Crozat - Mac version support + Robert Goeffringmann - (retired) Sword2: Torbjorn Andersson - Fabio Battaglia - PSX version support - Jonathan Gray - (retired) + Fabio Battaglia - PSX version support + Jonathan Gray - (retired) Sword25: Torbjorn Andersson Paul Gilbert - Max Horn - (retired) + Max Horn - (retired) Filippos Karapetis Eugene Sandulenko TeenAgent: - Robert Megone - Help with callback rewriting - Vladimir Menshakov - (retired) + Robert Megone - Help with callback rewriting + Vladimir Menshakov - (retired) Tinsel: Torbjorn Andersson - Fabio Battaglia - PSX version support + Fabio Battaglia - PSX version support Paul Gilbert Sven Hesse - Max Horn - (retired) + Max Horn - (retired) Filippos Karapetis Joost Peters @@ -232,14 +232,14 @@ ScummVM Team Sylvain Dupont Touche: - Gregory Montoir - (retired) + Gregory Montoir - (retired) TsAGE: Arnaud Boutonne Paul Gilbert Tucker: - Gregory Montoir - (retired) + Gregory Montoir - (retired) Wintermute: Einar Johan T. Somaaen @@ -266,26 +266,26 @@ ScummVM Team Lubomyr Lisen Maemo: - Frantisek Dufka - (retired) + Frantisek Dufka - (retired) Tarek Soliman Nintendo 64: Fabio Battaglia Nintendo DS: - Bertrand Augereau - HQ software scaler + Bertrand Augereau - HQ software scaler Neil Millstone OpenPandora: John Willis PocketPC / WinCE: - Nicolas Bacca - (retired) + Nicolas Bacca - (retired) Ismail Khatib - Kostas Nakos - (retired) + Kostas Nakos - (retired) PlayStation 2: - Robert Goeffringmann - (retired) + Robert Goeffringmann - (retired) Max Lingua PSP (PlayStation Portable): @@ -293,8 +293,8 @@ ScummVM Team Joost Peters SDL (Win/Linux/OS X/etc.): - Max Horn - (retired) - Eugene Sandulenko - Asm routines, GFX layers + Max Horn - (retired) + Eugene Sandulenko - Asm routines, GFX layers SymbianOS: Jurgen Braam @@ -312,9 +312,9 @@ ScummVM Team Other subsystems ---------------- Infrastructure: - Max Horn - Backend & Engine APIs, file API, sound - mixer, audiostreams, data structures, etc. - (retired) + Max Horn - Backend & Engine APIs, file API, sound + mixer, audiostreams, data structures, + etc. (retired) Eugene Sandulenko Johannes Schickel @@ -324,33 +324,35 @@ ScummVM Team Johannes Schickel Miscellaneous: - David Corrales-Lopez - Filesystem access improvements (GSoC 2007 - task) (retired) - Jerome Fisher - MT-32 emulator - Benjamin Haisch - Heavily improved de-/encoder for DXA videos - Jochen Hoenicke - Speaker & PCjr sound support, AdLib work - (retired) - Daniel ter Laan - Restoring original Drascula tracks, and - writing convert_dxa.bat - Chris Page - Return to launcher, savestate improvements, - leak fixes, ... (GSoC 2008 task) (retired) - Robin Watts - ARM assembly routines for nice speedups on - several ports; improvements to the sound - mixer + David Corrales-Lopez - Filesystem access improvements (GSoC + 2007 task) (retired) + Jerome Fisher - MT-32 emulator + Benjamin Haisch - Heavily improved de-/encoder for DXA + videos + Jochen Hoenicke - Speaker & PCjr sound support, AdLib + work (retired) + Daniel ter Laan - Restoring original Drascula tracks, and + writing convert_dxa.bat + Chris Page - Return to launcher, savestate + improvements, leak fixes, ... (GSoC + 2008 task) (retired) + Robin Watts - ARM assembly routines for nice speedups + on several ports; improvements to the + sound mixer Website (code) -------------- - Fredrik Wendel - (retired) + Fredrik Wendel - (retired) Website (maintenance) --------------------- - James Brown - IRC Logs maintainer - Thierry Crozat - Wiki maintainer - Andre Heider - Buildbot maintainer - Joost Peters - Doxygen Project Documentation maintainer - Jordi Vilalta Prat - Wiki maintainer - Eugene Sandulenko - Forum, IRC channel, Screen Shots and Mailing - list maintainer + James Brown - IRC Logs maintainer + Thierry Crozat - Wiki maintainer + Andre Heider - Buildbot maintainer + Joost Peters - Doxygen Project Documentation maintainer + Jordi Vilalta Prat - Wiki maintainer + Eugene Sandulenko - Forum, IRC channel, Screen Shots and + Mailing list maintainer John Willis Website (content) @@ -359,31 +361,31 @@ ScummVM Team Documentation ------------- - Thierry Crozat - Numerous contributions to documentation - Joachim Eberhard - Numerous contributions to documentation - (retired) - Matthew Hoops - Wiki editor + Thierry Crozat - Numerous contributions to documentation + Joachim Eberhard - Numerous contributions to documentation + (retired) + Matthew Hoops - Wiki editor Retired Team Members -------------------- - Chris Apers - Former PalmOS porter - Ralph Brorsen - Help with GUI implementation - Jamieson Christian - iMUSE, MIDI, all things musical - Felix Jakschitsch - Zak256 reverse engineering - Mutwin Kraus - Original MacOS porter - Peter Moraliyski - Port: GP32 - Jeremy Newman - Former webmaster - Lionel Ulmer - Port: X11 - Won Star - Former GP32 porter + Chris Apers - Former PalmOS porter + Ralph Brorsen - Help with GUI implementation + Jamieson Christian - iMUSE, MIDI, all things musical + Felix Jakschitsch - Zak256 reverse engineering + Mutwin Kraus - Original MacOS porter + Peter Moraliyski - Port: GP32 + Jeremy Newman - Former webmaster + Lionel Ulmer - Port: X11 + Won Star - Former GP32 porter Other contributions ******************* Packages -------- AmigaOS 4: - Hans-Joerg Frieden - (retired) + Hans-Joerg Frieden - (retired) Hubert Maier - Juha Niemimaki - (retired) + Juha Niemimaki - (retired) Atari/FreeMiNT: Keith Scroggins @@ -393,22 +395,22 @@ Other contributions Luc Schrijvers Debian GNU/Linux: - Tore Anderson - (retired) + Tore Anderson - (retired) David Weinehall Fedora / RedHat: Willem Jan Palenstijn Mac OS X: - Max Horn - (retired) + Max Horn - (retired) Oystein Eftevaag Mandriva: - Dominik Scherer - (retired) + Dominik Scherer - (retired) MorphOS: Fabien Coeurjoly - Ruediger Hanke - (retired) + Ruediger Hanke - (retired) OS/2: Paul Smedley @@ -426,12 +428,12 @@ Other contributions Travis Howell Win64: - Chris Gray - (retired) + Chris Gray - (retired) Johannes Schickel - Translations - ------------ - Thierry Crozat - Translation Lead + GUI Translations + ---------------- + Thierry Crozat - Translation Lead Basque: Mikel Iturbe Urretxa @@ -459,7 +461,7 @@ Other contributions German: Simon Sawatzki - Lothar Serra Mari - (retired) + Lothar Serra Mari - (retired) Hungarian: Alex Bevilacqua @@ -493,98 +495,118 @@ Other contributions Ukrainian: Lubomyr Lisen + Game Translations + ----------------- + CGE: + Dan Serban - Soltys English translation + Victor Gonzalez - Soltys Spanish translation + Alejandro Gomez de la Munoza - Soltys Spanish translation + + Drascula: + Thierry Crozat - Improve French translation + + Mortevielle: + Hugo Labrande - Improve English translation + Thierry Crozat - Improve English translation + Websites (design) ----------------- - Dobo Balazs - Website design - William Claydon - Skins for doxygen, buildbot and wiki - Yaroslav Fedevych - HTML/CSS for the website - Jean Marc Gimenez - ScummVM logo - David Jensen - SVG logo conversion - Raina - ScummVM forum buttons + Dobo Balazs - Website design + William Claydon - Skins for doxygen, buildbot and wiki + Yaroslav Fedevych - HTML/CSS for the website + Jean Marc Gimenez - ScummVM logo + David Jensen - SVG logo conversion + Raina - ScummVM forum buttons Code contributions ------------------ - Ori Avtalion - Subtitle control options in the GUI; BASS GUI - fixes - Stuart Caie - Decoders for Amiga and AtariST data files - (AGOS engine) - Paolo Costabel - PSP port contributions - Martin Doucha - CinE engine objectification - Thomas Fach-Pedersen - ProTracker module player, Smacker video - decoder - Tobias Gunkel - Sound support for C64 version of MM/Zak, Loom - PCE support - Janne Huttunen - V3 actor mask support, Dig/FT SMUSH audio - Kovacs Endre Janos - Several fixes for Simon1 - Jeroen Janssen - Numerous readability and bugfix patches - Keith Kaisershot - Several Pegasus Prime patches - Andreas Karlsson - Initial port for SymbianOS - Claudio Matsuoka - Daily Linux builds - Thomas Mayer - PSP port contributions - Sean Murray - ScummVM tools GUI application (GSoC 2007 task) - n0p - Windows CE port aspect ratio correction scaler - and right click input method - Mikesch Nepomuk - MI1 VGA floppy patches - Nicolas Noble - Config file and ALSA support - Tim Phillips - Initial MI1 CD music support - Quietust - Sound support for Amiga SCUMM V2/V3 games, MM - NES support - Robert Crossfield - Improved support for Apple II/C64 versions of - MM - Andreas Roever - Broken Sword I & II MPEG2 cutscene support - Edward Rudd - Fixes for playing MP3 versions of MI1/Loom - audio - Daniel Schepler - Final MI1 CD music support, initial Ogg Vorbis - support - Andre Souza - SDL-based OpenGL renderer - Tom Frost - WebOS port contributions + Ori Avtalion - Subtitle control options in the GUI; BASS + GUI fixes + Stuart Caie - Decoders for Amiga and AtariST data files + (AGOS engine) + Paolo Costabel - PSP port contributions + Martin Doucha - CinE engine objectification + Thomas Fach-Pedersen - ProTracker module player, Smacker video + decoder + Tobias Gunkel - Sound support for C64 version of MM/Zak, + Loom PCE support + Janne Huttunen - V3 actor mask support, Dig/FT SMUSH audio + Kovacs Endre Janos - Several fixes for Simon1 + Jeroen Janssen - Numerous readability and bugfix patches + Keith Kaisershot - Several Pegasus Prime patches + Andreas Karlsson - Initial port for SymbianOS + Claudio Matsuoka - Daily Linux builds + Thomas Mayer - PSP port contributions + Sean Murray - ScummVM tools GUI application (GSoC 2007 + task) + n0p - Windows CE port aspect ratio correction + scaler and right click input method + Mikesch Nepomuk - MI1 VGA floppy patches + Nicolas Noble - Config file and ALSA support + Tim Phillips - Initial MI1 CD music support + Quietust - Sound support for Amiga SCUMM V2/V3 + games, MM NES support + Robert Crossfield - Improved support for Apple II/C64 + versions of MM + Andreas Roever - Broken Sword I & II MPEG2 cutscene + support + Edward Rudd - Fixes for playing MP3 versions of + MI1/Loom audio + Daniel Schepler - Final MI1 CD music support, initial Ogg + Vorbis support + Andre Souza - SDL-based OpenGL renderer + Tom Frost - WebOS port contributions FreeSCI Contributors -------------------- - Francois-R Boyer - MT-32 information and mapping code - Rainer Canavan - IRIX MIDI driver and bug fixes + Francois-R Boyer - MT-32 information and mapping code + Rainer Canavan - IRIX MIDI driver and bug fixes Xiaojun Chen - Paul David Doherty - Game version information - Vyacheslav Dikonov - Config script improvements - Ruediger Hanke - Port to the MorphOS platform - Matt Hargett - Clean-ups, bugfixes, Hardcore QA, Win32 - Max Horn - SetJump implementation - Ravi I. - SCI0 sound resource specification - Emmanuel Jeandel - Bugfixes and bug reports - Dmitry Jemerov - Port to the Win32 platform, numerous bugfixes - Chris Kehler - Makefile enhancements - Christopher T. Lansdown - Original CVS maintainer, Alpha compatibility - fixes - Sergey Lapin - Port of Carl's type 2 decompression code - Rickard Lind - MT-32->GM MIDI mapping magic, sound research - Hubert Maier - AmigaOS 4 port - Johannes Manhave - Document format translation - Claudio Matsuoka - CVS snapshots, daily builds, BeOS and cygwin - ports - Dark Minister - SCI research (bytecode and parser) - Carl Muckenhoupt - Sources to the SCI resource viewer tools that - started it all - Anders Baden Nielsen - PPC testing - Walter van Niftrik - Ports to the Dreamcast and GP32 platforms - Rune Orsval - Configuration file editor - Solomon Peachy - SDL ports and much of the sound subsystem - Robey Pointer - Bug tracking system hosting - Magnus Reftel - Heap implementation, Python class viewer, - bugfixes - Christoph Reichenbach - UN*X code, VM/Graphics/Sound/other - infrastructure - George Reid - FreeBSD package management - Lars Skovlund - Project maintenance, most documentation, - bugfixes, SCI1 support - Rink Springer - Port to the DOS platform, several bug fixes - Rainer De Temple - SCI research + Paul David Doherty - Game version information + Vyacheslav Dikonov - Config script improvements + Ruediger Hanke - Port to the MorphOS platform + Matt Hargett - Clean-ups, bugfixes, Hardcore QA, Win32 + Max Horn - SetJump implementation + Ravi I. - SCI0 sound resource specification + Emmanuel Jeandel - Bugfixes and bug reports + Dmitry Jemerov - Port to the Win32 platform, numerous + bugfixes + Chris Kehler - Makefile enhancements + Christopher T. Lansdown - Original CVS maintainer, Alpha + compatibility fixes + Sergey Lapin - Port of Carl's type 2 decompression code + Rickard Lind - MT-32->GM MIDI mapping magic, sound + research + Hubert Maier - AmigaOS 4 port + Johannes Manhave - Document format translation + Claudio Matsuoka - CVS snapshots, daily builds, BeOS and + cygwin ports + Dark Minister - SCI research (bytecode and parser) + Carl Muckenhoupt - Sources to the SCI resource viewer tools + that started it all + Anders Baden Nielsen - PPC testing + Walter van Niftrik - Ports to the Dreamcast and GP32 platforms + Rune Orsval - Configuration file editor + Solomon Peachy - SDL ports and much of the sound subsystem + Robey Pointer - Bug tracking system hosting + Magnus Reftel - Heap implementation, Python class viewer, + bugfixes + Christoph Reichenbach - UN*X code, VM/Graphics/Sound/other + infrastructure + George Reid - FreeBSD package management + Lars Skovlund - Project maintenance, most documentation, + bugfixes, SCI1 support + Rink Springer - Port to the DOS platform, several bug + fixes + Rainer De Temple - SCI research Sean Terrell - Hugues Valois - Game selection menu - Jordi Vilalta - Numerous code and website clean-up patches - Petr Vyhnak - The DCL-INFLATE algorithm, many Win32 - improvements - Bas Zoetekouw - Man pages, debian package management, CVS - maintenance + Hugues Valois - Game selection menu + Jordi Vilalta - Numerous code and website clean-up + patches + Petr Vyhnak - The DCL-INFLATE algorithm, many Win32 + improvements + Bas Zoetekouw - Man pages, debian package management, CVS + maintenance Special thanks to Prof. Dr. Gary Nutt for allowing the FreeSCI VM extension as a course project in his Advanced OS course. diff --git a/devtools/create_mortdat/create_mortdat.cpp b/devtools/create_mortdat/create_mortdat.cpp index 0065407daa..693e277b91 100644 --- a/devtools/create_mortdat/create_mortdat.cpp +++ b/devtools/create_mortdat/create_mortdat.cpp @@ -210,7 +210,7 @@ void writeMenuData(const char *menuData, int languageId) { outputFile.writeByte(languageId); // Write each 8-characters block as a byte (one bit per character) // ' ' -> 0, anything else -> 1 - byte value; + byte value = 0; int valueCpt = 0; const char* str = menuData; while (*str != 0) { diff --git a/devtools/credits.pl b/devtools/credits.pl index fda6f4782e..03e086ce99 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -48,7 +48,7 @@ if ($mode eq "") { $Text::Wrap::unexpand = 0; if ($mode eq "TEXT") { $Text::Wrap::columns = 78; - $max_name_width = 23; # The maximal width of a name. + $max_name_width = 28; # The maximal width of a name. } elsif ($mode eq "CPP") { $Text::Wrap::columns = 48; # Approx. } @@ -60,6 +60,7 @@ sub html_entities_to_ascii { # For now we hardcode these mappings # á -> a # é -> e + # í -> i # ì -> i # ó -> o # ø -> o @@ -72,8 +73,10 @@ sub html_entities_to_ascii { # ł -> l # ś -> s # Š -> S + # ñ -> n $text =~ s/á/a/g; $text =~ s/é/e/g; + $text =~ s/í/i/g; $text =~ s/ì/i/g; $text =~ s/ó/o/g; $text =~ s/ø/o/g; @@ -81,6 +84,7 @@ sub html_entities_to_ascii { $text =~ s/ś/s/g; $text =~ s/Š/S/g; $text =~ s/å/aa/g; + $text =~ s/ñ/n/g; $text =~ s/ä/a/g; $text =~ s/ë/e/g; @@ -101,6 +105,7 @@ sub html_entities_to_cpp { # The numerical values are octal! $text =~ s/á/\\341/g; $text =~ s/é/\\351/g; + $text =~ s/í/\\355/g; $text =~ s/ì/\\354/g; $text =~ s/ó/\\363/g; $text =~ s/ø/\\370/g; @@ -108,6 +113,7 @@ sub html_entities_to_cpp { $text =~ s/ś/s/g; $text =~ s/Š/S/g; $text =~ s/å/\\345/g; + $text =~ s/ñ/\\361/g; $text =~ s/ä/\\344/g; $text =~ s/ë/\\353/g; @@ -126,6 +132,7 @@ sub html_entities_to_rtf { $text =~ s/á/\\'87/g; $text =~ s/é/\\'8e/g; + $text =~ s/í/\\'92/g; $text =~ s/ì/\\'93/g; $text =~ s/ó/\\'97/g; $text =~ s/ø/\\'bf/g; @@ -135,6 +142,8 @@ sub html_entities_to_rtf { $text =~ s/Š/\\uc0\\u540 /g; # Back to hex numbers + $text =~ s/ñ/\\'96/g; + $text =~ s/ä/\\'8a/g; $text =~ s/ë/\\'eb/g; $text =~ s/ö/\\'9a/g; @@ -151,12 +160,14 @@ sub html_entities_to_tex { $text =~ s/á/\\'a/g; $text =~ s/é/\\'e/g; + $text =~ s/í/\\'i/g; $text =~ s/ì/\\`\\i/g; $text =~ s/ó/\\'o/g; $text =~ s/ø/{\\o}/g; $text =~ s/å/\\aa /g; $text =~ s/ł/{\\l}/g; $text =~ s/Š/{\\v S}/g; + $text =~ s/ñ/\\˜n/g; $text =~ s/ä/\\"a/g; $text =~ s/ö/\\"o/g; @@ -984,7 +995,7 @@ begin_credits("Credits"); end_section(); end_section(); - begin_section("Translations"); + begin_section("GUI Translations"); begin_persons(); add_person("Thierry Crozat", "criezy", "Translation Lead"); end_persons(); @@ -1049,6 +1060,20 @@ begin_credits("Credits"); add_person("Lubomyr Lisen", "", ""); end_section(); end_section(); + begin_section("Game Translations"); + begin_section("CGE"); + add_person("Dan Serban", "nutron", "Soltys English translation"); + add_person("Víctor González", "IlDucci", "Soltys Spanish translation"); + add_person("Alejandro Gómez de la Muñoza", "TheFireRed", "Soltys Spanish translation"); + end_section(); + begin_section("Drascula"); + add_person("Thierry Crozat", "criezy", "Improve French translation"); + end_section(); + begin_section("Mortevielle"); + add_person("Hugo Labrande", "", "Improve English translation"); + add_person("Thierry Crozat", "criezy", "Improve English translation"); + end_section(); + end_section(); begin_section("Websites (design)"); begin_persons(); diff --git a/devtools/extract_mort/extract_mort.cpp b/devtools/extract_mort/extract_mort.cpp index 4346f1f4bf..a52458f9b2 100644 --- a/devtools/extract_mort/extract_mort.cpp +++ b/devtools/extract_mort/extract_mort.cpp @@ -104,9 +104,9 @@ public: return ftell(f); } uint32 size() { - int position = ftell(f); + uint32 position = ftell(f); fseek (f, 0, SEEK_END); - int end = ftell (f); + uint32 end = ftell(f); fseek (f, position, SEEK_SET); return end; diff --git a/engines/avalanche/animation.cpp b/engines/avalanche/animation.cpp index 4ddeedce94..6bce59ddc0 100644 --- a/engines/avalanche/animation.cpp +++ b/engines/avalanche/animation.cpp @@ -49,6 +49,7 @@ const int32 Animation::kCatacombMap[8][8] = { AnimationType::AnimationType(Animation *anim) { _anim = anim; + _xLength = 0; _yLength = 0; for (int i = 0; i < 24; i++) { _mani[i] = nullptr; @@ -77,6 +78,7 @@ AnimationType::AnimationType(Animation *anim) { _eachStepProc = Animation::kProcNone; _fgBubbleCol = kColorWhite; _bgBubbleCol = kColorBlack; + _id = 177; } /** diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp index 9c83c2c9f5..ef03c51107 100644 --- a/engines/avalanche/avalanche.cpp +++ b/engines/avalanche/avalanche.cpp @@ -75,7 +75,8 @@ AvalancheEngine::~AvalancheEngine() { } void AvalancheEngine::initVariables() { - // Needed because of Lucerna::load_also() + resetVariables(); + for (int i = 0; i < 31; i++) { _also[i][0] = nullptr; _also[i][1] = nullptr; @@ -117,11 +118,18 @@ void AvalancheEngine::initVariables() { _doingSpriteRun = false; _isLoaded = false; _soundFx = true; - _spludwickAtHome = false; - _passedCwytalotInHerts = false; _holdTheDawn = false; - _lastRoom = 0; - _lastRoomNotMap = 0; + + _lineNum = 0; + for (int i = 0; i < 50; i++) + _lines[i]._color = kColorWhite; + _dropsOk = false; + _cheat = false; + _letMeOut = false; + _thinks = 2; + _thinkThing = true; + _seeScroll = false; + _currentMouse = 177; } Common::ErrorCode AvalancheEngine::initialize() { diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp index 3b01421903..c377970c51 100644 --- a/engines/cge/detection.cpp +++ b/engines/cge/detection.cpp @@ -117,6 +117,18 @@ static const CgeGameDescription gameDescriptions[] = { }, { { + "soltys", "Soltys Freeware v1.0", + { + {"vol.cat", 0, "fcae86b20eaa5cedec17b24fa5e85eb4", 50176}, + {"vol.dat", 0, "ff10d54acc2c95696c57e05819b6906f", 8450151}, + AD_LISTEND + }, + Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO0() + }, + kGameTypeSoltys + }, + { + { // Polish version, provided by Strangerke "sfinx", "Sfinx Freeware", { diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 9699dda021..159ceb9bf0 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -141,6 +141,32 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam drasculaX = 0; drasculaY = 0; trackDrascula = 0; + _roomNumber = 0; + numRoomObjs = 0; + takeObject = 0; + pickedObject = 0; + _subtitlesDisabled = 0; + _menuBar = 0; + _menuScreen = 0; + _hasName = 0; + curExcuseLook = 0; + curExcuseAction = 0; + frame_y = 0; + curX = 0; + curY = 0; + characterMoved = 0; + curDirection = 0; + trackProtagonist = 0; + _characterFrame = 0; + hare_se_ve = 0; + roomX = 0; + roomY = 0; + checkFlags = 0; + doBreak = 0; + stepX = 0; + stepY = 0; + curHeight = 0; + curWidth = 0; _color = 0; blinking = 0; diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp index 6c6f5296f4..a91e41ea67 100644 --- a/engines/dreamweb/dreamweb.cpp +++ b/engines/dreamweb/dreamweb.cpp @@ -232,6 +232,15 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam _hasSpeech = 0; _roomsSample = 0; _copyProtection = 0; + + for (uint i = 0; i < 128; i++) + memset(&_setDat[i], 0, sizeof(SetObject)); + + for (uint i = 0; i < 80; i++) + memset(&_freeDat[i], 0, sizeof(DynObject)); + + for (uint i = 0; i < kNumExObjects; i++) + memset(&_exData[i], 0, sizeof(DynObject)); } DreamWebEngine::~DreamWebEngine() { diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h index fe72238a02..2cf7425de4 100644 --- a/engines/fullpipe/constants.h +++ b/engines/fullpipe/constants.h @@ -89,6 +89,7 @@ namespace Fullpipe { #define PIC_CSR_ITN_RED 5329 #define PIC_CSR_LIFT 5176 #define PIC_CSR_MAP 5339 +#define PIC_IN1_GAMETITLE 5169 #define PIC_IN1_PIPETITLE 5167 #define PIC_INV_MENU 991 #define PIC_MAP_A13 5275 @@ -101,6 +102,7 @@ namespace Fullpipe { #define QU_IN2_DO 5144 #define QU_INTR_FINISH 5138 #define QU_INTR_GETUPMAN 5136 +#define QU_INTR_STARTINTRO 5133 #define SC_1 301 #define SC_10 653 #define SC_11 654 @@ -155,6 +157,7 @@ namespace Fullpipe { #define SC_TITLES 5166 #define SND_CMN_031 3516 #define SND_CMN_070 5199 +#define SND_INTR_019 5220 #define ST_IN1MAN_SLEEP 5112 #define ST_LBN_0N 2832 #define ST_LBN_0P 2833 diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp index a0db6aa08c..2f49a41c17 100644 --- a/engines/fullpipe/fullpipe.cpp +++ b/engines/fullpipe/fullpipe.cpp @@ -80,7 +80,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) _gameContinue = true; _needRestart = false; - _flgPlayIntro = false; + _flgPlayIntro = true; _gamePaused = false; _inputArFlag = false; _recordEvents = false; diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp index f8ede5cff2..a2ab71d7e3 100644 --- a/engines/fullpipe/gameloader.cpp +++ b/engines/fullpipe/gameloader.cpp @@ -481,7 +481,7 @@ bool PreloadItems::load(MfcArchive &file) { int count = file.readCount(); - resize(count); + clear(); for (int i = 0; i < count; i++) { PreloadItem *t = new PreloadItem(); diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp index 85999bcadb..44e7b46184 100644 --- a/engines/fullpipe/modal.cpp +++ b/engines/fullpipe/modal.cpp @@ -25,13 +25,15 @@ #include "fullpipe/messages.h" #include "fullpipe/constants.h" #include "fullpipe/scenes.h" +#include "fullpipe/gameloader.h" namespace Fullpipe { ModalIntro::ModalIntro() { _field_8 = 0; _countDown = 0; - _needRedraw = 0; + _stillRunning = 0; + if (g_vars->sceneIntro_skipIntro) { _introFlags = 4; } else { @@ -41,6 +43,7 @@ ModalIntro::ModalIntro() { PictureObject *pict = g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0); pict->setFlags(pict->_flags & 0xFFFB); } + g_vars->sceneIntro_skipIntro = false; _sfxVolume = g_fullpipe->_sfxVolume; } @@ -55,7 +58,7 @@ bool ModalIntro::handleMessage(ExCommand *message) { if (message->_keyCode != 13 && message->_keyCode != 27 && message->_keyCode != 32) return false; - if (_needRedraw) { + if (_stillRunning) { if (!(_introFlags & 0x10)) { _countDown = 0; g_vars->sceneIntro_needBlackout = true; @@ -69,19 +72,154 @@ bool ModalIntro::handleMessage(ExCommand *message) { } bool ModalIntro::init(int counterdiff) { - warning("STUB: ModalIntro::init(%d)", counterdiff); + if (!g_vars->sceneIntro_playing) { + if (!_stillRunning) { + finish(); + return false; + } + + if (_introFlags & 0x10) + g_fullpipe->_gameLoader->updateSystems(42); + + _introFlags |= 2; + + return true; + } + + if (_introFlags & 4) { + ModalVideoPlayer *player = new ModalVideoPlayer(); + + g_fullpipe->_modalObject = player; + player->_parentObj = this; + player->play("intro.avi"); + + _countDown--; + + if (_countDown > 0 ) + return true; + + if (_stillRunning <= 0) { + _countDown = 0; + _stillRunning = 0; + _introFlags = (_introFlags & 0xfb) | 0x40; + + return true; + } + + _introFlags |= 2; + return true; + } + + if (_introFlags & 0x40) { + ModalVideoPlayer *player = new ModalVideoPlayer(); + + g_fullpipe->_modalObject = player; + player->_parentObj = this; + player->play("intro2.avi"); + + _countDown--; + if (_countDown > 0) + return true; + + if (_stillRunning <= 0) { + _countDown = 50; + _stillRunning = 0; + _introFlags = (_introFlags & 0xbf) | 9; + + return true; + } + + _introFlags |= 2; + return true; + } + + if (_introFlags & 8) { + _countDown--; + + if (_countDown > 0 ) + return true; + + if (_stillRunning > 0) { + _introFlags |= 2; + return true; + } + + _countDown = 150; + _introFlags = (_introFlags & 0xf7) | 0x21; + g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0)->_flags &= 0xfffb; + } + + if (!(_introFlags & 0x20)) { + if (_introFlags & 0x10) { + if (!_stillRunning) { + _introFlags |= 1; + + g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0)->_flags &= 0xfffb; + g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_GAMETITLE, 0)->_flags &= 0xfffb; + + chainQueue(QU_INTR_STARTINTRO, 1); + } + g_fullpipe->_gameLoader->updateSystems(42); + } + return true; + } + + _countDown--; + + if (_countDown <= 0) { + if (_stillRunning > 0) { + _introFlags |= 2; + + return true; + } + + _introFlags = (_introFlags & 0xdf) | 0x10; + + g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_GAMETITLE, 0)->_flags &= 0xfffb; + + _stillRunning = 0; + } return true; } -bool ModalIntro::update() { - warning("STUB: ModalIntro::update()"); +void ModalIntro::update() { + if (g_fullpipe->_currentScene) { + if (_introFlags & 1) { + //sceneFade(virt, g_currentScene, 1); + _stillRunning = 255; + _introFlags &= 0xfe; + + if (_introFlags & 0x20) + g_fullpipe->playSound(SND_INTR_019, 0); + } else if (_introFlags & 2) { + if (g_vars->sceneIntro_needBlackout) { + //vrtRectangle(*(_DWORD *)virt, 0, 0, 0, 800, 600); + g_vars->sceneIntro_needBlackout = 0; + _stillRunning = 0; + _introFlags &= 0xfd; + } else { + //sceneFade(virt, g_currentScene, 0); + _stillRunning = 0; + _introFlags &= 0xfd; + } + } else if (_stillRunning) { + g_fullpipe->_currentScene->draw(); + } + } +} - return true; +void ModalIntro::finish() { + g_fullpipe->_gameLoader->unloadScene(SC_INTRO2); + g_fullpipe->_currentScene = g_fullpipe->accessScene(SC_INTRO1); + g_fullpipe->_gameLoader->preloadScene(SC_INTRO1, TrubaDown); + + if (g_fullpipe->_currentScene) + g_fullpipe->_gameLoader->updateSystems(42); } -void ModalIntro::saveload() { - // No saveload +void ModalVideoPlayer::play(const char *fname) { + warning("STUB: ModalVideoPlayer::play(%s)", fname); } void FullpipeEngine::openMap() { diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h index 3562622bde..f3f571e2a9 100644 --- a/engines/fullpipe/modal.h +++ b/engines/fullpipe/modal.h @@ -34,9 +34,12 @@ class BaseModalObject { BaseModalObject() : _parentObj(0) {} virtual ~BaseModalObject() {} + + virtual bool pollEvent() = 0; virtual bool handleMessage(ExCommand *message) = 0; virtual bool init(int counterdiff) = 0; - virtual bool update() = 0; + virtual void update() = 0; + virtual void saveload() = 0; }; @@ -44,16 +47,31 @@ class ModalIntro : public BaseModalObject { int _field_8; int _introFlags; int _countDown; - int _needRedraw; + int _stillRunning; int _sfxVolume; public: ModalIntro(); + virtual bool pollEvent() { return true; } virtual bool handleMessage(ExCommand *message); virtual bool init(int counterdiff); - virtual bool update(); - virtual void saveload(); + virtual void update(); + virtual void saveload() {} + + void finish(); +}; + +class ModalVideoPlayer : public BaseModalObject { +public: + + virtual bool pollEvent() { return true; } + virtual bool handleMessage(ExCommand *message) { return true; } + virtual bool init(int counterdiff) { return false; } + virtual void update() {} + virtual void saveload() {} + + void play(const char *fname); }; } // End of namespace Fullpipe diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp index cc93363786..3831831866 100644 --- a/engines/fullpipe/scene.cpp +++ b/engines/fullpipe/scene.cpp @@ -328,7 +328,7 @@ void Scene::setPictureObjectsFlag4() { } PictureObject *Scene::getPictureObjectById(int objId, int flags) { - for (uint i = 1; i < _picObjList.size(); i++) { + for (uint i = 0; i < _picObjList.size(); i++) { if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_okeyCode == flags) return (PictureObject *)_picObjList[i]; } diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h index 5597612aa6..9100fa6a0c 100644 --- a/engines/fullpipe/scenes.h +++ b/engines/fullpipe/scenes.h @@ -45,7 +45,7 @@ class Vars { PictureObject *scene01_picSc01Osk; PictureObject *scene01_picSc01Osk2; - GameObject *selector; + PictureObject *selector; }; } // End of namespace Fullpipe diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp index 96131f2968..9e317804ca 100644 --- a/engines/hopkins/hopkins.cpp +++ b/engines/hopkins/hopkins.cpp @@ -166,7 +166,7 @@ bool HopkinsEngine::runWin95Demo() { _globals->_characterType = CHARACTER_HOPKINS; _objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0; - memset(_globals->_saveData, 0, 2000); + memset(_globals->_saveData, 0, sizeof(Savegame)); _globals->_exitId = 0; if (getLanguage() != Common::PL_POL) @@ -465,7 +465,7 @@ bool HopkinsEngine::runLinuxDemo() { _globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR"); _globals->_characterType = CHARACTER_HOPKINS; _objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0; - memset(_globals->_saveData, 0, 2000); + memset(_globals->_saveData, 0, sizeof(Savegame)); _globals->_exitId = 0; if (_startGameSlot != -1) @@ -826,7 +826,7 @@ bool HopkinsEngine::runFull() { _globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR"); _globals->_characterType = CHARACTER_HOPKINS; _objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0; - memset(_globals->_saveData, 0, 2000); + memset(_globals->_saveData, 0, sizeof(Savegame)); _globals->_exitId = 0; diff --git a/engines/hugo/dialogs.cpp b/engines/hugo/dialogs.cpp index 5dcee3ae94..23e04dc479 100644 --- a/engines/hugo/dialogs.cpp +++ b/engines/hugo/dialogs.cpp @@ -34,8 +34,10 @@ namespace Hugo { -TopMenu::TopMenu(HugoEngine *vm) : Dialog(0, 0, kMenuWidth, kMenuHeight), _arrayBmp(0), _arraySize(0), - _vm(vm) { +TopMenu::TopMenu(HugoEngine *vm) : Dialog(0, 0, kMenuWidth, kMenuHeight), _vm(vm) { + _arrayBmp = nullptr; + _arraySize = 0; + init(); } @@ -140,12 +142,10 @@ void TopMenu::loadBmpArr(Common::SeekableReadStream &in) { _arrayBmp[i * 2] = bitmapSrc->convertTo(g_system->getOverlayFormat()); _arrayBmp[i * 2 + 1] = new Graphics::Surface(); _arrayBmp[i * 2 + 1]->create(_arrayBmp[i * 2]->w * 2, _arrayBmp[i * 2]->h * 2, g_system->getOverlayFormat()); - byte *src = (byte *)_arrayBmp[i * 2]->getPixels(); - byte *dst = (byte *)_arrayBmp[i * 2 + 1]->getPixels(); for (int j = 0; j < _arrayBmp[i * 2]->h; j++) { - src = (byte *)_arrayBmp[i * 2]->getBasePtr(0, j); - dst = (byte *)_arrayBmp[i * 2 + 1]->getBasePtr(0, j * 2); + byte *src = (byte *)_arrayBmp[i * 2]->getBasePtr(0, j); + byte *dst = (byte *)_arrayBmp[i * 2 + 1]->getBasePtr(0, j * 2); for (int k = _arrayBmp[i * 2]->w; k > 0; k--) { for (int m = _arrayBmp[i * 2]->format.bytesPerPixel; m > 0; m--) { *dst++ = *src++; diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp index fbe39b3a0c..3dc9c9a1c3 100644 --- a/engines/hugo/display.cpp +++ b/engines/hugo/display.cpp @@ -75,13 +75,13 @@ static const byte stdMouseCursor[] = { Screen::Screen(HugoEngine *vm) : _vm(vm) { - _mainPalette = 0; - _curPalette = 0; + _mainPalette = nullptr; + _curPalette = nullptr; _dlAddIndex = 0; _dlRestoreIndex = 0; for (int i = 0; i < kNumFonts; i++) { - _arrayFont[i] = 0; + _arrayFont[i] = nullptr; fontLoadedFl[i] = false; } for (int i = 0; i < kBlitListSize; i++) { @@ -100,6 +100,8 @@ Screen::Screen(HugoEngine *vm) : _vm(vm) { _dlRestoreList[i]._dx = 0; _dlRestoreList[i]._dy = 0; } + _fnt = 0; + _paletteSize = 0; } Screen::~Screen() { diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp index e58c2e57d6..aa128048af 100644 --- a/engines/hugo/file.cpp +++ b/engines/hugo/file.cpp @@ -246,13 +246,13 @@ SoundPtr FileManager::getSound(const int16 sound, uint16 *size) { // No more to do if SILENCE (called for cleanup purposes) if (sound == _vm->_soundSilence) - return 0; + return nullptr; // Open sounds file Common::File fp; // Handle to SOUND_FILE if (!fp.open(getSoundFilename())) { warning("Hugo Error: File not found %s", getSoundFilename()); - return 0; + return nullptr; } if (!_hasReadHeader) { @@ -519,6 +519,7 @@ void FileManager::readBootFile() { ofp.read(_vm->_boot._pbswitch, sizeof(_vm->_boot._pbswitch)); ofp.read(_vm->_boot._distrib, sizeof(_vm->_boot._distrib)); _vm->_boot._exitLen = ofp.readUint16LE(); + ofp.close(); byte *p = (byte *)&_vm->_boot; @@ -527,7 +528,6 @@ void FileManager::readBootFile() { checksum ^= p[i]; p[i] ^= s_bootCypher[i % s_bootCypherLen]; } - ofp.close(); if (checksum) { Utils::notifyBox(Common::String::format("Corrupted startup file '%s'", getBootFilename())); diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index b140cfdba2..88e2e4372b 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -46,11 +46,11 @@ namespace Hugo { -HugoEngine *HugoEngine::s_Engine = 0; +HugoEngine *HugoEngine::s_Engine = nullptr; HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(syst), _gameDescription(gd), - _hero(0), _heroImage(0), _defltTunes(0), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0), - _screenStates(0), _numStates(0), _score(0), _maxscore(0), _lastTime(0), _curTime(0), _episode(0) + _hero(nullptr), _heroImage(0), _defltTunes(nullptr), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0), + _screenStates(nullptr), _numStates(0), _score(0), _maxscore(0), _lastTime(0), _curTime(0), _episode(nullptr) { _system = syst; DebugMan.addDebugChannel(kDebugSchedule, "Schedule", "Script Schedule debug level"); @@ -67,16 +67,16 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy _console = new HugoConsole(this); _rnd = 0; - _screen = NULL; - _mouse = NULL; - _inventory = NULL; - _parser = NULL; - _route = NULL; - _sound = NULL; - _intro = NULL; - _object = NULL; - _text = NULL; - _topMenu = NULL; + _screen = nullptr; + _mouse = nullptr; + _inventory = nullptr; + _parser = nullptr; + _route = nullptr; + _sound = nullptr; + _intro = nullptr; + _object = nullptr; + _text = nullptr; + _topMenu = nullptr; _status._storyModeFl = false; _status._gameOverFl = false; _status._lookFl = false; @@ -93,6 +93,26 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy _gameType = kGameTypeNone; _platform = Common::kPlatformUnknown; _packedFl = false; + + _numVariant = 0; + _gameVariant = kGameVariantNone; + _normalTPS = 0; + _screenPtr = nullptr; + _config._musicFl = true; + _config._soundFl = true; + _config._turboFl = false; + _look = 0; + _take = 0; + _drop = 0; + _maze._enabledFl = false; + _maze._size = 0; + _maze._x1 = _maze._y1 = _maze._x2 = _maze._y2 = _maze._x3 = _maze._x4 = 0; + _maze._firstScreenIndex = 0; + _boot._checksum = 0; + _boot._registered = kRegShareware; + _boot._exitLen = 0; + _file = nullptr; + _scheduler = nullptr; } HugoEngine::~HugoEngine() { diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h index 9f495a9037..6adb5f95d0 100644 --- a/engines/hugo/hugo.h +++ b/engines/hugo/hugo.h @@ -106,7 +106,8 @@ enum GameVariant { kGameVariantH3Win, kGameVariantH1Dos, kGameVariantH2Dos, - kGameVariantH3Dos + kGameVariantH3Dos, + kGameVariantNone }; enum HugoDebugChannels { @@ -259,7 +260,7 @@ public: // Used by the qsort function static HugoEngine &get() { - assert(s_Engine != 0); + assert(s_Engine != nullptr); return *s_Engine; } diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp index 6f314c8774..5db6c39078 100644 --- a/engines/hugo/intro.cpp +++ b/engines/hugo/intro.cpp @@ -39,9 +39,10 @@ namespace Hugo { -IntroHandler::IntroHandler(HugoEngine *vm) : _vm(vm), _introX(0), _introY(0) { +IntroHandler::IntroHandler(HugoEngine *vm) : _vm(vm) { _introXSize = 0; _introTicks = 0; + _introX = _introY = nullptr; } IntroHandler::~IntroHandler() { @@ -74,6 +75,7 @@ void IntroHandler::loadIntroData(Common::SeekableReadStream &in) { void IntroHandler::freeIntroData() { free(_introX); free(_introY); + _introX = _introY = nullptr; } intro_v1d::intro_v1d(HugoEngine *vm) : IntroHandler(vm) { diff --git a/engines/hugo/inventory.cpp b/engines/hugo/inventory.cpp index c2495beadb..03df997866 100644 --- a/engines/hugo/inventory.cpp +++ b/engines/hugo/inventory.cpp @@ -44,7 +44,8 @@ namespace Hugo { static const int kMaxDisp = (kXPix / kInvDx); // Max icons displayable -InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm), _invent(0) { +InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm) { + _invent = nullptr; _firstIconId = 0; _inventoryState = kInventoryOff; // Inventory icon bar state _inventoryHeight = 0; // Inventory icon bar pos @@ -62,6 +63,7 @@ void InventoryHandler::setInventoryState(Istate state) { void InventoryHandler::freeInvent() { free(_invent); + _invent = nullptr; } int16 InventoryHandler::getInventoryObjId() const { diff --git a/engines/hugo/mouse.cpp b/engines/hugo/mouse.cpp index ae286c8afb..4ef3db3e2b 100644 --- a/engines/hugo/mouse.cpp +++ b/engines/hugo/mouse.cpp @@ -45,7 +45,8 @@ namespace Hugo { -MouseHandler::MouseHandler(HugoEngine *vm) : _vm(vm), _hotspots(0) { +MouseHandler::MouseHandler(HugoEngine *vm) : _vm(vm) { + _hotspots = nullptr; _leftButtonFl = false; _rightButtonFl = false; _jumpExitFl = false; // Can't jump to a screen exit @@ -83,6 +84,7 @@ void MouseHandler::setMouseY(int y) { void MouseHandler::freeHotspots() { free(_hotspots); + _hotspots = nullptr; } bool MouseHandler::getJumpExitFl() const { @@ -169,7 +171,7 @@ void MouseHandler::processRightClick(const int16 objId, const int16 cx, const in _vm->_object->useObject(objId); // Use status.objid on object } else { // Clicked over viewport object Object *obj = &_vm->_object->_objects[objId]; - int16 x = 0, y = 0; + int16 x, y; switch (obj->_viewx) { // Where to walk to case -1: // Walk to object position if (_vm->_object->findObjectSpace(obj, &x, &y)) diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp index 7b4783e4d8..44f46d2d79 100644 --- a/engines/hugo/object.cpp +++ b/engines/hugo/object.cpp @@ -44,7 +44,9 @@ namespace Hugo { -ObjectHandler::ObjectHandler(HugoEngine *vm) : _vm(vm), _objects(0), _uses(0) { +ObjectHandler::ObjectHandler(HugoEngine *vm) : _vm(vm) { + _uses = nullptr; + _objects = nullptr; _numObj = 0; _objCount = 0; _usesSize = 0; @@ -249,47 +251,49 @@ void ObjectHandler::lookObject(Object *obj) { void ObjectHandler::freeObjects() { debugC(1, kDebugObject, "freeObjects"); - if (_vm->_hero != 0 && _vm->_hero->_seqList[0]._seqPtr != 0) { + if (_vm->_hero != nullptr && _vm->_hero->_seqList[0]._seqPtr != nullptr) { // Free all sequence lists and image data for (int16 i = 0; i < _numObj; i++) { Object *obj = &_objects[i]; for (int16 j = 0; j < obj->_seqNumb; j++) { Seq *seq = obj->_seqList[j]._seqPtr; Seq *next; - if (seq == 0) // Failure during database load + if (seq == nullptr) // Failure during database load break; - if (seq->_imagePtr != 0) { + if (seq->_imagePtr != nullptr) { free(seq->_imagePtr); - seq->_imagePtr = 0; + seq->_imagePtr = nullptr; } seq = seq->_nextSeqPtr; while (seq != obj->_seqList[j]._seqPtr) { - if (seq->_imagePtr != 0) { + if (seq->_imagePtr != nullptr) { free(seq->_imagePtr); - seq->_imagePtr = 0; + seq->_imagePtr = nullptr; } next = seq->_nextSeqPtr; free(seq); seq = next; } free(seq); + seq = nullptr; } } } - if (_uses) { + if (_uses != nullptr) { for (int16 i = 0; i < _usesSize; i++) free(_uses[i]._targets); free(_uses); + _uses = nullptr; } for (int16 i = 0; i < _objCount; i++) { free(_objects[i]._stateDataIndex); - _objects[i]._stateDataIndex = 0; + _objects[i]._stateDataIndex = nullptr; } free(_objects); - _objects = 0; + _objects = nullptr; } /** @@ -358,7 +362,7 @@ void ObjectHandler::showTakeables() { * Find a clear space around supplied object that hero can walk to */ bool ObjectHandler::findObjectSpace(Object *obj, int16 *destx, int16 *desty) { - debugC(1, kDebugObject, "findObjectSpace(obj, %d, %d)", *destx, *desty); + debugC(1, kDebugObject, "findObjectSpace(...)"); Seq *curImage = obj->_currImagePtr; int16 y = obj->_y + curImage->_y2 - 1; @@ -414,7 +418,7 @@ void ObjectHandler::readUse(Common::ReadStream &in, Uses &curUse) { */ void ObjectHandler::loadObjectUses(Common::ReadStream &in) { Uses tmpUse; - tmpUse._targets = 0; + tmpUse._targets = nullptr; //Read _uses for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { @@ -430,7 +434,7 @@ void ObjectHandler::loadObjectUses(Common::ReadStream &in) { else { readUse(in, tmpUse); free(tmpUse._targets); - tmpUse._targets = 0; + tmpUse._targets = nullptr; } } } @@ -442,7 +446,7 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) { uint16 numSubElem = in.readUint16BE(); if (numSubElem == 0) - curObject._stateDataIndex = 0; + curObject._stateDataIndex = nullptr; else curObject._stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem); for (int j = 0; j < numSubElem; j++) @@ -453,16 +457,16 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) { curObject._vyPath = in.readSint16BE(); curObject._actIndex = in.readUint16BE(); curObject._seqNumb = in.readByte(); - curObject._currImagePtr = 0; + curObject._currImagePtr = nullptr; if (curObject._seqNumb == 0) { curObject._seqList[0]._imageNbr = 0; - curObject._seqList[0]._seqPtr = 0; + curObject._seqList[0]._seqPtr = nullptr; } for (int j = 0; j < curObject._seqNumb; j++) { curObject._seqList[j]._imageNbr = in.readUint16BE(); - curObject._seqList[j]._seqPtr = 0; + curObject._seqList[j]._seqPtr = nullptr; } curObject._cycling = (Cycle)in.readByte(); @@ -498,7 +502,7 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) { void ObjectHandler::loadObjectArr(Common::ReadStream &in) { debugC(6, kDebugObject, "loadObject(&in)"); Object tmpObject; - tmpObject._stateDataIndex = 0; + tmpObject._stateDataIndex = nullptr; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { uint16 numElem = in.readUint16BE(); @@ -515,7 +519,7 @@ void ObjectHandler::loadObjectArr(Common::ReadStream &in) { // Skip over uneeded objects. readObject(in, tmpObject); free(tmpObject._stateDataIndex); - tmpObject._stateDataIndex = 0; + tmpObject._stateDataIndex = nullptr; } } } diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp index 2585c64fd8..57938ec371 100644 --- a/engines/hugo/parser.cpp +++ b/engines/hugo/parser.cpp @@ -44,14 +44,20 @@ namespace Hugo { -Parser::Parser(HugoEngine *vm) : _vm(vm), _putIndex(0), _getIndex(0), _arrayReqs(0), _catchallList(0), _backgroundObjects(0), _cmdList(0) { +Parser::Parser(HugoEngine *vm) : _vm(vm), _putIndex(0), _getIndex(0) { + _catchallList = nullptr; + _arrayReqs = nullptr; + + _backgroundObjects = nullptr; + _backgroundObjectsSize = 0; + _cmdList = nullptr; + _cmdListSize = 0; + _cmdLineIndex = 0; _cmdLineTick = 0; _cmdLineCursor = '_'; _cmdLine[0] = '\0'; - _cmdListSize = 0; _checkDoubleF1Fl = false; - _backgroundObjectsSize = 0; } Parser::~Parser() { @@ -172,7 +178,7 @@ const char *Parser::useBG(const char *name) { return _vm->_text->getVerb(p[i]._verbIndex, 0); } - return 0; + return nullptr; } void Parser::freeParser() { @@ -180,20 +186,24 @@ void Parser::freeParser() { for (int i = 0; _arrayReqs[i] != 0; i++) free(_arrayReqs[i]); free(_arrayReqs); + _arrayReqs = nullptr; } free(_catchallList); + _catchallList = nullptr; if (_backgroundObjects) { for (int i = 0; i < _backgroundObjectsSize; i++) free(_backgroundObjects[i]); free(_backgroundObjects); + _backgroundObjects = nullptr; } if (_cmdList) { for (int i = 0; i < _cmdListSize; i++) free(_cmdList[i]); free(_cmdList); + _cmdList = nullptr; } } @@ -398,9 +408,9 @@ void Parser::command(const char *format, ...) { * Locate any member of object name list appearing in command line */ bool Parser::isWordPresent(char **wordArr) const { - debugC(1, kDebugParser, "isWordPresent(%s)", wordArr[0]); - if (wordArr != 0) { + debugC(1, kDebugParser, "isWordPresent(%s)", wordArr[0]); + for (int i = 0; strlen(wordArr[i]); i++) { if (strstr(_vm->_line, wordArr[i])) return true; @@ -421,7 +431,7 @@ const char *Parser::findNoun() const { return _vm->_text->getNoun(i, 0); } } - return 0; + return nullptr; } /** @@ -436,7 +446,7 @@ const char *Parser::findVerb() const { return _vm->_text->getVerb(i, 0); } } - return 0; + return nullptr; } /** diff --git a/engines/hugo/route.cpp b/engines/hugo/route.cpp index 54dae88c28..dc3c41de9c 100644 --- a/engines/hugo/route.cpp +++ b/engines/hugo/route.cpp @@ -45,6 +45,17 @@ Route::Route(HugoEngine *vm) : _vm(vm) { _routeIndex = -1; // Hero not following a route _routeType = kRouteSpace; // Hero walking to space _routeObjId = -1; // Hero not walking to anything + + for (int i = 0; i < kMaxSeg; i++) + _segment[i]._y = _segment[i]._x1 = _segment[i]._x2 = 0; + + _segmentNumb = 0; + _routeListIndex = 0; + _destX = _destY = 0; + _heroWidth = 0; + _routeFoundFl = false; + _fullStackFl = false; + _fullSegmentFl = false; } void Route::resetRoute() { @@ -303,7 +314,7 @@ Common::Point *Route::newNode() { _routeListIndex++; if (_routeListIndex >= kMaxNodes) // Too many nodes - return 0; // Incomplete route - failure + return nullptr; // Incomplete route - failure _route[_routeListIndex] = _route[_routeListIndex - 1]; // Initialize with previous node return &_route[_routeListIndex]; diff --git a/engines/hugo/route.h b/engines/hugo/route.h index 716829a201..71db1e2583 100644 --- a/engines/hugo/route.h +++ b/engines/hugo/route.h @@ -79,9 +79,11 @@ private: int16 _destY; int16 _heroWidth; // Hero width bool _routeFoundFl; // TRUE when path found - bool _fullStackFl; // TRUE if stack exhausted bool _fullSegmentFl; // Segments exhausted + // CHECKME: Never set to true, could be removed + bool _fullStackFl; // TRUE if stack exhausted + void segment(int16 x, int16 y); bool findRoute(const int16 cx, const int16 cy); Common::Point *newNode(); diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp index 32b8a47df7..17ffa9d391 100644 --- a/engines/hugo/schedule.cpp +++ b/engines/hugo/schedule.cpp @@ -47,10 +47,23 @@ namespace Hugo { -Scheduler::Scheduler(HugoEngine *vm) : _vm(vm), _actListArr(0), _curTick(0), _oldTime(0), _refreshTimeout(0), _points(0), _screenActs(0) { +Scheduler::Scheduler(HugoEngine *vm) : _vm(vm) { + _actListArr = nullptr; + _curTick = 0; + _oldTime = 0; + _refreshTimeout = 0; + _points = nullptr; + _screenActs = nullptr; + memset(_events, 0, sizeof(_events)); _numBonuses = 0; _screenActsSize = 0; + + _actListArrSize = 0; + _alNewscrIndex = 0; + _freeEvent = nullptr; + _headEvent = nullptr; + _tailEvent = nullptr; } Scheduler::~Scheduler() { @@ -69,14 +82,14 @@ void Scheduler::initEventQueue() { // Chain nextEvent from first to last for (int i = kMaxEvents; --i;) _events[i - 1]._nextEvent = &_events[i]; - _events[kMaxEvents - 1]._nextEvent = 0; + _events[kMaxEvents - 1]._nextEvent = nullptr; // Chain prevEvent from last to first for (int i = 1; i < kMaxEvents; i++) _events[i]._prevEvent = &_events[i - 1]; - _events[0]._prevEvent = 0; + _events[0]._prevEvent = nullptr; - _headEvent = _tailEvent = 0; // Event list is empty + _headEvent = _tailEvent = nullptr; // Event list is empty _freeEvent = _events; // Free list is full } @@ -90,7 +103,7 @@ Event *Scheduler::getQueue() { error("An error has occurred: %s", "getQueue"); Event *resEvent = _freeEvent; _freeEvent = _freeEvent->_nextEvent; - resEvent->_nextEvent = 0; + resEvent->_nextEvent = nullptr; return resEvent; } @@ -597,7 +610,7 @@ void Scheduler::loadScreenAct(Common::SeekableReadStream &in) { for (int i = 0; i < numElem; i++) { uint16 numSubElem = in.readUint16BE(); if (numSubElem == 0) { - _screenActs[i] = 0; + _screenActs[i] = nullptr; } else { _screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem); for (int j = 0; j < numSubElem; j++) @@ -617,11 +630,14 @@ void Scheduler::freeScheduler() { debugC(6, kDebugSchedule, "freeActListArr()"); free(_points); + _points = nullptr; if (_screenActs) { for (int i = 0; i < _screenActsSize; i++) free(_screenActs[i]); free(_screenActs); + _screenActs = nullptr; + _screenActsSize = 0; } if (_actListArr) { @@ -633,6 +649,8 @@ void Scheduler::freeScheduler() { free(_actListArr[i]); } free(_actListArr); + _actListArr = nullptr; + _actListArrSize = 0; } } @@ -698,9 +716,9 @@ void Scheduler::saveEvents(Common::WriteStream *f) { f->writeUint32BE(getTicks()); - int16 freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events; - int16 headIndex = (_headEvent == 0) ? -1 : _headEvent - _events; - int16 tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events; + int16 freeIndex = (_freeEvent == nullptr) ? -1 : _freeEvent - _events; + int16 headIndex = (_headEvent == nullptr) ? -1 : _headEvent - _events; + int16 tailIndex = (_tailEvent == nullptr) ? -1 : _tailEvent - _events; f->writeSint16BE(freeIndex); f->writeSint16BE(headIndex); @@ -717,8 +735,8 @@ void Scheduler::saveEvents(Common::WriteStream *f) { f->writeSint16BE(subElem); f->writeByte((wrkEvent->_localActionFl) ? 1 : 0); f->writeUint32BE(wrkEvent->_time); - f->writeSint16BE((wrkEvent->_prevEvent == 0) ? -1 : (wrkEvent->_prevEvent - _events)); - f->writeSint16BE((wrkEvent->_nextEvent == 0) ? -1 : (wrkEvent->_nextEvent - _events)); + f->writeSint16BE((wrkEvent->_prevEvent == nullptr) ? -1 : (wrkEvent->_prevEvent - _events)); + f->writeSint16BE((wrkEvent->_nextEvent == nullptr) ? -1 : (wrkEvent->_nextEvent - _events)); } } @@ -1102,7 +1120,7 @@ void Scheduler::restoreEvents(Common::ReadStream *f) { // fix up action pointer (to do better) if ((index == -1) && (subElem == -1)) - _events[i]._action = 0; + _events[i]._action = nullptr; else _events[i]._action = (Act *)&_actListArr[index][subElem]; @@ -1112,12 +1130,12 @@ void Scheduler::restoreEvents(Common::ReadStream *f) { int16 prevIndex = f->readSint16BE(); int16 nextIndex = f->readSint16BE(); - _events[i]._prevEvent = (prevIndex == -1) ? (Event *)0 : &_events[prevIndex]; - _events[i]._nextEvent = (nextIndex == -1) ? (Event *)0 : &_events[nextIndex]; + _events[i]._prevEvent = (prevIndex == -1) ? nullptr : &_events[prevIndex]; + _events[i]._nextEvent = (nextIndex == -1) ? nullptr : &_events[nextIndex]; } - _freeEvent = (freeIndex == -1) ? 0 : &_events[freeIndex]; - _headEvent = (headIndex == -1) ? 0 : &_events[headIndex]; - _tailEvent = (tailIndex == -1) ? 0 : &_events[tailIndex]; + _freeEvent = (freeIndex == -1) ? nullptr : &_events[freeIndex]; + _headEvent = (headIndex == -1) ? nullptr : &_events[headIndex]; + _tailEvent = (tailIndex == -1) ? nullptr : &_events[tailIndex]; // Adjust times to fit our time uint32 curTime = getTicks(); @@ -1156,7 +1174,7 @@ void Scheduler::insertAction(Act *action) { // Now find the place to insert the event if (!_tailEvent) { // Empty queue _tailEvent = _headEvent = curEvent; - curEvent->_nextEvent = curEvent->_prevEvent = 0; + curEvent->_nextEvent = curEvent->_prevEvent = nullptr; } else { Event *wrkEvent = _tailEvent; // Search from latest time back bool found = false; @@ -1178,7 +1196,7 @@ void Scheduler::insertAction(Act *action) { if (!found) { // Must be earliest in list _headEvent->_prevEvent = curEvent; // So insert as new head curEvent->_nextEvent = _headEvent; - curEvent->_prevEvent = 0; + curEvent->_prevEvent = nullptr; _headEvent = curEvent; } } @@ -1424,7 +1442,7 @@ Event *Scheduler::doAction(Event *curEvent) { } if (action->_a0._actType == NEW_SCREEN) { // New_screen() deletes entire list - return 0; // nextEvent = 0 since list now empty + return nullptr; // nextEvent = nullptr since list now empty } else { wrkEvent = curEvent->_nextEvent; delQueue(curEvent); // Return event to free list @@ -1455,9 +1473,9 @@ void Scheduler::delQueue(Event *curEvent) { } if (_headEvent) - _headEvent->_prevEvent = 0; // Mark end of list + _headEvent->_prevEvent = nullptr; // Mark end of list else - _tailEvent = 0; // Empty queue + _tailEvent = nullptr; // Empty queue curEvent->_nextEvent = _freeEvent; // Return p to free list if (_freeEvent) // Special case, if free list was empty diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp index aefa03cd5e..28dcdc83d6 100644 --- a/engines/hugo/sound.cpp +++ b/engines/hugo/sound.cpp @@ -123,11 +123,12 @@ SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) { _speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate()); _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle, _speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - _DOSSongPtr = 0; + _DOSSongPtr = nullptr; _curPriority = 0; _pcspkrTimer = 0; _pcspkrOctave = 3; _pcspkrNoteDuration = 2; + _DOSIntroSong = nullptr; } SoundHandler::~SoundHandler() { @@ -210,7 +211,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) { _curPriority = priority; // Get sound data - if ((soundPtr = _vm->_file->getSound(sound, &size)) == 0) + if ((soundPtr = _vm->_file->getSound(sound, &size)) == nullptr) return; Audio::AudioStream *stream = Audio::makeRawStream(soundPtr, size, 11025, Audio::FLAG_UNSIGNED); diff --git a/engines/hugo/text.cpp b/engines/hugo/text.cpp index f8b02bdf68..538a0341e2 100644 --- a/engines/hugo/text.cpp +++ b/engines/hugo/text.cpp @@ -26,9 +26,17 @@ namespace Hugo { -TextHandler::TextHandler(HugoEngine *vm) : _vm(vm), _textData(0), _stringtData(0), - _textEngine(0), _textIntro(0), _textMouse(0), _textParser(0), _textUtil(0), - _screenNames(0), _arrayNouns(0), _arrayVerbs(0) { +TextHandler::TextHandler(HugoEngine *vm) : _vm(vm) { + _textData = nullptr; + _stringtData = nullptr; + _textEngine = nullptr; + _textIntro = nullptr; + _textMouse = nullptr; + _textParser = nullptr; + _textUtil = nullptr; + _screenNames = nullptr; + _arrayNouns = nullptr; + _arrayVerbs = nullptr; } TextHandler::~TextHandler() { @@ -86,9 +94,9 @@ char **TextHandler::loadTextsVariante(Common::ReadStream &in, uint16 *arraySize) int numTexts; int entryLen; int len; - char **res = 0; - char *pos = 0; - char *posBck = 0; + char **res = nullptr; + char *pos = nullptr; + char *posBck = nullptr; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { numTexts = in.readUint16BE(); @@ -126,21 +134,21 @@ char **TextHandler::loadTextsVariante(Common::ReadStream &in, uint16 *arraySize) } char ***TextHandler::loadTextsArray(Common::ReadStream &in) { - char ***resArray = 0; + char ***resArray = nullptr; uint16 arraySize; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { arraySize = in.readUint16BE(); if (varnt == _vm->_gameVariant) { resArray = (char ***)malloc(sizeof(char **) * (arraySize + 1)); - resArray[arraySize] = 0; + resArray[arraySize] = nullptr; } for (int i = 0; i < arraySize; i++) { int numTexts = in.readUint16BE(); int entryLen = in.readUint16BE(); char *pos = (char *)malloc(entryLen); - char *posBck = 0; - char **res = 0; + char *posBck = nullptr; + char **res = nullptr; if (varnt == _vm->_gameVariant) { res = (char **)malloc(sizeof(char *) * numTexts); res[0] = pos; @@ -232,6 +240,7 @@ void TextHandler::freeTexts(char **ptr) { free(*ptr - DATAALIGNMENT); free(ptr); + ptr = nullptr; } void TextHandler::freeAllTexts() { @@ -242,12 +251,14 @@ void TextHandler::freeAllTexts() { for (int i = 0; _arrayNouns[i]; i++) freeTexts(_arrayNouns[i]); free(_arrayNouns); + _arrayNouns = nullptr; } if (_arrayVerbs) { for (int i = 0; _arrayVerbs[i]; i++) freeTexts(_arrayVerbs[i]); free(_arrayVerbs); + _arrayVerbs = nullptr; } freeTexts(_screenNames); diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp index 7809143176..0b13df239c 100644 --- a/engines/mortevielle/utils.cpp +++ b/engines/mortevielle/utils.cpp @@ -2364,8 +2364,7 @@ Common::String MortevielleEngine::copy(const Common::String &s, int idx, size_t // Copy the substring into a temporary buffer char *tmp = new char[size + 1]; - strncpy(tmp, s.c_str() + idx - 1, size); - tmp[size] = '\0'; + Common::strlcpy(tmp, s.c_str() + idx - 1, size + 1); Common::String result(tmp); delete[] tmp; diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 96c87ab3ae..efd0699d58 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -152,13 +152,20 @@ static const NeverhoodGameDescription gameDescriptions[] = { } // End of namespace Neverhood -static const ExtraGuiOption neverhoodExtraGuiOption = { +static const ExtraGuiOption neverhoodExtraGuiOption1 = { _s("Use original save/load screens"), _s("Use the original save/load screens, instead of the ScummVM ones"), "originalsaveload", false }; +static const ExtraGuiOption neverhoodExtraGuiOption2 = { + _s("Skip the Hall of Records storyboard scenes"), + _s("Allows the player to skip past the Hall of Records storyboard scenes"), + "skiphallofrecordsscenes", + false +}; + class NeverhoodMetaEngine : public AdvancedMetaEngine { public: NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) { @@ -212,7 +219,8 @@ bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const A const ExtraGuiOptions NeverhoodMetaEngine::getExtraGuiOptions(const Common::String &target) const { ExtraGuiOptions options; - options.push_back(neverhoodExtraGuiOption); + options.push_back(neverhoodExtraGuiOption1); + options.push_back(neverhoodExtraGuiOption2); return options; } diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 666b20a08a..a942bcae8c 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -2438,47 +2438,6 @@ uint32 Klaymen::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, En return 0; } -uint32 Klaymen::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x942D2081) { - _acceptInput = false; - sendMessage(_attachedSprite, 0x2003, 0); - } else if (param.asInteger() == 0xDA600012) { - stHitByBoxingGlove(); - } else if (param.asInteger() == 0x0D01B294) { - _acceptInput = false; - sendMessage(_attachedSprite, 0x480B, 0); - } - break; - } - return messageResult; -} - -uint32 Klaymen::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { - int16 speedUpFrameIndex; - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x1008: - speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash); - if (_currFrameIndex < speedUpFrameIndex) { - startAnimation(0x35AA8059, speedUpFrameIndex, -1); - _y = 435; - } - messageResult = 0; - break; - case 0x100D: - if (param.asInteger() == 0x1A1A0785) { - playSound(0, 0x40F0A342); - } else if (param.asInteger() == 0x60428026) { - playSound(0, 0x40608A59); - } - break; - } - return messageResult; -} - void Klaymen::suFallDown() { AnimatedSprite::updateDeltaXY(); HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); @@ -2546,30 +2505,6 @@ void Klaymen::stFallTouchdown() { stTryStandIdle(); } -void Klaymen::stPressDoorButton() { - _busyStatus = 2; - _acceptInput = true; - setDoDeltaX(0); - startAnimation(0x1CD89029, 0, -1); - SetUpdateHandler(&Klaymen::update); - SetMessageHandler(&Klaymen::hmPressDoorButton); - SetSpriteUpdate(&Klaymen::suAction); -} - -void Klaymen::stHitByBoxingGlove() { - _busyStatus = 1; - _acceptInput = false; - startAnimation(0x35AA8059, 0, -1); - SetUpdateHandler(&Klaymen::update); - SetMessageHandler(&Klaymen::hmHitByBoxingGlove); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klaymen::evHitByBoxingGloveDone); -} - -void Klaymen::evHitByBoxingGloveDone() { - sendMessage(_parentScene, 0x1024, 1); -} - void Klaymen::suFallSkipJump() { updateDeltaXY(); HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h index 524bb9a9f2..a614560fc0 100644 --- a/engines/neverhood/klaymen.h +++ b/engines/neverhood/klaymen.h @@ -248,10 +248,6 @@ public: uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); void upMoveObject(); - void stHitByBoxingGlove(); - uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); - void evHitByBoxingGloveDone(); - void stStandIdleSmall(); void stWonderAboutSmall(); void stWonderAboutHalfSmall(); @@ -271,9 +267,6 @@ public: void stStandIdleSpecial(); uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); - void stPressDoorButton(); - uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); - void stSpitOutFall0(); void stSpitOutFall2(); void suFallDown(); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 5ad2dd69d7..6b0635598f 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -405,6 +405,7 @@ CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAb _ticksTime = _vm->_system->getMillis() + 202100; + _vm->toggleSoundUpdate(true); _musicResource = new MusicResource(_vm); _musicResource->load(0x30812225); _musicResource->play(0); @@ -414,6 +415,7 @@ CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAb CreditsScene::~CreditsScene() { _musicResource->unload(); delete _musicResource; + _vm->toggleSoundUpdate(false); } void CreditsScene::update() { diff --git a/engines/neverhood/modules/module1000_sprites.cpp b/engines/neverhood/modules/module1000_sprites.cpp index 55618f0124..573474de02 100644 --- a/engines/neverhood/modules/module1000_sprites.cpp +++ b/engines/neverhood/modules/module1000_sprites.cpp @@ -1112,23 +1112,6 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 setKlaymenIdleTable1(); } -void KmScene1002::setupJumpToRing() { - _acceptInput = false; - SetUpdateHandler(&Klaymen::update); - SetMessageHandler(&KmScene1002::hmJumpToRing); - SetSpriteUpdate(&Klaymen::suUpdateDestX); - NextState(&KmScene1002::stHangOnRing); - sendMessage(_attachedSprite, 0x482B, 0); -} - -void KmScene1002::stJumpToRing1() { - if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing1))) { - _busyStatus = 0; - startAnimation(0xD82890BA, 0, -1); - setupJumpToRing(); - } -} - void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { if (_idleTableNum == 0) { @@ -1189,7 +1172,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4816: if (param.asInteger() == 0) - GotoState(&Klaymen::stPressDoorButton); + GotoState(&KmScene1002::stPressDoorButton); break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -1238,70 +1221,13 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y) { - - _dataResource.load(0x01900A04); -} - -uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klaymen::stTryStandIdle); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x481E: - GotoState(&KmScene1004::stReadNote); - break; - case 0x4820: - sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klaymen::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klaymen::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klaymen::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klaymen::stClimbLadderHalf); - break; - case 0x4824: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klaymen::stStartClimbLadderDown); - break; - case 0x4825: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klaymen::stStartClimbLadderUp); - break; - case 0x4828: - GotoState(&Klaymen::stTurnToBackToUse); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; +void KmScene1002::setupJumpToRing() { + _acceptInput = false; + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&KmScene1002::hmJumpToRing); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + NextState(&KmScene1002::stHangOnRing); + sendMessage(_attachedSprite, 0x482B, 0); } uint32 KmScene1002::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1332,6 +1258,14 @@ void KmScene1002::stHangOnRing() { SetSpriteUpdate(NULL); } +void KmScene1002::stJumpToRing1() { + if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing1))) { + _busyStatus = 0; + startAnimation(0xD82890BA, 0, -1); + setupJumpToRing(); + } +} + void KmScene1002::stJumpToRing2() { if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing2))) { _busyStatus = 0; @@ -1542,6 +1476,137 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam & return messageResult; } +void KmScene1002::stPressDoorButton() { + _busyStatus = 2; + _acceptInput = true; + setDoDeltaX(0); + startAnimation(0x1CD89029, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&KmScene1002::hmPressDoorButton); + SetSpriteUpdate(&Klaymen::suAction); +} + +void KmScene1002::stHitByBoxingGlove() { + _busyStatus = 1; + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&KmScene1002::hmHitByBoxingGlove); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + FinalizeState(&KmScene1002::evHitByBoxingGloveDone); +} + +void KmScene1002::evHitByBoxingGloveDone() { + sendMessage(_parentScene, 0x1024, 1); +} + +uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x942D2081) { + _acceptInput = false; + sendMessage(_attachedSprite, 0x2003, 0); + } else if (param.asInteger() == 0xDA600012) { + stHitByBoxingGlove(); + } else if (param.asInteger() == 0x0D01B294) { + _acceptInput = false; + sendMessage(_attachedSprite, 0x480B, 0); + } + break; + } + return messageResult; +} + +uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { + int16 speedUpFrameIndex; + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); + _y = 435; + } + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + playSound(0, 0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + playSound(0, 0x40608A59); + } + break; + } + return messageResult; +} + +KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y) { + + _dataResource.load(0x01900A04); +} + +uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481E: + GotoState(&KmScene1004::stReadNote); + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x4824: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4825: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4828: + GotoState(&Klaymen::stTurnToBackToUse); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { diff --git a/engines/neverhood/modules/module1000_sprites.h b/engines/neverhood/modules/module1000_sprites.h index 540a258ddc..564b3cc335 100644 --- a/engines/neverhood/modules/module1000_sprites.h +++ b/engines/neverhood/modules/module1000_sprites.h @@ -230,6 +230,9 @@ protected: void stMoveVenusFlyTrap(); void stContinueMovingVenusFlyTrap(); void evMoveVenusFlyTrapDone(); + void stPressDoorButton(); + void stHitByBoxingGlove(); + void evHitByBoxingGloveDone(); uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); @@ -238,6 +241,8 @@ protected: uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); diff --git a/engines/neverhood/modules/module2200.cpp b/engines/neverhood/modules/module2200.cpp index 745af42f72..eecddf904c 100644 --- a/engines/neverhood/modules/module2200.cpp +++ b/engines/neverhood/modules/module2200.cpp @@ -20,6 +20,8 @@ * */ +#include "common/config-manager.h" + #include "neverhood/diskplayerscene.h" #include "neverhood/gamemodule.h" #include "neverhood/modules/module1000_sprites.h" @@ -46,6 +48,18 @@ Module2200::~Module2200() { } void Module2200::createScene(int sceneNum, int which) { + if (sceneNum == 46 && ConfMan.getBool("skiphallofrecordsscenes")) { + // Skip the whole Hall of Records storyboard scenes, + // and teleport to the last scene + sceneNum = 41; + } + + if (sceneNum == 40 && ConfMan.getBool("skiphallofrecordsscenes")) { + // Skip the whole Hall of Records storyboard scenes, + // and teleport back to the first scene + sceneNum = 5; + } + debug(1, "Module2200::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { diff --git a/engines/neverhood/modules/module2800.cpp b/engines/neverhood/modules/module2800.cpp index 0578a5df2e..d51515ce81 100644 --- a/engines/neverhood/modules/module2800.cpp +++ b/engines/neverhood/modules/module2800.cpp @@ -208,6 +208,8 @@ void Module2800::createScene(int sceneNum, int which) { break; case 1001: _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + _musicResource->stop(0); + _currentMusicFileHash = 0; createSmackerScene(0x00800801, true, true, false); break; } @@ -354,7 +356,6 @@ void Module2800::updateScene() { } void Module2800::updateMusic(bool halfVolume) { - uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash(); if (!_musicResource) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 1fb32a1834..b961bccea7 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -79,6 +79,7 @@ Common::Error NeverhoodEngine::run() { // Assign default values to the config manager, in case settings are missing ConfMan.registerDefault("originalsaveload", "false"); + ConfMan.registerDefault("skiphallofrecordsscenes", "false"); _staticData = new StaticData(); _staticData->load("neverhood.dat"); diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 50fae61de0..80d8ab8257 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3840,10 +3840,15 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV const char *tmp = Common::find(str_objname.begin(), str_objname.end(), '.'); if (tmp != str_objname.end()) { index = strtol(tmp + 1, &endptr, 16); - if (*endptr) - return -1; - // Chop off the index - str_objname = Common::String(str_objname.c_str(), tmp); + if (*endptr) { + // The characters after the dot do not represent an index. + // This can happen if an object contains a dot in its name, + // like 'dominoes.opt' in Hoyle 3. + index = -1; + } else { + // Valid index found, chop it off + str_objname = Common::String(str_objname.c_str(), tmp); + } } // Replace all underscores in the name with spaces diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index d7858180f1..39244bd760 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -421,7 +421,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(Random), SIG_EVERYWHERE, "i(i)(i)", NULL, NULL }, - { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, kReadNumber_workarounds }, { MAP_CALL(RemapColors), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(i)", NULL, NULL }, #ifdef ENABLE_SCI32 { "RemapColors", kRemapColors32, SIG_SCI32, SIGFOR_ALL, "i(i)(i)(i)(i)(i)", NULL, NULL }, diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 0b499203c2..7dde7f4be6 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -99,8 +99,8 @@ public: void load(int script_nr, ResourceManager *resMan); void matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize); - int32 findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize); - void applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset); + int32 findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize, bool isMacSci11); + void applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset, bool isMacSci11); virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index d2c3356d54..cb80ba79f7 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -29,13 +29,25 @@ namespace Sci { -#define PATCH_END 0xFFFF -#define PATCH_COMMANDMASK 0xF000 -#define PATCH_VALUEMASK 0x0FFF -#define PATCH_ADDTOOFFSET 0xE000 -#define PATCH_GETORIGINALBYTE 0xD000 -#define PATCH_ADJUSTWORD 0xC000 -#define PATCH_ADJUSTWORD_NEG 0xB000 +#define SIG_END 0xFFFF +#define SIG_MISMATCH 0xFFFE +#define SIG_COMMANDMASK 0xF000 +#define SIG_VALUEMASK 0x0FFF +#define SIG_BYTEMASK 0x00FF +#define SIG_ADDTOOFFSET 0xE000 +#define SIG_UINT16 0x1000 + +#define PATCH_END 0xFFFF +#define PATCH_COMMANDMASK 0xF000 +#define PATCH_VALUEMASK 0x0FFF +#define PATCH_BYTEMASK 0x00FF +#define PATCH_ADDTOOFFSET 0xE000 +#define PATCH_GETORIGINALBYTE 0xD000 +#define PATCH_GETORIGINALBYTEADJUST 0xC000 +#define PATCH_ADJUSTWORD 0xB000 +#define PATCH_ADJUSTWORD_NEG 0xA000 +#define PATCH_UINT16 0x1000 + #define PATCH_MAGICDWORD(a, b, c, d) CONSTANT_LE_32(a | (b << 8) | (c << 16) | (d << 24)) #define PATCH_VALUELIMIT 4096 @@ -45,7 +57,7 @@ struct SciScriptSignature { int16 applyCount; uint32 magicDWord; int magicOffset; - const byte *data; + const uint16 *data; const uint16 *patch; }; @@ -78,29 +90,26 @@ struct SciScriptSignature { // We fix the script by patching in a jump to the proper code inside fawaz::doit. // Responsible method: fawaz::handleEvent // Fixes bug #3614969 -const byte camelotSignaturePeepingTom[] = { - 5, - 0x72, 0x7e, 0x07, // lofsa fawaz <-- start of proper initializion code - 0xa1, 0xb9, // sag b9h - +255, 0, - +255, 0, - +61, 19, // skip 571 bytes - 0x39, 0x7a, // pushi 7a <-- initialization code when walking automatically - 0x78, // push1 - 0x7a, // push2 - 0x38, 0xa9, 0x00, // pushi 00a9 - script 169 - 0x78, // push1 - 0x43, 0x02, 0x04, // call kScriptID - 0x36, // push - 0x81, 0x00, // lag 00 - 0x4a, 0x06, // send 06 - 0x32, 0x20, 0x05, // jmp [end of fawaz::handleEvent] - 0 +const uint16 camelotSignaturePeepingTom[] = { + 0x72, SIG_UINT16 + 0x7e, 0x07, // lofsa fawaz <-- start of proper initializion code + 0xa1, 0xb9, // sag b9h + SIG_ADDTOOFFSET +571, // skip 571 bytes + 0x39, 0x7a, // pushi 7a <-- initialization code when walking automatically + 0x78, // push1 + 0x7a, // push2 + 0x38, SIG_UINT16 + 0xa9, 0x00, // pushi 00a9 - script 169 + 0x78, // push1 + 0x43, 0x02, 0x04, // call kScriptID + 0x36, // push + 0x81, 0x00, // lag 00 + 0x4a, 0x06, // send 06 + 0x32, SIG_UINT16 + 0x20, 0x05, // jmp [end of fawaz::handleEvent] + SIG_END }; const uint16 camelotPatchPeepingTom[] = { - PATCH_ADDTOOFFSET | +576, - 0x32, 0xbd, 0xfd, // jmp to fawaz::doit / properly init peepingTom code + PATCH_ADDTOOFFSET +576, + 0x32, PATCH_UINT16 + 0xbd, 0xfd, // jmp to fawaz::doit / properly init peepingTom code PATCH_END }; @@ -116,57 +125,56 @@ const SciScriptSignature camelotSignatures[] = { // but the call is wrong, so not only do we get an error message the script // is also hanging because the cue won't get sent out // This also happens in sierra sci - refer to bug #3038387 -const byte ecoquest1SignatureStayAndHelp[] = { - 40, - 0x3f, 0x01, // link 01 - 0x87, 0x01, // lap param[1] - 0x65, 0x14, // aTop state - 0x36, // push - 0x3c, // dup - 0x35, 0x00, // ldi 00 - 0x1a, // eq? - 0x31, 0x1c, // bnt [next state] - 0x76, // push0 - 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off) - 0x38, 0x22, 0x01, // pushi 0122 - 0x78, // push1 - 0x76, // push0 - 0x81, 0x00, // lag global[0] - 0x4a, 0x06, // send 06 - call ego::setMotion(0) - 0x39, 0x6e, // pushi 6e (selector init) - 0x39, 0x04, // pushi 04 - 0x76, // push0 - 0x76, // push0 - 0x39, 0x17, // pushi 17 - 0x7c, // pushSelf - 0x51, 0x82, // class EcoNarrator - 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!) - 0x33, // jmp [end] - 0 +const uint16 ecoquest1SignatureStayAndHelp[] = { + 0x3f, 0x01, // link 01 + 0x87, 0x01, // lap param[1] + 0x65, 0x14, // aTop state + 0x36, // push + 0x3c, // dup + 0x35, 0x00, // ldi 00 + 0x1a, // eq? + 0x31, 0x1c, // bnt [next state] + 0x76, // push0 + 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off) + 0x38, SIG_UINT16 + 0x22, 0x01, // pushi 0122 + 0x78, // push1 + 0x76, // push0 + 0x81, 0x00, // lag global[0] + 0x4a, 0x06, // send 06 - call ego::setMotion(0) + 0x39, 0x6e, // pushi 6e (selector init) + 0x39, 0x04, // pushi 04 + 0x76, // push0 + 0x76, // push0 + 0x39, 0x17, // pushi 17 + 0x7c, // pushSelf + 0x51, 0x82, // class EcoNarrator + 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!) + 0x33, // jmp [end] + SIG_END }; const uint16 ecoquest1PatchStayAndHelp[] = { - 0x87, 0x01, // lap param[1] - 0x65, 0x14, // aTop state - 0x36, // push - 0x2f, 0x22, // bt [next state] (this optimization saves 6 bytes) - 0x39, 0x00, // pushi 0 (wasting 1 byte here) - 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off) - 0x38, 0x22, 0x01, // pushi 0122 - 0x78, // push1 - 0x76, // push0 - 0x81, 0x00, // lag global[0] - 0x4a, 0x06, // send 06 - call ego::setMotion(0) - 0x39, 0x6e, // pushi 6e (selector init) - 0x39, 0x06, // pushi 06 - 0x39, 0x02, // pushi 02 (additional 2 bytes) - 0x76, // push0 - 0x76, // push0 - 0x39, 0x17, // pushi 17 - 0x7c, // pushSelf - 0x38, 0x80, 0x02, // pushi 280 (additional 3 bytes) - 0x51, 0x82, // class EcoNarrator - 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640) + 0x87, 0x01, // lap param[1] + 0x65, 0x14, // aTop state + 0x36, // push + 0x2f, 0x22, // bt [next state] (this optimization saves 6 bytes) + 0x39, 0x00, // pushi 0 (wasting 1 byte here) + 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off) + 0x38, PATCH_UINT16 + 0x22, 0x01, // pushi 0122 + 0x78, // push1 + 0x76, // push0 + 0x81, 0x00, // lag global[0] + 0x4a, 0x06, // send 06 - call ego::setMotion(0) + 0x39, 0x6e, // pushi 6e (selector init) + 0x39, 0x06, // pushi 06 + 0x39, 0x02, // pushi 02 (additional 2 bytes) + 0x76, // push0 + 0x76, // push0 + 0x39, 0x17, // pushi 17 + 0x7c, // pushSelf + 0x38, PATCH_UINT16 + 0x80, 0x02, // pushi 280 (additional 3 bytes) + 0x51, 0x82, // class EcoNarrator + 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640) PATCH_END }; @@ -182,53 +190,52 @@ const SciScriptSignature ecoquest1Signatures[] = { // this worked in sierra sci just by accident. In our sci, the temp space // is resetted every time, which means the previous text isn't available // anymore. We have to patch the code because of that - bug #3035386 -const byte ecoquest2SignatureEcorder[] = { - 35, - 0x31, 0x22, // bnt [next state] - 0x39, 0x0a, // pushi 0a - 0x5b, 0x04, 0x1e, // lea temp[1e] - 0x36, // push - 0x39, 0x64, // pushi 64 - 0x39, 0x7d, // pushi 7d - 0x39, 0x32, // pushi 32 - 0x39, 0x66, // pushi 66 - 0x39, 0x17, // pushi 17 - 0x39, 0x69, // pushi 69 - 0x38, 0x31, 0x26, // pushi 2631 - 0x39, 0x6a, // pushi 6a - 0x39, 0x64, // pushi 64 - 0x43, 0x1b, 0x14, // call kDisplay - 0x35, 0x0a, // ldi 0a - 0x65, 0x20, // aTop ticks - 0x33, // jmp [end] - +1, 5, // [skip 1 byte] - 0x3c, // dup - 0x35, 0x03, // ldi 03 - 0x1a, // eq? - 0x31, // bnt [end] - 0 +const uint16 ecoquest2SignatureEcorder[] = { + 0x31, 0x22, // bnt [next state] + 0x39, 0x0a, // pushi 0a + 0x5b, 0x04, 0x1e, // lea temp[1e] + 0x36, // push + 0x39, 0x64, // pushi 64 + 0x39, 0x7d, // pushi 7d + 0x39, 0x32, // pushi 32 + 0x39, 0x66, // pushi 66 + 0x39, 0x17, // pushi 17 + 0x39, 0x69, // pushi 69 + 0x38, PATCH_UINT16 + 0x31, 0x26, // pushi 2631 + 0x39, 0x6a, // pushi 6a + 0x39, 0x64, // pushi 64 + 0x43, 0x1b, 0x14, // call kDisplay + 0x35, 0x0a, // ldi 0a + 0x65, 0x20, // aTop ticks + 0x33, // jmp [end] + SIG_ADDTOOFFSET +1, // [skip 1 byte] + 0x3c, // dup + 0x35, 0x03, // ldi 03 + 0x1a, // eq? + 0x31, // bnt [end] + SIG_END }; const uint16 ecoquest2PatchEcorder[] = { - 0x2f, 0x02, // bt [to pushi 07] - 0x3a, // toss - 0x48, // ret - 0x38, 0x07, 0x00, // pushi 07 (parameter count) (waste 1 byte) - 0x39, 0x0b, // push (FillBoxAny) - 0x39, 0x1d, // pushi 29d - 0x39, 0x73, // pushi 115d - 0x39, 0x5e, // pushi 94d - 0x38, 0xd7, 0x00, // pushi 215d - 0x78, // push1 (visual screen) - 0x38, 0x17, 0x00, // pushi 17 (color) (waste 1 byte) - 0x43, 0x6c, 0x0e, // call kGraph - 0x38, 0x05, 0x00, // pushi 05 (parameter count) (waste 1 byte) - 0x39, 0x0c, // pushi 12d (UpdateBox) - 0x39, 0x1d, // pushi 29d - 0x39, 0x73, // pushi 115d - 0x39, 0x5e, // pushi 94d - 0x38, 0xd7, 0x00, // pushi 215d - 0x43, 0x6c, 0x0a, // call kGraph + 0x2f, 0x02, // bt [to pushi 07] + 0x3a, // toss + 0x48, // ret + 0x38, PATCH_UINT16 + 0x07, 0x00, // pushi 07 (parameter count) (waste 1 byte) + 0x39, 0x0b, // push (FillBoxAny) + 0x39, 0x1d, // pushi 29d + 0x39, 0x73, // pushi 115d + 0x39, 0x5e, // pushi 94d + 0x38, PATCH_UINT16 + 0xd7, 0x00, // pushi 215d + 0x78, // push1 (visual screen) + 0x38, PATCH_UINT16 + 0x17, 0x00, // pushi 17 (color) (waste 1 byte) + 0x43, 0x6c, 0x0e, // call kGraph + 0x38, PATCH_UINT16 + 0x05, 0x00, // pushi 05 (parameter count) (waste 1 byte) + 0x39, 0x0c, // pushi 12d (UpdateBox) + 0x39, 0x1d, // pushi 29d + 0x39, 0x73, // pushi 115d + 0x39, 0x5e, // pushi 94d + 0x38, PATCH_UINT16 + 0xd7, 0x00, // pushi 215d + 0x43, 0x6c, 0x0a, // call kGraph PATCH_END }; @@ -237,27 +244,26 @@ const uint16 ecoquest2PatchEcorder[] = { // Two workarounds are needed for this patch in workarounds.cpp (when calling // kGraphFillBoxAny and kGraphUpdateBox), as there isn't enough space to patch // the function otherwise. -const byte ecoquest2SignatureEcorderTutorial[] = { - 36, - 0x30, 0x23, 0x00, // bnt [next state] - 0x39, 0x0a, // pushi 0a - 0x5b, 0x04, 0x1f, // lea temp[1f] - 0x36, // push - 0x39, 0x64, // pushi 64 - 0x39, 0x7d, // pushi 7d - 0x39, 0x32, // pushi 32 - 0x39, 0x66, // pushi 66 - 0x39, 0x17, // pushi 17 - 0x39, 0x69, // pushi 69 - 0x38, 0x31, 0x26, // pushi 2631 - 0x39, 0x6a, // pushi 6a - 0x39, 0x64, // pushi 64 - 0x43, 0x1b, 0x14, // call kDisplay - 0x35, 0x1e, // ldi 1e - 0x65, 0x20, // aTop ticks - 0x32, // jmp [end] +const uint16 ecoquest2SignatureEcorderTutorial[] = { + 0x30, SIG_UINT16 + 0x23, 0x00, // bnt [next state] + 0x39, 0x0a, // pushi 0a + 0x5b, 0x04, 0x1f, // lea temp[1f] + 0x36, // push + 0x39, 0x64, // pushi 64 + 0x39, 0x7d, // pushi 7d + 0x39, 0x32, // pushi 32 + 0x39, 0x66, // pushi 66 + 0x39, 0x17, // pushi 17 + 0x39, 0x69, // pushi 69 + 0x38, SIG_UINT16 + 0x31, 0x26, // pushi 2631 + 0x39, 0x6a, // pushi 6a + 0x39, 0x64, // pushi 64 + 0x43, 0x1b, 0x14, // call kDisplay + 0x35, 0x1e, // ldi 1e + 0x65, 0x20, // aTop ticks + 0x32, // jmp [end] // 2 extra bytes, jmp offset - 0 + SIG_END }; const uint16 ecoquest2PatchEcorderTutorial[] = { @@ -306,20 +312,19 @@ const SciScriptSignature ecoquest2Signatures[] = { // infinite loop. This script bug was not apparent in SSCI, probably because // event handling was slightly different there, so it was never discovered. // Fixes bug #3038870. -const byte fanmadeSignatureInfiniteLoop[] = { - 13, - 0x38, 0x4c, 0x00, // pushi 004c - 0x39, 0x00, // pushi 00 - 0x87, 0x01, // lap 01 - 0x4b, 0x04, // send 04 - 0x18, // not - 0x30, 0x2f, 0x00, // bnt 002f [06a5] --> jmp ffbc [0664] --> BUG! infinite loop - 0 +const uint16 fanmadeSignatureInfiniteLoop[] = { + 0x38, SIG_UINT16 + 0x4c, 0x00, // pushi 004c + 0x39, 0x00, // pushi 00 + 0x87, 0x01, // lap 01 + 0x4b, 0x04, // send 04 + 0x18, // not + 0x30, SIG_UINT16 + 0x2f, 0x00, // bnt 002f [06a5] --> jmp ffbc [0664] --> BUG! infinite loop + SIG_END }; const uint16 fanmadePatchInfiniteLoop[] = { PATCH_ADDTOOFFSET | +10, - 0x30, 0x32, 0x00, // bnt 0032 [06a8] --> pushi 004c + 0x30, SIG_UINT16 + 0x32, 0x00, // bnt 0032 [06a8] --> pushi 004c PATCH_END }; @@ -337,21 +342,20 @@ const SciScriptSignature fanmadeSignatures[] = { // was already playing in the sound driver. In our case we would also stop // the sample from playing, so we patch it out // The "score" code is already buggy and sets volume to 0 when playing -const byte freddypharkasSignatureScoreDisposal[] = { - 10, +const uint16 freddypharkasSignatureScoreDisposal[] = { 0x67, 0x32, // pTos 32 (selector theAudCount) 0x78, // push1 0x39, 0x0d, // pushi 0d 0x43, 0x75, 0x02, // call kDoAudio 0x1c, // ne? 0x31, // bnt (-> to skip disposal) - 0 + SIG_END }; const uint16 freddypharkasPatchScoreDisposal[] = { - 0x34, 0x00, 0x00, // ldi 0000 - 0x34, 0x00, 0x00, // ldi 0000 - 0x34, 0x00, 0x00, // ldi 0000 + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0000 + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0000 + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0000 PATCH_END }; @@ -361,15 +365,14 @@ const uint16 freddypharkasPatchScoreDisposal[] = { // in IconBar::disable doing endless loops even in sierra sci, because there // is no enabled icon left. We remove disabling of icon 8 (which is help), // this fixes the issue. -const byte freddypharkasSignatureCanisterHang[] = { - 12, - 0x38, 0xf1, 0x00, // pushi f1 (selector disable) - 0x7a, // push2 - 0x39, 0x07, // pushi 07 - 0x39, 0x08, // pushi 08 - 0x81, 0x45, // lag 45 - 0x4a, 0x08, // send 08 - call IconBar::disable(7, 8) - 0 +const uint16 freddypharkasSignatureCanisterHang[] = { + 0x38, SIG_UINT16 + 0xf1, 0x00, // pushi f1 (selector disable) + 0x7a, // push2 + 0x39, 0x07, // pushi 07 + 0x39, 0x08, // pushi 08 + 0x81, 0x45, // lag 45 + 0x4a, 0x08, // send 08 - call IconBar::disable(7, 8) + SIG_END }; const uint16 freddypharkasPatchCanisterHang[] = { @@ -390,20 +393,19 @@ const uint16 freddypharkasPatchCanisterHang[] = { // ego, sometimes clicks also won't get registered. Strangely it's not nearly // as bad as in our sci, but these differences may be caused by timing. // We just reuse the active event, thus removing the duplicate kGetEvent call. -const byte freddypharkasSignatureLadderEvent[] = { - 21, - 0x39, 0x6d, // pushi 6d (selector new) - 0x76, // push0 - 0x38, 0xf5, 0x00, // pushi f5 (selector curEvent) - 0x76, // push0 - 0x81, 0x50, // lag global[50] - 0x4a, 0x04, // send 04 - read User::curEvent - 0x4a, 0x04, // send 04 - call curEvent::new - 0xa5, 0x00, // sat temp[0] - 0x38, 0x94, 0x00, // pushi 94 (selector localize) - 0x76, // push0 - 0x4a, 0x04, // send 04 - call curEvent::localize - 0 +const uint16 freddypharkasSignatureLadderEvent[] = { + 0x39, 0x6d, // pushi 6d (selector new) + 0x76, // push0 + 0x38, SIG_UINT16 + 0xf5, 0x00, // pushi f5 (selector curEvent) + 0x76, // push0 + 0x81, 0x50, // lag global[50] + 0x4a, 0x04, // send 04 - read User::curEvent + 0x4a, 0x04, // send 04 - call curEvent::new + 0xa5, 0x00, // sat temp[0] + 0x38, SIG_UINT16 + 0x94, 0x00, // pushi 94 (selector localize) + 0x76, // push0 + 0x4a, 0x04, // send 04 - call curEvent::localize + SIG_END }; const uint16 freddypharkasPatchLadderEvent[] = { @@ -419,31 +421,19 @@ const uint16 freddypharkasPatchLadderEvent[] = { // In the Macintosh version of Freddy Pharkas, kRespondsTo is broken for // property selectors. They hacked the script to work around the issue, // so we revert the script back to using the values of the DOS script. -const byte freddypharkasSignatureMacInventory[] = { - 10, - 0x39, 0x23, // pushi 23 - 0x39, 0x74, // pushi 74 - 0x78, // push1 - 0x38, 0x01, 0x74, // pushi 0174 - 0x85, 0x15, // lat 15 - 0 +const uint16 freddypharkasSignatureMacInventory[] = { + 0x39, 0x23, // pushi 23 + 0x39, 0x74, // pushi 74 + 0x78, // push1 + 0x38, SIG_UINT16 + 0x74, 0x01, // pushi 0174 (on mac it's actually 0x01, 0x74) + 0x85, 0x15, // lat 15 + SIG_END }; const uint16 freddypharkasPatchMacInventory[] = { - 0x39, 0x02, // pushi 02 (now matches the DOS version) - 0x39, 0x74, // pushi 74 - 0x78, // push1 - 0x38, 0x01, 0x74, // pushi 0174 - 0x85, 0x15, // lat 15 - 0x4a, 0x06, // send 06 - 0x31, 0x08, // bnt 08 - 0x38, 0x01, 0x74, // pushi 0174 - 0x76, // push0 - 0x85, 0x15, // lat 15 - 0x4a, 0x04, // send 04 - 0x02, // add - 0xa5, 0x12, // sat 12 - 0x39, 0x04, // pushi 04 (now matches the DOS version) + 0x39, 0x02, // pushi 02 (now matches the DOS version) + PATCH_ADDTOOFFSET +23, + 0x39, 0x04, // pushi 04 (now matches the DOS version) PATCH_END }; @@ -459,66 +449,59 @@ const SciScriptSignature freddypharkasSignatures[] = { // =========================================================================== // daySixBeignet::changeState (4) is called when the cop goes out and sets cycles to 220. // this is not enough time to get to the door, so we patch that to 23 seconds -const byte gk1SignatureDay6PoliceBeignet[] = { - 4, - 0x35, 0x04, // ldi 04 - 0x1a, // eq? - 0x30, // bnt [next state check] - +2, 5, // [skip 2 bytes, offset of bnt] - 0x38, 0x93, 0x00, // pushi 93 (selector dispose) - 0x76, // push0 - 0x72, // lofsa deskSarg - +2, 9, // [skip 2 bytes, offset of lofsa] - 0x4a, 0x04, 0x00, // send 04 - 0x34, 0xdc, 0x00, // ldi 220 - 0x65, 0x1a, // aTop cycles - 0x32, // jmp [end] - 0 +const uint16 gk1SignatureDay6PoliceBeignet[] = { + 0x35, 0x04, // ldi 04 + 0x1a, // eq? + 0x30, SIG_ADDTOOFFSET +2, // bnt [next state check] + 0x38, SIG_UINT16 + 0x93, 0x00, // pushi 93 (selector dispose) + 0x76, // push0 + 0x72, SIG_ADDTOOFFSET +2, // lofsa deskSarg + 0x4a, 0x04, 0x00, // send 04 + 0x34, SIG_UINT16 + 0xdc, 0x00, // ldi 220 + 0x65, 0x1a, // aTop cycles + 0x32, // jmp [end] + SIG_END }; const uint16 gk1PatchDay6PoliceBeignet[] = { - PATCH_ADDTOOFFSET | +16, - 0x34, 0x17, 0x00, // ldi 23 - 0x65, 0x1c, // aTop seconds + PATCH_ADDTOOFFSET +16, + 0x34, PATCH_UINT16 + 0x17, 0x00, // ldi 23 + 0x65, 0x1c, // aTop seconds PATCH_END }; // sargSleeping::changeState (8) is called when the cop falls asleep and sets cycles to 220. // this is not enough time to get to the door, so we patch it to 42 seconds -const byte gk1SignatureDay6PoliceSleep[] = { - 4, - 0x35, 0x08, // ldi 08 - 0x1a, // eq? - 0x31, // bnt [next state check] - +1, 6, // [skip 1 byte, offset of bnt] - 0x34, 0xdc, 0x00, // ldi 220 - 0x65, 0x1a, // aTop cycles - 0x32, // jmp [end] +const uint16 gk1SignatureDay6PoliceSleep[] = { + 0x35, 0x08, // ldi 08 + 0x1a, // eq? + 0x31, SIG_ADDTOOFFSET +1, // bnt [next state check] + 0x34, SIG_UINT16 + 0xdc, 0x00, // ldi 220 + 0x65, 0x1a, // aTop cycles + 0x32, // jmp [end] 0 }; const uint16 gk1PatchDay6PoliceSleep[] = { - PATCH_ADDTOOFFSET | +5, - 0x34, 0x2a, 0x00, // ldi 42 - 0x65, 0x1c, // aTop seconds + PATCH_ADDTOOFFSET +5, + 0x34, SIG_UINT16 + 0x2a, 0x00, // ldi 42 + 0x65, 0x1c, // aTop seconds PATCH_END }; // startOfDay5::changeState (20h) - when gabriel goes to the phone the script will hang -const byte gk1SignatureDay5PhoneFreeze[] = { - 5, - 0x35, 0x03, // ldi 03 - 0x65, 0x1a, // aTop cycles - 0x32, // jmp [end] - +2, 3, // [skip 2 bytes, offset of jmp] - 0x3c, // dup - 0x35, 0x21, // ldi 21 - 0 +const uint16 gk1SignatureDay5PhoneFreeze[] = { + 0x35, 0x03, // ldi 03 + 0x65, 0x1a, // aTop cycles + 0x32, SIG_ADDTOOFFSET +2, // jmp [end] + 0x3c, // dup + 0x35, 0x21, // ldi 21 + SIG_END }; const uint16 gk1PatchDay5PhoneFreeze[] = { - 0x35, 0x06, // ldi 06 - 0x65, 0x20, // aTop ticks + 0x35, 0x06, // ldi 06 + 0x65, 0x20, // aTop ticks PATCH_END }; @@ -530,54 +513,53 @@ const uint16 gk1PatchDay5PhoneFreeze[] = { // comparison between a number an an object. In the CD version, the checks are // in the correct order, thus the comparison is correct, thus we use the code // from the CD version in the floppy one. -const byte gk1SignatureInterrogationBug[] = { - 43, - 0x65, 0x4c, // aTop 4c - 0x67, 0x50, // pTos 50 - 0x34, 0x10, 0x27, // ldi 2710 - 0x1e, // gt? - 0x31, 0x08, // bnt 08 [05a0] - 0x67, 0x50, // pTos 50 - 0x34, 0x10, 0x27, // ldi 2710 - 0x04, // sub - 0x65, 0x50, // aTop 50 - 0x63, 0x50, // pToa 50 - 0x31, 0x15, // bnt 15 [05b9] - 0x39, 0x0e, // pushi 0e - 0x76, // push0 - 0x4a, 0x04, 0x00, // send 0004 - 0xa5, 0x00, // sat 00 - 0x38, 0x93, 0x00, // pushi 0093 - 0x76, // push0 - 0x63, 0x50, // pToa 50 - 0x4a, 0x04, 0x00, // send 0004 - 0x85, 0x00, // lat 00 - 0x65, 0x50, // aTop 50 - 0 +const uint16 gk1SignatureInterrogationBug[] = { + 0x65, 0x4c, // aTop 4c + 0x67, 0x50, // pTos 50 + 0x34, SIG_UINT16 + 0x10, 0x27, // ldi 2710 + 0x1e, // gt? + 0x31, 0x08, // bnt 08 [05a0] + 0x67, 0x50, // pTos 50 + 0x34, SIG_UINT16 + 0x10, 0x27, // ldi 2710 + 0x04, // sub + 0x65, 0x50, // aTop 50 + 0x63, 0x50, // pToa 50 + 0x31, 0x15, // bnt 15 [05b9] + 0x39, 0x0e, // pushi 0e + 0x76, // push0 + 0x4a, 0x04, 0x00, // send 0004 + 0xa5, 0x00, // sat 00 + 0x38, SIG_UINT16 + 0x93, 0x00, // pushi 0093 + 0x76, // push0 + 0x63, 0x50, // pToa 50 + 0x4a, 0x04, 0x00, // send 0004 + 0x85, 0x00, // lat 00 + 0x65, 0x50, // aTop 50 + SIG_END }; const uint16 gk1PatchInterrogationBug[] = { - 0x65, 0x4c, // aTop 4c - 0x63, 0x50, // pToa 50 - 0x31, 0x15, // bnt 15 [05b9] - 0x39, 0x0e, // pushi 0e - 0x76, // push0 - 0x4a, 0x04, 0x00, // send 0004 - 0xa5, 0x00, // sat 00 - 0x38, 0x93, 0x00, // pushi 0093 - 0x76, // push0 - 0x63, 0x50, // pToa 50 - 0x4a, 0x04, 0x00, // send 0004 - 0x85, 0x00, // lat 00 - 0x65, 0x50, // aTop 50 - 0x67, 0x50, // pTos 50 - 0x34, 0x10, 0x27, // ldi 2710 - 0x1e, // gt? - 0x31, 0x08, // bnt 08 [05b9] - 0x67, 0x50, // pTos 50 - 0x34, 0x10, 0x27, // ldi 2710 - 0x04, // sub - 0x65, 0x50, // aTop 50 + 0x65, 0x4c, // aTop 4c + 0x63, 0x50, // pToa 50 + 0x31, 0x15, // bnt 15 [05b9] + 0x39, 0x0e, // pushi 0e + 0x76, // push0 + 0x4a, 0x04, 0x00, // send 0004 + 0xa5, 0x00, // sat 00 + 0x38, PATCH_UINT16 + 0x93, 0x00, // pushi 0093 + 0x76, // push0 + 0x63, 0x50, // pToa 50 + 0x4a, 0x04, 0x00, // send 0004 + 0x85, 0x00, // lat 00 + 0x65, 0x50, // aTop 50 + 0x67, 0x50, // pTos 50 + 0x34, PATCH_UINT16 + 0x10, 0x27, // ldi 2710 + 0x1e, // gt? + 0x31, 0x08, // bnt 08 [05b9] + 0x67, 0x50, // pTos 50 + 0x34, PATCH_UINT16 + 0x10, 0x27, // ldi 2710 + 0x04, // sub + 0x65, 0x50, // aTop 50 PATCH_END }; @@ -596,47 +578,46 @@ const SciScriptSignature gk1Signatures[] = { // is later used to set master volume. This issue makes sierra sci set // the volume to max. We fix the export, so volume won't get modified in // those cases. -const byte kq5SignatureCdHarpyVolume[] = { - 34, - 0x80, 0x91, 0x01, // lag global[191h] - 0x18, // not - 0x30, 0x2c, 0x00, // bnt [jump further] (jumping, if global 191h is 1) - 0x35, 0x01, // ldi 01 - 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1) - 0x38, 0x7b, 0x01, // pushi 017b - 0x76, // push0 - 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 - read KQ5::masterVolume - 0xa5, 0x03, // sat temp[3] (store volume in temp 3) - 0x38, 0x7b, 0x01, // pushi 017b - 0x76, // push0 - 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 - read KQ5::masterVolume - 0x36, // push - 0x35, 0x04, // ldi 04 - 0x20, // ge? (followed by bnt) - 0 +const uint16 kq5SignatureCdHarpyVolume[] = { + 0x80, SIG_UINT16 + 0x91, 0x01, // lag global[191h] + 0x18, // not + 0x30, SIG_UINT16 + 0x2c, 0x00, // bnt [jump further] (jumping, if global 191h is 1) + 0x35, 0x01, // ldi 01 + 0xa0, SIG_UINT16 + 0x91, 0x01, // sag global[191h] (setting global 191h to 1) + 0x38, SIG_UINT16 + 0x7b, 0x01, // pushi 017b + 0x76, // push0 + 0x81, 0x01, // lag global[1] + 0x4a, 0x04, // send 04 - read KQ5::masterVolume + 0xa5, 0x03, // sat temp[3] (store volume in temp 3) + 0x38, SIG_UINT16 + 0x7b, 0x01, // pushi 017b + 0x76, // push0 + 0x81, 0x01, // lag global[1] + 0x4a, 0x04, // send 04 - read KQ5::masterVolume + 0x36, // push + 0x35, 0x04, // ldi 04 + 0x20, // ge? (followed by bnt) + SIG_END }; const uint16 kq5PatchCdHarpyVolume[] = { - 0x38, 0x2f, 0x02, // pushi 022f (selector theVol) (3 new bytes) - 0x76, // push0 (1 new byte) - 0x51, 0x88, // class SpeakTimer (2 new bytes) - 0x4a, 0x04, // send 04 (2 new bytes) -> read SpeakTimer::theVol - 0xa5, 0x03, // sat temp[3] (2 new bytes) -> write to temp 3 - 0x80, 0x91, 0x01, // lag global[191h] + 0x38, PATCH_UINT16 + 0x2f, 0x02, // pushi 022f (selector theVol) (3 new bytes) + 0x76, // push0 (1 new byte) + 0x51, 0x88, // class SpeakTimer (2 new bytes) + 0x4a, 0x04, // send 04 (2 new bytes) -> read SpeakTimer::theVol + 0xa5, 0x03, // sat temp[3] (2 new bytes) -> write to temp 3 + 0x80, PATCH_UINT16 + 0x91, 0x01, // lag global[191h] // saving 1 byte due optimization - 0x2e, 0x23, 0x00, // bt [jump further] (jumping, if global 191h is 1) - 0x35, 0x01, // ldi 01 - 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1) - 0x38, 0x7b, 0x01, // pushi 017b - 0x76, // push0 - 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 - read KQ5::masterVolume - 0xa5, 0x03, // sat temp[3] (store volume in temp 3) + 0x2e, PATCH_UINT16 + 0x23, 0x00, // bt [jump further] (jumping, if global 191h is 1) + 0x35, 0x01, // ldi 01 + 0xa0, PATCH_UINT16 + 0x91, 0x01, // sag global[191h] (setting global 191h to 1) + 0x38, PATCH_UINT16 + 0x7b, 0x01, // pushi 017b + 0x76, // push0 + 0x81, 0x01, // lag global[1] + 0x4a, 0x04, // send 04 - read KQ5::masterVolume + 0xa5, 0x03, // sat temp[3] (store volume in temp 3) // saving 8 bytes due removing of duplicate code - 0x39, 0x04, // pushi 04 (saving 1 byte due swapping) - 0x22, // lt? (because we switched values) + 0x39, 0x04, // pushi 04 (saving 1 byte due swapping) + 0x22, // lt? (because we switched values) PATCH_END }; @@ -654,24 +635,23 @@ const uint16 kq5PatchCdHarpyVolume[] = { // of variables effectively hides witchCage::doit, causing this position check // to be bypassed entirely. // See also the warning+comment in Object::initBaseObject -const byte kq5SignatureWitchCageInit[] = { - 16, - 0x00, 0x00, // top - 0x00, 0x00, // left - 0x00, 0x00, // bottom - 0x00, 0x00, // right - 0x00, 0x00, // extra property #1 - 0x7a, 0x00, // extra property #2 - 0xc8, 0x00, // extra property #3 - 0xa3, 0x00, // extra property #4 - 0 +const uint16 kq5SignatureWitchCageInit[] = { + SIG_UINT16 + 0x00, 0x00, // top + SIG_UINT16 + 0x00, 0x00, // left + SIG_UINT16 + 0x00, 0x00, // bottom + SIG_UINT16 + 0x00, 0x00, // right + SIG_UINT16 + 0x00, 0x00, // extra property #1 + SIG_UINT16 + 0x7a, 0x00, // extra property #2 + SIG_UINT16 + 0xc8, 0x00, // extra property #3 + SIG_UINT16 + 0xa3, 0x00, // extra property #4 + SIG_END }; const uint16 kq5PatchWitchCageInit[] = { - 0x00, 0x00, // top - 0x7a, 0x00, // left - 0xc8, 0x00, // bottom - 0xa3, 0x00, // right + PATCH_UINT16 + 0x00, 0x00, // top + PATCH_UINT16 + 0x7a, 0x00, // left + PATCH_UINT16 + 0xc8, 0x00, // bottom + PATCH_UINT16 + 0xa3, 0x00, // right PATCH_END }; @@ -689,17 +669,16 @@ const uint16 kq5PatchWitchCageInit[] = { // changes to GameFeatures::detectsetCursorType() ) and breaking savegame // compatibilty between the DOS and Windows CD versions of KQ5. // TODO: Investigate these side effects more closely. -const byte kq5SignatureWinGMSignals[] = { - 9, - 0x80, 0x90, 0x01, // lag 0x190 - 0x18, // not - 0x30, 0x1b, 0x00, // bnt +0x001B - 0x89, 0x57, // lsg 0x57 - 0 +const uint16 kq5SignatureWinGMSignals[] = { + 0x80, SIG_UINT16 + 0x90, 0x01, // lag 0x190 + 0x18, // not + 0x30, SIG_UINT16 + 0x1b, 0x00, // bnt +0x001B + 0x89, 0x57, // lsg 0x57 + SIG_END }; const uint16 kq5PatchWinGMSignals[] = { - 0x34, 0x01, 0x00, // ldi 0x0001 + 0x34, PATCH_UINT16 + 0x01, 0x00, // ldi 0x0001 PATCH_END }; @@ -726,24 +705,94 @@ const SciScriptSignature kq5WinGMSignatures[] = { // unnecessary cryMusic::check method out, thereby stopping the sound from // constantly restarting (since it's being looped anyway), thus the normal // game speech can work while the baby cry sound is heard. Fixes bug #3034579. -const byte kq6SignatureDuplicateBabyCry[] = { - 10, - 0x83, 0x00, // lal 00 - 0x31, 0x1e, // bnt 1e [07f4] - 0x78, // push1 - 0x39, 0x04, // pushi 04 - 0x43, 0x75, 0x02, // callk DoAudio[75] 02 - 0 +const uint16 kq6SignatureDuplicateBabyCry[] = { + 0x83, 0x00, // lal 00 + 0x31, 0x1e, // bnt 1e [07f4] + 0x78, // push1 + 0x39, 0x04, // pushi 04 + 0x43, 0x75, 0x02, // callk DoAudio[75] 02 + SIG_END }; const uint16 kq6PatchDuplicateBabyCry[] = { - 0x48, // ret + 0x48, // ret + PATCH_END +}; + +// The inventory of King's Quest 6 is buggy. When it grows too large, +// it will get split into 2 pages. Switching between those pages will +// grow the stack, because it's calling itself per switch. +// Which means after a while ScummVM will bomb out because the stack frame +// will be too large. This patch fixes the buggy script. +// This patch applies to at least CD, English floppy, German floppy +// Responsible method: KqInv::showSelf +// Fixes bug #3293954 +const uint16 kq6SignatureInventoryStackFix[] = { + 0x67, 0x30, // pTos state + 0x34, SIG_UINT16 + 0x00, 0x20, // ldi 2000 + 0x12, // and + 0x18, // not + 0x31, 0x04, // bnt [not first refresh] + 0x35, 0x00, // ldi 00 + 0x65, 0x1e, // aTop curIcon + 0x67, 0x30, // pTos state + 0x34, SIG_UINT16 + 0xff, 0xdf, // ldi dfff + 0x12, // and + 0x65, 0x30, // aTop state + 0x38, SIG_ADDTOOFFSET + 2, // pushi "show" ("show" may be e100h for KQ6CD, xxxxh for KQ6 floppy) + 0x78, // push1 + 0x87, 0x00, // lap param[0] + 0x31, 0x04, // bnt [use global for show] + 0x87, 0x01, // lap param[1] + 0x33, 0x02, // jmp [use param for show] + 0x81, 0x00, // lag global[0] + 0x36, // push + 0x54, 0x06, // self 06 (KqInv::show) + 0x31, SIG_ADDTOOFFSET + 1, // bnt [exit menu code] (0x08 for PC, 0x07 for mac) + 0x39, 0x39, // pushi 39 + 0x76, // push0 + 0x54, 0x04, // self 04 (KqInv::doit) + SIG_END // followed by jmp (0x32 for PC, 0x33 for mac) +}; + +const uint16 kq6PatchInventoryStackFix[] = { + 0x67, 0x30, // pTos state + 0x3c, // dup (1 more byte, needed for patch) + 0x3c, // dup (1 more byte, saves 1 byte later) + 0x34, PATCH_UINT16 + 0x00, 0x20, // ldi 2000 + 0x12, // and + 0x2f, 0x02, // bt [not first refresh] - saves 3 bytes in total + 0x65, 0x1e, // aTop curIcon + 0x00, // neg (either 2000 or 0000 in acc, this will create dfff or ffff) - saves 2 bytes +// 0x34, PATCH_UINT16 + 0xff, 0xdf, // ldi dfff + 0x12, // and + 0x65, 0x30, // aTop state + 0x38, // pushi "show" + PATCH_GETORIGINALBYTE +22, + PATCH_GETORIGINALBYTE +23, + 0x78, // push1 + 0x87, 0x00, // lap param[0] + 0x31, 0x04, // bnt [call show using global 0] + 0x8f, 0x01, // lsp param[1], save 1 byte total with lsg global[0] combined + 0x33, 0x02, // jmp [call show using param 1] + 0x89, 0x00, // lsg global[0], save 1 byte total, see above + 0x54, 0x06, // self 06 (call x::show) + 0x31, // bnt [menu exit code] + PATCH_GETORIGINALBYTEADJUST +39, +6,// dynamic offset must be 0x0E for PC and 0x0D for mac + 0x34, PATCH_UINT16 + 0x00, 0x20, // ldi 2000 + 0x12, // and + 0x2f, 0x05, // bt [to return] + 0x39, 0x39, // pushi 39 + 0x76, // push0 + 0x54, 0x04, // self 04 (self::doit) + 0x48, // ret (saves 2 bytes for PC, 1 byte for mac) PATCH_END }; // script, description, magic DWORD, adjust const SciScriptSignature kq6Signatures[] = { { 481, "duplicate baby cry", 1, PATCH_MAGICDWORD(0x83, 0x00, 0x31, 0x1e), 0, kq6SignatureDuplicateBabyCry, kq6PatchDuplicateBabyCry }, + { 907, "inventory stack fix", 1, PATCH_MAGICDWORD(0x65, 0x1e, 0x67, 0x30), -11, kq6SignatureInventoryStackFix, kq6PatchInventoryStackFix }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -757,33 +806,29 @@ const SciScriptSignature kq6Signatures[] = { // reads a random pointer and crashes. We patch all of the 5 function calls // (one for each letter typed from "R", "O", "B", "I", "N") so that they are // the same as the English version. Fixes bug #3048054. -const byte longbowSignatureShowHandCode[] = { - 3, - 0x78, // push1 - 0x78, // push1 - 0x72, // lofsa - +2, 2, // skip 2 bytes, offset of lofsa (the letter typed) - 0x36, // push - 0x40, // call - +2, 3, // skip 2 bytes, offset of call - 0x02, // perform the call above with 2 parameters - 0x36, // push - 0x40, // call - +2, 8, // skip 2 bytes, offset of call - 0x02, // perform the call above with 2 parameters - 0x38, 0x1c, 0x01, // pushi 011c (setMotion) - 0x39, 0x04, // pushi 04 (x) - 0x51, 0x1e, // class MoveTo - 0 +const uint16 longbowSignatureShowHandCode[] = { + 0x78, // push1 + 0x78, // push1 + 0x72, SIG_ADDTOOFFSET +2, // lofsa (letter, that was typed) + 0x36, // push + 0x40, SIG_ADDTOOFFSET +2, // call + 0x02, // perform the call above with 2 parameters + 0x36, // push + 0x40, SIG_ADDTOOFFSET +2, // call + 0x02, // perform the call above with 2 parameters + 0x38, SIG_UINT16 + 0x1c, 0x01, // pushi 011c (setMotion) + 0x39, 0x04, // pushi 04 (x) + 0x51, 0x1e, // class MoveTo + SIG_END }; const uint16 longbowPatchShowHandCode[] = { - 0x39, 0x01, // pushi 1 (combine the two push1's in one, like in the English version) - PATCH_ADDTOOFFSET | +3, // leave the lofsa call untouched + 0x39, 0x01, // pushi 1 (combine the two push1's in one, like in the English version) + PATCH_ADDTOOFFSET +3, // leave the lofsa call untouched // The following will remove the duplicate call - 0x32, 0x02, 0x00, // jmp 02 - skip 2 bytes (the remainder of the first call) - 0x48, // ret (dummy, should never be reached) - 0x48, // ret (dummy, should never be reached) + 0x32, PATCH_UINT16 + 0x02, 0x00, // jmp 02 - skip 2 bytes (the remainder of the first call) + 0x48, // ret (dummy, should never be reached) + 0x48, // ret (dummy, should never be reached) PATCH_END }; @@ -809,23 +854,22 @@ const SciScriptSignature longbowSignatures[] = { // We patch the script to use global 90, which seems to be unused in the whole game. // Responsible method: rm63Script::handleEvent // Fixes bug #3614419 -const byte larry2SignatureWearParachutePoints[] = { - 16, - 0x35, 0x01, // ldi 01 - 0xa1, 0x8e, // sag 8e - 0x80, 0xe0, 0x01, // lag 1e0 - 0x18, // not - 0x30, 0x0f, 0x00, // bnt [don't give points] - 0x35, 0x01, // ldi 01 - 0xa0, 0xe0, 0x01, // sag 1e0 - 0 +const uint16 larry2SignatureWearParachutePoints[] = { + 0x35, 0x01, // ldi 01 + 0xa1, 0x8e, // sag 8e + 0x80, SIG_UINT16 + 0xe0, 0x01, // lag 1e0 + 0x18, // not + 0x30, SIG_UINT16 + 0x0f, 0x00, // bnt [don't give points] + 0x35, 0x01, // ldi 01 + 0xa0, 0xe0, 0x01, // sag 1e0 + SIG_END }; const uint16 larry2PatchWearParachutePoints[] = { - PATCH_ADDTOOFFSET | +4, - 0x80, 0x5a, 0x00, // lag 5a (global 90) - PATCH_ADDTOOFFSET | +6, - 0xa0, 0x5a, 0x00, // sag 5a (global 90) + PATCH_ADDTOOFFSET +4, + 0x80, PATCH_UINT16 + 0x5a, 0x00, // lag 5a (global 90) + PATCH_ADDTOOFFSET +6, + 0xa0, PATCH_UINT16 + 0x5a, 0x00, // sag 5a (global 90) PATCH_END }; @@ -843,40 +887,37 @@ const SciScriptSignature larry2Signatures[] = { // doesn't happen anymore. We would otherwise get a crash // calling for invalid views (this happens of course also // in sierra sci) -const byte larry6SignatureDeathDialog[] = { - 7, - 0x3e, 0x33, 0x01, // link 0133 (offset 0x20) - 0x35, 0xff, // ldi ff - 0xa3, 0x00, // sal 00 - +255, 0, - +255, 0, - +170, 12, // [skip 680 bytes] - 0x8f, 0x01, // lsp 01 (offset 0x2cf) - 0x7a, // push2 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e - 0x36, // push - 0x43, 0x7c, 0x0e, // kMessage[7c] 0e - +90, 10, // [skip 90 bytes] - 0x38, 0xd6, 0x00, // pushi 00d6 (offset 0x335) - 0x78, // push1 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e - 0x36, // push - +76, 11, // [skip 76 bytes] - 0x38, 0xcd, 0x00, // pushi 00cd (offset 0x38b) - 0x39, 0x03, // pushi 03 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e +const uint16 larry6SignatureDeathDialog[] = { + 0x3e, SIG_UINT16 + 0x33, 0x01, // link 0133 (offset 0x20) + 0x35, 0xff, // ldi ff + 0xa3, 0x00, // sal 00 + SIG_ADDTOOFFSET +680, // [skip 680 bytes] + 0x8f, 0x01, // lsp 01 (offset 0x2cf) + 0x7a, // push2 + 0x5a, SIG_UINT16 + 0x04, 0x00, SIG_UINT16 + 0x0e, 0x01, // lea 0004 010e + 0x36, // push + 0x43, 0x7c, 0x0e, // kMessage[7c] 0e + SIG_ADDTOOFFSET +90, // [skip 90 bytes] + 0x38, SIG_UINT16 + 0xd6, 0x00, // pushi 00d6 (offset 0x335) + 0x78, // push1 + 0x5a, SIG_UINT16 + 0x04, 0x00, SIG_UINT16 + 0x0e, 0x01, // lea 0004 010e + 0x36, // push + SIG_ADDTOOFFSET +76, // [skip 76 bytes] + 0x38, SIG_UINT16 + 0xcd, 0x00, // pushi 00cd (offset 0x38b) + 0x39, 0x03, // pushi 03 + 0x5a, SIG_UINT16 + 0x04, 0x00, SIG_UINT16 + 0x0e, 0x01, // lea 0004 010e 0x36, - 0 + SIG_END }; const uint16 larry6PatchDeathDialog[] = { - 0x3e, 0x00, 0x02, // link 0200 - PATCH_ADDTOOFFSET | +687, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 - PATCH_ADDTOOFFSET | +98, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 - PATCH_ADDTOOFFSET | +82, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + 0x3e, 0x00, 0x02, // link 0200 + PATCH_ADDTOOFFSET +687, + 0x5a, PATCH_UINT16 + 0x04, 0x00, PATCH_UINT16 + 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET +98, + 0x5a, PATCH_UINT16 + 0x04, 0x00, PATCH_UINT16 + 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET +82, + 0x5a, PATCH_UINT16 + 0x04, 0x00, PATCH_UINT16 + 0x40, 0x01, // lea 0004 0140 PATCH_END }; @@ -890,23 +931,22 @@ const SciScriptSignature larry6Signatures[] = { // rm560::doit was supposed to close the painting, when Heimlich enters the // room. The code is buggy, so it actually closes the painting, when heimlich // is not in the room. We fix that. -const byte laurabow2SignaturePaintingClosing[] = { - 17, - 0x4a, 0x04, // send 04 - read aHeimlich::room - 0x36, // push - 0x81, 0x0b, // lag global[11d] -> current room - 0x1c, // ne? - 0x31, 0x0e, // bnt [don't close] - 0x35, 0x00, // ldi 00 - 0xa3, 0x00, // sal local[0] - 0x38, 0x92, 0x00, // pushi 0092 - 0x78, // push1 - 0x72, // lofsa sDumpSafe - 0 +const uint16 laurabow2SignaturePaintingClosing[] = { + 0x4a, 0x04, // send 04 - read aHeimlich::room + 0x36, // push + 0x81, 0x0b, // lag global[11d] -> current room + 0x1c, // ne? + 0x31, 0x0e, // bnt [don't close] + 0x35, 0x00, // ldi 00 + 0xa3, 0x00, // sal local[0] + 0x38, SIG_UINT16 + 0x92, 0x00, // pushi 0092 + 0x78, // push1 + 0x72, // lofsa sDumpSafe + SIG_END }; const uint16 laurabow2PatchPaintingClosing[] = { - PATCH_ADDTOOFFSET | +6, + PATCH_ADDTOOFFSET +6, 0x2f, 0x0e, // bt [don't close] PATCH_END }; @@ -922,29 +962,27 @@ const SciScriptSignature laurabow2Signatures[] = { // MG::replay somewhat calculates the savedgame-id used when saving again // this doesn't work right and we remove the code completely. // We set the savedgame-id directly right after restoring in kRestoreGame. -const byte mothergoose256SignatureReplay[] = { - 6, - 0x36, // push - 0x35, 0x20, // ldi 20 - 0x04, // sub - 0xa1, 0xb3, // sag global[b3] - 0 +const uint16 mothergoose256SignatureReplay[] = { + 0x36, // push + 0x35, 0x20, // ldi 20 + 0x04, // sub + 0xa1, 0xb3, // sag global[b3] + SIG_END }; const uint16 mothergoose256PatchReplay[] = { - 0x34, 0x00, 0x00, // ldi 0000 (dummy) - 0x34, 0x00, 0x00, // ldi 0000 (dummy) + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0000 (dummy) + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0000 (dummy) PATCH_END }; // when saving, it also checks if the savegame ID is below 13. // we change this to check if below 113 instead -const byte mothergoose256SignatureSaveLimit[] = { - 5, +const uint16 mothergoose256SignatureSaveLimit[] = { 0x89, 0xb3, // lsg global[b3] 0x35, 0x0d, // ldi 0d 0x20, // ge? - 0 + SIG_END }; const uint16 mothergoose256PatchSaveLimit[] = { @@ -973,47 +1011,46 @@ const SciScriptSignature mothergoose256Signatures[] = { // when the 2 seconds have passed and the locker got closed. // Responsible method: putGun::changeState (script 341) // Fixes bug #3036933 / #3303802 -const byte pq1vgaSignaturePutGunInLockerBug[] = { - 5, - 0x35, 0x00, // ldi 00 - 0x1a, // eq? - 0x31, 0x25, // bnt [next state check] - +22, 29, // [skip 22 bytes] - 0x38, 0x5f, 0x01, // pushi 15fh - 0x78, // push1 - 0x76, // push0 - 0x81, 0x00, // lag 00 - 0x4a, 0x06, // send 06 - ego::put(0) - 0x35, 0x02, // ldi 02 - 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) - 0x33, 0x0e, // jmp [end of method] - 0x3c, // dup --- next state check target - 0x35, 0x01, // ldi 01 - 0x1a, // eq? - 0x31, 0x08, // bnt [end of method] - 0x39, 0x6f, // pushi 6fh - 0x76, // push0 - 0x72, 0x88, 0x00, // lofsa 0088 - 0x4a, 0x04, // send 04 - locker::dispose - 0 +const uint16 pq1vgaSignaturePutGunInLockerBug[] = { + 0x35, 0x00, // ldi 00 + 0x1a, // eq? + 0x31, 0x25, // bnt [next state check] + SIG_ADDTOOFFSET +22, // [skip 22 bytes] + 0x38, SIG_UINT16 + 0x5f, 0x01, // pushi 15fh + 0x78, // push1 + 0x76, // push0 + 0x81, 0x00, // lag 00 + 0x4a, 0x06, // send 06 - ego::put(0) + 0x35, 0x02, // ldi 02 + 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) + 0x33, 0x0e, // jmp [end of method] + 0x3c, // dup --- next state check target + 0x35, 0x01, // ldi 01 + 0x1a, // eq? + 0x31, 0x08, // bnt [end of method] + 0x39, 0x6f, // pushi 6fh + 0x76, // push0 + 0x72, SIG_UINT16 + 0x88, 0x00, // lofsa 0088 + 0x4a, 0x04, // send 04 - locker::dispose + SIG_END }; const uint16 pq1vgaPatchPutGunInLockerBug[] = { - PATCH_ADDTOOFFSET | +3, - 0x31, 0x1c, // bnt [next state check] - PATCH_ADDTOOFFSET | +22, - 0x35, 0x02, // ldi 02 - 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) - 0x33, 0x17, // jmp [end of method] - 0x3c, // dup --- next state check target - 0x35, 0x01, // ldi 01 - 0x1a, // eq? - 0x31, 0x11, // bnt [end of method] - 0x38, 0x5f, 0x01, // pushi 15fh - 0x78, // push1 - 0x76, // push0 - 0x81, 0x00, // lag 00 - 0x4a, 0x06, // send 06 - ego::put(0) + PATCH_ADDTOOFFSET +3, + 0x31, 0x1c, // bnt [next state check] + PATCH_ADDTOOFFSET +22, + 0x35, 0x02, // ldi 02 + 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) + 0x33, 0x17, // jmp [end of method] + 0x3c, // dup --- next state check target + 0x35, 0x01, // ldi 01 + 0x1a, // eq? + 0x31, 0x11, // bnt [end of method] + 0x38, SIG_UINT16 + 0x5f, 0x01, // pushi 15fh + 0x78, // push1 + 0x76, // push0 + 0x81, 0x00, // lag 00 + 0x4a, 0x06, // send 06 - ego::put(0) PATCH_END }; @@ -1032,43 +1069,42 @@ const SciScriptSignature pq1vgaSignatures[] = { // not nearly as bad as in our sci, but these differences may be caused by // timing. // We just reuse the active event, thus removing the duplicate kGetEvent call. -const byte qfg1vgaSignatureFightEvents[] = { - 25, - 0x39, 0x6d, // pushi 6d (selector new) - 0x76, // push0 - 0x51, 0x07, // class Event - 0x4a, 0x04, // send 04 - call Event::new - 0xa5, 0x00, // sat temp[0] - 0x78, // push1 - 0x76, // push0 - 0x4a, 0x04, // send 04 - read Event::x - 0xa5, 0x03, // sat temp[3] - 0x76, // push0 (selector y) - 0x76, // push0 - 0x85, 0x00, // lat temp[0] - 0x4a, 0x04, // send 04 - read Event::y - 0x36, // push - 0x35, 0x0a, // ldi 0a - 0x04, // sub (poor mans localization) ;-) - 0 +const uint16 qfg1vgaSignatureFightEvents[] = { + 0x39, 0x6d, // pushi 6d (selector new) + 0x76, // push0 + 0x51, 0x07, // class Event + 0x4a, 0x04, // send 04 - call Event::new + 0xa5, 0x00, // sat temp[0] + 0x78, // push1 + 0x76, // push0 + 0x4a, 0x04, // send 04 - read Event::x + 0xa5, 0x03, // sat temp[3] + 0x76, // push0 (selector y) + 0x76, // push0 + 0x85, 0x00, // lat temp[0] + 0x4a, 0x04, // send 04 - read Event::y + 0x36, // push + 0x35, 0x0a, // ldi 0a + 0x04, // sub (poor mans localization) ;-) + SIG_END }; const uint16 qfg1vgaPatchFightEvents[] = { - 0x38, 0x5a, 0x01, // pushi 15a (selector curEvent) - 0x76, // push0 - 0x81, 0x50, // lag global[50] - 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code - 0xa5, 0x00, // sat temp[0] - 0x78, // push1 - 0x76, // push0 - 0x4a, 0x04, // send 04 - read Event::x - 0xa5, 0x03, // sat temp[3] - 0x76, // push0 (selector y) - 0x76, // push0 - 0x85, 0x00, // lat temp[0] - 0x4a, 0x04, // send 04 - read Event::y - 0x39, 0x00, // pushi 00 - 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it + 0x38, PATCH_UINT16 + 0x5a, 0x01, // pushi 15a (selector curEvent) + 0x76, // push0 + 0x81, 0x50, // lag global[50] + 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code + 0xa5, 0x00, // sat temp[0] + 0x78, // push1 + 0x76, // push0 + 0x4a, 0x04, // send 04 - read Event::x + 0xa5, 0x03, // sat temp[3] + 0x76, // push0 (selector y) + 0x76, // push0 + 0x85, 0x00, // lat temp[0] + 0x4a, 0x04, // send 04 - read Event::y + 0x39, 0x00, // pushi 00 + 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it PATCH_END }; @@ -1082,28 +1118,26 @@ const uint16 qfg1vgaPatchFightEvents[] = { // Fixes bug #3568431. // Patch 1: Increase temp space -const byte qfg1vgaSignatureTempSpace[] = { - 4, - 0x3f, 0xba, // link 0xba - 0x87, 0x00, // lap 0 - 0 +const uint16 qfg1vgaSignatureTempSpace[] = { + 0x3f, 0xba, // link 0xba + 0x87, 0x00, // lap 0 + SIG_END }; const uint16 qfg1vgaPatchTempSpace[] = { - 0x3f, 0xca, // link 0xca + 0x3f, 0xca, // link 0xca PATCH_END }; // Patch 2: Move the pointer used for the window header a little bit -const byte qfg1vgaSignatureDialogHeader[] = { - 4, - 0x5b, 0x04, 0x80, // lea temp[0x80] - 0x36, // push - 0 +const uint16 qfg1vgaSignatureDialogHeader[] = { + 0x5b, 0x04, 0x80, // lea temp[0x80] + 0x36, // push + SIG_END }; const uint16 qfg1vgaPatchDialogHeader[] = { - 0x5b, 0x04, 0x90, // lea temp[0x90] + 0x5b, 0x04, 0x90, // lea temp[0x90] PATCH_END }; @@ -1116,38 +1150,36 @@ const uint16 qfg1vgaPatchDialogHeader[] = { // the crusher, ego is supposed to move close to position 79, 165. We change it // to 85, 165, which is not an edge case thus the freeze is avoided. // Fixes bug #3585189. -const byte qfg1vgaSignatureMoveToCrusher[] = { - 9, - 0x51, 0x1f, // class Motion - 0x36, // push - 0x39, 0x4f, // pushi 4f (79 - x) - 0x38, 0xa5, 0x00, // pushi 00a5 (165 - y) - 0x7c, // pushSelf - 0 +const uint16 qfg1vgaSignatureMoveToCrusher[] = { + 0x51, 0x1f, // class Motion + 0x36, // push + 0x39, 0x4f, // pushi 4f (79 - x) + 0x38, SIG_UINT16 + 0xa5, 0x00, // pushi 00a5 (165 - y) + 0x7c, // pushSelf + SIG_END }; const uint16 qfg1vgaPatchMoveToCrusher[] = { - PATCH_ADDTOOFFSET | +3, - 0x39, 0x55, // pushi 55 (85 - x) + PATCH_ADDTOOFFSET +3, + 0x39, 0x55, // pushi 55 (85 - x) PATCH_END }; // Same pathfinding bug as above, where Ego is set to move to an impossible // spot when sneaking. In GuardsTrumpet::changeState, we change the final // location where Ego is moved from 111, 111 to 114, 114. Fixes bug #3604939. -const byte qfg1vgaSignatureMoveToCastleGate[] = { - 7, - 0x51, 0x1f, // class MoveTo - 0x36, // push - 0x39, 0x6f, // pushi 6f (111 - x) - 0x3c, // dup (111 - y) - 0x7c, // pushSelf - 0 +const uint16 qfg1vgaSignatureMoveToCastleGate[] = { + 0x51, 0x1f, // class MoveTo + 0x36, // push + 0x39, 0x6f, // pushi 6f (111 - x) + 0x3c, // dup (111 - y) + 0x7c, // pushSelf + SIG_END }; const uint16 qfg1vgaPatchMoveToCastleGate[] = { - PATCH_ADDTOOFFSET | +3, - 0x39, 0x72, // pushi 72 (114 - x) + PATCH_ADDTOOFFSET +3, + 0x39, 0x72, // pushi 72 (114 - x) PATCH_END }; @@ -1156,22 +1188,21 @@ const uint16 qfg1vgaPatchMoveToCastleGate[] = { // The code treats both monster types the same. // Responsible method: smallMonster::doVerb // Fixes bug #3604943. -const byte qfg1vgaSignatureCheetaurDescription[] = { - 16, - 0x34, 0xb8, 0x01, // ldi 01b8 - 0x1a, // eq? - 0x31, 0x16, // bnt 16 - 0x38, 0x27, 0x01, // pushi 0127 - 0x39, 0x06, // pushi 06 - 0x39, 0x03, // pushi 03 - 0x78, // push1 - 0x39, 0x12, // pushi 12 -> monster type Saurus Rex - 0 +const uint16 qfg1vgaSignatureCheetaurDescription[] = { + 0x34, SIG_UINT16 + 0xb8, 0x01, // ldi 01b8 + 0x1a, // eq? + 0x31, 0x16, // bnt 16 + 0x38, SIG_UINT16 + 0x27, 0x01, // pushi 0127 + 0x39, 0x06, // pushi 06 + 0x39, 0x03, // pushi 03 + 0x78, // push1 + 0x39, 0x12, // pushi 12 -> monster type Saurus Rex + SIG_END }; const uint16 qfg1vgaPatchCheetaurDescription[] = { - PATCH_ADDTOOFFSET | +14, - 0x39, 0x11, // pushi 11 -> monster type cheetaur + PATCH_ADDTOOFFSET +14, + 0x39, 0x11, // pushi 11 -> monster type cheetaur PATCH_END }; @@ -1187,26 +1218,25 @@ const uint16 qfg1vgaPatchCheetaurDescription[] = { // calling goTo6::init, so the whole issue is stopped from happening. // Responsible method: happyFace::changeState, door11::doit // Fixes bug #3585793 -const byte qfg1vgaSignatureFunnyRoomFix[] = { - 14, - 0x65, 0x14, // aTop 14 (state) - 0x36, // push - 0x3c, // dup - 0x35, 0x00, // ldi 00 - 0x1a, // eq? - 0x30, 0x25, 0x00, // bnt 0025 [-> next state] - 0x35, 0x01, // ldi 01 - 0xa3, 0x4e, // sal 4e - 0 +const uint16 qfg1vgaSignatureFunnyRoomFix[] = { + 0x65, 0x14, // aTop 14 (state) + 0x36, // push + 0x3c, // dup + 0x35, 0x00, // ldi 00 + 0x1a, // eq? + 0x30, SIG_UINT16 + 0x25, 0x00, // bnt 0025 [-> next state] + 0x35, 0x01, // ldi 01 + 0xa3, 0x4e, // sal 4e + SIG_END }; const uint16 qfg1vgaPatchFunnyRoomFix[] = { - PATCH_ADDTOOFFSET | +3, - 0x2e, 0x29, 0x00, // bt 0029 [-> next state] - saves 4 bytes - 0x35, 0x01, // ldi 01 - 0xa3, 0x4e, // sal 4e - 0xa3, 0x05, // sal 05 (sets local 5 to 1) - 0xa3, 0x05, // and again to make absolutely sure (actually to waste 2 bytes) + PATCH_ADDTOOFFSET +3, + 0x2e, PATCH_UINT16 + 0x29, 0x00, // bt 0029 [-> next state] - saves 4 bytes + 0x35, 0x01, // ldi 01 + 0xa3, 0x4e, // sal 4e + 0xa3, 0x05, // sal 05 (sets local 5 to 1) + 0xa3, 0x05, // and again to make absolutely sure (actually to waste 2 bytes) PATCH_END }; @@ -1237,22 +1267,21 @@ const SciScriptSignature qfg1vgaSignatures[] = { // and text entry refreshes whenever a button is pressed, and prevent possible // crashes because of these constant quick object reallocations. Fixes bug // #3037996. -const byte qfg2SignatureImportDialog[] = { - 16, - 0x63, 0x20, // pToa text - 0x30, 0x0b, 0x00, // bnt [next state] - 0x7a, // push2 - 0x39, 0x03, // pushi 03 - 0x36, // push - 0x43, 0x72, 0x04, // callk Memory 4 - 0x35, 0x00, // ldi 00 - 0x65, 0x20, // aTop text - 0 +const uint16 qfg2SignatureImportDialog[] = { + 0x63, 0x20, // pToa text + 0x30, SIG_UINT16 + 0x0b, 0x00, // bnt [next state] + 0x7a, // push2 + 0x39, 0x03, // pushi 03 + 0x36, // push + 0x43, 0x72, 0x04, // callk Memory 4 + 0x35, 0x00, // ldi 00 + 0x65, 0x20, // aTop text + SIG_END }; const uint16 qfg2PatchImportDialog[] = { - PATCH_ADDTOOFFSET | +5, - 0x48, // ret + PATCH_ADDTOOFFSET +5, + 0x48, // ret PATCH_END }; @@ -1264,22 +1293,21 @@ const SciScriptSignature qfg2Signatures[] = { // =========================================================================== // Patch for the import screen in QFG3, same as the one for QFG2 above -const byte qfg3SignatureImportDialog[] = { - 15, - 0x63, 0x2a, // pToa text - 0x31, 0x0b, // bnt [next state] - 0x7a, // push2 - 0x39, 0x03, // pushi 03 - 0x36, // push - 0x43, 0x72, 0x04, // callk Memory 4 - 0x35, 0x00, // ldi 00 - 0x65, 0x2a, // aTop text - 0 +const uint16 qfg3SignatureImportDialog[] = { + 0x63, 0x2a, // pToa text + 0x31, 0x0b, // bnt [next state] + 0x7a, // push2 + 0x39, 0x03, // pushi 03 + 0x36, // push + 0x43, 0x72, 0x04, // callk Memory 4 + 0x35, 0x00, // ldi 00 + 0x65, 0x2a, // aTop text + SIG_END }; const uint16 qfg3PatchImportDialog[] = { - PATCH_ADDTOOFFSET | +4, - 0x48, // ret + PATCH_ADDTOOFFSET +4, + 0x48, // ret PATCH_END }; @@ -1299,30 +1327,29 @@ const uint16 qfg3PatchImportDialog[] = { // Teller::doChild. We jump to this call of hero::solvePuzzle to get that same // behaviour. -const byte qfg3SignatureWooDialog[] = { - 30, - 0x67, 0x12, // pTos 12 (query) - 0x35, 0xb6, // ldi b6 - 0x1a, // eq? - 0x2f, 0x05, // bt 05 - 0x67, 0x12, // pTos 12 (query) - 0x35, 0x9b, // ldi 9b - 0x1a, // eq? - 0x31, 0x0c, // bnt 0c - 0x38, 0x97, 0x02, // pushi 0297 - 0x7a, // push2 - 0x38, 0x0c, 0x01, // pushi 010c - 0x7a, // push2 - 0x81, 0x00, // lag 00 - 0x4a, 0x08, // send 08 - 0x67, 0x12, // pTos 12 (query) - 0x35, 0xb5, // ldi b5 - 0 +const uint16 qfg3SignatureWooDialog[] = { + 0x67, 0x12, // pTos 12 (query) + 0x35, 0xb6, // ldi b6 + 0x1a, // eq? + 0x2f, 0x05, // bt 05 + 0x67, 0x12, // pTos 12 (query) + 0x35, 0x9b, // ldi 9b + 0x1a, // eq? + 0x31, 0x0c, // bnt 0c + 0x38, SIG_UINT16 + 0x97, 0x02, // pushi 0297 + 0x7a, // push2 + 0x38, SIG_UINT16 + 0x0c, 0x01, // pushi 010c + 0x7a, // push2 + 0x81, 0x00, // lag 00 + 0x4a, 0x08, // send 08 + 0x67, 0x12, // pTos 12 (query) + 0x35, 0xb5, // ldi b5 + SIG_END }; const uint16 qfg3PatchWooDialog[] = { - PATCH_ADDTOOFFSET | +0x29, - 0x33, 0x11, // jmp to 0x6a2, the call to hero::solvePuzzle for 0xFFFC + PATCH_ADDTOOFFSET +0x29, + 0x33, 0x11, // jmp to 0x6a2, the call to hero::solvePuzzle for 0xFFFC PATCH_END }; @@ -1340,30 +1367,28 @@ const SciScriptSignature qfg3Signatures[] = { // we never reach that of course, so the pterodactyl-flight will go endlessly // we could either calculate property count differently somehow fixing this // but I think just patching it out is cleaner (bug #3037938) -const byte sq4FloppySignatureEndlessFlight[] = { - 8, - 0x39, 0x04, // pushi 04 (selector x) - 0x78, // push1 - 0x67, 0x08, // pTos 08 (property x) - 0x63, 0x44, // pToa 44 (invalid property) - 0x02, // add - 0 +const uint16 sq4FloppySignatureEndlessFlight[] = { + 0x39, 0x04, // pushi 04 (selector x) + 0x78, // push1 + 0x67, 0x08, // pTos 08 (property x) + 0x63, 0x44, // pToa 44 (invalid property) + 0x02, // add + SIG_END }; // Similar to the above, for the German version (bug #3110215) -const byte sq4FloppySignatureEndlessFlightGerman[] = { - 8, - 0x39, 0x04, // pushi 04 (selector x) - 0x78, // push1 - 0x67, 0x08, // pTos 08 (property x) - 0x63, 0x4c, // pToa 4c (invalid property) - 0x02, // add - 0 +const uint16 sq4FloppySignatureEndlessFlightGerman[] = { + 0x39, 0x04, // pushi 04 (selector x) + 0x78, // push1 + 0x67, 0x08, // pTos 08 (property x) + 0x63, 0x4c, // pToa 4c (invalid property) + 0x02, // add + SIG_END }; const uint16 sq4FloppyPatchEndlessFlight[] = { - PATCH_ADDTOOFFSET | +5, - 0x35, 0x03, // ldi 03 (which would be the content of the property) + PATCH_ADDTOOFFSET +5, + 0x35, 0x03, // ldi 03 (which would be the content of the property) PATCH_END }; @@ -1373,40 +1398,38 @@ const uint16 sq4FloppyPatchEndlessFlight[] = { // Patch 1: iconTextSwitch::show, called when the text options button is shown. // This is patched to add the "Both" text resource (i.e. we end up with // "Speech", "Text" and "Both") -const byte sq4CdSignatureTextOptionsButton[] = { - 11, - 0x35, 0x01, // ldi 0x01 - 0xa1, 0x53, // sag 0x53 - 0x39, 0x03, // pushi 0x03 - 0x78, // push1 - 0x39, 0x09, // pushi 0x09 - 0x54, 0x06, // self 0x06 - 0 +const uint16 sq4CdSignatureTextOptionsButton[] = { + 0x35, 0x01, // ldi 0x01 + 0xa1, 0x53, // sag 0x53 + 0x39, 0x03, // pushi 0x03 + 0x78, // push1 + 0x39, 0x09, // pushi 0x09 + 0x54, 0x06, // self 0x06 + SIG_END }; const uint16 sq4CdPatchTextOptionsButton[] = { - PATCH_ADDTOOFFSET | +7, - 0x39, 0x0b, // pushi 0x0b + PATCH_ADDTOOFFSET +7, + 0x39, 0x0b, // pushi 0x0b PATCH_END }; // Patch 2: Adjust a check in babbleIcon::init, which handles the babble icon // (e.g. the two guys from Andromeda) shown when dying/quitting. // Fixes bug #3538418. -const byte sq4CdSignatureBabbleIcon[] = { - 7, - 0x89, 0x5a, // lsg 5a - 0x35, 0x02, // ldi 02 - 0x1a, // eq? - 0x31, 0x26, // bnt 26 [02a7] - 0 +const uint16 sq4CdSignatureBabbleIcon[] = { + 0x89, 0x5a, // lsg 5a + 0x35, 0x02, // ldi 02 + 0x1a, // eq? + 0x31, 0x26, // bnt 26 [02a7] + SIG_END }; const uint16 sq4CdPatchBabbleIcon[] = { - 0x89, 0x5a, // lsg 5a - 0x35, 0x01, // ldi 01 - 0x1a, // eq? - 0x2f, 0x26, // bt 26 [02a7] + 0x89, 0x5a, // lsg 5a + 0x35, 0x01, // ldi 01 + 0x1a, // eq? + 0x2f, 0x26, // bt 26 [02a7] PATCH_END }; @@ -1414,45 +1437,44 @@ const uint16 sq4CdPatchBabbleIcon[] = { // when the text options button is clicked: "Speech", "Text" and "Both". // Refer to the patch above for additional details. // iconTextSwitch::doit (called when the text options button is clicked) -const byte sq4CdSignatureTextOptions[] = { - 32, - 0x89, 0x5a, // lsg 0x5a (load global 90 to stack) - 0x3c, // dup - 0x35, 0x01, // ldi 0x01 - 0x1a, // eq? (global 90 == 1) - 0x31, 0x06, // bnt 0x06 (0x0691) - 0x35, 0x02, // ldi 0x02 - 0xa1, 0x5a, // sag 0x5a (save acc to global 90) - 0x33, 0x0a, // jmp 0x0a (0x69b) - 0x3c, // dup - 0x35, 0x02, // ldi 0x02 - 0x1a, // eq? (global 90 == 2) - 0x31, 0x04, // bnt 0x04 (0x069b) - 0x35, 0x01, // ldi 0x01 - 0xa1, 0x5a, // sag 0x5a (save acc to global 90) - 0x3a, // toss - 0x38, 0xd9, 0x00, // pushi 0x00d9 - 0x76, // push0 - 0x54, 0x04, // self 0x04 - 0x48, // ret - 0 +const uint16 sq4CdSignatureTextOptions[] = { + 0x89, 0x5a, // lsg 0x5a (load global 90 to stack) + 0x3c, // dup + 0x35, 0x01, // ldi 0x01 + 0x1a, // eq? (global 90 == 1) + 0x31, 0x06, // bnt 0x06 (0x0691) + 0x35, 0x02, // ldi 0x02 + 0xa1, 0x5a, // sag 0x5a (save acc to global 90) + 0x33, 0x0a, // jmp 0x0a (0x69b) + 0x3c, // dup + 0x35, 0x02, // ldi 0x02 + 0x1a, // eq? (global 90 == 2) + 0x31, 0x04, // bnt 0x04 (0x069b) + 0x35, 0x01, // ldi 0x01 + 0xa1, 0x5a, // sag 0x5a (save acc to global 90) + 0x3a, // toss + 0x38, SIG_UINT16 + 0xd9, 0x00, // pushi 0x00d9 + 0x76, // push0 + 0x54, 0x04, // self 0x04 + 0x48, // ret + SIG_END }; const uint16 sq4CdPatchTextOptions[] = { - 0x89, 0x5a, // lsg 0x5a (load global 90 to stack) - 0x3c, // dup - 0x35, 0x03, // ldi 0x03 (acc = 3) - 0x1a, // eq? (global 90 == 3) - 0x2f, 0x07, // bt 0x07 - 0x89, 0x5a, // lsg 0x5a (load global 90 to stack again) - 0x35, 0x01, // ldi 0x01 (acc = 1) - 0x02, // add: acc = global 90 (on stack) + 1 (previous acc value) - 0x33, 0x02, // jmp 0x02 - 0x35, 0x01, // ldi 0x01 (reset acc to 1) - 0xa1, 0x5a, // sag 0x5a (save acc to global 90) - 0x33, 0x03, // jmp 0x03 (jump over the wasted bytes below) - 0x34, 0x00, 0x00, // ldi 0x0000 (waste 3 bytes) - 0x3a, // toss + 0x89, 0x5a, // lsg 0x5a (load global 90 to stack) + 0x3c, // dup + 0x35, 0x03, // ldi 0x03 (acc = 3) + 0x1a, // eq? (global 90 == 3) + 0x2f, 0x07, // bt 0x07 + 0x89, 0x5a, // lsg 0x5a (load global 90 to stack again) + 0x35, 0x01, // ldi 0x01 (acc = 1) + 0x02, // add: acc = global 90 (on stack) + 1 (previous acc value) + 0x33, 0x02, // jmp 0x02 + 0x35, 0x01, // ldi 0x01 (reset acc to 1) + 0xa1, 0x5a, // sag 0x5a (save acc to global 90) + 0x33, 0x03, // jmp 0x03 (jump over the wasted bytes below) + 0x34, PATCH_UINT16 + 0x00, 0x00, // ldi 0x0000 (waste 3 bytes) + 0x3a, // toss // (the rest of the code is the same) PATCH_END }; @@ -1478,59 +1500,57 @@ const SciScriptSignature sq4Signatures[] = { // The same issue happens in Sierra SCI. // We simply set the correct starting cel number to fix the bug. // Responsible method: robotIntoShip::changeState(9) -const byte sq1vgaSignatureUlenceFlatsTimepodGfxGlitch[] = { - 8, - 0x39, 0x07, // pushi 07 (ship::cel) - 0x78, // push1 - 0x39, 0x0a, // pushi 0x0a (set ship::cel to 10) - 0x38, 0xa0, 0x00, // pushi 0x00a0 (ship::setLoop) - 0 +const uint16 sq1vgaSignatureUlenceFlatsTimepodGfxGlitch[] = { + 0x39, 0x07, // pushi 07 (ship::cel) + 0x78, // push1 + 0x39, 0x0a, // pushi 0x0a (set ship::cel to 10) + 0x38, SIG_UINT16 + 0xa0, 0x00, // pushi 0x00a0 (ship::setLoop) + SIG_END }; const uint16 sq1vgaPatchUlenceFlatsTimepodGfxGlitch[] = { - PATCH_ADDTOOFFSET | +3, - 0x39, 0x09, // pushi 0x09 (set ship::cel to 9) + PATCH_ADDTOOFFSET +3, + 0x39, 0x09, // pushi 0x09 (set ship::cel to 9) PATCH_END }; -const byte sq1vgaSignatureEgoShowsCard[] = { - 25, - 0x38, 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID) - 0x78, // push1 - 0x38, 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID) - 0x76, // push0 - 0x51, 0x7c, // class DeltaurRegion - 0x4a, 0x04, // send 0x04 (get timesShownID) - 0x36, // push - 0x35, 0x01, // ldi 1 - 0x02, // add - 0x36, // push - 0x51, 0x7c, // class DeltaurRegion - 0x4a, 0x06, // send 0x06 (set timesShownID) - 0x36, // push (wrong, acc clobbered by class, above) - 0x35, 0x03, // ldi 0x03 - 0x22, // lt? - 0 +const uint16 sq1vgaSignatureEgoShowsCard[] = { + 0x38, SIG_UINT16 + 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID) + 0x78, // push1 + 0x38, SIG_UINT16 + 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID) + 0x76, // push0 + 0x51, 0x7c, // class DeltaurRegion + 0x4a, 0x04, // send 0x04 (get timesShownID) + 0x36, // push + 0x35, 0x01, // ldi 1 + 0x02, // add + 0x36, // push + 0x51, 0x7c, // class DeltaurRegion + 0x4a, 0x06, // send 0x06 (set timesShownID) + 0x36, // push (wrong, acc clobbered by class, above) + 0x35, 0x03, // ldi 0x03 + 0x22, // lt? + SIG_END }; // Note that this script patch is merely a reordering of the // instructions in the original script. const uint16 sq1vgaPatchEgoShowsCard[] = { - 0x38, 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID) - 0x76, // push0 - 0x51, 0x7c, // class DeltaurRegion - 0x4a, 0x04, // send 0x04 (get timesShownID) - 0x36, // push - 0x35, 0x01, // ldi 1 - 0x02, // add - 0x36, // push (this push corresponds to the wrong one above) - 0x38, 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID) - 0x78, // push1 - 0x36, // push - 0x51, 0x7c, // class DeltaurRegion - 0x4a, 0x06, // send 0x06 (set timesShownID) - 0x35, 0x03, // ldi 0x03 - 0x22, // lt? + 0x38, PATCH_UINT16 + 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID) + 0x76, // push0 + 0x51, 0x7c, // class DeltaurRegion + 0x4a, 0x04, // send 0x04 (get timesShownID) + 0x36, // push + 0x35, 0x01, // ldi 1 + 0x02, // add + 0x36, // push (this push corresponds to the wrong one above) + 0x38, PATCH_UINT16 + 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID) + 0x78, // push1 + 0x36, // push + 0x51, 0x7c, // class DeltaurRegion + 0x4a, 0x06, // send 0x06 (set timesShownID) + 0x35, 0x03, // ldi 0x03 + 0x22, // lt? PATCH_END }; @@ -1543,7 +1563,7 @@ const SciScriptSignature sq1vgaSignatures[] = { SCI_SIGNATUREENTRY_TERMINATOR}; // will actually patch previously found signature area -void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { +void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset, const bool isMacSci11) { byte orgData[PATCH_VALUELIMIT]; int32 offset = signatureOffset; uint16 patchWord = *patch; @@ -1557,17 +1577,30 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri while (patchWord != PATCH_END) { uint16 patchValue = patchWord & PATCH_VALUEMASK; switch (patchWord & PATCH_COMMANDMASK) { - case PATCH_ADDTOOFFSET: + case PATCH_ADDTOOFFSET: { // add value to offset - offset += patchValue & ~PATCH_ADDTOOFFSET; + offset += patchValue; break; - case PATCH_GETORIGINALBYTE: + } + case PATCH_GETORIGINALBYTE: { // get original byte from script if (patchValue >= orgDataSize) error("patching: can not get requested original byte from script"); scriptData[offset] = orgData[patchValue]; offset++; break; + } + case PATCH_GETORIGINALBYTEADJUST: { + // get original byte from script and adjust it + if (patchValue >= orgDataSize) + error("patching: can not get requested original byte from script"); + byte orgByte = orgData[patchValue]; + int16 adjustValue; + patch++; adjustValue = (int16)(*patch); + scriptData[offset] = orgByte + adjustValue; + offset++; + break; + } case PATCH_ADJUSTWORD: { // Adjust word right before current position byte *adjustPtr = &scriptData[offset - 2]; @@ -1584,8 +1617,26 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri WRITE_LE_UINT16(adjustPtr, adjustWord); break; } + case PATCH_UINT16: { + byte byte1 = patchValue & PATCH_BYTEMASK; + byte byte2; + patch++; patchWord = *patch; + if (patchWord & PATCH_COMMANDMASK) { + error("Patch inconsistent"); + } + byte2 = patchWord & PATCH_BYTEMASK; + if (!isMacSci11) { + scriptData[offset++] = byte1; + scriptData[offset++] = byte2; + } else { + // SCI1.1+ on macintosh had uint16s in script in BE-order + scriptData[offset++] = byte2; + scriptData[offset++] = byte1; + } + break; + } default: - scriptData[offset] = patchValue & 0xFF; + scriptData[offset] = patchValue & PATCH_BYTEMASK; offset++; } patch++; @@ -1594,7 +1645,7 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri } // will return -1 if no match was found, otherwise an offset to the start of the signature match -int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) { +int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize, const bool isMacSci11) { if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay return -1; @@ -1607,22 +1658,59 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr // magic DWORD found, check if actual signature matches uint32 offset = DWordOffset + signature->magicOffset; uint32 byteOffset = offset; - const byte *signatureData = signature->data; - byte matchAdjust = 1; - while (matchAdjust) { - byte matchBytesCount = *signatureData++; - if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds? + const uint16 *signatureData = signature->data; + + uint16 sigWord = *signatureData; + while (sigWord != SIG_END) { + uint16 sigValue = sigWord & PATCH_VALUEMASK; + switch (sigWord & SIG_COMMANDMASK) { + case SIG_ADDTOOFFSET: { + // add value to offset + byteOffset += sigValue; break; - if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch? + } + case PATCH_UINT16: { + if ((byteOffset + 1) < scriptSize) { + byte byte1 = sigValue & SIG_BYTEMASK; + byte byte2; + signatureData++; sigWord = *signatureData; + if (sigWord & SIG_COMMANDMASK) { + error("Patch inconsistent"); + } + byte2 = sigWord & SIG_BYTEMASK; + if (!isMacSci11) { + if ((scriptData[byteOffset] != byte1) || (scriptData[byteOffset + 1] != byte2)) + sigWord = SIG_MISMATCH; + } else { + // SCI1.1+ on macintosh had uint16s in script in BE-order + if ((scriptData[byteOffset] != byte2) || (scriptData[byteOffset + 1] != byte1)) + sigWord = SIG_MISMATCH; + } + byteOffset += 2; + } else { + sigWord = SIG_MISMATCH; + } + break; + } + default: + if (byteOffset < scriptSize) { + if (scriptData[byteOffset] != sigWord) + sigWord = SIG_MISMATCH; + } else { + // out of bounds + sigWord = SIG_MISMATCH; + } + byteOffset++; + } + + if (sigWord == SIG_MISMATCH) break; - // those bytes matched, adjust offsets accordingly - signatureData += matchBytesCount; - byteOffset += matchBytesCount; - // get offset... - matchAdjust = *signatureData++; - byteOffset += matchAdjust; + + signatureData++; + sigWord = *signatureData; } - if (!matchAdjust) // all matches worked? + + if (sigWord == SIG_END) // signature fully matched? return offset; } DWordOffset++; @@ -1700,16 +1788,18 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin } if (signatureTable) { + bool isMacSci11 = (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1); + while (signatureTable->data) { if (scriptNr == signatureTable->scriptNr) { int32 foundOffset = 0; int16 applyCount = signatureTable->applyCount; do { - foundOffset = findSignature(signatureTable, scriptData, scriptSize); + foundOffset = findSignature(signatureTable, scriptData, scriptSize, isMacSci11); if (foundOffset != -1) { // found, so apply the patch - debugC(kDebugLevelScripts, "matched and patched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); - applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); + debugC(kDebugLevelScriptPatcher, "matched and patched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); + applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset, isMacSci11); } applyCount--; } while ((foundOffset != -1) && (applyCount)); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 97e33f256b..a059bee74e 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -262,8 +262,14 @@ const char *SegManager::getObjectName(reg_t pos) { const char *name = 0; if (nameReg.getSegment()) name = derefString(nameReg); - if (!name) - return "<invalid name>"; + if (!name) { + // Crazy Nick Laura Bow is missing some object names needed for the static + // selector vocabulary + if (g_sci->getGameId() == GID_CNICK_LAURABOW && pos == make_reg(1, 0x2267)) + return "Character"; + else + return "<invalid name>"; + } return name; } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ef8f165084..d7c2fdc0eb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -200,11 +200,18 @@ static void write_var(EngineState *s, int type, int index, reg_t value) { s->variables[type][index] = value; - // If the game is trying to change its speech/subtitle settings, apply the ScummVM audio - // options first, if they haven't been applied yet - if (type == VAR_GLOBAL && index == 90 && !g_sci->getEngineState()->_syncedAudioOptions) { - g_sci->syncIngameAudioOptions(); - g_sci->getEngineState()->_syncedAudioOptions = true; + if (type == VAR_GLOBAL && index == 90) { + // The game is trying to change its speech/subtitle settings + if (!g_sci->getEngineState()->_syncedAudioOptions || s->variables[VAR_GLOBAL][4] == TRUE_REG) { + // ScummVM audio options haven't been applied yet, so apply them. + // We also force the ScummVM audio options when loading a game from + // the launcher. + g_sci->syncIngameAudioOptions(); + g_sci->getEngineState()->_syncedAudioOptions = true; + } else { + // Update ScummVM's audio options + g_sci->updateScummVMAudioOptions(); + } } } } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 154ac8f8b4..14fbee8e93 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -55,6 +55,12 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CASTLEBRAIN, 280, 280, 0, "programmer", "dispatchEvent", -1, 0, { WORKAROUND_FAKE, 0xf } }, // pressing 'q' on the computer screen in the robot room, and closing the help dialog that pops up (bug #3039656). Moves the cursor to the view with the ID returned (in this case, the robot hand) { GID_CNICK_KQ, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // checkers/backgammon, like in hoyle 3 - temps 504 and 505 - bug #3606025 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering the control menu, like in hoyle 3 + { GID_CNICK_KQ, 300, 303, 0, "theDoubleCube", "<noname520>", -1, 5, { WORKAROUND_FAKE, 0 } }, // while playing backgammon with doubling enabled - bug #3615121 (same as the theDoubleCube::make workaround for Hoyle 3) + { GID_CNICK_KQ, 300, 303, 0, "theDoubleCube", "<noname519>", -1, 9, { WORKAROUND_FAKE, 0 } }, // when accepting a double, while playing backgammon with doubling enabled (same as the theDoubleCube::accept workaround for Hoyle 3) + { GID_CNICK_LAURABOW, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // Yatch, like in hoyle 3 - temps 504 and 505 - bug #3615119 + { GID_CNICK_LAURABOW, -1, 700, 0, NULL, "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu - bug #3615118 (same as the gcWindow workaround for Hoyle 3) + { GID_CNICK_LAURABOW,100, 100, 0, NULL, "<noname144>", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3615129 (same as the dominoHand2 workaround for Hoyle 3) + { GID_CNICK_LAURABOW,100, 110, 0, NULL, "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when changing the "Dominoes per hand" setting - bug #3615130 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos @@ -73,6 +79,9 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something - temps 504 and 505 { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu { GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3036918 + { GID_HOYLE3, 100, 110, 0, "OKButton", "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when changing the "Dominoes per hand" setting - bug #3615130 + { GID_HOYLE3, 300, 303, 0, "theDoubleCube", "make", -1, 5, { WORKAROUND_FAKE, 0 } }, // while playing backgammon with doubling enabled + { GID_HOYLE3, 300, 303, 0, "theDoubleCube", "accept", -1, 9, { WORKAROUND_FAKE, 0 } }, // when accepting a double, while playing backgammon with doubling enabled { GID_HOYLE4, -1, 0, 0, NULL, "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when selecting "Control" from the menu (temp vars 0-3) - bug #3039294 { GID_HOYLE4, 910, 18, 0, NULL, "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // during tutorial - bug #3042756 { GID_HOYLE4, 910, 910, 0, NULL, "setup", -1, 3, { WORKAROUND_FAKE, 0 } }, // when selecting "Tutorial" from the main menu - bug #3039294 @@ -212,6 +221,7 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = { { GID_FANMADE, -1, 994, 1, "Game", "save", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest) { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest) { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back) + { GID_FANMADE, -1, 994, 0, "Black", "save", 0xa, 0, { WORKAROUND_IGNORE, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Black Cauldron Remake) { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them) { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest) { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest) @@ -364,6 +374,13 @@ const SciWorkaroundEntry kNewWindow_workarounds[] = { }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kReadNumber_workarounds[] = { + { GID_CNICK_LAURABOW,100, 101, 0, "dominoes.opt", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When dominoes.opt is present, the game scripts call kReadNumber with an extra integer parameter - bug #3615120 + { GID_HOYLE3, 100, 101, 0, "dominoes.opt", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When dominoes.opt is present, the game scripts call kReadNumber with an extra integer parameter - bug #3615120 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { { GID_QFG4, 100, 100, 0, "doMovie", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #3034506 SCI_WORKAROUNDENTRY_TERMINATOR diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 59054ae552..d5e91b70ec 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -88,6 +88,7 @@ extern const SciWorkaroundEntry kIsObject_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; extern const SciWorkaroundEntry kMoveCursor_workarounds[]; extern const SciWorkaroundEntry kNewWindow_workarounds[]; +extern const SciWorkaroundEntry kReadNumber_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetCursor_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index c1aadc3622..e24a5f1429 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -112,6 +112,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam DebugMan.addDebugChannel(kDebugLevelDclInflate, "DCL", "DCL inflate debugging"); DebugMan.addDebugChannel(kDebugLevelVM, "VM", "VM debugging"); DebugMan.addDebugChannel(kDebugLevelScripts, "Scripts", "Notifies when scripts are unloaded"); + DebugMan.addDebugChannel(kDebugLevelScriptPatcher, "ScriptPatcher", "Notifies when scripts are patched"); DebugMan.addDebugChannel(kDebugLevelGC, "GC", "Garbage Collector debugging"); DebugMan.addDebugChannel(kDebugLevelResMan, "ResMan", "Resource manager debugging"); DebugMan.addDebugChannel(kDebugLevelOnStartup, "OnStartup", "Enter debugger at start of game"); @@ -882,7 +883,7 @@ void SciEngine::syncSoundSettings() { } void SciEngine::syncIngameAudioOptions() { - // Now, sync the in-game speech/subtitles settings for SCI1.1 CD games + // Sync the in-game speech/subtitles settings for SCI1.1 CD games if (isCD() && getSciVersion() == SCI_VERSION_1_1) { bool subtitlesOn = ConfMan.getBool("subtitles"); bool speechOn = !ConfMan.getBool("speech_mute"); @@ -910,6 +911,26 @@ void SciEngine::syncIngameAudioOptions() { } } +void SciEngine::updateScummVMAudioOptions() { + // Update ScummVM's speech/subtitles settings for SCI1.1 CD games, + // depending on the in-game settings + if (isCD() && getSciVersion() == SCI_VERSION_1_1) { + if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 1)) { + // subtitles + ConfMan.setBool("subtitles", true); + ConfMan.setBool("speech_mute", true); + } else if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 2)) { + // speech + ConfMan.setBool("subtitles", false); + ConfMan.setBool("speech_mute", false); + } else if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 3)) { + // speech + subtitles + ConfMan.setBool("subtitles", true); + ConfMan.setBool("speech_mute", false); + } + } +} + void SciEngine::loadMacExecutable() { if (getPlatform() != Common::kPlatformMacintosh || getSciVersion() < SCI_VERSION_1_EARLY || getSciVersion() > SCI_VERSION_1_1) return; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 0a75e115fd..a487336f54 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -82,28 +82,29 @@ class GfxFrameout; // our engine debug levels enum kDebugLevels { - kDebugLevelError = 1 << 0, - kDebugLevelNodes = 1 << 1, - kDebugLevelGraphics = 1 << 2, - kDebugLevelStrings = 1 << 3, - kDebugLevelMemory = 1 << 4, - kDebugLevelFuncCheck = 1 << 5, - kDebugLevelBresen = 1 << 6, - kDebugLevelSound = 1 << 7, - kDebugLevelBaseSetter = 1 << 8, - kDebugLevelParser = 1 << 9, - kDebugLevelSaid = 1 << 10, - kDebugLevelFile = 1 << 11, - kDebugLevelTime = 1 << 12, - kDebugLevelRoom = 1 << 13, - kDebugLevelAvoidPath = 1 << 14, - kDebugLevelDclInflate = 1 << 15, - kDebugLevelVM = 1 << 16, - kDebugLevelScripts = 1 << 17, - kDebugLevelGC = 1 << 18, - kDebugLevelResMan = 1 << 19, - kDebugLevelOnStartup = 1 << 20, - kDebugLevelDebugMode = 1 << 21 + kDebugLevelError = 1 << 0, + kDebugLevelNodes = 1 << 1, + kDebugLevelGraphics = 1 << 2, + kDebugLevelStrings = 1 << 3, + kDebugLevelMemory = 1 << 4, + kDebugLevelFuncCheck = 1 << 5, + kDebugLevelBresen = 1 << 6, + kDebugLevelSound = 1 << 7, + kDebugLevelBaseSetter = 1 << 8, + kDebugLevelParser = 1 << 9, + kDebugLevelSaid = 1 << 10, + kDebugLevelFile = 1 << 11, + kDebugLevelTime = 1 << 12, + kDebugLevelRoom = 1 << 13, + kDebugLevelAvoidPath = 1 << 14, + kDebugLevelDclInflate = 1 << 15, + kDebugLevelVM = 1 << 16, + kDebugLevelScripts = 1 << 17, + kDebugLevelGC = 1 << 18, + kDebugLevelResMan = 1 << 19, + kDebugLevelOnStartup = 1 << 20, + kDebugLevelDebugMode = 1 << 21, + kDebugLevelScriptPatcher = 1 << 22 }; enum SciGameId { @@ -251,6 +252,7 @@ public: * - King's Quest 6 CD */ void syncIngameAudioOptions(); + void updateScummVMAudioOptions(); const SciGameId &getGameId() const { return _gameId; } const char *getGameIdStr() const; diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk index a377ad3dc4..d43db1e5f1 100644 --- a/engines/scumm/module.mk +++ b/engines/scumm/module.mk @@ -35,23 +35,23 @@ MODULE_OBJS := \ midiparser_ro.o \ object.o \ palette.o \ - player_ad.o \ - player_apple2.o \ - player_mac.o \ - player_mod.o \ - player_nes.o \ - player_pce.o \ - player_sid.o \ - player_towns.o \ - player_v1.o \ - player_v2.o \ - player_v2a.o \ - player_v2base.o \ - player_v2cms.o \ - player_v3a.o \ - player_v3m.o \ - player_v4a.o \ - player_v5m.o \ + players/player_ad.o \ + players/player_apple2.o \ + players/player_mac.o \ + players/player_mod.o \ + players/player_nes.o \ + players/player_pce.o \ + players/player_sid.o \ + players/player_towns.o \ + players/player_v1.o \ + players/player_v2.o \ + players/player_v2a.o \ + players/player_v2base.o \ + players/player_v2cms.o \ + players/player_v3a.o \ + players/player_v3m.o \ + players/player_v4a.o \ + players/player_v5m.o \ resource_v2.o \ resource_v3.o \ resource_v4.o \ diff --git a/engines/scumm/player_ad.cpp b/engines/scumm/players/player_ad.cpp index ed368afbf6..20630e1cb9 100644 --- a/engines/scumm/player_ad.cpp +++ b/engines/scumm/players/player_ad.cpp @@ -20,7 +20,7 @@ * */ -#include "scumm/player_ad.h" +#include "scumm/players/player_ad.h" #include "scumm/imuse/imuse.h" #include "scumm/scumm.h" #include "scumm/resource.h" diff --git a/engines/scumm/player_ad.h b/engines/scumm/players/player_ad.h index da6c7177ef..fbb65fbe24 100644 --- a/engines/scumm/player_ad.h +++ b/engines/scumm/players/player_ad.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_AD_H -#define SCUMM_PLAYER_AD_H +#ifndef SCUMM_PLAYERS_PLAYER_AD_H +#define SCUMM_PLAYERS_PLAYER_AD_H #include "scumm/music.h" diff --git a/engines/scumm/player_apple2.cpp b/engines/scumm/players/player_apple2.cpp index 58e4f78a94..87b8100f22 100644 --- a/engines/scumm/player_apple2.cpp +++ b/engines/scumm/players/player_apple2.cpp @@ -21,7 +21,7 @@ */ #include "engines/engine.h" -#include "scumm/player_apple2.h" +#include "scumm/players/player_apple2.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_apple2.h b/engines/scumm/players/player_apple2.h index e1ec9d8946..9930a4f95d 100644 --- a/engines/scumm/player_apple2.h +++ b/engines/scumm/players/player_apple2.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_APPLEII_H -#define SCUMM_PLAYER_APPLEII_H +#ifndef SCUMM_PLAYERS_PLAYER_APPLEII_H +#define SCUMM_PLAYERS_PLAYER_APPLEII_H #include "common/mutex.h" #include "common/scummsys.h" diff --git a/engines/scumm/player_mac.cpp b/engines/scumm/players/player_mac.cpp index a60736df5e..281eec5336 100644 --- a/engines/scumm/player_mac.cpp +++ b/engines/scumm/players/player_mac.cpp @@ -24,7 +24,7 @@ #include "common/translation.h" #include "engines/engine.h" #include "gui/message.h" -#include "scumm/player_mac.h" +#include "scumm/players/player_mac.h" #include "scumm/resource.h" #include "scumm/scumm.h" #include "scumm/imuse/imuse.h" diff --git a/engines/scumm/player_mac.h b/engines/scumm/players/player_mac.h index 09307b4e57..7f9f42c34e 100644 --- a/engines/scumm/player_mac.h +++ b/engines/scumm/players/player_mac.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_MAC_H -#define SCUMM_PLAYER_MAC_H +#ifndef SCUMM_PLAYERS_PLAYER_MAC_H +#define SCUMM_PLAYERS_PLAYER_MAC_H #include "common/scummsys.h" #include "common/util.h" diff --git a/engines/scumm/player_mod.cpp b/engines/scumm/players/player_mod.cpp index 6411f0a17a..abaa8c1fc5 100644 --- a/engines/scumm/player_mod.cpp +++ b/engines/scumm/players/player_mod.cpp @@ -21,7 +21,7 @@ */ -#include "scumm/player_mod.h" +#include "scumm/players/player_mod.h" #include "audio/mixer.h" #include "audio/rate.h" #include "audio/decoders/raw.h" diff --git a/engines/scumm/player_mod.h b/engines/scumm/players/player_mod.h index 619d83541d..d4a5b16fca 100644 --- a/engines/scumm/player_mod.h +++ b/engines/scumm/players/player_mod.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_MOD_H -#define SCUMM_PLAYER_MOD_H +#ifndef SCUMM_PLAYERS_PLAYER_MOD_H +#define SCUMM_PLAYERS_PLAYER_MOD_H #include "scumm/scumm.h" #include "audio/audiostream.h" diff --git a/engines/scumm/player_nes.cpp b/engines/scumm/players/player_nes.cpp index a6ffc9ed86..f55f1f9edd 100644 --- a/engines/scumm/player_nes.cpp +++ b/engines/scumm/players/player_nes.cpp @@ -23,7 +23,7 @@ #ifndef DISABLE_NES_APU #include "engines/engine.h" -#include "scumm/player_nes.h" +#include "scumm/players/player_nes.h" #include "scumm/scumm.h" #include "audio/mixer.h" diff --git a/engines/scumm/player_nes.h b/engines/scumm/players/player_nes.h index be1617e0f6..f0b3e79aad 100644 --- a/engines/scumm/player_nes.h +++ b/engines/scumm/players/player_nes.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_NES_H -#define SCUMM_PLAYER_NES_H +#ifndef SCUMM_PLAYERS_PLAYER_NES_H +#define SCUMM_PLAYERS_PLAYER_NES_H #include "common/scummsys.h" #include "scumm/music.h" diff --git a/engines/scumm/player_pce.cpp b/engines/scumm/players/player_pce.cpp index 8d886ee008..6d6e2fcde5 100644 --- a/engines/scumm/player_pce.cpp +++ b/engines/scumm/players/player_pce.cpp @@ -29,7 +29,7 @@ */ #include <math.h> -#include "player_pce.h" +#include "scumm/players/player_pce.h" #include "common/endian.h" // PCE sound engine is only used by Loom, which requires 16bit color support diff --git a/engines/scumm/player_pce.h b/engines/scumm/players/player_pce.h index 427fb1ace6..ca2eddf58c 100644 --- a/engines/scumm/player_pce.h +++ b/engines/scumm/players/player_pce.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_PCE_H -#define SCUMM_PLAYER_PCE_H +#ifndef SCUMM_PLAYERS_PLAYER_PCE_H +#define SCUMM_PLAYERS_PLAYER_PCE_H #include "common/scummsys.h" #include "common/mutex.h" diff --git a/engines/scumm/player_sid.cpp b/engines/scumm/players/player_sid.cpp index 7a609364e5..1b97ad16d4 100644 --- a/engines/scumm/player_sid.cpp +++ b/engines/scumm/players/player_sid.cpp @@ -23,7 +23,7 @@ #ifndef DISABLE_SID #include "engines/engine.h" -#include "scumm/player_sid.h" +#include "scumm/players/player_sid.h" #include "scumm/scumm.h" #include "audio/mixer.h" diff --git a/engines/scumm/player_sid.h b/engines/scumm/players/player_sid.h index 12e3573575..a48ec793cd 100644 --- a/engines/scumm/player_sid.h +++ b/engines/scumm/players/player_sid.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_SID_H -#define SCUMM_PLAYER_SID_H +#ifndef SCUMM_PLAYERS_PLAYER_SID_H +#define SCUMM_PLAYERS_PLAYER_SID_H #include "common/mutex.h" #include "common/scummsys.h" diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/players/player_towns.cpp index 33e3e40e39..acbdbc7fb6 100644 --- a/engines/scumm/player_towns.cpp +++ b/engines/scumm/players/player_towns.cpp @@ -22,7 +22,7 @@ #include "scumm/sound.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" namespace Scumm { diff --git a/engines/scumm/player_towns.h b/engines/scumm/players/player_towns.h index 5c76d7c6c7..2369b7da5f 100644 --- a/engines/scumm/player_towns.h +++ b/engines/scumm/players/player_towns.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_TOWNS_H -#define SCUMM_PLAYER_TOWNS_H +#ifndef SCUMM_PLAYERS_PLAYER_TOWNS_H +#define SCUMM_PLAYERS_PLAYER_TOWNS_H #include "scumm/scumm.h" #include "scumm/imuse/imuse.h" diff --git a/engines/scumm/player_v1.cpp b/engines/scumm/players/player_v1.cpp index 8e784e9866..0fa1ee9361 100644 --- a/engines/scumm/player_v1.cpp +++ b/engines/scumm/players/player_v1.cpp @@ -22,7 +22,7 @@ #include "engines/engine.h" -#include "scumm/player_v1.h" +#include "scumm/players/player_v1.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v1.h b/engines/scumm/players/player_v1.h index 9e6063adc9..ccd24c39df 100644 --- a/engines/scumm/player_v1.h +++ b/engines/scumm/players/player_v1.h @@ -20,10 +20,10 @@ * */ -#ifndef SCUMM_PLAYER_V1_H -#define SCUMM_PLAYER_V1_H +#ifndef SCUMM_PLAYERS_PLAYER_V1_H +#define SCUMM_PLAYERS_PLAYER_V1_H -#include "scumm/player_v2.h" +#include "scumm/players/player_v2.h" namespace Scumm { diff --git a/engines/scumm/player_v2.cpp b/engines/scumm/players/player_v2.cpp index 6910f5e0db..2429af2d8c 100644 --- a/engines/scumm/player_v2.cpp +++ b/engines/scumm/players/player_v2.cpp @@ -20,7 +20,7 @@ * */ -#include "scumm/player_v2.h" +#include "scumm/players/player_v2.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v2.h b/engines/scumm/players/player_v2.h index d932585b8e..33878ff08b 100644 --- a/engines/scumm/player_v2.h +++ b/engines/scumm/players/player_v2.h @@ -20,10 +20,10 @@ * */ -#ifndef SCUMM_PLAYER_V2_H -#define SCUMM_PLAYER_V2_H +#ifndef SCUMM_PLAYERS_PLAYER_V2_H +#define SCUMM_PLAYERS_PLAYER_V2_H -#include "scumm/player_v2base.h" +#include "scumm/players/player_v2base.h" namespace Scumm { diff --git a/engines/scumm/player_v2a.cpp b/engines/scumm/players/player_v2a.cpp index 07fc77b301..aeccb8b7cb 100644 --- a/engines/scumm/player_v2a.cpp +++ b/engines/scumm/players/player_v2a.cpp @@ -21,7 +21,7 @@ */ #include "engines/engine.h" -#include "scumm/player_v2a.h" +#include "scumm/players/player_v2a.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v2a.h b/engines/scumm/players/player_v2a.h index fe20b43846..12193635f2 100644 --- a/engines/scumm/player_v2a.h +++ b/engines/scumm/players/player_v2a.h @@ -20,12 +20,12 @@ * */ -#ifndef SCUMM_PLAYER_V2A_H -#define SCUMM_PLAYER_V2A_H +#ifndef SCUMM_PLAYERS_PLAYER_V2A_H +#define SCUMM_PLAYERS_PLAYER_V2A_H #include "common/scummsys.h" #include "scumm/music.h" -#include "scumm/player_mod.h" +#include "scumm/players/player_mod.h" class Mixer; diff --git a/engines/scumm/player_v2base.cpp b/engines/scumm/players/player_v2base.cpp index 0d3ad4b1b3..75f1518989 100644 --- a/engines/scumm/player_v2base.cpp +++ b/engines/scumm/players/player_v2base.cpp @@ -20,7 +20,7 @@ * */ -#include "scumm/player_v2base.h" +#include "scumm/players/player_v2base.h" #include "scumm/scumm.h" #define FREQ_HZ 236 // Don't change! diff --git a/engines/scumm/player_v2base.h b/engines/scumm/players/player_v2base.h index eb9ed941ca..32bde95ddc 100644 --- a/engines/scumm/player_v2base.h +++ b/engines/scumm/players/player_v2base.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_V2BASE_H -#define SCUMM_PLAYER_V2BASE_H +#ifndef SCUMM_PLAYERS_PLAYER_V2BASE_H +#define SCUMM_PLAYERS_PLAYER_V2BASE_H #include "common/scummsys.h" #include "common/mutex.h" diff --git a/engines/scumm/player_v2cms.cpp b/engines/scumm/players/player_v2cms.cpp index c1242e0645..8e903bf9d2 100644 --- a/engines/scumm/player_v2cms.cpp +++ b/engines/scumm/players/player_v2cms.cpp @@ -20,7 +20,7 @@ * */ -#include "scumm/player_v2cms.h" +#include "scumm/players/player_v2cms.h" #include "scumm/scumm.h" #include "audio/mididrv.h" #include "audio/mixer.h" diff --git a/engines/scumm/player_v2cms.h b/engines/scumm/players/player_v2cms.h index 905c7c141e..fe42720215 100644 --- a/engines/scumm/player_v2cms.h +++ b/engines/scumm/players/player_v2cms.h @@ -20,10 +20,10 @@ * */ -#ifndef SCUMM_PLAYER_V2CMS_H -#define SCUMM_PLAYER_V2CMS_H +#ifndef SCUMM_PLAYERS_PLAYER_V2CMS_H +#define SCUMM_PLAYERS_PLAYER_V2CMS_H -#include "scumm/player_v2base.h" // for channel_data +#include "scumm/players/player_v2base.h" // for channel_data class CMSEmulator; diff --git a/engines/scumm/player_v3a.cpp b/engines/scumm/players/player_v3a.cpp index 472cd1252b..ca0eedc90a 100644 --- a/engines/scumm/player_v3a.cpp +++ b/engines/scumm/players/player_v3a.cpp @@ -22,7 +22,7 @@ #include "engines/engine.h" -#include "scumm/player_v3a.h" +#include "scumm/players/player_v3a.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v3a.h b/engines/scumm/players/player_v3a.h index 9449664e9b..3f84a74e51 100644 --- a/engines/scumm/player_v3a.h +++ b/engines/scumm/players/player_v3a.h @@ -20,12 +20,12 @@ * */ -#ifndef SCUMM_PLAYER_V3A_H -#define SCUMM_PLAYER_V3A_H +#ifndef SCUMM_PLAYERS_PLAYER_V3A_H +#define SCUMM_PLAYERS_PLAYER_V3A_H #include "common/scummsys.h" #include "scumm/music.h" -#include "scumm/player_mod.h" +#include "scumm/players/player_mod.h" class Mixer; diff --git a/engines/scumm/player_v3m.cpp b/engines/scumm/players/player_v3m.cpp index bf65ec797f..e30e31aff9 100644 --- a/engines/scumm/player_v3m.cpp +++ b/engines/scumm/players/player_v3m.cpp @@ -91,7 +91,7 @@ #include "common/translation.h" #include "engines/engine.h" #include "gui/message.h" -#include "scumm/player_v3m.h" +#include "scumm/players/player_v3m.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v3m.h b/engines/scumm/players/player_v3m.h index 359bab32a9..615d736035 100644 --- a/engines/scumm/player_v3m.h +++ b/engines/scumm/players/player_v3m.h @@ -20,14 +20,14 @@ * */ -#ifndef SCUMM_PLAYER_V3M_H -#define SCUMM_PLAYER_V3M_H +#ifndef SCUMM_PLAYERS_PLAYER_V3M_H +#define SCUMM_PLAYERS_PLAYER_V3M_H #include "common/scummsys.h" #include "common/util.h" #include "common/mutex.h" #include "scumm/music.h" -#include "scumm/player_mac.h" +#include "scumm/players/player_mac.h" #include "audio/audiostream.h" #include "audio/mixer.h" diff --git a/engines/scumm/player_v4a.cpp b/engines/scumm/players/player_v4a.cpp index e791736f0e..59f49625c3 100644 --- a/engines/scumm/player_v4a.cpp +++ b/engines/scumm/players/player_v4a.cpp @@ -21,7 +21,7 @@ */ #include "engines/engine.h" -#include "scumm/player_v4a.h" +#include "scumm/players/player_v4a.h" #include "scumm/scumm.h" #include "common/file.h" diff --git a/engines/scumm/player_v4a.h b/engines/scumm/players/player_v4a.h index d01c70f295..c8c7b63ed2 100644 --- a/engines/scumm/player_v4a.h +++ b/engines/scumm/players/player_v4a.h @@ -20,8 +20,8 @@ * */ -#ifndef SCUMM_PLAYER_V4A_H -#define SCUMM_PLAYER_V4A_H +#ifndef SCUMM_PLAYERS_PLAYER_V4A_H +#define SCUMM_PLAYERS_PLAYER_V4A_H #include "common/scummsys.h" #include "common/util.h" diff --git a/engines/scumm/player_v5m.cpp b/engines/scumm/players/player_v5m.cpp index 500f3bbc40..77b6d52a3c 100644 --- a/engines/scumm/player_v5m.cpp +++ b/engines/scumm/players/player_v5m.cpp @@ -76,7 +76,7 @@ #include "common/translation.h" #include "engines/engine.h" #include "gui/message.h" -#include "scumm/player_v5m.h" +#include "scumm/players/player_v5m.h" #include "scumm/scumm.h" namespace Scumm { diff --git a/engines/scumm/player_v5m.h b/engines/scumm/players/player_v5m.h index b2079ee331..e3a457f8af 100644 --- a/engines/scumm/player_v5m.h +++ b/engines/scumm/players/player_v5m.h @@ -20,14 +20,14 @@ * */ -#ifndef SCUMM_PLAYER_V5M_H -#define SCUMM_PLAYER_V5M_H +#ifndef SCUMM_PLAYERS_PLAYER_V5M_H +#define SCUMM_PLAYERS_PLAYER_V5M_H #include "common/scummsys.h" #include "common/util.h" #include "common/mutex.h" #include "scumm/music.h" -#include "scumm/player_mac.h" +#include "scumm/players/player_mac.h" #include "audio/audiostream.h" #include "audio/mixer.h" diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 3453e53a18..8170a032d9 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -30,7 +30,7 @@ #include "scumm/charset.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse/imuse.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/resource.h" diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index 2d4c326b68..3da7000ae9 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -27,7 +27,7 @@ #include "scumm/scumm_v3.h" #include "scumm/scumm_v5.h" #include "scumm/sound.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" #include "scumm/util.h" #include "scumm/verbs.h" diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index d1a3de94b8..cc8665e450 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -45,26 +45,26 @@ #include "scumm/imuse_digi/dimuse.h" #include "scumm/smush/smush_mixer.h" #include "scumm/smush/smush_player.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" #include "scumm/insane/insane.h" #include "scumm/he/animation_he.h" #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" #include "scumm/he/sound_he.h" #include "scumm/object.h" -#include "scumm/player_ad.h" -#include "scumm/player_nes.h" -#include "scumm/player_sid.h" -#include "scumm/player_pce.h" -#include "scumm/player_apple2.h" -#include "scumm/player_v1.h" -#include "scumm/player_v2.h" -#include "scumm/player_v2cms.h" -#include "scumm/player_v2a.h" -#include "scumm/player_v3a.h" -#include "scumm/player_v3m.h" -#include "scumm/player_v4a.h" -#include "scumm/player_v5m.h" +#include "scumm/players/player_ad.h" +#include "scumm/players/player_nes.h" +#include "scumm/players/player_sid.h" +#include "scumm/players/player_pce.h" +#include "scumm/players/player_apple2.h" +#include "scumm/players/player_v1.h" +#include "scumm/players/player_v2.h" +#include "scumm/players/player_v2cms.h" +#include "scumm/players/player_v2a.h" +#include "scumm/players/player_v3a.h" +#include "scumm/players/player_v3m.h" +#include "scumm/players/player_v4a.h" +#include "scumm/players/player_v5m.h" #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm_v0.h" diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index aaf7f90aca..071805752b 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -30,7 +30,7 @@ #include "scumm/file.h" #include "scumm/imuse/imuse.h" #include "scumm/imuse_digi/dimuse.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" #include "scumm/resource.h" #include "scumm/scumm.h" #include "scumm/sound.h" diff --git a/engines/sword1/screen.cpp b/engines/sword1/screen.cpp index ae128b8c05..76957e0a70 100644 --- a/engines/sword1/screen.cpp +++ b/engines/sword1/screen.cpp @@ -57,6 +57,30 @@ Screen::Screen(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan) { _psxCache.extPlxCache = NULL; _oldScrollX = 0; _oldScrollY = 0; + + _textMan = 0; + + for (int i = 0; i < 4; i++) + _layerGrid[i] = 0; + + for (int i = 0; i < 4; i++) + _layerBlocks[i] = 0; + + _parallax[0] = 0; + _parallax[1] = 0; + + _fullRefresh = 0; + + for (int i = 0; i < MAX_SORT; i++) { + _sortList[i].id = 0; + _sortList[i].y = 0; + } + _scrnSizeX = 0; + _scrnSizeY = 0; + _gridSizeX = 0; + _gridSizeY = 0; + _fadingDirection = 0; + _isBlack = 0; } Screen::~Screen() { diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp index 2d5452778d..5738431dce 100644 --- a/engines/sword1/sword1.cpp +++ b/engines/sword1/sword1.cpp @@ -67,6 +67,17 @@ SwordEngine::SwordEngine(OSystem *syst) SearchMan.addSubDirectoryMatching(gameDataDir, "italian"); // PSX Demo _console = new SwordConsole(this); + + _mouseState = 0; + _resMan = 0; + _objectMan = 0; + _screen = 0; + _mouse = 0; + _logic = 0; + _sound = 0; + _menu = 0; + _music = 0; + _control = 0; } SwordEngine::~SwordEngine() { diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp index 78d3954325..19e997af34 100644 --- a/engines/toon/anim.cpp +++ b/engines/toon/anim.cpp @@ -41,7 +41,7 @@ bool Animation::loadAnimation(const Common::String &file) { if (strncmp((char *)fileData, "KevinAguilar", 12)) return false; - strcpy(_name, file.c_str()); + Common::strlcpy(_name, file.c_str(), 32); uint32 headerSize = READ_LE_UINT32(fileData + 16); uint32 uncompressedBytes = READ_LE_UINT32(fileData + 20); @@ -52,6 +52,7 @@ bool Animation::loadAnimation(const Common::String &file) { _x2 = READ_LE_UINT32(fileData + 40); _y2 = READ_LE_UINT32(fileData + 44); _paletteEntries = READ_LE_UINT32(fileData + 56); + // CHECKME: Useless variable _fps _fps = READ_LE_UINT32(fileData + 60); uint32 paletteSize = READ_LE_UINT32(fileData + 64); @@ -119,6 +120,10 @@ Animation::Animation(ToonEngine *vm) : _vm(vm) { _palette = NULL; _numFrames = 0; _frames = NULL; + + _x1 = _y1 = _x2 = _y2 = 0; + _fps = 0; + _paletteEntries = 0; } Animation::~Animation() { @@ -448,6 +453,7 @@ AnimationInstance::AnimationInstance(ToonEngine *vm, AnimationInstanceType type) _y = 0; _z = 0; _layerZ = 0; + _visible = false; } void AnimationInstance::render() { diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp index bc0e051057..50b559ee00 100644 --- a/engines/toon/audio.cpp +++ b/engines/toon/audio.cpp @@ -255,6 +255,8 @@ AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, } else { stopNow(); } + + _soundType = Audio::Mixer::kPlainSoundType; } AudioStreamInstance::~AudioStreamInstance() { diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp index 83c9e3ec70..baab8888cf 100644 --- a/engines/toon/character.cpp +++ b/engines/toon/character.cpp @@ -65,6 +65,7 @@ Character::Character(ToonEngine *vm) : _vm(vm) { _numPixelToWalk = 0; _nextIdleTime = _vm->_system->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength(); _lineToSayId = 0; + _time = 0; } Character::~Character(void) { diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp index e26ed92f83..2ba4eff652 100644 --- a/engines/toon/font.cpp +++ b/engines/toon/font.cpp @@ -32,6 +32,8 @@ FontRenderer::FontRenderer(ToonEngine *vm) : _vm(vm) { _currentFontColor[1] = 0xc8; _currentFontColor[2] = 0xcb; _currentFontColor[3] = 0xce; + + _currentFont = nullptr; } FontRenderer::~FontRenderer() { @@ -195,8 +197,7 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o // divide the text in several lines // based on number of characters or size of lines. byte text[1024]; - strncpy((char *)text, origText.c_str(), 1023); - text[1023] = 0; + Common::strlcpy((char *)text, origText.c_str(), 1024); byte *lines[16]; int32 lineSize[16]; diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp index f0463a52e1..9e8514d0a8 100644 --- a/engines/toon/movie.cpp +++ b/engines/toon/movie.cpp @@ -85,7 +85,8 @@ void Movie::play(const Common::String &video, int32 flags) { _playing = true; if (flags & 1) _vm->getAudioManager()->setMusicVolume(0); - _decoder->loadFile(video.c_str()); + if (!_decoder->loadFile(video.c_str())) + error("Unable to play video %s", video.c_str()); playVideo(isFirstIntroVideo); _vm->flushPalette(true); if (flags & 1) @@ -94,7 +95,7 @@ void Movie::play(const Common::String &video, int32 flags) { _playing = false; } -bool Movie::playVideo(bool isFirstIntroVideo) { +void Movie::playVideo(bool isFirstIntroVideo) { debugC(1, kDebugMovie, "playVideo(isFirstIntroVideo: %d)", isFirstIntroVideo); _decoder->start(); @@ -135,13 +136,13 @@ bool Movie::playVideo(bool isFirstIntroVideo) { while (_vm->_system->getEventManager()->pollEvent(event)) if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE)) { _vm->dirtyAllScreen(); - return false; + return; } _vm->_system->delayMillis(10); } _vm->dirtyAllScreen(); - return !_vm->shouldQuit(); + return; } } // End of namespace Toon diff --git a/engines/toon/movie.h b/engines/toon/movie.h index 4dd6583bf6..14287d87fd 100644 --- a/engines/toon/movie.h +++ b/engines/toon/movie.h @@ -53,9 +53,8 @@ public: bool isPlaying() { return _playing; } protected: - bool playVideo(bool isFirstIntroVideo); + void playVideo(bool isFirstIntroVideo); ToonEngine *_vm; - Audio::Mixer *_mixer; ToonstruckSmackerDecoder *_decoder; bool _playing; }; diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp index 7914aed595..336847e73c 100644 --- a/engines/toon/path.cpp +++ b/engines/toon/path.cpp @@ -152,6 +152,8 @@ PathFinding::PathFinding() { _heap = new PathFindingHeap(); _sq = NULL; _numBlockingRects = 0; + + _currentMask = nullptr; } PathFinding::~PathFinding(void) { diff --git a/engines/toon/picture.cpp b/engines/toon/picture.cpp index 65cc3a70e1..4927f50e08 100644 --- a/engines/toon/picture.cpp +++ b/engines/toon/picture.cpp @@ -134,6 +134,11 @@ bool Picture::loadPicture(const Common::String &file) { Picture::Picture(ToonEngine *vm) : _vm(vm) { _data = NULL; _palette = NULL; + + _width = 0; + _height = 0; + _paletteEntries = 0; + _useFullPalette = false; } Picture::~Picture() { diff --git a/engines/toon/resource.cpp b/engines/toon/resource.cpp index 2d419ec027..ffcabbd348 100644 --- a/engines/toon/resource.cpp +++ b/engines/toon/resource.cpp @@ -285,6 +285,7 @@ void PakFile::close() { } PakFile::PakFile() { + _numFiles = 0; } PakFile::~PakFile() { diff --git a/engines/toon/resource.h b/engines/toon/resource.h index c80ac2216e..b432a1d335 100644 --- a/engines/toon/resource.h +++ b/engines/toon/resource.h @@ -53,7 +53,6 @@ protected: uint32 _numFiles; Common::Array<File> _files; - Common::File *_fileHandle; }; class ToonEngine; diff --git a/engines/toon/script.cpp b/engines/toon/script.cpp index 69ae727bb5..d752c277db 100644 --- a/engines/toon/script.cpp +++ b/engines/toon/script.cpp @@ -59,6 +59,8 @@ EMCInterpreter::EMCInterpreter(ToonEngine *vm) : _vm(vm), _scriptData(0), _filen }; _opcodes = opcodes; #undef OPCODE + + _parameter = 0; } EMCInterpreter::~EMCInterpreter() { @@ -132,8 +134,7 @@ bool EMCInterpreter::load(const char *filename, EMCData *scriptData, const Commo _scriptData->sysFuncs = opcodes; - strncpy(_scriptData->filename, filename, 13); - _scriptData->filename[12] = 0; + Common::strlcpy(_scriptData->filename, filename, 13); _scriptData = 0; _filename = 0; diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp index 1fa4058114..70baaaef22 100644 --- a/engines/toon/script_func.cpp +++ b/engines/toon/script_func.cpp @@ -1060,9 +1060,9 @@ int32 ScriptFunc::sys_Cmd_Set_Location_Data(EMCState *state) { // initial setup of locations int32 locationId = stackPos(0); debugC(0, 0, "setlocationdata(%d) %s %x %s %s %d %d", locationId, GetText(1, state), stackPos(2), GetText(3, state), GetText(4, state), stackPos(5), stackPos(6)); - strcpy(_vm->state()->_locations[locationId]._name, GetText(1, state)); - strcpy(_vm->state()->_locations[locationId]._music, GetText(3, state)); - strcpy(_vm->state()->_locations[locationId]._cutaway, GetText(4, state)); + Common::strlcpy(_vm->state()->_locations[locationId]._name, GetText(1, state), 64); + Common::strlcpy(_vm->state()->_locations[locationId]._music, GetText(3, state), 64); + Common::strlcpy(_vm->state()->_locations[locationId]._cutaway, GetText(4, state), 64); _vm->state()->_locations[locationId]._flags = stackPos(2); _vm->state()->_locations[locationId]._visited = false; _vm->state()->_locations[locationId]._numSceneAnimations = stackPos(5); diff --git a/engines/toon/state.cpp b/engines/toon/state.cpp index 8e4abbd709..fffa8cf529 100644 --- a/engines/toon/state.cpp +++ b/engines/toon/state.cpp @@ -115,6 +115,10 @@ State::State(void) { #endif memset(_conversationState, 0, sizeof(Conversation) * 60); + + _conversationData = nullptr; + _currentConversationId = -1; + _exitConversation = true; } State::~State(void) { diff --git a/engines/toon/tools.cpp b/engines/toon/tools.cpp index added39940..f5c77aca69 100644 --- a/engines/toon/tools.cpp +++ b/engines/toon/tools.cpp @@ -136,6 +136,13 @@ uint32 decompressSPCN(byte *src, byte *dst, uint32 dstsize) { RncDecoder::RncDecoder() { initCrc(); + + _bitBuffl = 0; + _bitBuffh = 0; + _bitCount = 0; + _srcPtr = nullptr; + _dstPtr = nullptr; + _inputByteLeft = 0; } RncDecoder::~RncDecoder() { } diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 286bcf1941..a97bfd55e8 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -922,6 +922,36 @@ ToonEngine::ToonEngine(OSystem *syst, const ADGameDescription *gameDescription) _gameVariant = 0; break; } + + for (int i = 0; i < 64; i++) { + _sceneAnimationScripts[i]._lastTimer = 0; + _sceneAnimationScripts[i]._frozen = false; + _sceneAnimationScripts[i]._frozenForConversation = false; + _sceneAnimationScripts[i]._active = false; + } + + _lastProcessedSceneScript = 0; + _animationSceneScriptRunFlag = false; + _updatingSceneScriptRunFlag = false; + _dirtyAll = false; + _cursorOffsetX = 0; + _cursorOffsetY = 0; + _currentTextLine = 0; + _currentTextLineId = 0; + _currentTextLineX = 0; + _currentTextLineY = 0; + _currentTextLineCharacterId = -1; + _oldScrollValue = 0; + _drew = nullptr; + _flux = nullptr; + _currentHotspotItem = 0; + _shouldQuit = false; + _scriptStep = 0; + _oldTimer = 0; + _oldTimer2 = 0; + _lastRenderTime = 0; + _firstFrame = false; + _needPaletteFlush = true; } ToonEngine::~ToonEngine() { diff --git a/engines/touche/touche.cpp b/engines/touche/touche.cpp index 89cc1ad5af..6ca17c86a1 100644 --- a/engines/touche/touche.cpp +++ b/engines/touche/touche.cpp @@ -110,6 +110,31 @@ ToucheEngine::ToucheEngine(OSystem *system, Common::Language language) DebugMan.addDebugChannel(kDebugCharset, "Charset", "Charset debug level"); _console = new ToucheConsole(this); + + _newEpisodeNum = 0; + _currentEpisodeNum = 0; + _currentAmountOfMoney = 0; + _giveItemToKeyCharNum = 0; + _giveItemToObjectNum = 0; + _giveItemToCounter = 0; + _currentRoomNum = 0; + _waitingSetKeyCharNum1 = 0; + _waitingSetKeyCharNum2 = 0; + _waitingSetKeyCharNum3 = 0; + _script.opcodeNum = 0; + _script.dataOffset = 0; + _script.keyCharNum = 0; + _script.dataPtr = 0; + _script.stackDataPtr = 0; + _script.stackDataBasePtr = 0; + _script.quitFlag = 0; + _opcodesTable = 0; + + for (uint i = 0; i < NUM_SPRITES; i++) + memset(&_spritesTable[i], 0, sizeof(SpriteData)); + + for (uint i = 0; i < NUM_SEQUENCES; i++) + memset(&_sequenceEntryTable[i], 0, sizeof(SequenceEntry)); } ToucheEngine::~ToucheEngine() { diff --git a/engines/touche/touche.h b/engines/touche/touche.h index 6ac43e7dfe..9cc42b0c68 100644 --- a/engines/touche/touche.h +++ b/engines/touche/touche.h @@ -102,7 +102,7 @@ struct KeyChar { int16 zPosPrev; int16 prevWalkDataNum; uint16 textColor; - int16 inventoryItems[4]; + int16 inventoryItems[5]; int16 money; int16 pointsDataNum; int16 currentWalkBox; diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 867bd4d7ae..5674773177 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -841,7 +841,7 @@ void SceneExt::startStrip() { scene->_savedCanWalk = BF_GLOBALS._player._canWalk; BF_GLOBALS._player.disableControl(); - if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active) + if (T2_GLOBALS._uiElements._active) T2_GLOBALS._uiElements.hide(); } } @@ -855,7 +855,7 @@ void SceneExt::endStrip() { BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; BF_GLOBALS._player._canWalk = scene->_savedCanWalk; - if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active) + if (T2_GLOBALS._uiElements._active) T2_GLOBALS._uiElements.show(); } } @@ -890,7 +890,6 @@ void PalettedScene::remove() { BF_GLOBALS._sceneObjects->draw(); BF_GLOBALS._scenePalette.loadPalette(2); - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager._hasPalette = true; } @@ -1263,8 +1262,6 @@ void BlueForceInvObjectList::alterInventory(int mode) { setObjectScene(INV_TICKET_BOOK, 60); setObjectScene(INV_MIRANDA_CARD, 60); - BF_GLOBALS._v4CEC4 = 0; - switch (mode) { case 2: if (hasPrintout) diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp index 7c52d67f80..06be605c1a 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.cpp +++ b/engines/tsage/blue_force/blueforce_scenes0.cpp @@ -942,7 +942,6 @@ void Scene60::Action3::signal() { scene->_stripManager.start(71, this); break; case 2: - scene->_field1222 = true; BF_GLOBALS._player.enableControl(); remove(); break; @@ -956,7 +955,6 @@ Scene60::Scene60(): SceneExt() { _sceneNumber = 0; _visage = 0; _cursorId = CURSOR_NONE; - _field1222 = false; } void Scene60::synchronize(Serializer &s) { @@ -966,7 +964,10 @@ void Scene60::synchronize(Serializer &s) { s.syncAsSint16LE(_sceneNumber); s.syncAsSint16LE(_visage); s.syncAsSint16LE(_cursorId); - s.syncAsSint16LE(_field1222); + if (s.getVersion() < 11) { + int useless = 0; + s.syncAsSint16LE(useless); + } } void Scene60::postInit(SceneObjectList *OwnerList) { diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h index dd502c5f30..e7ee06e779 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.h +++ b/engines/tsage/blue_force/blueforce_scenes0.h @@ -174,8 +174,6 @@ public: int _sceneNumber; int _visage; CursorType _cursorId; - // TODO: Check if really useless in original - bool _field1222; Scene60(); virtual void synchronize(Serializer &s); diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp index d26e34ae23..fa877ea6c9 100644 --- a/engines/tsage/blue_force/blueforce_scenes1.cpp +++ b/engines/tsage/blue_force/blueforce_scenes1.cpp @@ -176,7 +176,6 @@ void Scene100::postInit(SceneObjectList *OwnerList) { loadScene(101); } BF_GLOBALS._scenePalette.loadPalette(2); - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._interfaceY = SCREEN_HEIGHT; g_globals->_player.postInit(); @@ -232,7 +231,6 @@ void Scene109::Action1::signal() { scene->_text.setup(BF_19840515, this); break; case 3: - BF_GLOBALS._v51C44 = 1; scene->loadScene(115); scene->_protaginist2.show(); @@ -246,7 +244,6 @@ void Scene109::Action1::signal() { scene->_beerSign.show(); scene->_beerSign.setAction(&scene->_action2); - BF_GLOBALS._v501FC = 170; setDelay(60); break; case 4: @@ -401,12 +398,10 @@ void Scene110::Action1::signal() { scene->_object6.show(); scene->_object9.show(); scene->_object10.show(); - BF_GLOBALS._v51C44 = 1; scene->loadScene(110); setDelay(10); break; case 2: - BF_GLOBALS._v51C44 = 1; scene->_object1.animate(ANIM_MODE_5, this); break; case 3: { @@ -1833,8 +1828,6 @@ void Scene125::Action2::signal() { setDelay(20); break; case 2: { - BF_GLOBALS._v501FA = 10; - BF_GLOBALS._v51C44 = 1; Common::Point destPos(202, 94); NpcMover *mover = new NpcMover(); BF_GLOBALS._player.addMover(mover, &destPos, this); @@ -2311,7 +2304,6 @@ void Scene140::Action1::signal() { setDelay(60); // No break on purpose case 13: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(150); default: break; @@ -2337,9 +2329,6 @@ void Scene140::postInit(SceneObjectList *OwnerList) { _object1.changeZoom(100); _object1.hide(); - BF_GLOBALS._v5020C = 0; - BF_GLOBALS._v501F8 = 300; - BF_GLOBALS._v501FC = 90; BF_GLOBALS._sound1.play(7); _object2.setAction(&_action1); @@ -2640,7 +2629,6 @@ void Scene160::Action2::signal() { BF_GLOBALS._sound1.stop(); // End of hack - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(200); break; default: @@ -2788,9 +2776,6 @@ void Scene180::postInit(SceneObjectList *OwnerList) { setZoomPercents(121, 60, 125, 70); if ((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) { - BF_GLOBALS._v501FC = 87; - BF_GLOBALS._v501FA = _sceneBounds.left + 10; - // CHECKME: BF_GLOBALS._v50206 = 18; ?? _sceneMessage.setup(THE_NEXT_DAY); _sceneMode = 6; setAction(&_sceneMessage, this); @@ -2799,9 +2784,6 @@ void Scene180::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._mapLocationId = 4; } else if (((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) || ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) { - BF_GLOBALS._v501FC = 87; - BF_GLOBALS._v501FA = _sceneBounds.left + 10; - // CHECKME: BF_GLOBALS._v50206 = 18; ?? _sceneMessage.setup(THE_NEXT_DAY); _sceneMode = 6; setAction(&_sceneMessage, this); diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp index c992afe620..1b0ed2a145 100644 --- a/engines/tsage/blue_force/blueforce_scenes2.cpp +++ b/engines/tsage/blue_force/blueforce_scenes2.cpp @@ -1603,7 +1603,6 @@ void Scene271::signal() { } break; case 12: - BF_GLOBALS._v51C44 = 0; BF_GLOBALS._sound1.changeSound(67); BF_GLOBALS._sceneManager.changeScene(280); break; @@ -1617,7 +1616,6 @@ void Scene271::signal() { _field2E16 = 1; break; case 2704: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sound1.fadeOut2(NULL); BF_GLOBALS._sceneManager.changeScene(690); break; @@ -1649,7 +1647,6 @@ void Scene271::signal() { addFader((const byte *)&black, 2, this); break; case 2712: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sound1.fadeOut2(NULL); BF_GLOBALS._sceneManager.changeScene(180); break; @@ -1657,7 +1654,6 @@ void Scene271::signal() { BF_GLOBALS._player.enableControl(); break; case 2714: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(560); break; case 2715: diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp index f343c9de96..5dd795cb39 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.cpp +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -564,7 +564,6 @@ void Scene300::dispatch() { if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) && (_sceneMode != 6308) && (_sceneMode != 7308)) { - // The original was setting a useless global variable (removed) _sceneMode = 6308; BF_GLOBALS._player.disableControl(); ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20, @@ -967,7 +966,6 @@ void Scene315::Action1::signal() { /*--------------------------------------------------------------------------*/ Scene315::Scene315() { - BF_GLOBALS._v51C44 = 1; _field1B6C = _field139C = 0; if (BF_GLOBALS._dayNumber == 0) BF_GLOBALS._dayNumber = 1; @@ -978,7 +976,6 @@ Scene315::Scene315() { _invGreenCount = _bookGreenCount = 0; _invGangCount = _bookGangCount = 0; - _field1390 = 0; _stripNumber = 0; _field1398 = 0; _currentCursor = INV_NONE; @@ -987,7 +984,10 @@ Scene315::Scene315() { void Scene315::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_field1390); + if (s.getVersion() < 11) { + int useless = 0; + s.syncAsSint16LE(useless); + } s.syncAsSint16LE(_stripNumber); s.syncAsSint16LE(_field1398); s.syncAsSint16LE(_invGreenCount); @@ -4444,7 +4444,6 @@ void Scene360::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.enableControl(); if ((BF_GLOBALS._sceneManager._previousScene == 355) || (BF_GLOBALS._sceneManager._previousScene != 370)) { - // The original was using there a useless variable (now removed) BF_GLOBALS._player.setPosition(Common::Point(253, 135)); BF_GLOBALS._player.setStrip(2); diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h index fdeabdaf5c..d9f0d32edc 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.h +++ b/engines/tsage/blue_force/blueforce_scenes3.h @@ -210,7 +210,6 @@ public: WestExit _westExit; SouthWestExit _swExit; Action1 _action1; - int _field1390; // Useless variable int _stripNumber; int _field1398; int _invGreenCount, _bookGreenCount, _invGangCount; diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h index f46b2afdde..d6d795a44e 100644 --- a/engines/tsage/blue_force/blueforce_scenes4.h +++ b/engines/tsage/blue_force/blueforce_scenes4.h @@ -118,7 +118,7 @@ public: ASoundExt _sound1; int _action1Count, _talkCount, _field1FBA; int _cuffedDriverFl, _field1FBE; - int _field1FC0; // Useless variable + int _field1FC0; int _field1FC2, _harrisonMovedFl; Scene410(); diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp index 1d23874533..ebaa3e372e 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.cpp +++ b/engines/tsage/blue_force/blueforce_scenes5.cpp @@ -1772,14 +1772,12 @@ void Scene570::IconManager::refreshList() { } void Scene570::IconManager::addItem(Icon *item) { - item->_mode = _mode; _list.push_back(item); } Scene570::Icon::Icon(): NamedObject() { _iconId = _folderId = 0; _parentFolderId = 0; - _mode = 0; } void Scene570::Icon::synchronize(Serializer &s) { @@ -1787,7 +1785,10 @@ void Scene570::Icon::synchronize(Serializer &s) { s.syncAsSint16LE(_iconId); s.syncAsSint16LE(_folderId); s.syncAsSint16LE(_parentFolderId); - s.syncAsSint16LE(_mode); + if (s.getVersion() < 11) { + int useless = 0; + s.syncAsSint16LE(useless); + } } void Scene570::Icon::remove() { diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h index ab78d02e11..5337b6426b 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.h +++ b/engines/tsage/blue_force/blueforce_scenes5.h @@ -258,7 +258,6 @@ class Scene570: public SceneExt { public: SceneText _sceneText; int _iconId, _folderId, _parentFolderId; - int _mode; // Useless variable Common::String _text; Icon(); diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp index 13334ece08..b20092492f 100644 --- a/engines/tsage/blue_force/blueforce_scenes6.cpp +++ b/engines/tsage/blue_force/blueforce_scenes6.cpp @@ -79,7 +79,6 @@ void Scene600::Action1::signal() { } BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); - BF_GLOBALS._v51C44 = 1; scene->loadScene(999); setDelay(5); break; @@ -88,7 +87,6 @@ void Scene600::Action1::signal() { setDelay(5); break; case 7: - BF_GLOBALS._v51C44 = 0; remove(); break; default: diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp index 9a20788b6a..867b6a9f6e 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.cpp +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -577,17 +577,15 @@ bool Scene810::Lyle::startAction(CursorType action, Event &event) { if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))){ scene->_sceneMode = 8141; } else { - // Doublecheck on shownLyleCrate1 removed: useless scene->_sceneMode = 8144; } } else { if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))) { scene->_sceneMode = 8129; - } else { // if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + } else { scene->_sceneMode = 8132; - // doublecheck Present in the original, may hide a bug in the original - //} else - // scene->_sceneMode = 8121; + // Double check on ShownLyleCrate1 present in the original, may hide a bug in the original + // The original was then setting _sceneMode 8121 } } } @@ -1071,7 +1069,6 @@ void Scene810::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager1, this, 8107, &BF_GLOBALS._player, &_lyle, NULL); break; case 935: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._scenePalette.loadPalette(2); _lyle.remove(); @@ -1804,13 +1801,11 @@ void Scene830::signal() { _sceneMode = 832; BF_GLOBALS._scenePalette.clearListeners(); addFader((const byte *)&black, 5, this); - BF_GLOBALS._v51C44 = 0; break; case 12: _sceneMode = 831; BF_GLOBALS._scenePalette.clearListeners(); addFader((const byte *)&black, 5, this); - BF_GLOBALS._v51C44 = 0; break; case 13: BF_GLOBALS._sceneManager.changeScene(850); diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp index aa407282e2..cef9e8135c 100644 --- a/engines/tsage/blue_force/blueforce_scenes9.cpp +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -1966,7 +1966,6 @@ void Scene910::postInit(SceneObjectList *OwnerList) { loadScene(910); BF_GLOBALS._sound1.changeSound(99); - BF_GLOBALS._v51C44 = 0; _stripManager.addSpeaker(&_gameTextSpeaker); _stripManager.addSpeaker(&_jakeJacketSpeaker); @@ -2277,7 +2276,6 @@ void Scene910::signal() { break; case 10: BF_GLOBALS._player.disableControl(); - BF_GLOBALS._v51C44 = 0; BF_GLOBALS._sceneManager.changeScene(935); break; case 11: @@ -2316,7 +2314,6 @@ void Scene910::signal() { setAction(&_sequenceManager1, this, 9121, &_stuart, NULL); break; case 14: - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(940); break; case 16: @@ -2376,7 +2373,6 @@ void Scene910::signal() { break; case 19: BF_GLOBALS._deathReason = 14; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 20: @@ -2392,7 +2388,6 @@ void Scene910::signal() { BF_GLOBALS.clearFlag(fGotPointsForSearchingDA); else BF_GLOBALS.setFlag(fGotPointsForSearchingDA); - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(900); break; case 9102: @@ -2486,7 +2481,6 @@ void Scene910::signal() { // No break on purpose case 9137: BF_GLOBALS._deathReason = 16; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 9119: @@ -2626,7 +2620,6 @@ void Scene910::signal() { // No break on purpose case 9134: BF_GLOBALS._deathReason = 17; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 9130: @@ -2639,12 +2632,10 @@ void Scene910::signal() { BF_GLOBALS._player.enableControl(); BF_GLOBALS._v4CEE4 = 4; BF_GLOBALS._deathReason = 13; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 9135: BF_GLOBALS._deathReason = 15; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 9136: @@ -2689,7 +2680,6 @@ void Scene910::signal() { break; case 9143: if (BF_GLOBALS._nico910State == 0) { - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(920); } else { SceneItem::display(910, 89, SET_WIDTH, 312, @@ -2708,7 +2698,6 @@ void Scene910::signal() { break; case 9148: BF_GLOBALS._deathReason = 23; - BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(666); break; case 9149: diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 8021160514..e703b714b2 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -860,6 +860,8 @@ void PlayerMover::doStepsOfNpcMovement(const Common::Point &srcPos, const Common int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destRegion, bool &foundRoute) { // Make a copy of the provided route. The first entry is the size. int tempList[REGION_LIST_SIZE + 1]; + memset(tempList, 0, sizeof(tempList)); + foundRoute = false; for (int idx = 0; idx <= *routeList; ++idx) tempList[idx] = routeList[idx]; diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index b043df0c10..a8ab145dbb 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -26,6 +26,7 @@ #include "tsage/ringworld/ringworld_demo.h" #include "tsage/ringworld/ringworld_logic.h" #include "tsage/ringworld2/ringworld2_logic.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" #include "tsage/staticres.h" namespace TsAGE { @@ -47,6 +48,11 @@ static SavedObject *classFactoryProc(const Common::String &className) { if (className == "SceneObjectWrapper") return new SceneObjectWrapper(); if (className == "PaletteRotation") return new PaletteRotation(); if (className == "PaletteFader") return new PaletteFader(); + if (className == "SceneText") return new SceneText(); + + // Return to Ringworld specific classes + if (className == "Scene205_Star") return new Ringworld2::Star(); + return NULL; } @@ -242,32 +248,37 @@ BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() { _deathReason = 0; _driveFromScene = 300; _driveToScene = 0; - _v501F8 = 0; - _v501FA = 0; - _v501FC = 0; - _v5020C = 0; - _v50696 = 0; _subFlagBitArr1 = 0; _subFlagBitArr2 = 0; _v50CC2 = 0; _scene410Action1Count = 0; _scene410TalkCount = 0; _scene410HarrisonMovedFl = 0; - _v51C42 = 0; - _v51C44 = 1; _bookmark = bNone; _mapLocationId = 1; _clip1Bullets = 8; _clip2Bullets = 8; + + _dayNumber = 0; + _tonyDialogCtr = 0; + _marinaWomanCtr = 0; + _kateDialogCtr = 0; + _v4CEB6 = 0; + _safeCombination = 0; + _gateStatus = 0; + _greenDay5TalkCtr = 0; + _v4CEC8 = 1; + _v4CECA = 0; + _v4CECC = 0; } void BlueForceGlobals::synchronize(Serializer &s) { TsAGE2Globals::synchronize(s); + int16 useless = 0; s.syncAsSint16LE(_dayNumber); if (s.getVersion() < 9) { - int tmpVar = 0; - s.syncAsSint16LE(tmpVar); + s.syncAsSint16LE(useless); } s.syncAsSint16LE(_tonyDialogCtr); s.syncAsSint16LE(_marinaWomanCtr); @@ -276,7 +287,8 @@ void BlueForceGlobals::synchronize(Serializer &s) { s.syncAsSint16LE(_safeCombination); s.syncAsSint16LE(_gateStatus); s.syncAsSint16LE(_greenDay5TalkCtr); - s.syncAsSint16LE(_v4CEC4); + if (s.getVersion() < 11) + s.syncAsSint16LE(useless); s.syncAsSint16LE(_v4CEC8); s.syncAsSint16LE(_v4CECA); s.syncAsSint16LE(_v4CECC); @@ -291,19 +303,23 @@ void BlueForceGlobals::synchronize(Serializer &s) { s.syncAsSint16LE(_deathReason); s.syncAsSint16LE(_driveFromScene); s.syncAsSint16LE(_driveToScene); - s.syncAsSint16LE(_v501F8); - s.syncAsSint16LE(_v501FA); - s.syncAsSint16LE(_v501FC); - s.syncAsSint16LE(_v5020C); - s.syncAsSint16LE(_v50696); + if (s.getVersion() < 11) { + s.syncAsSint16LE(useless); + s.syncAsSint16LE(useless); + s.syncAsSint16LE(useless); + s.syncAsSint16LE(useless); + s.syncAsSint16LE(useless); + } s.syncAsSint16LE(_subFlagBitArr1); s.syncAsSint16LE(_subFlagBitArr2); s.syncAsSint16LE(_v50CC2); s.syncAsSint16LE(_scene410Action1Count); s.syncAsSint16LE(_scene410TalkCount); s.syncAsSint16LE(_scene410HarrisonMovedFl); - s.syncAsSint16LE(_v51C42); - s.syncAsSint16LE(_v51C44); + if (s.getVersion() < 11) { + s.syncAsSint16LE(useless); + s.syncAsSint16LE(useless); + } s.syncAsSint16LE(_bookmark); s.syncAsSint16LE(_mapLocationId); s.syncAsSint16LE(_clip1Bullets); @@ -333,7 +349,6 @@ void BlueForceGlobals::reset() { _safeCombination = 0; _gateStatus = 0; _greenDay5TalkCtr = 0; - _v4CEC4 = 0; _v4CEC8 = 1; _v4CECA = 0; _v4CECC = 0; @@ -362,19 +377,12 @@ void BlueForceGlobals::reset() { _v4CEE8 = 0; _deziTopic = 0; _deathReason = 0; - _v501F8 = 0; - _v501FA = 0; - _v501FC = 0; - _v5020C = 0; - _v50696 = 0; _subFlagBitArr1 = 0; _subFlagBitArr2 = 0; _v50CC2 = 0; _scene410Action1Count = 0; _scene410TalkCount = 0; _scene410HarrisonMovedFl = 0; - _v51C42 = 0; - _v51C44 = 1; _clip1Bullets = 8; _clip2Bullets = 8; } @@ -406,7 +414,6 @@ Ringworld2Globals::Ringworld2Globals() { _scannerDialog = new ScannerDialog(); _speechSubtitles = SPEECH_TEXT; - _v5657C = 0; _stripModifier = 0; _flubMazeArea = 1; _flubMazeEntryDirection = 0; @@ -424,13 +431,25 @@ Ringworld2Globals::Ringworld2Globals() { _v56AA6 = 1; _v56AA7 = 1; _v56AA8 = 1; - _v56AAB = 0; _scene180Mode = -1; _v57709 = 0; _v5780C = 0; _v5780E = 0; _v57810 = 0; - _v57C2C = 0; + + _fadePaletteFlag = false; + _insetUp = 0; + _frameEdgeColor = 2; + _animationCtr = 0; + _electromagnetChangeAmount = 0; + _electromagnetZoom = 0; + _v565E5 = 0; + _v565E7 = 0; + _v565E9 = -5; + _v565EB = 26; + _foodCount = 0; + _rimLocation = 0; + _rimTransportLocation = 0; } Ringworld2Globals::~Ringworld2Globals() { @@ -461,9 +480,7 @@ void Ringworld2Globals::reset() { _fadePaletteFlag = false; _v5589E.set(0, 0, 0, 0); _v558B6.set(0, 0, 0, 0); - _v558C2 = 0; _animationCtr = 0; - _v5657C = 0; _electromagnetChangeAmount = 0; _electromagnetZoom = 0; _v565E5 = 0; @@ -532,13 +549,11 @@ void Ringworld2Globals::reset() { _v56AA6 = 1; _v56AA7 = 1; _v56AA8 = 1; - _v56AAB = 0; _scene180Mode = -1; _v57709 = 0; _v5780C = 0; _v5780E = 0; _v57810 = 0; - _v57C2C = 0; _s1550PlayerArea[R2_QUINN] = Common::Point(27, 4); _s1550PlayerArea[R2_SEEKER] = Common::Point(27, 4); Common::fill(&_scannerFrequencies[0], &_scannerFrequencies[MAX_CHARACTERS], 1); @@ -574,9 +589,7 @@ void Ringworld2Globals::synchronize(Serializer &s) { _v5589E.synchronize(s); _v558B6.synchronize(s); - s.syncAsSint16LE(_v558C2); s.syncAsSint16LE(_animationCtr); - s.syncAsSint16LE(_v5657C); s.syncAsSint16LE(_electromagnetChangeAmount); s.syncAsSint16LE(_electromagnetZoom); s.syncAsSint16LE(_v565E5); @@ -593,13 +606,11 @@ void Ringworld2Globals::synchronize(Serializer &s) { s.syncAsSint16LE(_walkwaySceneNumber); s.syncAsSint16LE(_ventCellPos.x); s.syncAsSint16LE(_ventCellPos.y); - s.syncAsSint16LE(_v56AAB); s.syncAsSint16LE(_scene180Mode); s.syncAsSint16LE(_v57709); s.syncAsSint16LE(_v5780C); s.syncAsSint16LE(_v5780E); s.syncAsSint16LE(_v57810); - s.syncAsSint16LE(_v57C2C); s.syncAsByte(_s1550PlayerArea[R2_QUINN].x); s.syncAsByte(_s1550PlayerArea[R2_SEEKER].x); @@ -638,7 +649,7 @@ void Ringworld2Globals::synchronize(Serializer &s) { s.syncAsSint16LE(_balloonPosition.x); s.syncAsSint16LE(_balloonPosition.y); - // Synchronise Flub maze vampire data + // Synchronize Flub maze vampire data for (i = 0; i < 18; ++i) { s.syncAsSint16LE(_vampireData[i]._isAlive); s.syncAsSint16LE(_vampireData[i]._shotsRequired); diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index e514a51120..b9c8076042 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -194,7 +194,6 @@ public: int _safeCombination; int _gateStatus; int _greenDay5TalkCtr; - int _v4CEC4; int _v4CEC8; int _v4CECA; int _v4CECC; @@ -208,19 +207,12 @@ public: int _deathReason; int _driveFromScene; int _driveToScene; - int _v501F8; // Useless variable - int _v501FA; // Useless variable - int _v501FC; // Useless variable - int _v5020C; // Useless variable - int _v50696; // Useless variable uint8 _subFlagBitArr1; uint8 _subFlagBitArr2; int _v50CC2; int _scene410Action1Count; int _scene410TalkCount; int _scene410HarrisonMovedFl; - int _v51C42; // Useless variable - int _v51C44; // Useless variable Bookmark _bookmark; int _mapLocationId; int _clip1Bullets, _clip2Bullets; @@ -259,21 +251,19 @@ public: byte _fadePaletteMap[10][256]; byte _paletteMap[4096]; int _insetUp; - int _frameEdgeColor; // _v421e + int _frameEdgeColor; Rect _v5589E; Rect _v558B6; - int _v558C2; int _animationCtr; int _electromagnetChangeAmount; int _electromagnetZoom; int _v565E5; int _v565E7; int _v565E9; - int _v565EB; + int _v565EB; // CHECKME: IS it a constant? int _foodCount; int _rimLocation; int _rimTransportLocation; - int _v5657C; // Useless variable byte _stripModifier; byte _spillLocation[14]; VampireData _vampireData[18]; @@ -295,13 +285,11 @@ public: byte _v56AA6; byte _v56AA7; byte _v56AA8; - int _v56AAB; // Useless variable int _scene180Mode; // _v575f7 int _v57709; int _v5780C; int _v5780E; int _v57810; - int _v57C2C; // Useless variable. Seems to be _speechSubtitles int _speechSubtitles; Common::Point _s1550PlayerArea[3]; // only used for Quinn and Seeker byte _scannerFrequencies[4]; diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp index 9c18830a30..65c1ed39c6 100644 --- a/engines/tsage/ringworld/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld/ringworld_scenes6.cpp @@ -2032,13 +2032,15 @@ void Scene5300::Hotspot8::doAction(int action) { /*--------------------------------------------------------------------------*/ Scene5300::Scene5300() : - _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) { - _field1B0A = 1; + _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) { } void Scene5300::synchronize(Serializer &s) { Scene::synchronize(s); - s.syncAsSint16LE(_field1B0A); + if (s.getVersion() < 11) { + int useless = 0; + s.syncAsSint16LE(useless); + } } void Scene5300::postInit(SceneObjectList *OwnerList) { @@ -2125,7 +2127,6 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL); } - _field1B0A = 1; if (RING_INVENTORY._bone._sceneNumber == 5300) { _hotspot5.postInit(); _hotspot5.setVisage(5301); diff --git a/engines/tsage/ringworld/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h index 8b08f3bf01..4c10e4a711 100644 --- a/engines/tsage/ringworld/ringworld_scenes6.h +++ b/engines/tsage/ringworld/ringworld_scenes6.h @@ -319,9 +319,6 @@ public: Hotspot7 _hotspot7; Hotspot8 _hotspot8; - // Useless variable, but removing it would break the savegames. - int _field1B0A; - Scene5300(); virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 1d6b998dcb..e37f64e049 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -137,6 +137,7 @@ Scene *Ringworld2Game::createScene(int sceneNumber) { // Spaceport return new Scene1550(); case 1575: + // Spaceport - unused ship scene return new Scene1575(); case 1580: // Inside wreck @@ -1207,25 +1208,25 @@ void Ringworld2Game::processEvent(Event &event) { case Common::KEYCODE_F4: // F4 - Restart restartGame(); - g_globals->_events.setCursorFromFlag(); + R2_GLOBALS._events.setCursorFromFlag(); break; case Common::KEYCODE_F7: // F7 - Restore restoreGame(); - g_globals->_events.setCursorFromFlag(); + R2_GLOBALS._events.setCursorFromFlag(); break; case Common::KEYCODE_F8: // F8 - Credits - warning("TODO: Show Credits"); + R2_GLOBALS._sceneManager.changeScene(205); break; case Common::KEYCODE_F10: // F10 - Pause GfxDialog::setPalette(); MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); - g_globals->_events.setCursorFromFlag(); + R2_GLOBALS._events.setCursorFromFlag(); break; default: diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp index d1d4fabb01..b5173bbf59 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -116,7 +116,7 @@ bool Scene100::Table::startAction(CursorType action, Event &event) { R2_GLOBALS._player.disableControl(); if (_strip == 2) { scene->_sceneMode = 108; - scene->_object3.postInit(); + scene->_tableLocker.postInit(); scene->_stasisNegator.postInit(); if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) { @@ -126,11 +126,13 @@ bool Scene100::Table::startAction(CursorType action, Event &event) { scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL); } - scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3, + // Open table locker + scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_tableLocker, &scene->_stasisNegator, &R2_GLOBALS._player, NULL); } else { scene->_sceneMode = 109; - scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3, + // Close table locker + scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_tableLocker, &scene->_stasisNegator, &R2_GLOBALS._player, NULL); } return true; @@ -140,7 +142,7 @@ bool Scene100::Table::startAction(CursorType action, Event &event) { if (_strip == 2) { SceneItem::display2(100, 18); scene->_sceneMode = 102; - scene->_object3.postInit(); + scene->_tableLocker.postInit(); scene->_stasisNegator.postInit(); if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) { @@ -150,12 +152,12 @@ bool Scene100::Table::startAction(CursorType action, Event &event) { scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL); } - scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3, + scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_tableLocker, &scene->_stasisNegator, NULL); } else { SceneItem::display2(100, 19); scene->_sceneMode = 103; - scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3, + scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_tableLocker, &scene->_stasisNegator, NULL); } return true; @@ -295,10 +297,10 @@ void Scene100::postInit(SceneObjectList *OwnerList) { switch (R2_GLOBALS._sceneManager._previousScene) { case 50: case 180: - _object5.postInit(); - _object4.postInit(); + _wardrobeColorAnim.postInit(); + _wardrobeTopAnim.postInit(); _sceneMode = 104; - setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_object4, &_object5, NULL); + setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_wardrobeTopAnim, &_wardrobeColorAnim, NULL); break; case 125: _sceneMode = 100; @@ -331,14 +333,14 @@ void Scene100::signal() { _table.setStrip(2); _table.setFrame(3); - _object3.remove(); + _tableLocker.remove(); _stasisNegator.remove(); R2_GLOBALS._player.enableControl(); break; case 104: _sceneMode = 0; - _object5.remove(); - _object4.remove(); + _wardrobeColorAnim.remove(); + _wardrobeTopAnim.remove(); R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); R2_GLOBALS._player._numFrames = 10; @@ -387,7 +389,7 @@ void Scene100::dispatch() { SceneExt::dispatch(); if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) { - _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_object3, &_stasisNegator, NULL); + _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_tableLocker, &_stasisNegator, NULL); } } @@ -414,9 +416,9 @@ Scene125::Icon::Icon(): SceneActor() { void Scene125::Icon::postInit(SceneObjectList *OwnerList) { SceneObject::postInit(); - _object1.postInit(); - _object1.fixPriority(255); - _object1.hide(); + _glyph.postInit(); + _glyph.fixPriority(255); + _glyph.hide(); _sceneText1._color1 = 92; _sceneText1._color2 = 0; @@ -459,15 +461,15 @@ void Scene125::Icon::process(Event &event) { scene->_sound1.play(14); setFrame(2); - switch (_object1._strip) { + switch (_glyph._strip) { case 1: - _object1.setStrip(2); + _glyph.setStrip(2); break; case 3: - _object1.setStrip(4); + _glyph.setStrip(4); break; case 5: - _object1.setStrip(6); + _glyph.setStrip(6); break; default: break; @@ -486,15 +488,15 @@ void Scene125::Icon::process(Event &event) { if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { setFrame(1); - switch (_object1._strip) { + switch (_glyph._strip) { case 2: - _object1.setStrip(1); + _glyph.setStrip(1); break; case 4: - _object1.setStrip(3); + _glyph.setStrip(3); break; case 6: - _object1.setStrip(5); + _glyph.setStrip(5); break; default: break; @@ -518,8 +520,8 @@ void Scene125::Icon::setIcon(int id) { if (_lookLineNum) { showIcon(); - _object1.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1); - _object1.setPosition(_position); + _glyph.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1); + _glyph.setPosition(_position); _sceneText1._fontNumber = scene->_iconFontNumber; _sceneText1.setup(CONSOLE125_MESSAGES[id]); @@ -562,16 +564,16 @@ void Scene125::Icon::setIcon(int id) { void Scene125::Icon::showIcon() { _sceneText1.show(); _sceneText2.show(); - _object1.show(); - _object2.show(); + _glyph.show(); + _horizLine.show(); show(); } void Scene125::Icon::hideIcon() { _sceneText1.hide(); _sceneText2.hide(); - _object1.hide(); - _object2.hide(); + _glyph.hide(); + _horizLine.hide(); hide(); } @@ -666,28 +668,28 @@ void Scene125::signal() { case 2: _icon1.setup(160, 1, 1); _icon1.setPosition(Common::Point(65, 17)); - _icon1._object2.postInit(); - _icon1._object2.setup(160, 7, 1); - _icon1._object2.setPosition(Common::Point(106, 41)); + _icon1._horizLine.postInit(); + _icon1._horizLine.setup(160, 7, 1); + _icon1._horizLine.setPosition(Common::Point(106, 41)); _icon2.setup(160, 1, 1); _icon2.setPosition(Common::Point(80, 32)); - _icon2._object2.postInit(); - _icon2._object2.setup(160, 7, 2); - _icon2._object2.setPosition(Common::Point(106, 56)); + _icon2._horizLine.postInit(); + _icon2._horizLine.setup(160, 7, 2); + _icon2._horizLine.setPosition(Common::Point(106, 56)); _icon3.setup(160, 1, 1); _icon3.setPosition(Common::Point(65, 47)); - _icon3._object2.postInit(); - _icon3._object2.setup(160, 7, 1); - _icon3._object2.setPosition(Common::Point(106, 71)); + _icon3._horizLine.postInit(); + _icon3._horizLine.setup(160, 7, 1); + _icon3._horizLine.setPosition(Common::Point(106, 71)); _icon4.setup(160, 1, 1); _icon4.setPosition(Common::Point(80, 62)); _icon4._sceneRegionId = 5; - _icon4._object2.postInit(); - _icon4._object2.setup(160, 7, 2); - _icon4._object2.setPosition(Common::Point(106, 86)); + _icon4._horizLine.postInit(); + _icon4._horizLine.setup(160, 7, 2); + _icon4._horizLine.setPosition(Common::Point(106, 86)); _icon5.postInit(); _icon5.setup(160, 1, 1); @@ -710,16 +712,19 @@ void Scene125::signal() { case 12: _sceneMode = 129; - _object1.postInit(); - _object2.postInit(); - _object3.postInit(); + _starchart1.postInit(); + _starchart2.postInit(); + _starchart3.postInit(); if (R2_GLOBALS.getFlag(13)) { - _object4.postInit(); - setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_object1, &_object2, - &_object3, &_object4, NULL); + // Show starchart with Ringworld present + _starchart4.postInit(); + setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_starchart1, &_starchart2, + &_starchart3, &_starchart4, NULL); } else { - setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_object1, &_object2, &_object3, NULL); + // Show starchart without Ringworld + setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_starchart1, &_starchart2, + &_starchart3, NULL); } break; case 13: @@ -920,7 +925,7 @@ void Scene125::consoleAction(int id) { _icon4.setPosition(Common::Point(52, 107)); _icon4._sceneRegionId = 9; _icon4.setIcon(25); - _icon4._object2.hide(); + _icon4._horizLine.hide(); _icon6.setIcon(26); _sceneMode = 10; @@ -963,7 +968,7 @@ void Scene125::consoleAction(int id) { _icon4.setPosition(Common::Point(52, 107)); _icon4._sceneRegionId = 9; _icon4.setIcon(25); - _icon4._object2.hide(); + _icon4._horizLine.hide(); _icon6.setIcon(26); _sceneMode = 10; @@ -1047,7 +1052,7 @@ void Scene125::consoleAction(int id) { break; case 24: _icon4.setIcon(25); - _icon4._object2.hide(); + _icon4._horizLine.hide(); if (_consoleMode == 10) { setDetails(127, --_logIndex); @@ -1059,7 +1064,7 @@ void Scene125::consoleAction(int id) { break; case 25: _icon4.setIcon(25); - _icon4._object2.hide(); + _icon4._horizLine.hide(); if (_consoleMode == 10) { setDetails(127, ++_logIndex); @@ -1077,10 +1082,10 @@ void Scene125::consoleAction(int id) { _icon4.hideIcon(); R2_GLOBALS._player.hide(); - _object1.hide(); - _object2.hide(); - _object3.hide(); - _object4.hide(); + _starchart1.hide(); + _starchart2.hide(); + _starchart3.hide(); + _starchart4.hide(); _sceneMode = 11; _palette.loadPalette(160); @@ -1103,7 +1108,7 @@ void Scene125::consoleAction(int id) { _icon4.setPosition(Common::Point(52, 107)); _icon4._sceneRegionId = 9; _icon4.setIcon(25); - _icon4._object2.hide(); + _icon4._horizLine.hide(); _icon6.setIcon(26); _sceneMode = 10; @@ -1447,6 +1452,8 @@ void Scene160::synchronize(Serializer &s) { s.syncAsSint16LE(_frameNumber); s.syncAsSint16LE(_yChange); s.syncAsSint16LE(_lineNum); + + _creditsList.synchronize(s); } void Scene160::remove() { @@ -1501,11 +1508,9 @@ void Scene180::Action1::signal() { /*--------------------------------------------------------------------------*/ Scene180::Scene180(): SceneExt() { - _field412 = 0; + _helpDisabled = 0; _frameInc = 0; _frameNumber = R2_GLOBALS._events.getFrameNumber(); - _field480 = 1; - _field482 = -1; _fontNumber = R2_GLOBALS.gfxManager()._font._fontNumber; GfxFont font; @@ -1550,9 +1555,7 @@ void Scene180::synchronize(Serializer &s) { SceneExt::synchronize(s); s.syncAsSint16LE(_frameNumber); - s.syncAsSint16LE(_field412); - s.syncAsSint16LE(_field480); - s.syncAsSint16LE(_field482); + s.syncAsSint16LE(_helpDisabled); s.syncAsSint16LE(_frameInc); s.syncAsSint16LE(_fontNumber); s.syncAsSint16LE(_fontHeight); @@ -1567,7 +1570,7 @@ void Scene180::signal() { break; case 1: - _field412 = 1; + _helpDisabled = 1; R2_GLOBALS._sceneManager._hasPalette = true; _animationPlayer._paletteMode = ANIMPALMODE_NONE; _animationPlayer._isActive = true; @@ -1605,7 +1608,7 @@ void Scene180::signal() { case 30: case 43: case 47: - _field412 = 0; + _helpDisabled = 0; R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0); _palette.loadPalette(0); _palette.loadPalette(9998); @@ -1619,7 +1622,7 @@ void Scene180::signal() { R2_GLOBALS._scene180Mode = 2; _animationPlayer.load(2); - _field412 = 1; + _helpDisabled = 1; R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL); R2_GLOBALS._sound1.play(2); break; @@ -1656,7 +1659,7 @@ void Scene180::signal() { break; case 11: - _field412 = 1; + _helpDisabled = 1; _door.postInit(); _shipDisplay.postInit(); setAction(&_sequenceManager, this, 4000, &_door, &_shipDisplay, NULL); @@ -1703,21 +1706,21 @@ void Scene180::signal() { break; case 27: - _field412 = 0; + _helpDisabled = 0; _door.remove(); _shipDisplay.remove(); setSceneDelay(2); break; case 28: - _field412 = 0; + _helpDisabled = 0; _palette.loadPalette(0); _palette.loadPalette(9998); R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 100, this); break; case 29: - _field412 = 1; + _helpDisabled = 1; _animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE; _animationPlayer._isActive = true; _animationPlayer._objectMode = ANIMOBJMODE_42; @@ -1746,7 +1749,7 @@ void Scene180::signal() { break; case 32: - _field412 = 1; + _helpDisabled = 1; _teal.postInit(); _teal.setPosition(Common::Point(161, 97)); @@ -1796,7 +1799,7 @@ void Scene180::signal() { break; case 37: - _field412 = 0; + _helpDisabled = 0; _dutyOfficer.remove(); _palette.loadPalette(9998); R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this); @@ -1836,7 +1839,7 @@ void Scene180::signal() { break; case 41: - _field412 = 1; + _helpDisabled = 1; _animationPlayer._isActive = true; break; @@ -1856,12 +1859,12 @@ void Scene180::signal() { break; case 45: - _field412 = 1; + _helpDisabled = 1; _stripManager.start(28, this); break; case 48: - _field412 = 1; + _helpDisabled = 1; _animationPlayer._paletteMode = ANIMPALMODE_NONE; _animationPlayer._isActive = true; _animationPlayer._objectMode = ANIMOBJMODE_1; @@ -1884,7 +1887,7 @@ void Scene180::signal() { case 50: R2_GLOBALS._scene180Mode = 0; - _field412 = 0; + _helpDisabled = 0; // WORKAROUND: The original changed to scene 100 here, Quinn's Bedroom, // but instead we're changing to the previously unused scene 50, which shows @@ -1902,10 +1905,9 @@ void Scene180::setSceneDelay(int v) { void Scene180::process(Event &event) { if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { event.handled = 1; - if (!_field412) { - if (R2_GLOBALS._scenePalette._listeners.size() == 0) { + if (!_helpDisabled) { + if (R2_GLOBALS._scenePalette._listeners.size() == 0) HelpDialog::show(); - } } } @@ -2352,13 +2354,21 @@ Scene205::Scene205(): SceneExt() { GfxFont font; font.setFontNumber(4); _fontHeight = font.getHeight(); + + for (int i = 0; i < 3; i++) { + _starList1[i] = nullptr; + _starList2[i] = nullptr; + } + + for (int i = 0; i < 4; i++) + _starList3[i] = nullptr; } void Scene205::postInit(SceneObjectList *OwnerList) { loadScene(4000); R2_GLOBALS._uiElements._active = false; SceneExt::postInit(); - BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; R2_GLOBALS._player._uiEnabled = false; R2_GLOBALS._sound1.play(337); @@ -2373,11 +2383,11 @@ void Scene205::synchronize(Serializer &s) { SceneExt::synchronize(s); for (int idx = 0; idx < 3; ++idx) - SYNC_POINTER(_objList1[idx]); + SYNC_POINTER(_starList1[idx]); for (int idx = 0; idx < 3; ++idx) - SYNC_POINTER(_objList2[idx]); + SYNC_POINTER(_starList2[idx]); for (int idx = 0; idx < 4; ++idx) - SYNC_POINTER(_objList3[idx]); + SYNC_POINTER(_starList3[idx]); s.syncAsSint16LE(_textIndex); s.syncAsSint16LE(_lineNum); @@ -2399,9 +2409,9 @@ void Scene205::process(Event &event) { } void Scene205::dispatch() { - processList(_objList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100); - processList(_objList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100); - processList(_objList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100); + processList(_starList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100); + processList(_starList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100); + processList(_starList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100); Scene::dispatch(); } @@ -2413,10 +2423,10 @@ void Scene205::setup() { Common::Point(140, 149), Common::Point(91, 166), Common::Point(299, 46), Common::Point(314, 10) }; - // Set up the first object list + // Set up the first star list for (int idx = 0; idx < 3; ++idx) { - Object *obj = new Object(); - _objList1[idx] = obj; + Star *obj = new Star(); + _starList1[idx] = obj; obj->postInit(); obj->_flags |= OBJFLAG_CLONED; @@ -2429,10 +2439,10 @@ void Scene205::setup() { obj->fixPriority(12); } - // Setup the second object list + // Setup the second star list for (int idx = 0; idx < 3; ++idx) { - Object *obj = new Object(); - _objList2[idx] = obj; + Star *obj = new Star(); + _starList2[idx] = obj; obj->postInit(); obj->_flags |= OBJFLAG_CLONED; @@ -2445,10 +2455,10 @@ void Scene205::setup() { obj->fixPriority(11); } - // Setup the third object list + // Setup the third star list for (int idx = 0; idx < 4; ++idx) { - Object *obj = new Object(); - _objList3[idx] = obj; + Star *obj = new Star(); + _starList3[idx] = obj; obj->postInit(); obj->_flags |= OBJFLAG_CLONED; @@ -2465,10 +2475,10 @@ void Scene205::setup() { /** * Handles moving a group of stars in the scene background */ -void Scene205::processList(Object **ObjList, int count, const Common::Rect &bounds, +void Scene205::processList(Star **ObjList, int count, const Common::Rect &bounds, int xMultiply, int yMultiply, int xCenter, int yCenter) { for (int idx = 0; idx < count; ++idx) { - Object *obj = ObjList[idx]; + Star *obj = ObjList[idx]; Common::Point pt(obj->_position.x - xCenter, obj->_position.y - yCenter); if ((obj->_position.x <= 319) && (obj->_position.x >= 0) && @@ -2621,7 +2631,7 @@ void Scene250::postInit(SceneObjectList *OwnerList) { loadScene(250); R2_GLOBALS._uiElements._active = false; SceneExt::postInit(); - BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; R2_GLOBALS._player.postInit(); R2_GLOBALS._player.setVisage(10); @@ -3765,9 +3775,9 @@ Scene325::Icon::Icon(): SceneActor() { void Scene325::Icon::postInit(SceneObjectList *OwnerList) { SceneObject::postInit(); - _object1.postInit(); - _object1.fixPriority(21); - _object1.hide(); + _glyph.postInit(); + _glyph.fixPriority(21); + _glyph.hide(); _sceneText1._color1 = 92; _sceneText1._color2 = 0; @@ -3806,18 +3816,18 @@ void Scene325::Icon::process(Event &event) { scene->_sound1.play(14); setFrame(2); - switch (_object1._strip) { + switch (_glyph._strip) { case 1: - _object1.setStrip(2); + _glyph.setStrip(2); break; case 3: - _object1.setStrip(4); + _glyph.setStrip(4); break; case 5: - _object1.setStrip(6); + _glyph.setStrip(6); break; case 7: - _object1.setStrip(8); + _glyph.setStrip(8); break; default: break; @@ -3836,15 +3846,15 @@ void Scene325::Icon::process(Event &event) { if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { setFrame(1); - switch (_object1._strip) { + switch (_glyph._strip) { case 2: - _object1.setStrip(1); + _glyph.setStrip(1); break; case 4: - _object1.setStrip(3); + _glyph.setStrip(3); break; case 6: - _object1.setStrip(5); + _glyph.setStrip(5); break; default: break; @@ -3868,8 +3878,8 @@ void Scene325::Icon::setIcon(int id) { if (_lookLineNum) { showIcon(); - _object1.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1); - _object1.setPosition(_position); + _glyph.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1); + _glyph.setPosition(_position); _sceneText1._fontNumber = scene->_iconFontNumber; _sceneText1.setup(CONSOLE325_MESSAGES[id]); @@ -3910,26 +3920,26 @@ void Scene325::Icon::setIcon(int id) { void Scene325::Icon::showIcon() { _sceneText1.show(); _sceneText2.show(); - _object1.show(); - _object2.show(); + _glyph.show(); + _horizLine.show(); show(); } void Scene325::Icon::hideIcon() { _sceneText1.hide(); _sceneText2.hide(); - _object1.hide(); - _object2.hide(); + _glyph.hide(); + _horizLine.hide(); hide(); } /*--------------------------------------------------------------------------*/ Scene325::Scene325(): SceneExt() { - _field412 = 7; + _consoleAction = 7; _iconFontNumber = 50; - _field416 = _field418 = 0; - _field41A = _field41C = _field41E = _scannerLocation = 0; + _databasePage = _priorConsoleAction = 0; + _moveCounter = _yChange = _yDirection = _scannerLocation = 0; _soundCount = _soundIndex = 0; for (int idx = 0; idx < 10; ++idx) @@ -3957,13 +3967,13 @@ void Scene325::postInit(SceneObjectList *OwnerList) { void Scene325::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_field412); + s.syncAsSint16LE(_consoleAction); s.syncAsSint16LE(_iconFontNumber); - s.syncAsSint16LE(_field416); - s.syncAsSint16LE(_field418); - s.syncAsSint16LE(_field41A); - s.syncAsSint16LE(_field41C); - s.syncAsSint16LE(_field41E); + s.syncAsSint16LE(_databasePage); + s.syncAsSint16LE(_priorConsoleAction); + s.syncAsSint16LE(_moveCounter); + s.syncAsSint16LE(_yChange); + s.syncAsSint16LE(_yDirection); s.syncAsSint16LE(_scannerLocation); s.syncAsSint16LE(_soundCount); s.syncAsSint16LE(_soundIndex); @@ -3996,28 +4006,28 @@ void Scene325::signal() { case 1: _icon1.setup(160, 1, 1); _icon1.setPosition(Common::Point(65, 17)); - _icon1._object2.postInit(); - _icon1._object2.setup(160, 7, 1); - _icon1._object2.setPosition(Common::Point(106, 41)); + _icon1._horizLine.postInit(); + _icon1._horizLine.setup(160, 7, 1); + _icon1._horizLine.setPosition(Common::Point(106, 41)); _icon2.setup(160, 1, 1); _icon2.setPosition(Common::Point(80, 32)); - _icon2._object2.postInit(); - _icon2._object2.setup(160, 7, 2); - _icon2._object2.setPosition(Common::Point(106, 56)); + _icon2._horizLine.postInit(); + _icon2._horizLine.setup(160, 7, 2); + _icon2._horizLine.setPosition(Common::Point(106, 56)); _icon3.setup(160, 1, 1); _icon3.setPosition(Common::Point(65, 47)); - _icon3._object2.postInit(); - _icon3._object2.setup(160, 7, 1); - _icon3._object2.setPosition(Common::Point(106, 71)); + _icon3._horizLine.postInit(); + _icon3._horizLine.setup(160, 7, 1); + _icon3._horizLine.setPosition(Common::Point(106, 71)); _icon4.setup(160, 1, 1); _icon4.setPosition(Common::Point(80, 62)); _icon4._sceneRegionId = 5; - _icon4._object2.postInit(); - _icon4._object2.setup(160, 7, 2); - _icon4._object2.setPosition(Common::Point(106, 86)); + _icon4._horizLine.postInit(); + _icon4._horizLine.setup(160, 7, 2); + _icon4._horizLine.setPosition(Common::Point(106, 86)); _icon5.postInit(); _icon5.setup(160, 1, 1); @@ -4036,29 +4046,33 @@ void Scene325::signal() { R2_GLOBALS._player._canWalk = false; break; case 9: - switch (_field412) { + // Fade to black for console sub-section: database, or starchart + switch (_consoleAction) { case 3: + // Starchart _sceneMode = 129; - _object1.postInit(); - _object2.postInit(); - _object3.postInit(); + _starGrid1.postInit(); + _starGrid2.postInit(); + _starGrid3.postInit(); if (R2_GLOBALS.getFlag(13)) { - _object4.postInit(); - setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_object1, - &_object2, &_object3, &_object4, NULL); + // Show starchart with Ringworld present + _starGrid4.postInit(); + setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_starGrid1, + &_starGrid2, &_starGrid3, &_starGrid4, NULL); } else { - setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_object1, - &_object2, &_object3, NULL); + // Show starchart without Ringworld + setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_starGrid1, + &_starGrid2, &_starGrid3, NULL); } break; case 17: case 18: case 19: case 20: { - int v = 10 - ((21 - _field412) * 2); + int v = 10 - ((21 - _consoleAction) * 2); if (R2_GLOBALS.getFlag(50)) --v; - if (_field418 == 5) + if (_priorConsoleAction == 5) v += 8; if (R2_GLOBALS.getFlag(51) && (v == 2)) R2_GLOBALS.setFlag(57); @@ -4069,70 +4083,70 @@ void Scene325::signal() { } else { _scannerLocation = 864; - _object12.postInit(); - _object12.setup(326, 4, 1); - _object12.setPosition(Common::Point(149, 128)); - _object12.fixPriority(20); - - _scannerTab.postInit(); - _scannerTab.setup(326, 4, 2); - _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR))); - _scannerTab.fixPriority(21); - - _object10.postInit(); - _object10.setup(326, 1, 1); - _object10.setPosition(Common::Point(210, 20)); - _object10.fixPriority(10); - - _object1.postInit(); - _object1.setup(326, 1, 1); - _object1.setPosition(Common::Point(210, 32)); - _object1.fixPriority(10); - - _object2.postInit(); - _object2.setup(326, 1, 1); - _object2.setPosition(Common::Point(210, 44)); - _object2.fixPriority(10); - - _object3.postInit(); - _object3.setup(326, 1, 1); - _object3.setPosition(Common::Point(210, 56)); - _object3.fixPriority(10); - - _object4.postInit(); - _object4.setup(326, 1, 1); - _object4.setPosition(Common::Point(210, 68)); - _object4.fixPriority(10); - - _object5.postInit(); - _object5.setup(326, 1, 1); - _object5.setPosition(Common::Point(210, 80)); - _object5.fixPriority(10); - - _object6.postInit(); - _object6.setup(326, 1, 1); - _object6.setPosition(Common::Point(210, 92)); - _object6.fixPriority(10); - - _object7.postInit(); - _object7.setup(326, 1, 1); - _object7.setPosition(Common::Point(210, 104)); - _object7.fixPriority(10); - - _object8.postInit(); - _object8.setup(326, 1, 1); - _object8.setPosition(Common::Point(210, 116)); - _object8.fixPriority(10); - - _object9.postInit(); - _object9.setup(326, 1, 1); - _object9.setPosition(Common::Point(210, 128)); - _object9.fixPriority(10); - - _object11.postInit(); - _object11.setup(326, 1, 1); - _object11.setPosition(Common::Point(210, 150)); - _object11.fixPriority(10); + _starGrid12.postInit(); + _starGrid12.setup(326, 4, 1); + _starGrid12.setPosition(Common::Point(149, 128)); + _starGrid12.fixPriority(20); + + _starGrid13.postInit(); + _starGrid13.setup(326, 4, 2); + _starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR))); + _starGrid13.fixPriority(21); + + _starGrid10.postInit(); + _starGrid10.setup(326, 1, 1); + _starGrid10.setPosition(Common::Point(210, 20)); + _starGrid10.fixPriority(10); + + _starGrid1.postInit(); + _starGrid1.setup(326, 1, 1); + _starGrid1.setPosition(Common::Point(210, 32)); + _starGrid1.fixPriority(10); + + _starGrid2.postInit(); + _starGrid2.setup(326, 1, 1); + _starGrid2.setPosition(Common::Point(210, 44)); + _starGrid2.fixPriority(10); + + _starGrid3.postInit(); + _starGrid3.setup(326, 1, 1); + _starGrid3.setPosition(Common::Point(210, 56)); + _starGrid3.fixPriority(10); + + _starGrid4.postInit(); + _starGrid4.setup(326, 1, 1); + _starGrid4.setPosition(Common::Point(210, 68)); + _starGrid4.fixPriority(10); + + _starGrid5.postInit(); + _starGrid5.setup(326, 1, 1); + _starGrid5.setPosition(Common::Point(210, 80)); + _starGrid5.fixPriority(10); + + _starGrid6.postInit(); + _starGrid6.setup(326, 1, 1); + _starGrid6.setPosition(Common::Point(210, 92)); + _starGrid6.fixPriority(10); + + _starGrid7.postInit(); + _starGrid7.setup(326, 1, 1); + _starGrid7.setPosition(Common::Point(210, 104)); + _starGrid7.fixPriority(10); + + _starGrid8.postInit(); + _starGrid8.setup(326, 1, 1); + _starGrid8.setPosition(Common::Point(210, 116)); + _starGrid8.fixPriority(10); + + _starGrid9.postInit(); + _starGrid9.setup(326, 1, 1); + _starGrid9.setPosition(Common::Point(210, 128)); + _starGrid9.fixPriority(10); + + _starGrid11.postInit(); + _starGrid11.setup(326, 1, 1); + _starGrid11.setPosition(Common::Point(210, 150)); + _starGrid11.fixPriority(10); } } else if (R2_GLOBALS.getFlag(51)) { setMessage(329, (v == 12) ? 10 : v); @@ -4144,41 +4158,42 @@ void Scene325::signal() { case 21: _sceneMode = 129; - _object1.postInit(); - _object1.setup(327, 1, 1); - _object1.setPosition(Common::Point(170, 80)); - _object1.fixPriority(10); - _object1.animate(ANIM_MODE_5, NULL); + _starGrid1.postInit(); + _starGrid1.setup(327, 1, 1); + _starGrid1.setPosition(Common::Point(170, 80)); + _starGrid1.fixPriority(10); + _starGrid1.animate(ANIM_MODE_5, NULL); break; case 22: _sceneMode = 129; - _object1.postInit(); - _object1.setup(327, 2, 1); - _object1.setPosition(Common::Point(160, 80)); - _object1.fixPriority(10); - _object1.animate(ANIM_MODE_5, NULL); + _starGrid1.postInit(); + _starGrid1.setup(327, 2, 1); + _starGrid1.setPosition(Common::Point(160, 80)); + _starGrid1.fixPriority(10); + _starGrid1.animate(ANIM_MODE_5, NULL); break; case 24: R2_GLOBALS._player.enableControl(); R2_GLOBALS._player._canWalk = false; - _field416 = 37; - setMessage(128, _field416); + _databasePage = 37; + setMessage(128, _databasePage); break; case 25: R2_GLOBALS._player.enableControl(); R2_GLOBALS._player._canWalk = false; - _field416 = 68; - setMessage(128, _field416); + _databasePage = 68; + setMessage(128, _databasePage); break; case 26: R2_GLOBALS._player.enableControl(); R2_GLOBALS._player._canWalk = false; - _field416 = 105; - setMessage(128, _field416); + _databasePage = 105; + setMessage(128, _databasePage); break; default: - _field416 = 0; + _databasePage = 0; + setMessage(128, _databasePage); break; } @@ -4189,7 +4204,7 @@ void Scene325::signal() { R2_GLOBALS._player.enableControl(); R2_GLOBALS._player._canWalk = false; - if ((_field412 >= 17) && (_field412 <= 20)) { + if ((_consoleAction >= 17) && (_consoleAction <= 20)) { _icon5.setIcon(8); consoleAction(4); } else { @@ -4240,7 +4255,7 @@ void Scene325::consoleAction(int id) { if (id == 7) _icon5.setIcon(9); - else if ((_field412 != 3) && ((_field412 < 17) || (_field412 > 26))) + else if ((_consoleAction != 3) && ((_consoleAction < 17) || (_consoleAction > 26))) _icon5.setIcon(8); switch (id - 1) { @@ -4249,10 +4264,12 @@ void Scene325::consoleAction(int id) { _icon2.setIcon(11); break; case 1: + // Database screen _icon1.setIcon(23); _icon2.setIcon(24); _icon3.setIcon(25); _icon4.setIcon(26); + break; case 2: case 16: case 17: @@ -4266,13 +4283,13 @@ void Scene325::consoleAction(int id) { _icon2.hideIcon(); _icon3.hideIcon(); - if (id == 2 || (id == 19 && _field418 == 5 && R2_GLOBALS.getFlag(50) && + if (id == 2 || (id == 19 && _priorConsoleAction == 5 && R2_GLOBALS.getFlag(50) && R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51))) { _icon5.setIcon(13); _icon4.setPosition(Common::Point(52, 107)); _icon4._sceneRegionId = 9; _icon4.setIcon(14); - _icon4._object2.hide(); + _icon4._horizLine.hide(); } else { _icon4.hideIcon(); @@ -4282,16 +4299,17 @@ void Scene325::consoleAction(int id) { _icon6.setIcon(12); _sceneMode = 10; _palette.loadPalette(161); - BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); + R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); break; case 22: case 23: case 24: case 25: + // Database sub-sections: A-G, N-O, P-S, T-Z R2_GLOBALS._player.disableControl(); consoleAction(2); - _field412 = id; + _consoleAction = id; _icon1.hideIcon(); _icon2.hideIcon(); _icon3.hideIcon(); @@ -4301,12 +4319,12 @@ void Scene325::consoleAction(int id) { _icon4.setPosition(Common::Point(52, 107)); _icon4._sceneRegionId = 9; _icon4.setIcon(14); - _icon4._object2.hide(); + _icon4._horizLine.hide(); _icon6.setIcon(12); _sceneMode = 10; _palette.loadPalette(161); - BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); + R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); break; case 11: @@ -4324,24 +4342,25 @@ void Scene325::consoleAction(int id) { _icon4._sceneRegionId = 5; _icon4.hideIcon(); - _object12.remove(); - _scannerTab.remove(); - _object10.remove(); - _object1.remove(); - _object2.remove(); - _object3.remove(); - _object4.remove(); - _object5.remove(); - _object6.remove(); - _object7.remove(); - _object8.remove(); - _object9.remove(); - _object11.remove(); + R2_GLOBALS._player.hide(); + _starGrid1.remove(); + _starGrid2.remove(); + _starGrid3.remove(); + _starGrid4.remove(); + _starGrid5.remove(); + _starGrid6.remove(); + _starGrid7.remove(); + _starGrid8.remove(); + _starGrid9.remove(); + _starGrid10.remove(); + _starGrid11.remove(); + _starGrid12.remove(); + _starGrid13.remove(); _palette.loadPalette(160); _sceneMode = 11; - BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); + R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); } break; @@ -4352,58 +4371,66 @@ void Scene325::consoleAction(int id) { break; case 4: case 5: - _field418 = id; + _priorConsoleAction = id; _icon1.setIcon(17); _icon2.setIcon(18); _icon3.setIcon(19); _icon4.setIcon(20); break; case 7: - consoleAction(((_field412 == 5) || (_field412 == 6) || (_field412 == 15)) ? 4 : 7); + consoleAction(((_consoleAction == 5) || (_consoleAction == 6) || (_consoleAction == 15)) ? 4 : 7); break; case 8: R2_GLOBALS._sceneManager.changeScene(300); + break; case 9: case 10: + // Set language: Interworld or Hero's Tongue _iconFontNumber = (id - 1) == 9 ? 50 : 52; _text1.remove(); _icon6.setIcon(7); + consoleAction(1); break; case 12: + // Page up button _icon4.setIcon(14); - _icon4._object2.hide(); + _icon4._horizLine.hide(); - switch (_field412) { + switch (_consoleAction) { case 17: case 18: case 19: case 20: if (_scannerLocation) { R2_GLOBALS._player.disableControl(); - _field41A = 1296; - _field41E = 1; + _moveCounter = 1296; + _yDirection = 1; } break; default: - setMessage(128, --_field416); + setMessage(128, --_databasePage); break; } return; case 13: + // Page down button _icon4.setIcon(14); - _icon4._object2.hide(); + _icon4._horizLine.hide(); - switch (_field412) { + switch (_consoleAction) { case 17: case 18: case 19: case 20: if (_scannerLocation < 1620) { R2_GLOBALS._player.disableControl(); - _field41A = 1296; - _field41E = -1; + _moveCounter = 1296; + _yDirection = -1; } break; + default: + setMessage(128, ++_databasePage); + break; } return; case 14: @@ -4422,6 +4449,7 @@ void Scene325::consoleAction(int id) { break; case 6: default: + // Initial starting screen _icon1.setIcon(1); _icon2.setIcon(2); _icon3.setIcon(3); @@ -4431,7 +4459,7 @@ void Scene325::consoleAction(int id) { } if (id != 8) - _field412 = id; + _consoleAction = id; } void Scene325::process(Event &event) { @@ -4448,48 +4476,48 @@ void Scene325::process(Event &event) { } void Scene325::dispatch() { - if (_field41A) { - switch (_field41A) { + if (_moveCounter) { + switch (_moveCounter) { case 13: - _field41C = 1; + _yChange = 1; break; case 1296: R2_GLOBALS._sound3.play(87); - _field41C = 1; + _yChange = 1; break; case 33: case 1283: - _field41C = 2; + _yChange = 2; break; case 63: case 1263: - _field41C = 3; + _yChange = 3; break; case 103: case 1233: - _field41C = 4; + _yChange = 4; break; case 153: case 1193: - _field41C = 5; + _yChange = 5; break; case 213: case 1143: - _field41C = 6; + _yChange = 6; break; case 283: case 1083: - _field41C = 7; + _yChange = 7; break; case 1013: - _field41C = 8; + _yChange = 8; break; default: break; } - _field41A -= _field41C; - int yp = _field41E * _field41C + _object10._position.y; + _moveCounter -= _yChange; + int yp = _yDirection * _yChange + _starGrid10._position.y; bool flag = false; if (yp >= 30) { @@ -4502,51 +4530,51 @@ void Scene325::dispatch() { ++_scannerLocation; flag = true; } - _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR))); + _starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR))); for (int idx = 0; idx < 4; ++idx) _objList[idx].remove(); if (flag) { int v = _scannerLocation - 758; - _object10.setFrame((v++ <= 0) ? 1 : v); - _object1.setFrame((v++ <= 0) ? 1 : v); - _object2.setFrame((v++ <= 0) ? 1 : v); - _object3.setFrame((v++ <= 0) ? 1 : v); - _object4.setFrame((v++ <= 0) ? 1 : v); - _object5.setFrame((v++ <= 0) ? 1 : v); - _object6.setFrame((v++ <= 0) ? 1 : v); - _object7.setFrame((v++ <= 0) ? 1 : v); - _object8.setFrame((v++ <= 0) ? 1 : v); - _object9.setFrame((v++ <= 0) ? 1 : v); - _object11.setFrame((v++ <= 0) ? 1 : v); + _starGrid10.setFrame((v++ <= 0) ? 1 : v); + _starGrid1.setFrame((v++ <= 0) ? 1 : v); + _starGrid2.setFrame((v++ <= 0) ? 1 : v); + _starGrid3.setFrame((v++ <= 0) ? 1 : v); + _starGrid4.setFrame((v++ <= 0) ? 1 : v); + _starGrid5.setFrame((v++ <= 0) ? 1 : v); + _starGrid6.setFrame((v++ <= 0) ? 1 : v); + _starGrid7.setFrame((v++ <= 0) ? 1 : v); + _starGrid8.setFrame((v++ <= 0) ? 1 : v); + _starGrid9.setFrame((v++ <= 0) ? 1 : v); + _starGrid11.setFrame((v++ <= 0) ? 1 : v); } - _object10.setPosition(Common::Point(210, yp)); + _starGrid10.setPosition(Common::Point(210, yp)); yp += 12; - _object1.setPosition(Common::Point(210, yp)); + _starGrid1.setPosition(Common::Point(210, yp)); yp += 12; - _object2.setPosition(Common::Point(210, yp)); + _starGrid2.setPosition(Common::Point(210, yp)); yp += 12; - _object3.setPosition(Common::Point(210, yp)); + _starGrid3.setPosition(Common::Point(210, yp)); yp += 12; - _object4.setPosition(Common::Point(210, yp)); + _starGrid4.setPosition(Common::Point(210, yp)); yp += 12; - _object5.setPosition(Common::Point(210, yp)); + _starGrid5.setPosition(Common::Point(210, yp)); yp += 12; - _object6.setPosition(Common::Point(210, yp)); + _starGrid6.setPosition(Common::Point(210, yp)); yp += 12; - _object7.setPosition(Common::Point(210, yp)); + _starGrid7.setPosition(Common::Point(210, yp)); yp += 12; - _object8.setPosition(Common::Point(210, yp)); + _starGrid8.setPosition(Common::Point(210, yp)); yp += 12; - _object9.setPosition(Common::Point(210, yp)); + _starGrid9.setPosition(Common::Point(210, yp)); yp += 12; - _object11.setPosition(Common::Point(210, yp)); + _starGrid11.setPosition(Common::Point(210, yp)); - if (!_field41A) { + if (!_moveCounter) { R2_GLOBALS._sound3.stop(); - _field41C = 0; + _yChange = 0; if (_scannerLocation == 756) { R2_GLOBALS._player.disableControl(); @@ -4564,9 +4592,11 @@ void Scene325::dispatch() { } void Scene325::setMessage(int resNum, int lineNum) { - Common::String msg = g_resourceManager->getMessage(resNum, lineNum); + removeText(); + Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true); if (!msg.empty()) { + // Found valid database entry to display Common::String msgText = parseMessage(msg); _text1._fontNumber = _iconFontNumber; @@ -4584,7 +4614,9 @@ void Scene325::setMessage(int resNum, int lineNum) { R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this); } } else { - _field412 = 13; + // No message for given database index, so we must have passed beyond + // the start or end of the database + _consoleAction = 13; R2_GLOBALS._player.disableControl(); R2_GLOBALS._player.hide(); @@ -4594,7 +4626,7 @@ void Scene325::setMessage(int resNum, int lineNum) { _palette.loadPalette(160); _sceneMode = 11; - BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); + R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this); } } @@ -4616,6 +4648,7 @@ Common::String Scene325::parseMessage(const Common::String &msg) { return Common::String(msgP); } + /*-------------------------------------------------------------------------- * Scene 400 - Science Lab * @@ -5135,7 +5168,7 @@ void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber, } void Scene500::PanelDialog::remove() { - Scene500 *scene = (Scene500 *)BF_GLOBALS._sceneManager._scene; + Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene; scene->_sceneAreas.remove(&_button1); scene->_sceneAreas.remove(&_button2); scene->_sceneAreas.remove(&_button3); @@ -5180,7 +5213,7 @@ void Scene500::PanelDialog::Button::setupButton(int buttonId) { break; } - Scene500 *scene = (Scene500 *)BF_GLOBALS._sceneManager._scene; + Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene; scene->_sceneAreas.push_front(this); } @@ -6969,7 +7002,7 @@ void Scene825::postInit(SceneObjectList *OwnerList) { loadScene(825); R2_GLOBALS._uiElements._active = false; SceneExt::postInit(); - BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; R2_GLOBALS._player.postInit(); R2_GLOBALS._player._effect = 0; diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h index fe42f1e33e..00c2bb3961 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.h +++ b/engines/tsage/ringworld2/ringworld2_scenes0.h @@ -85,7 +85,7 @@ class Scene100: public SceneExt { public: NamedHotspot _background, _duct, _bed, _desk; Terminal _terminal; - SceneActor _bedLights1, _bedLights2, _object3, _object4, _object5; + SceneActor _bedLights1, _bedLights2, _tableLocker, _wardrobeTopAnim, _wardrobeColorAnim; SceneActor _wardrobe; Door _door; Table _table; @@ -111,7 +111,7 @@ class Scene125: public SceneExt { public: int _lookLineNum, _iconId; bool _pressed; - SceneObject _object1, _object2; + SceneObject _glyph, _horizLine; SceneText _sceneText1, _sceneText2; Icon(); @@ -136,7 +136,8 @@ public: ASoundExt _sound1; NamedHotspot _background, _item2, _item3; DiskSlot _diskSlot; - SceneActor _object1, _object2, _object3, _object4, _food, _foodDispenser, _infoDisk; + SceneActor _starchart1, _starchart2, _starchart3, _starchart4; + SceneActor _food, _foodDispenser, _infoDisk; Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6; SequenceManager _sequenceManager; SceneText _sceneText; @@ -175,7 +176,6 @@ public: ASound _sound1; Action1 _action1; int _frameNumber, _yChange; - SceneObject _object1, _object2, _object3; int _lineNum; SynchronizedList<SceneText *> _creditsList; public: @@ -210,10 +210,9 @@ public: ASoundExt _sound1; int _frameNumber; - int _field412, _field480; - int _field482, _frameInc; + int _helpDisabled; + int _frameInc; int _fontNumber, _fontHeight; - int _scene180Mode; public: Scene180(); @@ -263,6 +262,13 @@ public: virtual void signal(); }; +class Star: public SceneObject { +public: + int _x100, _y100; +public: + virtual Common::String getClassName() { return "Scene205_Star"; } +}; + class Scene205: public SceneExt { /* Actions */ class Action1: public Action { @@ -271,26 +277,18 @@ class Scene205: public SceneExt { public: virtual void signal(); }; - - /* Objects */ - class Object: public SceneObject { - public: - int _x100, _y100; - public: - // TODO: Check if this derives from DataManager? and flesh out - }; private: void setup(); - void processList(Object **ObjList, int count, const Common::Rect &bounds, + void processList(Star **ObjList, int count, const Common::Rect &bounds, int xMultiply, int yMultiply, int xCenter, int yCenter); void handleText(); public: AnimationPlayer _animationPlayer; int _fontHeight; SceneText _textList[15]; - Object *_objList1[3]; - Object *_objList2[3]; - Object *_objList3[4]; + Star *_starList1[3]; + Star *_starList2[3]; + Star *_starList3[4]; ASound _sound1; Action1 _action1; int _yp; @@ -430,7 +428,7 @@ class Scene325: public SceneExt { public: int _lookLineNum, _iconId; bool _pressed; - SceneObject _object1, _object2; + SceneObject _glyph, _horizLine; SceneText _sceneText1, _sceneText2; Icon(); @@ -450,16 +448,17 @@ private: void setMessage(int resNum, int lineNum); Common::String parseMessage(const Common::String &msg); public: - int _field412, _iconFontNumber, _field416, _field418; - int _field41A, _field41C, _field41E, _scannerLocation; + int _consoleAction, _iconFontNumber, _databasePage, _priorConsoleAction; + int _moveCounter, _yChange, _yDirection, _scannerLocation; int _soundCount, _soundIndex; int _soundQueue[10]; SpeakerQuinn _quinnSpeaker; ScenePalette _palette; SceneHotspot _background, _terminal; - SceneObject _object1, _object2, _object3, _object4, _object5; - SceneObject _object6, _object7, _object8, _object9, _object10; - SceneObject _object11, _object12, _scannerTab; + SceneObject _starGrid1, _starGrid2, _starGrid3; // Both starchart & scan grid objects + SceneObject _starGrid4, _starGrid5, _starGrid6, _starGrid7; + SceneObject _starGrid8, _starGrid9, _starGrid10, _starGrid11; + SceneObject _starGrid12, _starGrid13; SceneObject _objList[4]; Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6; ASoundExt _sound1; @@ -628,7 +627,6 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); - }; class Scene600 : public SceneExt { diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index a57395b9f6..e9dcb9b586 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -1896,6 +1896,7 @@ void Scene1200::process(Event &event) { SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999); break; } + break; case 33: R2_GLOBALS._sceneManager.changeScene(3245); break; @@ -2242,6 +2243,11 @@ Scene1337::Scene1337() { _field424A = 0; _field424C = 0; _field424E = 0; + + _unkFctPtr412 = nullptr; + _field3EF0 = nullptr; + _field3EF4 = nullptr; + _field3EF8 = nullptr; } void Scene1337::synchronize(Serializer &s) { @@ -4947,7 +4953,7 @@ void Scene1337::subC2C2F() { if (!found) { for (int i = 0; i <= 7; i++) { - if ((_arrunkObj1337[3]._arr2[i]._field34 == 1) && (!subC2687(_arrunkObj1337[3]._arr3[i]._field34))) { + if ((_arrunkObj1337[3]._arr2[i]._field34 == 1) && (!subC2687(_arrunkObj1337[3]._arr3[0]._field34))) { int tmpVal = 0; for (int j = 0; j <= 7; j++) { @@ -7904,7 +7910,6 @@ void Scene1550::signal() { // No break on purpose case 7: _field412 = 0; - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); break; case 20: @@ -8262,8 +8267,11 @@ void Scene1550::dispatch() { if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) { R2_GLOBALS._player._shade = 0; - // Original game contains a switch based on an uninitialized variable. - // Until we understand what should really happen there, this code is unused on purpose + + // NOTE: Original game contains a switch based on an uninitialized variable. + // We're leaving this code here, but ifdef'ed out, in case we can ever figure out + // what the original programmers intended the value to come from +#if 0 int missingVariable = 0; switch (missingVariable) { case 144: @@ -8285,6 +8293,7 @@ void Scene1550::dispatch() { default: break; } +#endif } if (_field412 != 0) @@ -9289,178 +9298,207 @@ void Scene1550::enterArea() { } /*-------------------------------------------------------------------------- - * Scene 1575 - + * Scene 1575 - Spaceport - unused ship scene * *--------------------------------------------------------------------------*/ -Scene1575::Scene1575() { - _field412 = 0; - _field414 = 0; - _field416 = 0; - _field418 = 0; - _field41A = 0; +Scene1575::Button::Button() { + _buttonId = 0; + _pressed = false; } -void Scene1575::synchronize(Serializer &s) { - SceneExt::synchronize(s); +void Scene1575::Button::synchronize(Serializer &s) { + NamedHotspot::synchronize(s); - s.syncAsSint16LE(_field412); - s.syncAsSint16LE(_field414); - s.syncAsSint16LE(_field416); - s.syncAsSint16LE(_field418); - s.syncAsSint16LE(_field41A); + s.syncAsSint16LE(_buttonId); + s.syncAsSint16LE(_pressed); } -Scene1575::Hotspot1::Hotspot1() { - _field34 = 0; - _field36 = 0; -} +void Scene1575::Button::process(Event &event) { + Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene; + bool isInBounds = _bounds.contains(event.mousePos); + CursorType cursor = R2_GLOBALS._events.getCursor(); -void Scene1575::Hotspot1::synchronize(Serializer &s) { - NamedHotspot::synchronize(s); + if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) || + (_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) { + // Button pressed + _pressed = true; + Common::Point pos = scene->_actor1._position; + event.handled = true; - s.syncAsSint16LE(_field34); - s.syncAsSint16LE(_field36); -} + if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) { + switch (_buttonId) { + case 1: + if (R2_GLOBALS.getFlag(18)) { + scene->_actor14.hide(); + scene->_actor15.hide(); + R2_GLOBALS.clearFlag(18); + } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) { + scene->_actor14.show(); + scene->_actor15.show(); + R2_GLOBALS.setFlag(18); + } else { + SceneItem::display("That's probably not a good thing, ya know!"); + } + break; + case 2: + if (scene->_field41A < 780) { + if (pos.x > 54) + pos.x -= 65; + pos.x += 2; + scene->_field41A += 2; + + for (int i = 0; i < 17; i++) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + break; + case 3: + if (scene->_field41A > 0) { + if (pos.x < -8) + pos.x += 65; + + pos.x -= 2; + scene->_field41A -= 2; + for (int i = 0; i < 17; i++) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + break; + case 4: { + if (pos.y < 176) { + ++pos.y; + for (int i = 0; i < 17; ++i) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + } + break; + case 5: { + if (pos.y > 145) { + --pos.y; + for (int i = 0; i < 17; ++i) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + } + break; + case 6: + R2_GLOBALS._sceneManager.changeScene(1550); + break; + default: + break; + } -void Scene1575::Hotspot1::process(Event &event) { - if ((event.eventType != EVENT_BUTTON_DOWN) || (R2_GLOBALS._events.getCursor() != R2_STEPPING_DISKS) || (!_bounds.contains(event.mousePos))) { - if (_field36 == 0) - return; - if ((_field34 == 1) || (event.eventType == EVENT_BUTTON_UP) || (!_bounds.contains(event.mousePos))) { - _field36 = 0; - return; - } - } - _field36 = 1; - Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene; + int j = 0; + for (int i = 0; i < 17; i++) { + if (scene->_arrActor[i]._bounds.contains(85, 116)) + j = i; + } - event.handled = true; - if (R2_GLOBALS.getFlag(18) && (_field34 > 1) && (_field34 < 6)) { - warning("sub1A03B(\"Better not move the laser while it\'s firing!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);"); - return; - } - int di = scene->_actor1._position.x; + if (scene->_actor13._bounds.contains(85, 116)) + j = 18; - switch (_field34 - 1) { - case 0: - if (R2_GLOBALS.getFlag(18)) { - scene->_actor14.hide(); - scene->_actor15.hide(); - R2_GLOBALS.clearFlag(18); - } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) { - scene->_actor14.show(); - scene->_actor15.show(); - R2_GLOBALS.setFlag(18); + if (scene->_actor12._bounds.contains(85, 116)) + j = 19; + + if (j) + scene->_actor11.show(); + else + scene->_actor11.hide(); } else { - warning("sub1A03B(\"That\'s probably not a good thing, ya know!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);"); + SceneItem::display("Better not move the laser while it's firing!"); } - break; - case 1: - if (scene->_field41A < 780) { - if (di > 54) - di -= 65; - di += 2; - scene->_field41A += 2; + } else { + _pressed = false; + } +} - for (int i = 0; i < 17; i++) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y)); +bool Scene1575::Button::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return false; + return SceneHotspot::startAction(action, event); +} - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y)); - scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y)); - scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y)); - scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y)); - } +void Scene1575::Button::initButton(int buttonId) { + _buttonId = buttonId; + _pressed = false; + EventHandler::postInit(); + + switch (_buttonId) { + case 1: + setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL); break; case 2: - if (scene->_field41A > 0) { - if (di < -8) - di += 65; - - di -= 2; - scene->_field41A -= 2; - for (int i = 0; i < 17; i++) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y)); - scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y)); - scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y)); - scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y)); - } + setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL); break; - case 3: { - int tmpPosY = scene->_actor1._position.y; - if (tmpPosY < 176) { - ++tmpPosY; - for (int i = 0; i < 17; ++i) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1)); - scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y)); - scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y)); - scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y)); - } - } + case 3: + setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL); break; - case 4: { - int tmpPosY = scene->_actor1._position.y; - if (tmpPosY > 145) { - tmpPosY--; - for (int i = 0; i < 17; ++i) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1)); - scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y)); - scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y)); - scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y)); - } - } + case 4: + setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL); break; case 5: - R2_GLOBALS._sceneManager.changeScene(1550); + setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL); + break; + case 6: + setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL); break; default: break; } +} - int j = 0; - for (int i = 0; i < 17; i++) { - if (scene->_arrActor[i]._bounds.contains(85, 116)) - j = i; - } - - if (scene->_actor13._bounds.contains(85, 116)) - j = 18; - - if (scene->_actor12._bounds.contains(85, 116)) - j = 19; +/*--------------------------------------------------------------------------*/ - if (j) - scene->_actor11.show(); - else - scene->_actor11.hide(); +Scene1575::Scene1575() { + _field412 = 0; + _field414 = 390; + _field416 = 0; + _field418 = 0; + _field41A = 0; } -bool Scene1575::Hotspot1::startAction(CursorType action, Event &event) { - if (action == CURSOR_USE) - return false; - return SceneHotspot::startAction(action, event); +void Scene1575::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_field412); + s.syncAsSint16LE(_field414); + s.syncAsSint16LE(_field416); + s.syncAsSint16LE(_field418); + s.syncAsSint16LE(_field41A); } -void Scene1575::Hotspot1::subA910D(int indx) { - warning("STUB: Scene1575:Hotspot1::subA910D(%d)", indx); +// TODO: Remove this method stub with proper sub-method call +double unk(double v1, double v2) { + return sqrt(v1 * v1 + v2 * v2); } void Scene1575::postInit(SceneObjectList *OwnerList) { loadScene(1575); R2_GLOBALS._uiElements._active = false; - R2_GLOBALS._v5589E = Rect(0, 0, 320, 200); SceneExt::postInit(); - _field414 = 390; + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; _actor1.postInit(); _actor1.setup(1575, 1, 1); @@ -9479,8 +9517,17 @@ void Scene1575::postInit(SceneObjectList *OwnerList) { for (int i = 0; i < 17; i++) { _arrActor[i].postInit(); - _arrActor[i].setup(1575, 2, k5A7F6[(3 * i) + 2]); - warning("TODO: immense pile of floating operations"); + _arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]); + + double v1 = unk(2.0, 3 - k5A7F6[3 * i]); + v1 += unk(2.0, 3 - k5A7F6[3 * i + 1]); + int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0); + + int angle = R2_GLOBALS._gfxManagerInstance.getAngle( + Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1])); + int xp = angle * 78 / 9 - 319; + + _arrActor[i].setPosition(Common::Point(xp, yp)); _arrActor[i].fixPriority(6); } @@ -9512,12 +9559,13 @@ void Scene1575::postInit(SceneObjectList *OwnerList) { _actor10.setup(1575, 3, 2); _actor10.setPosition(Common::Point(287, 91)); - _item1.subA910D(1); - _item1.subA910D(2); - _item1.subA910D(3); - _item1.subA910D(4); - _item1.subA910D(5); - _item1.subA910D(6); + // Initialise buttons + _button1.initButton(1); + _button2.initButton(2); + _button3.initButton(3); + _button4.initButton(4); + _button5.initButton(5); + _button6.initButton(6); _actor11.postInit(); _actor11.setup(1575, 4, 2); @@ -9545,6 +9593,7 @@ void Scene1575::postInit(SceneObjectList *OwnerList) { _actor13.postInit(); _actor13.setup(1575, 2, 4); + // TODO warning("TODO: another immense pile of floating operations"); _actor12.postInit(); @@ -10732,7 +10781,6 @@ void Scene1700::signal() { _stripManager.start(541, this); break; case 31: - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_TALK); break; case 40: @@ -10915,6 +10963,8 @@ Scene1750::Scene1750() { _field419 = 0; _field41B = 0; _field41D = 0; + + _rotation = nullptr; } void Scene1750::synchronize(Serializer &s) { @@ -14947,7 +14997,6 @@ void Scene1950::enterArea() { case 0: _sceneMode = 1950; if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) { - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); } else { setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL); @@ -14980,7 +15029,6 @@ void Scene1950::enterArea() { _sceneMode = 18; _eastExit._enabled = false; _field418 = Common::Point(60, 152); - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_USE); R2_GLOBALS._player._canWalk = false; @@ -15033,7 +15081,6 @@ void Scene1950::enterArea() { _westExit._enabled = false; _field418 = Common::Point(259, 152); - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_USE); R2_GLOBALS._player._canWalk = false; @@ -15274,13 +15321,11 @@ void Scene1950::signal() { break; case 1958: SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999); - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); _doorExit._enabled = true; break; case 1959: R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0); - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); _doorExit._enabled = true; break; @@ -15335,7 +15380,6 @@ void Scene1950::signal() { R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); break; default: - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); break; } diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h index 15475f95b0..5825320a2c 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.h +++ b/engines/tsage/ringworld2/ringworld2_scenes1.h @@ -576,14 +576,14 @@ public: }; class Scene1575 : public SceneExt { - class Hotspot1 : public NamedHotspot { + class Button : public NamedHotspot { public: - int _field34; - int _field36; + int _buttonId; + bool _pressed; - Hotspot1(); + Button(); void synchronize(Serializer &s); - void subA910D(int indx); + void initButton(int buttonId); virtual void process(Event &event); virtual bool startAction(CursorType action, Event &event); @@ -594,12 +594,12 @@ public: int _field416; int _field418; int _field41A; - Hotspot1 _item1; - Hotspot1 _item2; - Hotspot1 _item3; - Hotspot1 _item4; - Hotspot1 _item5; - Hotspot1 _item6; + Button _button1; + Button _button2; + Button _button3; + Button _button4; + Button _button5; + Button _button6; SceneActor _actor1; SceneActor _actor2; SceneActor _actor3; diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp index 17dca69c45..7c04d190d1 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes2.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp @@ -997,8 +997,6 @@ void Scene2000::signal() { g_globals->_sceneManager.changeScene(2535); break; default: - if (R2_GLOBALS._v56AAB != 0) - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); break; } @@ -1008,7 +1006,6 @@ void Scene2000::signal() { g_globals->_sceneManager.changeScene(2350); break; default: - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(); break; } diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp index 1fe0150ff0..68131f9b7a 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp @@ -1710,6 +1710,7 @@ void Scene3350::signal() { case 3351: _sceneMode = 3352; setAction(&_sequenceManager, this, 3352, &_actor4, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL); + break; case 3352: R2_GLOBALS._sceneManager.changeScene(3395); break; @@ -2190,6 +2191,7 @@ void Scene3375::signal() { else R2_GLOBALS._player.setStrip(3); R2_GLOBALS._player.enableControl(CURSOR_TALK); + break; default: _companion1.setPriority(130); _companion2.setPriority(132); @@ -4663,7 +4665,6 @@ void Scene3600::signal() { _sceneMode = 3607; _protector.setAction(&_sequenceManager1, this, _sceneMode, &_protector, NULL); - R2_GLOBALS._v558C2 = 1; _protectorSpeaker.proc16(); _protectorSpeaker._displayMode = 1; _quinnSpeaker._displayMode = 1; @@ -5250,6 +5251,7 @@ void Scene3800::enterArea() { default: break; } + break; default: R2_GLOBALS._player.enableControl(CURSOR_WALK); break; @@ -5350,7 +5352,6 @@ void Scene3800::signal() { enterArea(); break; case 15: - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(); break; case 16: @@ -5360,7 +5361,6 @@ void Scene3800::signal() { _actor1.show(); _object1.remove(); _object2.remove(); - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(); break; case 3805: @@ -5626,7 +5626,6 @@ void Scene3900::signal() { case 11: // No break on purpose case 12: - R2_GLOBALS._v56AAB = 0; R2_GLOBALS._player.enableControl(CURSOR_WALK); break; case 13: diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index fc4e12cd08..0d0457981f 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -33,7 +33,7 @@ namespace TsAGE { typedef void (*SaveNotifierFn)(bool postFlag); -#define TSAGE_SAVEGAME_VERSION 10 +#define TSAGE_SAVEGAME_VERSION 11 class SavedObject; @@ -48,7 +48,7 @@ struct tSageSavegameHeader { /*--------------------------------------------------------------------------*/ -// FIXME: workaround to supress spurious strict-alias warnings on older GCC +// FIXME: workaround to suppress spurious strict-alias warnings on older GCC // versions. this should be resolved with the savegame rewrite #define SYNC_POINTER(x) do { \ SavedObject **y = (SavedObject **)((void *)&x); \ @@ -59,7 +59,7 @@ struct tSageSavegameHeader { if (s.isLoading()) FIELD = (TYPE)v_##FIELD; /** - * Derived serializer class with extra synchronisation types + * Derived serializer class with extra synchronization types */ class Serializer : public Common::Serializer { public: diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp index 967270b9bd..590d7c4f01 100644 --- a/engines/wintermute/ad/ad_actor.cpp +++ b/engines/wintermute/ad/ad_actor.cpp @@ -1322,10 +1322,10 @@ bool AdActor::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER_INT(_dir)); persistMgr->transferPtr(TMEMBER_PTR(_path)); persistMgr->transfer(TMEMBER(_pFCount)); - persistMgr->transfer(TMEMBER(_pFStepX)); - persistMgr->transfer(TMEMBER(_pFStepY)); - persistMgr->transfer(TMEMBER(_pFX)); - persistMgr->transfer(TMEMBER(_pFY)); + persistMgr->transferDouble(TMEMBER(_pFStepX)); + persistMgr->transferDouble(TMEMBER(_pFStepY)); + persistMgr->transferDouble(TMEMBER(_pFX)); + persistMgr->transferDouble(TMEMBER(_pFY)); persistMgr->transferPtr(TMEMBER_PTR(_standSprite)); _talkSprites.persist(persistMgr); _talkSpritesEx.persist(persistMgr); @@ -1376,7 +1376,7 @@ TDirection AdActor::angleToDirection(int angle) { ////////////////////////////////////////////////////////////////////////// -int AdActor::getHeight() { +int32 AdActor::getHeight() { // if no current sprite is set, set some if (_currentSprite == nullptr) { if (_standSprite) { diff --git a/engines/wintermute/ad/ad_actor.h b/engines/wintermute/ad/ad_actor.h index e836dd72cf..3225eb44ec 100644 --- a/engines/wintermute/ad/ad_actor.h +++ b/engines/wintermute/ad/ad_actor.h @@ -47,7 +47,7 @@ class AdActor : public AdTalkHolder { public: TDirection angleToDirection(int angle); DECLARE_PERSISTENT(AdActor, AdTalkHolder) - virtual int getHeight(); + virtual int32 getHeight() override; BaseSprite *getTalkStance(const char *stance); virtual void goTo(int x, int y, TDirection afterWalkDir = DI_NONE); BasePoint *_targetPoint; diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp index 2c0e13a4dc..e7471a413e 100644 --- a/engines/wintermute/ad/ad_entity.cpp +++ b/engines/wintermute/ad/ad_entity.cpp @@ -1067,7 +1067,7 @@ bool AdEntity::saveAsText(BaseDynamicBuffer *buffer, int indent) { ////////////////////////////////////////////////////////////////////////// -int AdEntity::getHeight() { +int32 AdEntity::getHeight() { if (_region && !_sprite) { return _region->_rect.bottom - _region->_rect.top; } else { diff --git a/engines/wintermute/ad/ad_entity.h b/engines/wintermute/ad/ad_entity.h index c4d60e86f3..c3ed5622e5 100644 --- a/engines/wintermute/ad/ad_entity.h +++ b/engines/wintermute/ad/ad_entity.h @@ -40,7 +40,7 @@ public: void setItem(const char *itemName); DECLARE_PERSISTENT(AdEntity, AdTalkHolder) void updatePosition(); - virtual int getHeight(); + virtual int32 getHeight() override; BaseRegion *_region; virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent) override; virtual bool update(); diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 86f470b8c3..fc5f20164b 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -1425,7 +1425,7 @@ bool AdGame::persist(BasePersistenceManager *persistMgr) { _responsesGame.persist(persistMgr); persistMgr->transferPtr(TMEMBER_PTR(_scene)); _sceneStates.persist(persistMgr); - persistMgr->transfer(TMEMBER(_scheduledFadeIn)); + persistMgr->transferBool(TMEMBER(_scheduledFadeIn)); persistMgr->transfer(TMEMBER(_scheduledScene)); persistMgr->transferPtr(TMEMBER_PTR(_selectedItem)); persistMgr->transfer(TMEMBER_INT(_talkSkipButton)); @@ -1434,18 +1434,18 @@ bool AdGame::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_sceneViewport)); persistMgr->transfer(TMEMBER_INT(_stateEx)); - persistMgr->transfer(TMEMBER(_initialScene)); + persistMgr->transferBool(TMEMBER(_initialScene)); persistMgr->transfer(TMEMBER(_debugStartupScene)); persistMgr->transferPtr(TMEMBER_PTR(_invObject)); persistMgr->transferPtr(TMEMBER_PTR(_inventoryOwner)); - persistMgr->transfer(TMEMBER(_tempDisableSaveState)); + persistMgr->transferBool(TMEMBER(_tempDisableSaveState)); _items.persist(persistMgr); persistMgr->transfer(TMEMBER(_itemsFile)); _speechDirs.persist(persistMgr); - persistMgr->transfer(TMEMBER(_smartItemCursor)); + persistMgr->transferBool(TMEMBER(_smartItemCursor)); if (!persistMgr->getIsSaving()) { _initialScene = false; @@ -2160,7 +2160,6 @@ bool AdGame::onMouseLeftDown() { _gameRef->_capturedObject = _gameRef->_activeObject; } _mouseLeftDown = true; - BasePlatform::setCapture(/*_renderer->_window*/); return STATUS_OK; } @@ -2171,7 +2170,6 @@ bool AdGame::onMouseLeftUp() { _activeObject->handleMouse(MOUSE_RELEASE, MOUSE_BUTTON_LEFT); } - BasePlatform::releaseCapture(); _capturedObject = nullptr; _mouseLeftDown = false; diff --git a/engines/wintermute/ad/ad_inventory_box.cpp b/engines/wintermute/ad/ad_inventory_box.cpp index 4c904e78eb..a6e10fee9c 100644 --- a/engines/wintermute/ad/ad_inventory_box.cpp +++ b/engines/wintermute/ad/ad_inventory_box.cpp @@ -372,16 +372,16 @@ bool AdInventoryBox::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); persistMgr->transferPtr(TMEMBER_PTR(_closeButton)); - persistMgr->transfer(TMEMBER(_hideSelected)); + persistMgr->transferBool(TMEMBER(_hideSelected)); persistMgr->transfer(TMEMBER(_itemHeight)); - persistMgr->transfer(TMEMBER(_itemsArea)); + persistMgr->transferRect32(TMEMBER(_itemsArea)); persistMgr->transfer(TMEMBER(_itemWidth)); persistMgr->transfer(TMEMBER(_scrollBy)); persistMgr->transfer(TMEMBER(_scrollOffset)); persistMgr->transfer(TMEMBER(_spacing)); - persistMgr->transfer(TMEMBER(_visible)); + persistMgr->transferBool(TMEMBER(_visible)); persistMgr->transferPtr(TMEMBER_PTR(_window)); - persistMgr->transfer(TMEMBER(_exclusive)); + persistMgr->transferBool(TMEMBER(_exclusive)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_item.cpp b/engines/wintermute/ad/ad_item.cpp index f9741d1ed2..ae249de819 100644 --- a/engines/wintermute/ad/ad_item.cpp +++ b/engines/wintermute/ad/ad_item.cpp @@ -783,12 +783,12 @@ bool AdItem::persist(BasePersistenceManager *persistMgr) { AdTalkHolder::persist(persistMgr); - persistMgr->transfer(TMEMBER(_cursorCombined)); + persistMgr->transferBool(TMEMBER(_cursorCombined)); persistMgr->transferPtr(TMEMBER_PTR(_cursorHover)); persistMgr->transferPtr(TMEMBER_PTR(_cursorNormal)); persistMgr->transferPtr(TMEMBER_PTR(_spriteHover)); - persistMgr->transfer(TMEMBER(_inInventory)); - persistMgr->transfer(TMEMBER(_displayAmount)); + persistMgr->transferBool(TMEMBER(_inInventory)); + persistMgr->transferBool(TMEMBER(_displayAmount)); persistMgr->transfer(TMEMBER(_amount)); persistMgr->transfer(TMEMBER(_amountOffsetX)); persistMgr->transfer(TMEMBER(_amountOffsetY)); diff --git a/engines/wintermute/ad/ad_layer.cpp b/engines/wintermute/ad/ad_layer.cpp index 752700d0d4..7bbdf27cc6 100644 --- a/engines/wintermute/ad/ad_layer.cpp +++ b/engines/wintermute/ad/ad_layer.cpp @@ -551,10 +551,10 @@ bool AdLayer::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_active)); - persistMgr->transfer(TMEMBER(_closeUp)); + persistMgr->transferBool(TMEMBER(_active)); + persistMgr->transferBool(TMEMBER(_closeUp)); persistMgr->transfer(TMEMBER(_height)); - persistMgr->transfer(TMEMBER(_main)); + persistMgr->transferBool(TMEMBER(_main)); _nodes.persist(persistMgr); persistMgr->transfer(TMEMBER(_width)); diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp index 876c5a8bb4..193aa75194 100644 --- a/engines/wintermute/ad/ad_node_state.cpp +++ b/engines/wintermute/ad/ad_node_state.cpp @@ -95,7 +95,7 @@ void AdNodeState::setCursor(const char *filename) { bool AdNodeState::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); - persistMgr->transfer(TMEMBER(_active)); + persistMgr->transferBool(TMEMBER(_active)); persistMgr->transfer(TMEMBER(_name)); persistMgr->transfer(TMEMBER(_filename)); persistMgr->transfer(TMEMBER(_cursor)); diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp index 0d5011f92d..6ab2e9bc75 100644 --- a/engines/wintermute/ad/ad_object.cpp +++ b/engines/wintermute/ad/ad_object.cpp @@ -859,7 +859,7 @@ bool AdObject::setFont(const char *filename) { ////////////////////////////////////////////////////////////////////////// -int AdObject::getHeight() { +int32 AdObject::getHeight() { if (!_currentSprite) { return 0; } else { @@ -1030,29 +1030,29 @@ bool AdObject::reset() { bool AdObject::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_active)); + persistMgr->transferBool(TMEMBER(_active)); persistMgr->transferPtr(TMEMBER_PTR(_blockRegion)); persistMgr->transferPtr(TMEMBER_PTR(_currentBlockRegion)); persistMgr->transferPtr(TMEMBER_PTR(_currentWptGroup)); persistMgr->transferPtr(TMEMBER_PTR(_currentSprite)); - persistMgr->transfer(TMEMBER(_drawn)); + persistMgr->transferBool(TMEMBER(_drawn)); persistMgr->transferPtr(TMEMBER_PTR(_font)); - persistMgr->transfer(TMEMBER(_ignoreItems)); + persistMgr->transferBool(TMEMBER(_ignoreItems)); persistMgr->transfer(TMEMBER_INT(_nextState)); persistMgr->transferPtr(TMEMBER_PTR(_sentence)); persistMgr->transfer(TMEMBER_INT(_state)); persistMgr->transferPtr(TMEMBER_PTR(_animSprite)); - persistMgr->transfer(TMEMBER(_sceneIndependent)); + persistMgr->transferBool(TMEMBER(_sceneIndependent)); persistMgr->transfer(TMEMBER(_forcedTalkAnimName)); - persistMgr->transfer(TMEMBER(_forcedTalkAnimUsed)); + persistMgr->transferBool(TMEMBER(_forcedTalkAnimUsed)); persistMgr->transferPtr(TMEMBER_PTR(_tempSprite2)); persistMgr->transfer(TMEMBER_INT(_type)); persistMgr->transferPtr(TMEMBER_PTR(_wptGroup)); persistMgr->transferPtr(TMEMBER_PTR(_stickRegion)); - persistMgr->transfer(TMEMBER(_subtitlesModRelative)); + persistMgr->transferBool(TMEMBER(_subtitlesModRelative)); persistMgr->transfer(TMEMBER(_subtitlesModX)); persistMgr->transfer(TMEMBER(_subtitlesModY)); - persistMgr->transfer(TMEMBER(_subtitlesModXCenter)); + persistMgr->transferBool(TMEMBER(_subtitlesModXCenter)); persistMgr->transfer(TMEMBER(_subtitlesWidth)); persistMgr->transferPtr(TMEMBER_PTR(_inventory)); persistMgr->transferPtr(TMEMBER_PTR(_partEmitter)); @@ -1065,7 +1065,7 @@ bool AdObject::persist(BasePersistenceManager *persistMgr) { _attachmentsPost.persist(persistMgr); persistMgr->transferPtr(TMEMBER_PTR(_registerAlias)); - persistMgr->transfer(TMEMBER(_partFollowParent)); + persistMgr->transferBool(TMEMBER(_partFollowParent)); persistMgr->transfer(TMEMBER(_partOffsetX)); persistMgr->transfer(TMEMBER(_partOffsetY)); diff --git a/engines/wintermute/ad/ad_object.h b/engines/wintermute/ad/ad_object.h index 9e30f69855..ba984ef8d1 100644 --- a/engines/wintermute/ad/ad_object.h +++ b/engines/wintermute/ad/ad_object.h @@ -61,7 +61,7 @@ public: bool reset(); DECLARE_PERSISTENT(AdObject, BaseObject) virtual void talk(const char *text, const char *sound = nullptr, uint32 duration = 0, const char *stances = nullptr, TTextAlign align = TAL_CENTER); - virtual int getHeight() override; + virtual int32 getHeight() override; bool setFont(const char *filename); virtual bool update() override; diff --git a/engines/wintermute/ad/ad_path.cpp b/engines/wintermute/ad/ad_path.cpp index 91a24cbf7d..bdb7eba495 100644 --- a/engines/wintermute/ad/ad_path.cpp +++ b/engines/wintermute/ad/ad_path.cpp @@ -112,7 +112,7 @@ bool AdPath::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_currIndex)); _points.persist(persistMgr); - persistMgr->transfer(TMEMBER(_ready)); + persistMgr->transferBool(TMEMBER(_ready)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_path_point.cpp b/engines/wintermute/ad/ad_path_point.cpp index d5108ad8c1..3e99d12f5d 100644 --- a/engines/wintermute/ad/ad_path_point.cpp +++ b/engines/wintermute/ad/ad_path_point.cpp @@ -66,7 +66,7 @@ bool AdPathPoint::persist(BasePersistenceManager *persistMgr) { BasePoint::persist(persistMgr); persistMgr->transfer(TMEMBER(_distance)); - persistMgr->transfer(TMEMBER(_marked)); + persistMgr->transferBool(TMEMBER(_marked)); persistMgr->transferPtr(TMEMBER_PTR(_origin)); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_region.cpp b/engines/wintermute/ad/ad_region.cpp index 1c0cf41e86..215ec495a1 100644 --- a/engines/wintermute/ad/ad_region.cpp +++ b/engines/wintermute/ad/ad_region.cpp @@ -402,8 +402,8 @@ bool AdRegion::persist(BasePersistenceManager *persistMgr) { BaseRegion::persist(persistMgr); persistMgr->transfer(TMEMBER(_alpha)); - persistMgr->transfer(TMEMBER(_blocked)); - persistMgr->transfer(TMEMBER(_decoration)); + persistMgr->transferBool(TMEMBER(_blocked)); + persistMgr->transferBool(TMEMBER(_decoration)); persistMgr->transferFloat(TMEMBER(_zoom)); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp index 2a5adb9234..5c0efb547b 100644 --- a/engines/wintermute/ad/ad_response_box.cpp +++ b/engines/wintermute/ad/ad_response_box.cpp @@ -58,7 +58,7 @@ AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) { _shieldWindow = new UIWindow(_gameRef); _horizontal = false; - BasePlatform::setRectEmpty(&_responseArea); + _responseArea.setEmpty(); _scrollOffset = 0; _spacing = 0; @@ -583,11 +583,11 @@ bool AdResponseBox::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_font)); persistMgr->transferPtr(TMEMBER_PTR(_fontHover)); - persistMgr->transfer(TMEMBER(_horizontal)); + persistMgr->transferBool(TMEMBER(_horizontal)); persistMgr->transfer(TMEMBER(_lastResponseText)); persistMgr->transfer(TMEMBER(_lastResponseTextOrig)); _respButtons.persist(persistMgr); - persistMgr->transfer(TMEMBER(_responseArea)); + persistMgr->transferRect32(TMEMBER(_responseArea)); _responses.persist(persistMgr); persistMgr->transfer(TMEMBER(_scrollOffset)); persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow)); diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp index bc8d9e96d2..296ef430a2 100644 --- a/engines/wintermute/ad/ad_scene.cpp +++ b/engines/wintermute/ad/ad_scene.cpp @@ -2300,7 +2300,7 @@ float AdScene::getScaleAt(int Y) { bool AdScene::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_autoScroll)); + persistMgr->transferBool(TMEMBER(_autoScroll)); persistMgr->transfer(TMEMBER(_editorColBlocked)); persistMgr->transfer(TMEMBER(_editorColBlockedSel)); persistMgr->transfer(TMEMBER(_editorColDecor)); @@ -2315,14 +2315,14 @@ bool AdScene::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_editorColWaypointsSel)); persistMgr->transfer(TMEMBER(_editorMarginH)); persistMgr->transfer(TMEMBER(_editorMarginV)); - persistMgr->transfer(TMEMBER(_editorShowBlocked)); - persistMgr->transfer(TMEMBER(_editorShowDecor)); - persistMgr->transfer(TMEMBER(_editorShowEntities)); - persistMgr->transfer(TMEMBER(_editorShowRegions)); - persistMgr->transfer(TMEMBER(_editorShowScale)); + persistMgr->transferBool(TMEMBER(_editorShowBlocked)); + persistMgr->transferBool(TMEMBER(_editorShowDecor)); + persistMgr->transferBool(TMEMBER(_editorShowEntities)); + persistMgr->transferBool(TMEMBER(_editorShowRegions)); + persistMgr->transferBool(TMEMBER(_editorShowScale)); persistMgr->transferPtr(TMEMBER_PTR(_fader)); persistMgr->transfer(TMEMBER(_height)); - persistMgr->transfer(TMEMBER(_initialized)); + persistMgr->transferBool(TMEMBER(_initialized)); persistMgr->transfer(TMEMBER(_lastTimeH)); persistMgr->transfer(TMEMBER(_lastTimeV)); _layers.persist(persistMgr); @@ -2330,13 +2330,13 @@ bool AdScene::persist(BasePersistenceManager *persistMgr) { _objects.persist(persistMgr); persistMgr->transfer(TMEMBER(_offsetLeft)); persistMgr->transfer(TMEMBER(_offsetTop)); - persistMgr->transfer(TMEMBER(_paralaxScrolling)); - persistMgr->transfer(TMEMBER(_persistentState)); - persistMgr->transfer(TMEMBER(_persistentStateSprites)); + persistMgr->transferBool(TMEMBER(_paralaxScrolling)); + persistMgr->transferBool(TMEMBER(_persistentState)); + persistMgr->transferBool(TMEMBER(_persistentStateSprites)); persistMgr->transfer(TMEMBER(_pfMaxTime)); _pfPath.persist(persistMgr); persistMgr->transfer(TMEMBER(_pfPointsNum)); - persistMgr->transfer(TMEMBER(_pfReady)); + persistMgr->transferBool(TMEMBER(_pfReady)); persistMgr->transferPtr(TMEMBER_PTR(_pfRequester)); persistMgr->transferPtr(TMEMBER_PTR(_pfTarget)); persistMgr->transferPtr(TMEMBER_PTR(_pfTargetPath)); diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp index d5baa8291f..773181b373 100644 --- a/engines/wintermute/ad/ad_sentence.cpp +++ b/engines/wintermute/ad/ad_sentence.cpp @@ -255,17 +255,17 @@ bool AdSentence::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_currentSkelAnim)); persistMgr->transfer(TMEMBER(_duration)); persistMgr->transferPtr(TMEMBER_PTR(_font)); - persistMgr->transfer(TMEMBER(_pos)); + persistMgr->transferPoint32(TMEMBER(_pos)); persistMgr->transferPtr(TMEMBER_PTR(_sound)); - persistMgr->transfer(TMEMBER(_soundStarted)); + persistMgr->transferBool(TMEMBER(_soundStarted)); persistMgr->transfer(TMEMBER(_stances)); persistMgr->transfer(TMEMBER(_startTime)); persistMgr->transferPtr(TMEMBER_PTR(_talkDef)); persistMgr->transfer(TMEMBER(_tempStance)); persistMgr->transfer(TMEMBER(_text)); persistMgr->transfer(TMEMBER(_width)); - persistMgr->transfer(TMEMBER(_fixedPos)); - persistMgr->transfer(TMEMBER(_freezable)); + persistMgr->transferBool(TMEMBER(_fixedPos)); + persistMgr->transferBool(TMEMBER(_freezable)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_talk_node.cpp b/engines/wintermute/ad/ad_talk_node.cpp index eca4535288..b9be62e581 100644 --- a/engines/wintermute/ad/ad_talk_node.cpp +++ b/engines/wintermute/ad/ad_talk_node.cpp @@ -194,7 +194,7 @@ bool AdTalkNode::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_comment)); persistMgr->transfer(TMEMBER(_startTime)); persistMgr->transfer(TMEMBER(_endTime)); - persistMgr->transfer(TMEMBER(_playToEnd)); + persistMgr->transferBool(TMEMBER(_playToEnd)); persistMgr->transferPtr(TMEMBER_PTR(_sprite)); persistMgr->transfer(TMEMBER(_spriteFilename)); persistMgr->transferPtr(TMEMBER_PTR(_spriteSet)); diff --git a/engines/wintermute/ad/ad_waypoint_group.cpp b/engines/wintermute/ad/ad_waypoint_group.cpp index f7735a4d9b..a8d474bf35 100644 --- a/engines/wintermute/ad/ad_waypoint_group.cpp +++ b/engines/wintermute/ad/ad_waypoint_group.cpp @@ -194,7 +194,7 @@ bool AdWaypointGroup::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_active)); + persistMgr->transferBool(TMEMBER(_active)); persistMgr->transfer(TMEMBER(_editorSelectedPoint)); persistMgr->transferFloat(TMEMBER(_lastMimicScale)); persistMgr->transfer(TMEMBER(_lastMimicX)); diff --git a/engines/wintermute/base/base.cpp b/engines/wintermute/base/base.cpp index 91ca30db70..6a0666b36e 100644 --- a/engines/wintermute/base/base.cpp +++ b/engines/wintermute/base/base.cpp @@ -60,7 +60,7 @@ Common::String BaseClass::getEditorProp(const Common::String &propName, const Co if (_editorPropsIter != _editorProps.end()) { return _editorPropsIter->_value.c_str(); } else { - return initVal; + return initVal; // Used to be NULL } } diff --git a/engines/wintermute/base/base.h b/engines/wintermute/base/base.h index f4b0976019..8767cc9bdd 100644 --- a/engines/wintermute/base/base.h +++ b/engines/wintermute/base/base.h @@ -44,7 +44,7 @@ class BaseClass { public: bool _persistable; bool setEditorProp(const Common::String &propName, const Common::String &propValue); - Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = nullptr); + Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = Common::String()); BaseClass(TDynamicConstructor, TDynamicConstructor) {} bool parseEditorProperty(char *buffer, bool complete = true); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent = 0); diff --git a/engines/wintermute/base/base_active_rect.cpp b/engines/wintermute/base/base_active_rect.cpp index abeaa18d54..69cc7b02b6 100644 --- a/engines/wintermute/base/base_active_rect.cpp +++ b/engines/wintermute/base/base_active_rect.cpp @@ -37,7 +37,7 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////// BaseActiveRect::BaseActiveRect(BaseGame *inGame) : BaseClass(inGame) { - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); _owner = nullptr; _frame = nullptr; _region = nullptr; @@ -52,7 +52,7 @@ BaseActiveRect::BaseActiveRect(BaseGame *inGame) : BaseClass(inGame) { BaseActiveRect::BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseSubFrame *frame, int x, int y, int width, int height, float zoomX, float zoomY, bool precise) : BaseClass(inGame) { _owner = owner; _frame = frame; - BasePlatform::setRect(&_rect, x, y, x + width, y + height); + _rect.setRect(x, y, x + width, y + height); _zoomX = zoomX; _zoomY = zoomY; _precise = precise; diff --git a/engines/wintermute/base/base_fader.cpp b/engines/wintermute/base/base_fader.cpp index 7978230964..b5590abb08 100644 --- a/engines/wintermute/base/base_fader.cpp +++ b/engines/wintermute/base/base_fader.cpp @@ -175,16 +175,16 @@ uint32 BaseFader::getCurrentColor() const { bool BaseFader::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_active)); - persistMgr->transfer(TMEMBER(_blue)); - persistMgr->transfer(TMEMBER(_currentAlpha)); + persistMgr->transferBool(TMEMBER(_active)); + persistMgr->transferByte(TMEMBER(_blue)); + persistMgr->transferByte(TMEMBER(_currentAlpha)); persistMgr->transfer(TMEMBER(_duration)); - persistMgr->transfer(TMEMBER(_green)); - persistMgr->transfer(TMEMBER(_red)); - persistMgr->transfer(TMEMBER(_sourceAlpha)); + persistMgr->transferByte(TMEMBER(_green)); + persistMgr->transferByte(TMEMBER(_red)); + persistMgr->transferByte(TMEMBER(_sourceAlpha)); persistMgr->transfer(TMEMBER(_startTime)); - persistMgr->transfer(TMEMBER(_targetAlpha)); - persistMgr->transfer(TMEMBER(_system)); + persistMgr->transferByte(TMEMBER(_targetAlpha)); + persistMgr->transferBool(TMEMBER(_system)); if (_system && !persistMgr->getIsSaving()) { _startTime = 0; diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp index 1af8be02dd..2e371223c8 100644 --- a/engines/wintermute/base/base_frame.cpp +++ b/engines/wintermute/base/base_frame.cpp @@ -181,7 +181,7 @@ bool BaseFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { bool decoration = false; bool mirrorX = false; bool mirrorY = false; - BasePlatform::setRectEmpty(&rect); + rect.setEmpty(); char *surface_file = nullptr; while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 0) { @@ -325,7 +325,7 @@ bool BaseFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { } } - if (BasePlatform::isRectEmpty(&rect)) { + if (rect.isRectEmpty()) { sub->setDefaultRect(); } else { sub->setRect(rect); @@ -352,7 +352,7 @@ bool BaseFrame::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, float if (!rect) { return false; } - BasePlatform::setRectEmpty(rect); + rect->setEmpty(); Rect32 subRect; @@ -415,9 +415,9 @@ bool BaseFrame::persist(BasePersistenceManager *persistMgr) { _applyEvent.persist(persistMgr); persistMgr->transfer(TMEMBER(_delay)); - persistMgr->transfer(TMEMBER(_editorExpanded)); - persistMgr->transfer(TMEMBER(_keyframe)); - persistMgr->transfer(TMEMBER(_killSound)); + persistMgr->transferBool(TMEMBER(_editorExpanded)); + persistMgr->transferBool(TMEMBER(_keyframe)); + persistMgr->transferBool(TMEMBER(_killSound)); persistMgr->transfer(TMEMBER(_moveX)); persistMgr->transfer(TMEMBER(_moveY)); persistMgr->transferPtr(TMEMBER_PTR(_sound)); diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index 0d8af0ce8a..033f019712 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -185,7 +185,7 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target _lastCursor = nullptr; - BasePlatform::setRectEmpty(&_mouseLockRect); + _mouseLockRect.setEmpty(); _suppressScriptErrors = false; _lastMiniUpdate = 0; @@ -1123,7 +1123,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack BaseUtils::swap(&top, &bottom); } - BasePlatform::setRect(&_mouseLockRect, left, top, right, bottom); + _mouseLockRect.setRect(left, top, right, bottom); stack->pushNULL(); return STATUS_OK; @@ -3054,12 +3054,12 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_activeObject)); persistMgr->transferPtr(TMEMBER_PTR(_capturedObject)); persistMgr->transferPtr(TMEMBER_PTR(_cursorNoninteractive)); - persistMgr->transfer(TMEMBER(_editorMode)); + persistMgr->transferBool(TMEMBER(_editorMode)); persistMgr->transferPtr(TMEMBER_PTR(_fader)); persistMgr->transfer(TMEMBER(_freezeLevel)); persistMgr->transferPtr(TMEMBER_PTR(_focusedWindow)); persistMgr->transferPtr(TMEMBER_PTR(_fontStorage)); - persistMgr->transfer(TMEMBER(_interactive)); + persistMgr->transferBool(TMEMBER(_interactive)); persistMgr->transferPtr(TMEMBER_PTR(_keyboardState)); persistMgr->transfer(TMEMBER(_lastTime)); persistMgr->transferPtr(TMEMBER_PTR(_mainObject)); @@ -3071,10 +3071,10 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { persistMgr->transferFloat(TMEMBER(_offsetPercentX)); persistMgr->transferFloat(TMEMBER(_offsetPercentY)); - persistMgr->transfer(TMEMBER(_origInteractive)); + persistMgr->transferBool(TMEMBER(_origInteractive)); persistMgr->transfer(TMEMBER_INT(_origState)); - persistMgr->transfer(TMEMBER(_personalizedSave)); - persistMgr->transfer(TMEMBER(_quitting)); + persistMgr->transferBool(TMEMBER(_personalizedSave)); + persistMgr->transferBool(TMEMBER(_quitting)); _regObjects.persist(persistMgr); @@ -3082,11 +3082,11 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { //persistMgr->transfer(TMEMBER(_soundMgr)); persistMgr->transfer(TMEMBER_INT(_state)); //persistMgr->transfer(TMEMBER(_surfaceStorage)); - persistMgr->transfer(TMEMBER(_subtitles)); + persistMgr->transferBool(TMEMBER(_subtitles)); persistMgr->transfer(TMEMBER(_subtitlesSpeed)); persistMgr->transferPtr(TMEMBER_PTR(_systemFont)); persistMgr->transferPtr(TMEMBER_PTR(_videoFont)); - persistMgr->transfer(TMEMBER(_videoSubtitles)); + persistMgr->transferBool(TMEMBER(_videoSubtitles)); _timerNormal.persist(persistMgr); _timerLive.persist(persistMgr); @@ -3094,21 +3094,21 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { _renderer->persistSaveLoadImages(persistMgr); persistMgr->transfer(TMEMBER_INT(_textEncoding)); - persistMgr->transfer(TMEMBER(_textRTL)); + persistMgr->transferBool(TMEMBER(_textRTL)); persistMgr->transfer(TMEMBER(_soundBufferSizeSec)); - persistMgr->transfer(TMEMBER(_suspendedRendering)); + persistMgr->transferBool(TMEMBER(_suspendedRendering)); - persistMgr->transfer(TMEMBER(_mouseLockRect)); + persistMgr->transferRect32(TMEMBER(_mouseLockRect)); _windows.persist(persistMgr); - persistMgr->transfer(TMEMBER(_suppressScriptErrors)); - persistMgr->transfer(TMEMBER(_autorunDisabled)); + persistMgr->transferBool(TMEMBER(_suppressScriptErrors)); + persistMgr->transferBool(TMEMBER(_autorunDisabled)); - persistMgr->transfer(TMEMBER(_autoSaveOnExit)); + persistMgr->transferBool(TMEMBER(_autoSaveOnExit)); persistMgr->transfer(TMEMBER(_autoSaveSlot)); - persistMgr->transfer(TMEMBER(_cursorHidden)); + persistMgr->transferBool(TMEMBER(_cursorHidden)); if (!persistMgr->getIsSaving()) { _quitting = false; @@ -3361,10 +3361,10 @@ bool BaseGame::getCurrentViewportRect(Rect32 *rect, bool *custom) const { *custom = true; } } else { - BasePlatform::setRect(rect, _renderer->_drawOffsetX, - _renderer->_drawOffsetY, - _renderer->getWidth() + _renderer->_drawOffsetX, - _renderer->getHeight() + _renderer->_drawOffsetY); + rect->setRect(_renderer->_drawOffsetX, + _renderer->_drawOffsetY, + _renderer->getWidth() + _renderer->_drawOffsetX, + _renderer->getHeight() + _renderer->_drawOffsetY); if (custom) { *custom = false; } @@ -3577,7 +3577,6 @@ bool BaseGame::onMouseLeftDown() { _capturedObject = _activeObject; } _mouseLeftDown = true; - BasePlatform::setCapture(/*_renderer->_window*/); return STATUS_OK; } @@ -3588,7 +3587,6 @@ bool BaseGame::onMouseLeftUp() { _activeObject->handleMouse(MOUSE_RELEASE, MOUSE_BUTTON_LEFT); } - BasePlatform::releaseCapture(); _capturedObject = nullptr; _mouseLeftDown = false; diff --git a/engines/wintermute/base/base_game_music.cpp b/engines/wintermute/base/base_game_music.cpp index c50969df76..9462757a8a 100644 --- a/engines/wintermute/base/base_game_music.cpp +++ b/engines/wintermute/base/base_game_music.cpp @@ -221,12 +221,12 @@ bool BaseGameMusic::persistChannels(BasePersistenceManager *persistMgr) { } bool BaseGameMusic::persistCrossfadeSettings(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_musicCrossfadeRunning)); + persistMgr->transferBool(TMEMBER(_musicCrossfadeRunning)); persistMgr->transfer(TMEMBER(_musicCrossfadeStartTime)); persistMgr->transfer(TMEMBER(_musicCrossfadeLength)); persistMgr->transfer(TMEMBER(_musicCrossfadeChannel1)); persistMgr->transfer(TMEMBER(_musicCrossfadeChannel2)); - persistMgr->transfer(TMEMBER(_musicCrossfadeSwap)); + persistMgr->transferBool(TMEMBER(_musicCrossfadeSwap)); return true; } diff --git a/engines/wintermute/base/base_keyboard_state.cpp b/engines/wintermute/base/base_keyboard_state.cpp index aeb56ad282..014802d715 100644 --- a/engines/wintermute/base/base_keyboard_state.cpp +++ b/engines/wintermute/base/base_keyboard_state.cpp @@ -221,12 +221,12 @@ bool BaseKeyboardState::persist(BasePersistenceManager *persistMgr) { //if (!persistMgr->getIsSaving()) cleanup(); BaseScriptable::persist(persistMgr); - persistMgr->transfer(TMEMBER(_currentAlt)); + persistMgr->transferBool(TMEMBER(_currentAlt)); persistMgr->transfer(TMEMBER(_currentCharCode)); - persistMgr->transfer(TMEMBER(_currentControl)); + persistMgr->transferBool(TMEMBER(_currentControl)); persistMgr->transfer(TMEMBER(_currentKeyData)); - persistMgr->transfer(TMEMBER(_currentPrintable)); - persistMgr->transfer(TMEMBER(_currentShift)); + persistMgr->transferBool(TMEMBER(_currentPrintable)); + persistMgr->transferBool(TMEMBER(_currentShift)); if (!persistMgr->getIsSaving()) { _keyStates = new uint8[323]; // Hardcoded size for the common/keyboard.h enum diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp index ea754f8f23..14e15b7161 100644 --- a/engines/wintermute/base/base_object.cpp +++ b/engines/wintermute/base/base_object.cpp @@ -63,7 +63,7 @@ BaseObject::BaseObject(BaseGame *inGame) : BaseScriptHolder(inGame) { _iD = _gameRef->getSequence(); - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); _rectSet = false; _cursor = nullptr; @@ -957,40 +957,40 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) { } persistMgr->transferPtr(TMEMBER_PTR(_activeCursor)); persistMgr->transfer(TMEMBER(_alphaColor)); - persistMgr->transfer(TMEMBER(_autoSoundPanning)); + persistMgr->transferBool(TMEMBER(_autoSoundPanning)); persistMgr->transferPtr(TMEMBER_PTR(_cursor)); - persistMgr->transfer(TMEMBER(_sharedCursors)); - persistMgr->transfer(TMEMBER(_editorAlwaysRegister)); - persistMgr->transfer(TMEMBER(_editorOnly)); - persistMgr->transfer(TMEMBER(_editorSelected)); + persistMgr->transferBool(TMEMBER(_sharedCursors)); + persistMgr->transferBool(TMEMBER(_editorAlwaysRegister)); + persistMgr->transferBool(TMEMBER(_editorOnly)); + persistMgr->transferBool(TMEMBER(_editorSelected)); persistMgr->transfer(TMEMBER(_iD)); - persistMgr->transfer(TMEMBER(_is3D)); - persistMgr->transfer(TMEMBER(_movable)); + persistMgr->transferBool(TMEMBER(_is3D)); + persistMgr->transferBool(TMEMBER(_movable)); persistMgr->transfer(TMEMBER(_posX)); persistMgr->transfer(TMEMBER(_posY)); persistMgr->transferFloat(TMEMBER(_relativeScale)); - persistMgr->transfer(TMEMBER(_rotatable)); + persistMgr->transferBool(TMEMBER(_rotatable)); persistMgr->transferFloat(TMEMBER(_scale)); persistMgr->transferPtr(TMEMBER_PTR(_sFX)); persistMgr->transfer(TMEMBER(_sFXStart)); persistMgr->transfer(TMEMBER(_sFXVolume)); - persistMgr->transfer(TMEMBER(_ready)); - persistMgr->transfer(TMEMBER(_rect)); - persistMgr->transfer(TMEMBER(_rectSet)); - persistMgr->transfer(TMEMBER(_registrable)); - persistMgr->transfer(TMEMBER(_shadowable)); + persistMgr->transferBool(TMEMBER(_ready)); + persistMgr->transferRect32(TMEMBER(_rect)); + persistMgr->transferBool(TMEMBER(_rectSet)); + persistMgr->transferBool(TMEMBER(_registrable)); + persistMgr->transferBool(TMEMBER(_shadowable)); persistMgr->transfer(TMEMBER(_soundEvent)); - persistMgr->transfer(TMEMBER(_zoomable)); + persistMgr->transferBool(TMEMBER(_zoomable)); persistMgr->transferFloat(TMEMBER(_scaleX)); persistMgr->transferFloat(TMEMBER(_scaleY)); persistMgr->transferFloat(TMEMBER(_rotate)); - persistMgr->transfer(TMEMBER(_rotateValid)); + persistMgr->transferBool(TMEMBER(_rotateValid)); persistMgr->transferFloat(TMEMBER(_relativeRotate)); - persistMgr->transfer(TMEMBER(_saveState)); - persistMgr->transfer(TMEMBER(_nonIntMouseEvents)); + persistMgr->transferBool(TMEMBER(_saveState)); + persistMgr->transferBool(TMEMBER(_nonIntMouseEvents)); persistMgr->transfer(TMEMBER_INT(_sFXType)); persistMgr->transferFloat(TMEMBER(_sFXParam1)); @@ -1039,7 +1039,7 @@ bool BaseObject::setActiveCursor(const char *filename) { ////////////////////////////////////////////////////////////////////////// -int BaseObject::getHeight() { +int32 BaseObject::getHeight() { return 0; } diff --git a/engines/wintermute/base/base_object.h b/engines/wintermute/base/base_object.h index 42041c5e3c..a190b1bcb4 100644 --- a/engines/wintermute/base/base_object.h +++ b/engines/wintermute/base/base_object.h @@ -89,7 +89,7 @@ public: virtual bool handleMouseWheel(int delta); virtual bool handleMouse(TMouseEvent event, TMouseButton button); virtual bool handleKeypress(Common::Event *event, bool printable = false); - virtual int getHeight(); + virtual int32 getHeight(); bool setCursor(const char *filename); bool setActiveCursor(const char *filename); bool cleanup(); diff --git a/engines/wintermute/base/base_parser.cpp b/engines/wintermute/base/base_parser.cpp index 0b677b6cb2..ff9c6c81b0 100644 --- a/engines/wintermute/base/base_parser.cpp +++ b/engines/wintermute/base/base_parser.cpp @@ -250,10 +250,10 @@ Common::String BaseParser::getToken(char **buf) { *t++ = 0; } else if (*b == 0) { *buf = b; - return nullptr; + return Common::String(); } else { // Error. - return nullptr; + return Common::String(); } *buf = b; diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp index e5542d96b7..1caa0ad20b 100644 --- a/engines/wintermute/base/base_persistence_manager.cpp +++ b/engines/wintermute/base/base_persistence_manager.cpp @@ -587,7 +587,7 @@ double BasePersistenceManager::getDouble() { ////////////////////////////////////////////////////////////////////////// // bool -bool BasePersistenceManager::transfer(const char *name, bool *val) { +bool BasePersistenceManager::transferBool(const char *name, bool *val) { if (_saving) { _saveStream->writeByte(*val); if (_saveStream->err()) { @@ -663,7 +663,7 @@ bool BasePersistenceManager::transferFloat(const char *name, float *val) { ////////////////////////////////////////////////////////////////////////// // double -bool BasePersistenceManager::transfer(const char *name, double *val) { +bool BasePersistenceManager::transferDouble(const char *name, double *val) { if (_saving) { putDouble(*val); if (_saveStream->err()) { @@ -769,7 +769,7 @@ bool BasePersistenceManager::transfer(const char *name, AnsiStringArray &val) { ////////////////////////////////////////////////////////////////////////// // BYTE -bool BasePersistenceManager::transfer(const char *name, byte *val) { +bool BasePersistenceManager::transferByte(const char *name, byte *val) { if (_saving) { _saveStream->writeByte(*val); if (_saveStream->err()) { @@ -788,7 +788,7 @@ bool BasePersistenceManager::transfer(const char *name, byte *val) { ////////////////////////////////////////////////////////////////////////// // RECT -bool BasePersistenceManager::transfer(const char *name, Rect32 *val) { +bool BasePersistenceManager::transferRect32(const char *name, Rect32 *val) { if (_saving) { _saveStream->writeSint32LE(val->left); _saveStream->writeSint32LE(val->top); @@ -813,7 +813,7 @@ bool BasePersistenceManager::transfer(const char *name, Rect32 *val) { ////////////////////////////////////////////////////////////////////////// // POINT -bool BasePersistenceManager::transfer(const char *name, Point32 *val) { +bool BasePersistenceManager::transferPoint32(const char *name, Point32 *val) { if (_saving) { _saveStream->writeSint32LE(val->x); _saveStream->writeSint32LE(val->y); @@ -834,7 +834,7 @@ bool BasePersistenceManager::transfer(const char *name, Point32 *val) { ////////////////////////////////////////////////////////////////////////// // Vector2 -bool BasePersistenceManager::transfer(const char *name, Vector2 *val) { +bool BasePersistenceManager::transferVector2(const char *name, Vector2 *val) { if (_saving) { putFloat(val->x); putFloat(val->y); diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h index 3c0587b362..03316d9d19 100644 --- a/engines/wintermute/base/base_persistence_manager.h +++ b/engines/wintermute/base/base_persistence_manager.h @@ -77,15 +77,15 @@ public: bool transfer(const char *name, int32 *val); bool transfer(const char *name, uint32 *val); bool transferFloat(const char *name, float *val); - bool transfer(const char *name, double *val); - bool transfer(const char *name, bool *val); - bool transfer(const char *name, byte *val); - bool transfer(const char *name, Rect32 *val); - bool transfer(const char *name, Point32 *val); + bool transferDouble(const char *name, double *val); + bool transferBool(const char *name, bool *val); + bool transferByte(const char *name, byte *val); + bool transferRect32(const char *name, Rect32 *val); + bool transferPoint32(const char *name, Point32 *val); bool transfer(const char *name, const char **val); bool transfer(const char *name, char **val); bool transfer(const char *name, Common::String *val); - bool transfer(const char *name, Vector2 *val); + bool transferVector2(const char *name, Vector2 *val); bool transfer(const char *name, AnsiStringArray &Val); BasePersistenceManager(const char *savePrefix = nullptr, bool deleteSingleton = false); virtual ~BasePersistenceManager(); diff --git a/engines/wintermute/base/base_region.cpp b/engines/wintermute/base/base_region.cpp index 581583c922..2953adc8a5 100644 --- a/engines/wintermute/base/base_region.cpp +++ b/engines/wintermute/base/base_region.cpp @@ -48,7 +48,7 @@ BaseRegion::BaseRegion(BaseGame *inGame) : BaseObject(inGame) { _lastMimicScale = -1; _lastMimicX = _lastMimicY = INT_MIN; - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); } @@ -65,7 +65,7 @@ void BaseRegion::cleanup() { } _points.clear(); - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); _editorSelectedPoint = -1; } @@ -430,7 +430,7 @@ bool BaseRegion::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_active)); + persistMgr->transferBool(TMEMBER(_active)); persistMgr->transfer(TMEMBER(_editorSelectedPoint)); persistMgr->transferFloat(TMEMBER(_lastMimicScale)); persistMgr->transfer(TMEMBER(_lastMimicX)); @@ -491,7 +491,7 @@ bool BaseRegion::ptInPolygon(int32 x, int32 y) { ////////////////////////////////////////////////////////////////////////// bool BaseRegion::getBoundingRect(Rect32 *rect) { if (_points.size() == 0) { - BasePlatform::setRectEmpty(rect); + rect->setEmpty(); } else { int32 minX = INT_MAX, minY = INT_MAX, maxX = INT_MIN, maxY = INT_MIN; @@ -502,7 +502,7 @@ bool BaseRegion::getBoundingRect(Rect32 *rect) { maxX = MAX(maxX, _points[i]->x); maxY = MAX(maxY, _points[i]->y); } - BasePlatform::setRect(rect, minX, minY, maxX, maxY); + rect->setRect(minX, minY, maxX, maxY); } return STATUS_OK; } diff --git a/engines/wintermute/base/base_script_holder.cpp b/engines/wintermute/base/base_script_holder.cpp index a670ebf1af..2e21b3e8aa 100644 --- a/engines/wintermute/base/base_script_holder.cpp +++ b/engines/wintermute/base/base_script_holder.cpp @@ -281,7 +281,7 @@ bool BaseScriptHolder::persist(BasePersistenceManager *persistMgr) { BaseScriptable::persist(persistMgr); persistMgr->transfer(TMEMBER(_filename)); - persistMgr->transfer(TMEMBER(_freezable)); + persistMgr->transferBool(TMEMBER(_freezable)); if (persistMgr->getIsSaving()) { const char *name = getName(); persistMgr->transfer(TMEMBER(name)); diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp index 383655e0af..df696f21a2 100644 --- a/engines/wintermute/base/base_sprite.cpp +++ b/engines/wintermute/base/base_sprite.cpp @@ -462,7 +462,7 @@ bool BaseSprite::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, float return false; } - BasePlatform::setRectEmpty(rect); + rect->setEmpty(); for (uint32 i = 0; i < _frames.size(); i++) { Rect32 frame; Rect32 temp; @@ -520,29 +520,29 @@ bool BaseSprite::saveAsText(BaseDynamicBuffer *buffer, int indent) { bool BaseSprite::persist(BasePersistenceManager *persistMgr) { BaseScriptHolder::persist(persistMgr); - persistMgr->transfer(TMEMBER(_canBreak)); - persistMgr->transfer(TMEMBER(_changed)); - persistMgr->transfer(TMEMBER(_paused)); - persistMgr->transfer(TMEMBER(_continuous)); + persistMgr->transferBool(TMEMBER(_canBreak)); + persistMgr->transferBool(TMEMBER(_changed)); + persistMgr->transferBool(TMEMBER(_paused)); + persistMgr->transferBool(TMEMBER(_continuous)); persistMgr->transfer(TMEMBER(_currentFrame)); - persistMgr->transfer(TMEMBER(_editorAllFrames)); + persistMgr->transferBool(TMEMBER(_editorAllFrames)); persistMgr->transfer(TMEMBER(_editorBgAlpha)); persistMgr->transfer(TMEMBER(_editorBgFile)); persistMgr->transfer(TMEMBER(_editorBgOffsetX)); persistMgr->transfer(TMEMBER(_editorBgOffsetY)); - persistMgr->transfer(TMEMBER(_editorMuted)); - persistMgr->transfer(TMEMBER(_finished)); + persistMgr->transferBool(TMEMBER(_editorMuted)); + persistMgr->transferBool(TMEMBER(_finished)); _frames.persist(persistMgr); persistMgr->transfer(TMEMBER(_lastFrameTime)); - persistMgr->transfer(TMEMBER(_looping)); + persistMgr->transferBool(TMEMBER(_looping)); persistMgr->transfer(TMEMBER(_moveX)); persistMgr->transfer(TMEMBER(_moveY)); persistMgr->transferPtr(TMEMBER_PTR(_owner)); - persistMgr->transfer(TMEMBER(_precise)); - persistMgr->transfer(TMEMBER(_streamed)); - persistMgr->transfer(TMEMBER(_streamedKeepLoaded)); + persistMgr->transferBool(TMEMBER(_precise)); + persistMgr->transferBool(TMEMBER(_streamed)); + persistMgr->transferBool(TMEMBER(_streamedKeepLoaded)); return STATUS_OK; diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp index 1055987f6b..490a9945db 100644 --- a/engines/wintermute/base/base_sub_frame.cpp +++ b/engines/wintermute/base/base_sub_frame.cpp @@ -34,7 +34,6 @@ #include "engines/wintermute/base/base_surface_storage.h" #include "engines/wintermute/base/base_game.h" #include "engines/wintermute/base/base_engine.h" -#include "engines/wintermute/platform_osystem.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/base/scriptables/script_value.h" #include "engines/wintermute/base/scriptables/script_stack.h" @@ -54,7 +53,7 @@ BaseSubFrame::BaseSubFrame(BaseGame *inGame) : BaseScriptable(inGame, true) { _transparent = 0xFFFF00FF; _wantsDefaultRect = false; - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); _editorSelected = false; @@ -121,7 +120,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { int r = 255, g = 255, b = 255; int ar = 255, ag = 255, ab = 255, alpha = 255; bool custoTrans = false; - BasePlatform::setRectEmpty(&rect); + rect.setEmpty(); char *surfaceFile = nullptr; delete _surface; @@ -208,7 +207,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { return STATUS_FAILED; } */ - if (BasePlatform::isRectEmpty(&rect)) { + if (rect.isRectEmpty()) { setDefaultRect(); } else { setRect(rect); @@ -219,7 +218,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { Rect32 BaseSubFrame::getRect() { if (_wantsDefaultRect && _surface) { - BasePlatform::setRect(&_rect, 0, 0, _surface->getWidth(), _surface->getHeight()); + _rect.setRect(0, 0, _surface->getWidth(), _surface->getHeight()); _wantsDefaultRect = false; } return _rect; @@ -294,11 +293,10 @@ bool BaseSubFrame::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, flo float ratioX = scaleX / 100.0f; float ratioY = scaleY / 100.0f; - BasePlatform::setRect(rect, - (int)(x - _hotspotX * ratioX), - (int)(y - _hotspotY * ratioY), - (int)(x - _hotspotX * ratioX + (getRect().right - getRect().left) * ratioX), - (int)(y - _hotspotY * ratioY + (getRect().bottom - getRect().top) * ratioY)); + rect->setRect((int)(x - _hotspotX * ratioX), + (int)(y - _hotspotY * ratioY), + (int)(x - _hotspotX * ratioX + (getRect().right - getRect().left) * ratioX), + (int)(y - _hotspotY * ratioY + (getRect().bottom - getRect().top) * ratioY)); return true; } @@ -318,9 +316,9 @@ bool BaseSubFrame::saveAsText(BaseDynamicBuffer *buffer, int indent, bool comple } Rect32 rect; - BasePlatform::setRectEmpty(&rect); + rect.setEmpty(); if (_surface) { - BasePlatform::setRect(&rect, 0, 0, _surface->getWidth(), _surface->getHeight()); + rect.setRect(0, 0, _surface->getWidth(), _surface->getHeight()); } if (!(rect == getRect())) { buffer->putTextIndent(indent + 2, "RECT { %d,%d,%d,%d }\n", getRect().left, getRect().top, getRect().right, getRect().bottom); @@ -376,7 +374,7 @@ void BaseSubFrame::setDefaultRect() { _wantsDefaultRect = true; } else { _wantsDefaultRect = false; - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); } } @@ -386,26 +384,26 @@ bool BaseSubFrame::persist(BasePersistenceManager *persistMgr) { BaseScriptable::persist(persistMgr); - persistMgr->transfer(TMEMBER(_2DOnly)); - persistMgr->transfer(TMEMBER(_3DOnly)); + persistMgr->transferBool(TMEMBER(_2DOnly)); + persistMgr->transferBool(TMEMBER(_3DOnly)); persistMgr->transfer(TMEMBER(_alpha)); - persistMgr->transfer(TMEMBER(_decoration)); - persistMgr->transfer(TMEMBER(_editorSelected)); + persistMgr->transferBool(TMEMBER(_decoration)); + persistMgr->transferBool(TMEMBER(_editorSelected)); persistMgr->transfer(TMEMBER(_hotspotX)); persistMgr->transfer(TMEMBER(_hotspotY)); - persistMgr->transfer(TMEMBER(_rect)); - persistMgr->transfer(TMEMBER(_wantsDefaultRect)); + persistMgr->transferRect32(TMEMBER(_rect)); + persistMgr->transferBool(TMEMBER(_wantsDefaultRect)); persistMgr->transfer(TMEMBER(_surfaceFilename)); - persistMgr->transfer(TMEMBER(_cKDefault)); - persistMgr->transfer(TMEMBER(_cKRed)); - persistMgr->transfer(TMEMBER(_cKGreen)); - persistMgr->transfer(TMEMBER(_cKBlue)); + persistMgr->transferBool(TMEMBER(_cKDefault)); + persistMgr->transferByte(TMEMBER(_cKRed)); + persistMgr->transferByte(TMEMBER(_cKGreen)); + persistMgr->transferByte(TMEMBER(_cKBlue)); persistMgr->transfer(TMEMBER(_lifeTime)); - persistMgr->transfer(TMEMBER(_keepLoaded)); - persistMgr->transfer(TMEMBER(_mirrorX)); - persistMgr->transfer(TMEMBER(_mirrorY)); + persistMgr->transferBool(TMEMBER(_keepLoaded)); + persistMgr->transferBool(TMEMBER(_mirrorX)); + persistMgr->transferBool(TMEMBER(_mirrorY)); persistMgr->transfer(TMEMBER(_transparent)); return STATUS_OK; diff --git a/engines/wintermute/base/base_viewport.cpp b/engines/wintermute/base/base_viewport.cpp index 09ac80e9de..acc0ee7561 100644 --- a/engines/wintermute/base/base_viewport.cpp +++ b/engines/wintermute/base/base_viewport.cpp @@ -29,7 +29,6 @@ #include "engines/wintermute/base/base_viewport.h" #include "engines/wintermute/base/base_engine.h" #include "engines/wintermute/base/base_persistence_manager.h" -#include "engines/wintermute/platform_osystem.h" #include "engines/wintermute/base/gfx/base_renderer.h" namespace Wintermute { @@ -38,7 +37,7 @@ IMPLEMENT_PERSISTENT(BaseViewport, false) ////////////////////////////////////////////////////////////////////////// BaseViewport::BaseViewport(BaseGame *inGame) : BaseClass(inGame) { - BasePlatform::setRectEmpty(&_rect); + _rect.setEmpty(); _mainObject = nullptr; _offsetX = _offsetY = 0; } @@ -58,7 +57,7 @@ bool BaseViewport::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_mainObject)); persistMgr->transfer(TMEMBER(_offsetX)); persistMgr->transfer(TMEMBER(_offsetY)); - persistMgr->transfer(TMEMBER(_rect)); + persistMgr->transferRect32(TMEMBER(_rect)); return STATUS_OK; } @@ -73,7 +72,7 @@ bool BaseViewport::setRect(int32 left, int32 top, int32 right, int32 bottom, boo bottom = MIN(bottom, BaseEngine::instance().getRenderer()->getHeight()); } - BasePlatform::setRect(&_rect, left, top, right, bottom); + _rect.setRect(left, top, right, bottom); _offsetX = left; _offsetY = top; return STATUS_OK; diff --git a/engines/wintermute/base/font/base_font_bitmap.cpp b/engines/wintermute/base/font/base_font_bitmap.cpp index 23a633a5a8..dd54e5eb3f 100644 --- a/engines/wintermute/base/font/base_font_bitmap.cpp +++ b/engines/wintermute/base/font/base_font_bitmap.cpp @@ -37,7 +37,6 @@ #include "engines/wintermute/base/base_frame.h" #include "engines/wintermute/base/base_sprite.h" #include "engines/wintermute/base/base_file_manager.h" -#include "engines/wintermute/platform_osystem.h" namespace Wintermute { @@ -253,7 +252,7 @@ void BaseFontBitmap::drawChar(byte c, int x, int y) { tileWidth = _widths[c]; } - BasePlatform::setRect(&rect, col * _tileWidth, row * _tileHeight, col * _tileWidth + tileWidth, (row + 1)*_tileHeight); + rect.setRect(col * _tileWidth, row * _tileHeight, col * _tileWidth + tileWidth, (row + 1) * _tileHeight); bool handled = false; if (_sprite) { _sprite->getCurrentFrame(); @@ -511,8 +510,8 @@ bool BaseFontBitmap::persist(BasePersistenceManager *persistMgr) { } - persistMgr->transfer(TMEMBER(_fontextFix)); - persistMgr->transfer(TMEMBER(_wholeCell)); + persistMgr->transferBool(TMEMBER(_fontextFix)); + persistMgr->transferBool(TMEMBER(_wholeCell)); return STATUS_OK; diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp index bbc66902a1..13e88f5734 100644 --- a/engines/wintermute/base/font/base_font_truetype.cpp +++ b/engines/wintermute/base/font/base_font_truetype.cpp @@ -34,7 +34,6 @@ #include "engines/wintermute/base/base_game.h" #include "engines/wintermute/base/base_file_manager.h" #include "engines/wintermute/utils/utils.h" -#include "engines/wintermute/platform_osystem.h" #include "engines/wintermute/wintermute.h" #include "graphics/fonts/ttf.h" #include "graphics/fontman.h" @@ -227,7 +226,7 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign // and paint it if (surface) { Rect32 rc; - BasePlatform::setRect(&rc, 0, 0, surface->getWidth(), surface->getHeight()); + rc.setRect(0, 0, surface->getWidth(), surface->getHeight()); for (uint32 i = 0; i < _layers.size(); i++) { uint32 color = _layers[i]->_color; uint32 origForceAlpha = renderer->_forceAlphaColor; @@ -521,10 +520,10 @@ bool BaseFontTT::parseLayer(BaseTTFontLayer *layer, char *buffer) { bool BaseFontTT::persist(BasePersistenceManager *persistMgr) { BaseFont::persist(persistMgr); - persistMgr->transfer(TMEMBER(_isBold)); - persistMgr->transfer(TMEMBER(_isItalic)); - persistMgr->transfer(TMEMBER(_isUnderline)); - persistMgr->transfer(TMEMBER(_isStriked)); + persistMgr->transferBool(TMEMBER(_isBold)); + persistMgr->transferBool(TMEMBER(_isItalic)); + persistMgr->transferBool(TMEMBER(_isUnderline)); + persistMgr->transferBool(TMEMBER(_isStriked)); persistMgr->transfer(TMEMBER(_fontHeight)); persistMgr->transfer(TMEMBER(_fontFile)); diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp index 1f171209d7..818010e00e 100644 --- a/engines/wintermute/base/gfx/base_renderer.cpp +++ b/engines/wintermute/base/gfx/base_renderer.cpp @@ -65,7 +65,7 @@ BaseRenderer::BaseRenderer(BaseGame *inGame) : BaseClass(inGame) { _loadImageX = _loadImageY = 0; _width = _height = _bPP = 0; - BasePlatform::setRectEmpty(&_monitorRect); + _monitorRect.setEmpty(); _realWidth = _realHeight = 0; _drawOffsetX = _drawOffsetY = 0; @@ -374,7 +374,7 @@ bool BaseRenderer::displayIndicator() { } if (_saveLoadImage && !_hasDrawnSaveLoadImage) { Rect32 rc; - BasePlatform::setRect(&rc, 0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight()); + rc.setRect(0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight()); if (_loadInProgress) { _saveLoadImage->displayTrans(_loadImageX, _loadImageY, rc); } else { diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp index aaffa0965a..c5c049a37c 100644 --- a/engines/wintermute/base/particles/part_emitter.cpp +++ b/engines/wintermute/base/particles/part_emitter.cpp @@ -38,7 +38,6 @@ #include "engines/wintermute/base/base_file_manager.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/utils/utils.h" -#include "engines/wintermute/platform_osystem.h" #include "common/str.h" #include "common/math.h" @@ -50,7 +49,7 @@ IMPLEMENT_PERSISTENT(PartEmitter, false) PartEmitter::PartEmitter(BaseGame *inGame, BaseScriptHolder *owner) : BaseObject(inGame) { _width = _height = 0; - BasePlatform::setRectEmpty(&_border); + _border.setEmpty(); _borderThicknessLeft = _borderThicknessRight = _borderThicknessTop = _borderThicknessBottom = 0; _angle1 = _angle2 = 0; @@ -198,7 +197,7 @@ bool PartEmitter::initParticle(PartParticle *particle, uint32 currentTime, uint3 float angVelocity = BaseUtils::randomFloat(_angVelocity1, _angVelocity2); float growthRate = BaseUtils::randomFloat(_growthRate1, _growthRate2); - if (!BasePlatform::isRectEmpty(&_border)) { + if (!_border.isRectEmpty()) { int thicknessLeft = (int)(_borderThicknessLeft - (float)_borderThicknessLeft * posZ / 100.0f); int thicknessRight = (int)(_borderThicknessRight - (float)_borderThicknessRight * posZ / 100.0f); int thicknessTop = (int)(_borderThicknessTop - (float)_borderThicknessTop * posZ / 100.0f); @@ -386,7 +385,7 @@ bool PartEmitter::compareZ(const PartParticle *p1, const PartParticle *p2) { ////////////////////////////////////////////////////////////////////////// bool PartEmitter::setBorder(int x, int y, int width, int height) { - BasePlatform::setRect(&_border, x, y, x + width, y + height); + _border.setRect(x, y, x + width, y + height); return STATUS_OK; } @@ -1165,25 +1164,25 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) { persistMgr->transferFloat(TMEMBER(_velocity1)); persistMgr->transferFloat(TMEMBER(_velocity2)); - persistMgr->transfer(TMEMBER(_velocityZBased)); + persistMgr->transferBool(TMEMBER(_velocityZBased)); persistMgr->transferFloat(TMEMBER(_scale1)); persistMgr->transferFloat(TMEMBER(_scale2)); - persistMgr->transfer(TMEMBER(_scaleZBased)); + persistMgr->transferBool(TMEMBER(_scaleZBased)); persistMgr->transfer(TMEMBER(_maxParticles)); persistMgr->transfer(TMEMBER(_lifeTime1)); persistMgr->transfer(TMEMBER(_lifeTime2)); - persistMgr->transfer(TMEMBER(_lifeTimeZBased)); + persistMgr->transferBool(TMEMBER(_lifeTimeZBased)); persistMgr->transfer(TMEMBER(_genInterval)); persistMgr->transfer(TMEMBER(_genAmount)); - persistMgr->transfer(TMEMBER(_running)); + persistMgr->transferBool(TMEMBER(_running)); persistMgr->transfer(TMEMBER(_overheadTime)); - persistMgr->transfer(TMEMBER(_border)); + persistMgr->transferRect32(TMEMBER(_border)); persistMgr->transfer(TMEMBER(_borderThicknessLeft)); persistMgr->transfer(TMEMBER(_borderThicknessRight)); persistMgr->transfer(TMEMBER(_borderThicknessTop)); @@ -1194,7 +1193,7 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_alpha1)); persistMgr->transfer(TMEMBER(_alpha2)); - persistMgr->transfer(TMEMBER(_alphaTimeBased)); + persistMgr->transferBool(TMEMBER(_alphaTimeBased)); persistMgr->transferFloat(TMEMBER(_angVelocity1)); persistMgr->transferFloat(TMEMBER(_angVelocity2)); @@ -1204,9 +1203,9 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) { persistMgr->transferFloat(TMEMBER(_growthRate1)); persistMgr->transferFloat(TMEMBER(_growthRate2)); - persistMgr->transfer(TMEMBER(_exponentialGrowth)); + persistMgr->transferBool(TMEMBER(_exponentialGrowth)); - persistMgr->transfer(TMEMBER(_useRegion)); + persistMgr->transferBool(TMEMBER(_useRegion)); persistMgr->transfer(TMEMBER_INT(_maxBatches)); persistMgr->transfer(TMEMBER_INT(_batchesGenerated)); diff --git a/engines/wintermute/base/particles/part_force.cpp b/engines/wintermute/base/particles/part_force.cpp index 122cdf1afe..e7583e554a 100644 --- a/engines/wintermute/base/particles/part_force.cpp +++ b/engines/wintermute/base/particles/part_force.cpp @@ -55,8 +55,8 @@ bool PartForce::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(name)); setName(name); } - persistMgr->transfer(TMEMBER(_pos)); - persistMgr->transfer(TMEMBER(_direction)); + persistMgr->transferVector2(TMEMBER(_pos)); + persistMgr->transferVector2(TMEMBER(_direction)); persistMgr->transfer(TMEMBER_INT(_type)); return STATUS_OK; diff --git a/engines/wintermute/base/particles/part_particle.cpp b/engines/wintermute/base/particles/part_particle.cpp index 86cacacb5c..c5bf0f8326 100644 --- a/engines/wintermute/base/particles/part_particle.cpp +++ b/engines/wintermute/base/particles/part_particle.cpp @@ -45,7 +45,7 @@ PartParticle::PartParticle(BaseGame *inGame) : BaseClass(inGame) { _creationTime = 0; _lifeTime = 0; _isDead = true; - BasePlatform::setRectEmpty(&_border); + _border.setEmpty(); _state = PARTICLE_NORMAL; _fadeStart = 0; @@ -125,7 +125,7 @@ bool PartParticle::update(PartEmitter *emitter, uint32 currentTime, uint32 timer } // particle hit the border - if (!_isDead && !BasePlatform::isRectEmpty(&_border)) { + if (!_isDead && !_border.isRectEmpty()) { Point32 p; p.x = (int32)_pos.x; p.y = (int32)_pos.y; @@ -232,14 +232,14 @@ bool PartParticle::fadeOut(uint32 currentTime, int fadeTime) { bool PartParticle::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_alpha1)); persistMgr->transfer(TMEMBER(_alpha2)); - persistMgr->transfer(TMEMBER(_border)); - persistMgr->transfer(TMEMBER(_pos)); + persistMgr->transferRect32(TMEMBER(_border)); + persistMgr->transferVector2(TMEMBER(_pos)); persistMgr->transferFloat(TMEMBER(_posZ)); - persistMgr->transfer(TMEMBER(_velocity)); + persistMgr->transferVector2(TMEMBER(_velocity)); persistMgr->transferFloat(TMEMBER(_scale)); persistMgr->transfer(TMEMBER(_creationTime)); persistMgr->transfer(TMEMBER(_lifeTime)); - persistMgr->transfer(TMEMBER(_isDead)); + persistMgr->transferBool(TMEMBER(_isDead)); persistMgr->transfer(TMEMBER_INT(_state)); persistMgr->transfer(TMEMBER(_fadeStart)); persistMgr->transfer(TMEMBER(_fadeTime)); @@ -247,7 +247,7 @@ bool PartParticle::persist(BasePersistenceManager *persistMgr) { persistMgr->transferFloat(TMEMBER(_angVelocity)); persistMgr->transferFloat(TMEMBER(_rotation)); persistMgr->transferFloat(TMEMBER(_growthRate)); - persistMgr->transfer(TMEMBER(_exponentialGrowth)); + persistMgr->transferBool(TMEMBER(_exponentialGrowth)); persistMgr->transfer(TMEMBER(_fadeStartAlpha)); if (persistMgr->getIsSaving()) { diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp index 5aeff78c50..49152eca00 100644 --- a/engines/wintermute/base/scriptables/script.cpp +++ b/engines/wintermute/base/scriptables/script.cpp @@ -1273,7 +1273,7 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_currentLine)); persistMgr->transferPtr(TMEMBER_PTR(_engine)); persistMgr->transfer(TMEMBER(_filename)); - persistMgr->transfer(TMEMBER(_freezable)); + persistMgr->transferBool(TMEMBER(_freezable)); persistMgr->transferPtr(TMEMBER_PTR(_globals)); persistMgr->transfer(TMEMBER(_iP)); persistMgr->transferPtr(TMEMBER_PTR(_scopeStack)); @@ -1283,18 +1283,18 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER_INT(_origState)); persistMgr->transferPtr(TMEMBER_PTR(_owner)); persistMgr->transferPtr(TMEMBER_PTR(_reg1)); - persistMgr->transfer(TMEMBER(_thread)); + persistMgr->transferBool(TMEMBER(_thread)); persistMgr->transfer(TMEMBER(_threadEvent)); persistMgr->transferPtr(TMEMBER_PTR(_thisStack)); persistMgr->transfer(TMEMBER(_timeSlice)); persistMgr->transferPtr(TMEMBER_PTR(_waitObject)); persistMgr->transferPtr(TMEMBER_PTR(_waitScript)); persistMgr->transfer(TMEMBER(_waitTime)); - persistMgr->transfer(TMEMBER(_waitFrozen)); + persistMgr->transferBool(TMEMBER(_waitFrozen)); - persistMgr->transfer(TMEMBER(_methodThread)); - persistMgr->transfer(TMEMBER(_methodThread)); - persistMgr->transfer(TMEMBER(_unbreakable)); + persistMgr->transferBool(TMEMBER(_methodThread)); + persistMgr->transferBool(TMEMBER(_methodThread)); // TODO-SAVE: Deduplicate. + persistMgr->transferBool(TMEMBER(_unbreakable)); persistMgr->transferPtr(TMEMBER_PTR(_parentScript)); if (!persistMgr->getIsSaving()) { diff --git a/engines/wintermute/base/scriptables/script_ext_file.cpp b/engines/wintermute/base/scriptables/script_ext_file.cpp index 18f7b8213a..5e6f0570ad 100644 --- a/engines/wintermute/base/scriptables/script_ext_file.cpp +++ b/engines/wintermute/base/scriptables/script_ext_file.cpp @@ -768,7 +768,7 @@ bool SXFile::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_filename)); persistMgr->transfer(TMEMBER(_mode)); - persistMgr->transfer(TMEMBER(_textMode)); + persistMgr->transferBool(TMEMBER(_textMode)); uint32 pos = 0; if (persistMgr->getIsSaving()) { diff --git a/engines/wintermute/base/scriptables/script_value.cpp b/engines/wintermute/base/scriptables/script_value.cpp index 31ec457df1..5b275746c0 100644 --- a/engines/wintermute/base/scriptables/script_value.cpp +++ b/engines/wintermute/base/scriptables/script_value.cpp @@ -791,11 +791,11 @@ void ScValue::setValue(ScValue *val) { bool ScValue::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); - persistMgr->transfer(TMEMBER(_persistent)); - persistMgr->transfer(TMEMBER(_isConstVar)); + persistMgr->transferBool(TMEMBER(_persistent)); + persistMgr->transferBool(TMEMBER(_isConstVar)); persistMgr->transfer(TMEMBER_INT(_type)); - persistMgr->transfer(TMEMBER(_valBool)); - persistMgr->transfer(TMEMBER(_valFloat)); + persistMgr->transferBool(TMEMBER(_valBool)); + persistMgr->transferDouble(TMEMBER(_valFloat)); persistMgr->transfer(TMEMBER(_valInt)); persistMgr->transferPtr(TMEMBER_PTR(_valNative)); diff --git a/engines/wintermute/base/sound/base_sound.cpp b/engines/wintermute/base/sound/base_sound.cpp index c1923b3ca8..c3f2ff0476 100644 --- a/engines/wintermute/base/sound/base_sound.cpp +++ b/engines/wintermute/base/sound/base_sound.cpp @@ -167,13 +167,13 @@ bool BaseSound::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_soundFilename)); - persistMgr->transfer(TMEMBER(_soundLooping)); - persistMgr->transfer(TMEMBER(_soundPaused)); - persistMgr->transfer(TMEMBER(_soundFreezePaused)); - persistMgr->transfer(TMEMBER(_soundPlaying)); + persistMgr->transferBool(TMEMBER(_soundLooping)); + persistMgr->transferBool(TMEMBER(_soundPaused)); + persistMgr->transferBool(TMEMBER(_soundFreezePaused)); + persistMgr->transferBool(TMEMBER(_soundPlaying)); persistMgr->transfer(TMEMBER(_soundPosition)); persistMgr->transfer(TMEMBER(_soundPrivateVolume)); - persistMgr->transfer(TMEMBER(_soundStreamed)); + persistMgr->transferBool(TMEMBER(_soundStreamed)); persistMgr->transfer(TMEMBER_INT(_soundType)); persistMgr->transfer(TMEMBER(_soundLoopStart)); diff --git a/engines/wintermute/graphics/transparent_surface.cpp b/engines/wintermute/graphics/transparent_surface.cpp index 43deb62db6..053acf29e9 100644 --- a/engines/wintermute/graphics/transparent_surface.cpp +++ b/engines/wintermute/graphics/transparent_surface.cpp @@ -76,7 +76,6 @@ public: * @param *outa, *outr, *outg, *outb pointer to the output pixel. * @param *outa, *outr, *outg, *outb pointer to the colormod components. */ - void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb, byte *ca, byte *cr, byte *cg, byte *cb) { if (*ca != 255) { ina = (ina) * (*ca) >> 8; @@ -108,7 +107,6 @@ void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *o * @param *outa, *outr, *outg, *outb pointer to the output pixel. * @param *outa, *outr, *outg, *outb pointer to the colormod components. */ - void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb, byte *ca, byte *cr, byte *cg, byte *cb) { //if (*ca != 255) { // ina = ina * (*ca) >> 8; @@ -234,7 +232,6 @@ void BlenderNormal::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *out * @param ina, inr, ing, inb: the input pixel, split into its components. * @param *outa, *outr, *outg, *outb pointer to the output pixel. */ - void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb) { if (ina == 0) { @@ -259,7 +256,6 @@ void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte * @param ina, inr, ing, inb: the input pixel, split into its components. * @param *outa, *outr, *outg, *outb pointer to the output pixel. */ - void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb) { if (ina == 0) { @@ -297,10 +293,11 @@ TransparentSurface::TransparentSurface(const Surface &surf, bool copyData) : Sur } } -void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) { /** * Optimized version of doBlit to be used w/opaque blitting (no alpha). */ +void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) { + byte *in; byte *out; @@ -320,7 +317,6 @@ void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 /** * Optimized version of doBlit to be used w/binary blitting (blit or no-blit, no blending). */ - void doBlitBinaryFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) { byte *in; @@ -350,8 +346,8 @@ void doBlitBinaryFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 * What we have here is a template method that calls blendPixel() from a different * class - the one we call it with - thus performing a different type of blending. * - * @param *ino a pointer to the input surface - * @param *outo a pointer to the output surface + * @param ino a pointer to the input surface + * @param outo a pointer to the output surface * @param width width of the input surface * @param height height of the input surface * @param pitch pitch of the output surface - that is, width in bytes of every row, usually bpp * width of the TARGET surface (the area we are blitting to might be smaller, do the math) @@ -924,8 +920,4 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight) } - - - - } // End of namespace Wintermute diff --git a/engines/wintermute/graphics/transparent_surface.h b/engines/wintermute/graphics/transparent_surface.h index b887c05fa8..1f3827d1a9 100644 --- a/engines/wintermute/graphics/transparent_surface.h +++ b/engines/wintermute/graphics/transparent_surface.h @@ -99,32 +99,31 @@ struct TransparentSurface : public Graphics::Surface { /** @brief renders the surface to another surface - @param pDest a pointer to the target image. In most cases this is the framebuffer. - @param PosX the position on the X-axis in the target image in pixels where the image is supposed to be rendered.<br> + @param target a pointer to the target surface. In most cases this is the framebuffer. + @param posX the position on the X-axis in the target image in pixels where the image is supposed to be rendered.<br> The default value is 0. - @param PosY the position on the Y-axis in the target image in pixels where the image is supposed to be rendered.<br> + @param posY the position on the Y-axis in the target image in pixels where the image is supposed to be rendered.<br> The default value is 0. - @param Flipping how the the image should be flipped.<br> + @param flipping how the the image should be flipped.<br> The default value is BS_Image::FLIP_NONE (no flipping) - @param pSrcPartRect Pointer on Common::Rect which specifies the section to be rendered. If the whole image has to be rendered the Pointer is NULL.<br> + @param pPartRect Pointer on Common::Rect which specifies the section to be rendered. If the whole image has to be rendered the Pointer is NULL.<br> This referes to the unflipped and unscaled image.<br> The default value is NULL. - @param Color an ARGB color value, which determines the parameters for the color modulation und alpha blending.<br> + @param color an ARGB color value, which determines the parameters for the color modulation und alpha blending.<br> The alpha component of the color determines the alpha blending parameter (0 = no covering, 255 = full covering).<br> The color components determines the color for color modulation.<br> The default value is BS_ARGB(255, 255, 255, 255) (full covering, no color modulation). The macros BS_RGB and BS_ARGB can be used for the creation of the color value. - @param Width the output width of the screen section. + @param width the output width of the screen section. The images will be scaled if the output width of the screen section differs from the image section.<br> The value -1 determines that the image should not be scaled.<br> The default value is -1. - @param Width the output height of the screen section. + @param height the output height of the screen section. The images will be scaled if the output width of the screen section differs from the image section.<br> The value -1 determines that the image should not be scaled.<br> The default value is -1. @return returns false if the rendering failed. */ - Common::Rect blit(Graphics::Surface &target, int posX = 0, int posY = 0, int flipping = FLIP_NONE, Common::Rect *pPartRect = nullptr, @@ -137,8 +136,9 @@ struct TransparentSurface : public Graphics::Surface { * @brief Scale function; this returns a transformed version of this surface after rotation and * scaling. Please do not use this if angle != 0, use rotoscale. * - * @param transform a TransformStruct wrapping the required info. @see TransformStruct - * + * @param newWidth the resulting width. + * @param newHeight the resulting height. + * @see TransformStruct */ TransparentSurface *scale(uint16 newWidth, uint16 newHeight) const; diff --git a/engines/wintermute/math/rect32.h b/engines/wintermute/math/rect32.h index f522ab3a35..a4a64690e2 100644 --- a/engines/wintermute/math/rect32.h +++ b/engines/wintermute/math/rect32.h @@ -94,12 +94,24 @@ struct Rect32 { left = right = top = bottom = 0; } + bool isRectEmpty() const { + return (left >= right) || (top >= bottom); + } + void offsetRect(int dx, int dy) { left += dx; top += dy; right += dx; bottom += dy; } + + void setRect(int32 newLeft, int32 newTop, int32 newRight, int32 newBottom) { + this->left = newLeft; + this->top = newTop; + this->right = newRight; + this->bottom = newBottom; + } + /** * Check if the given rect is equal to this one. * diff --git a/engines/wintermute/platform_osystem.cpp b/engines/wintermute/platform_osystem.cpp index 87a127d001..9fa23c6074 100644 --- a/engines/wintermute/platform_osystem.cpp +++ b/engines/wintermute/platform_osystem.cpp @@ -169,52 +169,16 @@ bool BasePlatform::setCursorPos(int x, int y) { } ////////////////////////////////////////////////////////////////////////// -bool BasePlatform::showWindow(int nCmdShow) { - return false; -} - -////////////////////////////////////////////////////////////////////////// -void BasePlatform::setCapture() { - return; -} - -////////////////////////////////////////////////////////////////////////// -bool BasePlatform::releaseCapture() { - return false; -} - -////////////////////////////////////////////////////////////////////////// -bool BasePlatform::setRectEmpty(Rect32 *lprc) { - lprc->left = lprc->right = lprc->top = lprc->bottom = 0; - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool BasePlatform::isRectEmpty(const Rect32 *lprc) { - return (lprc->left >= lprc->right) || (lprc->top >= lprc->bottom); -} - -////////////////////////////////////////////////////////////////////////// bool BasePlatform::ptInRect(Rect32 *lprc, Point32 p) { return (p.x >= lprc->left) && (p.x < lprc->right) && (p.y >= lprc->top) && (p.y < lprc->bottom); } ////////////////////////////////////////////////////////////////////////// -bool BasePlatform::setRect(Rect32 *lprc, int left, int top, int right, int bottom) { - lprc->left = left; - lprc->top = top; - lprc->right = right; - lprc->bottom = bottom; - - return true; -} - -////////////////////////////////////////////////////////////////////////// bool BasePlatform::intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const Rect32 *lprcSrc2) { - if (isRectEmpty(lprcSrc1) || isRectEmpty(lprcSrc2) || + if (lprcSrc1->isRectEmpty() || lprcSrc2->isRectEmpty() || lprcSrc1->left >= lprcSrc2->right || lprcSrc2->left >= lprcSrc1->right || lprcSrc1->top >= lprcSrc2->bottom || lprcSrc2->top >= lprcSrc1->bottom) { - setRectEmpty(lprcDst); + lprcDst->setEmpty(); return false; } lprcDst->left = MAX(lprcSrc1->left, lprcSrc2->left); @@ -227,15 +191,15 @@ bool BasePlatform::intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const ////////////////////////////////////////////////////////////////////////// bool BasePlatform::unionRect(Rect32 *lprcDst, Rect32 *lprcSrc1, Rect32 *lprcSrc2) { - if (isRectEmpty(lprcSrc1)) { - if (isRectEmpty(lprcSrc2)) { - setRectEmpty(lprcDst); + if (lprcSrc1->isRectEmpty()) { + if (lprcSrc2->isRectEmpty()) { + lprcDst->setEmpty(); return false; } else { *lprcDst = *lprcSrc2; } } else { - if (isRectEmpty(lprcSrc2)) { + if (lprcSrc2->isRectEmpty()) { *lprcDst = *lprcSrc1; } else { lprcDst->left = MIN(lprcSrc1->left, lprcSrc2->left); diff --git a/engines/wintermute/platform_osystem.h b/engines/wintermute/platform_osystem.h index 46c86df909..16d55745b9 100644 --- a/engines/wintermute/platform_osystem.h +++ b/engines/wintermute/platform_osystem.h @@ -48,13 +48,7 @@ public: // Win32 API bindings static bool getCursorPos(Point32 *lpPoint); static bool setCursorPos(int x, int y); - static bool showWindow(int nCmdShow); - static void setCapture(); - static bool releaseCapture(); - - static bool setRectEmpty(Rect32 *lprc); - static bool isRectEmpty(const Rect32 *lprc); static bool ptInRect(Rect32 *lprc, Point32 p); static bool setRect(Rect32 *lprc, int left, int top, int right, int bottom); static bool intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const Rect32 *lprcSrc2); diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp index 42a873a0b4..3cc33f2362 100644 --- a/engines/wintermute/ui/ui_button.cpp +++ b/engines/wintermute/ui/ui_button.cpp @@ -655,7 +655,7 @@ bool UIButton::display(int offsetX, int offsetY) { BaseFont *font = 0; //RECT rect; - //BasePlatform::setRect(&rect, OffsetX + _posX, OffsetY + _posY, OffsetX+_posX+_width, OffsetY+_posY+_height); + //rect.setRect(OffsetX + _posX, OffsetY + _posY, OffsetX+_posX+_width, OffsetY+_posY+_height); //_hover = (!_disable && BasePlatform::ptInRect(&rect, _gameRef->_mousePos)!=FALSE); _hover = (!_disable && _gameRef->_activeObject == this && (_gameRef->_interactive || _gameRef->_state == GAME_SEMI_FROZEN)); @@ -1183,20 +1183,20 @@ bool UIButton::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_backFocus)); persistMgr->transferPtr(TMEMBER_PTR(_backHover)); persistMgr->transferPtr(TMEMBER_PTR(_backPress)); - persistMgr->transfer(TMEMBER(_centerImage)); + persistMgr->transferBool(TMEMBER(_centerImage)); persistMgr->transferPtr(TMEMBER_PTR(_fontDisable)); persistMgr->transferPtr(TMEMBER_PTR(_fontFocus)); persistMgr->transferPtr(TMEMBER_PTR(_fontHover)); persistMgr->transferPtr(TMEMBER_PTR(_fontPress)); - persistMgr->transfer(TMEMBER(_hover)); + persistMgr->transferBool(TMEMBER(_hover)); persistMgr->transferPtr(TMEMBER_PTR(_image)); persistMgr->transferPtr(TMEMBER_PTR(_imageDisable)); persistMgr->transferPtr(TMEMBER_PTR(_imageFocus)); persistMgr->transferPtr(TMEMBER_PTR(_imageHover)); persistMgr->transferPtr(TMEMBER_PTR(_imagePress)); - persistMgr->transfer(TMEMBER(_pixelPerfect)); - persistMgr->transfer(TMEMBER(_press)); - persistMgr->transfer(TMEMBER(_stayPressed)); + persistMgr->transferBool(TMEMBER(_pixelPerfect)); + persistMgr->transferBool(TMEMBER(_press)); + persistMgr->transferBool(TMEMBER(_stayPressed)); if (!persistMgr->getIsSaving()) { _oneTimePress = false; diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp index a8da89b011..a1a89b7b01 100644 --- a/engines/wintermute/ui/ui_object.cpp +++ b/engines/wintermute/ui/ui_object.cpp @@ -622,8 +622,8 @@ bool UIObject::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); persistMgr->transferPtr(TMEMBER_PTR(_back)); - persistMgr->transfer(TMEMBER(_canFocus)); - persistMgr->transfer(TMEMBER(_disable)); + persistMgr->transferBool(TMEMBER(_canFocus)); + persistMgr->transferBool(TMEMBER(_disable)); persistMgr->transferPtr(TMEMBER_PTR(_focusedWidget)); persistMgr->transferPtr(TMEMBER_PTR(_font)); persistMgr->transfer(TMEMBER(_height)); @@ -632,12 +632,12 @@ bool UIObject::persist(BasePersistenceManager *persistMgr) { persistMgr->transferPtr(TMEMBER_PTR(_listenerParamObject)); persistMgr->transfer(TMEMBER(_listenerParamDWORD)); persistMgr->transferPtr(TMEMBER_PTR(_parent)); - persistMgr->transfer(TMEMBER(_parentNotify)); - persistMgr->transfer(TMEMBER(_sharedFonts)); - persistMgr->transfer(TMEMBER(_sharedImages)); + persistMgr->transferBool(TMEMBER(_parentNotify)); + persistMgr->transferBool(TMEMBER(_sharedFonts)); + persistMgr->transferBool(TMEMBER(_sharedImages)); persistMgr->transfer(TMEMBER(_text)); persistMgr->transfer(TMEMBER_INT(_type)); - persistMgr->transfer(TMEMBER(_visible)); + persistMgr->transferBool(TMEMBER(_visible)); persistMgr->transfer(TMEMBER(_width)); return STATUS_OK; @@ -652,7 +652,10 @@ int32 UIObject::getWidth() const { return _width; } -int32 UIObject::getHeight() const { +// Has to be non-const to allow the virtual override to work, +// as other getHeight()-functions currently have the potential +// of having side-effects. +int32 UIObject::getHeight() { return _height; } diff --git a/engines/wintermute/ui/ui_object.h b/engines/wintermute/ui/ui_object.h index 8d14d8a6a4..ecbaebcee6 100644 --- a/engines/wintermute/ui/ui_object.h +++ b/engines/wintermute/ui/ui_object.h @@ -69,7 +69,7 @@ public: TUIObjectType _type; int32 getWidth() const; - int32 getHeight() const; + int32 getHeight() override; void setHeight(int32 height); void setWidth(int32 width); bool isDisabled() const; diff --git a/engines/wintermute/ui/ui_tiled_image.cpp b/engines/wintermute/ui/ui_tiled_image.cpp index e647e0d894..e895477a36 100644 --- a/engines/wintermute/ui/ui_tiled_image.cpp +++ b/engines/wintermute/ui/ui_tiled_image.cpp @@ -44,15 +44,15 @@ IMPLEMENT_PERSISTENT(UITiledImage, false) UITiledImage::UITiledImage(BaseGame *inGame) : BaseObject(inGame) { _image = nullptr; - BasePlatform::setRectEmpty(&_upLeft); - BasePlatform::setRectEmpty(&_upMiddle); - BasePlatform::setRectEmpty(&_upRight); - BasePlatform::setRectEmpty(&_middleLeft); - BasePlatform::setRectEmpty(&_middleMiddle); - BasePlatform::setRectEmpty(&_middleRight); - BasePlatform::setRectEmpty(&_downLeft); - BasePlatform::setRectEmpty(&_downMiddle); - BasePlatform::setRectEmpty(&_downRight); + _upLeft.setEmpty(); + _upMiddle.setEmpty(); + _upRight.setEmpty(); + _middleLeft.setEmpty(); + _middleMiddle.setEmpty(); + _middleRight.setEmpty(); + _downLeft.setEmpty(); + _downMiddle.setEmpty(); + _downRight.setEmpty(); } @@ -267,19 +267,19 @@ bool UITiledImage::loadBuffer(char *buffer, bool complete) { if (vTiles && hTiles) { // up row - BasePlatform::setRect(&_upLeft, 0, 0, h1, v1); - BasePlatform::setRect(&_upMiddle, h1, 0, h1 + h2, v1); - BasePlatform::setRect(&_upRight, h1 + h2, 0, h1 + h2 + h3, v1); + _upLeft.setRect(0, 0, h1, v1); + _upMiddle.setRect(h1, 0, h1 + h2, v1); + _upRight.setRect(h1 + h2, 0, h1 + h2 + h3, v1); // middle row - BasePlatform::setRect(&_middleLeft, 0, v1, h1, v1 + v2); - BasePlatform::setRect(&_middleMiddle, h1, v1, h1 + h2, v1 + v2); - BasePlatform::setRect(&_middleRight, h1 + h2, v1, h1 + h2 + h3, v1 + v2); + _middleLeft.setRect(0, v1, h1, v1 + v2); + _middleMiddle.setRect(h1, v1, h1 + h2, v1 + v2); + _middleRight.setRect(h1 + h2, v1, h1 + h2 + h3, v1 + v2); // down row - BasePlatform::setRect(&_downLeft, 0, v1 + v2, h1, v1 + v2 + v3); - BasePlatform::setRect(&_downMiddle, h1, v1 + v2, h1 + h2, v1 + v2 + v3); - BasePlatform::setRect(&_downRight, h1 + h2, v1 + v2, h1 + h2 + h3, v1 + v2 + v3); + _downLeft.setRect(0, v1 + v2, h1, v1 + v2 + v3); + _downMiddle.setRect(h1, v1 + v2, h1 + h2, v1 + v2 + v3); + _downRight.setRect(h1 + h2, v1 + v2, h1 + h2 + h3, v1 + v2 + v3); } // default @@ -287,34 +287,34 @@ bool UITiledImage::loadBuffer(char *buffer, bool complete) { int width = _image->_surface->getWidth() / 3; int height = _image->_surface->getHeight() / 3; - if (BasePlatform::isRectEmpty(&_upLeft)) { - BasePlatform::setRect(&_upLeft, 0, 0, width, height); + if (_upLeft.isRectEmpty()) { + _upLeft.setRect(0, 0, width, height); } - if (BasePlatform::isRectEmpty(&_upMiddle)) { - BasePlatform::setRect(&_upMiddle, width, 0, 2 * width, height); + if (_upMiddle.isRectEmpty()) { + _upMiddle.setRect(width, 0, 2 * width, height); } - if (BasePlatform::isRectEmpty(&_upRight)) { - BasePlatform::setRect(&_upRight, 2 * width, 0, 3 * width, height); + if (_upRight.isRectEmpty()) { + _upRight.setRect(2 * width, 0, 3 * width, height); } - if (BasePlatform::isRectEmpty(&_middleLeft)) { - BasePlatform::setRect(&_middleLeft, 0, height, width, 2 * height); + if (_middleLeft.isRectEmpty()) { + _middleLeft.setRect(0, height, width, 2 * height); } - if (BasePlatform::isRectEmpty(&_middleMiddle)) { - BasePlatform::setRect(&_middleMiddle, width, height, 2 * width, 2 * height); + if (_middleMiddle.isRectEmpty()) { + _middleMiddle.setRect(width, height, 2 * width, 2 * height); } - if (BasePlatform::isRectEmpty(&_middleRight)) { - BasePlatform::setRect(&_middleRight, 2 * width, height, 3 * width, 2 * height); + if (_middleRight.isRectEmpty()) { + _middleRight.setRect(2 * width, height, 3 * width, 2 * height); } - if (BasePlatform::isRectEmpty(&_downLeft)) { - BasePlatform::setRect(&_downLeft, 0, 2 * height, width, 3 * height); + if (_downLeft.isRectEmpty()) { + _downLeft.setRect(0, 2 * height, width, 3 * height); } - if (BasePlatform::isRectEmpty(&_downMiddle)) { - BasePlatform::setRect(&_downMiddle, width, 2 * height, 2 * width, 3 * height); + if (_downMiddle.isRectEmpty()) { + _downMiddle.setRect(width, 2 * height, 2 * width, 3 * height); } - if (BasePlatform::isRectEmpty(&_downRight)) { - BasePlatform::setRect(&_downRight, 2 * width, 2 * height, 3 * width, 3 * height); + if (_downRight.isRectEmpty()) { + _downRight.setRect(2 * width, 2 * height, 3 * width, 3 * height); } } @@ -369,16 +369,16 @@ void UITiledImage::correctSize(int32 *width, int32 *height) { bool UITiledImage::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_downLeft)); - persistMgr->transfer(TMEMBER(_downMiddle)); - persistMgr->transfer(TMEMBER(_downRight)); + persistMgr->transferRect32(TMEMBER(_downLeft)); + persistMgr->transferRect32(TMEMBER(_downMiddle)); + persistMgr->transferRect32(TMEMBER(_downRight)); persistMgr->transferPtr(TMEMBER_PTR(_image)); - persistMgr->transfer(TMEMBER(_middleLeft)); - persistMgr->transfer(TMEMBER(_middleMiddle)); - persistMgr->transfer(TMEMBER(_middleRight)); - persistMgr->transfer(TMEMBER(_upLeft)); - persistMgr->transfer(TMEMBER(_upMiddle)); - persistMgr->transfer(TMEMBER(_upRight)); + persistMgr->transferRect32(TMEMBER(_middleLeft)); + persistMgr->transferRect32(TMEMBER(_middleMiddle)); + persistMgr->transferRect32(TMEMBER(_middleRight)); + persistMgr->transferRect32(TMEMBER(_upLeft)); + persistMgr->transferRect32(TMEMBER(_upMiddle)); + persistMgr->transferRect32(TMEMBER(_upRight)); return STATUS_OK; } diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp index 9051ce8217..c9262198cf 100644 --- a/engines/wintermute/ui/ui_window.cpp +++ b/engines/wintermute/ui/ui_window.cpp @@ -54,8 +54,8 @@ IMPLEMENT_PERSISTENT(UIWindow, false) ////////////////////////////////////////////////////////////////////////// UIWindow::UIWindow(BaseGame *inGame) : UIObject(inGame) { - BasePlatform::setRectEmpty(&_titleRect); - BasePlatform::setRectEmpty(&_dragRect); + _titleRect.setEmpty(); + _dragRect.setEmpty(); _titleAlign = TAL_LEFT; _transparent = false; @@ -213,7 +213,7 @@ bool UIWindow::display(int offsetX, int offsetY) { image->draw(_posX + offsetX, _posY + offsetY, _transparent ? nullptr : this); } - if (!BasePlatform::isRectEmpty(&_titleRect) && font && _text) { + if (!_titleRect.isRectEmpty() && font && _text) { font->drawText((byte *)_text, _posX + offsetX + _titleRect.left, _posY + offsetY + _titleRect.top, _titleRect.right - _titleRect.left, _titleAlign, _titleRect.bottom - _titleRect.top); } @@ -676,11 +676,11 @@ bool UIWindow::saveAsText(BaseDynamicBuffer *buffer, int indent) { error("UIWindow::SaveAsText - Unhandled enum-value NUM_TEXT_ALIGN"); } - if (!BasePlatform::isRectEmpty(&_titleRect)) { + if (!_titleRect.isRectEmpty()) { buffer->putTextIndent(indent + 2, "TITLE_RECT { %d, %d, %d, %d }\n", _titleRect.left, _titleRect.top, _titleRect.right, _titleRect.bottom); } - if (!BasePlatform::isRectEmpty(&_dragRect)) { + if (!_dragRect.isRectEmpty()) { buffer->putTextIndent(indent + 2, "DRAG_RECT { %d, %d, %d, %d }\n", _dragRect.left, _dragRect.top, _dragRect.right, _dragRect.bottom); } @@ -1227,7 +1227,7 @@ bool UIWindow::handleMouse(TMouseEvent event, TMouseButton button) { bool res = UIObject::handleMouse(event, button); // handle window dragging - if (!BasePlatform::isRectEmpty(&_dragRect)) { + if (!_dragRect.isRectEmpty()) { // start drag if (event == MOUSE_CLICK && button == MOUSE_BUTTON_LEFT) { Rect32 dragRect = _dragRect; @@ -1258,24 +1258,24 @@ bool UIWindow::persist(BasePersistenceManager *persistMgr) { UIObject::persist(persistMgr); persistMgr->transferPtr(TMEMBER_PTR(_backInactive)); - persistMgr->transfer(TMEMBER(_clipContents)); - persistMgr->transfer(TMEMBER(_dragFrom)); - persistMgr->transfer(TMEMBER(_dragging)); - persistMgr->transfer(TMEMBER(_dragRect)); - persistMgr->transfer(TMEMBER(_fadeBackground)); + persistMgr->transferBool(TMEMBER(_clipContents)); + persistMgr->transferPoint32(TMEMBER(_dragFrom)); + persistMgr->transferBool(TMEMBER(_dragging)); + persistMgr->transferRect32(TMEMBER(_dragRect)); + persistMgr->transferBool(TMEMBER(_fadeBackground)); persistMgr->transfer(TMEMBER(_fadeColor)); persistMgr->transferPtr(TMEMBER_PTR(_fontInactive)); persistMgr->transferPtr(TMEMBER_PTR(_imageInactive)); - persistMgr->transfer(TMEMBER(_inGame)); - persistMgr->transfer(TMEMBER(_isMenu)); + persistMgr->transferBool(TMEMBER(_inGame)); + persistMgr->transferBool(TMEMBER(_isMenu)); persistMgr->transfer(TMEMBER_INT(_mode)); persistMgr->transferPtr(TMEMBER_PTR(_shieldButton)); persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow)); persistMgr->transfer(TMEMBER_INT(_titleAlign)); - persistMgr->transfer(TMEMBER(_titleRect)); - persistMgr->transfer(TMEMBER(_transparent)); + persistMgr->transferRect32(TMEMBER(_titleRect)); + persistMgr->transferBool(TMEMBER(_transparent)); persistMgr->transferPtr(TMEMBER_PTR(_viewport)); - persistMgr->transfer(TMEMBER(_pauseMusic)); + persistMgr->transferBool(TMEMBER(_pauseMusic)); _widgets.persist(persistMgr); diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp index f3317684b5..5dbb301374 100644 --- a/engines/wintermute/video/video_theora_player.cpp +++ b/engines/wintermute/video/video_theora_player.cpp @@ -34,7 +34,6 @@ #include "engines/wintermute/base/gfx/base_image.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/base/sound/base_sound_manager.h" -#include "engines/wintermute/platform_osystem.h" #include "video/theora_decoder.h" #include "engines/wintermute/wintermute.h" #include "common/system.h" @@ -396,7 +395,7 @@ bool VideoTheoraPlayer::display(uint32 alpha) { bool res; if (_texture && _videoFrameReady) { - BasePlatform::setRect(&rc, 0, 0, _texture->getWidth(), _texture->getHeight()); + rc.setRect(0, 0, _texture->getWidth(), _texture->getHeight()); if (_playZoom == 100.0f) { res = _texture->displayTrans(_posX, _posY, rc, alpha); } else { @@ -500,7 +499,7 @@ bool VideoTheoraPlayer::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_posY)); persistMgr->transferFloat(TMEMBER(_playZoom)); persistMgr->transfer(TMEMBER_INT(_playbackType)); - persistMgr->transfer(TMEMBER(_looping)); + persistMgr->transferBool(TMEMBER(_looping)); persistMgr->transfer(TMEMBER(_volume)); if (!persistMgr->getIsSaving() && (_savedState != THEORA_STATE_NONE)) { diff --git a/engines/wintermute/video/video_theora_player.h b/engines/wintermute/video/video_theora_player.h index a4f1b9edd6..7b28a71e17 100644 --- a/engines/wintermute/video/video_theora_player.h +++ b/engines/wintermute/video/video_theora_player.h @@ -62,7 +62,7 @@ public: //CVidSubtitler *_subtitler; // control methods - bool initialize(const Common::String &filename, const Common::String &subtitleFile = nullptr); + bool initialize(const Common::String &filename, const Common::String &subtitleFile = Common::String()); bool initializeSimple(); bool update(); bool play(TVideoPlayback type = VID_PLAY_CENTER, int x = 0, int y = 0, bool freezeGame = false, bool freezeMusic = true, bool looping = false, uint32 startTime = 0, float forceZoom = -1.0f, int volume = -1); diff --git a/engines/zvision/rlf_animation.cpp b/engines/zvision/animation/rlf_animation.cpp index 5f1d41daae..c7307265c0 100644 --- a/engines/zvision/rlf_animation.cpp +++ b/engines/zvision/animation/rlf_animation.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/rlf_animation.h" +#include "zvision/animation/rlf_animation.h" #include "common/str.h" #include "common/file.h" diff --git a/engines/zvision/rlf_animation.h b/engines/zvision/animation/rlf_animation.h index fe5b0d68b4..fe5b0d68b4 100644 --- a/engines/zvision/rlf_animation.h +++ b/engines/zvision/animation/rlf_animation.h diff --git a/engines/zvision/zfs_archive.cpp b/engines/zvision/archives/zfs_archive.cpp index 24cff27fc4..b8175b4903 100644 --- a/engines/zvision/zfs_archive.cpp +++ b/engines/zvision/archives/zfs_archive.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/zfs_archive.h" +#include "zvision/archives/zfs_archive.h" #include "common/memstream.h" #include "common/debug.h" diff --git a/engines/zvision/zfs_archive.h b/engines/zvision/archives/zfs_archive.h index d7b45e4b47..d7b45e4b47 100644 --- a/engines/zvision/zfs_archive.h +++ b/engines/zvision/archives/zfs_archive.h diff --git a/engines/zvision/console.cpp b/engines/zvision/core/console.cpp index a095d3fa6a..0d325ef7f7 100644 --- a/engines/zvision/console.cpp +++ b/engines/zvision/core/console.cpp @@ -22,16 +22,16 @@ #include "common/scummsys.h" -#include "zvision/console.h" +#include "zvision/core/console.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/render_manager.h" -#include "zvision/string_manager.h" -#include "zvision/zork_avi_decoder.h" -#include "zvision/zork_raw.h" -#include "zvision/utility.h" -#include "zvision/cursor.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/strings/string_manager.h" +#include "zvision/video/zork_avi_decoder.h" +#include "zvision/sound/zork_raw.h" +#include "zvision/utility/utility.h" +#include "zvision/cursors/cursor.h" #include "common/system.h" #include "common/file.h" diff --git a/engines/zvision/console.h b/engines/zvision/core/console.h index 0ca1b8cc70..0ca1b8cc70 100644 --- a/engines/zvision/console.h +++ b/engines/zvision/core/console.h diff --git a/engines/zvision/events.cpp b/engines/zvision/core/events.cpp index 1103dc3000..40bfb879b1 100644 --- a/engines/zvision/events.cpp +++ b/engines/zvision/core/events.cpp @@ -24,11 +24,11 @@ #include "zvision/zvision.h" -#include "zvision/console.h" -#include "zvision/cursor_manager.h" -#include "zvision/render_manager.h" -#include "zvision/script_manager.h" -#include "zvision/rlf_animation.h" +#include "zvision/core/console.h" +#include "zvision/cursors/cursor_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/animation/rlf_animation.h" #include "common/events.h" #include "common/system.h" diff --git a/engines/zvision/menu.h b/engines/zvision/core/menu.h index affc69abd5..affc69abd5 100644 --- a/engines/zvision/menu.h +++ b/engines/zvision/core/menu.h diff --git a/engines/zvision/save_manager.cpp b/engines/zvision/core/save_manager.cpp index c3deadd703..b91f8eacad 100644 --- a/engines/zvision/save_manager.cpp +++ b/engines/zvision/core/save_manager.cpp @@ -22,11 +22,11 @@ #include "common/scummsys.h" -#include "zvision/save_manager.h" +#include "zvision/core/save_manager.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/render_manager.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/graphics/render_manager.h" #include "common/system.h" diff --git a/engines/zvision/save_manager.h b/engines/zvision/core/save_manager.h index b4770e68b2..b4770e68b2 100644 --- a/engines/zvision/save_manager.h +++ b/engines/zvision/core/save_manager.h diff --git a/engines/zvision/cursor.cpp b/engines/zvision/cursors/cursor.cpp index 9023d97e0d..be80f6585b 100644 --- a/engines/zvision/cursor.cpp +++ b/engines/zvision/cursors/cursor.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/cursor.h" +#include "zvision/cursors/cursor.h" #include "common/str.h" #include "common/file.h" diff --git a/engines/zvision/cursor.h b/engines/zvision/cursors/cursor.h index 18ac28ce8b..18ac28ce8b 100644 --- a/engines/zvision/cursor.h +++ b/engines/zvision/cursors/cursor.h diff --git a/engines/zvision/cursor_manager.cpp b/engines/zvision/cursors/cursor_manager.cpp index c411013150..671f26ba2d 100644 --- a/engines/zvision/cursor_manager.cpp +++ b/engines/zvision/cursors/cursor_manager.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/cursor_manager.h" +#include "zvision/cursors/cursor_manager.h" #include "zvision/zvision.h" diff --git a/engines/zvision/cursor_manager.h b/engines/zvision/cursors/cursor_manager.h index 0a369aaf9e..e982a40188 100644 --- a/engines/zvision/cursor_manager.h +++ b/engines/zvision/cursors/cursor_manager.h @@ -23,7 +23,7 @@ #ifndef ZVISION_CURSOR_MANAGER_H #define ZVISION_CURSOR_MANAGER_H -#include "zvision/cursor.h" +#include "zvision/cursors/cursor.h" #include "common/str.h" diff --git a/engines/zvision/truetype_font.cpp b/engines/zvision/fonts/truetype_font.cpp index 289b5fbbaf..f8910bfe06 100644 --- a/engines/zvision/truetype_font.cpp +++ b/engines/zvision/fonts/truetype_font.cpp @@ -22,10 +22,10 @@ #include "common/scummsys.h" -#include "zvision/truetype_font.h" +#include "zvision/fonts/truetype_font.h" #include "zvision/zvision.h" -#include "zvision/render_manager.h" +#include "zvision/graphics/render_manager.h" #include "common/debug.h" #include "common/file.h" diff --git a/engines/zvision/truetype_font.h b/engines/zvision/fonts/truetype_font.h index 33f016cffd..33f016cffd 100644 --- a/engines/zvision/truetype_font.h +++ b/engines/zvision/fonts/truetype_font.h diff --git a/engines/zvision/render_manager.cpp b/engines/zvision/graphics/render_manager.cpp index af8ca7fd64..f19df88935 100644 --- a/engines/zvision/render_manager.cpp +++ b/engines/zvision/graphics/render_manager.cpp @@ -22,9 +22,9 @@ #include "common/scummsys.h" -#include "zvision/render_manager.h" +#include "zvision/graphics/render_manager.h" -#include "zvision/lzss_read_stream.h" +#include "zvision/utility/lzss_read_stream.h" #include "common/file.h" #include "common/system.h" diff --git a/engines/zvision/render_manager.h b/engines/zvision/graphics/render_manager.h index 111bf6276c..cb71308bc3 100644 --- a/engines/zvision/render_manager.h +++ b/engines/zvision/graphics/render_manager.h @@ -23,8 +23,8 @@ #ifndef ZVISION_RENDER_MANAGER_H #define ZVISION_RENDER_MANAGER_H -#include "zvision/render_table.h" -#include "zvision/truetype_font.h" +#include "zvision/graphics/render_table.h" +#include "zvision/fonts/truetype_font.h" #include "common/rect.h" #include "common/hashmap.h" diff --git a/engines/zvision/render_table.cpp b/engines/zvision/graphics/render_table.cpp index b6a6a3d2bb..ffd42e6a60 100644 --- a/engines/zvision/render_table.cpp +++ b/engines/zvision/graphics/render_table.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/render_table.h" +#include "zvision/graphics/render_table.h" #include "common/rect.h" diff --git a/engines/zvision/render_table.h b/engines/zvision/graphics/render_table.h index 898091193a..898091193a 100644 --- a/engines/zvision/render_table.h +++ b/engines/zvision/graphics/render_table.h diff --git a/engines/zvision/inventory_manager.h b/engines/zvision/inventory/inventory_manager.h index ae6d116b18..ae6d116b18 100644 --- a/engines/zvision/inventory_manager.h +++ b/engines/zvision/inventory/inventory_manager.h diff --git a/engines/zvision/module.mk b/engines/zvision/module.mk index 261168f133..4cf9c989cd 100644 --- a/engines/zvision/module.mk +++ b/engines/zvision/module.mk @@ -1,36 +1,36 @@ MODULE := engines/zvision MODULE_OBJS := \ - actions.o \ - animation_control.o \ - clock.o \ - console.o \ - control.o \ - cursor.o \ - cursor_manager.o \ + animation/rlf_animation.o \ + archives/zfs_archive.o \ + core/console.o \ + core/events.o \ + core/save_manager.o \ + cursors/cursor.o \ + cursors/cursor_manager.o \ detection.o \ - events.o \ - input_control.o \ - lever_control.o \ - lzss_read_stream.o \ - push_toggle_control.o \ - render_manager.o \ - render_table.o \ - rlf_animation.o \ - save_manager.o \ - scr_file_handling.o \ - script_manager.o \ - single_value_container.o \ - string_manager.o \ - timer_node.o \ - truetype_font.o \ - utility.o \ - video.o \ - zvision.o \ - zfs_archive.o \ - zork_avi_decoder.o \ - zork_raw.o - + fonts/truetype_font.o \ + graphics/render_manager.o \ + graphics/render_table.o \ + scripting/actions.o \ + scripting/control.o \ + scripting/controls/animation_control.o \ + scripting/controls/input_control.o \ + scripting/controls/lever_control.o \ + scripting/controls/push_toggle_control.o \ + scripting/controls/timer_node.o \ + scripting/scr_file_handling.o \ + scripting/script_manager.o \ + sound/zork_raw.o \ + strings/string_manager.o \ + utility/clock.o \ + utility/lzss_read_stream.o \ + utility/single_value_container.o \ + utility/utility.o \ + video/video.o \ + video/zork_avi_decoder.o \ + zvision.o + MODULE_DIRS += \ engines/zvision diff --git a/engines/zvision/actions.cpp b/engines/zvision/scripting/actions.cpp index eae4ec2ed5..878fa752d5 100644 --- a/engines/zvision/actions.cpp +++ b/engines/zvision/scripting/actions.cpp @@ -22,15 +22,15 @@ #include "common/scummsys.h" -#include "zvision/actions.h" +#include "zvision/scripting/actions.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/render_manager.h" -#include "zvision/zork_raw.h" -#include "zvision/zork_avi_decoder.h" -#include "zvision/timer_node.h" -#include "zvision/animation_control.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/sound/zork_raw.h" +#include "zvision/video/zork_avi_decoder.h" +#include "zvision/scripting/controls/timer_node.h" +#include "zvision/scripting/controls/animation_control.h" #include "common/file.h" @@ -124,7 +124,8 @@ ActionDisableControl::ActionDisableControl(const Common::String &line) { bool ActionDisableControl::execute(ZVision *engine) { debug("Disabling control %u", _key); - engine->getScriptManager()->disableControl(_key); + ScriptManager *scriptManager = engine->getScriptManager(); + scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) | ScriptManager::DISABLED); return true; } @@ -141,7 +142,8 @@ ActionEnableControl::ActionEnableControl(const Common::String &line) { bool ActionEnableControl::execute(ZVision *engine) { debug("Enabling control %u", _key); - engine->getScriptManager()->enableControl(_key); + ScriptManager *scriptManager = engine->getScriptManager(); + scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) & ~ScriptManager::DISABLED); return true; } @@ -185,6 +187,9 @@ bool ActionMusic::execute(ZVision *engine) { Common::File *file = new Common::File(); if (file->open(_fileName)) { audioStream = Audio::makeWAVStream(file, DisposeAfterUse::YES); + } else { + warning("Unable to open %s", _fileName.c_str()); + return false; } } else { audioStream = makeRawZorkStream(_fileName, engine); @@ -220,8 +225,10 @@ bool ActionPreloadAnimation::execute(ZVision *engine) { // TODO: Check if the Control already exists // Create the control, but disable it until PlayPreload is called - engine->getScriptManager()->addControl(new AnimationControl(engine, _key, _fileName)); - engine->getScriptManager()->disableControl(_key); + ScriptManager *scriptManager = engine->getScriptManager(); + scriptManager->addControl(new AnimationControl(engine, _key, _fileName)); + scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) | ScriptManager::DISABLED); + return true; } diff --git a/engines/zvision/actions.h b/engines/zvision/scripting/actions.h index afa3e3a2ac..afa3e3a2ac 100644 --- a/engines/zvision/actions.h +++ b/engines/zvision/scripting/actions.h diff --git a/engines/zvision/control.cpp b/engines/zvision/scripting/control.cpp index bcbdabc143..35c4ea1441 100644 --- a/engines/zvision/control.cpp +++ b/engines/zvision/scripting/control.cpp @@ -22,11 +22,11 @@ #include "common/scummsys.h" -#include "zvision/control.h" +#include "zvision/scripting/control.h" #include "zvision/zvision.h" -#include "zvision/render_manager.h" -#include "zvision/utility.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/utility/utility.h" #include "common/stream.h" diff --git a/engines/zvision/control.h b/engines/zvision/scripting/control.h index 770c540a12..770c540a12 100644 --- a/engines/zvision/control.h +++ b/engines/zvision/scripting/control.h diff --git a/engines/zvision/animation_control.cpp b/engines/zvision/scripting/controls/animation_control.cpp index 1143380501..ec8f7a9647 100644 --- a/engines/zvision/animation_control.cpp +++ b/engines/zvision/scripting/controls/animation_control.cpp @@ -22,13 +22,13 @@ #include "common/scummsys.h" -#include "zvision/animation_control.h" +#include "zvision/scripting/controls/animation_control.h" #include "zvision/zvision.h" -#include "zvision/render_manager.h" -#include "zvision/script_manager.h" -#include "zvision/rlf_animation.h" -#include "zvision/zork_avi_decoder.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/animation/rlf_animation.h" +#include "zvision/video/zork_avi_decoder.h" #include "video/video_decoder.h" diff --git a/engines/zvision/animation_control.h b/engines/zvision/scripting/controls/animation_control.h index 2ac3691483..77663aaf1e 100644 --- a/engines/zvision/animation_control.h +++ b/engines/zvision/scripting/controls/animation_control.h @@ -23,7 +23,7 @@ #ifndef ZVISION_ANIMATION_CONTROL_H #define ZVISION_ANIMATION_CONTROL_H -#include "zvision/control.h" +#include "zvision/scripting/control.h" namespace Common { diff --git a/engines/zvision/input_control.cpp b/engines/zvision/scripting/controls/input_control.cpp index a445e1aae5..2685b01312 100644 --- a/engines/zvision/input_control.cpp +++ b/engines/zvision/scripting/controls/input_control.cpp @@ -22,13 +22,13 @@ #include "common/scummsys.h" -#include "zvision/input_control.h" +#include "zvision/scripting/controls/input_control.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/string_manager.h" -#include "zvision/render_manager.h" -#include "zvision/utility.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/strings/string_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/utility/utility.h" #include "common/str.h" #include "common/stream.h" diff --git a/engines/zvision/input_control.h b/engines/zvision/scripting/controls/input_control.h index aab2c991dc..f0fd8b502d 100644 --- a/engines/zvision/input_control.h +++ b/engines/zvision/scripting/controls/input_control.h @@ -23,8 +23,8 @@ #ifndef ZVISION_INPUT_CONTROL_H #define ZVISION_INPUT_CONTROL_H -#include "zvision/control.h" -#include "zvision/string_manager.h" +#include "zvision/scripting/control.h" +#include "zvision/strings/string_manager.h" #include "common/rect.h" diff --git a/engines/zvision/lever_control.cpp b/engines/zvision/scripting/controls/lever_control.cpp index 79049b8fcb..e08fdd10f3 100644 --- a/engines/zvision/lever_control.cpp +++ b/engines/zvision/scripting/controls/lever_control.cpp @@ -22,15 +22,15 @@ #include "common/scummsys.h" -#include "zvision/lever_control.h" +#include "zvision/scripting/controls/lever_control.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/render_manager.h" -#include "zvision/cursor_manager.h" -#include "zvision/rlf_animation.h" -#include "zvision/zork_avi_decoder.h" -#include "zvision/utility.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/cursors/cursor_manager.h" +#include "zvision/animation/rlf_animation.h" +#include "zvision/video/zork_avi_decoder.h" +#include "zvision/utility/utility.h" #include "common/stream.h" #include "common/file.h" @@ -377,11 +377,11 @@ void LeverControl::renderFrame(uint frameNumber) { _lastRenderedFrame = frameNumber; } - const uint16 *frameData; + const uint16 *frameData = 0; int x = _animationCoords.left; int y = _animationCoords.top; - int width; - int height; + int width = 0; + int height = 0; if (_fileType == RLF) { // getFrameData() will automatically optimize to getNextFrame() / getPreviousFrame() if it can diff --git a/engines/zvision/lever_control.h b/engines/zvision/scripting/controls/lever_control.h index 8ef8f06fec..69473cf119 100644 --- a/engines/zvision/lever_control.h +++ b/engines/zvision/scripting/controls/lever_control.h @@ -23,7 +23,7 @@ #ifndef ZVISION_LEVER_CONTROL_H #define ZVISION_LEVER_CONTROL_H -#include "zvision/control.h" +#include "zvision/scripting/control.h" #include "common/list.h" #include "common/rect.h" diff --git a/engines/zvision/push_toggle_control.cpp b/engines/zvision/scripting/controls/push_toggle_control.cpp index 689311ba5b..11ec4bb73f 100644 --- a/engines/zvision/push_toggle_control.cpp +++ b/engines/zvision/scripting/controls/push_toggle_control.cpp @@ -22,12 +22,12 @@ #include "common/scummsys.h" -#include "zvision/push_toggle_control.h" +#include "zvision/scripting/controls/push_toggle_control.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" -#include "zvision/cursor_manager.h" -#include "zvision/utility.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/cursors/cursor_manager.h" +#include "zvision/utility/utility.h" #include "common/stream.h" diff --git a/engines/zvision/push_toggle_control.h b/engines/zvision/scripting/controls/push_toggle_control.h index 2a407cada9..13dc54a65f 100644 --- a/engines/zvision/push_toggle_control.h +++ b/engines/zvision/scripting/controls/push_toggle_control.h @@ -23,7 +23,7 @@ #ifndef ZVISION_PUSH_TOGGLE_CONTROL_H #define ZVISION_PUSH_TOGGLE_CONTROL_H -#include "zvision/control.h" +#include "zvision/scripting/control.h" #include "common/rect.h" diff --git a/engines/zvision/timer_node.cpp b/engines/zvision/scripting/controls/timer_node.cpp index 55dfa51dfe..3b691be275 100644 --- a/engines/zvision/timer_node.cpp +++ b/engines/zvision/scripting/controls/timer_node.cpp @@ -22,25 +22,39 @@ #include "common/scummsys.h" -#include "zvision/timer_node.h" +#include "zvision/scripting/controls/timer_node.h" #include "zvision/zvision.h" -#include "zvision/script_manager.h" +#include "zvision/scripting/script_manager.h" #include "common/stream.h" namespace ZVision { + +TimerNode::TimerNode(ZVision *engine, uint32 key, uint timeInSeconds) + : Control(engine, key) { + if (_engine->getGameId() == GID_NEMESIS) { + _timeLeft = timeInSeconds * 1000; + } else if (_engine->getGameId() == GID_GRANDINQUISITOR) { + _timeLeft = timeInSeconds * 100; + } + + _engine->getScriptManager()->setStateValue(_key, 1); +} -TimerNode::TimerNode(ZVision *engine, uint32 key, uint timeInSeconds) - : Control(engine, key), _timeLeft(timeInSeconds * 1000) { +TimerNode::~TimerNode() { + if (_timeLeft <= 0) + _engine->getScriptManager()->setStateValue(_key, 2); + else + _engine->getScriptManager()->setStateValue(_key, _timeLeft); // If timer was stopped by stop or kill } bool TimerNode::process(uint32 deltaTimeInMillis) { _timeLeft -= deltaTimeInMillis; if (_timeLeft <= 0) { - _engine->getScriptManager()->setStateValue(_key, 0); + // Let the destructor reset the state value return true; } diff --git a/engines/zvision/timer_node.h b/engines/zvision/scripting/controls/timer_node.h index 32dca71548..a8e579cbe4 100644 --- a/engines/zvision/timer_node.h +++ b/engines/zvision/scripting/controls/timer_node.h @@ -23,7 +23,7 @@ #ifndef ZVISION_TIMER_NODE_H #define ZVISION_TIMER_NODE_H -#include "zvision/control.h" +#include "zvision/scripting/control.h" namespace ZVision { @@ -32,6 +32,7 @@ class ZVision; class TimerNode : public Control { public: TimerNode(ZVision *engine, uint32 key, uint timeInSeconds); + ~TimerNode(); /** * Decrement the timer by the delta time. If the timer is finished, set the status diff --git a/engines/zvision/puzzle.h b/engines/zvision/scripting/puzzle.h index 1e730365dc..0d717f1fa9 100644 --- a/engines/zvision/puzzle.h +++ b/engines/zvision/scripting/puzzle.h @@ -23,7 +23,7 @@ #ifndef ZVISION_PUZZLE_H #define ZVISION_PUZZLE_H -#include "zvision/actions.h" +#include "zvision/scripting/actions.h" #include "common/list.h" #include "common/ptr.h" @@ -32,7 +32,7 @@ namespace ZVision { struct Puzzle { - Puzzle() : key(0), flags(0) {} + Puzzle() : key(0) {} ~Puzzle() { for (Common::List<ResultAction *>::iterator iter = resultActions.begin(); iter != resultActions.end(); ++iter) { @@ -63,17 +63,10 @@ struct Puzzle { bool argumentIsAKey; }; - enum StateFlags { - ONCE_PER_INST = 0x01, - DO_ME_NOW = 0x02, // Somewhat useless flag since anything that needs to be done immediately has no criteria - DISABLED = 0x04 - }; - uint32 key; Common::List<Common::List <CriteriaEntry> > criteriaList; // This has to be list of pointers because ResultAction is abstract Common::List<ResultAction *> resultActions; - uint flags; }; } // End of namespace ZVision diff --git a/engines/zvision/scr_file_handling.cpp b/engines/zvision/scripting/scr_file_handling.cpp index e90408cf0d..d93094a3b2 100644 --- a/engines/zvision/scr_file_handling.cpp +++ b/engines/zvision/scripting/scr_file_handling.cpp @@ -22,13 +22,13 @@ #include "common/scummsys.h" -#include "zvision/script_manager.h" +#include "zvision/scripting/script_manager.h" -#include "zvision/utility.h" -#include "zvision/puzzle.h" -#include "zvision/actions.h" -#include "zvision/push_toggle_control.h" -#include "zvision/lever_control.h" +#include "zvision/utility/utility.h" +#include "zvision/scripting/puzzle.h" +#include "zvision/scripting/actions.h" +#include "zvision/scripting/controls/push_toggle_control.h" +#include "zvision/scripting/controls/lever_control.h" #include "common/textconsole.h" #include "common/file.h" @@ -81,7 +81,7 @@ void ScriptManager::parsePuzzle(Puzzle *puzzle, Common::SeekableReadStream &stre } else if (line.matchString("results {", true)) { parseResults(stream, puzzle->resultActions); } else if (line.matchString("flags {", true)) { - puzzle->flags = parseFlags(stream); + setStateFlags(puzzle->key, parseFlags(stream)); } line = stream.readLine(); @@ -259,11 +259,11 @@ uint ScriptManager::parseFlags(Common::SeekableReadStream &stream) const { while (!stream.eos() && !line.contains('}')) { if (line.matchString("ONCE_PER_INST", true)) { - flags |= Puzzle::ONCE_PER_INST; + flags |= ONCE_PER_INST; } else if (line.matchString("DO_ME_NOW", true)) { - flags |= Puzzle::DO_ME_NOW; + flags |= DO_ME_NOW; } else if (line.matchString("DISABLED", true)) { - flags |= Puzzle::DISABLED; + flags |= DISABLED; } line = stream.readLine(); diff --git a/engines/zvision/script_manager.cpp b/engines/zvision/scripting/script_manager.cpp index 66a54088fd..adcc5c7545 100644 --- a/engines/zvision/script_manager.cpp +++ b/engines/zvision/scripting/script_manager.cpp @@ -22,14 +22,14 @@ #include "common/scummsys.h" -#include "zvision/script_manager.h" +#include "zvision/scripting/script_manager.h" #include "zvision/zvision.h" -#include "zvision/render_manager.h" -#include "zvision/cursor_manager.h" -#include "zvision/save_manager.h" -#include "zvision/actions.h" -#include "zvision/utility.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/cursors/cursor_manager.h" +#include "zvision/core/save_manager.h" +#include "zvision/scripting/actions.h" +#include "zvision/utility/utility.h" #include "common/algorithm.h" #include "common/hashmap.h" @@ -126,8 +126,7 @@ void ScriptManager::checkPuzzleCriteria() { // Check if the puzzle is already finished // Also check that the puzzle isn't disabled - if (getStateValue(puzzle->key) == 1 && - (puzzle->flags & Puzzle::DISABLED) == 0) { + if (getStateValue(puzzle->key) == 1 && (getStateFlags(puzzle->key) & DISABLED) == 0) { continue; } @@ -223,6 +222,23 @@ void ScriptManager::setStateValue(uint32 key, uint value) { } } +uint ScriptManager::getStateFlags(uint32 key) { + if (_globalStateFlags.contains(key)) + return _globalStateFlags[key]; + else + return 0; +} + +void ScriptManager::setStateFlags(uint32 key, uint flags) { + _globalStateFlags[key] = flags; + + if (_referenceTable.contains(key)) { + for (Common::Array<Puzzle *>::iterator iter = _referenceTable[key].begin(); iter != _referenceTable[key].end(); ++iter) { + _puzzlesToCheck.push((*iter)); + } + } +} + void ScriptManager::addToStateValue(uint32 key, uint valueToAdd) { _globalState[key] += valueToAdd; } @@ -241,24 +257,6 @@ Control *ScriptManager::getControl(uint32 key) { return nullptr; } -void ScriptManager::enableControl(uint32 key) { - for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) { - if ((*iter)->getKey() == key) { - (*iter)->enable(); - break; - } - } -} - -void ScriptManager::disableControl(uint32 key) { - for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) { - if ((*iter)->getKey() == key) { - (*iter)->disable(); - break; - } - } -} - void ScriptManager::focusControl(uint32 key) { for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) { uint32 controlKey = (*iter)->getKey(); @@ -352,7 +350,7 @@ void ScriptManager::changeLocation(char world, char room, char node, char view, // Add all the local puzzles to the queue to be checked for (PuzzleList::iterator iter = _activePuzzles.begin(); iter != _activePuzzles.end(); ++iter) { // Reset any Puzzles that have the flag ONCE_PER_INST - if (((*iter)->flags & Puzzle::ONCE_PER_INST) == Puzzle::ONCE_PER_INST) { + if ((getStateFlags((*iter)->key) & ONCE_PER_INST) == ONCE_PER_INST) { setStateValue((*iter)->key, 0); } @@ -362,7 +360,7 @@ void ScriptManager::changeLocation(char world, char room, char node, char view, // Add all the global puzzles to the queue to be checked for (PuzzleList::iterator iter = _globalPuzzles.begin(); iter != _globalPuzzles.end(); ++iter) { // Reset any Puzzles that have the flag ONCE_PER_INST - if (((*iter)->flags & Puzzle::ONCE_PER_INST) == Puzzle::ONCE_PER_INST) { + if ((getStateFlags((*iter)->key) & ONCE_PER_INST) == ONCE_PER_INST) { setStateValue((*iter)->key, 0); } diff --git a/engines/zvision/script_manager.h b/engines/zvision/scripting/script_manager.h index 388d0805e0..ab9b03ed30 100644 --- a/engines/zvision/script_manager.h +++ b/engines/zvision/scripting/script_manager.h @@ -23,8 +23,8 @@ #ifndef ZVISION_SCRIPT_MANAGER_H #define ZVISION_SCRIPT_MANAGER_H -#include "zvision/puzzle.h" -#include "zvision/control.h" +#include "zvision/scripting/puzzle.h" +#include "zvision/scripting/control.h" #include "common/hashmap.h" #include "common/queue.h" @@ -54,12 +54,20 @@ typedef Common::List<Puzzle *> PuzzleList; typedef Common::Queue<Puzzle *> PuzzleQueue; typedef Common::List<Control *> ControlList; typedef Common::HashMap<uint32, uint32> StateMap; +typedef Common::HashMap<uint32, uint> StateFlagMap; class ScriptManager { public: ScriptManager(ZVision *engine); ~ScriptManager(); +public: + enum StateFlags { + ONCE_PER_INST = 0x01, + DO_ME_NOW = 0x02, // Somewhat useless flag since anything that needs to be done immediately has no criteria + DISABLED = 0x04 + }; + private: ZVision *_engine; /** @@ -68,6 +76,11 @@ private: * particular state key are checked after the key is modified. */ StateMap _globalState; + /** + * Holds the flags for the global states. This is used to enable/disable puzzles and/or + * controls as well as which puzzles should are allowed to be re-executed + */ + StateFlagMap _globalStateFlags; /** References _globalState keys to Puzzles */ PuzzleMap _referenceTable; /** Holds the Puzzles that should be checked this frame */ @@ -91,12 +104,12 @@ public: void setStateValue(uint32 key, uint value); void addToStateValue(uint32 key, uint valueToAdd); + uint getStateFlags(uint32 key); + void setStateFlags(uint32 key, uint flags); + void addControl(Control *control); Control *getControl(uint32 key); - void enableControl(uint32 key); - void disableControl(uint32 key); - void focusControl(uint32 key); /** diff --git a/engines/zvision/zork_raw.cpp b/engines/zvision/sound/zork_raw.cpp index 21613d9043..321ac93de2 100644 --- a/engines/zvision/zork_raw.cpp +++ b/engines/zvision/sound/zork_raw.cpp @@ -22,11 +22,11 @@ #include "common/scummsys.h" -#include "zvision/zork_raw.h" +#include "zvision/sound/zork_raw.h" #include "zvision/zvision.h" #include "zvision/detection.h" -#include "zvision/utility.h" +#include "zvision/utility/utility.h" #include "common/file.h" #include "common/str.h" @@ -180,21 +180,29 @@ Audio::RewindableAudioStream *makeRawZorkStream(const Common::String &filePath, Common::String fileName = getFileName(filePath); fileName.toLowercase(); - SoundParams soundParams; + SoundParams soundParams = { ' ', 0, false, false }; + bool foundParams = false; + char fileIdentifier = (engine->getGameId() == GID_NEMESIS) ? fileName[6] : fileName[7]; if (engine->getGameId() == GID_NEMESIS) { for (int i = 0; i < 6; ++i) { - if (RawZorkStream::_zNemSoundParamLookupTable[i].identifier == (fileName[6])) + if (RawZorkStream::_zNemSoundParamLookupTable[i].identifier == fileIdentifier) { soundParams = RawZorkStream::_zNemSoundParamLookupTable[i]; + foundParams = true; + } } - } - else if (engine->getGameId() == GID_GRANDINQUISITOR) { + } else if (engine->getGameId() == GID_GRANDINQUISITOR) { for (int i = 0; i < 6; ++i) { - if (RawZorkStream::_zgiSoundParamLookupTable[i].identifier == (fileName[7])) + if (RawZorkStream::_zgiSoundParamLookupTable[i].identifier == fileIdentifier) { soundParams = RawZorkStream::_zgiSoundParamLookupTable[i]; + foundParams = true; + } } } + if (!foundParams) + error("Unable to find sound params for file '%s'. File identifier is '%c'", filePath.c_str(), fileIdentifier); + if (soundParams.packed) { return makeRawZorkStream(wrapBufferedSeekableReadStream(file, 2048, DisposeAfterUse::YES), soundParams.rate, soundParams.stereo, DisposeAfterUse::YES); } else { diff --git a/engines/zvision/zork_raw.h b/engines/zvision/sound/zork_raw.h index 481ea79f2d..481ea79f2d 100644 --- a/engines/zvision/zork_raw.h +++ b/engines/zvision/sound/zork_raw.h diff --git a/engines/zvision/string_manager.cpp b/engines/zvision/strings/string_manager.cpp index ab42f3d3e0..77ed501672 100644 --- a/engines/zvision/string_manager.cpp +++ b/engines/zvision/strings/string_manager.cpp @@ -22,9 +22,9 @@ #include "common/scummsys.h" -#include "zvision/string_manager.h" +#include "zvision/strings/string_manager.h" -#include "zvision/truetype_font.h" +#include "zvision/fonts/truetype_font.h" #include "common/file.h" #include "common/tokenizer.h" diff --git a/engines/zvision/string_manager.h b/engines/zvision/strings/string_manager.h index 9cfed5261b..86bb9638d7 100644 --- a/engines/zvision/string_manager.h +++ b/engines/zvision/strings/string_manager.h @@ -25,7 +25,7 @@ #define ZVISION_STRING_MANAGER_H #include "zvision/detection.h" -#include "zvision/truetype_font.h" +#include "zvision/fonts/truetype_font.h" namespace Graphics { diff --git a/engines/zvision/subtitles.h b/engines/zvision/subtitles/subtitles.h index 13426e03e4..13426e03e4 100644 --- a/engines/zvision/subtitles.h +++ b/engines/zvision/subtitles/subtitles.h diff --git a/engines/zvision/clock.cpp b/engines/zvision/utility/clock.cpp index c8ee717a33..49e4b32054 100644 --- a/engines/zvision/clock.cpp +++ b/engines/zvision/utility/clock.cpp @@ -23,7 +23,7 @@ #include "common/scummsys.h" -#include "zvision/clock.h" +#include "zvision/utility/clock.h" #include "common/system.h" diff --git a/engines/zvision/clock.h b/engines/zvision/utility/clock.h index 3939ba1612..3939ba1612 100644 --- a/engines/zvision/clock.h +++ b/engines/zvision/utility/clock.h diff --git a/engines/zvision/lzss_read_stream.cpp b/engines/zvision/utility/lzss_read_stream.cpp index bbbda6f526..dc537cd8ab 100644 --- a/engines/zvision/lzss_read_stream.cpp +++ b/engines/zvision/utility/lzss_read_stream.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/lzss_read_stream.h" +#include "zvision/utility/lzss_read_stream.h" namespace ZVision { diff --git a/engines/zvision/lzss_read_stream.h b/engines/zvision/utility/lzss_read_stream.h index f6b1eb1a65..f6b1eb1a65 100644 --- a/engines/zvision/lzss_read_stream.h +++ b/engines/zvision/utility/lzss_read_stream.h diff --git a/engines/zvision/single_value_container.cpp b/engines/zvision/utility/single_value_container.cpp index 837bd8d7fc..2667b27b75 100644 --- a/engines/zvision/single_value_container.cpp +++ b/engines/zvision/utility/single_value_container.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#include "zvision/single_value_container.h" +#include "zvision/utility/single_value_container.h" #include "common/textconsole.h" #include "common/str.h" diff --git a/engines/zvision/single_value_container.h b/engines/zvision/utility/single_value_container.h index 45b5a89e95..45b5a89e95 100644 --- a/engines/zvision/single_value_container.h +++ b/engines/zvision/utility/single_value_container.h diff --git a/engines/zvision/utility.cpp b/engines/zvision/utility/utility.cpp index d973cb2f4c..6471d21e6c 100644 --- a/engines/zvision/utility.cpp +++ b/engines/zvision/utility/utility.cpp @@ -22,10 +22,10 @@ #include "common/scummsys.h" -#include "zvision/utility.h" +#include "zvision/utility/utility.h" #include "zvision/zvision.h" -#include "zvision/zork_raw.h" +#include "zvision/sound/zork_raw.h" #include "common/tokenizer.h" #include "common/file.h" diff --git a/engines/zvision/utility.h b/engines/zvision/utility/utility.h index fb571f3fe8..fb571f3fe8 100644 --- a/engines/zvision/utility.h +++ b/engines/zvision/utility/utility.h diff --git a/engines/zvision/video.cpp b/engines/zvision/video/video.cpp index cd11618e67..efaecb5045 100644 --- a/engines/zvision/video.cpp +++ b/engines/zvision/video/video.cpp @@ -24,8 +24,8 @@ #include "zvision/zvision.h" -#include "zvision/clock.h" -#include "zvision/render_manager.h" +#include "zvision/utility/clock.h" +#include "zvision/graphics/render_manager.h" #include "common/system.h" @@ -107,7 +107,7 @@ void ZVision::playVideo(Video::VideoDecoder &videoDecoder, const Common::Rect &d uint16 finalWidth = origWidth * scale; uint16 finalHeight = origHeight * scale; - byte *scaledVideoFrameBuffer; + byte *scaledVideoFrameBuffer = 0; if (scale != 1) { scaledVideoFrameBuffer = new byte[finalWidth * finalHeight * bytesPerPixel]; } diff --git a/engines/zvision/zork_avi_decoder.cpp b/engines/zvision/video/zork_avi_decoder.cpp index a614f77bb7..d3db3421af 100644 --- a/engines/zvision/zork_avi_decoder.cpp +++ b/engines/zvision/video/zork_avi_decoder.cpp @@ -23,9 +23,9 @@ #include "common/scummsys.h" -#include "zvision/zork_avi_decoder.h" +#include "zvision/video/zork_avi_decoder.h" -#include "zvision/zork_raw.h" +#include "zvision/sound/zork_raw.h" #include "common/stream.h" diff --git a/engines/zvision/zork_avi_decoder.h b/engines/zvision/video/zork_avi_decoder.h index ec2be1bb13..ec2be1bb13 100644 --- a/engines/zvision/zork_avi_decoder.h +++ b/engines/zvision/video/zork_avi_decoder.h diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp index 3b178cde5d..f57e225ac1 100644 --- a/engines/zvision/zvision.cpp +++ b/engines/zvision/zvision.cpp @@ -24,13 +24,13 @@ #include "zvision/zvision.h" -#include "zvision/console.h" -#include "zvision/script_manager.h" -#include "zvision/render_manager.h" -#include "zvision/cursor_manager.h" -#include "zvision/save_manager.h" -#include "zvision/string_manager.h" -#include "zvision/zfs_archive.h" +#include "zvision/core/console.h" +#include "zvision/scripting/script_manager.h" +#include "zvision/graphics/render_manager.h" +#include "zvision/cursors/cursor_manager.h" +#include "zvision/core/save_manager.h" +#include "zvision/strings/string_manager.h" +#include "zvision/archives/zfs_archive.h" #include "zvision/detection.h" #include "common/config-manager.h" diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h index d9810ffa4e..1c525c1fc1 100644 --- a/engines/zvision/zvision.h +++ b/engines/zvision/zvision.h @@ -25,7 +25,7 @@ #define ZVISION_ZVISION_H #include "zvision/detection.h" -#include "zvision/clock.h" +#include "zvision/utility/clock.h" #include "common/random.h" #include "common/events.h" diff --git a/gui/credits.h b/gui/credits.h index aca3745631..a14622e1b1 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -522,7 +522,7 @@ static const char *credits[] = { "C0""Johannes Schickel", "", "", -"C1""Translations", +"C1""GUI Translations", "C0""Thierry Crozat", "C2""Translation Lead", "C1""Basque", @@ -592,6 +592,28 @@ static const char *credits[] = { "C0""Lubomyr Lisen", "", "", +"C1""Game Translations", +"C1""CGE", +"C0""Dan Serban", +"C2""Soltys English translation", +"A0""Victor Gonzalez", +"C0""V\355ctor Gonz\341lez", +"C2""Soltys Spanish translation", +"A0""Alejandro Gomez de la Munoza", +"C0""Alejandro G\363mez de la Mu\361oza", +"C2""Soltys Spanish translation", +"", +"C1""Drascula", +"C0""Thierry Crozat", +"C2""Improve French translation", +"", +"C1""Mortevielle", +"C0""Hugo Labrande", +"C2""Improve English translation", +"C0""Thierry Crozat", +"C2""Improve English translation", +"", +"", "C1""Websites (design)", "A0""Dobo Balazs", "C0""Dob\363 Bal\341zs", |