[Scummvm-git-logs] scummvm master -> 9d4d4f6803252383b4488638092f004e6cc7a214

sev- sev at scummvm.org
Sat Sep 3 10:44:05 CEST 2016


This automated email contains information about 205 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e821fd789c MACVENTURE: Add initial game files
52d53c2551 MACVENTURE: Add game detection for Shadowgate
6815b05467 MACVENTURE: Fix detection problem
c6070c0d99 MACVENTURE: Add empty engine
d56f5a3bc4 MACVENTURE: Add empty event loop
6f5997fec6 MACVENTURE: Add naked window for tests
322836699a MACVENTURE: Border Loading code
f095c4a958 MACVENTURE: Extract GUI code
d15e3a03c7 MACVENTURE: Add game file manager
2fd43c24d0 MACVENTURE: Small fix in detection
dd072a39de MACVENTURE: Add basic menu loading
4611429959 MACVENTURE: Add submenu loading
88949eddce MACVENTURE: Add menu display
7991b3ede7 MACVENTURE: Add static menus
c09e74b6a7 MACVENTURE: Add commnad window text render
63e4fe8fc7 MACVENTURE: Add command callback
1d5cbee3a8 MACVENTURE: Fix small border bug
ec40b4ec44 MACVENTURE: Fix border offsets
61134cf570 MACVENTURE: Add the rest of the windows
c676bb9923 MACVENTURE: Load general settings
5368aa979b MACVENTURE: Change inventory to use the general settings
d43523010b MACVENTURE: Add callbacks for all windows
88e6f9257e MACVENTURE: Add appropriate border bounding boxes
9564866ec3 MACVENTURE: Add image to self window
5719ea3076 MACVENTURE: Add save game loading
b3be60273f MACVENTURE: Add generic container
9fc9e33981 MACVENTURE: Fix detection
56e8ac873b MACVENTURE: Add generic non-persistent container loading
b6a5040e35 MACVENTURE: Test and fix object loading
22db262d57 MACVENTURE: Add string tables
b024a24821 MACVENTURE: Change container to return a stream
b209c52ed9 MACVENTURE: Add filepath retrieval
bc435b398e MACVENTURE: Add text huffman loading
a112cdcb9d MACVENTURE: Add object attribute retrieval
ef5a152514 MACVENTURE: Add main loop
79496ea5c0 MACVENTURE: Add command activation
ec768fbec1 MACVENTURE: Test and complete main loop
da174b708c MACVENTURE: Fix small retrieval bug
c42451bf22 MACVENTURE: Fix (another) small retrieval bug
aae8378afd MACVENTURE: Remove unused variables
9c10b431ce MACVENTURE: Add text decoding (without composite)
d7d03baba9 MACVENTURE: Fix small bug in save reading
0fc3e90974 MACVENTURE: Small fixed
e8725ae068 MACVENTURE: Add attribute set function
9b052d0a97 MACVENTURE: Add untested script engine
96f9910c79 MACVENTURE: Add opcodes for script engine
60d5ef5c5b MACVENTURE: Begin implementing object queue
2fbff0e678 MACVENTURE: Fix some minor warnings
bbf0c62f14 MACVENTURE: Add enqueue text
ccc76f2119 MACVENTURE: Add PPIC0, 1 and 2 decoding
1cee6caf13 MACVENTURE: Test PPIC1 and 2 decoding
15de1a2e60 MACVENTURE: Add graphics blitting
27ecdea891 MACVENTURE: Add & test PPIC3 Huffman loading
4d8f8fd36b MACVENTURE: Complete ppic blitting
0743e9531b MACVENTURE: Implemente dynamic object drawing
1540674f77 MACVENTURE: Fix dymanic object drawing
0fb344dfed MACVENTURE: Hack for dynamic object drawing
ec7eb7cb5b MACVENTURE: Game window object selection and some more opcodes
ba5ed7fc88 MACVENTURE: Major push in functionality and rendering
499ebc0b54 MACVENTURE: Script engine fixes
8dd52b6cce MACVENTURE: Complete text decoding
25f086e63b MACVENTURE: Add a small hack for decoding
4837b7750a MACVENTURE: Add rect collission for main game window
45a2aa94b9 MACVENTURE: Fix rect collission
8bee2a7b1c MACVENTURE: Add inventory callback
764d0ad0fe MACVENTURE: Fix small script bug
08588eb6f9 MACVENTURE: Add first drag implementation
0485483254 MACVENTURE: Minor fixes and skull rising
680790acaa MACVENTURE: Add proper capitalization
246fec28f5 MACVENTURE: Fix minor object drawing bug
517aceefcb MACVENTURE: Add scene transition
03a9ad4899 MACVENTURE: Fix game detection
9403ef720a MACVENTURE: Fix clicks and dragging offset
a6e1202a0c MACVENTURE: Fix object selection fallthrough
5417022068 MACVENTURE: Add double click support
46a85f02d6 MACVENTURE: Add initial text rendering
b460964284 MACVENTURE: Add double click
9905cd24d3 MACVENTURE: Tidy up Inventory window system
528283fbe1 MACVENTURE: First version of working drag
87540eaa8f MACVENTURE: Fix error with second scene
6da240a6e7 MACVENTURE: Fix object selection in inventory
4662642bc3 MACVENTURE: Adjust drag selection to account for window movement
8aec5e1cdb MACVENTURE: Fix inventory
b35ef40895 MACVENTURE: Fix temporal window reallocation
9ac1253925 MACVENTURE: Fix the removal of objects in window
fdd949bb00 MACVENTURE: Fix exits drawing
b6acfe868c MACVENTURE: Fix click-through and refactor
a5a094b6bd MACVENTURE: Begin fixing second inventory problem
19d7321867 MACVENTURE: Fix torch drawing problem
bc29c37f32 MACVENUTRE: Fix PPIC0 Drawing
d826fcb18b MACVENTURE: Fix drag screen overflow problem
31a32963b4 MACVENTURE: Fix dragged object move recognition
777923be66 MACVENTURE: Correct object drop position
2ba8b1ca8c MACVENTURE: FIx pesky random drag selection
c36f8c429f MACVENTURE: Soften conditions for object selection
f8efc58a59 MACVENTURE: Fix inventory window selection
e32c126348 MACVENTURE: Refactor asset load checking
dad1edcef0 MACVENTURE: Remove unnecesary window code
8162483026 MACVENTURE: Add text input logic
2a521bb22d MACVENTURE: Add dialog system
734b453c86 MACVENTURE: Add text input dialog
a06f291280 MACVENTURE: Add basic game save/load feature
33ed84ff74 MACVENTURE: Fix small render error
886330770f MACVENTURE: Fix exits loading from savegame
014d1b7dcb MACVENTURE: Fix sign issue
09a4a4ac39 MACVENTURE: Fix image to allow mask attributes
49a2efe408 MACVENTURE: Shadowgate Winnable
91493aaeb8 MACVENTURE: Add closeable inventory windows
53a5fb6c54 MACVENTURE: Refactor dialogs and controls
2dfbfdbaba MACVENTURE: Implement in-engine window closing
87c6265582 MACVENTURE: Fix window borders
fb180a8cdb MACVENTURE: Fix gui
a7f2cea37d MACVENTURE: Add scroll to console window
e25fb16a37 MACVENTURE: Add scroll to console window
b021854327 MACVENTURE: Add scroll to inventory windows
518d336e5a MACVENTURE: Fix item selection on scroll
f58435a2bc MACVENTURE: Add dejavu
5781b738be MACVENTURE: Deja Vu playable
74ea29d0fa MACVENTURE: Add detection for Deja Vu II
b64622744f MACVENTURE: Add infrastructure to support sound system
2ff5dad423 MACVENTURE: Add decoding for 0x10 and 0x7e sounds
f5338f4beb MACVENTURE: Add decoding for the rest of the sounds
842bff03e0 MACVENTURE: Implement missing instruction
dd2908fe42 MACVENTURE: Add basic audio playback
90b022c078 MACVENTURE: Test some sound decodings
b7b4862e4c MACVENTURE: Add metadata to savegames
9ab6ce04a1 MACVENTURE: Change GUI to accept ScummVM dialogs
0acdf0c459 MACVENTURE: Implement savefile deletion
f0dde375c1 MACVENTURE: Add missing methods for runtime load
d1a31ff5db MACVENTURE: Fix startup loading bug
5c43e30499 MACVENTURE: Implement loading borders from zip
06d9e188df MACVENTURE: Fix scroll in GUI
427d69535f MACVENTURE: Fix object overflow
0202ff9c50 MACVENTURE: Fix exit highlighting
5b63e29d5e MACVENTURE: Clean up updateState function
0aef29a8c5 MACVENTURE: Revamp double click detection
409a665867 MACVENTURE: Adapt dragging to new click detection
cb4650247f MACVENTURE: Fix segfault when saving
d925d2c2ce MACVENTURE: Fix segfault with death sound
d1a249bc9e MACVENTURE: Fix selected object drawing
0c0be43a3e MACVENTURE: Fix corner case drawing overflow
47916aca62 MACVENTURE: Fix dragged object drawing
28bf4f1168 MACVENTURE: Fix some of the offsets
5fade27a0c MACVENTURE: Fix indentation in controls.cpp
0b36a77af4 MACVENTURE: Refactor dragging code
8608776768 MACVENTURE: Add debug channels
dd35275176 MACVENTURE: Add conditionals to engine destructors
9676b6f7fe MACVENTURE: Fix window resizing bug
4f6609f704 MACVENTURE: Refactor object drawing
560185903c MACVENTURE: Fix console drawing bug
fd601f016f MACVENTURE: Fix small if
7f533ff7df MACVENTURE: Fix double free on sound
5c38a0c33b MACVENTURE: Add win game dialog
90298b00d3 MACVENTURE: Fix indentation in dialog system
c8a2b0afe2 MACVENTURE: Fix engine mause in dialog
1d5b7a6e19 MACVENTURE: Refactor world to extract new game method
0cd9e87629 MACVENTURE: Add 'new game' functionality
02138548ae MACVENTURE: Fix win game dialog
e886f2c6e1 MACVENTURE: Add lose game dialog
896e08cde8 MACVENTURE: Add proper flags to gui debug rects
1bb3d14129 MACVENTURE: Unify NULLs
4e3daab04f MACVENTURE: Minor refactorings
580c8136f4 MACVENTURE: Some more refactoring
7b9c63b1b9 MACVENTURE: Delete duplicate code
8417e6f22d MACVENTURE: Delete unnecessary attribute
479f01b5a7 MACVENTURE: Implement gui reloading
44a6f8a1db MACVENTURE: Fix minor memory leaks
019f3d4b62 MACVENTURE: Add wrapper class for global settings
2f2d9bead7 MACVENTURE: Fix double free
28698ba697 MACVENTURE: Fix leak on loadControls
d1cd77208e MACVENTURE: Fix mismatched new and delete[]
6f9a17199c MACVENTURE: Fix leak on text decoding
2f1368646f MACVENTURE: Fix window object drawing
d86a426dcb MACVENTURE: Fix image overflow blitting
62af855e33 MACVENTURE: Fix operate command
fd01961d55 MACVENTURE: Fix lost constant
09fe00eb2a MACVENTURE: Fix indentation and braces
9c0777efbf MACVENTURE: Fix some compiler warnings
234a3b95a2 MACVENTURE: Fix cursor warning
b1eb6da6fa MACVENTURE: Add prefixes to error messages
1c687a7e2c MACVENTURE: Remove unused files
b24c04736c MACVENTURE: Extract implementation of Container
f928deebaf MACVENTURE: Implement quit from menu
34fdec37b2 MACVENTURE: Fix debug messages
e5cf0332f2 MACVENTURE: Break up one-line ifs and fix braces
8bea8ecb17 MACVENTURE: Remove unnecessary comment
fa815e73ad MACVENTURE: Fix indentation
ace5156436 MACVENTURE: Enforce const in prebuilt dialogs
68b171f328 MACVENTURE: Remove constructors from prebuilt dialogs
19c7bcf9d4 MACVENTURE: Fix formatting
d8e4d18f7a MACVENTURE: Remove leftover comments and document magic constants
12ce17d90c MACVENTURE: Merge detection tables into detection.cpp
97af2b6e14 MACVENTURE: Remove word typedef
69f2302a1a MACVENTURE: Remove JavaScript constructs
ccd5ad5162 MACVENTURE: Fix double overflow when blitting
b884e6e29f MACVENTURE: Fix game file path retrieval
d1ce6793fa MACVENTURE: Add static array for border names
059c9a64d9 MACVENTURE: Substitute charcodes with char constants
1210f05842 MACVENTURE: Fix upper limit in savefile names
0d868742d4 MACVENTURE: Add thumbnail to savegames
b7b258474f MACVENTURE: Add creation date and playtime to savegames
841c22704c MACVENTURE: Include border bitmaps in ScummVM
e15e6dcfb3 MACVENTURE: Fix menu flags and add newgame
31e1e02ad6 MACVENTURE: Fix window initialization
9d4d4f6803 Merge pull request #807 from blorente/macventure-clean


Commit: e821fd789ce8da9e9012dd527487b34d59b1a702
    https://github.com/scummvm/scummvm/commit/e821fd789ce8da9e9012dd527487b34d59b1a702
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:21+02:00

Commit Message:
MACVENTURE: Add initial game files

Changed paths:
  A engines/macventure/configure.engine
  A engines/macventure/detection.cpp
  A engines/macventure/macventure.cpp
  A engines/macventure/macventure.h
  A engines/macventure/module.mk



diff --git a/engines/macventure/configure.engine b/engines/macventure/configure.engine
new file mode 100644
index 0000000..bb4eb6c
--- /dev/null
+++ b/engines/macventure/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine macventure "MACVENTURE" no
diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
new file mode 100644
index 0000000..ac4a6e5
--- /dev/null
+++ b/engines/macventure/detection.cpp
@@ -0,0 +1,29 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+ #include "base/plugins.h"
+
+ namespace MacVenture {
+
+
+
+ } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
new file mode 100644
index 0000000..ae926f0
--- /dev/null
+++ b/engines/macventure/macventure.cpp
@@ -0,0 +1,21 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
new file mode 100644
index 0000000..ae926f0
--- /dev/null
+++ b/engines/macventure/macventure.h
@@ -0,0 +1,21 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
new file mode 100644
index 0000000..4c04159
--- /dev/null
+++ b/engines/macventure/module.mk
@@ -0,0 +1,16 @@
+MODULE := engines/macventure
+
+MODULE_OBJS := \
+	detection.o \
+	macventure.o
+
+MODULE_DIRS += \
+	engines/macventure
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_WAGE), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk


Commit: 52d53c25515a93b9f129f0f7aa1d16918f6490d5
    https://github.com/scummvm/scummvm/commit/52d53c25515a93b9f129f0f7aa1d16918f6490d5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:21+02:00

Commit Message:
MACVENTURE: Add game detection for Shadowgate

Changed paths:
  A engines/macventure/detection_tables.h
    engines/macventure/detection.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index ac4a6e5..8fa5fab 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -20,10 +20,56 @@
  *
  */
 
- #include "base/plugins.h"
+#include "base/plugins.h"
 
- namespace MacVenture {
+#include "engines/advancedDetector.h"
+#include "common/system.h"
 
+#include "macventure/macventure.h"
 
+namespace MacVenture {
 
- } // End of namespace MacVenture
+#include "macventure/detection_tables.h"
+
+static const PlainGameDescriptor macventureGames[] = {
+	{ "Shadowgate", "Shadowgate" },
+	{ 0, 0 }
+};
+
+class MacVentureMetaEngine : public AdvancedMetaEngine {
+public:	
+	MacVentureMetaEngine() : AdvancedMetaEngine(MacVenture::gameDescriptions, sizeof(ADGameDescription), macventureGames) {
+		_guiOptions = GUIO0();
+		_md5Bytes = 5000000; // TODO: Upper limit, adjust it once all games are added
+	}
+
+	virtual const char * getName() const override {
+		return "MacVenture";
+	}
+	virtual const char * getOriginalCopyright() const override {
+		return "(C) ICOM Simulations";
+	}
+
+	virtual bool createInstance(OSystem * syst, Engine ** engine, const ADGameDescription * desc) const;
+	virtual bool hasFeature(MetaEngineFeature f) const;
+};
+
+bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
+	return false;
+}
+
+bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, const ADGameDescription *game) const {
+	if (game) {
+		*engine = new MacVentureEngine(syst, game);
+	}
+	return game != 0;
+}
+
+
+} // End of namespace MacVenture
+
+#if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
+ REGISTER_PLUGIN_DYNAMIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngine);
+#else
+ REGISTER_PLUGIN_STATIC(MACVENTURE, PLUGIN_TYPE_ENGINE, MacVenture::MacVentureMetaEngine);
+#endif
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
new file mode 100644
index 0000000..9aa9536
--- /dev/null
+++ b/engines/macventure/detection_tables.h
@@ -0,0 +1,33 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+namespace MacVenture {
+
+#define ADGF_DEFAULT (ADGF_DROPLANGUAGE|ADGF_DROPPLATFORM)
+
+#define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
+
+static const ADGameDescription gameDescriptions[] = {
+	BASEGAME("Shadowgate", "Zojoi Rerelease", "Shadowgate.dsk", "4e03e9ef1cd5f65ce1de14d512510537", 839680), // Zojoi Rerelease
+	AD_TABLE_END_MARKER
+};
+} // End of namespace MacVenture
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index ae926f0..06325f5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -19,3 +19,24 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  */
+
+#include "common/error.h"
+
+#include "engines/engine.h"
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) {
+	_gameDescription = gameDesc;
+}
+
+MacVentureEngine::~MacVentureEngine() {
+}
+
+Common::Error MacVentureEngine::run() {
+	return Common::Error();
+}
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index ae926f0..d4ead54 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -19,3 +19,28 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  */
+
+#ifndef MACVENTURE_H
+#define MACVENTURE_H
+
+#include "engines/engine.h"
+
+struct ADGameDescription;
+
+namespace MacVenture {
+
+class MacVentureEngine : public Engine {
+
+public:
+	MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc);
+	~MacVentureEngine();
+
+	virtual Common::Error run();
+
+private:
+	const ADGameDescription *_gameDescription;
+
+};
+} // End of namespace MacVenture
+
+#endif
\ No newline at end of file
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 4c04159..839cbb4 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -8,7 +8,7 @@ MODULE_DIRS += \
 	engines/macventure
 
 # This module can be built as a plugin
-ifeq ($(ENABLE_WAGE), DYNAMIC_PLUGIN)
+ifeq ($(ENABLE_MACVENTURE), DYNAMIC_PLUGIN)
 PLUGIN := 1
 endif
 


Commit: 6815b0546708fd2154e799f89d65c8724da7250b
    https://github.com/scummvm/scummvm/commit/6815b0546708fd2154e799f89d65c8724da7250b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:22+02:00

Commit Message:
MACVENTURE: Fix detection problem

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/detection_tables.h



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 8fa5fab..feaf60d 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -32,7 +32,7 @@ namespace MacVenture {
 #include "macventure/detection_tables.h"
 
 static const PlainGameDescriptor macventureGames[] = {
-	{ "Shadowgate", "Shadowgate" },
+	{ "shadowgate", "Shadowgate" },
 	{ 0, 0 }
 };
 
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index 9aa9536..9c9b91f 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -27,7 +27,7 @@ namespace MacVenture {
 #define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
 
 static const ADGameDescription gameDescriptions[] = {
-	BASEGAME("Shadowgate", "Zojoi Rerelease", "Shadowgate.dsk", "4e03e9ef1cd5f65ce1de14d512510537", 839680), // Zojoi Rerelease
+	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.dsk", "4e03e9ef1cd5f65ce1de14d512510537", 839680), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture


Commit: c6070c0d99215d2e0207feeffd8fdb9013af6bed
    https://github.com/scummvm/scummvm/commit/c6070c0d99215d2e0207feeffd8fdb9013af6bed
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:22+02:00

Commit Message:
MACVENTURE: Add empty engine

Changed paths:
    engines/macventure/configure.engine
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/configure.engine b/engines/macventure/configure.engine
index bb4eb6c..dc7cf79 100644
--- a/engines/macventure/configure.engine
+++ b/engines/macventure/configure.engine
@@ -1,3 +1,3 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine macventure "MACVENTURE" no
+add_engine macventure "MacVenture" no
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 06325f5..a031513 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -20,9 +20,13 @@
  *
  */
 
+#include "common/scummsys.h"
+
+#include "common/debug-channels.h"
+#include "common/debug.h"
 #include "common/error.h"
 
-#include "engines/engine.h"
+#include "engines/util.h"
 
 #include "macventure/macventure.h"
 
@@ -30,13 +34,42 @@ namespace MacVenture {
 
 MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) {
 	_gameDescription = gameDesc;
+	_rnd = new Common::RandomSource("macventure");
+
+	_debugger= NULL;
+
+	debug("MacVenture::MacVentureEngine()");
 }
 
 MacVentureEngine::~MacVentureEngine() {
+	debug("MacVenture::~MacVentureEngine()");
+
+	DebugMan.clearAllDebugChannels();
+	delete _rnd;
+	delete _debugger;
 }
 
 Common::Error MacVentureEngine::run() {
-	return Common::Error();
+	debug("MacVenture::MacVentureEngine::init()");
+
+	initGraphics(kScreenWidth, kScreenHeight, true);
+	
+	//_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+	
+	//_wm = new Graphics::MacWindowManager();
+	//_wm->setScreen(&_screen);
+
+	// Create debugger console. It requires GFX to be initialized
+	_debugger = new Console(this);
+
+	// Additional setup.
+	debug("MacVentureEngine::init");
+
+	// Your main even loop should be (invoked from) here.
+	debug("MacVentureEngine::go: Hello, World!");
+
+
+	return Common::kNoError;
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index d4ead54..3957494 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -23,12 +23,34 @@
 #ifndef MACVENTURE_H
 #define MACVENTURE_H
 
+#include "common/debug.h"
+#include "common/random.h"
+
 #include "engines/engine.h"
 
+#include "graphics/managed_surface.h"
+#include "graphics/macgui/macwindowmanager.h"
+ 
+#include "gui/debugger.h"
+
 struct ADGameDescription;
 
 namespace MacVenture {
 
+class Console;
+
+enum {
+	kScreenWidth = 512,
+	kScreenHeight = 342
+};
+
+enum {
+	kMacVentureDebugExample = 1 << 0,
+	kMacVentureDebugExample2 = 1 << 1
+	// next new level must be 1 << 2 (4)
+	// the current limitation is 32 debug levels (1 << 31 is the last one)
+};
+
 class MacVentureEngine : public Engine {
 
 public:
@@ -39,7 +61,20 @@ public:
 
 private:
 	const ADGameDescription *_gameDescription;
+	Common::RandomSource *_rnd;
+	
+	Console *_debugger;
+
+	Graphics::MacWindowManager *_wm;
+
+	Graphics::ManagedSurface _screen;
+};
+
 
+class Console : public GUI::Debugger {
+public:
+	Console(MacVentureEngine *vm) {}
+	virtual ~Console(void) {}
 };
 } // End of namespace MacVenture
 


Commit: d56f5a3bc43dd978244d17902e993704da8ace5e
    https://github.com/scummvm/scummvm/commit/d56f5a3bc43dd978244d17902e993704da8ace5e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:22+02:00

Commit Message:
MACVENTURE: Add empty event loop

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index a031513..8cf6ba0 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -20,8 +20,7 @@
  *
  */
 
-#include "common/scummsys.h"
-
+#include "common/system.h"
 #include "common/debug-channels.h"
 #include "common/debug.h"
 #include "common/error.h"
@@ -52,24 +51,47 @@ MacVentureEngine::~MacVentureEngine() {
 Common::Error MacVentureEngine::run() {
 	debug("MacVenture::MacVentureEngine::init()");
 
-	initGraphics(kScreenWidth, kScreenHeight, true);
-	
-	//_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
-	
-	//_wm = new Graphics::MacWindowManager();
-	//_wm->setScreen(&_screen);
+	initGraphics(kScreenWidth, kScreenHeight, true);	
 
-	// Create debugger console. It requires GFX to be initialized
 	_debugger = new Console(this);
 
 	// Additional setup.
 	debug("MacVentureEngine::init");
 
+	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+
+	_wm = new Graphics::MacWindowManager();
+	_wm->setScreen(&_screen);
+
+
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
 
+	_shouldQuit = false;
+	while (!_shouldQuit) {
+		processEvents();
+
+		debug("Ping");
+
+		g_system->updateScreen();
+		g_system->delayMillis(50);
+	}
 
 	return Common::kNoError;
 }
 
+void MacVentureEngine::processEvents() {
+	Common::Event event;
+
+	while (_eventMan->pollEvent(event)) {
+		switch (event.type) {
+			case Common::EVENT_QUIT:
+				_shouldQuit = true;
+				break;
+			default: 
+				break;
+		}
+	}
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 3957494..ab29eed 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -60,14 +60,18 @@ public:
 	virtual Common::Error run();
 
 private:
+	void processEvents();
+
+private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource *_rnd;
 	
 	Console *_debugger;
 
 	Graphics::MacWindowManager *_wm;
-
 	Graphics::ManagedSurface _screen;
+
+	bool _shouldQuit;
 };
 
 


Commit: 6f5997fec6a7fcf1f3a9875218f82a7fda73ac31
    https://github.com/scummvm/scummvm/commit/6f5997fec6a7fcf1f3a9875218f82a7fda73ac31
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:22+02:00

Commit Message:
MACVENTURE: Add naked window for tests

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 8cf6ba0..67efbc8 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -63,6 +63,10 @@ Common::Error MacVentureEngine::run() {
 	_wm = new Graphics::MacWindowManager();
 	_wm->setScreen(&_screen);
 
+	_screen.fillRect(Common::Rect(0, 0, _screen.w, _screen.h), Graphics::kColorWhite);
+
+	Graphics::MacWindow *w = _wm->addWindow(false, true, true);
+	w->setDimensions(Common::Rect(100, 100));
 
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
@@ -71,7 +75,7 @@ Common::Error MacVentureEngine::run() {
 	while (!_shouldQuit) {
 		processEvents();
 
-		debug("Ping");
+		_wm->draw();
 
 		g_system->updateScreen();
 		g_system->delayMillis(50);


Commit: 322836699a87fb7ce334d1d99ed5df00e5ebac8b
    https://github.com/scummvm/scummvm/commit/322836699a87fb7ce334d1d99ed5df00e5ebac8b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:07:22+02:00

Commit Message:
MACVENTURE: Border Loading code

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 67efbc8..be949ec 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -25,6 +25,10 @@
 #include "common/debug.h"
 #include "common/error.h"
 
+// For border loading, should be gone later
+#include "common/file.h"
+#include "image/bmp.h"
+
 #include "engines/util.h"
 
 #include "macventure/macventure.h"
@@ -60,14 +64,8 @@ Common::Error MacVentureEngine::run() {
 
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 
-	_wm = new Graphics::MacWindowManager();
-	_wm->setScreen(&_screen);
-
-	_screen.fillRect(Common::Rect(0, 0, _screen.w, _screen.h), Graphics::kColorWhite);
-
-	Graphics::MacWindow *w = _wm->addWindow(false, true, true);
-	w->setDimensions(Common::Rect(100, 100));
-
+	initGUI();
+	
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
 
@@ -98,4 +96,46 @@ void MacVentureEngine::processEvents() {
 	}
 }
 
+void MacVentureEngine::initGUI() {
+	_wm = new Graphics::MacWindowManager();
+	_wm->setScreen(&_screen);
+	Graphics::MacWindow *w = _wm->addWindow(false, true, true);
+	w->setDimensions(Common::Rect(100, 100));
+	w->setActive(false);
+
+	loadBorder(w, "border_inac.bmp", false);
+
+}
+
+void MacVentureEngine::loadBorder(Graphics::MacWindow *target, Common::String filename, bool active) {
+	Common::File borderfile;
+
+	if (!borderfile.open(filename)) {
+		debug(1, "Cannot open border file");
+		return;
+	}
+
+	Image::BitmapDecoder bmpDecoder;
+	Common::SeekableReadStream *stream = borderfile.readStream(borderfile.size());
+	Graphics::Surface source;
+	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
+
+	if (stream) {
+		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename);
+		bmpDecoder.loadStream(*stream);
+		source = *(bmpDecoder.getSurface());
+
+		source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette());
+		surface->create(source.w, source.h, source.format);
+		surface->copyFrom(source);
+		surface->applyColorKey(255, 0, 255, false);
+
+		target->setBorder(*surface, active);
+
+		borderfile.close();
+
+		delete stream;
+	}
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index ab29eed..cdf50b7 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -62,6 +62,9 @@ public:
 private:
 	void processEvents();
 
+	void initGUI();
+	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
+
 private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource *_rnd;


Commit: f095c4a958af62d5f696f61243aca7a2c48f6ba7
    https://github.com/scummvm/scummvm/commit/f095c4a958af62d5f696f61243aca7a2c48f6ba7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:10:14+02:00

Commit Message:
MACVENTURE: Extract GUI code

Changed paths:
  A engines/macventure/gui.cpp
  A engines/macventure/gui.h
    engines/macventure/detection.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index feaf60d..ade07a0 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -27,6 +27,8 @@
 
 #include "macventure/macventure.h"
 
+#include "macventure.h"
+
 namespace MacVenture {
 
 #include "macventure/detection_tables.h"
@@ -37,7 +39,7 @@ static const PlainGameDescriptor macventureGames[] = {
 };
 
 class MacVentureMetaEngine : public AdvancedMetaEngine {
-public:	
+public:
 	MacVentureMetaEngine() : AdvancedMetaEngine(MacVenture::gameDescriptions, sizeof(ADGameDescription), macventureGames) {
 		_guiOptions = GUIO0();
 		_md5Bytes = 5000000; // TODO: Upper limit, adjust it once all games are added
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
new file mode 100644
index 0000000..22e0faa
--- /dev/null
+++ b/engines/macventure/gui.cpp
@@ -0,0 +1,62 @@
+
+#include "macventure/macventure.h"
+
+#include "common/file.h"
+#include "image/bmp.h"
+
+namespace MacVenture {
+
+Gui::Gui() {
+	initGUI();
+}
+
+Gui::~Gui() {
+
+}
+
+void Gui::draw() {
+	_wm.draw();
+}
+
+void Gui::initGUI() {
+	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+	_wm.setScreen(&_screen);
+	Graphics::MacWindow *w = _wm.addWindow(false, true, true);
+	w->setDimensions(Common::Rect(100, 100));
+	w->setActive(false);
+
+	loadBorder(w, "border_inac.bmp", false);
+}
+
+void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
+	Common::File borderfile;
+
+	if (!borderfile.open(filename)) {
+		debug(1, "Cannot open border file");
+		return;
+	}
+
+	Image::BitmapDecoder bmpDecoder;
+	Common::SeekableReadStream *stream = borderfile.readStream(borderfile.size());
+	Graphics::Surface source;
+	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
+
+	if (stream) {
+		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename);
+		bmpDecoder.loadStream(*stream);
+		source = *(bmpDecoder.getSurface());
+
+		source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette());
+		surface->create(source.w, source.h, source.format);
+		surface->copyFrom(source);
+		surface->applyColorKey(255, 0, 255, false);
+
+		target->setBorder(*surface, active);
+
+		borderfile.close();
+
+		delete stream;
+	}
+}
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
new file mode 100644
index 0000000..0cfb835
--- /dev/null
+++ b/engines/macventure/gui.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_GUI_H
+#define MACVENTURE_GUI_H
+
+#include "graphics/macgui/macwindowmanager.h"
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+using namespace Graphics::MacGUIConstants;
+
+class Gui {	
+
+public:
+	Gui(); 
+	~Gui();
+
+	void draw();
+
+private: // Attributes
+
+	Graphics::ManagedSurface _screen;
+	Graphics::MacWindowManager _wm;
+
+private: // Methods
+
+	void initGUI();
+	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
+
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index be949ec..ef47d93 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -25,10 +25,6 @@
 #include "common/debug.h"
 #include "common/error.h"
 
-// For border loading, should be gone later
-#include "common/file.h"
-#include "image/bmp.h"
-
 #include "engines/util.h"
 
 #include "macventure/macventure.h"
@@ -50,22 +46,21 @@ MacVentureEngine::~MacVentureEngine() {
 	DebugMan.clearAllDebugChannels();
 	delete _rnd;
 	delete _debugger;
+	delete _gui;
 }
 
 Common::Error MacVentureEngine::run() {
 	debug("MacVenture::MacVentureEngine::init()");
 
-	initGraphics(kScreenWidth, kScreenHeight, true);	
+	initGraphics(kScreenWidth, kScreenHeight, true);
 
 	_debugger = new Console(this);
 
 	// Additional setup.
 	debug("MacVentureEngine::init");
 
-	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+	_gui = new Gui();
 
-	initGUI();
-	
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
 
@@ -73,7 +68,7 @@ Common::Error MacVentureEngine::run() {
 	while (!_shouldQuit) {
 		processEvents();
 
-		_wm->draw();
+		_gui->draw();
 
 		g_system->updateScreen();
 		g_system->delayMillis(50);
@@ -90,52 +85,9 @@ void MacVentureEngine::processEvents() {
 			case Common::EVENT_QUIT:
 				_shouldQuit = true;
 				break;
-			default: 
+			default:
 				break;
 		}
 	}
 }
-
-void MacVentureEngine::initGUI() {
-	_wm = new Graphics::MacWindowManager();
-	_wm->setScreen(&_screen);
-	Graphics::MacWindow *w = _wm->addWindow(false, true, true);
-	w->setDimensions(Common::Rect(100, 100));
-	w->setActive(false);
-
-	loadBorder(w, "border_inac.bmp", false);
-
-}
-
-void MacVentureEngine::loadBorder(Graphics::MacWindow *target, Common::String filename, bool active) {
-	Common::File borderfile;
-
-	if (!borderfile.open(filename)) {
-		debug(1, "Cannot open border file");
-		return;
-	}
-
-	Image::BitmapDecoder bmpDecoder;
-	Common::SeekableReadStream *stream = borderfile.readStream(borderfile.size());
-	Graphics::Surface source;
-	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
-
-	if (stream) {
-		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename);
-		bmpDecoder.loadStream(*stream);
-		source = *(bmpDecoder.getSurface());
-
-		source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette());
-		surface->create(source.w, source.h, source.format);
-		surface->copyFrom(source);
-		surface->applyColorKey(255, 0, 255, false);
-
-		target->setBorder(*surface, active);
-
-		borderfile.close();
-
-		delete stream;
-	}
-}
-
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index cdf50b7..5f655b9 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -33,6 +33,8 @@
  
 #include "gui/debugger.h"
 
+#include "macventure/gui.h"
+
 struct ADGameDescription;
 
 namespace MacVenture {
@@ -61,18 +63,14 @@ public:
 
 private:
 	void processEvents();
-
-	void initGUI();
-	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
-
+	
 private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource *_rnd;
 	
 	Console *_debugger;
 
-	Graphics::MacWindowManager *_wm;
-	Graphics::ManagedSurface _screen;
+	Gui *_gui;
 
 	bool _shouldQuit;
 };
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 839cbb4..3f11d15 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -2,6 +2,7 @@ MODULE := engines/macventure
 
 MODULE_OBJS := \
 	detection.o \
+	gui.o \
 	macventure.o
 
 MODULE_DIRS += \


Commit: d15e3a03c73da1d5a0bbc372970936eedfa1108d
    https://github.com/scummvm/scummvm/commit/d15e3a03c73da1d5a0bbc372970936eedfa1108d
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:10:48+02:00

Commit Message:
MACVENTURE: Add game file manager

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index ade07a0..88fb85d 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -27,7 +27,13 @@
 
 #include "macventure/macventure.h"
 
-#include "macventure.h"
+namespace MacVenture {
+
+	const char *MacVentureEngine::getGameFileName() const {
+		return _gameDescription->filesDescriptions[0].fileName;
+	}
+
+}
 
 namespace MacVenture {
 
@@ -68,6 +74,8 @@ bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, cons
 }
 
 
+
+
 } // End of namespace MacVenture
 
 #if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index ef47d93..3f57637 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -64,6 +64,10 @@ Common::Error MacVentureEngine::run() {
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
 
+	_resourceManager = new Common::MacResManager();
+	if (!_resourceManager->open(getGameFileName()))
+		error("Could not open %s as a resource fork", getGameFileName());
+
 	_shouldQuit = false;
 	while (!_shouldQuit) {
 		processEvents();
@@ -90,4 +94,6 @@ void MacVentureEngine::processEvents() {
 		}
 	}
 }
+
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 5f655b9..9be560c 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -23,14 +23,11 @@
 #ifndef MACVENTURE_H
 #define MACVENTURE_H
 
+#include "engines/engine.h"
 #include "common/debug.h"
 #include "common/random.h"
+#include "common/macresman.h"
 
-#include "engines/engine.h"
-
-#include "graphics/managed_surface.h"
-#include "graphics/macgui/macwindowmanager.h"
- 
 #include "gui/debugger.h"
 
 #include "macventure/gui.h"
@@ -64,15 +61,22 @@ public:
 private:
 	void processEvents();
 	
-private:
+private: // Attributes
+
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource *_rnd;
+
+	Common::MacResManager *_resourceManager;
 	
 	Console *_debugger;
 
 	Gui *_gui;
 
 	bool _shouldQuit;
+
+private: // Methods
+
+	const char* getGameFileName() const;
 };
 
 


Commit: 2fd43c24d01e7b532deeddeab87d34e5ef0bd039
    https://github.com/scummvm/scummvm/commit/2fd43c24d01e7b532deeddeab87d34e5ef0bd039
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:11:06+02:00

Commit Message:
MACVENTURE: Small fix in detection

Changed paths:
    engines/macventure/detection_tables.h



diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index 9c9b91f..4667561 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -27,7 +27,7 @@ namespace MacVenture {
 #define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
 
 static const ADGameDescription gameDescriptions[] = {
-	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.dsk", "4e03e9ef1cd5f65ce1de14d512510537", 839680), // Zojoi Rerelease
+	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "054db22bdc6db3ccb89a23cd840f858e", 70528), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture


Commit: dd072a39de77f410c41604bcbcc1581606422f67
    https://github.com/scummvm/scummvm/commit/dd072a39de77f410c41604bcbcc1581606422f67
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:11:06+02:00

Commit Message:
MACVENTURE: Add basic menu loading

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 22e0faa..38a6336 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1,12 +1,23 @@
-
-#include "macventure/macventure.h"
-
 #include "common/file.h"
 #include "image/bmp.h"
 
+#include "macventure/macventure.h"
+#include "macventure/gui.h"
+
 namespace MacVenture {
 
-Gui::Gui() {
+/* priority, name, action, shortcut, enabled*/
+#define MV_MENU5(p, n, a, s, e) Graphics::MenuData{p, n, a, s, e}
+#define MV_MENU4(p, n, a, s) Graphics::MenuData{p, n, a, s, false}
+#define MV_MENUtop(n, a, s) Graphics::MenuData{-1, n, a, s, true}
+
+static const Graphics::MenuData menuSubItems[] = {
+	{ -1, "Hello World",	0, 0, false },
+	{ 0, "How yo duin",	0, 0, false },
+};
+
+Gui::Gui(MacVentureEngine *engine) {
+	_engine = engine;
 	initGUI();
 }
 
@@ -25,6 +36,12 @@ void Gui::initGUI() {
 	w->setDimensions(Common::Rect(100, 100));
 	w->setActive(false);
 
+	_menu = _wm.addMenu();
+
+	loadMenus();
+
+	_menu->calcDimensions();
+
 	loadBorder(w, "border_inac.bmp", false);
 }
 
@@ -59,4 +76,10 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 	}
 }
 
+void Gui::loadMenus() {
+	Graphics::MenuData data;
+	Common::Array<Graphics::MenuData>::const_iterator iter;
+	_menu->addStaticMenus(_engine->getMenuData());	
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 0cfb835..c6aae15 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -24,29 +24,35 @@
 #define MACVENTURE_GUI_H
 
 #include "graphics/macgui/macwindowmanager.h"
-
-#include "macventure/macventure.h"
+#include "graphics/macgui/macwindow.h"
+#include "graphics/macgui/macmenu.h"
 
 namespace MacVenture {
 
 using namespace Graphics::MacGUIConstants;
+class MacVentureEngine;
 
 class Gui {	
 
 public:
-	Gui(); 
+	Gui(MacVentureEngine *engine);
 	~Gui();
 
 	void draw();
 
 private: // Attributes
 
+	MacVentureEngine *_engine;
+
 	Graphics::ManagedSurface _screen;
 	Graphics::MacWindowManager _wm;
 
+	Graphics::Menu *_menu;
+
 private: // Methods
 
 	void initGUI();
+	void loadMenus();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
 };
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 3f57637..5eefde5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -24,13 +24,19 @@
 #include "common/debug-channels.h"
 #include "common/debug.h"
 #include "common/error.h"
-
 #include "engines/util.h"
 
 #include "macventure/macventure.h"
 
+// To move
+#include "common/file.h"
+
 namespace MacVenture {
 
+enum {
+	kMaxMenuTitleLength = 30
+};
+
 MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) {
 	_gameDescription = gameDesc;
 	_rnd = new Common::RandomSource("macventure");
@@ -57,9 +63,7 @@ Common::Error MacVentureEngine::run() {
 	_debugger = new Console(this);
 
 	// Additional setup.
-	debug("MacVentureEngine::init");
-
-	_gui = new Gui();
+	debug("MacVentureEngine::init");	
 
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
@@ -68,6 +72,11 @@ Common::Error MacVentureEngine::run() {
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());
 
+	if (!loadMenuData())
+		error("Could not load menu data from %s", getGameFileName());
+
+	_gui = new Gui(this);
+
 	_shouldQuit = false;
 	while (!_shouldQuit) {
 		processEvents();
@@ -95,5 +104,45 @@ void MacVentureEngine::processEvents() {
 	}
 }
 
+bool MacVentureEngine::loadMenuData() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+	Common::MacResIDArray::const_iterator iter;
+	
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
+		return false;
+
+	_menuData = new Graphics::MenuData[resArray.size()];
+	int i = 0;
+
+	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
+		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
+
+		Graphics::MenuData data;
+		int menunum = -1;
+		for (int i = 0; i < 5; i++) {
+			res->readUint16BE();
+			// Skip menuID, width, height, resourceID, placeholder
+		}		
+		bool enabled = res->readUint32BE();
+		uint8 titleLength = res->readByte();
+		char* title = new char[titleLength+1];
+		res->read(title, titleLength);
+		title[titleLength] = '\0';
+
+		_menuData[i] = { menunum, title, 0, 0, enabled};
+		i++;
+	}
+
+	// Override last value (end-of-menu) with our end-of-menu
+	_menuData[resArray.size() - 1] = { 0, 0, 0, 0, false };
+
+	return true;
+}
+
+Graphics::MenuData* MacVentureEngine::getMenuData() {
+	return _menuData;
+}
+
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 9be560c..254f162 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -58,8 +58,12 @@ public:
 
 	virtual Common::Error run();
 
+	Graphics::MenuData *getMenuData();
+
 private:
 	void processEvents();
+
+	bool loadMenuData();
 	
 private: // Attributes
 
@@ -77,6 +81,11 @@ private: // Attributes
 private: // Methods
 
 	const char* getGameFileName() const;
+
+private: //To move
+
+	Graphics::MenuData *_menuData;
+
 };
 
 


Commit: 4611429959b2fdc8608b6c972997b4e0b5ca05e7
    https://github.com/scummvm/scummvm/commit/4611429959b2fdc8608b6c972997b4e0b5ca05e7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:11:38+02:00

Commit Message:
MACVENTURE: Add submenu loading

Changed paths:
  A engines/macventure/menu.cpp
  A engines/macventure/menu.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 38a6336..10901e9 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
 #include "common/file.h"
 #include "image/bmp.h"
 
@@ -16,8 +38,9 @@ static const Graphics::MenuData menuSubItems[] = {
 	{ 0, "How yo duin",	0, 0, false },
 };
 
-Gui::Gui(MacVentureEngine *engine) {
+Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_engine = engine;
+	_resourceManager = resman;
 	initGUI();
 }
 
@@ -29,6 +52,10 @@ void Gui::draw() {
 	_wm.draw();
 }
 
+bool Gui::processEvent(Common::Event &event) {
+	return _wm.processEvent(event);
+}
+
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
@@ -38,7 +65,8 @@ void Gui::initGUI() {
 
 	_menu = _wm.addMenu();
 
-	loadMenus();
+	if (!loadMenus())
+		error("Could not load menus");
 
 	_menu->calcDimensions();
 
@@ -76,10 +104,50 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 	}
 }
 
-void Gui::loadMenus() {
-	Graphics::MenuData data;
-	Common::Array<Graphics::MenuData>::const_iterator iter;
-	_menu->addStaticMenus(_engine->getMenuData());	
+bool Gui::loadMenus() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+	Common::MacResIDArray::const_iterator iter;
+
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
+		return false;
+
+	_menu->addMenuItem("(c)");
+	_menu->addMenuSubItem(0, "Hello", 0, 0, 'K', true);
+
+	int i = 1;
+	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
+		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
+
+		Graphics::MenuData data;
+		int menunum = -1; // High level menus have level -1
+		/* Skip menuID, width, height, resourceID, placeholder */
+		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
+		bool enabled = res->readUint32BE();
+		uint8 titleLength = res->readByte();
+		char* title = new char[titleLength + 1];
+		res->read(title, titleLength);
+		title[titleLength] = '\0';
+
+		if (titleLength > 2) {
+			_menu->addMenuItem(title);
+
+			// Read submenu items
+			while (titleLength = res->readByte()) {
+				title = new char[titleLength + 1];
+				res->read(title, titleLength);
+				title[titleLength] = '\0';
+				// Skip icon, key, mark, style
+				for (int skip = 0; skip < 4; skip++) { res->readUint16BE(); }
+				_menu->addMenuSubItem(i, title, 0);
+			}
+		}	
+
+		i++;
+	}	
+
+	return true;
+	
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index c6aae15..96f2380 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -35,14 +35,16 @@ class MacVentureEngine;
 class Gui {	
 
 public:
-	Gui(MacVentureEngine *engine);
+	Gui(MacVentureEngine *engine, Common::MacResManager *resman);
 	~Gui();
 
 	void draw();
+	bool processEvent(Common::Event &event);
 
 private: // Attributes
 
 	MacVentureEngine *_engine;
+	Common::MacResManager *_resourceManager;
 
 	Graphics::ManagedSurface _screen;
 	Graphics::MacWindowManager _wm;
@@ -52,7 +54,7 @@ private: // Attributes
 private: // Methods
 
 	void initGUI();
-	void loadMenus();
+	bool loadMenus();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
 };
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 5eefde5..5660fde 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -63,7 +63,7 @@ Common::Error MacVentureEngine::run() {
 	_debugger = new Console(this);
 
 	// Additional setup.
-	debug("MacVentureEngine::init");	
+	debug("MacVentureEngine::init");
 
 	// Your main even loop should be (invoked from) here.
 	debug("MacVentureEngine::go: Hello, World!");
@@ -72,10 +72,7 @@ Common::Error MacVentureEngine::run() {
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());
 
-	if (!loadMenuData())
-		error("Could not load menu data from %s", getGameFileName());
-
-	_gui = new Gui(this);
+	_gui = new Gui(this, _resourceManager);
 
 	_shouldQuit = false;
 	while (!_shouldQuit) {
@@ -94,55 +91,18 @@ void MacVentureEngine::processEvents() {
 	Common::Event event;
 
 	while (_eventMan->pollEvent(event)) {
+		if (_gui->processEvent(event))
+			continue;
+
 		switch (event.type) {
-			case Common::EVENT_QUIT:
-				_shouldQuit = true;
-				break;
-			default:
-				break;
+		case Common::EVENT_QUIT:
+			_shouldQuit = true;
+			break;
+		default:
+			break;
 		}
 	}
 }
 
-bool MacVentureEngine::loadMenuData() {
-	Common::MacResIDArray resArray;
-	Common::SeekableReadStream *res;
-	Common::MacResIDArray::const_iterator iter;
-	
-	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
-		return false;
-
-	_menuData = new Graphics::MenuData[resArray.size()];
-	int i = 0;
-
-	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
-		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
-
-		Graphics::MenuData data;
-		int menunum = -1;
-		for (int i = 0; i < 5; i++) {
-			res->readUint16BE();
-			// Skip menuID, width, height, resourceID, placeholder
-		}		
-		bool enabled = res->readUint32BE();
-		uint8 titleLength = res->readByte();
-		char* title = new char[titleLength+1];
-		res->read(title, titleLength);
-		title[titleLength] = '\0';
-
-		_menuData[i] = { menunum, title, 0, 0, enabled};
-		i++;
-	}
-
-	// Override last value (end-of-menu) with our end-of-menu
-	_menuData[resArray.size() - 1] = { 0, 0, 0, 0, false };
-
-	return true;
-}
-
-Graphics::MenuData* MacVentureEngine::getMenuData() {
-	return _menuData;
-}
-
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 254f162..771588f 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -58,12 +58,8 @@ public:
 
 	virtual Common::Error run();
 
-	Graphics::MenuData *getMenuData();
-
 private:
 	void processEvents();
-
-	bool loadMenuData();
 	
 private: // Attributes
 
@@ -82,10 +78,6 @@ private: // Methods
 
 	const char* getGameFileName() const;
 
-private: //To move
-
-	Graphics::MenuData *_menuData;
-
 };
 
 
diff --git a/engines/macventure/menu.cpp b/engines/macventure/menu.cpp
new file mode 100644
index 0000000..dd3c495
--- /dev/null
+++ b/engines/macventure/menu.cpp
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+#include "macventure/menu.h"
+#include "macventure/macventure.h"
+
+#include "common/file.h"
+#include "graphics/macgui/macwindowmanager.h"
+
+namespace MacVenture {
+
+Menu::Menu(MacVentureEngine *engine, Graphics::MacWindowManager *wm) {
+
+	_engine = engine;
+	_wm = wm;
+
+	_menu = _wm->addMenu();
+
+	if (!loadMenuData())
+		error("Could not load menu data from %s", _engine->getGameFileName());
+}
+
+Menu::~Menu() {
+	delete _
+}
+
+void Menu::draw() {
+
+}
+
+bool Menu::loadMenuData() {
+
+}
+
+} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/menu.h b/engines/macventure/menu.h
new file mode 100644
index 0000000..dab6369
--- /dev/null
+++ b/engines/macventure/menu.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_MENU_H
+#define MACVENTURE_MENU_H
+
+namespace MacVenture {
+
+class MacVentureEngine;
+
+class Graphics::MacWindowManager;
+
+class Menu {
+
+public:
+	Menu(MacVentureEngine *engine, Graphics::MacWindowManager *wm);
+	~Menu();
+
+	void draw();
+
+private: // Attributes
+
+	MacVentureEngine *_engine;
+	Graphics::MacWindowManager *_wm;
+	Graphics::Menu *_menu;
+
+private: // Methods
+
+	void init();
+	bool loadMenuData();
+
+};
+
+} // End of namespace MacVenture
+
+#endif
+


Commit: 88949eddce470ff0d329296eb1b3b8c72b07823b
    https://github.com/scummvm/scummvm/commit/88949eddce470ff0d329296eb1b3b8c72b07823b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:11:40+02:00

Commit Message:
MACVENTURE: Add menu display

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 10901e9..eb1abe0 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -59,9 +59,9 @@ bool Gui::processEvent(Common::Event &event) {
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
-	Graphics::MacWindow *w = _wm.addWindow(false, true, true);
-	w->setDimensions(Common::Rect(100, 100));
-	w->setActive(false);
+	_outConsoleWindow = _wm.addWindow(false, true, true);
+	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
+	_outConsoleWindow->setActive(false);
 
 	_menu = _wm.addMenu();
 
@@ -70,7 +70,7 @@ void Gui::initGUI() {
 
 	_menu->calcDimensions();
 
-	loadBorder(w, "border_inac.bmp", false);
+	loadBorder(_outConsoleWindow, "border_inac.bmp", false);
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -113,19 +113,23 @@ bool Gui::loadMenus() {
 		return false;
 
 	_menu->addMenuItem("(c)");
-	_menu->addMenuSubItem(0, "Hello", 0, 0, 'K', true);
+	_menu->addMenuSubItem(0, "Hello", 0, 0, 'K', false);
 
 	int i = 1;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
+		bool enabled;
+		uint16 key;
+		uint8 titleLength;
+		char* title;
 
 		Graphics::MenuData data;
 		int menunum = -1; // High level menus have level -1
 		/* Skip menuID, width, height, resourceID, placeholder */
 		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
-		bool enabled = res->readUint32BE();
-		uint8 titleLength = res->readByte();
-		char* title = new char[titleLength + 1];
+		enabled = res->readUint32BE();
+		titleLength = res->readByte();
+		title = new char[titleLength + 1];
 		res->read(title, titleLength);
 		title[titleLength] = '\0';
 
@@ -137,9 +141,12 @@ bool Gui::loadMenus() {
 				title = new char[titleLength + 1];
 				res->read(title, titleLength);
 				title[titleLength] = '\0';
-				// Skip icon, key, mark, style
-				for (int skip = 0; skip < 4; skip++) { res->readUint16BE(); }
-				_menu->addMenuSubItem(i, title, 0);
+				// Skip icon
+				res->readUint16BE();
+				key = res->readUint16BE();
+				// Skip key, mark, style
+				for (int skip = 0; skip < 2; skip++) { res->readUint16BE(); }
+				_menu->addMenuSubItem(i, title, 0, 0, key, false);
 			}
 		}	
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 96f2380..8107793 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -49,6 +49,7 @@ private: // Attributes
 	Graphics::ManagedSurface _screen;
 	Graphics::MacWindowManager _wm;
 
+	Graphics::MacWindow *_outConsoleWindow;
 	Graphics::Menu *_menu;
 
 private: // Methods


Commit: 7991b3ede73e8545bb64795706d26ace7a711f9b
    https://github.com/scummvm/scummvm/commit/7991b3ede73e8545bb64795706d26ace7a711f9b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:11:41+02:00

Commit Message:
MACVENTURE: Add static menus

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index eb1abe0..9e0b377 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -28,16 +28,49 @@
 
 namespace MacVenture {
 
-/* priority, name, action, shortcut, enabled*/
-#define MV_MENU5(p, n, a, s, e) Graphics::MenuData{p, n, a, s, e}
-#define MV_MENU4(p, n, a, s) Graphics::MenuData{p, n, a, s, false}
-#define MV_MENUtop(n, a, s) Graphics::MenuData{-1, n, a, s, true}
+enum MenuAction;
+
+enum {
+	kMenuHighLevel = -1,
+	kMenuAbout = 0,
+	kMenuFile = 1,
+	kMenuEdit = 2,
+	kMenuSpecial = 3
+};
 
 static const Graphics::MenuData menuSubItems[] = {
-	{ -1, "Hello World",	0, 0, false },
-	{ 0, "How yo duin",	0, 0, false },
+	{ kMenuHighLevel,	"File",				0, 0, false },
+	{ kMenuHighLevel,	"Edit",				0, 0, false },		
+	{ kMenuHighLevel,	"Special",			0, 0, false },
+	{ kMenuHighLevel,	"Font",				0, 0, false },
+	{ kMenuHighLevel,	"FontSize",			0, 0, false },
+
+	//{ kMenuAbout,		"About",			kMenuActionAbout, 0, true},
+
+	{ kMenuFile,		"New",				kMenuActionNew, 0, true },
+	{ kMenuFile,		NULL,				0, 0, false },
+	{ kMenuFile,		"Open...",			kMenuActionOpen, 0, true },
+	{ kMenuFile,		"Save",				kMenuActionSave, 0, true },
+	{ kMenuFile,		"Save as...",		kMenuActionSaveAs, 0, true },
+	{ kMenuFile,		NULL,				0, 0, false },
+	{ kMenuFile,		"Quit",				kMenuActionQuit, 0, true },
+
+	{ kMenuEdit,		"Undo",				kMenuActionUndo, 'Z', true },
+	{ kMenuEdit,		NULL,				0, 0, false },
+	{ kMenuEdit,		"Cut",				kMenuActionCut, 'K', true },
+	{ kMenuEdit,		"Copy",				kMenuActionCopy, 'C', true },
+	{ kMenuEdit,		"Paste",			kMenuActionPaste, 'V', true },
+	{ kMenuEdit,		"Clear",			kMenuActionClear, 'B', true },
+
+	{ kMenuSpecial,		"Clean Up",			kMenuActionCleanUp, 0, true },
+	{ kMenuSpecial,		"Mess Up",			kMenuActionMessUp, 0, true },
+
+	{ 0,				NULL,				0, 0, false }
 };
 
+bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+void menuCommandsCallback(int action, Common::String &text, void *data);
+
 Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_engine = engine;
 	_resourceManager = resman;
@@ -59,18 +92,20 @@ bool Gui::processEvent(Common::Event &event) {
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
-	_outConsoleWindow = _wm.addWindow(false, true, true);
-	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
-	_outConsoleWindow->setActive(false);
 
+	// Menu
 	_menu = _wm.addMenu();
-
 	if (!loadMenus())
 		error("Could not load menus");
-
+	_menu->setCommandsCallback(menuCommandsCallback, this);
 	_menu->calcDimensions();
 
-	loadBorder(_outConsoleWindow, "border_inac.bmp", false);
+	// In-game Output Console
+	_outConsoleWindow = _wm.addWindow(false, true, true);
+	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
+	_outConsoleWindow->setActive(false);
+	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
+	loadBorder(_outConsoleWindow, "border_inac.bmp", false);	
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -105,25 +140,31 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 }
 
 bool Gui::loadMenus() {
+
+	// We assume that, if there are static menus, we don't need dynamic ones
+	if (menuSubItems) {
+		_menu->addStaticMenus(menuSubItems);
+		return true;
+	}
+
 	Common::MacResIDArray resArray;
 	Common::SeekableReadStream *res;
 	Common::MacResIDArray::const_iterator iter;
 
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
-		return false;
+		return false;	
 
-	_menu->addMenuItem("(c)");
-	_menu->addMenuSubItem(0, "Hello", 0, 0, 'K', false);
+	_menu->addMenuSubItem(0, "Abb", kMenuActionAbout, 0, 'A', true);
 
 	int i = 1;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
 		bool enabled;
 		uint16 key;
+		uint16 style;
 		uint8 titleLength;
 		char* title;
 
-		Graphics::MenuData data;
 		int menunum = -1; // High level menus have level -1
 		/* Skip menuID, width, height, resourceID, placeholder */
 		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
@@ -133,7 +174,7 @@ bool Gui::loadMenus() {
 		res->read(title, titleLength);
 		title[titleLength] = '\0';
 
-		if (titleLength > 2) {
+		if (titleLength > 1) {
 			_menu->addMenuItem(title);
 
 			// Read submenu items
@@ -143,18 +184,81 @@ bool Gui::loadMenus() {
 				title[titleLength] = '\0';
 				// Skip icon
 				res->readUint16BE();
+				// Read key
 				key = res->readUint16BE();
-				// Skip key, mark, style
-				for (int skip = 0; skip < 2; skip++) { res->readUint16BE(); }
-				_menu->addMenuSubItem(i, title, 0, 0, key, false);
+				// Skip mark
+				res->readUint16BE();
+				// Read style
+				style = res->readUint16BE();
+				_menu->addMenuSubItem(i, title, 0, style, key, false);
 			}
 		}	
 
 		i++;
-	}	
+	}
 
+	return true;	
+}
+
+/* CALLBACKS */
+bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui) {
 	return true;
-	
+}
+
+void menuCommandsCallback(int action, Common::String &text, void *data) {
+	Gui *g = (Gui *)data;
+
+	g->handleMenuAction((MenuAction)action);
+}
+
+/* HANDLERS */
+void Gui::handleMenuAction(MenuAction action) {
+	switch (action)	{
+	case MacVenture::kMenuActionAbout:
+		debug("MacVenture Menu Action: About");
+		break;
+	case MacVenture::kMenuActionNew:
+		debug("MacVenture Menu Action: New");
+		break;
+	case MacVenture::kMenuActionOpen:
+		debug("MacVenture Menu Action: Open");
+		break;
+	case MacVenture::kMenuActionSave:
+		debug("MacVenture Menu Action: Save");
+		break;
+	case MacVenture::kMenuActionSaveAs:
+		debug("MacVenture Menu Action: Save As");
+		break;
+	case MacVenture::kMenuActionQuit:
+		debug("MacVenture Menu Action: Quit");
+		break;
+	case MacVenture::kMenuActionUndo:
+		debug("MacVenture Menu Action: Undo");
+		break;
+	case MacVenture::kMenuActionCut:
+		debug("MacVenture Menu Action: Cut");
+		break;
+	case MacVenture::kMenuActionCopy:
+		debug("MacVenture Menu Action: Copy");
+		break;
+	case MacVenture::kMenuActionPaste:
+		debug("MacVenture Menu Action: Paste");
+		break;
+	case MacVenture::kMenuActionClear:
+		debug("MacVenture Menu Action: Clear");
+		break;
+	case MacVenture::kMenuActionCleanUp:
+		debug("MacVenture Menu Action: Clean Up");
+		break;
+	case MacVenture::kMenuActionMessUp:
+		debug("MacVenture Menu Action: Mess Up");
+		break;
+	case MacVenture::kMenuActionCommand:
+		debug("MacVenture Menu Action: GENERIC");
+		break;
+	default:
+		break;
+	}
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 8107793..eb5197b 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -30,8 +30,29 @@
 namespace MacVenture {
 
 using namespace Graphics::MacGUIConstants;
+using namespace Graphics::MacWindowConstants;
 class MacVentureEngine;
 
+//namespace MacVentureMenuActions {
+enum MenuAction {
+	kMenuActionAbout,
+	kMenuActionNew,
+	kMenuActionOpen,
+	kMenuActionSave,
+	kMenuActionSaveAs,
+	kMenuActionQuit,
+	kMenuActionUndo,
+	kMenuActionCut,
+	kMenuActionCopy,
+	kMenuActionPaste,
+	kMenuActionClear,
+	kMenuActionCleanUp,
+	kMenuActionMessUp,
+
+	kMenuActionCommand
+};
+//} using namespace MacVentureMenuActions;
+
 class Gui {	
 
 public:
@@ -40,6 +61,7 @@ public:
 
 	void draw();
 	bool processEvent(Common::Event &event);
+	void handleMenuAction(MenuAction action);
 
 private: // Attributes
 
@@ -56,7 +78,7 @@ private: // Methods
 
 	void initGUI();
 	bool loadMenus();
-	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
+	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);	
 
 };
 


Commit: c09e74b6a736f1970f2c75411dba6e2cefe1e76b
    https://github.com/scummvm/scummvm/commit/c09e74b6a736f1970f2c75411dba6e2cefe1e76b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:14:15+02:00

Commit Message:
MACVENTURE: Add commnad window text render

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 9e0b377..6bb54d8 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -40,7 +40,7 @@ enum {
 
 static const Graphics::MenuData menuSubItems[] = {
 	{ kMenuHighLevel,	"File",				0, 0, false },
-	{ kMenuHighLevel,	"Edit",				0, 0, false },		
+	{ kMenuHighLevel,	"Edit",				0, 0, false },
 	{ kMenuHighLevel,	"Special",			0, 0, false },
 	{ kMenuHighLevel,	"Font",				0, 0, false },
 	{ kMenuHighLevel,	"FontSize",			0, 0, false },
@@ -83,6 +83,12 @@ Gui::~Gui() {
 
 void Gui::draw() {
 	_wm.draw();
+	Common::List<CommandButton>::const_iterator it = _controlData->begin();
+	for (; it != _controlData->end(); ++it) {
+		CommandButton button = *it;
+		if (button.getData().refcon != kControlExitBox)
+			button.draw(*_controlsWindow->getSurface());
+	}
 }
 
 bool Gui::processEvent(Common::Event &event) {
@@ -100,12 +106,34 @@ void Gui::initGUI() {
 	_menu->setCommandsCallback(menuCommandsCallback, this);
 	_menu->calcDimensions();
 
+	if (!loadWindows())
+		error("Could not load windows");
+
+	initWindows();
+
+	if (!loadControls())
+		error("Could not load controls");
+
+	draw();
+
+}
+
+void Gui::initWindows() {
+
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
 	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_inac.bmp", false);	
+	loadBorder(_outConsoleWindow, "border_command.bmp", false);
+
+	// Game Controls Window
+	_controlsWindow = _wm.addWindow(false, false, false);
+	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
+	_controlsWindow->setActive(false);
+	_controlsWindow->setCallback(controlsWindowCallback, this);
+	loadBorder(_controlsWindow, "border_command.bmp", false);
+
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -152,7 +180,7 @@ bool Gui::loadMenus() {
 	Common::MacResIDArray::const_iterator iter;
 
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
-		return false;	
+		return false;
 
 	_menu->addMenuSubItem(0, "Abb", kMenuActionAbout, 0, 'A', true);
 
@@ -192,12 +220,12 @@ bool Gui::loadMenus() {
 				style = res->readUint16BE();
 				_menu->addMenuSubItem(i, title, 0, style, key, false);
 			}
-		}	
+		}
 
 		i++;
 	}
 
-	return true;	
+	return true;
 }
 
 /* CALLBACKS */
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index eb5197b..d63f7fc 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -53,7 +53,7 @@ enum MenuAction {
 };
 //} using namespace MacVentureMenuActions;
 
-class Gui {	
+class Gui {
 
 public:
 	Gui(MacVentureEngine *engine, Common::MacResManager *resman);
@@ -78,10 +78,56 @@ private: // Methods
 
 	void initGUI();
 	bool loadMenus();
-	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);	
+	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
 };
 
+class CommandButton {
+
+enum {
+	kCommandsLeftPadding = 0,
+	kCommandsTopPadding = 0
+};
+
+public:
+	CommandButton(ControlData data, Gui *g) {
+		_data = data;
+		_gui = g;
+	}
+	~CommandButton() {}
+
+	void draw(Graphics::ManagedSurface &surface) {
+
+
+		surface.fillRect(_data.bounds, kColorWhite);
+		surface.frameRect(_data.bounds, kColorBlack);
+
+		const Graphics::Font &font = _gui->getCurrentFont();
+		Common::String title(_data.title);
+		font.drawString(
+			&surface,
+			title,
+			_data.bounds.left,
+			_data.bounds.top,
+			_data.bounds.right - _data.bounds.left,
+			kColorBlack,
+			Graphics::kTextAlignCenter);
+
+	}
+
+	bool isInsideBounds(Common::Point point) {
+		return _data.bounds.contains(point);
+	}
+
+	const ControlData& getData() {
+		return _data;
+	}
+
+private:
+	ControlData _data;
+	Gui *_gui;
+};
+
 } // End of namespace MacVenture
 
 #endif


Commit: 63e4fe8fc7d99d858f5302a7c3321e1d73296904
    https://github.com/scummvm/scummvm/commit/63e4fe8fc7d99d858f5302a7c3321e1d73296904
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:15:35+02:00

Commit Message:
MACVENTURE: Add command callback

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6bb54d8..887f9c2 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -82,13 +82,15 @@ Gui::~Gui() {
 }
 
 void Gui::draw() {
-	_wm.draw();
+
 	Common::List<CommandButton>::const_iterator it = _controlData->begin();
 	for (; it != _controlData->end(); ++it) {
 		CommandButton button = *it;
 		if (button.getData().refcon != kControlExitBox)
 			button.draw(*_controlsWindow->getSurface());
 	}
+
+	_wm.draw();
 }
 
 bool Gui::processEvent(Common::Event &event) {
@@ -133,6 +135,7 @@ void Gui::initWindows() {
 	_controlsWindow->setActive(false);
 	_controlsWindow->setCallback(controlsWindowCallback, this);
 	loadBorder(_controlsWindow, "border_command.bmp", false);
+	loadBorder(_controlsWindow, "border_command.bmp", true);
 
 }
 
@@ -229,10 +232,16 @@ bool Gui::loadMenus() {
 }
 
 /* CALLBACKS */
-bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui) {
+bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	return true;
 }
 
+bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processCommandEvents(click, event);
+}
+
 void menuCommandsCallback(int action, Common::String &text, void *data) {
 	Gui *g = (Gui *)data;
 
@@ -289,4 +298,22 @@ void Gui::handleMenuAction(MenuAction action) {
 	}
 }
 
+
+bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
+	if (event.type == Common::EVENT_LBUTTONUP) {
+		Common::Point position(
+			event.mouse.x - _controlsWindow->getDimensions().left,
+			event.mouse.y - _controlsWindow->getDimensions().top);
+		//debug("Click at: %d, %d", p)
+		Common::List<CommandButton>::const_iterator it = _controlData->begin();
+		for (; it != _controlData->end(); ++it) {
+			const CommandButton &data = *it;
+			if (data.isInsideBounds(position)) {
+				debug("Command active: %s", data.getData().title);
+			}
+		}
+	}
+	return false;
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index d63f7fc..c6446ce 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -62,6 +62,7 @@ public:
 	void draw();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
+	bool processCommandEvents(WindowClick click, Common::Event &event);
 
 private: // Attributes
 
@@ -96,7 +97,7 @@ public:
 	}
 	~CommandButton() {}
 
-	void draw(Graphics::ManagedSurface &surface) {
+	void draw(Graphics::ManagedSurface &surface) const {
 
 
 		surface.fillRect(_data.bounds, kColorWhite);
@@ -115,11 +116,11 @@ public:
 
 	}
 
-	bool isInsideBounds(Common::Point point) {
+	bool isInsideBounds(const Common::Point point) const {
 		return _data.bounds.contains(point);
 	}
 
-	const ControlData& getData() {
+	const ControlData& getData() const {
 		return _data;
 	}
 


Commit: 1d5cbee3a820c34af2ecdc2221e38290ab33c82f
    https://github.com/scummvm/scummvm/commit/1d5cbee3a820c34af2ecdc2221e38290ab33c82f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:17:45+02:00

Commit Message:
MACVENTURE: Fix small border bug

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 887f9c2..caf6eb1 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -231,6 +231,91 @@ bool Gui::loadMenus() {
 	return true;
 }
 
+bool Gui::loadWindows() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+	Common::MacResIDArray::const_iterator iter;
+
+	_windowData = new Common::List<WindowData>();
+
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('W', 'I', 'N', 'D'))).size() == 0)
+		return false;
+
+	uint32 id = kCommandsWindow;
+	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
+		res = _resourceManager->getResource(MKTAG('W', 'I', 'N', 'D'), *iter);
+		WindowData data;
+		uint16 top, left, bottom, right;
+		uint16 borderSize;
+		top = res->readUint16BE();
+		left = res->readUint16BE();
+		bottom = res->readUint16BE();
+		right = res->readUint16BE();
+		data.type = (MVWindowType)res->readUint16BE();
+		data.bounds = Common::Rect(
+			left,
+			top,
+			right + borderThickness(data.type),
+			bottom + borderThickness(data.type));
+		data.visible = res->readUint16BE();
+		data.hasCloseBox = res->readUint16BE();
+		data.refcon = (WindowReference)id; id++;
+		res->readUint32BE(); // Skip the true id. For some reason it's reading 0
+		data.titleLength = res->readByte();
+		if (data.titleLength) {
+			data.title = new char[data.titleLength + 1];
+			res->read(data.title, data.titleLength);
+			data.title[data.titleLength] = '\0';
+		}
+
+		_windowData->push_back(data);
+	}
+
+	return true;
+}
+
+bool Gui::loadControls() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+	Common::MacResIDArray::const_iterator iter;
+
+	_controlData = new Common::List<CommandButton>();
+
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('C', 'N', 'T', 'L'))).size() == 0)
+		return false;
+
+	uint32 id = kControlExitBox;
+	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
+		res = _resourceManager->getResource(MKTAG('C', 'N', 'T', 'L'), *iter);
+		ControlData data;
+		uint16 top, left, bottom, right;
+		top = res->readUint16BE();
+		left = res->readUint16BE();
+		bottom = res->readUint16BE();
+		right = res->readUint16BE();
+		Common::Rect bounds(left, top, right, bottom); // For some reason, if I remove this it segfaults
+		data.bounds = Common::Rect(left, top, right, bottom);
+		data.scrollValue = res->readUint16BE();
+		data.visible = res->readByte();
+		res->readByte(); // Unused
+		data.scrollMax = res->readUint16BE();
+		data.scrollMin = res->readUint16BE();
+		data.cdef = res->readUint16BE();
+		data.refcon = (ControlReference)id; id++;
+		res->readUint32BE();
+		data.titleLength = res->readByte();
+		if (data.titleLength) {
+			data.title = new char[data.titleLength + 1];
+			res->read(data.title, data.titleLength);
+			data.title[data.titleLength] = '\0';
+		}
+
+		i++;
+	}
+
+	return true;
+}
+
 /* CALLBACKS */
 bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	return true;
@@ -304,7 +389,6 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		Common::Point position(
 			event.mouse.x - _controlsWindow->getDimensions().left,
 			event.mouse.y - _controlsWindow->getDimensions().top);
-		//debug("Click at: %d, %d", p)
 		Common::List<CommandButton>::const_iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			const CommandButton &data = *it;
@@ -316,4 +400,39 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	return false;
 }
 
+/* Ugly switches */
+
+uint16 Gui::borderThickness(MVWindowType type) {
+	switch (type) {
+	case MacVenture::kDocument:
+		break;
+	case MacVenture::kDBox:
+		break;
+	case MacVenture::kPlainDBox:
+		return 6;
+	case MacVenture::kAltBox:
+		break;
+	case MacVenture::kNoGrowDoc:
+		break;
+	case MacVenture::kMovableDBox:
+		break;
+	case MacVenture::kZoomDoc:
+		break;
+	case MacVenture::kZoomNoGrow:
+		break;
+	case MacVenture::kRDoc16:
+		break;
+	case MacVenture::kRDoc4:
+		break;
+	case MacVenture::kRDoc6:
+		break;
+	case MacVenture::kRDoc10:
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index c6446ce..983dc10 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -53,6 +53,65 @@ enum MenuAction {
 };
 //} using namespace MacVentureMenuActions;
 
+enum WindowReference {
+	kCommandsWindow = 0x80,
+	kMainGameWindow = 0x81,
+	kOutConsoleWindow = 0x82,
+	kSelfWindow = 0x83,
+	kExitsWindow = 0x84,
+	kDiplomaWindow = 0x85
+};
+
+enum MVWindowType {
+	kDocument = 0x00,
+	kDBox = 0x01,
+	kPlainDBox = 0x02,
+	kAltBox = 0x03,
+	kNoGrowDoc = 0x04,
+	kMovableDBox = 0x05,
+	kZoomDoc = 0x08,
+	kZoomNoGrow = 0x0c,
+	kRDoc16 = 0x10,
+	kRDoc4 = 0x12,
+	kRDoc6 = 0x14,
+	kRDoc10 = 0x16
+};
+
+struct WindowData {
+	Common::Rect bounds;
+	MVWindowType type;
+	uint16 visible;
+	uint16 hasCloseBox;
+	WindowReference refcon;
+	uint8 titleLength;
+	char* title;
+};
+
+enum ControlReference {
+	kControlExitBox = 0,
+	kControlExamine = 1,
+	kControlOpen = 2,
+	kControlClose = 3,
+	kControlSpeak = 4,
+	kControlOperate = 5,
+	kControlGo = 6,
+	kControlHit = 7,
+	kControlConsume = 8
+};
+
+struct ControlData {
+	Common::Rect bounds;
+	uint16 scrollValue;
+	uint8 visible;
+	uint16 scrollMax;
+	uint16 scrollMin;
+	uint16 cdef;
+	uint32 refcon;
+	uint8 titleLength;
+	char* title;
+};
+
+
 class Gui {
 
 public:
@@ -81,6 +140,8 @@ private: // Methods
 	bool loadMenus();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
+	uint16 borderThickness(MVWindowType type);
+
 };
 
 class CommandButton {
@@ -113,7 +174,6 @@ public:
 			_data.bounds.right - _data.bounds.left,
 			kColorBlack,
 			Graphics::kTextAlignCenter);
-
 	}
 
 	bool isInsideBounds(const Common::Point point) const {


Commit: ec40b4ec441dd1e3af4cdf1fb670d44efc19f7f4
    https://github.com/scummvm/scummvm/commit/ec40b4ec441dd1e3af4cdf1fb670d44efc19f7f4
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:20:54+02:00

Commit Message:
MACVENTURE: Fix border offsets

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index caf6eb1..8f922d3 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -83,12 +83,7 @@ Gui::~Gui() {
 
 void Gui::draw() {
 
-	Common::List<CommandButton>::const_iterator it = _controlData->begin();
-	for (; it != _controlData->end(); ++it) {
-		CommandButton button = *it;
-		if (button.getData().refcon != kControlExitBox)
-			button.draw(*_controlsWindow->getSurface());
-	}
+	drawCommandsWindow();
 
 	_wm.draw();
 }
@@ -122,13 +117,6 @@ void Gui::initGUI() {
 
 void Gui::initWindows() {
 
-	// In-game Output Console
-	_outConsoleWindow = _wm.addWindow(false, true, true);
-	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
-	_outConsoleWindow->setActive(false);
-	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_command.bmp", false);
-
 	// Game Controls Window
 	_controlsWindow = _wm.addWindow(false, false, false);
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
@@ -137,6 +125,15 @@ void Gui::initWindows() {
 	loadBorder(_controlsWindow, "border_command.bmp", false);
 	loadBorder(_controlsWindow, "border_command.bmp", true);
 
+	// Main Game Window
+
+	// In-game Output Console
+	_outConsoleWindow = _wm.addWindow(false, true, true);
+	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
+	_outConsoleWindow->setActive(false);
+	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
+	loadBorder(_outConsoleWindow, "border_command.bmp", false);
+
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -253,10 +250,10 @@ bool Gui::loadWindows() {
 		right = res->readUint16BE();
 		data.type = (MVWindowType)res->readUint16BE();
 		data.bounds = Common::Rect(
-			left,
-			top,
-			right + borderThickness(data.type),
-			bottom + borderThickness(data.type));
+			left - borderThickness(data.type),
+			top - borderThickness(data.type),
+			right + borderThickness(data.type) * 2,
+			bottom + borderThickness(data.type) * 2);
 		data.visible = res->readUint16BE();
 		data.hasCloseBox = res->readUint16BE();
 		data.refcon = (WindowReference)id; id++;
@@ -284,6 +281,7 @@ bool Gui::loadControls() {
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('C', 'N', 'T', 'L'))).size() == 0)
 		return false;
 
+	uint16 commandsBorder = borderThickness(kPlainDBox);
 	uint32 id = kControlExitBox;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('C', 'N', 'T', 'L'), *iter);
@@ -293,8 +291,6 @@ bool Gui::loadControls() {
 		left = res->readUint16BE();
 		bottom = res->readUint16BE();
 		right = res->readUint16BE();
-		Common::Rect bounds(left, top, right, bottom); // For some reason, if I remove this it segfaults
-		data.bounds = Common::Rect(left, top, right, bottom);
 		data.scrollValue = res->readUint16BE();
 		data.visible = res->readByte();
 		res->readByte(); // Unused
@@ -309,6 +305,11 @@ bool Gui::loadControls() {
 			res->read(data.title, data.titleLength);
 			data.title[data.titleLength] = '\0';
 		}
+		if (data.refcon != kControlExitBox)
+			data.border = commandsBorder;
+
+		Common::Rect bounds(left, top, right, bottom); // For some reason, if I remove this it segfaults
+		data.bounds = Common::Rect(left + data.border, top + data.border, right + data.border, bottom + data.border);
 
 		i++;
 	}
@@ -316,6 +317,32 @@ bool Gui::loadControls() {
 	return true;
 }
 
+void Gui::drawCommandsWindow() {
+	if (_engine->isPaused()) {
+		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
+		WindowData data = getWindowData(kCommandsWindow);
+		uint16 border = borderThickness(data.type);
+		srf->fillRect(Common::Rect(border * 2, border * 2, srf->w - (border * 3), srf->h - (border * 3)), kColorWhite);
+		getCurrentFont().drawString(
+			srf,
+			_engine->getCommandsPausedString(),
+			0,
+			(srf->h / 2) - getCurrentFont().getFontHeight(),
+			data.bounds.right - data.bounds.left,
+			kColorBlack,
+			Graphics::kTextAlignCenter);
+	}
+	else {
+		Common::List<CommandButton>::const_iterator it = _controlData->begin();
+		for (; it != _controlData->end(); ++it) {
+			CommandButton button = *it;
+			if (button.getData().refcon != kControlExitBox)
+				button.draw(*_controlsWindow->getSurface());
+		}
+	}
+}
+
+
 /* CALLBACKS */
 bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	return true;
@@ -386,14 +413,18 @@ void Gui::handleMenuAction(MenuAction action) {
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		Common::Point position(
-			event.mouse.x - _controlsWindow->getDimensions().left,
-			event.mouse.y - _controlsWindow->getDimensions().top);
-		Common::List<CommandButton>::const_iterator it = _controlData->begin();
-		for (; it != _controlData->end(); ++it) {
-			const CommandButton &data = *it;
-			if (data.isInsideBounds(position)) {
-				debug("Command active: %s", data.getData().title);
+		if (_engine->isPaused()) {
+			_engine->requestUnpause();
+		} else {
+			Common::Point position(
+				event.mouse.x - _controlsWindow->getDimensions().left,
+				event.mouse.y - _controlsWindow->getDimensions().top);
+			Common::List<CommandButton>::const_iterator it = _controlData->begin();
+			for (; it != _controlData->end(); ++it) {
+				const CommandButton &data = *it;
+				if (data.isInsideBounds(position)) {
+					debug("Command active: %s", data.getData().title);
+				}
 			}
 		}
 	}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 983dc10..9316f91 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -109,6 +109,7 @@ struct ControlData {
 	uint32 refcon;
 	uint8 titleLength;
 	char* title;
+	uint16 border;
 };
 
 
@@ -123,6 +124,13 @@ public:
 	void handleMenuAction(MenuAction action);
 	bool processCommandEvents(WindowClick click, Common::Event &event);
 
+	const WindowData& getWindowData(WindowReference reference);
+
+	const Graphics::Font& getCurrentFont();
+
+	// Ugly switches
+	uint16 borderThickness(MVWindowType type);
+
 private: // Attributes
 
 	MacVentureEngine *_engine;
@@ -131,16 +139,30 @@ private: // Attributes
 	Graphics::ManagedSurface _screen;
 	Graphics::MacWindowManager _wm;
 
+	Common::List<WindowData> *_windowData;
+	Common::List<CommandButton> *_controlData;
+
+	Graphics::MacWindow *_controlsWindow;
+	Graphics::MacWindow *_mainGameWindow;
 	Graphics::MacWindow *_outConsoleWindow;
+	Graphics::MacWindow *_selfWindow;
+	Graphics::MacWindow *_exitsWindow;
+	Graphics::MacWindow *_diplomaWindow;
 	Graphics::Menu *_menu;
 
 private: // Methods
 
+
+	// Initializers
 	void initGUI();
+	void initWindows();
+
+	// Loaders
 	bool loadMenus();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
-	uint16 borderThickness(MVWindowType type);
+	// Drawers
+	void drawCommandsWindow();
 
 };
 
@@ -160,7 +182,6 @@ public:
 
 	void draw(Graphics::ManagedSurface &surface) const {
 
-
 		surface.fillRect(_data.bounds, kColorWhite);
 		surface.frameRect(_data.bounds, kColorBlack);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 5660fde..1902127 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -87,6 +87,24 @@ Common::Error MacVentureEngine::run() {
 	return Common::kNoError;
 }
 
+void MacVentureEngine::requestQuit() {
+	_shouldQuit = true;
+}
+
+void MacVentureEngine::requestUnpause() {
+	_paused = false;
+}
+
+// Data retrieval
+
+bool MacVentureEngine::isPaused() {
+	return _paused;
+}
+
+Common::String MacVentureEngine::getCommandsPausedString() {
+	return Common::String("Click to continue");
+}
+
 void MacVentureEngine::processEvents() {
 	Common::Event event;
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 771588f..b8d065b 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -58,16 +58,23 @@ public:
 
 	virtual Common::Error run();
 
+	void requestQuit();
+	void requestUnpause();
+
+	// Data retrieval
+	bool isPaused();
+	Common::String getCommandsPausedString();
+
 private:
 	void processEvents();
-	
+
 private: // Attributes
 
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource *_rnd;
 
 	Common::MacResManager *_resourceManager;
-	
+
 	Console *_debugger;
 
 	Gui *_gui;
@@ -88,4 +95,4 @@ public:
 };
 } // End of namespace MacVenture
 
-#endif
\ No newline at end of file
+#endif


Commit: 61134cf570b711b61bef8034db2b167a3a6f4ef3
    https://github.com/scummvm/scummvm/commit/61134cf570b711b61bef8034db2b167a3a6f4ef3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:22:19+02:00

Commit Message:
MACVENTURE: Add the rest of the windows

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 8f922d3..3aac7e1 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -68,7 +68,14 @@ static const Graphics::MenuData menuSubItems[] = {
 	{ 0,				NULL,				0, 0, false }
 };
 
+bool controlsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool mainGameWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool selfWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool exitsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool diplomaWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool inventoryWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+
 void menuCommandsCallback(int action, Common::String &text, void *data);
 
 Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
@@ -92,6 +99,24 @@ bool Gui::processEvent(Common::Event &event) {
 	return _wm.processEvent(event);
 }
 
+const WindowData& Gui::getWindowData(WindowReference reference) {
+	assert(_windowData);
+
+	Common::List<WindowData>::const_iterator iter = _windowData->begin();
+	while (iter->refcon != reference && iter != _windowData->end()) {
+		iter++;
+	}
+
+	if (iter->refcon == reference)
+		return *iter;
+
+	error("Could not locate the desired window data");
+}
+
+const Graphics::Font& Gui::getCurrentFont() {
+	return *_wm.getFont("Chicago-12", Graphics::FontManager::kBigGUIFont);
+}
+
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
@@ -126,6 +151,12 @@ void Gui::initWindows() {
 	loadBorder(_controlsWindow, "border_command.bmp", true);
 
 	// Main Game Window
+	_mainGameWindow = _wm.addWindow(false, false, false);
+	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
+	_mainGameWindow->setActive(false);
+	_mainGameWindow->setCallback(mainGameWindowCallback, this);
+	loadBorder(_mainGameWindow, "border_command.bmp", false);
+	loadBorder(_mainGameWindow, "border_command.bmp", true);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
@@ -134,6 +165,36 @@ void Gui::initWindows() {
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
 	loadBorder(_outConsoleWindow, "border_command.bmp", false);
 
+	// Self Window
+	_selfWindow = _wm.addWindow(false, true, true);
+	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
+	_selfWindow->setActive(false);
+	_selfWindow->setCallback(selfWindowCallback, this);
+	loadBorder(_selfWindow, "border_command.bmp", false);
+
+	// Exits Window
+	_exitsWindow = _wm.addWindow(false, true, true);
+	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
+	_exitsWindow->setActive(false);
+	_exitsWindow->setCallback(exitsWindowCallback, this);
+	loadBorder(_exitsWindow, "border_command.bmp", false);
+
+	// Diploma Window
+	_diplomaWindow = _wm.addWindow(false, true, true);
+	_diplomaWindow->setDimensions(getWindowData(kDiplomaWindow).bounds);
+	_diplomaWindow->setActive(false);
+	_diplomaWindow->setCallback(diplomaWindowCallback, this);
+	loadBorder(_diplomaWindow, "border_command.bmp", false);
+	// Render invisible for now
+	_diplomaWindow->getSurface()->fillRect(_diplomaWindow->getSurface()->getBounds(), kColorGreen2);
+
+	// Inventory Window
+	_inventoryWindow = _wm.addWindow(false, true, true);
+	_inventoryWindow->setDimensions(getWindowData(kInventoryWindow).bounds);
+	_inventoryWindow->setActive(false);
+	_inventoryWindow->setCallback(inventoryWindowCallback, this);
+	loadBorder(_inventoryWindow, "border_command.bmp", false);
+
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -265,12 +326,28 @@ bool Gui::loadWindows() {
 			data.title[data.titleLength] = '\0';
 		}
 
+		debug(5, "Window loaded: %s", data.title);
+
 		_windowData->push_back(data);
 	}
 
+	loadInventoryWindow();
+
 	return true;
 }
 
+void Gui::loadInventoryWindow() {
+	WindowData data;
+	data.bounds = Common::Rect(5, 30, 125, 190);
+	data.title = "Inventory";
+	data.visible = true;
+	data.hasCloseBox = false;
+	data.refcon = kInventoryWindow;
+	data.titleLength = 10;
+
+	_windowData->push_back(data);
+}
+
 bool Gui::loadControls() {
 	Common::MacResIDArray resArray;
 	Common::SeekableReadStream *res;
@@ -344,14 +421,45 @@ void Gui::drawCommandsWindow() {
 
 
 /* CALLBACKS */
+
+bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processCommandEvents(click, event);
+}
+
+bool mainGameWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return true;
+}
+
 bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	return true;
 }
 
-bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+bool selfWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return g->processCommandEvents(click, event);
+	return true;
+}
+
+bool exitsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return true;
+}
+
+bool diplomaWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return true;
+}
+
+bool inventoryWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return true;
 }
 
 void menuCommandsCallback(int action, Common::String &text, void *data) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 9316f91..7ffe199 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -59,7 +59,8 @@ enum WindowReference {
 	kOutConsoleWindow = 0x82,
 	kSelfWindow = 0x83,
 	kExitsWindow = 0x84,
-	kDiplomaWindow = 0x85
+	kDiplomaWindow = 0x85,
+	kInventoryWindow = 0x90 // Not in the files, but here for convenience
 };
 
 enum MVWindowType {
@@ -148,6 +149,7 @@ private: // Attributes
 	Graphics::MacWindow *_selfWindow;
 	Graphics::MacWindow *_exitsWindow;
 	Graphics::MacWindow *_diplomaWindow;
+	Graphics::MacWindow *_inventoryWindow;
 	Graphics::Menu *_menu;
 
 private: // Methods
@@ -159,6 +161,9 @@ private: // Methods
 
 	// Loaders
 	bool loadMenus();
+	bool loadWindows();
+	void loadInventoryWindow();
+	bool loadControls();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
 	// Drawers


Commit: c676bb99237a1d2eeb9965aae4fe78503cea9b46
    https://github.com/scummvm/scummvm/commit/c676bb99237a1d2eeb9965aae4fe78503cea9b46
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:23:04+02:00

Commit Message:
MACVENTURE: Load general settings

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 1902127..6e2d7ed 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -37,6 +37,12 @@ enum {
 	kMaxMenuTitleLength = 30
 };
 
+enum {
+	kGlobalSettingsID = 0x80,
+	kDiplomaGeometryID = 0x81,
+	kTextHuffmanTableID = 0x83
+};
+
 MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) {
 	_gameDescription = gameDesc;
 	_rnd = new Common::RandomSource("macventure");
@@ -65,13 +71,13 @@ Common::Error MacVentureEngine::run() {
 	// Additional setup.
 	debug("MacVentureEngine::init");
 
-	// Your main even loop should be (invoked from) here.
-	debug("MacVentureEngine::go: Hello, World!");
-
 	_resourceManager = new Common::MacResManager();
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());
 
+	if (!loadGlobalSettings())
+		error("Could not load the engine settings");
+
 	_gui = new Gui(this, _resourceManager);
 
 	_shouldQuit = false;
@@ -87,6 +93,51 @@ Common::Error MacVentureEngine::run() {
 	return Common::kNoError;
 }
 
+bool MacVentureEngine::loadGlobalSettings() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('G', 'N', 'R', 'L'))).size() == 0)
+		return false;
+
+	res = _resourceManager->getResource(MKTAG('G', 'N', 'R', 'L'), kGlobalSettingsID);
+	if (res) {
+		_globalSettings.numObjects = res->readUint16BE();
+		_globalSettings.numGlobals = res->readUint16BE();
+		_globalSettings.numCommands = res->readUint16BE();
+		_globalSettings.numAttributes = res->readUint16BE();
+		_globalSettings.numGroups = res->readUint16BE();
+		res->readUint16BE(); // unknown
+		_globalSettings.invTop = res->readUint16BE();
+		_globalSettings.invLeft = res->readUint16BE();
+		_globalSettings.invWidth = res->readUint16BE();
+		_globalSettings.invHeight = res->readUint16BE();
+		_globalSettings.invOffsetY = res->readUint16BE();
+		_globalSettings.invOffsetX = res->readSint16BE();
+		_globalSettings.defaultFont = res->readUint16BE();
+		_globalSettings.defaultSize = res->readUint16BE();
+
+		_globalSettings.attrIndices = new uint8[_globalSettings.numAttributes];
+		res->read(_globalSettings.attrIndices, _globalSettings.numAttributes);
+
+		_globalSettings.attrMasks = new uint16[_globalSettings.numAttributes];
+		for (int i = 0; i < _globalSettings.numAttributes; i++)
+			_globalSettings.attrMasks[i] = res->readUint16BE();
+
+		_globalSettings.attrShifts = new uint8[_globalSettings.numAttributes];
+		res->read(_globalSettings.attrShifts, _globalSettings.numAttributes);
+
+		_globalSettings.cmdArgCnts = new uint8[_globalSettings.numCommands];
+		res->read(_globalSettings.cmdArgCnts, _globalSettings.numCommands);
+
+
+
+		return true;
+	}
+
+	return false;
+}
+
 void MacVentureEngine::requestQuit() {
 	_shouldQuit = true;
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index b8d065b..ffc1c2a 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -50,6 +50,27 @@ enum {
 	// the current limitation is 32 debug levels (1 << 31 is the last one)
 };
 
+struct GlobalSettings {
+	uint16 numObjects;    // number of game objects defined
+	uint16 numGlobals;    // number of globals defined
+	uint16 numCommands;   // number of commands defined
+	uint16 numAttributes; // number of attributes
+	uint16 numGroups;     // number of object groups
+	uint16 invTop;        // inventory window bounds
+	uint16 invLeft;
+	uint16 invHeight;
+	uint16 invWidth;
+	uint16 invOffsetY;    // positioning offset for
+	uint16 invOffsetX;    // new inventory windows
+	uint16 defaultFont;   // default font
+	uint16 defaultSize;   // default font size
+	uint8  *attrIndices; // attribute indices into attribute table
+	uint16 *attrMasks;   // attribute masks
+	uint8  *attrShifts;  // attribute bit shifts
+	uint8  *cmdArgCnts;  // command argument counts
+	uint8  *commands;    // command buttons
+};
+
 class MacVentureEngine : public Engine {
 
 public:
@@ -61,6 +82,9 @@ public:
 	void requestQuit();
 	void requestUnpause();
 
+	// Data loading
+	bool loadGlobalSettings();
+
 	// Data retrieval
 	bool isPaused();
 	Common::String getCommandsPausedString();
@@ -76,10 +100,12 @@ private: // Attributes
 	Common::MacResManager *_resourceManager;
 
 	Console *_debugger;
-
 	Gui *_gui;
 
+	// Engine state
+	GlobalSettings _globalSettings;
 	bool _shouldQuit;
+	bool _paused;
 
 private: // Methods
 


Commit: 5368aa979bca198c9337410cd5908c151052f2b6
    https://github.com/scummvm/scummvm/commit/5368aa979bca198c9337410cd5908c151052f2b6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:23:35+02:00

Commit Message:
MACVENTURE: Change inventory to use the general settings

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 3aac7e1..7b6c7e3 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -338,7 +338,12 @@ bool Gui::loadWindows() {
 
 void Gui::loadInventoryWindow() {
 	WindowData data;
-	data.bounds = Common::Rect(5, 30, 125, 190);
+	GlobalSettings settings = _engine->getGlobalSettings();
+	data.bounds = Common::Rect(
+		settings.invLeft, 
+		settings.invTop, 
+		settings.invLeft + settings.invWidth, 
+		settings.invTop + settings.invHeight);
 	data.title = "Inventory";
 	data.visible = true;
 	data.hasCloseBox = false;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6e2d7ed..5827ecc 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -93,6 +93,47 @@ Common::Error MacVentureEngine::run() {
 	return Common::kNoError;
 }
 
+void MacVentureEngine::requestQuit() {
+	_shouldQuit = true;
+}
+
+void MacVentureEngine::requestUnpause() {
+	_paused = false;
+}
+
+const GlobalSettings& MacVentureEngine::getGlobalSettings() {
+	return _globalSettings;
+}
+
+// Data retrieval
+
+bool MacVentureEngine::isPaused() {
+	return _paused;
+}
+
+Common::String MacVentureEngine::getCommandsPausedString() {
+	return Common::String("Click to continue");
+}
+
+void MacVentureEngine::processEvents() {
+	Common::Event event;
+
+	while (_eventMan->pollEvent(event)) {
+		if (_gui->processEvent(event))
+			continue;
+
+		switch (event.type) {
+		case Common::EVENT_QUIT:
+			_shouldQuit = true;
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+// Data loading
+
 bool MacVentureEngine::loadGlobalSettings() {
 	Common::MacResIDArray resArray;
 	Common::SeekableReadStream *res;
@@ -130,7 +171,8 @@ bool MacVentureEngine::loadGlobalSettings() {
 		_globalSettings.cmdArgCnts = new uint8[_globalSettings.numCommands];
 		res->read(_globalSettings.cmdArgCnts, _globalSettings.numCommands);
 
-
+		_globalSettings.commands = new uint8[_globalSettings.numCommands];
+		res->read(_globalSettings.commands, _globalSettings.numCommands);
 
 		return true;
 	}
@@ -138,40 +180,5 @@ bool MacVentureEngine::loadGlobalSettings() {
 	return false;
 }
 
-void MacVentureEngine::requestQuit() {
-	_shouldQuit = true;
-}
-
-void MacVentureEngine::requestUnpause() {
-	_paused = false;
-}
-
-// Data retrieval
-
-bool MacVentureEngine::isPaused() {
-	return _paused;
-}
-
-Common::String MacVentureEngine::getCommandsPausedString() {
-	return Common::String("Click to continue");
-}
-
-void MacVentureEngine::processEvents() {
-	Common::Event event;
-
-	while (_eventMan->pollEvent(event)) {
-		if (_gui->processEvent(event))
-			continue;
-
-		switch (event.type) {
-		case Common::EVENT_QUIT:
-			_shouldQuit = true;
-			break;
-		default:
-			break;
-		}
-	}
-}
-
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index ffc1c2a..da1f66a 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -82,16 +82,17 @@ public:
 	void requestQuit();
 	void requestUnpause();
 
-	// Data loading
-	bool loadGlobalSettings();
-
 	// Data retrieval
 	bool isPaused();
 	Common::String getCommandsPausedString();
+	const GlobalSettings& getGlobalSettings();
 
 private:
 	void processEvents();
 
+	// Data loading
+	bool loadGlobalSettings();
+
 private: // Attributes
 
 	const ADGameDescription *_gameDescription;


Commit: d43523010b71b24dd29dafae3f965695e9d920d7
    https://github.com/scummvm/scummvm/commit/d43523010b71b24dd29dafae3f965695e9d920d7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:23:37+02:00

Commit Message:
MACVENTURE: Add callbacks for all windows

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 7b6c7e3..3a19d6c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -429,6 +429,7 @@ void Gui::drawCommandsWindow() {
 
 bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
+	
 
 	return g->processCommandEvents(click, event);
 }
@@ -436,29 +437,31 @@ bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, v
 bool mainGameWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return true;
+	return g->processMainGameEvents(click, event);
 }
 
 bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	return true;
+	Gui *g = (Gui*)gui;
+
+	return g->processOutConsoleEvents(click, event);
 }
 
 bool selfWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return true;
+	return g->processSelfEvents(click, event);
 }
 
 bool exitsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return true;
+	return g->processExitsEvents(click, event);
 }
 
 bool diplomaWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return true;
+	return g->processDiplomaEvents(click, event);
 }
 
 bool inventoryWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
@@ -544,6 +547,30 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	return false;
 }
 
+bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & event) {
+	debug(6, "Processing event in Main Game Window");
+	return getWindowData(kMainGameWindow).visible;
+}
+bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
+	debug(6, "Processing event in Out Console Window");
+	return getWindowData(kOutConsoleWindow).visible;
+}
+
+bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event) {
+	debug(6, "Processing event in Self Window");
+	return getWindowData(kSelfWindow).visible;
+}
+
+bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & event) {
+	debug(6, "Processing event in Exits Window");
+	return getWindowData(kExitsWindow).visible;
+}
+
+bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & event) {
+	debug(6, "Processing event in Diploma Window");
+	return getWindowData(kDiplomaWindow).visible;
+}
+
 /* Ugly switches */
 
 uint16 Gui::borderThickness(MVWindowType type) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 7ffe199..a1c31ee 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -123,7 +123,14 @@ public:
 	void draw();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
+
+	// Event processors
 	bool processCommandEvents(WindowClick click, Common::Event &event);
+	bool processMainGameEvents(WindowClick click, Common::Event &event);
+	bool processOutConsoleEvents(WindowClick click, Common::Event &event);
+	bool processSelfEvents(WindowClick click, Common::Event &event);
+	bool processExitsEvents(WindowClick click, Common::Event &event);
+	bool processDiplomaEvents(WindowClick click, Common::Event &event);
 
 	const WindowData& getWindowData(WindowReference reference);
 


Commit: 88e6f9257e14b08ea15f24b60823aaa969502ad3
    https://github.com/scummvm/scummvm/commit/88e6f9257e14b08ea15f24b60823aaa969502ad3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:20+02:00

Commit Message:
MACVENTURE: Add appropriate border bounding boxes

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 3a19d6c..849dca5 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -177,9 +177,11 @@ void Gui::initWindows() {
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_command.bmp", false);
+	loadBorder(_exitsWindow, "border_title_inac.bmp", false);
+	loadBorder(_exitsWindow, "border_title_inac.bmp", true);
 
-	// Diploma Window
+	// Diploma Window (we can go without it for now)
+	/*
 	_diplomaWindow = _wm.addWindow(false, true, true);
 	_diplomaWindow->setDimensions(getWindowData(kDiplomaWindow).bounds);
 	_diplomaWindow->setActive(false);
@@ -187,6 +189,7 @@ void Gui::initWindows() {
 	loadBorder(_diplomaWindow, "border_command.bmp", false);
 	// Render invisible for now
 	_diplomaWindow->getSurface()->fillRect(_diplomaWindow->getSurface()->getBounds(), kColorGreen2);
+	*/
 
 	// Inventory Window
 	_inventoryWindow = _wm.addWindow(false, true, true);
@@ -311,10 +314,10 @@ bool Gui::loadWindows() {
 		right = res->readUint16BE();
 		data.type = (MVWindowType)res->readUint16BE();
 		data.bounds = Common::Rect(
-			left - borderThickness(data.type),
-			top - borderThickness(data.type),
-			right + borderThickness(data.type) * 2,
-			bottom + borderThickness(data.type) * 2);
+			left - borderBounds(data.type).leftOffset,
+			top - borderBounds(data.type).topOffset,
+			right + borderBounds(data.type).rightOffset * 2,
+			bottom + borderBounds(data.type).bottomOffset * 2);
 		data.visible = res->readUint16BE();
 		data.hasCloseBox = res->readUint16BE();
 		data.refcon = (WindowReference)id; id++;
@@ -340,9 +343,9 @@ void Gui::loadInventoryWindow() {
 	WindowData data;
 	GlobalSettings settings = _engine->getGlobalSettings();
 	data.bounds = Common::Rect(
-		settings.invLeft, 
-		settings.invTop, 
-		settings.invLeft + settings.invWidth, 
+		settings.invLeft,
+		settings.invTop,
+		settings.invLeft + settings.invWidth,
 		settings.invTop + settings.invHeight);
 	data.title = "Inventory";
 	data.visible = true;
@@ -363,7 +366,7 @@ bool Gui::loadControls() {
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('C', 'N', 'T', 'L'))).size() == 0)
 		return false;
 
-	uint16 commandsBorder = borderThickness(kPlainDBox);
+	uint16 commandsBorder = borderBounds(kPlainDBox).topOffset;
 	uint32 id = kControlExitBox;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('C', 'N', 'T', 'L'), *iter);
@@ -403,7 +406,7 @@ void Gui::drawCommandsWindow() {
 	if (_engine->isPaused()) {
 		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
 		WindowData data = getWindowData(kCommandsWindow);
-		uint16 border = borderThickness(data.type);
+		uint16 border = borderBounds(data.type).topOffset;
 		srf->fillRect(Common::Rect(border * 2, border * 2, srf->w - (border * 3), srf->h - (border * 3)), kColorWhite);
 		getCurrentFont().drawString(
 			srf,
@@ -429,7 +432,7 @@ void Gui::drawCommandsWindow() {
 
 bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
-	
+
 
 	return g->processCommandEvents(click, event);
 }
@@ -573,28 +576,28 @@ bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & ev
 
 /* Ugly switches */
 
-uint16 Gui::borderThickness(MVWindowType type) {
+BorderBounds Gui::borderBounds(MVWindowType type) {
 	switch (type) {
 	case MacVenture::kDocument:
 		break;
 	case MacVenture::kDBox:
 		break;
 	case MacVenture::kPlainDBox:
-		return 6;
+		return BorderBounds(6, 6, 6, 6);
 	case MacVenture::kAltBox:
 		break;
 	case MacVenture::kNoGrowDoc:
-		break;
+		return BorderBounds(1, 17, 1, 1);
 	case MacVenture::kMovableDBox:
 		break;
 	case MacVenture::kZoomDoc:
-		break;
+		return BorderBounds(1, 19, 16, 1);
 	case MacVenture::kZoomNoGrow:
 		break;
 	case MacVenture::kRDoc16:
 		break;
 	case MacVenture::kRDoc4:
-		break;
+		return BorderBounds(1, 19, 1, 1);
 	case MacVenture::kRDoc6:
 		break;
 	case MacVenture::kRDoc10:
@@ -603,7 +606,7 @@ uint16 Gui::borderThickness(MVWindowType type) {
 		break;
 	}
 
-	return 0;
+	return BorderBounds(0, 0, 0, 0);
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index a1c31ee..a8dc7a7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -113,6 +113,15 @@ struct ControlData {
 	uint16 border;
 };
 
+struct BorderBounds {
+	uint16 leftOffset;
+	uint16 topOffset;
+	uint16 rightOffset;
+	uint16 bottomOffset;
+
+	BorderBounds(uint16 l, uint16 t, uint16 r, uint16 b) : leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
+};
+
 
 class Gui {
 
@@ -137,7 +146,7 @@ public:
 	const Graphics::Font& getCurrentFont();
 
 	// Ugly switches
-	uint16 borderThickness(MVWindowType type);
+	BorderBounds borderBounds(MVWindowType type);
 
 private: // Attributes
 


Commit: 9564866ec360dbab39973a5b982b748f6c060637
    https://github.com/scummvm/scummvm/commit/9564866ec360dbab39973a5b982b748f6c060637
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:56+02:00

Commit Message:
MACVENTURE: Add image to self window

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 849dca5..3aa9c5d 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -89,8 +89,7 @@ Gui::~Gui() {
 }
 
 void Gui::draw() {
-
-	drawCommandsWindow();
+	drawWindows();
 
 	_wm.draw();
 }
@@ -170,7 +169,8 @@ void Gui::initWindows() {
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_command.bmp", false);
+	loadBorder(_selfWindow, "border_self_inac.bmp", false);
+	loadBorder(_selfWindow, "border_self_act.bmp", true);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
@@ -402,6 +402,14 @@ bool Gui::loadControls() {
 	return true;
 }
 
+void Gui::drawWindows() {
+
+	drawCommandsWindow();
+	drawMainGameWindow();
+
+	drawSelfWindow();
+}
+
 void Gui::drawCommandsWindow() {
 	if (_engine->isPaused()) {
 		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
@@ -427,6 +435,30 @@ void Gui::drawCommandsWindow() {
 	}
 }
 
+void Gui::drawMainGameWindow() {
+	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
+	BorderBounds border = borderBounds(getWindowData(kMainGameWindow).type);
+	srf->fillRect(
+		Common::Rect(
+			border.leftOffset * 2,
+			border.topOffset * 2,
+			srf->w - (border.rightOffset * 3),
+			srf->h - (border.bottomOffset * 3)),
+		kColorWhite);
+	getCurrentFont().drawString(
+		srf,
+		Common::String("Main Game Window"),
+		0,
+		(srf->h / 2) - getCurrentFont().getFontHeight(),
+		srf->w,
+		kColorBlack,
+		Graphics::kTextAlignCenter);
+}
+
+void Gui::drawSelfWindow() {
+
+}
+
 
 /* CALLBACKS */
 
@@ -585,6 +617,7 @@ BorderBounds Gui::borderBounds(MVWindowType type) {
 	case MacVenture::kPlainDBox:
 		return BorderBounds(6, 6, 6, 6);
 	case MacVenture::kAltBox:
+		//return BorderBounds(8, 9, 11, 10); // For now, I'll stick to the original bmp, it's gorgeous
 		break;
 	case MacVenture::kNoGrowDoc:
 		return BorderBounds(1, 17, 1, 1);
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index a8dc7a7..1eba4d2 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -183,7 +183,10 @@ private: // Methods
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
 	// Drawers
+	void drawWindows();
 	void drawCommandsWindow();
+	void drawMainGameWindow();
+	void drawSelfWindow();
 
 };
 


Commit: 5719ea30760c85113b4536f7b70295422e95ae9e
    https://github.com/scummvm/scummvm/commit/5719ea30760c85113b4536f7b70295422e95ae9e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Add save game loading

Changed paths:
  A engines/macventure/object.cpp
  A engines/macventure/object.h
  A engines/macventure/world.cpp
  A engines/macventure/world.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 5827ecc..92ae709 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -37,12 +37,6 @@ enum {
 	kMaxMenuTitleLength = 30
 };
 
-enum {
-	kGlobalSettingsID = 0x80,
-	kDiplomaGeometryID = 0x81,
-	kTextHuffmanTableID = 0x83
-};
-
 MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) {
 	_gameDescription = gameDesc;
 	_rnd = new Common::RandomSource("macventure");
@@ -79,6 +73,7 @@ Common::Error MacVentureEngine::run() {
 		error("Could not load the engine settings");
 
 	_gui = new Gui(this, _resourceManager);
+	_world = new World(this, _resourceManager);
 
 	_shouldQuit = false;
 	while (!_shouldQuit) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index da1f66a..3a20bbe 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -31,12 +31,14 @@
 #include "gui/debugger.h"
 
 #include "macventure/gui.h"
+#include "macventure/world.h"
 
 struct ADGameDescription;
 
 namespace MacVenture {
 
 class Console;
+class World;
 
 enum {
 	kScreenWidth = 512,
@@ -50,6 +52,19 @@ enum {
 	// the current limitation is 32 debug levels (1 << 31 is the last one)
 };
 
+enum {
+	kGlobalSettingsID = 0x80,
+	kDiplomaGeometryID = 0x81,
+	kTextHuffmanTableID = 0x83
+};
+
+enum {
+	kSaveGameStrID = 0x82,
+	kDiplomaFilenameID = 0x83,
+	kClickToContinueTextID = 0x84,
+	kStartGameFilenameID = 0x85
+};
+
 struct GlobalSettings {
 	uint16 numObjects;    // number of game objects defined
 	uint16 numGlobals;    // number of globals defined
@@ -102,6 +117,7 @@ private: // Attributes
 
 	Console *_debugger;
 	Gui *_gui;
+	World *_world;
 
 	// Engine state
 	GlobalSettings _globalSettings;
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 3f11d15..2fac1b5 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -3,7 +3,9 @@ MODULE := engines/macventure
 MODULE_OBJS := \
 	detection.o \
 	gui.o \
-	macventure.o
+	object.o \
+	macventure.o \
+	world.o \
 
 MODULE_DIRS += \
 	engines/macventure
diff --git a/engines/macventure/object.cpp b/engines/macventure/object.cpp
new file mode 100644
index 0000000..18a734c
--- /dev/null
+++ b/engines/macventure/object.cpp
@@ -0,0 +1,30 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/object.h"
+
+namespace MacVenture {
+
+Object::Object() {}
+Object::~Object() {}
+
+} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/object.h b/engines/macventure/object.h
new file mode 100644
index 0000000..ebd64ad
--- /dev/null
+++ b/engines/macventure/object.h
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_OBJECT_H
+#define MACVENTURE_OBJECT_H
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+struct ContainerHeader {
+	uint32 header;
+};
+
+struct ObjectGroup {
+	uint32 bitOffset; // Actually uint24, but we don't have that
+	uint32 offset;
+};
+
+struct ContainerSubHeader {
+	uint16 numObjects;
+	uint16 *huff;
+	uint8 *lengths;
+	ObjectGroup *groups;
+};
+
+class Object {
+public:
+	Object();
+	~Object();
+};
+
+} // End of namespace MacVenture
+
+#endif
\ No newline at end of file
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
new file mode 100644
index 0000000..223541d
--- /dev/null
+++ b/engines/macventure/world.cpp
@@ -0,0 +1,98 @@
+#include "macventure/world.h"
+
+#include "common/file.h"
+
+namespace MacVenture {
+
+World::World(MacVentureEngine *engine, Common::MacResManager *resMan) {
+	_resourceManager = resMan;	
+	_engine = engine;
+
+	if (!loadStartGameFileName())
+		error("Could not load initial game configuration");
+
+	Common::File saveGameFile;
+	if (!saveGameFile.open(_startGameFileName)) 
+		error("Could not load initial game configuration");
+
+	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
+
+	_saveGame = new SaveGame(_engine, saveGameRes);
+
+	delete saveGameRes;
+	saveGameFile.close();		
+}
+
+
+World::~World()	{
+	
+	if (_saveGame)
+		delete _saveGame;
+}
+
+bool World::loadStartGameFileName() {
+	Common::SeekableReadStream *res;
+
+	res = _resourceManager->getResource(MKTAG('S', 'T', 'R', ' '), kStartGameFilenameID);
+	if (!res)
+		return false;
+
+	byte length = res->readByte();
+	char *fileName = new char[length + 1];
+	res->read(fileName, length);
+	fileName[length] = '\0';
+	_startGameFileName = Common::String(fileName, length);
+	_startGameFileName.replace(_startGameFileName.end(), _startGameFileName.end(), ".TXT");
+
+	return true;
+}
+
+// SaveGame
+SaveGame::SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res) {
+	_groups = Common::Array<AttributeGroup>();
+	loadGroups(engine, res);
+	_globals = Common::Array<uint16>();
+	loadGlobals(engine, res);
+	_text = Common::String();
+	loadText(engine, res);
+}
+
+SaveGame::~SaveGame() {
+}
+
+const Common::Array<AttributeGroup>& MacVenture::SaveGame::getGroups() {
+	return _groups;
+}
+
+const Common::Array<uint16>& MacVenture::SaveGame::getGlobals() {
+	return _globals;
+}
+
+const Common::String & MacVenture::SaveGame::getText() {
+	return _text;
+}
+
+void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+	GlobalSettings settings = engine->getGlobalSettings();
+	for (int i = 0; i < settings.numGroups; ++i) {
+		AttributeGroup g;
+		for (int j = 0; j < settings.numObjects; ++j) 
+			g.push_back(res->readUint16BE());
+		
+		_groups.push_back(g);
+	}
+}
+
+void SaveGame::loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+	GlobalSettings settings = engine->getGlobalSettings();
+	for (int i = 0; i < settings.numGlobals; ++i) {
+		_globals.push_back(res->readUint16BE());
+	}
+}
+
+void SaveGame::loadText(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+	_text = "Placeholder Console Text";
+}
+
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
new file mode 100644
index 0000000..0a7eb25
--- /dev/null
+++ b/engines/macventure/world.h
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_WORLD_H
+#define MACVENTURE_WORLD_H
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+typedef Common::Array<uint16> AttributeGroup;
+
+class SaveGame {
+public:
+	SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res);
+	~SaveGame();
+
+	const Common::Array<AttributeGroup> &getGroups();
+	const Common::Array<uint16> &getGlobals();
+	const Common::String &getText();
+
+private:
+	void loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *res);
+	void loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream *res);
+	void loadText(MacVentureEngine *engine, Common::SeekableReadStream *res);
+
+private:
+	Common::Array<AttributeGroup> _groups;
+	Common::Array<uint16> _globals;
+	Common::String _text;
+};
+
+class World {
+public:
+	World(MacVentureEngine *engine, Common::MacResManager *resMan);
+	~World();
+
+private:
+	bool loadStartGameFileName();
+
+private:
+	MacVentureEngine *_engine;
+	Common::MacResManager *_resourceManager;
+
+	Common::String _startGameFileName;	
+
+	SaveGame *_saveGame;
+
+};
+
+} // End of namespace MacVenture
+
+#endif
+


Commit: b3be60273fdaf88470798230810393f5806dd69a
    https://github.com/scummvm/scummvm/commit/b3be60273fdaf88470798230810393f5806dd69a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Add generic container

Changed paths:
  A engines/macventure/container.h
    engines/macventure/object.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
new file mode 100644
index 0000000..fc35073
--- /dev/null
+++ b/engines/macventure/container.h
@@ -0,0 +1,203 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_CONTAINER_H
+#define MACVENTURE_CONTAINER_H
+
+#include "macventure/macventure.h"
+
+#include "common/file.h"
+
+namespace MacVenture {
+
+
+struct ItemGroup {
+	uint32 bitOffset; //It's really uint24
+	uint32 offset; //It's really uint24
+	uint32 lengths[64];
+};
+
+typedef uint32 ContainerHeader;
+
+template <class T>
+class Container {	
+
+public:
+	Container(char *filename) {
+		if (!_file.open(filename))
+			error("Could not open %s", filename);
+
+		_res = _file.readStream(_file.size());
+		_header = _res->readUint32BE();
+		
+		if (!(_header & 0x80000000)) { 
+			// Is simplified container
+			int dataLen = _res->size() - sizeof(_header);
+			_lenObjs = _header;
+			_numObjs = dataLen / _lenObjs;
+		}
+		else {
+			ContainerHeader subHead = _header & 0x7fffffff;
+			_res->seek(subHead, SEEK_SET);
+			_numObjs = _res->readUint16BE();
+
+			for (int i = 0; i < 15; ++i)
+				_huff[i] = _res->readUint16BE();
+
+			for (int i = 0; i < 16; ++i)
+				_lens[i] = _res->readByte();
+
+			ItemGroup group;
+			for (int i = 0; i < _numObjs; ++i) {	
+				uint32 bits;
+				if ((i & 0x37) == 0) { // It's the start of a group					
+					// Place myself in the correct position to read group
+					_res->seek(subHead + (i >> 6) * 6 + 0x30, SEEK_SET);
+					_res->read(&bits, 3);
+					bits >>= 4;
+					_res->read(&group.offset, 3); // Read 3 bytes
+					group.offset >>= 4;
+					bits &= 7;
+					group.bitOffset = bits;
+					_res->seek(subHead + (bits >> 3), SEEK_SET);
+				}	
+
+				// Workaround to implement peek
+				// Read the value in 32 bits
+				uint32 v = (_res->readUint32BE() >> (16 - bits)) & 0xffff;
+				// Go back
+				_res->seek(-4, SEEK_CUR); 
+
+				// Look in the Huffman table
+				int x;
+				for (x = 0; x<16; x++)
+					if (_huff[x] > v) break;
+
+				// Bits that we need to read from the length table
+				uint8 bitsToRead = _lens[x];
+
+				bits += (bitsToRead & 0xf);
+				if (bits & 0x10) {
+					bits &= 0xf;
+					_res->seek(2, SEEK_CUR);
+				}
+
+				// We already have in bits the first 4 bits (97)
+				bitsToRead = bitsToRead >> 4;
+
+				// The actual length of the object
+				uint32 len = 0;
+				if (bitsToRead) {
+					// Peek 4 bytes
+					len = _res->readUint32BE();
+					_res->seek(-4, SEEK_CUR);
+
+					bitsToRead--;
+
+					if (bitsToRead == 0) len = 0;
+					else len >>= (32 - bitsToRead) - bits;
+
+					len &= (1 << bitsToRead) - 1;
+					len |= 1 << bitsToRead;
+
+					if (bits & 0x10) {
+						bits &= 0xf;
+						_res->seek(2, SEEK_CUR);
+					}
+
+				}
+
+				group.lengths[(i & 0x3f)] = len;
+
+				if ((i & 0x37) == 0) {
+					_groups.push_back(group);
+				}
+			}			 
+		}
+	}
+
+	~Container() {
+
+		if (_file.isOpen())
+			_file.close();
+
+		if (_res)
+			delete _res;
+	}
+
+public:
+	T getItem(uint32 id) {
+		T item;
+		if (!(_header & 0x80000000)) {
+			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
+			_res->read(&item, _lenObjs);
+		} else {
+			ContainerHeader subHead = _header & 0x7fffffff;
+			uint32 groupID = (id >> 6);
+			uint32 objectIndex = id & 0x3f; // Index within the group
+
+			_res->seek(subHead + (groupID * 6), SEEK_SET);
+
+			uint32 offset = 0;
+			for (int i = 0; i < objectIndex; i++) {
+				offset += _groups[groupID].lengths[i];
+			}
+
+			_res->seek(offset, SEEK_CUR);
+
+			_res->read(&item, _groups[groupID].lengths[objectIndex]);
+		}
+		return item;
+	}
+
+protected:
+	
+	uint _lenObjs;
+	uint _numObjs;
+
+	ContainerHeader _header;
+	
+	uint16 _huff[15];   // huffman masks
+	uint8  _lens[16];   // huffman lengths
+	Common::Array<ItemGroup> _groups;
+
+	Common::File _file;
+	Common::SeekableReadStream *_res;
+
+};
+
+/*
+template <typedef T>
+class PersistentContainer : public Container {
+public:
+	PersistentContainer(Common::String filename) :
+		Container(filename) {
+		// Load 
+	}
+
+private:
+
+};*/
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/object.h b/engines/macventure/object.h
index ebd64ad..1712ec6 100644
--- a/engines/macventure/object.h
+++ b/engines/macventure/object.h
@@ -27,22 +27,6 @@
 
 namespace MacVenture {
 
-struct ContainerHeader {
-	uint32 header;
-};
-
-struct ObjectGroup {
-	uint32 bitOffset; // Actually uint24, but we don't have that
-	uint32 offset;
-};
-
-struct ContainerSubHeader {
-	uint16 numObjects;
-	uint16 *huff;
-	uint8 *lengths;
-	ObjectGroup *groups;
-};
-
 class Object {
 public:
 	Object();
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 223541d..835d53a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -4,7 +4,7 @@
 
 namespace MacVenture {
 
-World::World(MacVentureEngine *engine, Common::MacResManager *resMan) {
+World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_resourceManager = resMan;	
 	_engine = engine;
 
@@ -19,6 +19,8 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan) {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
+	_objectConstants = new Container<uint16>("Shadowgate II/Shadow Object.TXT");
+
 	delete saveGameRes;
 	saveGameFile.close();		
 }
@@ -28,6 +30,9 @@ World::~World()	{
 	
 	if (_saveGame)
 		delete _saveGame;
+
+	if (_objectConstants)
+		delete _objectConstants;
 }
 
 bool World::loadStartGameFileName() {
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 0a7eb25..41f6ddc 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -24,6 +24,7 @@
 #define MACVENTURE_WORLD_H
 
 #include "macventure/macventure.h"
+#include "macventure/container.h"
 
 namespace MacVenture {
 
@@ -64,6 +65,7 @@ private:
 	Common::String _startGameFileName;	
 
 	SaveGame *_saveGame;
+	Container<uint16> *_objectConstants;
 
 };
 


Commit: 9fc9e3398186f1405ac36497f53fe9a95839c257
    https://github.com/scummvm/scummvm/commit/9fc9e3398186f1405ac36497f53fe9a95839c257
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Fix detection

Changed paths:
    engines/macventure/detection_tables.h



diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index 4667561..08093da 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -27,7 +27,7 @@ namespace MacVenture {
 #define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
 
 static const ADGameDescription gameDescriptions[] = {
-	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "054db22bdc6db3ccb89a23cd840f858e", 70528), // Zojoi Rerelease
+	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "dea09e16829b99278feb84c121066576", 70528), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture


Commit: 56e8ac873b05f68fc9dfa1aa09f136974c71d353
    https://github.com/scummvm/scummvm/commit/56e8ac873b05f68fc9dfa1aa09f136974c71d353
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Add generic non-persistent container loading

Changed paths:
    engines/macventure/container.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index fc35073..c2b558f 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -26,6 +26,7 @@
 #include "macventure/macventure.h"
 
 #include "common/file.h"
+#include "common/bitstream.h"
 
 namespace MacVenture {
 
@@ -56,8 +57,8 @@ public:
 			_numObjs = dataLen / _lenObjs;
 		}
 		else {
-			ContainerHeader subHead = _header & 0x7fffffff;
-			_res->seek(subHead, SEEK_SET);
+			_header &= 0x7fffffff;
+			_res->seek(_header, SEEK_SET);
 			_numObjs = _res->readUint16BE();
 
 			for (int i = 0; i < 15; ++i)
@@ -66,71 +67,50 @@ public:
 			for (int i = 0; i < 16; ++i)
 				_lens[i] = _res->readByte();
 
-			ItemGroup group;
-			for (int i = 0; i < _numObjs; ++i) {	
-				uint32 bits;
-				if ((i & 0x37) == 0) { // It's the start of a group					
-					// Place myself in the correct position to read group
-					_res->seek(subHead + (i >> 6) * 6 + 0x30, SEEK_SET);
-					_res->read(&bits, 3);
-					bits >>= 4;
-					_res->read(&group.offset, 3); // Read 3 bytes
-					group.offset >>= 4;
-					bits &= 7;
-					group.bitOffset = bits;
-					_res->seek(subHead + (bits >> 3), SEEK_SET);
-				}	
-
-				// Workaround to implement peek
-				// Read the value in 32 bits
-				uint32 v = (_res->readUint32BE() >> (16 - bits)) & 0xffff;
-				// Go back
-				_res->seek(-4, SEEK_CUR); 
-
-				// Look in the Huffman table
-				int x;
-				for (x = 0; x<16; x++)
-					if (_huff[x] > v) break;
-
-				// Bits that we need to read from the length table
-				uint8 bitsToRead = _lens[x];
-
-				bits += (bitsToRead & 0xf);
-				if (bits & 0x10) {
-					bits &= 0xf;
-					_res->seek(2, SEEK_CUR);
-				}
-
-				// We already have in bits the first 4 bits (97)
-				bitsToRead = bitsToRead >> 4;
-
-				// The actual length of the object
-				uint32 len = 0;
-				if (bitsToRead) {
-					// Peek 4 bytes
-					len = _res->readUint32BE();
-					_res->seek(-4, SEEK_CUR);
-
-					bitsToRead--;
-
-					if (bitsToRead == 0) len = 0;
-					else len >>= (32 - bitsToRead) - bits;
-
-					len &= (1 << bitsToRead) - 1;
-					len |= 1 << bitsToRead;
-
-					if (bits & 0x10) {
-						bits &= 0xf;
-						_res->seek(2, SEEK_CUR);
-					}
-
-				}
-
-				group.lengths[(i & 0x3f)] = len;
-
-				if ((i & 0x37) == 0) {
-					_groups.push_back(group);
+			// Read groups
+			uint numGroups = _numObjs / 64;
+			if ((_numObjs % 64) > 0)
+				numGroups++;
+
+			for (uint i = 0; i < numGroups; ++i) {
+				ItemGroup group;
+				
+				// Place myself in the correct position to read group
+				_res->seek(_header + (i * 6) + 0x30, SEEK_SET);
+				byte b1, b2, b3;
+				b1 = _res->readByte();
+				b2 = _res->readByte();
+				b3 = _res->readByte();
+				group.bitOffset = (b1 << 16) + (b2 << 8) + (b3 << 0);
+
+				b1 = _res->readByte();
+				b2 = _res->readByte();
+				b3 = _res->readByte();
+				group.offset = (b1 << 16) + (b2 << 8) + (b3 << 0);
+
+				// Place the bit reader in the correct position
+				// group.bitOffset indicates the offset from the start of the subHeader
+				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);				
+
+				Common::BitStream32BEMSB bitStream(_res);
+				// Skip the last 3 bits that we couldn't skip with seek
+				bitStream.skip(group.bitOffset & 7); 
+				for (uint j = 0; j < 64; ++j) {
+					uint32 length = 0;
+					uint32 mask = bitStream.peekBits(16);
+					// Look in the Huffman table
+					int x;
+					for (x = 0; x<16; x++)
+						if (_huff[x] > mask) break;
+					// OK UNTIL HERE
+					// There may be a bug from this point forward, as the 
+					// lengths do not seem to coincide
+					length = bitStream.getBits(_lens[x]);
+
+					group.lengths[j] = length;
 				}
+				
+				_groups.push_back(group);				
 			}			 
 		}
 	}
@@ -169,6 +149,19 @@ public:
 		return item;
 	}
 
+	/*
+	void seekBits(uint32 bitNum) {
+		uint bytes = bits / 8;
+		_remainderOffset = bits % 8;
+		_res->seek(bytes, SEEK_SET);
+	}
+
+	void readBits((void*)target, uint32 bitNum) {
+		// Skip the first _remainderOffset bits, read bitNum from that point
+		byte offset = 0xFF << _remainderOffset;
+		
+	}*/
+
 protected:
 	
 	uint _lenObjs;
@@ -183,6 +176,9 @@ protected:
 	Common::File _file;
 	Common::SeekableReadStream *_res;
 
+	// To be moved
+	//byte _remainderOffset;
+
 };
 
 /*
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 835d53a..dccf63a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -19,7 +19,7 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
-	_objectConstants = new Container<uint16>("Shadowgate II/Shadow Object.TXT");
+	_objectConstants = new Container<uint16>("Shadowgate II/Shadow Graphic");
 
 	delete saveGameRes;
 	saveGameFile.close();		
@@ -47,7 +47,7 @@ bool World::loadStartGameFileName() {
 	res->read(fileName, length);
 	fileName[length] = '\0';
 	_startGameFileName = Common::String(fileName, length);
-	_startGameFileName.replace(_startGameFileName.end(), _startGameFileName.end(), ".TXT");
+	_startGameFileName.replace(_startGameFileName.end(), _startGameFileName.end(), ".bin");
 
 	return true;
 }


Commit: b6a5040e35d93ae32ac892653c131a30c2123d6e
    https://github.com/scummvm/scummvm/commit/b6a5040e35d93ae32ac892653c131a30c2123d6e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Test and fix object loading

Changed paths:
    engines/macventure/container.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index c2b558f..a0028ee 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -39,7 +39,6 @@ struct ItemGroup {
 
 typedef uint32 ContainerHeader;
 
-template <class T>
 class Container {	
 
 public:
@@ -49,9 +48,11 @@ public:
 
 		_res = _file.readStream(_file.size());
 		_header = _res->readUint32BE();
+		_simplified = false;
 		
 		if (!(_header & 0x80000000)) { 
 			// Is simplified container
+			_simplified = true;
 			int dataLen = _res->size() - sizeof(_header);
 			_lenObjs = _header;
 			_numObjs = dataLen / _lenObjs;
@@ -90,24 +91,51 @@ public:
 
 				// Place the bit reader in the correct position
 				// group.bitOffset indicates the offset from the start of the subHeader
-				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);				
+				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);		
+				uint32 bits = group.bitOffset & 7;
 
-				Common::BitStream32BEMSB bitStream(_res);
-				// Skip the last 3 bits that we couldn't skip with seek
-				bitStream.skip(group.bitOffset & 7); 
-				for (uint j = 0; j < 64; ++j) {
+				for (uint j = 0; j < 64; ++j) {					
 					uint32 length = 0;
-					uint32 mask = bitStream.peekBits(16);
+					//debug("reading mask from address %x", _res->pos());
+					uint32 mask = _res->readUint32BE();
+					mask >>= (16 - bits);
+					mask &= 0xFFFF;
+					debug(11, "Load mask of object &%d:%d is %x", i, j, mask);
+					_res->seek(-4, SEEK_CUR);
 					// Look in the Huffman table
-					int x;
-					for (x = 0; x<16; x++)
+					int x = 0;
+					for (x = 0; x < 16; x++) {
 						if (_huff[x] > mask) break;
-					// OK UNTIL HERE
-					// There may be a bug from this point forward, as the 
-					// lengths do not seem to coincide
-					length = bitStream.getBits(_lens[x]);
+					}
+					
+					// I will opt to copy the code from webventure, 
+					// But according to the docs, this call should suffice:
+					// length = bitStream.getBits(_lens[x]);
+					// The problem is that _lens[] usually contains values larger
+					// Than 32, so we have to read them with the method below
+
+					//This code below, taken from the implementation, seems to give the same results.
+
+					uint32 bitSize = _lens[x];
+					bits += bitSize & 0xF;
+					if (bits & 0x10) {
+						bits &= 0xf;
+						_res->seek(2, SEEK_CUR);
+					}
+					bitSize >>= 4;
+					if (bitSize) {
+						length = _res->readUint32BE();
+						_res->seek(-4, SEEK_CUR);
+						bitSize--;
+						if (bitSize == 0) length = 0;
+						else length >>= (32 - bitSize) - bits;
+						length &= (1 << bitSize) - 1;
+						length |= 1 << bitSize;
+						bits += bitSize;						
+					}		
 
 					group.lengths[j] = length;
+					debug(11, "Load legth of object %d:%d is %d", i, j, length);
 				}
 				
 				_groups.push_back(group);				
@@ -125,11 +153,26 @@ public:
 	}
 
 public:
-	T getItem(uint32 id) {
-		T item;
-		if (!(_header & 0x80000000)) {
+	/**
+	* Must be called before retrieving an object.
+	*/
+	uint32 getItemByteSize(uint32 id) {
+		if (_simplified) {
+			return _lenObjs;
+		} else {
+			uint32 groupID = (id >> 6);
+			uint32 objectIndex = id & 0x3f; // Index within the group
+			return _groups[groupID].lengths[objectIndex];
+		}
+	}
+
+	/**
+	* Assumes storage is initialized.
+	*/
+	void getItem(uint32 id, void* storage) {		
+		if (_simplified) {
 			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
-			_res->read(&item, _lenObjs);
+			_res->read(storage, _lenObjs);
 		} else {
 			ContainerHeader subHead = _header & 0x7fffffff;
 			uint32 groupID = (id >> 6);
@@ -144,27 +187,15 @@ public:
 
 			_res->seek(offset, SEEK_CUR);
 
-			_res->read(&item, _groups[groupID].lengths[objectIndex]);
+			_res->read(storage, _groups[groupID].lengths[objectIndex]);
 		}
-		return item;
 	}
-
-	/*
-	void seekBits(uint32 bitNum) {
-		uint bytes = bits / 8;
-		_remainderOffset = bits % 8;
-		_res->seek(bytes, SEEK_SET);
-	}
-
-	void readBits((void*)target, uint32 bitNum) {
-		// Skip the first _remainderOffset bits, read bitNum from that point
-		byte offset = 0xFF << _remainderOffset;
-		
-	}*/
-
+	
 protected:
+
+	bool _simplified;
 	
-	uint _lenObjs;
+	uint _lenObjs; // In the case of simple container, lenght of an object
 	uint _numObjs;
 
 	ContainerHeader _header;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index dccf63a..68faa0a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -19,7 +19,11 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
-	_objectConstants = new Container<uint16>("Shadowgate II/Shadow Graphic");
+	_objectConstants = new Container("Shadowgate II/Shadow Graphic");
+
+	uint32 size = _objectConstants->getItemByteSize(2);
+	char * ob1 = new char[size];
+	_objectConstants->getItem(2, ob1);
 
 	delete saveGameRes;
 	saveGameFile.close();		
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 41f6ddc..38eb4bb 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -65,7 +65,7 @@ private:
 	Common::String _startGameFileName;	
 
 	SaveGame *_saveGame;
-	Container<uint16> *_objectConstants;
+	Container *_objectConstants;
 
 };
 


Commit: 22db262d57b919a73dea71a353951cc9b0d63d53
    https://github.com/scummvm/scummvm/commit/22db262d57b919a73dea71a353951cc9b0d63d53
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:58+02:00

Commit Message:
MACVENTURE: Add string tables

Changed paths:
  A engines/macventure/stringtable.h



diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
new file mode 100644
index 0000000..87ec977
--- /dev/null
+++ b/engines/macventure/stringtable.h
@@ -0,0 +1,99 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_STRINGTABLE_H
+#define MACVENTURE_STRINGTABLE_H
+
+#include "macventure/macventure.h"
+
+#include "common/file.h"
+
+namespace MacVenture {
+
+enum StringTableID {
+	kErrorStringTableID = 0x80,
+	kFilenamesStringTableID = 0x81,
+	kCommonArticlesStringTableID = 0x82,
+	kNamingArticlesStringTableID = 0x83,
+	kIndirectArticlesStringTableID = 0x84
+};
+
+class StringTable {
+public:
+	StringTable(MacVentureEngine *engine, Common::MacResManager *resMan, StringTableID id) { 
+		_engine = engine;
+		_resourceManager = resMan;
+		_id = id;
+		
+		if (!loadStrings())
+			error("Could not load string table %x", id);
+	}
+
+	~StringTable() {
+
+	}
+
+	const Common::Array<Common::String> *getStrings() {
+		return &_strings;
+	}
+
+private:
+
+	bool loadStrings() {
+		Common::MacResIDArray resArray;
+		Common::SeekableReadStream *res;
+
+		if ((resArray = _resourceManager->getResIDArray(MKTAG('S', 'T', 'R', '#'))).size() == 0)
+			return false;
+
+		res = _resourceManager->getResource(MKTAG('S', 'T', 'R', '#'), _id);
+
+		_strings.push_back("dummy"); // String tables are 1-indexed
+		uint16 numStrings = res->readUint16BE();
+		uint8 strLength = 0;
+		for (uint i = 0; i < numStrings; ++i) {
+			strLength = res->readByte();
+			char* str = new char[strLength + 1];
+			res->read(str, strLength);
+			str[strLength] = '\0';
+			debug(11, "Loaded string %s", str);
+			_strings.push_back(Common::String(str));
+			delete[] str;
+		}
+
+		return true;
+	}
+
+private:
+
+	MacVentureEngine *_engine;
+	Common::MacResManager *_resourceManager;
+
+	StringTableID _id;
+
+	Common::Array<Common::String> _strings;
+};
+
+} // End of namespace MacVenture
+
+#endif
+


Commit: b024a24821eac6f3b0e4513c853ca845d608c198
    https://github.com/scummvm/scummvm/commit/b024a24821eac6f3b0e4513c853ca845d608c198
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:59+02:00

Commit Message:
MACVENTURE: Change container to return a stream

Changed paths:
    engines/macventure/container.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index a0028ee..e960ddb 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -62,10 +62,10 @@ public:
 			_res->seek(_header, SEEK_SET);
 			_numObjs = _res->readUint16BE();
 
-			for (int i = 0; i < 15; ++i)
+			for (uint i = 0; i < 15; ++i)
 				_huff[i] = _res->readUint16BE();
 
-			for (int i = 0; i < 16; ++i)
+			for (uint i = 0; i < 16; ++i)
 				_lens[i] = _res->readByte();
 
 			// Read groups
@@ -167,12 +167,12 @@ public:
 	}
 
 	/**
-	* Assumes storage is initialized.
+	* getItemByteSize should be called before this one
 	*/
-	void getItem(uint32 id, void* storage) {		
+	Common::SeekableReadStream *getItem(uint32 id) {		
 		if (_simplified) {
 			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
-			_res->read(storage, _lenObjs);
+			return _res;
 		} else {
 			ContainerHeader subHead = _header & 0x7fffffff;
 			uint32 groupID = (id >> 6);
@@ -181,13 +181,13 @@ public:
 			_res->seek(subHead + (groupID * 6), SEEK_SET);
 
 			uint32 offset = 0;
-			for (int i = 0; i < objectIndex; i++) {
+			for (uint i = 0; i < objectIndex; i++) {
 				offset += _groups[groupID].lengths[i];
 			}
 
 			_res->seek(offset, SEEK_CUR);
 
-			_res->read(storage, _groups[groupID].lengths[objectIndex]);
+			return _res;
 		}
 	}
 	


Commit: b209c52ed980db3fed608b2743eec2556869c1bb
    https://github.com/scummvm/scummvm/commit/b209c52ed980db3fed608b2743eec2556869c1bb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:24:59+02:00

Commit Message:
MACVENTURE: Add filepath retrieval

Changed paths:
    engines/macventure/container.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index e960ddb..0c6a41e 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -42,7 +42,7 @@ typedef uint32 ContainerHeader;
 class Container {	
 
 public:
-	Container(char *filename) {
+	Container(const char *filename) {
 		if (!_file.open(filename))
 			error("Could not open %s", filename);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 92ae709..821a786 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -53,6 +53,10 @@ MacVentureEngine::~MacVentureEngine() {
 	delete _rnd;
 	delete _debugger;
 	delete _gui;
+
+	if (_filenames) {
+		delete _filenames;
+	}
 }
 
 Common::Error MacVentureEngine::run() {
@@ -72,6 +76,10 @@ Common::Error MacVentureEngine::run() {
 	if (!loadGlobalSettings())
 		error("Could not load the engine settings");
 
+	// Engine-wide loading
+	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
+
+	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
 
@@ -96,7 +104,7 @@ void MacVentureEngine::requestUnpause() {
 	_paused = false;
 }
 
-const GlobalSettings& MacVentureEngine::getGlobalSettings() {
+const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
 	return _globalSettings;
 }
 
@@ -106,7 +114,7 @@ bool MacVentureEngine::isPaused() {
 	return _paused;
 }
 
-Common::String MacVentureEngine::getCommandsPausedString() {
+Common::String MacVentureEngine::getCommandsPausedString() const {
 	return Common::String("Click to continue");
 }
 
@@ -127,6 +135,15 @@ void MacVentureEngine::processEvents() {
 	}
 }
 
+Common::String MacVentureEngine::getFilePath(FilePathID id) const {
+	const Common::Array<Common::String> *names = _filenames->getStrings();
+	if (id <= 3) { // We don't want a file in the subdirectory
+		return Common::String((*names)[id]);
+	} else { // We want a game file
+		return Common::String((*names)[3] + "/" + (*names)[id]);
+	}
+}
+
 // Data loading
 
 bool MacVentureEngine::loadGlobalSettings() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 3a20bbe..d4f1a33 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -32,6 +32,7 @@
 
 #include "macventure/gui.h"
 #include "macventure/world.h"
+#include "macventure/stringtable.h"
 
 struct ADGameDescription;
 
@@ -65,6 +66,18 @@ enum {
 	kStartGameFilenameID = 0x85
 };
 
+enum FilePathID {
+	kMCVID = 1,
+	kTitlePathID = 2,
+	kSubdirPathID = 3,
+	kObjectPathID = 4,
+	kFilterPathID = 5,
+	kTextPathID = 6,
+	kGraphicPathID = 7,
+	kSoundPathID = 8
+};
+
+
 struct GlobalSettings {
 	uint16 numObjects;    // number of game objects defined
 	uint16 numGlobals;    // number of globals defined
@@ -99,8 +112,9 @@ public:
 
 	// Data retrieval
 	bool isPaused();
-	Common::String getCommandsPausedString();
-	const GlobalSettings& getGlobalSettings();
+	Common::String getCommandsPausedString() const;
+	const GlobalSettings& getGlobalSettings() const;
+	Common::String getFilePath(FilePathID id) const;
 
 private:
 	void processEvents();
@@ -121,6 +135,7 @@ private: // Attributes
 
 	// Engine state
 	GlobalSettings _globalSettings;
+	StringTable *_filenames;
 	bool _shouldQuit;
 	bool _paused;
 
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 68faa0a..cdc0e16 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -19,12 +19,8 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
-	_objectConstants = new Container("Shadowgate II/Shadow Graphic");
-
-	uint32 size = _objectConstants->getItemByteSize(2);
-	char * ob1 = new char[size];
-	_objectConstants->getItem(2, ob1);
-
+	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
+		
 	delete saveGameRes;
 	saveGameFile.close();		
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 38eb4bb..eed7b50 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -66,6 +66,7 @@ private:
 
 	SaveGame *_saveGame;
 	Container *_objectConstants;
+	Container *_gameText;
 
 };
 


Commit: bc435b398e0c6ad0afb48f1d30721d3d4588d6c6
    https://github.com/scummvm/scummvm/commit/bc435b398e0c6ad0afb48f1d30721d3d4588d6c6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:25:34+02:00

Commit Message:
MACVENTURE: Add text huffman loading

Changed paths:
  A engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/image.h b/engines/macventure/image.h
new file mode 100644
index 0000000..5bf6ccf
--- /dev/null
+++ b/engines/macventure/image.h
@@ -0,0 +1,40 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_IMAGE_H
+#define MACVENTURE_IMAGE_H
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+class Image {
+public:
+	Image();
+	~Image();
+
+	void blit(Graphics::ManagedSurface *target);
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 821a786..0e3e5a5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -54,9 +54,11 @@ MacVentureEngine::~MacVentureEngine() {
 	delete _debugger;
 	delete _gui;
 
-	if (_filenames) {
+	if (_filenames) 
 		delete _filenames;
-	}
+	
+	if (_textHuffman)
+		delete _textHuffman;
 }
 
 Common::Error MacVentureEngine::run() {
@@ -73,12 +75,14 @@ Common::Error MacVentureEngine::run() {
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());
 
+	// Engine-wide loading
 	if (!loadGlobalSettings())
 		error("Could not load the engine settings");
 
-	// Engine-wide loading
+	_oldTextEncoding = !loadTextHuffman();
+	
 	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
-
+	
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
@@ -192,5 +196,36 @@ bool MacVentureEngine::loadGlobalSettings() {
 	return false;
 }
 
+bool MacVentureEngine::loadTextHuffman() {
+	Common::MacResIDArray resArray;
+	Common::SeekableReadStream *res;
+
+	if ((resArray = _resourceManager->getResIDArray(MKTAG('G', 'N', 'R', 'L'))).size() == 0)
+		return false;
+
+	res = _resourceManager->getResource(MKTAG('G', 'N', 'R', 'L'), kTextHuffmanTableID);
+	if (res) {
+		uint32 numEntries = res->readUint16BE();
+		res->readUint16BE(); // Skip
+
+		uint32 *masks = new uint32[numEntries];
+		for (uint i = 0; i < numEntries - 1; i++)
+			// For some reason there are one lass mask than entries
+			masks[i] = res->readUint16BE();
+
+		uint8 *lengths = new uint8[numEntries];
+		for (uint i = 0; i < numEntries; i++)
+			lengths[i] = res->readByte();
+
+		uint32 *values = new uint32[numEntries];
+		for (uint i = 0; i < numEntries; i++)
+			values[i] = res->readByte();
+
+		_textHuffman = new Common::Huffman(0, numEntries, masks, lengths, values);
+
+		return true;
+	} 
+	return false;	
+}
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index d4f1a33..8e11612 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -27,6 +27,7 @@
 #include "common/debug.h"
 #include "common/random.h"
 #include "common/macresman.h"
+#include "common/huffman.h"
 
 #include "gui/debugger.h"
 
@@ -121,6 +122,7 @@ private:
 
 	// Data loading
 	bool loadGlobalSettings();
+	bool loadTextHuffman();
 
 private: // Attributes
 
@@ -136,6 +138,8 @@ private: // Attributes
 	// Engine state
 	GlobalSettings _globalSettings;
 	StringTable *_filenames;
+	Common::Huffman *_textHuffman;
+	bool _oldTextEncoding;
 	bool _shouldQuit;
 	bool _paused;
 


Commit: a112cdcb9dd8349390a54b8c5cd2c0c8bc3ad66a
    https://github.com/scummvm/scummvm/commit/a112cdcb9dd8349390a54b8c5cd2c0c8bc3ad66a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:25:35+02:00

Commit Message:
MACVENTURE: Add object attribute retrieval

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 0e3e5a5..383832b 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -88,9 +88,9 @@ Common::Error MacVentureEngine::run() {
 	_world = new World(this, _resourceManager);
 
 	_shouldQuit = false;
-	while (!_shouldQuit) {
+	while (!(_gameState == kGameStateQuitting)) {
 		processEvents();
-
+		
 		_gui->draw();
 
 		g_system->updateScreen();
@@ -102,10 +102,12 @@ Common::Error MacVentureEngine::run() {
 
 void MacVentureEngine::requestQuit() {
 	_shouldQuit = true;
+	_gameState = kGameStateQuitting;
 }
 
 void MacVentureEngine::requestUnpause() {
 	_paused = false;
+	_gameState = kGameStatePlaying;	
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
@@ -130,8 +132,8 @@ void MacVentureEngine::processEvents() {
 			continue;
 
 		switch (event.type) {
-		case Common::EVENT_QUIT:
-			_shouldQuit = true;
+		case Common::EVENT_QUIT:			
+			_gameState = kGameStateQuitting;
 			break;
 		default:
 			break;
@@ -222,10 +224,12 @@ bool MacVentureEngine::loadTextHuffman() {
 			values[i] = res->readByte();
 
 		_textHuffman = new Common::Huffman(0, numEntries, masks, lengths, values);
-
+		debug(5, "Text is huffman-encoded");
 		return true;
 	} 
 	return false;	
 }
 
+
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 8e11612..e4cda4e 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -100,6 +100,15 @@ struct GlobalSettings {
 	uint8  *commands;    // command buttons
 };
 
+enum GameState {
+	kGameStateInit,
+	kGameStatePlaying,
+	kGameStateWinnig,
+	kGameStateLosing,
+	kGameStateQuitting
+};
+
+
 class MacVentureEngine : public Engine {
 
 public:
@@ -136,6 +145,7 @@ private: // Attributes
 	World *_world;
 
 	// Engine state
+	GameState _gameState;
 	GlobalSettings _globalSettings;
 	StringTable *_filenames;
 	Common::Huffman *_textHuffman;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index cdc0e16..209b3c1 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -19,6 +19,9 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
+	debug("%x", _saveGame->getGroups()[0][1]);
+	debug(11, "Parent of player is %d", getObjAttr(1, 0));
+
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
 		
 	delete saveGameRes;
@@ -35,6 +38,24 @@ World::~World()	{
 		delete _objectConstants;
 }
 
+
+uint32 World::getObjAttr(uint32 objID, uint32 attrID) {
+	uint32 res;
+	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
+	if (!(index & 0x80)) { // It's not a constant
+		res = _saveGame->getGroups()[attrID][objID];
+	} else {
+		Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);
+		index &= 0x7F;
+		objStream->skip((index * 2) - 1);
+		res = objStream->readUint16BE();
+	}
+	res &= _engine->getGlobalSettings().attrMasks[attrID];
+	res >>= _engine->getGlobalSettings().attrShifts[attrID];
+	debug(11, "Attribute %x from object %x is %x", attrID, objID, res);
+	return res;
+}
+
 bool World::loadStartGameFileName() {
 	Common::SeekableReadStream *res;
 
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index eed7b50..9a74e5c 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -55,6 +55,8 @@ public:
 	World(MacVentureEngine *engine, Common::MacResManager *resMan);
 	~World();
 
+	uint32 getObjAttr(uint32 objID, uint32 attrID);
+
 private:
 	bool loadStartGameFileName();
 
@@ -67,7 +69,6 @@ private:
 	SaveGame *_saveGame;
 	Container *_objectConstants;
 	Container *_gameText;
-
 };
 
 } // End of namespace MacVenture


Commit: ef5a1525149b8f9cfc6806fdb46217d912025195
    https://github.com/scummvm/scummvm/commit/ef5a1525149b8f9cfc6806fdb46217d912025195
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:26:28+02:00

Commit Message:
MACVENTURE: Add main loop

Changed paths:
  A engines/macventure/script.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 383832b..8466c1b 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -53,10 +53,11 @@ MacVentureEngine::~MacVentureEngine() {
 	delete _rnd;
 	delete _debugger;
 	delete _gui;
+	delete _scriptEngine;
 
-	if (_filenames) 
+	if (_filenames)
 		delete _filenames;
-	
+
 	if (_textHuffman)
 		delete _textHuffman;
 }
@@ -80,18 +81,42 @@ Common::Error MacVentureEngine::run() {
 		error("Could not load the engine settings");
 
 	_oldTextEncoding = !loadTextHuffman();
-	
+
 	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
-	
+
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
+	_scriptEngine = new ScriptEngine();
 
-	_shouldQuit = false;
+	_paused = false;
+	_halted = true;
+	_cmdReady = false;
+	_haltedAtEnd = false;
+	_haltedInSelection = false;
 	while (!(_gameState == kGameStateQuitting)) {
 		processEvents();
-		
-		_gui->draw();
+
+		if (!_halted) {
+			_gui->draw();
+		}
+
+		if (_cmdReady || _halted) {
+			_halted = false;
+			if (runScriptEngine()) {
+				_halted = true;
+				_paused = true;
+			} else {
+				_paused = false;
+				if (!updateState()) {
+					updateControls();
+				}
+			}
+		}
+
+		if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
+			endGame();
+		}
 
 		g_system->updateScreen();
 		g_system->delayMillis(50);
@@ -101,29 +126,34 @@ Common::Error MacVentureEngine::run() {
 }
 
 void MacVentureEngine::requestQuit() {
-	_shouldQuit = true;
+	// TODO: Display save game dialog and such
 	_gameState = kGameStateQuitting;
 }
 
 void MacVentureEngine::requestUnpause() {
 	_paused = false;
-	_gameState = kGameStatePlaying;	
+	_gameState = kGameStatePlaying;
 }
 
-const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
-	return _globalSettings;
+void MacVentureEngine::enqueueObject(ObjID id) {
+	QueuedObject obj;
+	obj.parent = _world->getObjAttr(id, kAttrParentObject);
+	obj.x = _world->getObjAttr(id, kAttrPosX);
+	obj.y = _world->getObjAttr(id, kAttrPosY);
+	obj.exitx = _world->getObjAttr(id, kAttrExitX);
+	obj.exity = _world->getObjAttr(id, kAttrExitY);
+	obj.hidden = _world->getObjAttr(id, kAttrHiddenExit);
+	obj.offsecreen = _world->getObjAttr(id, kAttrInvisible);
+	obj.invisible = _world->getObjAttr(id, kAttrUnclickable);
+	_objQueue.push_back(obj);
 }
 
-// Data retrieval
-
-bool MacVentureEngine::isPaused() {
-	return _paused;
+const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
+	return _globalSettings;
 }
 
-Common::String MacVentureEngine::getCommandsPausedString() const {
-	return Common::String("Click to continue");
-}
 
+// Private engine methods
 void MacVentureEngine::processEvents() {
 	Common::Event event;
 
@@ -132,7 +162,7 @@ void MacVentureEngine::processEvents() {
 			continue;
 
 		switch (event.type) {
-		case Common::EVENT_QUIT:			
+		case Common::EVENT_QUIT:
 			_gameState = kGameStateQuitting;
 			break;
 		default:
@@ -141,6 +171,91 @@ void MacVentureEngine::processEvents() {
 	}
 }
 
+bool MacVenture::MacVentureEngine::runScriptEngine() {
+	debug(5, "MAIN: Running script engine");
+	if (_haltedAtEnd) {
+		_haltedAtEnd = false;
+		if (_scriptEngine->resume()) {
+			_haltedAtEnd = true;
+			return true;
+		}
+		return false;
+	}
+
+	if (_haltedInSelection) {
+		_haltedInSelection = false;
+		if (_scriptEngine->resume()) {
+			_haltedInSelection = true;
+			return true;
+		}
+		if (updateState())
+			return true;
+	}
+
+	while (!_currentSelection.empty()) {
+		ObjID obj = _currentSelection.front();
+		_currentSelection.pop_front();
+		if ((_gameState == kGameStateInit || _gameState == kGameStatePlaying) && _world->isObjActive(obj)) {
+			if (_scriptEngine->runControl(_selectedControl, obj, _destObject, _deltaPoint)) {
+				_haltedInSelection = true;
+				return true;
+			}
+			if (updateState()) {
+				return true;
+			}
+		}
+	}
+	if (_selectedControl == 1)
+		_gameChanged = false;
+
+	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying){
+		if (_scriptEngine->runControl(kTick, _selectedControl, _destObject, _deltaPoint)) {
+			_haltedAtEnd = true;
+			return true;
+		}
+	}
+	return false;
+}
+
+void MacVentureEngine::endGame() {
+	requestQuit();
+}
+
+bool MacVentureEngine::updateState() {
+	runObjQueue();
+	return true;
+}
+
+void MacVentureEngine::runObjQueue() {
+
+}
+
+void MacVentureEngine::updateControls() {
+	if (_activeControl)
+		_activeControl = kNoCommand;
+	// toggleExits();
+	// resetVars();
+}
+
+void MacVentureEngine::resetVars() {
+	_selectedControl = kNoCommand;
+	_activeControl = kNoCommand;
+	_currentSelection.clear();
+	_destObject = 0;
+	_deltaPoint = Common::Point(0, 0);
+	_cmdReady = false;
+}
+
+// Data retrieval
+
+bool MacVentureEngine::isPaused() {
+	return _paused;
+}
+
+Common::String MacVentureEngine::getCommandsPausedString() const {
+	return Common::String("Click to continue");
+}
+
 Common::String MacVentureEngine::getFilePath(FilePathID id) const {
 	const Common::Array<Common::String> *names = _filenames->getStrings();
 	if (id <= 3) { // We don't want a file in the subdirectory
@@ -226,8 +341,8 @@ bool MacVentureEngine::loadTextHuffman() {
 		_textHuffman = new Common::Huffman(0, numEntries, masks, lengths, values);
 		debug(5, "Text is huffman-encoded");
 		return true;
-	} 
-	return false;	
+	}
+	return false;
 }
 
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index e4cda4e..e1a147c 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -34,6 +34,7 @@
 #include "macventure/gui.h"
 #include "macventure/world.h"
 #include "macventure/stringtable.h"
+#include "macventure/script.h"
 
 struct ADGameDescription;
 
@@ -41,6 +42,9 @@ namespace MacVenture {
 
 class Console;
 class World;
+class ScriptEngine;
+
+typedef uint32 ObjID;
 
 enum {
 	kScreenWidth = 512,
@@ -108,6 +112,29 @@ enum GameState {
 	kGameStateQuitting
 };
 
+enum ObjectQueueID {
+	kFocusWindow = 2,
+	kOpenWindow = 3,
+	kCloseWindow = 4,
+	kUpdateObject = 7,
+	kUpdateWindow = 8,
+	kSetToPlayerParent = 12,
+	kHightlightExits = 13,
+	kAnimateBack = 14
+};
+
+struct QueuedObject {
+	ObjectQueueID id;
+	ObjID object;
+	ObjID parent;
+	uint x;
+	uint y;
+	uint exitx;
+	uint exity;
+	bool hidden;
+	bool offsecreen;
+	bool invisible;
+};
 
 class MacVentureEngine : public Engine {
 
@@ -120,6 +147,8 @@ public:
 	void requestQuit();
 	void requestUnpause();
 
+	void enqueueObject(ObjID id);
+
 	// Data retrieval
 	bool isPaused();
 	Common::String getCommandsPausedString() const;
@@ -129,6 +158,13 @@ public:
 private:
 	void processEvents();
 
+	bool runScriptEngine();
+	void endGame();
+	bool updateState();
+	void runObjQueue();
+	void updateControls();
+	void resetVars();
+
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
@@ -143,6 +179,7 @@ private: // Attributes
 	Console *_debugger;
 	Gui *_gui;
 	World *_world;
+	ScriptEngine *_scriptEngine;
 
 	// Engine state
 	GameState _gameState;
@@ -150,8 +187,20 @@ private: // Attributes
 	StringTable *_filenames;
 	Common::Huffman *_textHuffman;
 	bool _oldTextEncoding;
-	bool _shouldQuit;
-	bool _paused;
+	bool _paused, _halted, _cmdReady;
+	bool _haltedAtEnd, _haltedInSelection;
+	bool _gameChanged;
+
+	Common::List<QueuedObject> _objQueue;
+	Common::List<QueuedObject> _soundQueue;
+	Common::List<QueuedObject> _textQueue;
+
+	// Selections
+	ObjID _destObject;
+	ControlAction _selectedControl;
+	ControlAction _activeControl;
+	Common::List<ObjID> _currentSelection;
+	Common::Point _deltaPoint;
 
 private: // Methods
 
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
new file mode 100644
index 0000000..6637692
--- /dev/null
+++ b/engines/macventure/script.h
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_SCRIPT_H
+#define MACVENTURE_SCRIPT_H
+
+#include "macventure/macventure.h"
+
+namespace MacVenture {
+
+enum ControlAction {
+	kNoCommand = 0,
+	kStartOrResume = 1,
+	kClose = 2,
+	kTick = 3,
+	kActivateObject = 4,
+	kMoveObject = 5,
+	kConsume = 6,
+	kExamine = 7,
+	kGo = 8,
+	kHit = 9,
+	kOpen = 10,
+	kOperate = 11,
+	kSpeak = 12,
+	kBabble = 13,
+	kTargetName = 14,
+	kDebugObject = 15
+};
+
+typedef uint32 ObjID;
+	
+class ScriptEngine {
+public:
+	ScriptEngine() {}
+	~ScriptEngine() {}
+
+	bool runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta) {
+		debug(7, "SCRIPT: Running control %d from obj %d into obj %d, at delta (%d, %d)", 
+			action, source, destination, delta.x, delta.y);
+		
+		return false;
+	}
+
+	bool resume() {
+		debug(7, "SCRIPT: Resume");
+
+		return false;
+	}
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 209b3c1..d8fd9b4 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -17,11 +17,7 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
 
-	_saveGame = new SaveGame(_engine, saveGameRes);
-
-	debug("%x", _saveGame->getGroups()[0][1]);
-	debug(11, "Parent of player is %d", getObjAttr(1, 0));
-
+	_saveGame = new SaveGame(_engine, saveGameRes);	
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
 		
 	delete saveGameRes;
@@ -39,7 +35,7 @@ World::~World()	{
 }
 
 
-uint32 World::getObjAttr(uint32 objID, uint32 attrID) {
+uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	uint32 res;
 	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
 	if (!(index & 0x80)) { // It's not a constant
@@ -56,6 +52,10 @@ uint32 World::getObjAttr(uint32 objID, uint32 attrID) {
 	return res;
 }
 
+bool MacVenture::World::isObjActive(ObjID obj) {
+	return false;
+}
+
 bool World::loadStartGameFileName() {
 	Common::SeekableReadStream *res;
 
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 9a74e5c..e5c728e 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -28,8 +28,35 @@
 
 namespace MacVenture {
 
+typedef uint32 ObjID;
 typedef Common::Array<uint16> AttributeGroup;
 
+enum ObjectAttributeID {
+	kAttrParentObject = 0,
+	kAttrPosX = 1,
+	kAttrPosY = 2,
+	kAttrInvisible = 3,
+	kAttrUnclickable = 4,
+	kAttrUndraggable = 5,
+	kAttrContainerOpen = 6,
+	kAttrPrefixes = 7,
+	kAttrIsExit = 8,
+	kAttrExitX = 9,
+	kAttrExitY = 10,
+	kAttrHiddenExit = 11,
+	kAttrOtherDoor = 12,
+	kAttrIsOpen = 13,
+	kAttrIsLocked = 14,
+	kAttrWeight = 16,
+	kAttrSize = 17,
+	kAttrHasDescription = 19,
+	kAttrIsDoor = 20,
+	kAttrIsContainer = 22,
+	kAttrIsOperable = 23,
+	kAttrIsEnterable = 24,
+	kAttrIsEdible = 25
+};
+
 class SaveGame {
 public:
 	SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res);
@@ -55,7 +82,8 @@ public:
 	World(MacVentureEngine *engine, Common::MacResManager *resMan);
 	~World();
 
-	uint32 getObjAttr(uint32 objID, uint32 attrID);
+	uint32 getObjAttr(ObjID objID, uint32 attrID);
+	bool isObjActive(ObjID obj);
 
 private:
 	bool loadStartGameFileName();


Commit: 79496ea5c07cf3da9fef845e53b6df2c36a6a8e7
    https://github.com/scummvm/scummvm/commit/79496ea5c07cf3da9fef845e53b6df2c36a6a8e7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:26:46+02:00

Commit Message:
MACVENTURE: Add command activation

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 3aa9c5d..aeca8df 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -68,7 +68,7 @@ static const Graphics::MenuData menuSubItems[] = {
 	{ 0,				NULL,				0, 0, false }
 };
 
-bool controlsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
+bool commandsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool mainGameWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool selfWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
@@ -145,7 +145,7 @@ void Gui::initWindows() {
 	_controlsWindow = _wm.addWindow(false, false, false);
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
 	_controlsWindow->setActive(false);
-	_controlsWindow->setCallback(controlsWindowCallback, this);
+	_controlsWindow->setCallback(commandsWindowCallback, this);
 	loadBorder(_controlsWindow, "border_command.bmp", false);
 	loadBorder(_controlsWindow, "border_command.bmp", true);
 
@@ -462,7 +462,7 @@ void Gui::drawSelfWindow() {
 
 /* CALLBACKS */
 
-bool controlsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+bool commandsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
 
@@ -564,20 +564,27 @@ void Gui::handleMenuAction(MenuAction action) {
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		if (_engine->isPaused()) {
-			_engine->requestUnpause();
-		} else {
-			Common::Point position(
-				event.mouse.x - _controlsWindow->getDimensions().left,
-				event.mouse.y - _controlsWindow->getDimensions().top);
-			Common::List<CommandButton>::const_iterator it = _controlData->begin();
-			for (; it != _controlData->end(); ++it) {
-				const CommandButton &data = *it;
-				if (data.isInsideBounds(position)) {
-					debug("Command active: %s", data.getData().title);
-				}
+		if (_engine->isPaused()) 
+			return true;
+		
+		Common::Point position(
+			event.mouse.x - _controlsWindow->getDimensions().left,
+			event.mouse.y - _controlsWindow->getDimensions().top);
+
+		CommandButton data;
+		Common::List<CommandButton>::const_iterator it = _controlData->begin();
+		for (; it != _controlData->end(); ++it) {
+			if (it->isInsideBounds(position)) {
+				debug("Command active: %s", it->getData().title);
+				data = *it;
 			}
 		}
+
+		_engine->selectControl((ControlReference)data.getData().refcon);
+		_engine->activateCommand((ControlReference)data.getData().refcon);
+		
+		// Run main
+		
 	}
 	return false;
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 1eba4d2..4d760e8 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -198,6 +198,11 @@ enum {
 };
 
 public:
+
+	CommandButton() {
+		_gui = nullptr;
+	}
+
 	CommandButton(ControlData data, Gui *g) {
 		_data = data;
 		_gui = g;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 8466c1b..27a2aad 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -135,6 +135,22 @@ void MacVentureEngine::requestUnpause() {
 	_gameState = kGameStatePlaying;
 }
 
+void MacVentureEngine::selectControl(ControlReference id) {
+	ControlAction action = referenceToAction(id);
+	debug(7, "Select control %x", action);
+	_selectedControl = action;
+}
+
+void MacVentureEngine::activateCommand(ControlReference id) {
+	ControlAction action = referenceToAction(id);
+	if (action != _activeControl) {
+		if (_activeControl) 
+			_activeControl = kNoCommand;
+		_activeControl = action;
+	}
+	debug(7, "Activating Command %x... Command %x is active", action, _activeControl);
+}
+
 void MacVentureEngine::enqueueObject(ObjID id) {
 	QueuedObject obj;
 	obj.parent = _world->getObjAttr(id, kAttrParentObject);
@@ -246,6 +262,31 @@ void MacVentureEngine::resetVars() {
 	_cmdReady = false;
 }
 
+ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlReference id) {
+	switch (id) {
+	case MacVenture::kControlExitBox:
+		return kActivateObject;//??
+	case MacVenture::kControlExamine:
+		return kExamine;
+	case MacVenture::kControlOpen:
+		return kOpen;
+	case MacVenture::kControlClose:
+		return kClose;
+	case MacVenture::kControlSpeak:
+		return kSpeak;
+	case MacVenture::kControlOperate:
+		return kOperate;
+	case MacVenture::kControlGo:
+		return kGo;
+	case MacVenture::kControlHit:
+		return kHit;
+	case MacVenture::kControlConsume:
+		return kConsume;
+	default:
+		return kNoCommand;
+	}
+}
+
 // Data retrieval
 
 bool MacVentureEngine::isPaused() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index e1a147c..8fe5792 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -146,6 +146,8 @@ public:
 
 	void requestQuit();
 	void requestUnpause();
+	void selectControl(ControlReference id);
+	void activateCommand(ControlReference id);
 
 	void enqueueObject(ObjID id);
 
@@ -169,6 +171,9 @@ private:
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
 
+	// Utils
+	ControlAction referenceToAction(ControlReference id);
+
 private: // Attributes
 
 	const ADGameDescription *_gameDescription;


Commit: ec768fbec167321914326a54a7efc2032e03c3e3
    https://github.com/scummvm/scummvm/commit/ec768fbec167321914326a54a7efc2032e03c3e3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:06+02:00

Commit Message:
MACVENTURE: Test and complete main loop

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index aeca8df..4ca3de7 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -582,9 +582,8 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 
 		_engine->selectControl((ControlReference)data.getData().refcon);
 		_engine->activateCommand((ControlReference)data.getData().refcon);
-		
-		// Run main
-		
+		_engine->refreshReady();
+		_engine->preparedToRun();		
 	}
 	return false;
 }
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 27a2aad..3b45356 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -94,28 +94,34 @@ Common::Error MacVentureEngine::run() {
 	_cmdReady = false;
 	_haltedAtEnd = false;
 	_haltedInSelection = false;
+	_prepared = true;
 	while (!(_gameState == kGameStateQuitting)) {
 		processEvents();
 
-		if (!_halted) {
-			_gui->draw();
-		}
+		if (_prepared) {
+			_prepared = false;
+
+			if (!_halted) {
+				_gui->draw();
+			}
 
-		if (_cmdReady || _halted) {
-			_halted = false;
-			if (runScriptEngine()) {
-				_halted = true;
-				_paused = true;
-			} else {
-				_paused = false;
-				if (!updateState()) {
-					updateControls();
+			if (_cmdReady || _halted) {
+				_halted = false;
+				if (runScriptEngine()) {
+					_halted = true;
+					_paused = true;
+				}
+				else {
+					_paused = false;
+					if (!updateState()) {
+						updateControls();
+					}
 				}
 			}
-		}
 
-		if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
-			endGame();
+			if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
+				endGame();
+			}
 		}
 
 		g_system->updateScreen();
@@ -144,13 +150,32 @@ void MacVentureEngine::selectControl(ControlReference id) {
 void MacVentureEngine::activateCommand(ControlReference id) {
 	ControlAction action = referenceToAction(id);
 	if (action != _activeControl) {
-		if (_activeControl) 
+		if (_activeControl)
 			_activeControl = kNoCommand;
 		_activeControl = action;
 	}
 	debug(7, "Activating Command %x... Command %x is active", action, _activeControl);
 }
 
+void MacVentureEngine::refreshReady() {
+	switch (objectsToApplyCommand()) {
+	case 0: // No selected object
+		_cmdReady = true;
+		break;
+	case 1: // We have some selected object
+		_cmdReady = _currentSelection.size() != 0;
+		break;
+	case 2:
+		if (_destObject > 0) // We have a destination seleted
+			_cmdReady = true;
+		break;
+	}
+}
+
+void MacVentureEngine::preparedToRun() {
+	_prepared = true;
+}
+
 void MacVentureEngine::enqueueObject(ObjID id) {
 	QueuedObject obj;
 	obj.parent = _world->getObjAttr(id, kAttrParentObject);
@@ -287,6 +312,10 @@ ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlReference i
 	}
 }
 
+uint MacVentureEngine::objectsToApplyCommand() {
+	return uint();
+}
+
 // Data retrieval
 
 bool MacVentureEngine::isPaused() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 8fe5792..16d4d8d 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -148,6 +148,8 @@ public:
 	void requestUnpause();
 	void selectControl(ControlReference id);
 	void activateCommand(ControlReference id);
+	void refreshReady();
+	void preparedToRun();
 
 	void enqueueObject(ObjID id);
 
@@ -173,6 +175,7 @@ private:
 
 	// Utils
 	ControlAction referenceToAction(ControlReference id);
+	uint objectsToApplyCommand();
 
 private: // Attributes
 
@@ -192,7 +195,7 @@ private: // Attributes
 	StringTable *_filenames;
 	Common::Huffman *_textHuffman;
 	bool _oldTextEncoding;
-	bool _paused, _halted, _cmdReady;
+	bool _paused, _halted, _cmdReady, _prepared;
 	bool _haltedAtEnd, _haltedInSelection;
 	bool _gameChanged;
 


Commit: da174b708c74b051d297fb23e61b70faf96448d4
    https://github.com/scummvm/scummvm/commit/da174b708c74b051d297fb23e61b70faf96448d4
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:08+02:00

Commit Message:
MACVENTURE: Fix small retrieval bug

Changed paths:
    engines/macventure/container.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 0c6a41e..3573dda 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -56,8 +56,7 @@ public:
 			int dataLen = _res->size() - sizeof(_header);
 			_lenObjs = _header;
 			_numObjs = dataLen / _lenObjs;
-		}
-		else {
+		} else {
 			_header &= 0x7fffffff;
 			_res->seek(_header, SEEK_SET);
 			_numObjs = _res->readUint16BE();
@@ -178,7 +177,7 @@ public:
 			uint32 groupID = (id >> 6);
 			uint32 objectIndex = id & 0x3f; // Index within the group
 
-			_res->seek(subHead + (groupID * 6), SEEK_SET);
+			_res->seek((groupID * 6), SEEK_SET);
 
 			uint32 offset = 0;
 			for (uint i = 0; i < objectIndex; i++) {


Commit: c42451bf22d22f10c73013aec169689fad26ded6
    https://github.com/scummvm/scummvm/commit/c42451bf22d22f10c73013aec169689fad26ded6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:08+02:00

Commit Message:
MACVENTURE: Fix (another) small retrieval bug

Changed paths:
    engines/macventure/container.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 3573dda..9cfa013 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -177,7 +177,7 @@ public:
 			uint32 groupID = (id >> 6);
 			uint32 objectIndex = id & 0x3f; // Index within the group
 
-			_res->seek((groupID * 6), SEEK_SET);
+			_res->seek(4 + (groupID * 6), SEEK_SET);
 
 			uint32 offset = 0;
 			for (uint i = 0; i < objectIndex; i++) {


Commit: aae8378afdc8372ba788363587d0b919b9d96d93
    https://github.com/scummvm/scummvm/commit/aae8378afdc8372ba788363587d0b919b9d96d93
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:08+02:00

Commit Message:
MACVENTURE: Remove unused variables

Changed paths:
    engines/macventure/container.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 9cfa013..bd88f66 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -30,7 +30,6 @@
 
 namespace MacVenture {
 
-
 struct ItemGroup {
 	uint32 bitOffset; //It's really uint24
 	uint32 offset; //It's really uint24
@@ -173,7 +172,6 @@ public:
 			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
 			return _res;
 		} else {
-			ContainerHeader subHead = _header & 0x7fffffff;
 			uint32 groupID = (id >> 6);
 			uint32 objectIndex = id & 0x3f; // Index within the group
 


Commit: 9c10b431ce3a59588571fbb77d8ae861f2de4c50
    https://github.com/scummvm/scummvm/commit/9c10b431ce3a59588571fbb77d8ae861f2de4c50
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:08+02:00

Commit Message:
MACVENTURE: Add text decoding (without composite)

Changed paths:
  A engines/macventure/hufflists.h
  A engines/macventure/text.cpp
  A engines/macventure/text.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/hufflists.h b/engines/macventure/hufflists.h
new file mode 100644
index 0000000..1ea4f21
--- /dev/null
+++ b/engines/macventure/hufflists.h
@@ -0,0 +1,57 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_HUFFLIST_H
+#define MACVENTURE_HUFFLIST_H
+
+namespace MacVenture {
+	
+// The engine uses a <= comparison instead of ==, so I can't use Common::Huffman
+class HuffmanLists {
+public:	
+	HuffmanLists() {
+		_numEntries = 0;
+	}
+	HuffmanLists(uint32 num, uint32 *lens, uint32 *masks, uint32 *symbols) {
+		_numEntries = num;
+		_lens = Common::Array<uint32>(lens, num);
+		_masks = Common::Array<uint32>(masks, num);
+		_symbols = Common::Array<uint32>(symbols, num);
+	}
+	~HuffmanLists() {}
+		
+
+	uint32 getNumEntries() const { return _numEntries; }
+	uint32 getLength(uint32 index) const { return _lens[index]; }
+	uint32 getMask(uint32 index) const { return _masks[index]; }
+	uint32 getSymbol(uint32 index) const { return _symbols[index]; }
+
+private: 
+	uint32 _numEntries;
+	Common::Array<uint32> _lens;
+	Common::Array<uint32> _masks;
+	Common::Array<uint32> _symbols;
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 3b45356..2054c5e 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -42,6 +42,7 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 	_rnd = new Common::RandomSource("macventure");
 
 	_debugger= NULL;
+	_gui = NULL;
 
 	debug("MacVenture::MacVentureEngine()");
 }
@@ -143,7 +144,7 @@ void MacVentureEngine::requestUnpause() {
 
 void MacVentureEngine::selectControl(ControlReference id) {
 	ControlAction action = referenceToAction(id);
-	debug(7, "Select control %x", action);
+	debug(4, "Select control %x", action);
 	_selectedControl = action;
 }
 
@@ -154,7 +155,7 @@ void MacVentureEngine::activateCommand(ControlReference id) {
 			_activeControl = kNoCommand;
 		_activeControl = action;
 	}
-	debug(7, "Activating Command %x... Command %x is active", action, _activeControl);
+	debug(4, "Activating Command %x... Command %x is active", action, _activeControl);
 }
 
 void MacVentureEngine::refreshReady() {
@@ -213,7 +214,7 @@ void MacVentureEngine::processEvents() {
 }
 
 bool MacVenture::MacVentureEngine::runScriptEngine() {
-	debug(5, "MAIN: Running script engine");
+	debug(4, "MAIN: Running script engine");
 	if (_haltedAtEnd) {
 		_haltedAtEnd = false;
 		if (_scriptEngine->resume()) {
@@ -335,6 +336,14 @@ Common::String MacVentureEngine::getFilePath(FilePathID id) const {
 	}
 }
 
+bool MacVentureEngine::isOldText() const {
+	return _oldTextEncoding;
+}
+
+const HuffmanLists * MacVentureEngine::getDecodingHuffman() const {
+	return _textHuffman;
+}
+
 // Data loading
 
 bool MacVentureEngine::loadGlobalSettings() {
@@ -400,7 +409,7 @@ bool MacVentureEngine::loadTextHuffman() {
 			// For some reason there are one lass mask than entries
 			masks[i] = res->readUint16BE();
 
-		uint8 *lengths = new uint8[numEntries];
+		uint32 *lengths = new uint32[numEntries];
 		for (uint i = 0; i < numEntries; i++)
 			lengths[i] = res->readByte();
 
@@ -408,8 +417,8 @@ bool MacVentureEngine::loadTextHuffman() {
 		for (uint i = 0; i < numEntries; i++)
 			values[i] = res->readByte();
 
-		_textHuffman = new Common::Huffman(0, numEntries, masks, lengths, values);
-		debug(5, "Text is huffman-encoded");
+		_textHuffman = new HuffmanLists(numEntries, lengths, masks, values);
+		debug(4, "Text is huffman-encoded");
 		return true;
 	}
 	return false;
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 16d4d8d..656aeaf 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -33,6 +33,7 @@
 
 #include "macventure/gui.h"
 #include "macventure/world.h"
+#include "macventure/hufflists.h"
 #include "macventure/stringtable.h"
 #include "macventure/script.h"
 
@@ -158,6 +159,8 @@ public:
 	Common::String getCommandsPausedString() const;
 	const GlobalSettings& getGlobalSettings() const;
 	Common::String getFilePath(FilePathID id) const;
+	bool isOldText() const;
+	const HuffmanLists *getDecodingHuffman() const;
 
 private:
 	void processEvents();
@@ -193,7 +196,7 @@ private: // Attributes
 	GameState _gameState;
 	GlobalSettings _globalSettings;
 	StringTable *_filenames;
-	Common::Huffman *_textHuffman;
+	HuffmanLists *_textHuffman;
 	bool _oldTextEncoding;
 	bool _paused, _halted, _cmdReady, _prepared;
 	bool _haltedAtEnd, _haltedInSelection;
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 2fac1b5..47e0c70 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -4,6 +4,7 @@ MODULE_OBJS := \
 	detection.o \
 	gui.o \
 	object.o \
+	text.o \
 	macventure.o \
 	world.o \
 
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
new file mode 100644
index 0000000..adac94b
--- /dev/null
+++ b/engines/macventure/text.cpp
@@ -0,0 +1,146 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/text.h"
+
+namespace MacVenture {
+TextAsset::TextAsset(ObjID objid, Container *container, bool isOld, const HuffmanLists *huffman) {
+	_id = objid;
+	_container = container;
+	_huffman = huffman;
+
+	if (isOld) {
+		decodeOld();
+	}
+	else {
+		decodeHuffman();
+	}	
+}
+
+void TextAsset::decodeOld() {
+	Common::SeekableReadStream *res = _container->getItem(_id);
+	uint16 strLen = res->readUint16BE();
+	Common::BitStream32BELSB stream(res);
+	char* str = new char[strLen + 1];
+	bool lowercase = false;
+	char c;
+	for (uint16 i = 0; i < strLen; i++) {
+		char val = stream.getBits(5);
+		if (val == 0x0) { // Space
+			c = ' ';
+		}
+		else if (val >= 0x1 && val <= 0x1A) {
+			if (lowercase) { // Ascii a-z
+				c = val + 0x60;
+			}
+			else { // Ascii A-Z
+				c = val + 0x40;
+			}
+			lowercase = true;
+		}
+		else if (val == 0x1B) {
+			if (lowercase) {
+				c = '.';
+			}
+			else {
+				c = ',';
+			}
+			lowercase = true;
+		}
+		else if (val == 0x1C) {
+			if (lowercase) {
+				c = 0x27; // Ascii '
+			}
+			else {
+				c = 0x22; // Ascii '"'
+			}
+			lowercase = true;
+		}
+		else if (val == 0x1D) { // Composite
+			warning("Composite strings not implemented");
+			stream.getBits(16);
+			lowercase = true;
+		}
+		else if (val == 0x1E) {
+			c = stream.getBits(8);
+			lowercase = true;
+		}
+		else if (val == 0x1F) {
+			lowercase = !lowercase;
+		}
+		else {
+			warning("Unrecognized char in old text %d, pos %d", _id, i);
+		}
+		str[i] = c;
+	}
+
+	str[strLen] = '\0';
+	debug(7, "Decoded %d string (old): %s", _id, str);
+	_decoded = Common::String(str);
+}
+
+void TextAsset::decodeHuffman() {
+	_decoded = Common::String("Huffman string");
+	Common::SeekableReadStream *res = _container->getItem(_id);
+	Common::BitStream32BEMSB stream(res);
+	uint16 strLen = 0;
+	if (stream.getBit()) {
+		strLen = stream.getBits(15);
+	}
+	else {
+		strLen = stream.getBits(7);
+	}
+
+	char* str = new char[strLen + 1];
+	uint32 mask = 0;
+	uint32 symbol = 0;
+	char c;
+	for (uint16 i = 0; i < strLen; i++) {
+		mask = stream.peekBits(16); // The mask is OK, so it means that I don't know how to use the huffman
+		uint32 entry;
+		// Find the length index
+		for (entry = 0; entry < _huffman->getNumEntries(); entry++) {
+			if (mask < _huffman->getMask(entry)) break;
+		}			
+
+		stream.skip(_huffman->getLength(entry));
+
+		symbol = _huffman->getSymbol(entry);
+
+		if (symbol == 1) { // 7-bit ascii
+			c = stream.getBits(7);
+		}
+		else if (symbol == 2) { // Composite
+			warning("Composite huffman strings not implemented");
+		}
+		else { // Plain ascii
+			c = symbol & 0xFF;
+		}
+
+		str[i] = c;
+	}
+
+	str[strLen] = '\0';
+	debug(7, "Decoded %d'th string (new): %s", _id, str);
+	_decoded = Common::String(str);
+}
+} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/text.h b/engines/macventure/text.h
new file mode 100644
index 0000000..3b3af92
--- /dev/null
+++ b/engines/macventure/text.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_TEXT_H
+#define MACVENTURE_TEXT_H
+
+#include "macventure/macventure.h"
+#include "macventure/hufflists.h"
+
+namespace MacVenture {
+typedef uint32 ObjID;
+
+class TextAsset {
+public:
+	TextAsset(ObjID objid, Container *container, bool isOld, const HuffmanLists *huffman);
+	~TextAsset() {}
+
+	const Common::String *decode() {
+		return &_decoded;
+	}
+
+private:
+	void decodeOld();
+	void decodeHuffman();
+
+private:
+	Container *_container;
+	ObjID _id;
+	const HuffmanLists *_huffman;
+	
+	Common::String _decoded;
+
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index d8fd9b4..d919a1a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -19,7 +19,12 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);	
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
-		
+	//_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());
+	_gameText = new Container("Shadowgate II/Shadow Text");
+
+	ObjID tid = (ObjID)1;
+	TextAsset test = TextAsset(tid, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
+
 	delete saveGameRes;
 	saveGameFile.close();		
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index e5c728e..6931996 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -25,11 +25,13 @@
 
 #include "macventure/macventure.h"
 #include "macventure/container.h"
+#include "macventure/text.h"
 
 namespace MacVenture {
 
 typedef uint32 ObjID;
 typedef Common::Array<uint16> AttributeGroup;
+class TextAsset;
 
 enum ObjectAttributeID {
 	kAttrParentObject = 0,


Commit: d7d03baba9534e1d94e7642c685addedbb9e2238
    https://github.com/scummvm/scummvm/commit/d7d03baba9534e1d94e7642c685addedbb9e2238
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:08+02:00

Commit Message:
MACVENTURE: Fix small bug in save reading

Changed paths:
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index d919a1a..abb0c55 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -15,11 +15,13 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	if (!saveGameFile.open(_startGameFileName)) 
 		error("Could not load initial game configuration");
 
+	debug("Loading save game state from %s", _startGameFileName.c_str());
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
 
 	_saveGame = new SaveGame(_engine, saveGameRes);	
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
-	//_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());
+	calculateObjectRelations();
+	
 	_gameText = new Container("Shadowgate II/Shadow Text");
 
 	ObjID tid = (ObjID)1;
@@ -73,11 +75,25 @@ bool World::loadStartGameFileName() {
 	res->read(fileName, length);
 	fileName[length] = '\0';
 	_startGameFileName = Common::String(fileName, length);
-	_startGameFileName.replace(_startGameFileName.end(), _startGameFileName.end(), ".bin");
 
 	return true;
 }
 
+void World::calculateObjectRelations() {
+	ObjID val, next;
+	uint32 numObjs = _engine->getGlobalSettings().numObjects;
+	const AttributeGroup &parents = *_saveGame->getGroup(0);
+	for (uint i = 0; i < numObjs * 2; i++) {
+		_relations.push_back(0);
+	}
+	for (uint i = numObjs - 1; i > 0; i--) {
+		val = parents[i];
+		next = _relations[val * 2];
+		if (next) { _relations[i * 2 + 1] = next; }
+		_relations[val * 2] = i;
+	}
+}
+
 // SaveGame
 SaveGame::SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	_groups = Common::Array<AttributeGroup>();
@@ -95,6 +111,11 @@ const Common::Array<AttributeGroup>& MacVenture::SaveGame::getGroups() {
 	return _groups;
 }
 
+const AttributeGroup * SaveGame::getGroup(uint32 groupID) {
+	assert(groupID < _groups.size());
+	return &(_groups[groupID]);
+}
+
 const Common::Array<uint16>& MacVenture::SaveGame::getGlobals() {
 	return _globals;
 }
@@ -107,7 +128,7 @@ void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *
 	GlobalSettings settings = engine->getGlobalSettings();
 	for (int i = 0; i < settings.numGroups; ++i) {
 		AttributeGroup g;
-		for (int j = 0; j < settings.numObjects; ++j) 
+		for (int j = 0; j < settings.numObjects; ++j)
 			g.push_back(res->readUint16BE());
 		
 		_groups.push_back(g);
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 6931996..fe93ef1 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -30,7 +30,8 @@
 namespace MacVenture {
 
 typedef uint32 ObjID;
-typedef Common::Array<uint16> AttributeGroup;
+typedef uint16 Attribute;
+typedef Common::Array<Attribute> AttributeGroup;
 class TextAsset;
 
 enum ObjectAttributeID {
@@ -65,6 +66,7 @@ public:
 	~SaveGame();
 
 	const Common::Array<AttributeGroup> &getGroups();
+	const AttributeGroup *getGroup(uint32 groupID);
 	const Common::Array<uint16> &getGlobals();
 	const Common::String &getText();
 
@@ -89,6 +91,7 @@ public:
 
 private:
 	bool loadStartGameFileName();
+	void calculateObjectRelations();
 
 private:
 	MacVentureEngine *_engine;
@@ -99,6 +102,8 @@ private:
 	SaveGame *_saveGame;
 	Container *_objectConstants;
 	Container *_gameText;
+
+	Common::Array<ObjID> _relations; // Parent-child relations, stored in Williams Heap format
 };
 
 } // End of namespace MacVenture


Commit: 0fc3e909749f3d1af3e617fbcbc83c3f7819c392
    https://github.com/scummvm/scummvm/commit/0fc3e909749f3d1af3e617fbcbc83c3f7819c392
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:45+02:00

Commit Message:
MACVENTURE: Small fixed

Changed paths:
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.h
    engines/macventure/text.cpp
    engines/macventure/text.h



diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 5bf6ccf..4cc40f1 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -27,12 +27,23 @@
 
 namespace MacVenture {
 
-class Image {
+class ImageAsset {
 public:
-	Image();
-	~Image();
+	ImageAsset(ObjID id, Container *container) {
+		_id = id;
+		_container = container;
+	}
+	~ImageAsset() {
 
-	void blit(Graphics::ManagedSurface *target);
+	}
+
+	void blit(Graphics::ManagedSurface *target) {
+		debug("Blitting image %x ", _id);
+	}
+
+private:
+	ObjID _id;
+	Container *_container;
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 2054c5e..da19262 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -59,6 +59,9 @@ MacVentureEngine::~MacVentureEngine() {
 	if (_filenames)
 		delete _filenames;
 
+	if (_decodingArticles)
+		delete _decodingArticles;
+
 	if (_textHuffman)
 		delete _textHuffman;
 }
@@ -84,6 +87,7 @@ Common::Error MacVentureEngine::run() {
 	_oldTextEncoding = !loadTextHuffman();
 
 	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
+	_decodingArticles = new StringTable(this, _resourceManager, kCommonArticlesStringTableID);
 
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 656aeaf..a4340bf 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -192,10 +192,13 @@ private: // Attributes
 	World *_world;
 	ScriptEngine *_scriptEngine;
 
+	// String tables
+	StringTable *_filenames;
+	StringTable *_decodingArticles;
+
 	// Engine state
 	GameState _gameState;
 	GlobalSettings _globalSettings;
-	StringTable *_filenames;
 	HuffmanLists *_textHuffman;
 	bool _oldTextEncoding;
 	bool _paused, _halted, _cmdReady, _prepared;
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 6637692..9814c01 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -24,6 +24,7 @@
 #define MACVENTURE_SCRIPT_H
 
 #include "macventure/macventure.h"
+#include "macventure/container.h"
 
 namespace MacVenture {
 
@@ -47,7 +48,28 @@ enum ControlAction {
 };
 
 typedef uint32 ObjID;
-	
+
+class ScriptAsset {
+public:
+	ScriptAsset(ObjID id, Container *container, MacVentureEngine *engine) {
+		_id = id;
+		_container = container;
+		_engine = engine;
+	}
+	~ScriptAsset() {
+
+	}
+
+	void execute() {
+		debug("SCRIPT: Executing script %x ", _id);
+	}
+
+private:
+	ObjID _id;
+	Container *_container;
+	MacVentureEngine *_engine;
+};
+
 class ScriptEngine {
 public:
 	ScriptEngine() {}
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index adac94b..49df7ed 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -27,8 +27,9 @@ TextAsset::TextAsset(ObjID objid, Container *container, bool isOld, const Huffma
 	_id = objid;
 	_container = container;
 	_huffman = huffman;
+	_isOld = isOld;
 
-	if (isOld) {
+	if (_isOld) {
 		decodeOld();
 	}
 	else {
@@ -99,7 +100,7 @@ void TextAsset::decodeOld() {
 }
 
 void TextAsset::decodeHuffman() {
-	_decoded = Common::String("Huffman string");
+	_decoded = Common::String("");
 	Common::SeekableReadStream *res = _container->getItem(_id);
 	Common::BitStream32BEMSB stream(res);
 	uint16 strLen = 0;
@@ -110,7 +111,6 @@ void TextAsset::decodeHuffman() {
 		strLen = stream.getBits(7);
 	}
 
-	char* str = new char[strLen + 1];
 	uint32 mask = 0;
 	uint32 symbol = 0;
 	char c;
@@ -130,17 +130,22 @@ void TextAsset::decodeHuffman() {
 			c = stream.getBits(7);
 		}
 		else if (symbol == 2) { // Composite
-			warning("Composite huffman strings not implemented");
+			warning("Composite huffman strings not tested");
+			if (stream.getBit()) { // TextID
+				ObjID embedId = stream.getBits(15);
+				TextAsset embedded(embedId, _container, _isOld, _huffman);
+				_decoded += *embedded.decode();
+			} else { //Composite obj string
+				_decoded += Common::String("Unimplemented");
+			}
 		}
 		else { // Plain ascii
 			c = symbol & 0xFF;
 		}
 
-		str[i] = c;
+		_decoded += c;
 	}
-
-	str[strLen] = '\0';
-	debug(7, "Decoded %d'th string (new): %s", _id, str);
-	_decoded = Common::String(str);
+	_decoded += '\0';
+	debug(7, "Decoded %d'th string (new): %s", _id, _decoded.c_str());	
 }
 } // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/text.h b/engines/macventure/text.h
index 3b3af92..cfe76d6 100644
--- a/engines/macventure/text.h
+++ b/engines/macventure/text.h
@@ -46,6 +46,7 @@ private:
 	Container *_container;
 	ObjID _id;
 	const HuffmanLists *_huffman;
+	bool _isOld;
 	
 	Common::String _decoded;
 


Commit: e8725ae068a51fb6ccdfd9f7d2bd4e8e7a12f40a
    https://github.com/scummvm/scummvm/commit/e8725ae068a51fb6ccdfd9f7d2bd4e8e7a12f40a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:47+02:00

Commit Message:
MACVENTURE: Add attribute set function

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index da19262..75f2c33 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -99,6 +99,14 @@ Common::Error MacVentureEngine::run() {
 	_cmdReady = false;
 	_haltedAtEnd = false;
 	_haltedInSelection = false;
+
+	//if !savegame
+	_cmdReady = true;
+	_selectedControl = kStartOrResume;
+	ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
+	_currentSelection.push_back(playerParent);// Push the parent of the player
+	_world->setObjAttr(playerParent, 6, 1);
+
 	_prepared = true;
 	while (!(_gameState == kGameStateQuitting)) {
 		processEvents();
@@ -181,6 +189,10 @@ void MacVentureEngine::preparedToRun() {
 	_prepared = true;
 }
 
+void MacVentureEngine::gameChanged() {
+	_gameChanged = true;
+}
+
 void MacVentureEngine::enqueueObject(ObjID id) {
 	QueuedObject obj;
 	obj.parent = _world->getObjAttr(id, kAttrParentObject);
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index a4340bf..457d685 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -151,6 +151,7 @@ public:
 	void activateCommand(ControlReference id);
 	void refreshReady();
 	void preparedToRun();
+	void gameChanged();
 
 	void enqueueObject(ObjID id);
 
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index abb0c55..feb8c0b 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -46,7 +46,7 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	uint32 res;
 	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
 	if (!(index & 0x80)) { // It's not a constant
-		res = _saveGame->getGroups()[attrID][objID];
+		res = _saveGame->getAttr(objID, index);
 	} else {
 		Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);
 		index &= 0x7F;
@@ -59,6 +59,25 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	return res;
 }
 
+void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
+	if (attrID == kAttrPosX || attrID == kAttrPosY) {}
+		// Round to scale
+	
+	if (attrID == kAttrParentObject) 
+		setParent(objID, value);
+	
+	if (attrID < kAttrOtherDoor)
+		_engine->enqueueObject(objID);
+
+	uint32 idx = _engine->getGlobalSettings().attrIndices[attrID];
+	value <<= _engine->getGlobalSettings().attrShifts[attrID];
+	value &= _engine->getGlobalSettings().attrMasks[attrID];
+	Attribute oldVal = _saveGame->getAttr(objID, idx);
+	oldVal &= ~_engine->getGlobalSettings().attrMasks[attrID];
+	_saveGame->setAttr(idx, objID, (value | oldVal));
+	_engine->gameChanged();
+}
+
 bool MacVenture::World::isObjActive(ObjID obj) {
 	return false;
 }
@@ -94,6 +113,28 @@ void World::calculateObjectRelations() {
 	}
 }
 
+void World::setParent(ObjID child, ObjID newParent) {
+	ObjID old = _saveGame->getAttr(child, kAttrParentObject);
+	if (newParent == child)
+		return;
+
+	ObjID oldNdx = old * 2;
+	old = _relations[oldNdx];
+	while (old != child) {
+		oldNdx = (old * 2) + 1;
+		old = _relations[oldNdx];
+	}
+	_relations[oldNdx] = _relations[(old * 2) + 1];
+	oldNdx = newParent * 2;
+	old = _relations[oldNdx];
+	while (old && old <= child) {
+		oldNdx = (old * 2) + 1;
+		old = _relations[oldNdx];
+	}
+	_relations[child * 2 + 1] = old;
+	_relations[oldNdx] = child;
+}
+
 // SaveGame
 SaveGame::SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	_groups = Common::Array<AttributeGroup>();
@@ -107,6 +148,15 @@ SaveGame::SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 SaveGame::~SaveGame() {
 }
 
+
+Attribute SaveGame::getAttr(ObjID objID, uint32 attrID) {
+	return _groups[attrID][objID];
+}
+
+void SaveGame::setAttr(uint32 attrID, ObjID objID, Attribute value) {
+	_groups[attrID][objID] = value;
+}
+
 const Common::Array<AttributeGroup>& MacVenture::SaveGame::getGroups() {
 	return _groups;
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index fe93ef1..58e9fc5 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -65,6 +65,9 @@ public:
 	SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res);
 	~SaveGame();
 
+	Attribute getAttr(ObjID objID, uint32 attrID);
+	void setAttr(uint32 attrID, ObjID objID, Attribute value);
+
 	const Common::Array<AttributeGroup> &getGroups();
 	const AttributeGroup *getGroup(uint32 groupID);
 	const Common::Array<uint16> &getGlobals();
@@ -87,11 +90,13 @@ public:
 	~World();
 
 	uint32 getObjAttr(ObjID objID, uint32 attrID);
+	void setObjAttr(ObjID objID, uint32 attrID, Attribute value);
 	bool isObjActive(ObjID obj);
 
 private:
 	bool loadStartGameFileName();
 	void calculateObjectRelations();
+	void setParent(ObjID child, ObjID newParent);
 
 private:
 	MacVentureEngine *_engine;


Commit: 9b052d0a973971a50b4f0df918489e0fc6dd9fdb
    https://github.com/scummvm/scummvm/commit/9b052d0a973971a50b4f0df918489e0fc6dd9fdb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:28:47+02:00

Commit Message:
MACVENTURE: Add untested script engine

Changed paths:
  A engines/macventure/script.cpp
    engines/macventure/macventure.cpp
    engines/macventure/module.mk
    engines/macventure/script.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 75f2c33..78884cf 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -92,7 +92,7 @@ Common::Error MacVentureEngine::run() {
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
-	_scriptEngine = new ScriptEngine();
+	_scriptEngine = new ScriptEngine(_world);
 
 	_paused = false;
 	_halted = true;
@@ -233,7 +233,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 	debug(4, "MAIN: Running script engine");
 	if (_haltedAtEnd) {
 		_haltedAtEnd = false;
-		if (_scriptEngine->resume()) {
+		if (_scriptEngine->resume(false)) {
 			_haltedAtEnd = true;
 			return true;
 		}
@@ -242,7 +242,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 
 	if (_haltedInSelection) {
 		_haltedInSelection = false;
-		if (_scriptEngine->resume()) {
+		if (_scriptEngine->resume(false)) {
 			_haltedInSelection = true;
 			return true;
 		}
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 47e0c70..c0dc818 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -5,8 +5,9 @@ MODULE_OBJS := \
 	gui.o \
 	object.o \
 	text.o \
-	macventure.o \
 	world.o \
+	script.o \
+	macventure.o
 
 MODULE_DIRS += \
 	engines/macventure
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
new file mode 100644
index 0000000..7e594f5
--- /dev/null
+++ b/engines/macventure/script.cpp
@@ -0,0 +1,174 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/macventure.h"
+#include "macventure/script.h"
+#include "macventure/world.h"
+#include "macventure/container.h"
+
+namespace MacVenture {	
+	
+ScriptEngine::ScriptEngine(World * world) {
+	_world = world;
+	_scripts = new Container("Shadowgate II/Shadow Filter");
+}
+
+ScriptEngine::~ScriptEngine() {
+	if (_scripts)
+		delete _scripts;
+}
+
+bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta) {
+	//debug(7, "SCRIPT: Running control %d from obj %d into obj %d, at delta (%d, %d)", 
+	//	action, source, destination, delta.x, delta.y);
+
+	EngineFrame frame;
+	frame.action = action;
+	frame.src = source;
+	frame.dest = destination;
+	frame.x = delta.x;
+	frame.y = delta.y;
+	frame.haltedInSaves = false;
+	frame.haltedInFirst = false;
+	frame.haltedInFamily = false;
+	_frames.push_back(frame);
+	debug(7, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
+
+	return resume(true);
+}
+
+bool ScriptEngine::resume(bool execAll) {	
+	debug(7, "SCRIPT: Resume");
+	while (_frames.size()) {
+		bool fail = execFrame(execAll);
+		if (fail) return true;
+	}
+	return false;	
+}
+
+void ScriptEngine::reset() {
+	_frames.clear();
+}
+
+bool ScriptEngine::execFrame(bool execAll) {
+	bool doFirst = execAll;
+	bool doFamily = false;
+	bool fail;
+
+	EngineFrame *frame = &_frames.front();
+
+	// Do first dispatch script (script 0)
+	if (frame->haltedInFirst || doFirst) { // We were stuck or it's the first time
+		frame->haltedInFirst = false;
+		if (doFirst) { fail = loadScript(frame, 0); }
+		else { fail = resumeFunc(frame); }
+		if (fail) {
+			frame->haltedInFirst = true;
+			return true;
+		}
+		doFamily = true;
+		frame->familyIdx = 0;
+	}
+
+	// Do scripts in the family of player (ObjID 1)
+	if (frame->haltedInFamily || doFamily) { // We have to do the family or we were stuck here
+		frame->haltedInFamily = false;
+		Common::Array<ObjID> family = _world->getFamily(_world->getObjAttr(1, kAttrParentObject), false);
+		uint32 i = frame->familyIdx;
+		for (; i < family.size(); i++) {
+			if (doFamily) { fail = loadScript(frame, family[i]); }
+			else { fail = resumeFunc(frame); }
+			if (fail) { // We are stuck, so we don't shift the frame
+				frame->haltedInFamily = true;
+				frame->familyIdx = i;
+				return true;
+			}
+			doFamily = true;
+		}
+	}
+
+	//Handle saves
+	/*
+
+	uint highest;
+	uint high;
+	if (frame->haltedInSaves) {
+	frame->haltedInSaves = false;
+	}
+
+
+	do {
+	highest = 0;
+	for (uint i = 0; i < frame->haltedInSaves.size)
+	}
+	*/
+
+	_frames.remove_at(0);
+	return false;
+}
+
+bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
+	frame->scripts.push_back(ScriptAsset(scriptID, _scripts));
+	return false;
+}
+
+bool ScriptEngine::resumeFunc(EngineFrame * frame) {
+	bool fail = runFunc();
+	if (fail) return fail;
+	frame->scripts.remove_at(0);
+	if (frame->scripts.size())
+		return resumeFunc(frame);
+	return false;
+}
+
+bool ScriptEngine::runFunc() {
+	debug(7, "SCRIPT: I'm running the function");
+	return false;
+}
+
+ScriptAsset::ScriptAsset(ObjID id, Container * container) {	
+	_id = id;
+	_container = container;
+	_ip = 0x0;	
+}
+
+void ScriptAsset::reset() {
+	_ip = 0x0;
+}
+
+uint8 ScriptAsset::fecth() {
+	uint8 ins = _instructions[_ip];
+	_ip++;
+	return ins;
+}
+
+void ScriptAsset::loadInstructions() {
+	uint32 amount = _container->getItemByteSize(_id);
+	Common::SeekableReadStream *res = _container->getItem(_id);
+	for (uint i = 0; i < amount; i++) {
+		_instructions.push_back(res->readByte());
+	}
+	debug(7, "SCRIPT: Load %d instructions for script %d", amount, _id);
+}
+
+} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 9814c01..d66a867 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -23,10 +23,13 @@
 #ifndef MACVENTURE_SCRIPT_H
 #define MACVENTURE_SCRIPT_H
 
-#include "macventure/macventure.h"
 #include "macventure/container.h"
+#include "macventure/world.h"
 
 namespace MacVenture {
+		
+class Container;
+class World;
 
 enum ControlAction {
 	kNoCommand = 0,
@@ -51,42 +54,68 @@ typedef uint32 ObjID;
 
 class ScriptAsset {
 public:
-	ScriptAsset(ObjID id, Container *container, MacVentureEngine *engine) {
-		_id = id;
-		_container = container;
-		_engine = engine;
-	}
-	~ScriptAsset() {
+	ScriptAsset(ObjID id, Container *container); 
+	~ScriptAsset() {}
 
-	}
+	void reset();
+	uint8 fecth(); 
 
-	void execute() {
-		debug("SCRIPT: Executing script %x ", _id);
-	}
+private:
+
+	void loadInstructions();
 
 private:
 	ObjID _id;
 	Container *_container;
-	MacVentureEngine *_engine;
+
+	Common::Array<uint8> _instructions;
+	uint32 _ip; // Instruction pointer
+};
+
+struct EngineState {
+	uint8 stack[0x80];
+	uint8 sp;
+
+	EngineState() {
+		sp = 0x80;
+	}
+};
+
+struct EngineFrame {
+	ControlAction action;
+	ObjID src;
+	ObjID dest;
+	int x;
+	int y;
+	EngineState state;
+	Common::Array<ScriptAsset> scripts;
+	uint32 familyIdx;
+
+	bool haltedInFirst;
+	bool haltedInFamily;
+	bool haltedInSaves;
 };
 
 class ScriptEngine {
 public:
-	ScriptEngine() {}
-	~ScriptEngine() {}
+	ScriptEngine(World *world);
+	~ScriptEngine();
 
-	bool runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta) {
-		debug(7, "SCRIPT: Running control %d from obj %d into obj %d, at delta (%d, %d)", 
-			action, source, destination, delta.x, delta.y);
-		
-		return false;
-	}
+public:
+	bool runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta); 
+	bool resume(bool execAll); 
+	void reset();
 
-	bool resume() {
-		debug(7, "SCRIPT: Resume");
+private:
+	bool execFrame(bool execAll);
+	bool loadScript(EngineFrame * frame, uint32 scriptID);
+	bool resumeFunc(EngineFrame * frame); 
+	bool runFunc(); 
 
-		return false;
-	}
+private:
+	World *_world;
+	Common::Array<EngineFrame> _frames;
+	Container *_scripts;
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index feb8c0b..2cd50ff 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -1,4 +1,5 @@
 #include "macventure/world.h"
+#include "macventure/macventure.h"
 
 #include "common/file.h"
 
@@ -82,6 +83,25 @@ bool MacVenture::World::isObjActive(ObjID obj) {
 	return false;
 }
 
+Common::Array<ObjID> World::getFamily(ObjID objID, bool recursive) {
+	Common::Array<ObjID> res;
+	res.push_back(objID);
+	res.push_back(getChildren(objID, recursive));
+	return res;
+}
+
+Common::Array<ObjID> World::getChildren(ObjID objID, bool recursive) {
+	Common::Array<ObjID> res;
+	ObjID child = _relations[objID * 2];
+	while (child) {
+		res.push_back(child);
+		if (!recursive)
+			res.push_back(getChildren(child, false));
+		child = _relations[child * 2 + 1];
+	}
+	return Common::Array<ObjID>();
+}
+
 bool World::loadStartGameFileName() {
 	Common::SeekableReadStream *res;
 
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 58e9fc5..3893aca 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -23,7 +23,6 @@
 #ifndef MACVENTURE_WORLD_H
 #define MACVENTURE_WORLD_H
 
-#include "macventure/macventure.h"
 #include "macventure/container.h"
 #include "macventure/text.h"
 
@@ -92,6 +91,8 @@ public:
 	uint32 getObjAttr(ObjID objID, uint32 attrID);
 	void setObjAttr(ObjID objID, uint32 attrID, Attribute value);
 	bool isObjActive(ObjID obj);
+	Common::Array<ObjID> getFamily(ObjID objID, bool recursive);
+	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);
 
 private:
 	bool loadStartGameFileName();


Commit: 96f9910c79849c980a09ff733f4710ba9d414dc9
    https://github.com/scummvm/scummvm/commit/96f9910c79849c980a09ff733f4710ba9d414dc9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:29:11+02:00

Commit Message:
MACVENTURE: Add opcodes for script engine

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 78884cf..f2a2f43 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -92,7 +92,7 @@ Common::Error MacVentureEngine::run() {
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
-	_scriptEngine = new ScriptEngine(_world);
+	_scriptEngine = new ScriptEngine(this, _world);
 
 	_paused = false;
 	_halted = true;
@@ -193,6 +193,14 @@ void MacVentureEngine::gameChanged() {
 	_gameChanged = true;
 }
 
+void MacVentureEngine::winGame() {
+	_gameState = kGameStateWinnig;
+}
+
+void MacVentureEngine::loseGame() {
+	_gameState = kGameStateLosing;
+}
+
 void MacVentureEngine::enqueueObject(ObjID id) {
 	QueuedObject obj;
 	obj.parent = _world->getObjAttr(id, kAttrParentObject);
@@ -206,6 +214,13 @@ void MacVentureEngine::enqueueObject(ObjID id) {
 	_objQueue.push_back(obj);
 }
 
+void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text) {
+}
+
+void MacVentureEngine::printTexts() {
+	debug("Printing texts..");
+}
+
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
 	return _globalSettings;
 }
@@ -284,6 +299,9 @@ bool MacVentureEngine::updateState() {
 	return true;
 }
 
+void MacVentureEngine::revert() {
+}
+
 void MacVentureEngine::runObjQueue() {
 
 }
@@ -360,6 +378,10 @@ const HuffmanLists * MacVentureEngine::getDecodingHuffman() const {
 	return _textHuffman;
 }
 
+uint32 MacVentureEngine::randBetween(uint32 min, uint32 max) {
+	return _rnd->getRandomNumber(max - min) + min;
+}
+
 // Data loading
 
 bool MacVentureEngine::loadGlobalSettings() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 457d685..3ae195a 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -124,6 +124,12 @@ enum ObjectQueueID {
 	kAnimateBack = 14
 };
 
+enum TextQueueID {
+	kTextNumber = 1,
+	kTextNewLine = 2,
+	kTextPlain = 3
+};
+
 struct QueuedObject {
 	ObjectQueueID id;
 	ObjID object;
@@ -152,8 +158,17 @@ public:
 	void refreshReady();
 	void preparedToRun();
 	void gameChanged();
+	void winGame();
+	void loseGame();
+
+	bool updateState();
+	void revert();
 
 	void enqueueObject(ObjID id);
+	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
+
+	void runObjQueue();
+	void printTexts();
 
 	// Data retrieval
 	bool isPaused();
@@ -162,14 +177,13 @@ public:
 	Common::String getFilePath(FilePathID id) const;
 	bool isOldText() const;
 	const HuffmanLists *getDecodingHuffman() const;
+	uint32 randBetween(uint32 min, uint32 max);
 
 private:
 	void processEvents();
 
 	bool runScriptEngine();
 	void endGame();
-	bool updateState();
-	void runObjQueue();
 	void updateControls();
 	void resetVars();
 
@@ -181,6 +195,8 @@ private:
 	ControlAction referenceToAction(ControlReference id);
 	uint objectsToApplyCommand();
 
+	const char* getGameFileName() const;
+
 private: // Attributes
 
 	const ADGameDescription *_gameDescription;
@@ -217,10 +233,6 @@ private: // Attributes
 	Common::List<ObjID> _currentSelection;
 	Common::Point _deltaPoint;
 
-private: // Methods
-
-	const char* getGameFileName() const;
-
 };
 
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 7e594f5..b0d5ef0 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -20,6 +20,8 @@
 *
 */
 
+#include "common/system.h"
+
 #include "macventure/macventure.h"
 #include "macventure/script.h"
 #include "macventure/world.h"
@@ -27,7 +29,8 @@
 
 namespace MacVenture {	
 	
-ScriptEngine::ScriptEngine(World * world) {
+ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
+	_engine = engine;
 	_world = world;
 	_scripts = new Container("Shadowgate II/Shadow Filter");
 }
@@ -133,7 +136,7 @@ bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 }
 
 bool ScriptEngine::resumeFunc(EngineFrame * frame) {
-	bool fail = runFunc();
+	bool fail = runFunc(frame);
 	if (fail) return fail;
 	frame->scripts.remove_at(0);
 	if (frame->scripts.size())
@@ -141,11 +144,986 @@ bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 	return false;
 }
 
-bool ScriptEngine::runFunc() {
+bool ScriptEngine::runFunc(EngineFrame *frame) {
 	debug(7, "SCRIPT: I'm running the function");
+	ScriptAsset &script = frame->scripts.front();
+	EngineState *state = &frame->state;
+	byte op;	
+	while (script.hasNext()) {
+		op = script.fetch();
+		if (!(op & 0x80)) {
+			state->push(op);
+		} else {
+			switch (op) {
+			case 0x80: //get attribute
+				op80GATT(state, frame);
+				break;
+			case 0x81: //set attribute
+				op81SATT(state, frame);
+				break;
+			case 0x82: //sum children attribute
+				op82SUCH(state, frame);
+				break;
+			case 0x83: //push selected control
+				op83PUCT(state, frame);
+				break;
+			case 0x84: //push selected object
+				op84PUOB(state, frame);
+				break;
+			case 0x85: //push target
+				op85PUTA(state, frame);
+				break;
+			case 0x86: //push deltax
+				op86PUDX(state, frame);
+				break;
+			case 0x87: //push deltay
+				op87PUDY(state, frame);
+				break;
+			case 0x88: //push immediate.b
+				op88PUIB(state, frame, &script);
+				break;
+			case 0x89: //push immediate
+				op89PUI(state, frame, &script);
+				break;
+			case 0x8a: //get global
+				op8aGGLO(state, frame);
+				break;
+			case 0x8b: //set global
+				op8bSGLO(state, frame);
+				break;
+			case 0x8c: //random
+				op8cRAND(state, frame);
+				break;
+			case 0x8d: //copy
+				op8dCOPY(state, frame);
+				break;
+			case 0x8e: //copyn
+				op8eCOPYN(state, frame);
+				break;
+			case 0x8f: //swap
+				op8fSWAP(state, frame);
+				break;
+			case 0x90: //swapn
+				op90SWAPN(state, frame);
+				break;
+			case 0x91: //pop
+				op91POP(state, frame);
+				break;
+			case 0x92: //copy+1
+				op92COPYP(state, frame);
+				break;
+			case 0x93: //copy+n
+				op93COPYPN(state, frame);
+				break;
+			case 0x94: //shuffle
+				op94SHUFF(state, frame);
+				break;
+			case 0x95: //sort
+				op95SORT(state, frame);
+				break;
+			case 0x96: //clear stack
+				op96CLEAR(state, frame);
+				break;
+			case 0x97: //get stack size
+				op97SIZE(state, frame);
+				break;
+			case 0x98: //add
+				op98ADD(state, frame);
+				break;
+			case 0x99: //subtract
+				op99SUB(state, frame);
+				break;
+			case 0x9a: //multiply
+				op9aMUL(state, frame);
+				break;
+			case 0x9b: //divide
+				op9bDIV(state, frame);
+				break;
+			case 0x9c: //mod
+				op9cMOD(state, frame);
+				break;
+			case 0x9d: //divmod
+				op9dDMOD(state, frame);
+				break;
+			case 0x9e: //abs
+				op9eABS(state, frame);
+				break;
+			case 0x9f: //neg
+				op9fNEG(state, frame);
+				break;
+			case 0xa0: //and
+				opa0AND(state, frame);
+				break;
+			case 0xa1: //or
+				opa1OR(state, frame);
+				break;
+			case 0xa2: //xor
+				opa2XOR(state, frame);
+				break;
+			case 0xa3: //not
+				opa3NOT(state, frame);
+				break;
+			case 0xa4: //logical and
+				opa4LAND(state, frame);
+				break;
+			case 0xa5: //logical or
+				opa5LOR(state, frame);
+				break;
+			case 0xa6: //logical xor
+				opa6LXOR(state, frame);
+				break;
+			case 0xa7: //logical not
+				opa7LNOT(state, frame);
+				break;
+			case 0xa8: //gt? unsigned
+				opa8GTU(state, frame);
+				break;
+			case 0xa9: //lt? unsigned
+				opa9LTU(state, frame);
+				break;
+			case 0xaa: //gt? signed
+				opaaGTS(state, frame);
+				break;
+			case 0xab: //lt? signed
+				opabLTS(state, frame);
+				break;
+			case 0xac: //eq?
+				opacEQ(state, frame);
+				break;
+			case 0xad: //eq string?
+				opadEQS(state, frame);
+				break;
+			case 0xae: //contains
+				opaeCONT(state, frame);
+				break;
+			case 0xaf: //contains word
+				opafCONTW(state, frame);
+				break;
+			case 0xb0: //bra
+				opb0BRA(state, frame, &script);
+				break;
+			case 0xb1: //bra.b
+				opb1BRAB(state, frame, &script);
+				break;
+			case 0xb2: //beq
+				opb2BEQ(state, frame, &script);
+				break;
+			case 0xb3: //beq.b
+				opb3BEQB(state, frame, &script);
+				break;
+			case 0xb4: //bne
+				opb4BNE(state, frame, &script);
+				break;
+			case 0xb5: //bne.b
+				opb5BNEB(state, frame, &script);
+				break;
+			case 0xb6: //call later
+				opb6CLAT(state, frame);
+				break;
+			case 0xb7: //cancel call
+				opb7CCA(state, frame);
+				break;
+			case 0xb8: //cancel low priority
+				opb8CLOW(state, frame);
+				break;
+			case 0xb9: //cancel high priority
+				opb9CHI(state, frame);
+				break;
+			case 0xba: //cancel priority range
+				opbaCRAN(state, frame);
+				break;
+			case 0xbb: //fork				
+				opbbFORK(state, frame);
+				break;
+			case 0xbc: //call
+				opbcCALL(state, frame, &script);
+				break;
+			case 0xbd: //focus object
+				opbdFOOB(state, frame);
+				break;
+			case 0xbe: //swap objects
+				opbeSWOB(state, frame);
+				break;
+			case 0xbf: //snap object
+				opbfSNOB(state, frame);
+				break;
+			case 0xc0: //toggle exits
+				opc0TEXI(state, frame);
+				break;
+			case 0xc1: //print text
+				opc1PTXT(state, frame);
+				break;
+			case 0xc2: //print newline
+				opc2PNEW(state, frame);
+				break;
+			case 0xc3: //print text+nl
+				opc3PTNE(state, frame);
+				break;
+			case 0xc4: //print nl+text+nl
+				opc4PNTN(state, frame);
+				break;
+			case 0xc5: //print number
+				opc5PNUM(state, frame);
+				break;
+			case 0xc6: //push 2
+				opc6P2(state, frame);
+				break;
+			case 0xc7: //play sound in background
+				opc7PLBG(state, frame);
+				break;
+			case 0xc8: //play sound and wait
+				opc8PLAW(state, frame);
+				break;
+			case 0xc9: //wait for sound to finish?
+				opc9WAIT(state, frame);
+				break;
+			case 0xca: //get current time
+				opcaTIME(state, frame);
+				break;
+			case 0xcb: //get current day
+				opcbDAY(state, frame);
+				break;
+			case 0xcc: //get children
+				opccCHLD(state, frame);
+				break;
+			case 0xcd: //get num children
+				opcdNCHLD(state, frame);
+				break;
+			case 0xce: //get engine version
+				opceVERS(state, frame);
+				break;
+			case 0xcf: //push scenario number
+				opcfPSCE(state, frame);
+				break;
+			case 0xd0: //push 1
+				opd0P1(state, frame);
+				break;
+			case 0xd1: //get object dimensions
+				opd1GOBD(state, frame);
+				break;
+			case 0xd2: //get overlap percent
+				opd2GOVP(state, frame);
+				break;
+			case 0xd3: //capture children
+				opd3CAPC(state, frame);
+				break;
+			case 0xd4: //release children
+				opd4RELC(state, frame);
+				break;
+			case 0xd5: //show speech dialog
+				opd5DLOG(state, frame);
+				return true;
+			case 0xd6: //activate command
+				opd6ACMD(state, frame);
+				break;
+			case 0xd7: //lose game
+				opd7LOSE(state, frame);
+				break;
+			case 0xd8: //win game
+				opd8WIN(state, frame);
+				break;
+			case 0xd9: //sleep
+				opd9SLEEP(state, frame);
+				return true;
+			case 0xda: //click to continue
+				opdaCLICK(state, frame);
+				return true;
+			case 0xdb: //run queue
+				opdbROBQ(state, frame);
+				break;
+			case 0xdc: //run sound queue
+				opdcRSQ(state, frame);
+				break;
+			case 0xdd: //run text queue
+				opddRTQ(state, frame);
+				break;
+			case 0xde: //update screen
+				opdeUPSC(state, frame);
+				break;
+			case 0xdf: //flash main window
+				opdfFMAI(state, frame);
+				return true;
+			case 0xe0: //cache graphic and object
+				ope0CHGR(state, frame);
+				break;
+			case 0xe1: //cache sound
+				ope1CHSO(state, frame);
+				break;
+			case 0xe2: //muldiv
+				ope2MDIV(state, frame);
+				break;
+			case 0xe3: //update object
+				ope3UPOB(state, frame);
+				break;
+			case 0xe4: //currently playing event?
+				ope4PLEV(state, frame);
+				break;
+			case 0xe5: //wait for event to finish
+				ope5WEV(state, frame);
+				break;
+			case 0xe6: //get fibonacci (joke)
+				ope6GFIB(state, frame);
+				break;
+			case 0xe7: //calc fibonacci
+				ope7CFIB(state, frame);
+				break;
+			default:
+				op00NOOP(op);
+			}
+		}
+	}
 	return false;
 }
 
+word ScriptEngine::neg16(word val) {
+	if (val & 0x8000)
+		val = -((val ^ 0xFFFF) + 1);
+	return val;
+}
+
+word ScriptEngine::neg8(word val) {
+	if (val & 0x80)
+		val = -((val ^ 0xff) + 1);
+	return val;
+}
+
+word ScriptEngine::sumChildrenAttr(word obj, word attr, bool recursive) {
+	word sum = 0;
+	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
+	for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
+		sum += _world->getObjAttr(*it, attr);
+	}
+	return sum;
+}
+
+void MacVenture::ScriptEngine::op80GATT(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	word attr = state->pop();
+	state->push(_world->getObjAttr(obj, attr));
+}
+
+void ScriptEngine::op81SATT(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	word attr = state->pop();
+	word val = neg16(state->pop());
+	_world->setObjAttr(obj, attr, val);
+}
+
+void ScriptEngine::op82SUCH(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	word attr = state->pop();
+	word recursive = neg16(state->pop());
+	state->push(sumChildrenAttr(obj, attr, recursive));
+}
+
+void ScriptEngine::op83PUCT(EngineState * state, EngineFrame * frame) {
+	state->push(frame->action);
+}
+
+void ScriptEngine::op84PUOB(EngineState * state, EngineFrame * frame) {
+	state->push(frame->src);
+}
+
+void ScriptEngine::op85PUTA(EngineState * state, EngineFrame * frame) {
+	state->push(frame->dest);
+}
+
+void ScriptEngine::op86PUDX(EngineState * state, EngineFrame * frame) {
+	state->push(frame->x);
+}
+
+void ScriptEngine::op87PUDY(EngineState * state, EngineFrame * frame) {
+	state->push(frame->y);
+}
+
+void ScriptEngine::op88PUIB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	state->push(asset->fetch());
+}
+
+void ScriptEngine::op89PUI(EngineState * state, EngineFrame * frame, ScriptAsset * asset) {
+	word val = asset->fetch();
+	val <<= 8;
+	val = val | asset->fetch();
+	state->push(val);
+}
+
+void ScriptEngine::op8aGGLO(EngineState * state, EngineFrame * frame) {
+	word idx = state->pop();
+	state->push(_world->getGlobal(idx));
+}
+
+void ScriptEngine::op8bSGLO(EngineState * state, EngineFrame * frame) {
+	word idx = state->pop();
+	word val = neg16(state->pop());
+	_world->setGlobal(idx, val);
+	_engine->gameChanged();
+}
+
+void ScriptEngine::op8cRAND(EngineState * state, EngineFrame * frame) {
+	word max = state->pop();
+	state->push(_engine->randBetween(0, max));
+}
+
+void ScriptEngine::op8dCOPY(EngineState * state, EngineFrame * frame) {
+	word val = state->pop();
+	state->push(val);
+	state->push(val);
+}
+
+void ScriptEngine::op8eCOPYN(EngineState * state, EngineFrame * frame) {
+	word n = state->pop();
+	word offs = n - 1;
+	word val;
+	while (n) {
+		val = state->peek(offs);
+		state->push(val);
+	}
+}
+
+void ScriptEngine::op8fSWAP(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(b);
+	state->push(a);
+}
+
+void ScriptEngine::op90SWAPN(EngineState * state, EngineFrame * frame) {
+	word idx = state->pop();
+	word a = state->peek(idx);
+	word b = state->peek(0);
+	state->poke(idx, b);
+	state->poke(0, a);
+}
+
+void ScriptEngine::op91POP(EngineState * state, EngineFrame * frame) {
+	state->pop();
+}
+
+void ScriptEngine::op92COPYP(EngineState * state, EngineFrame * frame) {
+	word val = state->peek(1);
+	state->push(val);
+}
+
+void ScriptEngine::op93COPYPN(EngineState * state, EngineFrame * frame) {
+	word idx = state->pop();
+	word val = state->peek(idx);
+	state->push(val);
+}
+
+void ScriptEngine::op94SHUFF(EngineState * state, EngineFrame * frame) {
+	word a = state->pop();
+	word b = state->pop();
+	word c = state->pop();
+	state->push(a);
+	state->push(c);
+	state->push(b);
+}
+
+void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
+	word step = neg16(state->pop());
+	word num = neg16(state->pop());
+	step %= num;
+	if (step<0) step += num;
+	word end = 0;
+	word start = 0;
+	for (word i = 1;i<num;i++)
+	{
+		start += step;
+		if (start >= num) start -= num;
+		if (start == end)
+		{
+			end++;
+			start = end;
+		}
+		else
+		{
+			word a = state->peek(end);
+			word b = state->peek(start);
+			state->poke(end, b);
+			state->poke(start, a);
+		}
+	}
+}
+
+void ScriptEngine::op96CLEAR(EngineState * state, EngineFrame * frame) {
+	state->clear();
+}
+
+void ScriptEngine::op97SIZE(EngineState * state, EngineFrame * frame) {
+	state->push(state->size());
+}
+
+void ScriptEngine::op98ADD(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a + b);
+}
+
+void ScriptEngine::op99SUB(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a - b);
+}
+
+void ScriptEngine::op9aMUL(EngineState * state, EngineFrame * frame) {
+	int16 b = state->pop();
+	int16 a = state->pop();
+	state->push(a * b);
+}
+
+void ScriptEngine::op9bDIV(EngineState * state, EngineFrame * frame) {
+	int16 b = state->pop();
+	int16 a = state->pop();
+	state->push((a / b) | 0);
+}
+
+void ScriptEngine::op9cMOD(EngineState * state, EngineFrame * frame) {
+	int16 b = state->pop();
+	int16 a = state->pop();
+	state->push(a % b);
+}
+
+void ScriptEngine::op9dDMOD(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a % b);
+	state->push((a / b) | 0);
+}
+
+void ScriptEngine::op9eABS(EngineState * state, EngineFrame * frame) {
+	word val = neg16(state->pop());
+	if (val<0) val = -val;
+	state->push(val);
+}
+
+void ScriptEngine::op9fNEG(EngineState * state, EngineFrame * frame) {
+	word val = -neg16(state->pop());
+	state->push(val);
+}
+
+void ScriptEngine::opa0AND(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a & b);
+}
+
+void ScriptEngine::opa1OR(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a | b);
+}
+
+void ScriptEngine::opa2XOR(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push(a ^ b);
+}
+
+void ScriptEngine::opa3NOT(EngineState * state, EngineFrame * frame) {
+	word a = state->pop();
+	state->push(a ^ 0xFFFF);
+}
+
+void ScriptEngine::opa4LAND(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push((a && b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opa5LOR(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push((a || b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opa6LXOR(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push((!a != !b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opa7LNOT(EngineState * state, EngineFrame * frame) {
+	word a = state->pop();
+	state->push((a == 0) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opa8GTU(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push((a > b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opa9LTU(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	state->push((a < b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opaaGTS(EngineState * state, EngineFrame * frame) {
+	word b = neg16(state->pop());
+	word a = neg16(state->pop());
+	state->push((a > b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opabLTS(EngineState * state, EngineFrame * frame) {
+	word b = neg16(state->pop());
+	word a = neg16(state->pop());
+	state->push((a < b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opacEQ(EngineState * state, EngineFrame * frame) {
+	word b = neg16(state->pop());
+	word a = neg16(state->pop());
+	state->push((a == b) ? 0xFFFF : 0);
+}
+
+void ScriptEngine::opadEQS(EngineState * state, EngineFrame * frame) {
+	Common::String b = _world->getText(state->pop());
+	Common::String a = _world->getText(state->pop());
+	state->push((a == b) ? 1 : 0);
+}
+
+void ScriptEngine::opaeCONT(EngineState * state, EngineFrame * frame) {
+	Common::String needle = _world->getText(state->pop());
+	Common::String haystack = _world->getText(state->pop());
+	haystack.toLowercase();
+	state->push(haystack.contains(needle) ? 1 : 0);
+}
+
+void ScriptEngine::opafCONTW(EngineState * state, EngineFrame * frame) {
+	Common::String needle = _world->getText(state->pop());
+	Common::String haystack = _world->getText(state->pop());
+	haystack.toLowercase();
+	state->push(haystack.contains(needle) ? 1 : 0);
+}
+
+void ScriptEngine::opb0BRA(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val <<= 8;
+	val = val | asset->fetch();
+	val = neg16(val);
+	asset->branch(val);
+}
+
+void ScriptEngine::opb1BRAB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val = neg8(val);
+	asset->branch(val);
+}
+
+void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val <<= 8;
+	val = val | asset->fetch();
+	val = neg16(val);
+	word b = state->pop();
+	if (b != 0) asset->branch(val);
+}
+
+void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val = neg8(val);
+	word b = state->pop();
+	if (b != 0) asset->branch(val);
+}
+
+void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val <<= 8;
+	val = val | asset->fetch();
+	val = neg16(val);
+	word b = state->pop();
+	if (b == 0) asset->branch(val);
+}
+
+void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
+	word val = asset->fetch();
+	val = neg8(val);
+	word b = state->pop();
+	if (b == 0) asset->branch(val);
+}
+
+void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
+	word rank = state->pop();
+	word func = state->pop();
+	frame->saves.push_back(FunCall(rank, func));
+}
+
+void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
+	word func = state->pop();
+	for (int i = 0; i < frame->saves.size(); i++) {
+		if (frame->saves[i].func == func)
+			frame->saves[i].rank = 0;
+	}
+}
+
+void ScriptEngine::opb8CLOW(EngineState * state, EngineFrame * frame) {
+	word hi = state->pop();
+	for (int i = 0;i<frame->saves.size();i++)
+		if (frame->saves[i].rank <= hi)
+			frame->saves[i].rank = 0;
+}
+
+void ScriptEngine::opb9CHI(EngineState * state, EngineFrame * frame) {
+	word lo = state->pop();
+	for (int i = 0;i<frame->saves.size();i++)
+		if (frame->saves[i].rank >= lo)
+			frame->saves[i].rank = 0;
+}
+
+void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
+	word hi = state->pop();
+	word lo = state->pop();
+	for (int i = 0;i<frame->saves.size();i++)
+		if (frame->saves[i].rank >= lo &&
+			frame->saves[i].rank <= hi)
+			frame->saves[i].rank = 0;
+}
+
+void ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
+	EngineFrame newframe;
+	newframe.action = (ControlAction)state->pop();
+	newframe.src = state->pop();
+	newframe.dest = state->pop();
+	newframe.x = state->pop();
+	newframe.y = state->pop();
+	_frames.push_back(newframe);
+}
+
+void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word id = state->pop();
+	ScriptAsset newfun = ScriptAsset(id, _scripts);
+	frame->scripts.remove_at(0);
+	frame->scripts.insert_at(0, newfun);
+	script = &frame->scripts.front();
+}
+
+void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	_engine->enqueueObject(obj);
+}
+
+void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xbe);
+}
+
+void ScriptEngine::opbfSNOB(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xbf);
+}
+
+void ScriptEngine::opc0TEXI(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xc0);
+}
+
+void ScriptEngine::opc1PTXT(EngineState * state, EngineFrame * frame) {
+	word tid = state->pop();
+	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
+}
+
+void ScriptEngine::opc2PNEW(EngineState * state, EngineFrame * frame) {
+	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
+}
+
+void ScriptEngine::opc3PTNE(EngineState * state, EngineFrame * frame) {
+	word tid = state->pop();
+	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
+	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
+}
+
+void ScriptEngine::opc4PNTN(EngineState * state, EngineFrame * frame) {
+	word tid = state->pop();
+	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
+	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
+	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
+}
+
+void ScriptEngine::opc5PNUM(EngineState * state, EngineFrame * frame) {
+	word tid = state->pop();
+	_engine->enqueueText(kTextNumber, frame->dest, frame->src, tid);
+}
+
+void ScriptEngine::opc6P2(EngineState * state, EngineFrame * frame) {
+	state->push(2);
+}
+
+void ScriptEngine::opc7PLBG(EngineState * state, EngineFrame * frame) {
+	state->pop();
+	op00NOOP(0xc7);
+}
+
+void ScriptEngine::opc8PLAW(EngineState * state, EngineFrame * frame) {
+	state->pop();
+	op00NOOP(0xc8);
+}
+
+void ScriptEngine::opc9WAIT(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xc9);
+}
+
+void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
+	for (int i = 0; i < 6; i++) // Dummy
+		state->push(0x00);
+	op00NOOP(0xca);
+}
+
+void ScriptEngine::opcbDAY(EngineState * state, EngineFrame * frame) {
+	state->push(9);
+}
+
+void ScriptEngine::opccCHLD(EngineState * state, EngineFrame * frame) {
+	bool recursive = state->pop() != 0;
+	word obj = state->pop();
+	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
+	for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
+		state->push(*it);
+	}
+	state->push(children.size());
+}
+
+void ScriptEngine::opcdNCHLD(EngineState * state, EngineFrame * frame) {
+	bool recursive = state->pop() != 0;
+	word obj = state->pop();
+	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
+	state->push(children.size());
+}
+
+void ScriptEngine::opceVERS(EngineState * state, EngineFrame * frame) {
+	state->push(86);
+}
+
+void ScriptEngine::opcfPSCE(EngineState * state, EngineFrame * frame) {
+	state->push(0); //Not release
+}
+
+void ScriptEngine::opd0P1(EngineState * state, EngineFrame * frame) {
+	state->push(1);
+}
+
+void ScriptEngine::opd1GOBD(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	Common::Rect bounds(0, 0, 1, 1); //= _world->getObjBounds(obj);
+	state->push(bounds.width());
+	state->push(bounds.height());
+}
+
+void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) { 
+	word b = state->pop();
+	word a = state->pop();
+	state->push(0);//_world->getOverlapPercent(b, a));
+}
+
+void ScriptEngine::opd3CAPC(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	_world->captureChildren(obj);
+}
+
+void ScriptEngine::opd4RELC(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	_world->releaseChildren(obj);
+}
+
+void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
+	word txt = state->pop();
+	op00NOOP(0xd5);
+}
+
+void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
+	_engine->activateCommand((ControlReference)state->pop());
+}
+
+void ScriptEngine::opd7LOSE(EngineState * state, EngineFrame * frame) {
+	_engine->loseGame();
+}
+
+void ScriptEngine::opd8WIN(EngineState * state, EngineFrame * frame) {
+	_engine->winGame();
+}
+
+void ScriptEngine::opd9SLEEP(EngineState * state, EngineFrame * frame) {
+	word ticks = state->pop();
+	g_system->delayMillis((ticks / 60) * 1000);
+	_engine->preparedToRun();
+}
+
+void ScriptEngine::opdaCLICK(EngineState * state, EngineFrame * frame) {
+	//_engine->updateScreen(false);
+	//clickToContinue();
+	op00NOOP(0xda);
+}
+
+void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
+	_engine->runObjQueue();
+}
+
+void ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xdc);
+}
+
+void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
+	_engine->printTexts();
+}
+
+void ScriptEngine::opdeUPSC(EngineState * state, EngineFrame * frame) {
+	//_engine->updateScreen(false);
+	op00NOOP(0xde);
+}
+
+void ScriptEngine::opdfFMAI(EngineState * state, EngineFrame * frame) {
+	word ticks = state->pop();
+	g_system->delayMillis((ticks / 60) * 1000);
+	_engine->revert();
+}
+
+void ScriptEngine::ope0CHGR(EngineState * state, EngineFrame * frame) {
+	word txt = state->pop();
+	op00NOOP(0xe0);
+}
+
+void ScriptEngine::ope1CHSO(EngineState * state, EngineFrame * frame) {
+	word txt = state->pop();
+	op00NOOP(0xe1);
+}
+
+void ScriptEngine::ope2MDIV(EngineState * state, EngineFrame * frame) {
+	word b = state->pop();
+	word a = state->pop();
+	a *= b;
+	word c = state->pop();
+	a /= c;
+	state->push(a | 0);
+}
+
+void ScriptEngine::ope3UPOB(EngineState * state, EngineFrame * frame) {
+	word obj = state->pop();
+	_world->updateObj(obj);
+}
+
+void ScriptEngine::ope4PLEV(EngineState * state, EngineFrame * frame) {
+	state->push(0);
+	op00NOOP(0xe4);
+}
+
+void ScriptEngine::ope5WEV(EngineState * state, EngineFrame * frame) {
+	op00NOOP(0xe5);
+}
+
+void ScriptEngine::ope6GFIB(EngineState * state, EngineFrame * frame) {
+	state->push(0);
+	op00NOOP(0xe6);
+}
+
+void ScriptEngine::ope7CFIB(EngineState * state, EngineFrame * frame) {
+	state->pop();
+	op00NOOP(0xe7);
+}
+
+void ScriptEngine::op00NOOP(byte op) {
+	debug("SCRIPT: Opcode not implemented => %x", op);
+}
+
+
+
+
 ScriptAsset::ScriptAsset(ObjID id, Container * container) {	
 	_id = id;
 	_container = container;
@@ -156,12 +1134,20 @@ void ScriptAsset::reset() {
 	_ip = 0x0;
 }
 
-uint8 ScriptAsset::fecth() {
+uint8 ScriptAsset::fetch() {
 	uint8 ins = _instructions[_ip];
 	_ip++;
 	return ins;
 }
 
+bool ScriptAsset::hasNext() {
+	return _ip < _instructions.size();
+}
+
+void ScriptAsset::branch(word amount) {
+	_ip += amount;
+}
+
 void ScriptAsset::loadInstructions() {
 	uint32 amount = _container->getItemByteSize(_id);
 	Common::SeekableReadStream *res = _container->getItem(_id);
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index d66a867..e56c6e7 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -51,6 +51,7 @@ enum ControlAction {
 };
 
 typedef uint32 ObjID;
+typedef int16 word;
 
 class ScriptAsset {
 public:
@@ -58,7 +59,9 @@ public:
 	~ScriptAsset() {}
 
 	void reset();
-	uint8 fecth(); 
+	uint8 fetch(); 
+	bool hasNext();
+	void branch(word amount);
 
 private:
 
@@ -72,13 +75,61 @@ private:
 	uint32 _ip; // Instruction pointer
 };
 
-struct EngineState {
-	uint8 stack[0x80];
-	uint8 sp;
-
+class EngineState {
+public:
 	EngineState() {
+		clear();
+	}
+
+	void push(word data) {
+		stack[sp] = unneg16(data);
+		sp--;
+	}
+
+	word pop() {
+		byte v = stack[sp];
+		sp++;
+		return v;
+	}
+
+	word peek(word off) {
+		return stack[sp + off];
+	}
+
+	void poke(word off, word val) {
+		stack[sp + off] = unneg16(val);
+	}
+
+	void clear() {
 		sp = 0x80;
 	}
+
+	word size() {
+		return 0x80 - sp;
+	}
+
+private:
+	word unneg16(word data) {
+		if (data < 0) 
+			data = ((-data) ^ 0xFFFF) + 1;
+
+		return data;
+	}
+
+private:
+
+	word stack[0x80];
+	word sp;
+};
+
+struct FunCall {
+	word func;
+	word rank;
+
+	FunCall(word f, word r) {
+		func = f;
+		rank = r;
+	}
 };
 
 struct EngineFrame {
@@ -89,6 +140,7 @@ struct EngineFrame {
 	int y;
 	EngineState state;
 	Common::Array<ScriptAsset> scripts;
+	Common::Array<FunCall> saves;
 	uint32 familyIdx;
 
 	bool haltedInFirst;
@@ -98,7 +150,7 @@ struct EngineFrame {
 
 class ScriptEngine {
 public:
-	ScriptEngine(World *world);
+	ScriptEngine(MacVentureEngine *engine, World *world);
 	~ScriptEngine();
 
 public:
@@ -110,9 +162,131 @@ private:
 	bool execFrame(bool execAll);
 	bool loadScript(EngineFrame * frame, uint32 scriptID);
 	bool resumeFunc(EngineFrame * frame); 
-	bool runFunc(); 
+	bool runFunc(EngineFrame * frame);
+
+private: 
+
+	// Aux
+	word neg16(word val);
+	word neg8(word val);
+	word sumChildrenAttr(word obj, word attr, bool recursive);
+
+	// Opcodes
+	void op80GATT(EngineState *state, EngineFrame *frame);	//get attribute
+	void op81SATT(EngineState *state, EngineFrame *frame);	//set attribute
+	void op82SUCH(EngineState *state, EngineFrame *frame);	//sum children attribute
+	void op83PUCT(EngineState *state, EngineFrame *frame);	//push selected control
+	void op84PUOB(EngineState *state, EngineFrame *frame);	//push selected object
+	void op85PUTA(EngineState *state, EngineFrame *frame);	//push target
+	void op86PUDX(EngineState *state, EngineFrame *frame);	//push deltax
+	void op87PUDY(EngineState *state, EngineFrame *frame);	//push deltay
+	void op88PUIB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);//push immediate.b
+	void op89PUI(EngineState *state, EngineFrame *frame, ScriptAsset *asset);//push immediate
+	void op8aGGLO(EngineState *state, EngineFrame *frame);	//get global
+	void op8bSGLO(EngineState *state, EngineFrame *frame);	//set global
+	void op8cRAND(EngineState *state, EngineFrame *frame);	//random
+	void op8dCOPY(EngineState *state, EngineFrame *frame);	//copy
+	void op8eCOPYN(EngineState *state, EngineFrame *frame);	//copyn
+	void op8fSWAP(EngineState *state, EngineFrame *frame);	//swap
+
+	void op90SWAPN(EngineState *state, EngineFrame *frame);	//swapn
+	void op91POP(EngineState *state, EngineFrame *frame);	//pop
+	void op92COPYP(EngineState *state, EngineFrame *frame);	//copy+1
+	void op93COPYPN(EngineState *state, EngineFrame *frame);//copy+n
+	void op94SHUFF(EngineState *state, EngineFrame *frame);	//shuffle
+	void op95SORT(EngineState *state, EngineFrame *frame);	//sort
+	void op96CLEAR(EngineState *state, EngineFrame *frame);	//clear stack
+	void op97SIZE(EngineState *state, EngineFrame *frame);	//get stack size
+	void op98ADD(EngineState *state, EngineFrame *frame);	//add
+	void op99SUB(EngineState *state, EngineFrame *frame);	//subtract
+	void op9aMUL(EngineState *state, EngineFrame *frame);	//multiply
+	void op9bDIV(EngineState *state, EngineFrame *frame);	//divide
+	void op9cMOD(EngineState *state, EngineFrame *frame);	//mod
+	void op9dDMOD(EngineState *state, EngineFrame *frame);	//divmod
+	void op9eABS(EngineState *state, EngineFrame *frame);	//abs
+	void op9fNEG(EngineState *state, EngineFrame *frame);	//neg
+
+	void opa0AND(EngineState *state, EngineFrame *frame);	//and
+	void opa1OR(EngineState *state, EngineFrame *frame);	//or
+	void opa2XOR(EngineState *state, EngineFrame *frame);	//xor
+	void opa3NOT(EngineState *state, EngineFrame *frame);	//not
+	void opa4LAND(EngineState *state, EngineFrame *frame);	//logical and
+	void opa5LOR(EngineState *state, EngineFrame *frame);	//logical or
+	void opa6LXOR(EngineState *state, EngineFrame *frame);	//logical xor
+	void opa7LNOT(EngineState *state, EngineFrame *frame);	//logical not
+	void opa8GTU(EngineState *state, EngineFrame *frame);	//gt? unsigned
+	void opa9LTU(EngineState *state, EngineFrame *frame);	//lt? unsigned
+	void opaaGTS(EngineState *state, EngineFrame *frame);	//gt? signed
+	void opabLTS(EngineState *state, EngineFrame *frame);	//lt? signed
+	void opacEQ(EngineState *state, EngineFrame *frame);	//eq?
+	void opadEQS(EngineState *state, EngineFrame *frame);	//eq string?
+	void opaeCONT(EngineState *state, EngineFrame *frame);	//contains
+	void opafCONTW(EngineState *state, EngineFrame *frame); //contains word	
+
+	void opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bra
+	void opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bra.b
+	void opb2BEQ(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//beq
+	void opb3BEQB(EngineState *state, EngineFrame *frame, ScriptAsset *asset); //beq.b
+	void opb4BNE(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bne
+	void opb5BNEB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bne.b
+	void opb6CLAT(EngineState *state, EngineFrame *frame);	//call later
+	void opb7CCA(EngineState *state, EngineFrame *frame);	//cancel call
+	void opb8CLOW(EngineState *state, EngineFrame *frame);	//cancel low priority
+	void opb9CHI(EngineState *state, EngineFrame *frame);	//cancel high priority
+	void opbaCRAN(EngineState *state, EngineFrame *frame);	//cancel priority range
+	void opbbFORK(EngineState *state, EngineFrame *frame);	//fork
+	void opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//call
+	void opbdFOOB(EngineState *state, EngineFrame *frame);	//focus object
+	void opbeSWOB(EngineState *state, EngineFrame *frame);	//swap objects
+	void opbfSNOB(EngineState *state, EngineFrame *frame);	//snap object
+
+	void opc0TEXI(EngineState *state, EngineFrame *frame);	//toggle exits
+	void opc1PTXT(EngineState *state, EngineFrame *frame);	//print text
+	void opc2PNEW(EngineState *state, EngineFrame *frame);	//print newline
+	void opc3PTNE(EngineState *state, EngineFrame *frame);	//print text+nl
+	void opc4PNTN(EngineState *state, EngineFrame *frame);	//print nl+text+nl
+	void opc5PNUM(EngineState *state, EngineFrame *frame);	//print number
+	void opc6P2(EngineState *state, EngineFrame *frame);	//push 2
+	void opc7PLBG(EngineState *state, EngineFrame *frame);	//play sound in background
+	void opc8PLAW(EngineState *state, EngineFrame *frame);	//play sound and wait
+	void opc9WAIT(EngineState *state, EngineFrame *frame);	//wait for sound to finish?
+	void opcaTIME(EngineState *state, EngineFrame *frame);	//get current time
+	void opcbDAY(EngineState *state, EngineFrame *frame);	//get current day
+	void opccCHLD(EngineState *state, EngineFrame *frame);	//get children
+	void opcdNCHLD(EngineState *state, EngineFrame *frame); //get num children
+	void opceVERS(EngineState *state, EngineFrame *frame);	//get engine version
+	void opcfPSCE(EngineState *state, EngineFrame *frame);	//push scenario number
+
+	void opd0P1(EngineState *state, EngineFrame *frame);	//push 1
+	void opd1GOBD(EngineState *state, EngineFrame *frame);	//get object dimensions
+	void opd2GOVP(EngineState *state, EngineFrame *frame);	//get overlap percent
+	void opd3CAPC(EngineState *state, EngineFrame *frame);	//capture children
+	void opd4RELC(EngineState *state, EngineFrame *frame);	//release children
+	void opd5DLOG(EngineState *state, EngineFrame *frame);	//show speech dialog
+	void opd6ACMD(EngineState *state, EngineFrame *frame);	//activate command
+	void opd7LOSE(EngineState *state, EngineFrame *frame);	//lose game
+	void opd8WIN(EngineState *state, EngineFrame *frame);	//win game
+	void opd9SLEEP(EngineState *state, EngineFrame *frame);	//sleep
+	void opdaCLICK(EngineState *state, EngineFrame *frame);	//click to continue
+	void opdbROBQ(EngineState *state, EngineFrame *frame);	//run queue
+	void opdcRSQ(EngineState *state, EngineFrame *frame);	//run sound queue
+	void opddRTQ(EngineState *state, EngineFrame *frame);	//run text queue
+	void opdeUPSC(EngineState *state, EngineFrame *frame);	//update screen
+	void opdfFMAI(EngineState *state, EngineFrame *frame);	//flash main window
+
+	void ope0CHGR(EngineState *state, EngineFrame *frame);	//cache graphic and object
+	void ope1CHSO(EngineState *state, EngineFrame *frame);	//cache sound
+	void ope2MDIV(EngineState *state, EngineFrame *frame);	//muldiv
+	void ope3UPOB(EngineState *state, EngineFrame *frame);	//update object
+	void ope4PLEV(EngineState *state, EngineFrame *frame);	//currently playing event?
+	void ope5WEV(EngineState *state, EngineFrame *frame);	//wait for event to finish
+	void ope6GFIB(EngineState *state, EngineFrame *frame);	//get fibonacci (joke)
+	void ope7CFIB(EngineState *state, EngineFrame *frame);	//calc fibonacci
+
+	void op00NOOP(byte op);
 
 private:
+	MacVentureEngine *_engine;
 	World *_world;
 	Common::Array<EngineFrame> _frames;
 	Container *_scripts;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 2cd50ff..2f603c5 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -102,6 +102,56 @@ Common::Array<ObjID> World::getChildren(ObjID objID, bool recursive) {
 	return Common::Array<ObjID>();
 }
 
+WindowReference World::getObjWindow(ObjID objID) {
+	switch (objID) {
+	case 0xfffc: return kExitsWindow;
+	case 0xfffd: return kSelfWindow;
+	case 0xfffe: return kOutConsoleWindow;
+	case 0xffff: return kCommandsWindow;
+	}
+
+	return findObjWindow(objID);
+}
+
+WindowReference World::findObjWindow(ObjID objID) {
+	return kMainGameWindow;
+}
+
+Attribute World::getGlobal(uint32 attrID) {
+	return _saveGame->getGlobals()[attrID];
+}
+
+void World::setGlobal(uint32 attrID, Attribute value) {
+	_saveGame->setGlobal(attrID, value);
+}
+
+void World::updateObj(ObjID objID) {
+	WindowReference win;
+	if (getObjAttr(1, kAttrParentObject) == objID) {
+		win = kMainGameWindow;
+	} else {
+		win = getObjWindow(objID);
+	}
+	if (win) {
+		//focusObjWin(objID);
+		_engine->runObjQueue();
+		//_engine->updateWindow(win);
+	}
+}
+
+void World::captureChildren(ObjID objID) {
+}
+
+void World::releaseChildren(ObjID objID) {
+}
+
+Common::String World::getText(ObjID objID) {
+	TextAsset text = TextAsset(objID, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
+	
+	return *text.decode();
+}
+
+
 bool World::loadStartGameFileName() {
 	Common::SeekableReadStream *res;
 
@@ -186,6 +236,10 @@ const AttributeGroup * SaveGame::getGroup(uint32 groupID) {
 	return &(_groups[groupID]);
 }
 
+void SaveGame::setGlobal(uint32 attrID, Attribute value) {
+	_globals[attrID] = value;
+}
+
 const Common::Array<uint16>& MacVenture::SaveGame::getGlobals() {
 	return _globals;
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 3893aca..3705826 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -67,9 +67,11 @@ public:
 	Attribute getAttr(ObjID objID, uint32 attrID);
 	void setAttr(uint32 attrID, ObjID objID, Attribute value);
 
+	void setGlobal(uint32 attrID, Attribute value);
+	const Common::Array<uint16> &getGlobals();
+
 	const Common::Array<AttributeGroup> &getGroups();
 	const AttributeGroup *getGroup(uint32 groupID);
-	const Common::Array<uint16> &getGlobals();
 	const Common::String &getText();
 
 private:
@@ -88,11 +90,22 @@ public:
 	World(MacVentureEngine *engine, Common::MacResManager *resMan);
 	~World();
 
-	uint32 getObjAttr(ObjID objID, uint32 attrID);
+	
 	void setObjAttr(ObjID objID, uint32 attrID, Attribute value);
+	void setGlobal(uint32 attrID, Attribute value);
+	void updateObj(ObjID objID);
+	void captureChildren(ObjID objID);
+	void releaseChildren(ObjID objID);
+
+	uint32 getObjAttr(ObjID objID, uint32 attrID);
+	Attribute getGlobal(uint32 attrID);
+	Common::String getText(ObjID objID);
+
 	bool isObjActive(ObjID obj);
 	Common::Array<ObjID> getFamily(ObjID objID, bool recursive);
 	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);
+	WindowReference getObjWindow(ObjID objID);
+	WindowReference findObjWindow(ObjID objID);
 
 private:
 	bool loadStartGameFileName();


Commit: 60d5ef5c5b875269f29cd817481de7e162f4966a
    https://github.com/scummvm/scummvm/commit/60d5ef5c5b875269f29cd817481de7e162f4966a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:29:56+02:00

Commit Message:
MACVENTURE: Begin implementing object queue

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 4ca3de7..1a468eb 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -99,23 +99,44 @@ bool Gui::processEvent(Common::Event &event) {
 }
 
 const WindowData& Gui::getWindowData(WindowReference reference) {
-	assert(_windowData);
-
-	Common::List<WindowData>::const_iterator iter = _windowData->begin();
-	while (iter->refcon != reference && iter != _windowData->end()) {
-		iter++;
-	}
-
-	if (iter->refcon == reference)
-		return *iter;
-
-	error("Could not locate the desired window data");
+	return findWindowData(reference);
 }
 
 const Graphics::Font& Gui::getCurrentFont() {
 	return *_wm.getFont("Chicago-12", Graphics::FontManager::kBigGUIFont);
 }
 
+void Gui::bringToFront(WindowReference winID) {
+	// FIXME: There has to be a better way to do this, maybe with the _wm
+	switch (winID) {
+	case MacVenture::kCommandsWindow:
+		_controlsWindow->setActive(true);
+		break;
+	case MacVenture::kMainGameWindow:
+		_mainGameWindow->setActive(true);
+		break;
+	case MacVenture::kOutConsoleWindow:
+		_outConsoleWindow->setActive(true);
+		break;
+	case MacVenture::kSelfWindow:
+		_selfWindow->setActive(true);
+		break;
+	case MacVenture::kExitsWindow:
+		_exitsWindow->setActive(true);
+		break;
+	case MacVenture::kDiplomaWindow:
+		_diplomaWindow->setActive(true);
+		break;
+	default:
+		break;
+	}
+}
+
+void Gui::setWindowTitle(WindowReference winID, Common::String string) {
+	findWindowData(winID).title = string;
+	findWindowData(winID).titleLength = string.size();
+}
+
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
@@ -191,13 +212,6 @@ void Gui::initWindows() {
 	_diplomaWindow->getSurface()->fillRect(_diplomaWindow->getSurface()->getBounds(), kColorGreen2);
 	*/
 
-	// Inventory Window
-	_inventoryWindow = _wm.addWindow(false, true, true);
-	_inventoryWindow->setDimensions(getWindowData(kInventoryWindow).bounds);
-	_inventoryWindow->setActive(false);
-	_inventoryWindow->setCallback(inventoryWindowCallback, this);
-	loadBorder(_inventoryWindow, "border_command.bmp", false);
-
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -324,9 +338,10 @@ bool Gui::loadWindows() {
 		res->readUint32BE(); // Skip the true id. For some reason it's reading 0
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
-			data.title = new char[data.titleLength + 1];
-			res->read(data.title, data.titleLength);
-			data.title[data.titleLength] = '\0';
+			char* newTitle = new char[data.titleLength + 1];
+			res->read(newTitle, data.titleLength);
+			newTitle[data.titleLength] = '\0';
+			data.title = Common::String(newTitle);
 		}
 
 		debug(5, "Window loaded: %s", data.title);
@@ -334,28 +349,9 @@ bool Gui::loadWindows() {
 		_windowData->push_back(data);
 	}
 
-	loadInventoryWindow();
-
 	return true;
 }
 
-void Gui::loadInventoryWindow() {
-	WindowData data;
-	GlobalSettings settings = _engine->getGlobalSettings();
-	data.bounds = Common::Rect(
-		settings.invLeft,
-		settings.invTop,
-		settings.invLeft + settings.invWidth,
-		settings.invTop + settings.invHeight);
-	data.title = "Inventory";
-	data.visible = true;
-	data.hasCloseBox = false;
-	data.refcon = kInventoryWindow;
-	data.titleLength = 10;
-
-	_windowData->push_back(data);
-}
-
 bool Gui::loadControls() {
 	Common::MacResIDArray resArray;
 	Common::SeekableReadStream *res;
@@ -456,7 +452,21 @@ void Gui::drawMainGameWindow() {
 }
 
 void Gui::drawSelfWindow() {
+	warning("drawSelfWindow: Unimplemented");
+}
+
+WindowData & Gui::findWindowData(WindowReference reference) {
+	assert(_windowData);
+
+	Common::List<WindowData>::iterator iter = _windowData->begin();
+	while (iter->refcon != reference && iter != _windowData->end()) {
+		iter++;
+	}
+
+	if (iter->refcon == reference)
+		return *iter;
 
+	error("Could not locate the desired window data");
 }
 
 
@@ -561,12 +571,60 @@ void Gui::handleMenuAction(MenuAction action) {
 	}
 }
 
+void Gui::updateWindow(WindowReference winID, bool containerOpen) {
+	if (winID > 0x90) return;
+	if (winID == kSelfWindow || containerOpen) {
+		if (winID == kMainGameWindow) {
+			warning("Unimplemented: draw main game window");
+		} else {
+			warning("Unimplemented: fill window with background");
+		}
+		WindowData &data = findWindowData(winID);
+		Common::Array<ObjID> children = data.children;
+		for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
+			warning("Unimplemented: draw object %x", *it);
+		}
+		if (data.type == kZoomDoc && data.updateScroll) {
+			warning("Unimplemented: update scroll");
+		}
+	}
+}
+
+WindowReference Gui::createInventoryWindow() {
+	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
+	WindowData newData;
+	GlobalSettings settings = _engine->getGlobalSettings();
+	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a hack
+
+	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
+		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
+		newData.bounds.translate(newData.bounds.left + settings.invOffsetX, newData.bounds.top + settings.invOffsetY);
+	} else {
+		newData.bounds = Common::Rect(
+			settings.invLeft,
+			settings.invTop,
+			settings.invLeft + settings.invWidth,
+			settings.invTop + settings.invHeight);
+	}
+	newData.type = kZoomDoc;
+	newData.hasCloseBox = true;
+	newData.visible = true;
+	_windowData->push_back(newData);
+
+	newWindow->setDimensions(newData.bounds);
+	newWindow->setCallback(inventoryWindowCallback, this);
+	loadBorder(newWindow, "border_self_inac.bmp", false);
+	loadBorder(newWindow, "border_self_act.bmp", true);
+	_inventoryWindows.push_back(newWindow);
+	return newData.refcon;
+}
+
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		if (_engine->isPaused()) 
+		if (_engine->isPaused())
 			return true;
-		
+
 		Common::Point position(
 			event.mouse.x - _controlsWindow->getDimensions().left,
 			event.mouse.y - _controlsWindow->getDimensions().top);
@@ -583,7 +641,7 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		_engine->selectControl((ControlReference)data.getData().refcon);
 		_engine->activateCommand((ControlReference)data.getData().refcon);
 		_engine->refreshReady();
-		_engine->preparedToRun();		
+		_engine->preparedToRun();
 	}
 	return false;
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 4d760e8..b107b15 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -32,6 +32,7 @@ namespace MacVenture {
 using namespace Graphics::MacGUIConstants;
 using namespace Graphics::MacWindowConstants;
 class MacVentureEngine;
+typedef uint32 ObjID;
 
 //namespace MacVentureMenuActions {
 enum MenuAction {
@@ -59,8 +60,7 @@ enum WindowReference {
 	kOutConsoleWindow = 0x82,
 	kSelfWindow = 0x83,
 	kExitsWindow = 0x84,
-	kDiplomaWindow = 0x85,
-	kInventoryWindow = 0x90 // Not in the files, but here for convenience
+	kDiplomaWindow = 0x85
 };
 
 enum MVWindowType {
@@ -85,7 +85,9 @@ struct WindowData {
 	uint16 hasCloseBox;
 	WindowReference refcon;
 	uint8 titleLength;
-	char* title;
+	Common::String title;
+	Common::Array<ObjID> children;
+	bool updateScroll;
 };
 
 enum ControlReference {
@@ -132,6 +134,9 @@ public:
 	void draw();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
+	void updateWindow(WindowReference winID, bool containerOpen);
+
+	WindowReference createInventoryWindow();
 
 	// Event processors
 	bool processCommandEvents(WindowClick click, Common::Event &event);
@@ -145,6 +150,10 @@ public:
 
 	const Graphics::Font& getCurrentFont();
 
+	// Modifiers
+	void bringToFront(WindowReference window);
+	void setWindowTitle(WindowReference winID, Common::String string);
+
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
 
@@ -165,7 +174,7 @@ private: // Attributes
 	Graphics::MacWindow *_selfWindow;
 	Graphics::MacWindow *_exitsWindow;
 	Graphics::MacWindow *_diplomaWindow;
-	Graphics::MacWindow *_inventoryWindow;
+	Common::Array<Graphics::MacWindow*> _inventoryWindows;
 	Graphics::Menu *_menu;
 
 private: // Methods
@@ -178,7 +187,6 @@ private: // Methods
 	// Loaders
 	bool loadMenus();
 	bool loadWindows();
-	void loadInventoryWindow();
 	bool loadControls();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
 
@@ -188,6 +196,9 @@ private: // Methods
 	void drawMainGameWindow();
 	void drawSelfWindow();
 
+	// Finders
+	WindowData& findWindowData(WindowReference reference);
+
 };
 
 class CommandButton {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index f2a2f43..6e477d4 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -171,7 +171,7 @@ void MacVentureEngine::activateCommand(ControlReference id) {
 }
 
 void MacVentureEngine::refreshReady() {
-	switch (objectsToApplyCommand()) {
+	switch (getInvolvedObjects()) {
 	case 0: // No selected object
 		_cmdReady = true;
 		break;
@@ -201,16 +201,18 @@ void MacVentureEngine::loseGame() {
 	_gameState = kGameStateLosing;
 }
 
-void MacVentureEngine::enqueueObject(ObjID id) {
+void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID) {
 	QueuedObject obj;
-	obj.parent = _world->getObjAttr(id, kAttrParentObject);
-	obj.x = _world->getObjAttr(id, kAttrPosX);
-	obj.y = _world->getObjAttr(id, kAttrPosY);
-	obj.exitx = _world->getObjAttr(id, kAttrExitX);
-	obj.exity = _world->getObjAttr(id, kAttrExitY);
-	obj.hidden = _world->getObjAttr(id, kAttrHiddenExit);
-	obj.offsecreen = _world->getObjAttr(id, kAttrInvisible);
-	obj.invisible = _world->getObjAttr(id, kAttrUnclickable);
+	obj.id = type;
+	obj.object = objID;
+	obj.parent = _world->getObjAttr(objID, kAttrParentObject);
+	obj.x = _world->getObjAttr(objID, kAttrPosX);
+	obj.y = _world->getObjAttr(objID, kAttrPosY);
+	obj.exitx = _world->getObjAttr(objID, kAttrExitX);
+	obj.exity = _world->getObjAttr(objID, kAttrExitY);
+	obj.hidden = _world->getObjAttr(objID, kAttrHiddenExit);
+	obj.offsecreen = _world->getObjAttr(objID, kAttrInvisible);
+	obj.invisible = _world->getObjAttr(objID, kAttrUnclickable);
 	_objQueue.push_back(obj);
 }
 
@@ -300,16 +302,58 @@ bool MacVentureEngine::updateState() {
 }
 
 void MacVentureEngine::revert() {
+	warning("revert: unimplemented");
 }
 
 void MacVentureEngine::runObjQueue() {
-
+	warning("runObjQueue: not fully implemented");
+	while (!_objQueue.empty()) {
+		uint32 biggest = 0;
+		uint32 index = 0;
+		uint32 temp;
+		for (uint i = 0; i < _objQueue.size(); i++) {
+			temp = _objQueue[i].id;
+			if (temp > biggest) {
+				biggest = temp;
+				index = i;
+			}
+		}
+		QueuedObject obj = _objQueue[index];
+		_objQueue.remove_at(index);
+		switch (obj.id) {
+		case 0x2:
+			focusObjectWindow(obj.object);
+			break;
+		case 0x3:
+			openObject(obj.object);
+			break;
+		case 0x4:
+			closeObject(obj.object);
+			break;
+		case 0x7:
+			checkObject(obj.object);
+			break;
+		case 0x8:
+			reflectSwap(obj.object);
+			break;
+		case 0xc:
+			_world->setObjAttr(_gui->getWindowData(kMainGameWindow).refcon, kAttrContainerOpen, 0);
+			_world->setObjAttr(_world->getObjAttr(1, kAttrParentObject), kAttrContainerOpen, 1);
+			break;
+		case 0xd:
+			toggleExits();
+			break;
+		case 0xe:
+			zoomObject(obj.object);
+			break;
+		}
+	}
 }
 
 void MacVentureEngine::updateControls() {
 	if (_activeControl)
 		_activeControl = kNoCommand;
-	// toggleExits();
+	toggleExits();
 	// resetVars();
 }
 
@@ -322,6 +366,52 @@ void MacVentureEngine::resetVars() {
 	_cmdReady = false;
 }
 
+void MacVentureEngine::focusObjectWindow(ObjID objID) {
+	if (objID) {
+		WindowReference win = getObjWindow(objID);
+		if (win)
+			_gui->bringToFront(win);
+	}
+}
+
+void MacVentureEngine::openObject(ObjID objID) {
+	if (getObjWindow(objID)) return;
+	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
+		//_gui->setRefcon(objID, kMainGameWindow); // FIXME: Find better name
+		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
+		//_gui->drawExits();
+		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID));
+	} else { // Open inventory window
+		Common::Point p(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
+		//getParentWin(obj).localToGlobal(p);
+		//globalToDesktop(p);
+		WindowReference invID = _gui->createInventoryWindow();
+		_gui->setWindowTitle(invID, _world->getText(objID));
+		//_gui->setRefCon(objID, invID);
+		_gui->updateWindow(invID, _world->getObjAttr(objID, kAttrContainerOpen));
+	}
+}
+
+void MacVentureEngine::closeObject(ObjID objID) {
+	warning("closeObject: unimplemented");
+}
+
+void MacVentureEngine::checkObject(ObjID objID) {
+	warning("checkObject: unimplemented");
+}
+
+void MacVentureEngine::reflectSwap(ObjID objID) {
+	warning("reflectSwap: unimplemented");
+}
+
+void MacVentureEngine::toggleExits() {
+	warning("toggleExits: unimplemented");
+}
+
+void MacVentureEngine::zoomObject(ObjID objID) {
+	warning("zoomObject: unimplemented");
+}
+
 ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlReference id) {
 	switch (id) {
 	case MacVenture::kControlExitBox:
@@ -347,10 +437,6 @@ ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlReference i
 	}
 }
 
-uint MacVentureEngine::objectsToApplyCommand() {
-	return uint();
-}
-
 // Data retrieval
 
 bool MacVentureEngine::isPaused() {
@@ -382,6 +468,37 @@ uint32 MacVentureEngine::randBetween(uint32 min, uint32 max) {
 	return _rnd->getRandomNumber(max - min) + min;
 }
 
+uint32 MacVentureEngine::getInvolvedObjects() {
+	return (_selectedControl ? _globalSettings.cmdArgCnts[_selectedControl - 1] : 3000);
+}
+
+WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
+	switch (objID) {
+	case 0xfffc: return kExitsWindow;
+	case 0xfffd: return kSelfWindow;
+	case 0xfffe: return kOutConsoleWindow;
+	case 0xffff: return kCommandsWindow;
+	}
+
+	return findObjWindow(objID);
+}
+
+WindowReference MacVentureEngine::findObjWindow(ObjID objID) {
+	return kMainGameWindow;
+}
+
+Common::Point MacVentureEngine::getDeltaPoint() {
+	return _deltaPoint;
+}
+
+ObjID MacVentureEngine::getDestObject() {
+	return _destObject;
+}
+
+ControlAction MacVentureEngine::getSelectedControl() {
+	return _selectedControl;
+}
+
 // Data loading
 
 bool MacVentureEngine::loadGlobalSettings() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 3ae195a..aabcdcb 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -164,7 +164,7 @@ public:
 	bool updateState();
 	void revert();
 
-	void enqueueObject(ObjID id);
+	void enqueueObject(ObjectQueueID type, ObjID objID);
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
 
 	void runObjQueue();
@@ -178,6 +178,13 @@ public:
 	bool isOldText() const;
 	const HuffmanLists *getDecodingHuffman() const;
 	uint32 randBetween(uint32 min, uint32 max);
+	uint32 getInvolvedObjects();
+	WindowReference getObjWindow(ObjID objID);
+	WindowReference findObjWindow(ObjID objID);
+
+	Common::Point getDeltaPoint();
+	ObjID getDestObject();
+	ControlAction getSelectedControl();
 
 private:
 	void processEvents();
@@ -187,13 +194,21 @@ private:
 	void updateControls();
 	void resetVars();
 
+	// Object queue methods
+	void focusObjectWindow(ObjID objID);
+	void openObject(ObjID objID);
+	void closeObject(ObjID objID);
+	void checkObject(ObjID objID);
+	void reflectSwap(ObjID objID);
+	void toggleExits();
+	void zoomObject(ObjID objID);
+
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
 
 	// Utils
 	ControlAction referenceToAction(ControlReference id);
-	uint objectsToApplyCommand();
 
 	const char* getGameFileName() const;
 
@@ -222,9 +237,9 @@ private: // Attributes
 	bool _haltedAtEnd, _haltedInSelection;
 	bool _gameChanged;
 
-	Common::List<QueuedObject> _objQueue;
-	Common::List<QueuedObject> _soundQueue;
-	Common::List<QueuedObject> _textQueue;
+	Common::Array<QueuedObject> _objQueue;
+	Common::Array<QueuedObject> _soundQueue;
+	Common::Array<QueuedObject> _textQueue;
 
 	// Selections
 	ObjID _destObject;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index b0d5ef0..5702c9f 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -151,6 +151,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 	byte op;	
 	while (script.hasNext()) {
 		op = script.fetch();
+		debug(8, "SCRIPT: I'm running operation %x", op);
 		if (!(op & 0x80)) {
 			state->push(op);
 		} else {
@@ -900,7 +901,7 @@ void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
 	word obj = state->pop();
-	_engine->enqueueObject(obj);
+	_engine->enqueueObject(kFocusWindow, obj);
 }
 
 void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 2f603c5..c7b103e 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -68,7 +68,7 @@ void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
 		setParent(objID, value);
 	
 	if (attrID < kAttrOtherDoor)
-		_engine->enqueueObject(objID);
+		_engine->enqueueObject(kUpdateObject, objID);
 
 	uint32 idx = _engine->getGlobalSettings().attrIndices[attrID];
 	value <<= _engine->getGlobalSettings().attrShifts[attrID];
@@ -80,7 +80,29 @@ void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
 }
 
 bool MacVenture::World::isObjActive(ObjID obj) {
-	return false;
+	ObjID destObj = _engine->getDestObject();
+	Common::Point p = _engine->getDeltaPoint();
+	ControlAction selectedControl = _engine->getSelectedControl();
+	if (!getAncestor(obj)) return false; // If our ancestor is the garbage (obj 0), we're inactive
+	if (_engine->getInvolvedObjects() >= 2 &&	// If (we need > 1 objs for the command) && 
+		destObj > 0 &&			// we have a destination object &&
+		!getAncestor(destObj))  // but that destination object is in the garbage
+		return false;
+	if (selectedControl != kMoveObject) return true; // We only need one 
+	// Handle move object
+	if (!isObjDraggable(obj)) return false; // We can't move it
+	if (getObjAttr(1, kAttrParentObject) != destObj) return true; // if the target is not the player's parent, we can go
+	Common::Rect rect(kScreenWidth, kScreenHeight);
+	rect.top -= getObjAttr(obj, kAttrPosY) + p.y;
+	rect.left -= getObjAttr(obj, kAttrPosX) + p.x;	
+	return intersects(obj, rect);
+}
+
+ObjID World::getAncestor(ObjID objID) {
+	ObjID root = getObjAttr(1, kAttrParentObject);
+	while (objID != 0 && objID != 1 && objID != root)
+		objID = getObjAttr(objID, kAttrParentObject);
+	return objID;
 }
 
 Common::Array<ObjID> World::getFamily(ObjID objID, bool recursive) {
@@ -102,21 +124,6 @@ Common::Array<ObjID> World::getChildren(ObjID objID, bool recursive) {
 	return Common::Array<ObjID>();
 }
 
-WindowReference World::getObjWindow(ObjID objID) {
-	switch (objID) {
-	case 0xfffc: return kExitsWindow;
-	case 0xfffd: return kSelfWindow;
-	case 0xfffe: return kOutConsoleWindow;
-	case 0xffff: return kCommandsWindow;
-	}
-
-	return findObjWindow(objID);
-}
-
-WindowReference World::findObjWindow(ObjID objID) {
-	return kMainGameWindow;
-}
-
 Attribute World::getGlobal(uint32 attrID) {
 	return _saveGame->getGlobals()[attrID];
 }
@@ -130,7 +137,7 @@ void World::updateObj(ObjID objID) {
 	if (getObjAttr(1, kAttrParentObject) == objID) {
 		win = kMainGameWindow;
 	} else {
-		win = getObjWindow(objID);
+		win = _engine->getObjWindow(objID);
 	}
 	if (win) {
 		//focusObjWin(objID);
@@ -152,6 +159,17 @@ Common::String World::getText(ObjID objID) {
 }
 
 
+bool World::isObjDraggable(ObjID objID) {
+	return (getObjAttr(objID, kAttrInvisible) == 0 &&
+			getObjAttr(objID, kAttrUnclickable) == 0 &&
+			getObjAttr(objID, kAttrUndraggable) == 0);
+}
+
+bool World::intersects(ObjID objID, Common::Rect rect) {
+	warning("Intersects: unimplemented");
+	return true;
+}
+
 bool World::loadStartGameFileName() {
 	Common::SeekableReadStream *res;
 
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 3705826..fe45508 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -101,13 +101,16 @@ public:
 	Attribute getGlobal(uint32 attrID);
 	Common::String getText(ObjID objID);
 
-	bool isObjActive(ObjID obj);
+	bool isObjActive(ObjID objID);
+
+	ObjID getAncestor(ObjID objID);
 	Common::Array<ObjID> getFamily(ObjID objID, bool recursive);
-	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);
-	WindowReference getObjWindow(ObjID objID);
-	WindowReference findObjWindow(ObjID objID);
+	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);	
 
 private:
+	bool isObjDraggable(ObjID objID);
+	bool intersects(ObjID objID, Common::Rect rect);
+
 	bool loadStartGameFileName();
 	void calculateObjectRelations();
 	void setParent(ObjID child, ObjID newParent);


Commit: 2fbff0e6782759770048c9b9442832e525d001b6
    https://github.com/scummvm/scummvm/commit/2fbff0e6782759770048c9b9442832e525d001b6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:29:57+02:00

Commit Message:
MACVENTURE: Fix some minor warnings

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 1a468eb..c5c6df3 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -94,6 +94,10 @@ void Gui::draw() {
 	_wm.draw();
 }
 
+void Gui::drawMenu() {
+	_menu->draw(&_screen);
+}
+
 bool Gui::processEvent(Common::Event &event) {
 	return _wm.processEvent(event);
 }
@@ -271,7 +275,6 @@ bool Gui::loadMenus() {
 		uint8 titleLength;
 		char* title;
 
-		int menunum = -1; // High level menus have level -1
 		/* Skip menuID, width, height, resourceID, placeholder */
 		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
 		enabled = res->readUint32BE();
@@ -320,8 +323,7 @@ bool Gui::loadWindows() {
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('W', 'I', 'N', 'D'), *iter);
 		WindowData data;
-		uint16 top, left, bottom, right;
-		uint16 borderSize;
+		uint16 top, left, bottom, right;		
 		top = res->readUint16BE();
 		left = res->readUint16BE();
 		bottom = res->readUint16BE();
@@ -512,7 +514,7 @@ bool diplomaWindowCallback(Graphics::WindowClick click, Common::Event &event, vo
 bool inventoryWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-	return true;
+	return g->processInventoryEvents(click, event);
 }
 
 void menuCommandsCallback(int action, Common::String &text, void *data) {
@@ -670,6 +672,10 @@ bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & ev
 	return getWindowData(kDiplomaWindow).visible;
 }
 
+bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
+	return false;
+}
+
 /* Ugly switches */
 
 BorderBounds Gui::borderBounds(MVWindowType type) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index b107b15..dc08a77 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -132,6 +132,7 @@ public:
 	~Gui();
 
 	void draw();
+	void drawMenu();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
 	void updateWindow(WindowReference winID, bool containerOpen);
@@ -145,6 +146,7 @@ public:
 	bool processSelfEvents(WindowClick click, Common::Event &event);
 	bool processExitsEvents(WindowClick click, Common::Event &event);
 	bool processDiplomaEvents(WindowClick click, Common::Event &event);
+	bool processInventoryEvents(WindowClick click, Common::Event &event);
 
 	const WindowData& getWindowData(WindowReference reference);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6e477d4..23425d9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -137,6 +137,7 @@ Common::Error MacVentureEngine::run() {
 			}
 		}
 
+		_gui->drawMenu();
 		g_system->updateScreen();
 		g_system->delayMillis(50);
 	}
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 5702c9f..715249c 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -337,7 +337,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 				opbbFORK(state, frame);
 				break;
 			case 0xbc: //call
-				opbcCALL(state, frame, &script);
+				opbcCALL(state, frame, script);
 				break;
 			case 0xbd: //focus object
 				opbdFOOB(state, frame);
@@ -537,14 +537,14 @@ void ScriptEngine::op87PUDY(EngineState * state, EngineFrame * frame) {
 	state->push(frame->y);
 }
 
-void ScriptEngine::op88PUIB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	state->push(asset->fetch());
+void ScriptEngine::op88PUIB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	state->push(script->fetch());
 }
 
-void ScriptEngine::op89PUI(EngineState * state, EngineFrame * frame, ScriptAsset * asset) {
-	word val = asset->fetch();
+void ScriptEngine::op89PUI(EngineState * state, EngineFrame * frame, ScriptAsset * script) {
+	word val = script->fetch();
 	val <<= 8;
-	val = val | asset->fetch();
+	val = val | script->fetch();
 	state->push(val);
 }
 
@@ -798,50 +798,50 @@ void ScriptEngine::opafCONTW(EngineState * state, EngineFrame * frame) {
 	state->push(haystack.contains(needle) ? 1 : 0);
 }
 
-void ScriptEngine::opb0BRA(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb0BRA(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val <<= 8;
-	val = val | asset->fetch();
+	val = val | script->fetch();
 	val = neg16(val);
-	asset->branch(val);
+	script->branch(val);
 }
 
-void ScriptEngine::opb1BRAB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb1BRAB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val = neg8(val);
-	asset->branch(val);
+	script->branch(val);
 }
 
-void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val <<= 8;
-	val = val | asset->fetch();
+	val = val | script->fetch();
 	val = neg16(val);
 	word b = state->pop();
-	if (b != 0) asset->branch(val);
+	if (b != 0) script->branch(val);
 }
 
-void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
-	if (b != 0) asset->branch(val);
+	if (b != 0) script->branch(val);
 }
 
-void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val <<= 8;
-	val = val | asset->fetch();
+	val = val | script->fetch();
 	val = neg16(val);
 	word b = state->pop();
-	if (b == 0) asset->branch(val);
+	if (b == 0) script->branch(val);
 }
 
-void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsset *asset) {
-	word val = asset->fetch();
+void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
-	if (b == 0) asset->branch(val);
+	if (b == 0) script->branch(val);
 }
 
 void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
@@ -852,7 +852,7 @@ void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
 	word func = state->pop();
-	for (int i = 0; i < frame->saves.size(); i++) {
+	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].func == func)
 			frame->saves[i].rank = 0;
 	}
@@ -860,14 +860,14 @@ void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opb8CLOW(EngineState * state, EngineFrame * frame) {
 	word hi = state->pop();
-	for (int i = 0;i<frame->saves.size();i++)
+	for (uint i = 0;i<frame->saves.size();i++)
 		if (frame->saves[i].rank <= hi)
 			frame->saves[i].rank = 0;
 }
 
 void ScriptEngine::opb9CHI(EngineState * state, EngineFrame * frame) {
 	word lo = state->pop();
-	for (int i = 0;i<frame->saves.size();i++)
+	for (uint i = 0;i<frame->saves.size();i++)
 		if (frame->saves[i].rank >= lo)
 			frame->saves[i].rank = 0;
 }
@@ -875,7 +875,7 @@ void ScriptEngine::opb9CHI(EngineState * state, EngineFrame * frame) {
 void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
 	word hi = state->pop();
 	word lo = state->pop();
-	for (int i = 0;i<frame->saves.size();i++)
+	for (uint i = 0;i<frame->saves.size();i++)
 		if (frame->saves[i].rank >= lo &&
 			frame->saves[i].rank <= hi)
 			frame->saves[i].rank = 0;
@@ -891,12 +891,12 @@ void ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 	_frames.push_back(newframe);
 }
 
-void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	frame->scripts.remove_at(0);
 	frame->scripts.insert_at(0, newfun);
-	script = &frame->scripts.front();
+	script = frame->scripts.front();
 }
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
@@ -962,7 +962,7 @@ void ScriptEngine::opc9WAIT(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
-	for (int i = 0; i < 6; i++) // Dummy
+	for (uint i = 0; i < 6; i++) // Dummy
 		state->push(0x00);
 	op00NOOP(0xca);
 }
@@ -1005,12 +1005,14 @@ void ScriptEngine::opd1GOBD(EngineState * state, EngineFrame * frame) {
 	Common::Rect bounds(0, 0, 1, 1); //= _world->getObjBounds(obj);
 	state->push(bounds.width());
 	state->push(bounds.height());
+	op00NOOP(0xd1);
 }
 
 void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) { 
 	word b = state->pop();
 	word a = state->pop();
 	state->push(0);//_world->getOverlapPercent(b, a));
+	op00NOOP(0xd2);
 }
 
 void ScriptEngine::opd3CAPC(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index e56c6e7..178e054 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -180,8 +180,8 @@ private:
 	void op85PUTA(EngineState *state, EngineFrame *frame);	//push target
 	void op86PUDX(EngineState *state, EngineFrame *frame);	//push deltax
 	void op87PUDY(EngineState *state, EngineFrame *frame);	//push deltay
-	void op88PUIB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);//push immediate.b
-	void op89PUI(EngineState *state, EngineFrame *frame, ScriptAsset *asset);//push immediate
+	void op88PUIB(EngineState *state, EngineFrame *frame, ScriptAsset *script);//push immediate.b
+	void op89PUI(EngineState *state, EngineFrame *frame, ScriptAsset *script);//push immediate
 	void op8aGGLO(EngineState *state, EngineFrame *frame);	//get global
 	void op8bSGLO(EngineState *state, EngineFrame *frame);	//set global
 	void op8cRAND(EngineState *state, EngineFrame *frame);	//random
@@ -223,19 +223,19 @@ private:
 	void opaeCONT(EngineState *state, EngineFrame *frame);	//contains
 	void opafCONTW(EngineState *state, EngineFrame *frame); //contains word	
 
-	void opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bra
-	void opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bra.b
-	void opb2BEQ(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//beq
-	void opb3BEQB(EngineState *state, EngineFrame *frame, ScriptAsset *asset); //beq.b
-	void opb4BNE(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bne
-	void opb5BNEB(EngineState *state, EngineFrame *frame, ScriptAsset *asset);	//bne.b
+	void opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bra
+	void opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bra.b
+	void opb2BEQ(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//beq
+	void opb3BEQB(EngineState *state, EngineFrame *frame, ScriptAsset *script); //beq.b
+	void opb4BNE(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bne
+	void opb5BNEB(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bne.b
 	void opb6CLAT(EngineState *state, EngineFrame *frame);	//call later
 	void opb7CCA(EngineState *state, EngineFrame *frame);	//cancel call
 	void opb8CLOW(EngineState *state, EngineFrame *frame);	//cancel low priority
 	void opb9CHI(EngineState *state, EngineFrame *frame);	//cancel high priority
 	void opbaCRAN(EngineState *state, EngineFrame *frame);	//cancel priority range
 	void opbbFORK(EngineState *state, EngineFrame *frame);	//fork
-	void opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//call
+	void opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script);	//call
 	void opbdFOOB(EngineState *state, EngineFrame *frame);	//focus object
 	void opbeSWOB(EngineState *state, EngineFrame *frame);	//swap objects
 	void opbfSNOB(EngineState *state, EngineFrame *frame);	//snap object


Commit: bbf0c62f14326818d135a75bc6f9e58ad59346a1
    https://github.com/scummvm/scummvm/commit/bbf0c62f14326818d135a75bc6f9e58ad59346a1
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:29:57+02:00

Commit Message:
MACVENTURE: Add enqueue text

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 23425d9..5c8f6b4 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -112,11 +112,7 @@ Common::Error MacVentureEngine::run() {
 		processEvents();
 
 		if (_prepared) {
-			_prepared = false;
-
-			if (!_halted) {
-				_gui->draw();
-			}
+			_prepared = false;	
 
 			if (_cmdReady || _halted) {
 				_halted = false;
@@ -137,7 +133,7 @@ Common::Error MacVentureEngine::run() {
 			}
 		}
 
-		_gui->drawMenu();
+		_gui->draw();
 		g_system->updateScreen();
 		g_system->delayMillis(50);
 	}
@@ -218,10 +214,16 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID) {
 }
 
 void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text) {
+	QueuedText newText;
+	newText.id = type;
+	newText.destination = target;
+	newText.source = source;
+	newText.asset = text;
+	_textQueue.push_back(newText);
 }
 
 void MacVentureEngine::printTexts() {
-	debug("Printing texts..");
+	warning("printTexts: unimplemented");
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index aabcdcb..bb4eec8 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -124,12 +124,6 @@ enum ObjectQueueID {
 	kAnimateBack = 14
 };
 
-enum TextQueueID {
-	kTextNumber = 1,
-	kTextNewLine = 2,
-	kTextPlain = 3
-};
-
 struct QueuedObject {
 	ObjectQueueID id;
 	ObjID object;
@@ -143,6 +137,19 @@ struct QueuedObject {
 	bool invisible;
 };
 
+enum TextQueueID {
+	kTextNumber = 1,
+	kTextNewLine = 2,
+	kTextPlain = 3
+};
+
+struct QueuedText {
+	TextQueueID id;
+	ObjID source;
+	ObjID destination;
+	ObjID asset;
+};
+
 class MacVentureEngine : public Engine {
 
 public:
@@ -239,7 +246,7 @@ private: // Attributes
 
 	Common::Array<QueuedObject> _objQueue;
 	Common::Array<QueuedObject> _soundQueue;
-	Common::Array<QueuedObject> _textQueue;
+	Common::Array<QueuedText> _textQueue;
 
 	// Selections
 	ObjID _destObject;


Commit: ccc76f2119dcd3b802604294fc1f7bccad645374
    https://github.com/scummvm/scummvm/commit/ccc76f2119dcd3b802604294fc1f7bccad645374
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:31:16+02:00

Commit Message:
MACVENTURE: Add PPIC0, 1 and 2 decoding

Changed paths:
  A engines/macventure/image.cpp
    engines/macventure/container.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/script.cpp
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index bd88f66..4dc5172 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -117,7 +117,7 @@ public:
 					uint32 bitSize = _lens[x];
 					bits += bitSize & 0xF;
 					if (bits & 0x10) {
-						bits &= 0xf;
+						bits &= 0xF;
 						_res->seek(2, SEEK_CUR);
 					}
 					bitSize >>= 4;
@@ -129,7 +129,11 @@ public:
 						else length >>= (32 - bitSize) - bits;
 						length &= (1 << bitSize) - 1;
 						length |= 1 << bitSize;
-						bits += bitSize;						
+						bits += bitSize;	
+						if (bits & 0x10) {
+							bits &= 0xF;
+							_res->seek(2, SEEK_CUR);
+						}
 					}		
 
 					group.lengths[j] = length;
@@ -173,16 +177,14 @@ public:
 			return _res;
 		} else {
 			uint32 groupID = (id >> 6);
-			uint32 objectIndex = id & 0x3f; // Index within the group
-
-			_res->seek(4 + (groupID * 6), SEEK_SET);
+			uint32 objectIndex = id & 0x3f; // Index within the group		
 
 			uint32 offset = 0;
 			for (uint i = 0; i < objectIndex; i++) {
 				offset += _groups[groupID].lengths[i];
 			}
 
-			_res->seek(offset, SEEK_CUR);
+			_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
 
 			return _res;
 		}
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index c5c6df3..725ce38 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -99,7 +99,11 @@ void Gui::drawMenu() {
 }
 
 bool Gui::processEvent(Common::Event &event) {
-	return _wm.processEvent(event);
+	bool processed = false;
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
+		debug("Click on the ui");
+	}
+	return (processed || _wm.processEvent(event));
 }
 
 const WindowData& Gui::getWindowData(WindowReference reference) {
@@ -141,6 +145,27 @@ void Gui::setWindowTitle(WindowReference winID, Common::String string) {
 	findWindowData(winID).titleLength = string.size();
 }
 
+void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children) {
+	WindowData &data = findWindowData(ref);
+	data.children.clear();
+	uint32 originx = 0x7fff;
+	uint32 originy = 0x7fff;
+	for (uint i = 0; i < children.size(); i++) {
+		if (children[i] != 1) {
+			ObjID child = children[i];
+			if (ref != kMainGameWindow) {
+				Common::Point childPos = _engine->getObjPosition(child);
+				originx = originx > childPos.x ? childPos.x : originx;
+				originy = originy > childPos.y ? childPos.y : originy;
+			}
+			data.children.push_back(child);
+		}
+	}
+	if (originx != 0x7fff) data.bounds.left = originx;
+	if (originy != 0x7fff) data.bounds.top = originy;
+	if (ref != kMainGameWindow) data.updateScroll = true;
+}
+
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
@@ -160,6 +185,7 @@ void Gui::initGUI() {
 	if (!loadControls())
 		error("Could not load controls");
 
+
 	draw();
 
 }
@@ -323,7 +349,7 @@ bool Gui::loadWindows() {
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('W', 'I', 'N', 'D'), *iter);
 		WindowData data;
-		uint16 top, left, bottom, right;		
+		uint16 top, left, bottom, right;
 		top = res->readUint16BE();
 		left = res->readUint16BE();
 		bottom = res->readUint16BE();
@@ -346,7 +372,7 @@ bool Gui::loadWindows() {
 			data.title = Common::String(newTitle);
 		}
 
-		debug(5, "Window loaded: %s", data.title);
+		debug(4, "Window loaded: %s", data.title);
 
 		_windowData->push_back(data);
 	}
@@ -451,10 +477,30 @@ void Gui::drawMainGameWindow() {
 		srf->w,
 		kColorBlack,
 		Graphics::kTextAlignCenter);
+
+	WindowData &data = findWindowData(kMainGameWindow);
+	for (Common::Array<ObjID>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
+		Common::Point pos = _engine->getObjPosition(*it);
+		srf->fillRect(
+			Common::Rect(
+				border.leftOffset * 2 + pos.x,
+				border.topOffset * 2 + pos.y,
+				5,
+				5),
+			kColorBlack);
+	}
 }
 
 void Gui::drawSelfWindow() {
-	warning("drawSelfWindow: Unimplemented");
+	Graphics::ManagedSurface *srf = _selfWindow->getSurface();
+	BorderBounds border = borderBounds(getWindowData(kSelfWindow).type);
+	srf->fillRect(
+		Common::Rect(
+			border.leftOffset * 2,
+			border.topOffset * 2,
+			srf->w - (border.rightOffset * 3),
+			srf->h - (border.bottomOffset * 3)),
+		kColorWhite);
 }
 
 WindowData & Gui::findWindowData(WindowReference reference) {
@@ -477,7 +523,6 @@ WindowData & Gui::findWindowData(WindowReference reference) {
 bool commandsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
 	Gui *g = (Gui*)gui;
 
-
 	return g->processCommandEvents(click, event);
 }
 
@@ -577,7 +622,7 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 	if (winID > 0x90) return;
 	if (winID == kSelfWindow || containerOpen) {
 		if (winID == kMainGameWindow) {
-			warning("Unimplemented: draw main game window");
+			drawMainGameWindow();
 		} else {
 			warning("Unimplemented: fill window with background");
 		}
@@ -618,9 +663,22 @@ WindowReference Gui::createInventoryWindow() {
 	loadBorder(newWindow, "border_self_inac.bmp", false);
 	loadBorder(newWindow, "border_self_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
+
+	debug(3, "Create new inventory window. Reference: %d", newData.refcon);
 	return newData.refcon;
 }
 
+bool Gui::tryCloseWindow(WindowReference winID) {
+	WindowData data = findWindowData(winID);
+	Graphics::MacWindow *wind;
+	if (winID < 0x80) { // Inventory window
+		warning("Window closing not implemented");
+	} else {
+		warning("Window closing not implemented");
+	}
+	return true;
+}
+
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
@@ -635,7 +693,7 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		Common::List<CommandButton>::const_iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			if (it->isInsideBounds(position)) {
-				debug("Command active: %s", it->getData().title);
+				debug(4, "Command active: %s", it->getData().title);
 				data = *it;
 			}
 		}
@@ -649,26 +707,21 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 }
 
 bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & event) {
-	debug(6, "Processing event in Main Game Window");
 	return getWindowData(kMainGameWindow).visible;
 }
 bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
-	debug(6, "Processing event in Out Console Window");
 	return getWindowData(kOutConsoleWindow).visible;
 }
 
 bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event) {
-	debug(6, "Processing event in Self Window");
 	return getWindowData(kSelfWindow).visible;
 }
 
 bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & event) {
-	debug(6, "Processing event in Exits Window");
 	return getWindowData(kExitsWindow).visible;
 }
 
 bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & event) {
-	debug(6, "Processing event in Diploma Window");
 	return getWindowData(kDiplomaWindow).visible;
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index dc08a77..8c964ae 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -27,6 +27,10 @@
 #include "graphics/macgui/macwindow.h"
 #include "graphics/macgui/macmenu.h"
 
+#include "graphics/font.h"
+
+#include "macventure/image.h"
+
 namespace MacVenture {
 
 using namespace Graphics::MacGUIConstants;
@@ -138,6 +142,7 @@ public:
 	void updateWindow(WindowReference winID, bool containerOpen);
 
 	WindowReference createInventoryWindow();
+	bool tryCloseWindow(WindowReference winID);
 
 	// Event processors
 	bool processCommandEvents(WindowClick click, Common::Event &event);
@@ -155,6 +160,7 @@ public:
 	// Modifiers
 	void bringToFront(WindowReference window);
 	void setWindowTitle(WindowReference winID, Common::String string);
+	void updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children);
 
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
new file mode 100644
index 0000000..33f8ce8
--- /dev/null
+++ b/engines/macventure/image.cpp
@@ -0,0 +1,256 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/image.h"
+
+namespace MacVenture {
+
+PPICHuff PPIC1Huff = {
+	// Masks
+	{ 0x0000,0x2000,0x4000,0x5000,0x6000,0x7000,0x8000,0x9000,0xa000,
+	0xb000,0xc000,0xd000,0xd800,0xe000,0xe800,0xf000,0xf800 },
+	// Lens
+	{ 3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5 },
+	// Symbols
+	{ 0x00,0x0f,0x03,0x05,0x06,0x07,0x08,0x09,0x0a,0x0c,0xff,0x01,
+	0x02,0x04,0x0b,0x0d,0xe }
+};
+
+PPICHuff PPIC2Huff = {
+	// Masks
+	{ 0x0000,0x4000,0x8000,0xc000,0xc800,0xd000,0xd800,0xe000,0xe800,
+	0xf000,0xf400,0xf600,0xf800,0xfa00,0xfc00,0xfe00,0xff00 },
+	// Lens
+	{ 2,2,2,5,5,5,5,5,5,6,7,7,7,7,7,8,8 },
+	// Symbols
+	{ 0xff,0x00,0x0f,0x01,0x03,0x07,0x0e,0x0c,0x08,0x06,0x02,0x04,
+	0x09,0x0d,0x0b,0x0a,0x05 }
+};
+
+ImageAsset::ImageAsset(ObjID id, Container * container) {
+	_id = id;
+	_container = container;
+
+	decodePPIC();
+}
+
+ImageAsset::~ImageAsset() {
+	delete _surface;
+	delete _mask;
+	delete[] _data;
+}
+
+void ImageAsset::blit(Graphics::ManagedSurface * target) {
+	debug("Blitting image %x ", _id);
+}
+
+void ImageAsset::decodePPIC() {
+	ObjID realID = _id;
+	uint32 size = _container->getItemByteSize(_id);
+	if (size == 2 || size == 0) {
+		realID = _container->getItem(_id)->readUint16BE();
+	}
+	Common::BitStream32BEMSB stream(_container->getItem(realID));
+
+	uint8 mode = stream.getBits(3);
+	int w, h;
+	if (stream.getBit()) h = stream.getBits(10);
+	else h = stream.getBits(6);
+
+	if (stream.getBit()) w = stream.getBits(10);
+	else w = stream.getBits(6);
+
+	_rowBytes = ((w + 0xF) >> 3) & 0xFFFE;
+	_bitWidth = w;
+	_bitHeight = h;
+
+	_surface = new Graphics::ManagedSurface(_rowBytes, h, Graphics::PixelFormat::createFormatCLUT8());
+	_mask = new Graphics::ManagedSurface(_rowBytes, h, Graphics::PixelFormat::createFormatCLUT8());
+	_data = new byte[_surface->w * _surface->h];
+
+	switch (mode)
+	{
+	case MacVenture::kPPIC0:
+		decodePPIC0(stream);
+		break;
+	case MacVenture::kPPIC1:
+		decodePPIC1(stream);
+		break;
+	case MacVenture::kPPIC2:
+		decodePPIC2(stream);
+		break;
+	case MacVenture::kPPIC3:
+		decodePPIC3(stream);
+		break;
+	}
+}
+
+void ImageAsset::decodePPIC0(Common::BitStream & stream) {	
+	for (uint y = 0; y < _surface->h; y++)
+		for (uint x = 0; x < _surface->w; x++)
+			*(byte*)_surface->getBasePtr(x, y) = (byte)stream.getBits(8);
+}
+
+void ImageAsset::decodePPIC1(Common::BitStream & stream) {
+	decodeHuffGraphic(PPIC1Huff, stream);
+}
+
+void ImageAsset::decodePPIC2(Common::BitStream & stream) {
+	decodeHuffGraphic(PPIC2Huff, stream);
+}
+
+void ImageAsset::decodePPIC3(Common::BitStream & stream) {
+
+}
+
+void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream) {
+	byte flags = 0;
+	_walkRepeat = 0;
+	_walkLast = 0;
+	if (_bitWidth & 3)
+		flags = stream.getBits(5);
+	else
+		flags = stream.getBits(4) << 1;
+
+	byte odd = 0;
+	byte blank = _bitWidth & 0xf;
+	if (blank) {
+		blank >>= 2;
+		odd = blank & 1;
+		blank = 2 - (blank >> 1);
+	}
+
+	uint pos = 0;
+	for (uint y = 0; y < _bitHeight; y++) {
+		uint x = 0;
+		for (; x < _bitWidth >> 3; x++) {
+			byte hi = walkHuff(huff, stream) << 4;
+			_data[pos++] = walkHuff(huff, stream) | hi;
+		}
+		if (odd) {
+			_data[pos] = walkHuff(huff, stream) << 4;
+		}
+		pos += blank;
+	}
+	uint16 edge = _bitWidth & 3;
+	uint16 bits = 0;
+	uint16 val = 0;
+	uint16 v;
+	if (edge) {
+		pos = _rowBytes - blank;
+		for (uint y = 0; y < _bitHeight; y++) {
+			if (flags & 1) {
+				if (bits < edge) {
+					v = walkHuff(huff, stream) << 4;
+					val |= v >> bits;
+					bits += 4;
+				}
+				bits -= edge;
+				v = val;
+				val <<= edge;
+				val &= 0xFF;
+			} else {
+				v = stream.getBits(edge);
+				v <<= 8 - edge;
+			}
+			if (odd)
+				v >>= 4;
+
+			_data[pos] |= v & 0xff;
+			pos += _rowBytes;
+		}
+	}
+	if (flags & 8) {
+		pos = 0;
+		for (uint y = 0; y < _bitHeight; y++) {
+			if (flags & 2) {
+				for (uint x = 0; x < _rowBytes; x++)
+				{
+					_data[pos] ^= v;
+					v = _data[pos];
+					pos++;
+				}
+			}
+			else {
+				for (uint x = 0; x < _rowBytes; x++) {
+					val = _data[pos] ^ v;
+					val ^= (val >> 4) & 0xf;
+					_data[pos] = val;
+					pos++;
+					v = (val << 4) & 0xff;
+				}
+			}
+		}
+	}
+	if (flags & 4) {
+		uint16 delta = _rowBytes * 4;
+		if (flags & 2) delta *= 2;
+		pos = 0;
+		uint q = delta;
+		for (uint i = 0;i < _surface->h * _rowBytes - delta;i++) {
+			_data[q] ^= _data[pos];
+			q++;
+			pos++;
+		}
+	}
+}
+
+byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
+	if (_walkRepeat) {
+		_walkRepeat--;
+		_walkLast = ((_walkLast << 8) & 0xFF00) | (_walkLast >> 8);
+		return _walkLast & 0xFF;
+	}
+	uint16 dw = stream.peekBits(16);
+	uint16 i = 0;
+	for (;i < 16; i++) {
+		if (huff.masks[i + 1] > dw)
+			break;
+	}
+	stream.skip(huff.lens[i]);
+	uint8 val = huff.symbols[i];
+	if (val == 0xFF) {
+		if (!stream.getBit()) {
+			_walkLast &= 0xFF;
+			_walkLast |= _walkLast << 8;
+		}
+		_walkRepeat = stream.getBits(3);
+		if (_walkRepeat < 3) {
+			_walkRepeat <<= 4;
+			_walkRepeat |= stream.getBits(4);
+			if (_walkRepeat < 8) {
+				_walkRepeat <<= 8;
+				_walkRepeat |= stream.getBits(8);
+			}
+		}
+		_walkRepeat -= 2;
+		_walkLast = ((_walkLast << 8) & 0xFF00) | (_walkLast >> 8);
+		return _walkLast & 0xFF;
+	} else {
+		_walkLast <<= 8;
+		_walkLast |= val;
+		_walkLast &= 0xFFFF;
+	}
+	return val;
+}
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 4cc40f1..847b757 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -24,26 +24,59 @@
 #define MACVENTURE_IMAGE_H
 
 #include "macventure/macventure.h"
+#include "macventure/container.h"
 
 namespace MacVenture {
 
+typedef uint32 ObjID;
+class Container;
+
+enum GraphicsEncoding {
+	kPPIC0 = 0,
+	kPPIC1 = 1,
+	kPPIC2 = 2,
+	kPPIC3 = 3
+};
+
+struct PPICHuff {
+	uint16 masks[17];
+	uint16 lens[17];
+	uint8 symbols[17];
+};
+
 class ImageAsset {
 public:
-	ImageAsset(ObjID id, Container *container) {
-		_id = id;
-		_container = container;
-	}
-	~ImageAsset() {
+	ImageAsset(ObjID id, Container *container); 
+	~ImageAsset();
+
+	void blit(Graphics::ManagedSurface *target);
 
-	}
+private:
+	void decodePPIC();
+
+	void decodePPIC0(Common::BitStream &stream); 
+	void decodePPIC1(Common::BitStream &stream); 
+	void decodePPIC2(Common::BitStream &stream);
+	void decodePPIC3(Common::BitStream &stream);
 
-	void blit(Graphics::ManagedSurface *target) {
-		debug("Blitting image %x ", _id);
-	}
+	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream); 
+	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
 private:
 	ObjID _id;
 	Container *_container;
+
+	uint16 _walkRepeat;
+	uint16 _walkLast;
+
+	uint16 _rowBytes;
+	uint16 _bitWidth;
+	uint16 _bitHeight;
+
+	byte* _data;
+
+	Graphics::ManagedSurface *_surface;
+	Graphics::ManagedSurface *_mask;
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 5c8f6b4..f277d24 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -224,6 +224,29 @@ void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source,
 
 void MacVentureEngine::printTexts() {
 	warning("printTexts: unimplemented");
+	for (uint i = 0; i < _textQueue.size(); i++) {
+		QueuedText text = _textQueue.front();
+		_textQueue.remove_at(0);
+		switch (text.id) {
+		case kTextNumber:
+			debug("Print Number: %d", text.asset);
+			break;
+		case kTextNewLine:
+			debug("Print Newline: ");
+			break;
+		case kTextPlain:
+			debug("Print Plain Text: %s", _world->getText(text.asset).c_str());
+			break;		
+		}
+	}
+}
+
+void MacVentureEngine::focusObjWin(ObjID objID) {
+	_gui->bringToFront(getObjWindow(objID));
+}
+
+void MacVentureEngine::updateWindow(WindowReference winID) {
+	_gui->updateWindow(winID, true);
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
@@ -356,8 +379,8 @@ void MacVentureEngine::runObjQueue() {
 void MacVentureEngine::updateControls() {
 	if (_activeControl)
 		_activeControl = kNoCommand;
-	toggleExits();
-	// resetVars();
+	toggleExits();	
+	resetVars();
 }
 
 void MacVentureEngine::resetVars() {
@@ -378,9 +401,11 @@ void MacVentureEngine::focusObjectWindow(ObjID objID) {
 }
 
 void MacVentureEngine::openObject(ObjID objID) {
+
+	debug("openObject: %d", objID);
 	if (getObjWindow(objID)) return;
 	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
-		//_gui->setRefcon(objID, kMainGameWindow); // FIXME: Find better name
+		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true)); // FIXME: Find better name
 		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
 		//_gui->drawExits();
 		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID));
@@ -390,17 +415,54 @@ void MacVentureEngine::openObject(ObjID objID) {
 		//globalToDesktop(p);
 		WindowReference invID = _gui->createInventoryWindow();
 		_gui->setWindowTitle(invID, _world->getText(objID));
-		//_gui->setRefCon(objID, invID);
+		_gui->updateWindowInfo(invID, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(invID, _world->getObjAttr(objID, kAttrContainerOpen));
 	}
 }
 
 void MacVentureEngine::closeObject(ObjID objID) {
-	warning("closeObject: unimplemented");
+	warning("closeObject: not fully implemented");
+	bool success = _gui->tryCloseWindow(getObjWindow(objID));
+	return;
 }
 
 void MacVentureEngine::checkObject(ObjID objID) {
-	warning("checkObject: unimplemented");
+	//warning("checkObject: unimplemented");
+	bool hasChanged = false;
+	debug("Check Object[%d] parent[%d] x[%d] y[%d]",
+		objID, 
+		_world->getObjAttr(objID, kAttrParentObject),
+		_world->getObjAttr(objID, kAttrPosX),
+		_world->getObjAttr(objID, kAttrPosY));
+	//bool incoming = isIncomingObj(objID);
+	//if (incoming) removeIncoming(objID);
+	if (objID == 1) {
+		if (_world->getObjAttr(objID, kAttrParentObject) != 0) {
+			enqueueObject(kSetToPlayerParent, objID);
+		}		
+	} 
+	_gui->updateWindow(findParentWindow(objID), true);
+
+	WindowReference win = getObjWindow(objID);
+	ObjID parent = objID;
+	ObjID root = _world->getObjAttr(1, kAttrParentObject);
+	while (parent != root) {
+		if (parent == 0 || !_world->getObjAttr(parent, kAttrContainerOpen)) break;
+		parent = _world->getObjAttr(parent, kAttrParentObject);
+	}
+	if (parent == root) {
+		if (win) return;
+		enqueueObject(kOpenWindow, objID);
+	} else {
+		if (!win) return;
+		enqueueObject(kCloseWindow, objID);
+	}
+
+	// Update children
+	Common::Array<ObjID> children = _world->getChildren(objID, true);
+	for (uint i = 0; i < children.size(); i++) {
+		enqueueObject(kUpdateObject, children[i]);
+	}
 }
 
 void MacVentureEngine::reflectSwap(ObjID objID) {
@@ -475,6 +537,10 @@ uint32 MacVentureEngine::getInvolvedObjects() {
 	return (_selectedControl ? _globalSettings.cmdArgCnts[_selectedControl - 1] : 3000);
 }
 
+Common::Point MacVentureEngine::getObjPosition(ObjID objID) {
+	return Common::Point(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
+}
+
 WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
 	switch (objID) {
 	case 0xfffc: return kExitsWindow;
@@ -490,6 +556,12 @@ WindowReference MacVentureEngine::findObjWindow(ObjID objID) {
 	return kMainGameWindow;
 }
 
+WindowReference MacVentureEngine::findParentWindow(ObjID objID) {
+	if (objID == 1) return kSelfWindow;
+	ObjID parent = _world->getObjAttr(objID, kAttrParentObject);
+	return getObjWindow(parent);
+}
+
 Common::Point MacVentureEngine::getDeltaPoint() {
 	return _deltaPoint;
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index bb4eec8..a23dbec 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -177,6 +177,9 @@ public:
 	void runObjQueue();
 	void printTexts();
 
+	void focusObjWin(ObjID objID);
+	void updateWindow(WindowReference winID);
+
 	// Data retrieval
 	bool isPaused();
 	Common::String getCommandsPausedString() const;
@@ -186,8 +189,12 @@ public:
 	const HuffmanLists *getDecodingHuffman() const;
 	uint32 randBetween(uint32 min, uint32 max);
 	uint32 getInvolvedObjects();
+
+	Common::Point getObjPosition(ObjID objID);
+
 	WindowReference getObjWindow(ObjID objID);
 	WindowReference findObjWindow(ObjID objID);
+	WindowReference findParentWindow(ObjID objID);
 
 	Common::Point getDeltaPoint();
 	ObjID getDestObject();
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index c0dc818..efd5a69 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
 	text.o \
 	world.o \
 	script.o \
+	image.o \
 	macventure.o
 
 MODULE_DIRS += \
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 715249c..64f94af 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -54,14 +54,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	frame.haltedInFirst = false;
 	frame.haltedInFamily = false;
 	_frames.push_back(frame);
-	debug(7, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+	debug(3, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
 		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
 
 	return resume(true);
 }
 
 bool ScriptEngine::resume(bool execAll) {	
-	debug(7, "SCRIPT: Resume");
+	debug(3, "SCRIPT: Resume");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
@@ -145,13 +145,13 @@ bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 }
 
 bool ScriptEngine::runFunc(EngineFrame *frame) {
-	debug(7, "SCRIPT: I'm running the function");
+	debug(3, "SCRIPT: I'm running the function");
 	ScriptAsset &script = frame->scripts.front();
 	EngineState *state = &frame->state;
 	byte op;	
 	while (script.hasNext()) {
 		op = script.fetch();
-		debug(8, "SCRIPT: I'm running operation %x", op);
+		debug(3, "SCRIPT: I'm running operation %x", op);
 		if (!(op & 0x80)) {
 			state->push(op);
 		} else {
@@ -1157,7 +1157,7 @@ void ScriptAsset::loadInstructions() {
 	for (uint i = 0; i < amount; i++) {
 		_instructions.push_back(res->readByte());
 	}
-	debug(7, "SCRIPT: Load %d instructions for script %d", amount, _id);
+	debug(3, "SCRIPT: Load %d instructions for script %d", amount, _id);
 }
 
 } // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index c7b103e..36e9e21 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -23,11 +23,15 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
 	calculateObjectRelations();
 	
-	_gameText = new Container("Shadowgate II/Shadow Text");
+	warning("Test functions about to happen");
+	_gameGraphics = new Container("Shadowgate II/Shadow Graphic");
+	_gameText = new Container("Shadowgate II/Shadow Text");	
 
 	ObjID tid = (ObjID)1;
 	TextAsset test = TextAsset(tid, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
 
+	ImageAsset testImg(((428 * 2) + 1), _gameGraphics);
+
 	delete saveGameRes;
 	saveGameFile.close();		
 }
@@ -140,9 +144,9 @@ void World::updateObj(ObjID objID) {
 		win = _engine->getObjWindow(objID);
 	}
 	if (win) {
-		//focusObjWin(objID);
+		_engine->focusObjWin(objID);
 		_engine->runObjQueue();
-		//_engine->updateWindow(win);
+		_engine->updateWindow(win);
 	}
 }
 
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index fe45508..8afa75c 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -122,8 +122,10 @@ private:
 	Common::String _startGameFileName;	
 
 	SaveGame *_saveGame;
+
 	Container *_objectConstants;
 	Container *_gameText;
+	Container *_gameGraphics;
 
 	Common::Array<ObjID> _relations; // Parent-child relations, stored in Williams Heap format
 };


Commit: 1cee6caf13fdc44cacd50c7382bb7e967589f683
    https://github.com/scummvm/scummvm/commit/1cee6caf13fdc44cacd50c7382bb7e967589f683
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:31:19+02:00

Commit Message:
MACVENTURE: Test PPIC1 and 2 decoding

Changed paths:
    engines/macventure/image.cpp



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 33f8ce8..c1fb7d0 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -151,12 +151,13 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		}
 		pos += blank;
 	}
-	uint16 edge = _bitWidth & 3;
-	uint16 bits = 0;
-	uint16 val = 0;
-	uint16 v;
+
+	uint16 edge = _bitWidth & 3;	
 	if (edge) {
 		pos = _rowBytes - blank;
+		uint16 bits = 0;
+		uint16 val = 0;
+		uint16 v;
 		for (uint y = 0; y < _bitHeight; y++) {
 			if (flags & 1) {
 				if (bits < edge) {
@@ -182,6 +183,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 	if (flags & 8) {
 		pos = 0;
 		for (uint y = 0; y < _bitHeight; y++) {
+			uint16 v = 0;
 			if (flags & 2) {
 				for (uint x = 0; x < _rowBytes; x++)
 				{
@@ -192,7 +194,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 			}
 			else {
 				for (uint x = 0; x < _rowBytes; x++) {
-					val = _data[pos] ^ v;
+					uint16 val = _data[pos] ^ v;
 					val ^= (val >> 4) & 0xf;
 					_data[pos] = val;
 					pos++;


Commit: 15de1a2e604be9f6c6eb4100cf656deef1afe028
    https://github.com/scummvm/scummvm/commit/15de1a2e604be9f6c6eb4100cf656deef1afe028
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:31:43+02:00

Commit Message:
MACVENTURE: Add graphics blitting

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 725ce38..77e28ba 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -177,6 +177,8 @@ void Gui::initGUI() {
 	_menu->setCommandsCallback(menuCommandsCallback, this);
 	_menu->calcDimensions();
 
+	loadGraphics();
+
 	if (!loadWindows())
 		error("Could not load windows");
 
@@ -275,6 +277,10 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 	}
 }
 
+void Gui::loadGraphics() {
+	_graphics = new Container("Shadowgate II/Shadow Graphic");
+}
+
 bool Gui::loadMenus() {
 
 	// We assume that, if there are static menus, we don't need dynamic ones
@@ -488,7 +494,9 @@ void Gui::drawMainGameWindow() {
 				5,
 				5),
 			kColorBlack);
-	}
+	}		
+	ImageAsset testImg(428, _graphics);
+	testImg.blitInto(srf, border.leftOffset * 2 + 10,border.topOffset * 2 + 10, kBlitBIC);
 }
 
 void Gui::drawSelfWindow() {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 8c964ae..3236d3b 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -29,6 +29,7 @@
 
 #include "graphics/font.h"
 
+#include "macventure/container.h"
 #include "macventure/image.h"
 
 namespace MacVenture {
@@ -185,6 +186,8 @@ private: // Attributes
 	Common::Array<Graphics::MacWindow*> _inventoryWindows;
 	Graphics::Menu *_menu;
 
+	Container *_graphics;
+
 private: // Methods
 
 
@@ -197,6 +200,7 @@ private: // Methods
 	bool loadWindows();
 	bool loadControls();
 	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
+	void loadGraphics();
 
 	// Drawers
 	void drawWindows();
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index c1fb7d0..4a3064d 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -46,28 +46,32 @@ PPICHuff PPIC2Huff = {
 	0x09,0x0d,0x0b,0x0a,0x05 }
 };
 
-ImageAsset::ImageAsset(ObjID id, Container * container) {
-	_id = id;
-	_container = container;
+ImageAsset::ImageAsset(ObjID original, Container * container) {
+	_id = (original * 2);
+	_mask = (original * 2) + 1;
 
-	decodePPIC();
+	_container = container;	
+
+	//_imgData = nullptr;
+	//_maskData = nullptr;
+
+	decodePPIC(_id, _imgData);
+	decodePPIC(_mask, _maskData);
 }
 
 ImageAsset::~ImageAsset() {
-	delete _surface;
-	delete _mask;
-	delete[] _data;
-}
+	//if (_imgData)
+	//	delete[] _imgData;
 
-void ImageAsset::blit(Graphics::ManagedSurface * target) {
-	debug("Blitting image %x ", _id);
+	//if (_maskData)
+	//	delete[] _maskData;
 }
 
-void ImageAsset::decodePPIC() {
-	ObjID realID = _id;
-	uint32 size = _container->getItemByteSize(_id);
+void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
+	ObjID realID = id;
+	uint32 size = _container->getItemByteSize(id);
 	if (size == 2 || size == 0) {
-		realID = _container->getItem(_id)->readUint16BE();
+		realID = _container->getItem(id)->readUint16BE();
 	}
 	Common::BitStream32BEMSB stream(_container->getItem(realID));
 
@@ -83,46 +87,48 @@ void ImageAsset::decodePPIC() {
 	_bitWidth = w;
 	_bitHeight = h;
 
-	_surface = new Graphics::ManagedSurface(_rowBytes, h, Graphics::PixelFormat::createFormatCLUT8());
-	_mask = new Graphics::ManagedSurface(_rowBytes, h, Graphics::PixelFormat::createFormatCLUT8());
-	_data = new byte[_surface->w * _surface->h];
+	for (uint i = 0; i < _rowBytes * h; i++) {
+		data.push_back(0);
+	}
 
 	switch (mode)
 	{
 	case MacVenture::kPPIC0:
-		decodePPIC0(stream);
+		decodePPIC0(stream, data);
 		break;
 	case MacVenture::kPPIC1:
-		decodePPIC1(stream);
+		decodePPIC1(stream, data);
 		break;
 	case MacVenture::kPPIC2:
-		decodePPIC2(stream);
+		decodePPIC2(stream, data);
 		break;
 	case MacVenture::kPPIC3:
-		decodePPIC3(stream);
+		decodePPIC3(stream, data);
 		break;
 	}
 }
 
-void ImageAsset::decodePPIC0(Common::BitStream & stream) {	
-	for (uint y = 0; y < _surface->h; y++)
-		for (uint x = 0; x < _surface->w; x++)
-			*(byte*)_surface->getBasePtr(x, y) = (byte)stream.getBits(8);
+void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data) {
+	warning("Untested loading function: decode PPIC0");
+	uint words = _bitWidth >> 4;
+	for (uint y = 0; y <_bitHeight; y++)
+		for (uint x = 0; x < words; x++)
+			data[y * words + x] = (byte)stream.getBits(8);
 }
 
-void ImageAsset::decodePPIC1(Common::BitStream & stream) {
-	decodeHuffGraphic(PPIC1Huff, stream);
+void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data) {
+	decodeHuffGraphic(PPIC1Huff, stream, data);
 }
 
-void ImageAsset::decodePPIC2(Common::BitStream & stream) {
-	decodeHuffGraphic(PPIC2Huff, stream);
+void ImageAsset::decodePPIC2(Common::BitStream & stream, Common::Array<byte> &data) {
+	decodeHuffGraphic(PPIC2Huff, stream, data);
 }
 
-void ImageAsset::decodePPIC3(Common::BitStream & stream) {
+void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &data) {
 
 }
 
-void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream) {
+void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream, Common::Array<byte> &data) {
 	byte flags = 0;
 	_walkRepeat = 0;
 	_walkLast = 0;
@@ -144,10 +150,10 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		uint x = 0;
 		for (; x < _bitWidth >> 3; x++) {
 			byte hi = walkHuff(huff, stream) << 4;
-			_data[pos++] = walkHuff(huff, stream) | hi;
+			data[pos++] = walkHuff(huff, stream) | hi;
 		}
 		if (odd) {
-			_data[pos] = walkHuff(huff, stream) << 4;
+			data[pos] = walkHuff(huff, stream) << 4;
 		}
 		pos += blank;
 	}
@@ -176,7 +182,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 			if (odd)
 				v >>= 4;
 
-			_data[pos] |= v & 0xff;
+			data[pos] |= v & 0xff;
 			pos += _rowBytes;
 		}
 	}
@@ -187,16 +193,16 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 			if (flags & 2) {
 				for (uint x = 0; x < _rowBytes; x++)
 				{
-					_data[pos] ^= v;
-					v = _data[pos];
+					data[pos] ^= v;
+					v = data[pos];
 					pos++;
 				}
 			}
 			else {
 				for (uint x = 0; x < _rowBytes; x++) {
-					uint16 val = _data[pos] ^ v;
+					uint16 val = data[pos] ^ v;
 					val ^= (val >> 4) & 0xf;
-					_data[pos] = val;
+					data[pos] = val;
 					pos++;
 					v = (val << 4) & 0xff;
 				}
@@ -208,8 +214,8 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		if (flags & 2) delta *= 2;
 		pos = 0;
 		uint q = delta;
-		for (uint i = 0;i < _surface->h * _rowBytes - delta;i++) {
-			_data[q] ^= _data[pos];
+		for (uint i = 0;i < _bitHeight * _rowBytes - delta;i++) {
+			data[q] ^= data[pos];
 			q++;
 			pos++;
 		}
@@ -255,4 +261,72 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 	return val;
 }
 
+void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
+	debug("Blitting image %x ", _id);
+	if (_container->getItemByteSize(_mask)) { // Has mask
+		switch (mode) {
+		case MacVenture::kBlitBIC:
+			blitBIC(target, x, y, _maskData);
+			break;
+		case MacVenture::kBlitOR:
+			blitOR(target, x, y, _maskData);
+			break;
+		}
+	}
+	else if (_container->getItemByteSize(_id)) {
+		switch (mode) {
+		case MacVenture::kBlitBIC:
+			target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorWhite);
+			break;
+		case MacVenture::kBlitOR:
+			target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorBlack);
+			break;
+		}
+	}
+	if (_container->getItemByteSize(_id) && mode > 0) {
+		blitXOR(target, x, y, _maskData);
+	}
+}
+
+void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	for (uint y = 0;y < _bitHeight; y++) {
+		uint bmpofs = y * _rowBytes;
+		byte pix = 0;
+		for (uint x = 0; x < _bitWidth; x++) {
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+			
+			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
+		}
+	}
+}
+
+void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	for (uint y = 0;y < _bitHeight; y++) {
+		uint bmpofs = y * _rowBytes;
+		byte pix = 0;
+		for (uint x = 0; x < _bitWidth; x++) {
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+
+			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
+		}
+	}
+}
+
+void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	for (uint y = 0;y < _bitHeight; y++) {
+		uint bmpofs = y * _rowBytes;
+		byte pix = 0;
+		for (uint x = 0; x < _bitWidth; x++) {
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+
+			if (pix) { // We need to xor
+				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
+				if (p == kColorWhite) p = kColorBlack;
+				else p = kColorWhite;
+				*((byte *)target->getBasePtr(ox + x, oy + y)) = p;
+			}
+		}
+	}
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 847b757..f7ecab3 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -44,26 +44,37 @@ struct PPICHuff {
 	uint8 symbols[17];
 };
 
+enum BlitMode {
+	kBlitBIC = 1,
+	kBlitOR = 2,
+	kBlitXOR = 3
+};
+
 class ImageAsset {
 public:
-	ImageAsset(ObjID id, Container *container); 
+	ImageAsset(ObjID original, Container *container); 
 	~ImageAsset();
 
-	void blit(Graphics::ManagedSurface *target);
+	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
 
 private:
-	void decodePPIC();
+	void decodePPIC(ObjID id, Common::Array<byte> &data);
 
-	void decodePPIC0(Common::BitStream &stream); 
-	void decodePPIC1(Common::BitStream &stream); 
-	void decodePPIC2(Common::BitStream &stream);
-	void decodePPIC3(Common::BitStream &stream);
+	void decodePPIC0(Common::BitStream &stream, Common::Array<byte> &data);
+	void decodePPIC1(Common::BitStream &stream, Common::Array<byte> &data);
+	void decodePPIC2(Common::BitStream &stream, Common::Array<byte> &data);
+	void decodePPIC3(Common::BitStream &stream, Common::Array<byte> &data);
 
-	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream); 
+	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data);
 	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
+	void blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
+	void blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
+	void blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
+
 private:
 	ObjID _id;
+	ObjID _mask;
 	Container *_container;
 
 	uint16 _walkRepeat;
@@ -73,10 +84,8 @@ private:
 	uint16 _bitWidth;
 	uint16 _bitHeight;
 
-	byte* _data;
-
-	Graphics::ManagedSurface *_surface;
-	Graphics::ManagedSurface *_mask;
+	Common::Array<byte> _imgData;
+	Common::Array<byte> _maskData;
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 36e9e21..7a93773 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -24,14 +24,11 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	calculateObjectRelations();
 	
 	warning("Test functions about to happen");
-	_gameGraphics = new Container("Shadowgate II/Shadow Graphic");
 	_gameText = new Container("Shadowgate II/Shadow Text");	
 
 	ObjID tid = (ObjID)1;
 	TextAsset test = TextAsset(tid, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
-
-	ImageAsset testImg(((428 * 2) + 1), _gameGraphics);
-
+	
 	delete saveGameRes;
 	saveGameFile.close();		
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index 8afa75c..f42dd3a 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -125,7 +125,6 @@ private:
 
 	Container *_objectConstants;
 	Container *_gameText;
-	Container *_gameGraphics;
 
 	Common::Array<ObjID> _relations; // Parent-child relations, stored in Williams Heap format
 };


Commit: 27ecdea89169bf9fd2a1c0870a17c93592ff299e
    https://github.com/scummvm/scummvm/commit/27ecdea89169bf9fd2a1c0870a17c93592ff299e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:31:44+02:00

Commit Message:
MACVENTURE: Add & test PPIC3 Huffman loading

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 77e28ba..f0dd82d 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -92,12 +92,18 @@ void Gui::draw() {
 	drawWindows();
 
 	_wm.draw();
+
+	drawTitle();
 }
 
 void Gui::drawMenu() {
 	_menu->draw(&_screen);
 }
 
+void Gui::drawTitle() {
+	warning("drawTitle hasn't been tested yet");
+}
+
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
 	if (event.type == Common::EVENT_LBUTTONDOWN) {
@@ -494,7 +500,12 @@ void Gui::drawMainGameWindow() {
 				5,
 				5),
 			kColorBlack);
-	}		
+	}	
+
+	// Tests
+	ImageAsset testBg(3, _graphics);
+	testBg.blitInto(srf, border.leftOffset * 2, border.topOffset * 2, kBlitDirect);
+
 	ImageAsset testImg(428, _graphics);
 	testImg.blitInto(srf, border.leftOffset * 2 + 10,border.topOffset * 2 + 10, kBlitBIC);
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 3236d3b..404c18e 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -138,6 +138,7 @@ public:
 
 	void draw();
 	void drawMenu();
+	void drawTitle();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
 	void updateWindow(WindowReference winID, bool containerOpen);
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 4a3064d..960c18d 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -46,6 +46,20 @@ PPICHuff PPIC2Huff = {
 	0x09,0x0d,0x0b,0x0a,0x05 }
 };
 
+// Used to load the huffman table in PPIC3 decoding
+byte loadBits[] = {
+		0x08, 0x0f, 0x02, 0xff, 0x00,
+		0x04, 0xff, 0x01,
+		0x07, 0x09, 0x08, 0xff, 0x03,
+		0x04, 0xff, 0x04,
+		0x0a, 0x07, 0x0a, 0x0b, 0x06, 0xff, 0x05,
+		0x06, 0x06, 0x0b, 0xff, 0x07,
+		0x03, 0xff, 0x09,
+		0x04, 0x03, 0x0e, 0xff, 0x0c,
+		0x02, 0xff, 0x0d,
+		0x01, 0xff, 0x0f,
+		0xff };
+
 ImageAsset::ImageAsset(ObjID original, Container * container) {
 	_id = (original * 2);
 	_mask = (original * 2) + 1;
@@ -125,7 +139,47 @@ void ImageAsset::decodePPIC2(Common::BitStream & stream, Common::Array<byte> &da
 }
 
 void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &data) {
+	// We need to load the huffman from the PPIC itself
+	PPICHuff huff;
+	uint16 v, bits;
+	uint16 load = 0;
+	while ((bits = loadBits[load++]) != 0xFF) {
+		v = stream.getBits(bits);
+		while ((bits = loadBits[load++]) != 0xFF) {
+			huff.symbols[loadBits[load++]] = v % bits;
+			v = (v / bits) | 0;
+		}
+		huff.symbols[loadBits[load++]] = v;
+	}
+	huff.symbols[0x10] = 0;
+	for (uint i = 0x10; i > 0; i--)
+		for (uint j = i; j <= 0x10; j++)
+			if (huff.symbols[j] >= huff.symbols[i - 1])
+				huff.symbols[j]++;
+
+	for (uint i = 0x10; i >= 0; i--) {
+		if (huff.symbols[i] == 0x10) {
+			huff.symbols[i] = 0xff;
+			break;
+		}
+	}
+
+	bits = stream.getBits(2) + 1;
+	uint16 mask = 0;
+	for (uint i = 0; i < 0xf; i++) {
+		if (i)
+			while (!stream.getBit()) bits++;
+		huff.lens[i] = bits;
+		huff.masks[i] = mask;
+		mask += 1 << (16 - bits);
+	}
+	huff.masks[0xf] = mask;
+	while (mask&(1 << (16 - bits))) bits++;
+	huff.masks[0x10] = mask | (1 << (16 - bits));
+	huff.lens[0xf] = bits;
+	huff.lens[0x10] = bits;
 
+	decodeHuffGraphic(huff, stream, data);
 }
 
 void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream, Common::Array<byte> &data) {
@@ -263,6 +317,10 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 
 void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
 	debug("Blitting image %x ", _id);
+	if (mode == kBlitDirect) {
+		blitDirect(target, x, y, _imgData);
+	}
+
 	if (_container->getItemByteSize(_mask)) { // Has mask
 		switch (mode) {
 		case MacVenture::kBlitBIC:
@@ -288,6 +346,19 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 	}
 }
 
+void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
+	for (uint y = 0;y < _bitHeight; y++) {
+		uint bmpofs = y * _rowBytes;
+		byte pix = 0;
+		for (uint x = 0; x < _bitWidth; x++) {
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+
+			pix = pix ? kColorWhite : kColorBlack;
+			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
+		}
+	}
+}
+
 void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
 	for (uint y = 0;y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index f7ecab3..21e544a 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -45,6 +45,7 @@ struct PPICHuff {
 };
 
 enum BlitMode {
+	kBlitDirect = 0,
 	kBlitBIC = 1,
 	kBlitOR = 2,
 	kBlitXOR = 3
@@ -68,6 +69,7 @@ private:
 	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data);
 	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
+	void blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
 	void blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
 	void blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
 	void blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index f277d24..e68f7d2 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -76,6 +76,7 @@ Common::Error MacVentureEngine::run() {
 	// Additional setup.
 	debug("MacVentureEngine::init");
 
+
 	_resourceManager = new Common::MacResManager();
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());


Commit: 4d8f8fd36bdb9b1f807f4da04c9e3e4c3438dbfa
    https://github.com/scummvm/scummvm/commit/4d8f8fd36bdb9b1f807f4da04c9e3e4c3438dbfa
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:31:44+02:00

Commit Message:
MACVENTURE: Complete ppic blitting

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f0dd82d..90d57aa 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -480,15 +480,7 @@ void Gui::drawMainGameWindow() {
 			border.topOffset * 2,
 			srf->w - (border.rightOffset * 3),
 			srf->h - (border.bottomOffset * 3)),
-		kColorWhite);
-	getCurrentFont().drawString(
-		srf,
-		Common::String("Main Game Window"),
-		0,
-		(srf->h / 2) - getCurrentFont().getFontHeight(),
-		srf->w,
-		kColorBlack,
-		Graphics::kTextAlignCenter);
+		kColorBlack);	
 
 	WindowData &data = findWindowData(kMainGameWindow);
 	for (Common::Array<ObjID>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
@@ -506,8 +498,9 @@ void Gui::drawMainGameWindow() {
 	ImageAsset testBg(3, _graphics);
 	testBg.blitInto(srf, border.leftOffset * 2, border.topOffset * 2, kBlitDirect);
 
-	ImageAsset testImg(428, _graphics);
-	testImg.blitInto(srf, border.leftOffset * 2 + 10,border.topOffset * 2 + 10, kBlitBIC);
+	//ImageAsset testImg(428, _graphics);
+	//testImg.blitInto(srf, border.leftOffset * 2 + 10,border.topOffset * 2 + 10, kBlitBIC);
+
 }
 
 void Gui::drawSelfWindow() {
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 960c18d..46d440c 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -70,7 +70,9 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 	//_maskData = nullptr;
 
 	decodePPIC(_id, _imgData);
-	decodePPIC(_mask, _maskData);
+
+	if (_container->getItemByteSize(_mask)) // Has mask
+		decodePPIC(_mask, _maskData);
 }
 
 ImageAsset::~ImageAsset() {
@@ -352,9 +354,8 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 		byte pix = 0;
 		for (uint x = 0; x < _bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
-
-			pix = pix ? kColorWhite : kColorBlack;
-			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
+			pix = pix ? kColorBlack : kColorWhite;
+			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
 		}
 	}
 }
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index e68f7d2..9bdb99d 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -132,9 +132,10 @@ Common::Error MacVentureEngine::run() {
 			if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
 				endGame();
 			}
+
+			_gui->draw();
 		}
 
-		_gui->draw();
 		g_system->updateScreen();
 		g_system->delayMillis(50);
 	}


Commit: 0743e9531b5ef871e17cd7ca88966ea2c07b7147
    https://github.com/scummvm/scummvm/commit/0743e9531b5ef871e17cd7ca88966ea2c07b7147
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:32:46+02:00

Commit Message:
MACVENTURE: Implemente dynamic object drawing

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 90d57aa..e202b82 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -86,6 +86,16 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 
 Gui::~Gui() {
 
+	if (_windowData)
+		delete _windowData;
+
+	if (_controlData)
+		delete _controlData;
+
+	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
+	for (; it != _assets.end(); it++) {
+		delete it->_value;
+	}
 }
 
 void Gui::draw() {
@@ -104,6 +114,10 @@ void Gui::drawTitle() {
 	warning("drawTitle hasn't been tested yet");
 }
 
+void Gui::drawExit(ObjID id) {
+	warning("Unimplemented method: drawExit");
+}
+
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
 	if (event.type == Common::EVENT_LBUTTONDOWN) {
@@ -164,7 +178,7 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 				originx = originx > childPos.x ? childPos.x : originx;
 				originy = originy > childPos.y ? childPos.y : originy;
 			}
-			data.children.push_back(child);
+			data.children.push_back(DrawableObject(child, kBlitDirect));
 		}
 	}
 	if (originx != 0x7fff) data.bounds.left = originx;
@@ -172,6 +186,20 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 	if (ref != kMainGameWindow) data.updateScroll = true;
 }
 
+void Gui::addChild(WindowReference target, ObjID child) {
+	findWindowData(target).children.push_back(DrawableObject(child, kBlitDirect));
+}
+
+void Gui::removeChild(WindowReference target, ObjID child) {
+	WindowData data = findWindowData(target);
+	uint index = 0;
+	for (;index < data.children.size(); index++) {
+		if (data.children[index].obj == child) break;
+	}
+
+	data.children.remove_at(index);
+}
+
 void Gui::initGUI() {
 	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
 	_wm.setScreen(&_screen);
@@ -230,6 +258,7 @@ void Gui::initWindows() {
 	_selfWindow->setCallback(selfWindowCallback, this);
 	loadBorder(_selfWindow, "border_self_inac.bmp", false);
 	loadBorder(_selfWindow, "border_self_act.bmp", true);
+	findWindowData(kSelfWindow).children.push_back(DrawableObject(1, kBlitDirect));
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
@@ -443,7 +472,6 @@ void Gui::drawWindows() {
 	drawCommandsWindow();
 	drawMainGameWindow();
 
-	drawSelfWindow();
 }
 
 void Gui::drawCommandsWindow() {
@@ -460,8 +488,7 @@ void Gui::drawCommandsWindow() {
 			data.bounds.right - data.bounds.left,
 			kColorBlack,
 			Graphics::kTextAlignCenter);
-	}
-	else {
+	} else {
 		Common::List<CommandButton>::const_iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			CommandButton button = *it;
@@ -474,32 +501,15 @@ void Gui::drawCommandsWindow() {
 void Gui::drawMainGameWindow() {
 	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
 	BorderBounds border = borderBounds(getWindowData(kMainGameWindow).type);
-	srf->fillRect(
-		Common::Rect(
-			border.leftOffset * 2,
-			border.topOffset * 2,
-			srf->w - (border.rightOffset * 3),
-			srf->h - (border.bottomOffset * 3)),
-		kColorBlack);	
-
-	WindowData &data = findWindowData(kMainGameWindow);
-	for (Common::Array<ObjID>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
-		Common::Point pos = _engine->getObjPosition(*it);
-		srf->fillRect(
-			Common::Rect(
-				border.leftOffset * 2 + pos.x,
-				border.topOffset * 2 + pos.y,
-				5,
-				5),
-			kColorBlack);
-	}	
 
-	// Tests
-	ImageAsset testBg(3, _graphics);
-	testBg.blitInto(srf, border.leftOffset * 2, border.topOffset * 2, kBlitDirect);
+	ImageAsset bg(3, _graphics);
+	bg.blitInto(
+		_mainGameWindow->getSurface(),
+		border.leftOffset * 2,
+		border.topOffset * 2,
+		kBlitDirect);
 
-	//ImageAsset testImg(428, _graphics);
-	//testImg.blitInto(srf, border.leftOffset * 2 + 10,border.topOffset * 2 + 10, kBlitBIC);
+	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
 }
 
@@ -515,6 +525,27 @@ void Gui::drawSelfWindow() {
 		kColorWhite);
 }
 
+void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
+	WindowData &data = findWindowData(kMainGameWindow);
+	BorderBounds border = borderBounds(data.type);
+	Common::Point pos;
+	ObjID child;
+	BlitMode mode;
+	for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
+		child = (*it).obj;
+		mode = (BlitMode)(*it).mode;
+		pos = _engine->getObjPosition(child);
+		if (!_assets.contains(child)) {
+			_assets[child] = new ImageAsset(child, _graphics);
+		}
+		_assets[child]->blitInto(
+			surface,
+			border.leftOffset * 2 + pos.x,
+			border.topOffset * 2 + pos.y,
+			mode);
+	}
+}
+
 WindowData & Gui::findWindowData(WindowReference reference) {
 	assert(_windowData);
 
@@ -631,7 +662,7 @@ void Gui::handleMenuAction(MenuAction action) {
 }
 
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
-	if (winID > 0x90) return;
+	if (winID > 0x90 || winID == kNoWindow) return;
 	if (winID == kSelfWindow || containerOpen) {
 		if (winID == kMainGameWindow) {
 			drawMainGameWindow();
@@ -639,9 +670,21 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 			warning("Unimplemented: fill window with background");
 		}
 		WindowData &data = findWindowData(winID);
-		Common::Array<ObjID> children = data.children;
-		for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
-			warning("Unimplemented: draw object %x", *it);
+		Common::Array<DrawableObject> &children = data.children;
+		for (uint i = 0; i < children.size(); i++) {
+			uint flag = 0;
+			ObjID child = children[i].obj;
+			BlitMode mode;
+			bool off = _engine->isObjVisible(child);
+			if (!off || _engine->isObjClickable(child)) {
+				mode = kBlitBIC;
+				if (_engine->isObjSelected(child)) {
+					mode = kBlitOR;
+				} else if (off || flag) {
+					mode = kBlitXOR;
+				}
+				children[i] = DrawableObject(child, mode);
+			}
 		}
 		if (data.type == kZoomDoc && data.updateScroll) {
 			warning("Unimplemented: update scroll");
@@ -682,7 +725,6 @@ WindowReference Gui::createInventoryWindow() {
 
 bool Gui::tryCloseWindow(WindowReference winID) {
 	WindowData data = findWindowData(winID);
-	Graphics::MacWindow *wind;
 	if (winID < 0x80) { // Inventory window
 		warning("Window closing not implemented");
 	} else {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 404c18e..2e8b6e2 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -39,7 +39,9 @@ using namespace Graphics::MacWindowConstants;
 class MacVentureEngine;
 typedef uint32 ObjID;
 
-//namespace MacVentureMenuActions {
+class CommandButton;
+class ImageAsset;
+
 enum MenuAction {
 	kMenuActionAbout,
 	kMenuActionNew,
@@ -60,6 +62,7 @@ enum MenuAction {
 //} using namespace MacVentureMenuActions;
 
 enum WindowReference {
+	kNoWindow = 0,
 	kCommandsWindow = 0x80,
 	kMainGameWindow = 0x81,
 	kOutConsoleWindow = 0x82,
@@ -83,6 +86,16 @@ enum MVWindowType {
 	kRDoc10 = 0x16
 };
 
+
+struct DrawableObject {
+	ObjID obj;
+	byte mode;
+	DrawableObject(ObjID id, byte md) {
+		obj = id;
+		mode = md;
+	}
+};
+
 struct WindowData {
 	Common::Rect bounds;
 	MVWindowType type;
@@ -91,7 +104,7 @@ struct WindowData {
 	WindowReference refcon;
 	uint8 titleLength;
 	Common::String title;
-	Common::Array<ObjID> children;
+	Common::Array<DrawableObject> children;
 	bool updateScroll;
 };
 
@@ -139,6 +152,7 @@ public:
 	void draw();
 	void drawMenu();
 	void drawTitle();
+	void drawExit(ObjID id);
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
 	void updateWindow(WindowReference winID, bool containerOpen);
@@ -164,6 +178,9 @@ public:
 	void setWindowTitle(WindowReference winID, Common::String string);
 	void updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children);
 
+	void addChild(WindowReference target, ObjID child);
+	void removeChild(WindowReference target, ObjID child);
+
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
 
@@ -188,10 +205,10 @@ private: // Attributes
 	Graphics::Menu *_menu;
 
 	Container *_graphics;
+	Common::HashMap<ObjID, ImageAsset*> _assets;
 
 private: // Methods
 
-
 	// Initializers
 	void initGUI();
 	void initWindows();
@@ -209,6 +226,8 @@ private: // Methods
 	void drawMainGameWindow();
 	void drawSelfWindow();
 
+	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
+
 	// Finders
 	WindowData& findWindowData(WindowReference reference);
 
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 46d440c..47b755a 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -318,9 +318,9 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 }
 
 void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
-	debug("Blitting image %x ", _id);
 	if (mode == kBlitDirect) {
 		blitDirect(target, x, y, _imgData);
+		return;
 	}
 
 	if (_container->getItemByteSize(_mask)) { // Has mask
@@ -344,7 +344,7 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 		}
 	}
 	if (_container->getItemByteSize(_id) && mode > 0) {
-		blitXOR(target, x, y, _maskData);
+		blitXOR(target, x, y, _imgData);
 	}
 }
 
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 21e544a..eb52da8 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -31,6 +31,14 @@ namespace MacVenture {
 typedef uint32 ObjID;
 class Container;
 
+
+enum BlitMode {
+	kBlitDirect = 0,
+	kBlitBIC = 1,
+	kBlitOR = 2,
+	kBlitXOR = 3
+};
+
 enum GraphicsEncoding {
 	kPPIC0 = 0,
 	kPPIC1 = 1,
@@ -44,13 +52,6 @@ struct PPICHuff {
 	uint8 symbols[17];
 };
 
-enum BlitMode {
-	kBlitDirect = 0,
-	kBlitBIC = 1,
-	kBlitOR = 2,
-	kBlitXOR = 3
-};
-
 class ImageAsset {
 public:
 	ImageAsset(ObjID original, Container *container); 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9bdb99d..87b5d51 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -115,13 +115,15 @@ Common::Error MacVentureEngine::run() {
 		if (_prepared) {
 			_prepared = false;	
 
+			if (!_halted)
+				updateState();
+
 			if (_cmdReady || _halted) {
 				_halted = false;
 				if (runScriptEngine()) {
 					_halted = true;
 					_paused = true;
-				}
-				else {
+				} else {
 					_paused = false;
 					if (!updateState()) {
 						updateControls();
@@ -131,10 +133,9 @@ Common::Error MacVentureEngine::run() {
 
 			if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
 				endGame();
-			}
-
-			_gui->draw();
+			}			
 		}
+		_gui->draw();
 
 		g_system->updateScreen();
 		g_system->delayMillis(50);
@@ -210,7 +211,7 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID) {
 	obj.exitx = _world->getObjAttr(objID, kAttrExitX);
 	obj.exity = _world->getObjAttr(objID, kAttrExitY);
 	obj.hidden = _world->getObjAttr(objID, kAttrHiddenExit);
-	obj.offsecreen = _world->getObjAttr(objID, kAttrInvisible);
+	obj.offscreen = _world->getObjAttr(objID, kAttrInvisible);
 	obj.invisible = _world->getObjAttr(objID, kAttrUnclickable);
 	_objQueue.push_back(obj);
 }
@@ -224,7 +225,7 @@ void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source,
 	_textQueue.push_back(newText);
 }
 
-void MacVentureEngine::printTexts() {
+bool MacVentureEngine::printTexts() {
 	warning("printTexts: unimplemented");
 	for (uint i = 0; i < _textQueue.size(); i++) {
 		QueuedText text = _textQueue.front();
@@ -232,12 +233,15 @@ void MacVentureEngine::printTexts() {
 		switch (text.id) {
 		case kTextNumber:
 			debug("Print Number: %d", text.asset);
+			gameChanged();
 			break;
 		case kTextNewLine:
 			debug("Print Newline: ");
+			gameChanged();
 			break;
 		case kTextPlain:
 			debug("Print Plain Text: %s", _world->getText(text.asset).c_str());
+			gameChanged();
 			break;		
 		}
 	}
@@ -326,7 +330,8 @@ void MacVentureEngine::endGame() {
 
 bool MacVentureEngine::updateState() {
 	runObjQueue();
-	return true;
+	bool wait = printTexts();
+	return wait;
 }
 
 void MacVentureEngine::revert() {
@@ -359,7 +364,7 @@ void MacVentureEngine::runObjQueue() {
 			closeObject(obj.object);
 			break;
 		case 0x7:
-			checkObject(obj.object);
+			checkObject(obj);
 			break;
 		case 0x8:
 			reflectSwap(obj.object);
@@ -428,40 +433,68 @@ void MacVentureEngine::closeObject(ObjID objID) {
 	return;
 }
 
-void MacVentureEngine::checkObject(ObjID objID) {
+void MacVentureEngine::checkObject(QueuedObject old) {
 	//warning("checkObject: unimplemented");
 	bool hasChanged = false;
 	debug("Check Object[%d] parent[%d] x[%d] y[%d]",
-		objID, 
-		_world->getObjAttr(objID, kAttrParentObject),
-		_world->getObjAttr(objID, kAttrPosX),
-		_world->getObjAttr(objID, kAttrPosY));
+		old.object,
+		_world->getObjAttr(old.object, kAttrParentObject),
+		_world->getObjAttr(old.object, kAttrPosX),
+		_world->getObjAttr(old.object, kAttrPosY));
 	//bool incoming = isIncomingObj(objID);
 	//if (incoming) removeIncoming(objID);
-	if (objID == 1) {
-		if (_world->getObjAttr(objID, kAttrParentObject) != 0) {
-			enqueueObject(kSetToPlayerParent, objID);
-		}		
-	} 
-	_gui->updateWindow(findParentWindow(objID), true);
-
-	WindowReference win = getObjWindow(objID);
-	ObjID parent = objID;
+	ObjID id = old.object;
+	if (id == 1) {
+		if (old.parent != _world->getObjAttr(id, kAttrParentObject)) {
+			enqueueObject(kSetToPlayerParent, id);
+		}
+		if (old.offscreen != _world->getObjAttr(id, kAttrInvisible) ||
+			old.invisible != _world->getObjAttr(id, kAttrUnclickable)) {
+			updateWindow(findParentWindow(id));
+		}
+	} else if (old.parent != _world->getObjAttr(id, kAttrParentObject) ||
+				old.x != _world->getObjAttr(id, kAttrPosX) ||
+				old.y != _world->getObjAttr(id, kAttrPosY)) {
+		WindowReference oldWin = getObjWindow(old.parent);
+		if (oldWin) {
+			_gui->removeChild(oldWin, id);
+			hasChanged = true;
+		}
+
+		WindowReference newWin = getObjWindow(id);
+		if (newWin) {
+			_gui->addChild(newWin, id);
+			hasChanged = true;
+		}
+	} else if (old.offscreen != _world->getObjAttr(id, kAttrInvisible) ||
+				old.invisible != _world->getObjAttr(id, kAttrUnclickable)) {
+		updateWindow(findParentWindow(id));
+	}
+
+	if (_world->getObjAttr(id, kAttrIsExit)) {
+		if (hasChanged ||
+			old.hidden != _world->getObjAttr(id, kAttrHiddenExit) ||
+			old.exitx != _world->getObjAttr(id, kAttrExitX) ||
+			old.exity != _world->getObjAttr(id, kAttrExitY))
+			_gui->drawExit(id);
+	}
+	WindowReference win = getObjWindow(id);
+	ObjID cur = id;
 	ObjID root = _world->getObjAttr(1, kAttrParentObject);
-	while (parent != root) {
-		if (parent == 0 || !_world->getObjAttr(parent, kAttrContainerOpen)) break;
-		parent = _world->getObjAttr(parent, kAttrParentObject);
+	while (cur != root)	{
+		if (cur == 0 || !_world->getObjAttr(cur, kAttrContainerOpen)) break;
+		cur = _world->getObjAttr(cur, kAttrParentObject);
 	}
-	if (parent == root) {
+	if (cur == root) {
 		if (win) return;
-		enqueueObject(kOpenWindow, objID);
+		enqueueObject(kOpenWindow, id); //open
 	} else {
 		if (!win) return;
-		enqueueObject(kCloseWindow, objID);
+		enqueueObject(kCloseWindow, id); //close
 	}
 
 	// Update children
-	Common::Array<ObjID> children = _world->getChildren(objID, true);
+	Common::Array<ObjID> children = _world->getChildren(id, true);
 	for (uint i = 0; i < children.size(); i++) {
 		enqueueObject(kUpdateObject, children[i]);
 	}
@@ -543,6 +576,19 @@ Common::Point MacVentureEngine::getObjPosition(ObjID objID) {
 	return Common::Point(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
 }
 
+bool MacVentureEngine::isObjVisible(ObjID objID) {
+	return _world->getObjAttr(objID, kAttrInvisible) == 0;
+}
+
+bool MacVentureEngine::isObjClickable(ObjID objID) {
+	return _world->getObjAttr(objID, kAttrUnclickable) == 0;
+}
+
+bool MacVentureEngine::isObjSelected(ObjID objID) {
+	warning("Unimplemented: isObjSelected");
+	return false;
+}
+
 WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
 	switch (objID) {
 	case 0xfffc: return kExitsWindow;
@@ -555,7 +601,12 @@ WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
 }
 
 WindowReference MacVentureEngine::findObjWindow(ObjID objID) {
-	return kMainGameWindow;
+	// This is a bit of a hack, we take advantage of the consecutive nature of references
+	for (uint i = kCommandsWindow; i <= kDiplomaWindow; i++) {
+		const WindowData &data = _gui->getWindowData((WindowReference)i);
+		if (data.refcon == objID) { return data.refcon; }
+	}
+	return kNoWindow;
 }
 
 WindowReference MacVentureEngine::findParentWindow(ObjID objID) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index a23dbec..7e6f362 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -133,7 +133,7 @@ struct QueuedObject {
 	uint exitx;
 	uint exity;
 	bool hidden;
-	bool offsecreen;
+	bool offscreen;
 	bool invisible;
 };
 
@@ -175,7 +175,7 @@ public:
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
 
 	void runObjQueue();
-	void printTexts();
+	bool printTexts();
 
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
@@ -190,7 +190,11 @@ public:
 	uint32 randBetween(uint32 min, uint32 max);
 	uint32 getInvolvedObjects();
 
+	// Attributes consult
 	Common::Point getObjPosition(ObjID objID);
+	bool isObjVisible(ObjID objID);
+	bool isObjClickable(ObjID objID);
+	bool isObjSelected(ObjID objID);
 
 	WindowReference getObjWindow(ObjID objID);
 	WindowReference findObjWindow(ObjID objID);
@@ -212,7 +216,7 @@ private:
 	void focusObjectWindow(ObjID objID);
 	void openObject(ObjID objID);
 	void closeObject(ObjID objID);
-	void checkObject(ObjID objID);
+	void checkObject(QueuedObject objID);
 	void reflectSwap(ObjID objID);
 	void toggleExits();
 	void zoomObject(ObjID objID);
@@ -252,6 +256,7 @@ private: // Attributes
 	bool _gameChanged;
 
 	Common::Array<QueuedObject> _objQueue;
+	Common::Array<QueuedObject> _inQueue;
 	Common::Array<QueuedObject> _soundQueue;
 	Common::Array<QueuedText> _textQueue;
 
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index efd5a69..022b8d7 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -1,13 +1,13 @@
 MODULE := engines/macventure
 
 MODULE_OBJS := \
+	image.o \
 	detection.o \
 	gui.o \
 	object.o \
 	text.o \
 	world.o \
 	script.o \
-	image.o \
 	macventure.o
 
 MODULE_DIRS += \
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 7a93773..2ee7bae 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -122,7 +122,7 @@ Common::Array<ObjID> World::getChildren(ObjID objID, bool recursive) {
 			res.push_back(getChildren(child, false));
 		child = _relations[child * 2 + 1];
 	}
-	return Common::Array<ObjID>();
+	return res;
 }
 
 Attribute World::getGlobal(uint32 attrID) {


Commit: 1540674f7720f520bdb585999e24ceb653c9bda3
    https://github.com/scummvm/scummvm/commit/1540674f7720f520bdb585999e24ceb653c9bda3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:33:25+02:00

Commit Message:
MACVENTURE: Fix dymanic object drawing

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index e202b82..5c1747c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -26,6 +26,9 @@
 #include "macventure/macventure.h"
 #include "macventure/gui.h"
 
+//Test
+#include "common/system.h"
+
 namespace MacVenture {
 
 enum MenuAction;
@@ -99,11 +102,12 @@ Gui::~Gui() {
 }
 
 void Gui::draw() {
-	drawWindows();
 
-	_wm.draw();
+	drawWindows();
 
 	drawTitle();
+
+	_wm.draw();
 }
 
 void Gui::drawMenu() {
@@ -178,7 +182,7 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 				originx = originx > childPos.x ? childPos.x : originx;
 				originy = originy > childPos.y ? childPos.y : originy;
 			}
-			data.children.push_back(DrawableObject(child, kBlitDirect));
+			data.children.push_back(DrawableObject(child, kBlitBIC));
 		}
 	}
 	if (originx != 0x7fff) data.bounds.left = originx;
@@ -187,7 +191,7 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 }
 
 void Gui::addChild(WindowReference target, ObjID child) {
-	findWindowData(target).children.push_back(DrawableObject(child, kBlitDirect));
+	findWindowData(target).children.push_back(DrawableObject(child, kBlitBIC));
 }
 
 void Gui::removeChild(WindowReference target, ObjID child) {
@@ -502,8 +506,11 @@ void Gui::drawMainGameWindow() {
 	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
 	BorderBounds border = borderBounds(getWindowData(kMainGameWindow).type);
 
-	ImageAsset bg(3, _graphics);
-	bg.blitInto(
+	if (!_assets.contains(3)) {
+		_assets[3] = new ImageAsset(3, _graphics);
+	}
+
+	_assets[3]->blitInto(
 		_mainGameWindow->getSurface(),
 		border.leftOffset * 2,
 		border.topOffset * 2,
@@ -511,18 +518,16 @@ void Gui::drawMainGameWindow() {
 
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
+	// To be deleted
+	_wm.draw();
+
+	g_system->updateScreen();
+
 }
 
 void Gui::drawSelfWindow() {
 	Graphics::ManagedSurface *srf = _selfWindow->getSurface();
 	BorderBounds border = borderBounds(getWindowData(kSelfWindow).type);
-	srf->fillRect(
-		Common::Rect(
-			border.leftOffset * 2,
-			border.topOffset * 2,
-			srf->w - (border.rightOffset * 3),
-			srf->h - (border.bottomOffset * 3)),
-		kColorWhite);
 }
 
 void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -543,6 +548,12 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 			border.leftOffset * 2 + pos.x,
 			border.topOffset * 2 + pos.y,
 			mode);
+
+		// To be deleted
+		_wm.draw();
+
+		g_system->updateScreen();
+
 	}
 }
 
@@ -674,14 +685,14 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 		for (uint i = 0; i < children.size(); i++) {
 			uint flag = 0;
 			ObjID child = children[i].obj;
-			BlitMode mode;
-			bool off = _engine->isObjVisible(child);
-			if (!off || _engine->isObjClickable(child)) {
+			BlitMode mode = kBlitDirect;
+			bool off = !_engine->isObjVisible(child);
+			if (flag || !off || !_engine->isObjClickable(child)) {
 				mode = kBlitBIC;
-				if (_engine->isObjSelected(child)) {
-					mode = kBlitOR;
-				} else if (off || flag) {
+				if (off || flag) {
 					mode = kBlitXOR;
+				} else if (_engine->isObjSelected(child)) {
+					mode = kBlitOR;
 				}
 				children[i] = DrawableObject(child, mode);
 			}
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 47b755a..60f491c 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -332,8 +332,7 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 			blitOR(target, x, y, _maskData);
 			break;
 		}
-	}
-	else if (_container->getItemByteSize(_id)) {
+	} else if (_container->getItemByteSize(_id)) {
 		switch (mode) {
 		case MacVenture::kBlitBIC:
 			target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorWhite);
@@ -343,12 +342,24 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 			break;
 		}
 	}
+
 	if (_container->getItemByteSize(_id) && mode > 0) {
 		blitXOR(target, x, y, _imgData);
 	}
 }
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
+	if (_bitWidth == 0 || _bitHeight == 0) return;
+	uint w = _bitWidth;
+	uint h = _bitHeight;
+	uint sx = 0;
+	uint sy = 0;
+	if (ox<0) { sx = -ox; ox = 0; }
+	if (oy<0) { sy = -oy; oy = 0; }
+	if (w + ox >= target->w) w = target->w - ox;
+	if (h + oy >= target->h) h = target->h - oy;
+	if (w == 0 || h == 0) return;
+	
 	for (uint y = 0;y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
@@ -361,10 +372,21 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 }
 
 void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
-	for (uint y = 0;y < _bitHeight; y++) {
+	if (_bitWidth == 0 || _bitHeight == 0) return;
+	uint w = _bitWidth;
+	uint h = _bitHeight;
+	uint sx = 0;
+	uint sy = 0;
+	if (ox<0) { sx = -ox; ox = 0; }
+	if (oy<0) { sy = -oy; oy = 0; }
+	if (w + ox >= target->w) w = target->w - ox;
+	if (h + oy >= target->h) h = target->h - oy;
+	if (w == 0 || h == 0) return;
+
+	for (uint y = 0;y < h; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < _bitWidth; x++) {
+		for (uint x = 0; x < w; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
@@ -373,6 +395,17 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 }
 
 void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	if (_bitWidth == 0 || _bitHeight == 0) return;
+	uint w = _bitWidth;
+	uint h = _bitHeight;
+	uint sx = 0;
+	uint sy = 0;
+	if (ox<0) { sx = -ox; ox = 0; }
+	if (oy<0) { sy = -oy; oy = 0; }
+	if (w + ox >= target->w) w = target->w - ox;
+	if (h + oy >= target->h) h = target->h - oy;
+	if (w == 0 || h == 0) return;
+	
 	for (uint y = 0;y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
@@ -385,6 +418,17 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy,
 }
 
 void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	if (_bitWidth == 0 || _bitHeight == 0) return;
+	uint w = _bitWidth;
+	uint h = _bitHeight;
+	uint sx = 0;
+	uint sy = 0;
+	if (ox<0) { sx = -ox; ox = 0; }
+	if (oy<0) { sy = -oy; oy = 0; }
+	if (w + ox >= target->w) w = target->w - ox;
+	if (h + oy >= target->h) h = target->h - oy;
+	if (w == 0 || h == 0) return;
+	
 	for (uint y = 0;y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
@@ -393,9 +437,9 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 
 			if (pix) { // We need to xor
 				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
-				if (p == kColorWhite) p = kColorBlack;
-				else p = kColorWhite;
-				*((byte *)target->getBasePtr(ox + x, oy + y)) = p;
+
+				*((byte *)target->getBasePtr(ox + x, oy + y)) = 
+					(p == kColorWhite) ? kColorBlack : kColorWhite;
 			}
 		}
 	}


Commit: 0fb344dfeda53e81a70e89be45bda6d5c0614e7e
    https://github.com/scummvm/scummvm/commit/0fb344dfeda53e81a70e89be45bda6d5c0614e7e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:34:11+02:00

Commit Message:
MACVENTURE: Hack for dynamic object drawing

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 5c1747c..1ac1d0b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -26,9 +26,6 @@
 #include "macventure/macventure.h"
 #include "macventure/gui.h"
 
-//Test
-#include "common/system.h"
-
 namespace MacVenture {
 
 enum MenuAction;
@@ -103,8 +100,10 @@ Gui::~Gui() {
 
 void Gui::draw() {
 
-	drawWindows();
+	// Will be performance-improved after the milestone
+	_wm.setFullRefresh(true);
 
+	drawWindows();
 	drawTitle();
 
 	_wm.draw();
@@ -225,7 +224,6 @@ void Gui::initGUI() {
 	if (!loadControls())
 		error("Could not load controls");
 
-
 	draw();
 
 }
@@ -506,6 +504,8 @@ void Gui::drawMainGameWindow() {
 	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
 	BorderBounds border = borderBounds(getWindowData(kMainGameWindow).type);
 
+	_mainGameWindow->setDirty(true);
+
 	if (!_assets.contains(3)) {
 		_assets[3] = new ImageAsset(3, _graphics);
 	}
@@ -518,11 +518,6 @@ void Gui::drawMainGameWindow() {
 
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
-	// To be deleted
-	_wm.draw();
-
-	g_system->updateScreen();
-
 }
 
 void Gui::drawSelfWindow() {
@@ -549,11 +544,8 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 			border.topOffset * 2 + pos.y,
 			mode);
 
-		// To be deleted
+		// To be deleted, this is a big hack, but it doesn't work without it.
 		_wm.draw();
-
-		g_system->updateScreen();
-
 	}
 }
 


Commit: ec7eb7cb5bec5174f7fd3446824280ab44050f5e
    https://github.com/scummvm/scummvm/commit/ec7eb7cb5bec5174f7fd3446824280ab44050f5e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:34:53+02:00

Commit Message:
MACVENTURE: Game window object selection and some more opcodes

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 1ac1d0b..f1eb8b6 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -104,7 +104,6 @@ void Gui::draw() {
 	_wm.setFullRefresh(true);
 
 	drawWindows();
-	drawTitle();
 
 	_wm.draw();
 }
@@ -121,14 +120,6 @@ void Gui::drawExit(ObjID id) {
 	warning("Unimplemented method: drawExit");
 }
 
-bool Gui::processEvent(Common::Event &event) {
-	bool processed = false;
-	if (event.type == Common::EVENT_LBUTTONDOWN) {
-		debug("Click on the ui");
-	}
-	return (processed || _wm.processEvent(event));
-}
-
 const WindowData& Gui::getWindowData(WindowReference reference) {
 	return findWindowData(reference);
 }
@@ -736,6 +727,13 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 	return true;
 }
 
+bool Gui::processEvent(Common::Event &event) {
+	bool processed = false;
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
+		debug("Click on the ui");
+	}
+	return (processed || _wm.processEvent(event));
+}
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
@@ -764,7 +762,25 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 }
 
 bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & event) {
-	return getWindowData(kMainGameWindow).visible;
+	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
+		WindowData &data = findWindowData(kMainGameWindow);
+		ObjID child;
+		BlitMode mode;
+		Common::Point pos;
+		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
+			child = (*it).obj;
+			mode = (BlitMode)(*it).mode;
+			pos = _engine->getObjPosition(child);
+			pos.x += data.bounds.left;
+			pos.y += data.bounds.top;
+			if (_assets[child]->isPointInside(pos, event.mouse)) {
+				// select the first object clicked
+				_engine->selectObject(child);
+				return true;
+			}
+		}
+	}
+	return false;
 }
 bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
 	return getWindowData(kOutConsoleWindow).visible;
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 60f491c..de4e3ba 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -65,10 +65,6 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 	_mask = (original * 2) + 1;
 
 	_container = container;	
-
-	//_imgData = nullptr;
-	//_maskData = nullptr;
-
 	decodePPIC(_id, _imgData);
 
 	if (_container->getItemByteSize(_mask)) // Has mask
@@ -76,11 +72,6 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 }
 
 ImageAsset::~ImageAsset() {
-	//if (_imgData)
-	//	delete[] _imgData;
-
-	//if (_maskData)
-	//	delete[] _maskData;
 }
 
 void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
@@ -348,6 +339,11 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 	}
 }
 
+bool ImageAsset::isPointInside(Common::Point myPos, Common::Point click) {
+	Common::Rect bounds(myPos.x, myPos.y, myPos.x + _bitWidth, myPos.y + _bitHeight);
+	return bounds.contains(click);
+}
+
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
 	if (_bitWidth == 0 || _bitHeight == 0) return;
 	uint w = _bitWidth;
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index eb52da8..0a3ea50 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -59,6 +59,8 @@ public:
 
 	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
 
+	bool isPointInside(Common::Point myPos, Common::Point click);
+
 private:
 	void decodePPIC(ObjID id, Common::Array<byte> &data);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 87b5d51..8d367c7 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -204,15 +204,17 @@ void MacVentureEngine::loseGame() {
 void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID) {
 	QueuedObject obj;
 	obj.id = type;
-	obj.object = objID;
-	obj.parent = _world->getObjAttr(objID, kAttrParentObject);
-	obj.x = _world->getObjAttr(objID, kAttrPosX);
-	obj.y = _world->getObjAttr(objID, kAttrPosY);
-	obj.exitx = _world->getObjAttr(objID, kAttrExitX);
-	obj.exity = _world->getObjAttr(objID, kAttrExitY);
-	obj.hidden = _world->getObjAttr(objID, kAttrHiddenExit);
-	obj.offscreen = _world->getObjAttr(objID, kAttrInvisible);
-	obj.invisible = _world->getObjAttr(objID, kAttrUnclickable);
+	if (type != kHightlightExits) {		
+		obj.object = objID;
+		obj.parent = _world->getObjAttr(objID, kAttrParentObject);
+		obj.x = _world->getObjAttr(objID, kAttrPosX);
+		obj.y = _world->getObjAttr(objID, kAttrPosY);
+		obj.exitx = _world->getObjAttr(objID, kAttrExitX);
+		obj.exity = _world->getObjAttr(objID, kAttrExitY);
+		obj.hidden = _world->getObjAttr(objID, kAttrHiddenExit);
+		obj.offscreen = _world->getObjAttr(objID, kAttrInvisible);
+		obj.invisible = _world->getObjAttr(objID, kAttrUnclickable);
+	}
 	_objQueue.push_back(obj);
 }
 
@@ -247,6 +249,26 @@ bool MacVentureEngine::printTexts() {
 	}
 }
 
+void MacVentureEngine::selectObject(ObjID objID) {
+	bool found = false;
+	uint i = 0;
+	while (i < _currentSelection.size() && !found) {
+		if (_currentSelection[i] == objID) found = true;
+		else i++;
+	}		
+	
+	if (!found) _currentSelection.push_back(objID);
+
+	found = false;
+	i = 0;
+	while (i < _selectedObjs.size() && !found) {
+		if (_selectedObjs[i] == objID) found = true;
+		else i++;
+	}
+
+	if (!found) _selectedObjs.push_back(objID);
+}
+
 void MacVentureEngine::focusObjWin(ObjID objID) {
 	_gui->bringToFront(getObjWindow(objID));
 }
@@ -301,7 +323,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 
 	while (!_currentSelection.empty()) {
 		ObjID obj = _currentSelection.front();
-		_currentSelection.pop_front();
+		_currentSelection.remove_at(0);
 		if ((_gameState == kGameStateInit || _gameState == kGameStatePlaying) && _world->isObjActive(obj)) {
 			if (_scriptEngine->runControl(_selectedControl, obj, _destObject, _deltaPoint)) {
 				_haltedInSelection = true;
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 7e6f362..c45069c 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -177,6 +177,7 @@ public:
 	void runObjQueue();
 	bool printTexts();
 
+	void selectObject(ObjID objID);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
 
@@ -264,7 +265,8 @@ private: // Attributes
 	ObjID _destObject;
 	ControlAction _selectedControl;
 	ControlAction _activeControl;
-	Common::List<ObjID> _currentSelection;
+	Common::Array<ObjID> _currentSelection;
+	Common::Array<ObjID> _selectedObjs;
 	Common::Point _deltaPoint;
 
 };
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 64f94af..f755036 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -905,15 +905,22 @@ void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
-	op00NOOP(0xbe);
+	ObjID from = state->pop();
+	ObjID to = state->pop();
+	_engine->enqueueObject(kUpdateWindow, to);
+	_world->setObjAttr(to, kAttrContainerOpen, _world->getObjAttr(from, 6));
+	_world->setObjAttr(from, kAttrContainerOpen, 0);
+	Common::Array<ObjID> children = _world->getChildren(from, true);
+	for (uint i = 0; i < children.size(); i++)
+		_world->setObjAttr(children[i], 0, to);
 }
 
 void ScriptEngine::opbfSNOB(EngineState * state, EngineFrame * frame) {
-	op00NOOP(0xbf);
+	_engine->enqueueObject(kAnimateBack, frame->src);
 }
 
 void ScriptEngine::opc0TEXI(EngineState * state, EngineFrame * frame) {
-	op00NOOP(0xc0);
+	_engine->enqueueObject(kHightlightExits, 0);
 }
 
 void ScriptEngine::opc1PTXT(EngineState * state, EngineFrame * frame) {
@@ -1049,9 +1056,8 @@ void ScriptEngine::opd9SLEEP(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opdaCLICK(EngineState * state, EngineFrame * frame) {
-	//_engine->updateScreen(false);
-	//clickToContinue();
-	op00NOOP(0xda);
+	_engine->updateState();
+	//_engine->clickToContinue();
 }
 
 void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
@@ -1067,8 +1073,7 @@ void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opdeUPSC(EngineState * state, EngineFrame * frame) {
-	//_engine->updateScreen(false);
-	op00NOOP(0xde);
+	_engine->updateState();
 }
 
 void ScriptEngine::opdfFMAI(EngineState * state, EngineFrame * frame) {


Commit: ba5ed7fc88a69da782f3df18698837a67a59eb6b
    https://github.com/scummvm/scummvm/commit/ba5ed7fc88a69da782f3df18698837a67a59eb6b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:37:46+02:00

Commit Message:
MACVENTURE: Major push in functionality and rendering

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f1eb8b6..d4fd337 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -106,6 +106,8 @@ void Gui::draw() {
 	drawWindows();
 
 	_wm.draw();
+
+	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
 void Gui::drawMenu() {
@@ -117,7 +119,17 @@ void Gui::drawTitle() {
 }
 
 void Gui::drawExit(ObjID id) {
-	warning("Unimplemented method: drawExit");
+	findWindowData(kExitsWindow).children.push_back(DrawableObject(id, kBlitDirect));
+}
+
+void Gui::clearControls() {
+	if (!_controlData)
+		return;
+
+	Common::List<CommandButton>::iterator it = _controlData->begin();
+	for (; it != _controlData->end(); ++it) {
+		it->unselect();
+	}
 }
 
 const WindowData& Gui::getWindowData(WindowReference reference) {
@@ -234,44 +246,65 @@ void Gui::initWindows() {
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	loadBorder(_mainGameWindow, "border_command.bmp", false);
-	loadBorder(_mainGameWindow, "border_command.bmp", true);
+	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
 	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_command.bmp", false);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, true);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_self_inac.bmp", false);
-	loadBorder(_selfWindow, "border_self_act.bmp", true);
-	findWindowData(kSelfWindow).children.push_back(DrawableObject(1, kBlitDirect));
+	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_title_inac.bmp", false);
-	loadBorder(_exitsWindow, "border_title_inac.bmp", true);
+	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+
+}
+
+WindowReference Gui::createInventoryWindow() {
+	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
+	WindowData newData;
+	GlobalSettings settings = _engine->getGlobalSettings();
+	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a hack
+
+	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
+		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
+		newData.bounds.translate(newData.bounds.left + settings.invOffsetX, newData.bounds.top + settings.invOffsetY);
+	}
+	else {
+		newData.bounds = Common::Rect(
+			settings.invLeft,
+			settings.invTop,
+			settings.invLeft + settings.invWidth,
+			settings.invTop + settings.invHeight);
+	}
+	newData.type = kZoomDoc;
+	newData.hasCloseBox = true;
+	newData.visible = true;
+	_windowData->push_back(newData);
 
-	// Diploma Window (we can go without it for now)
-	/*
-	_diplomaWindow = _wm.addWindow(false, true, true);
-	_diplomaWindow->setDimensions(getWindowData(kDiplomaWindow).bounds);
-	_diplomaWindow->setActive(false);
-	_diplomaWindow->setCallback(diplomaWindowCallback, this);
-	loadBorder(_diplomaWindow, "border_command.bmp", false);
-	// Render invisible for now
-	_diplomaWindow->getSurface()->fillRect(_diplomaWindow->getSurface()->getBounds(), kColorGreen2);
-	*/
+	newWindow->setDimensions(newData.bounds);
+	newWindow->setCallback(inventoryWindowCallback, this);
+	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	_inventoryWindows.push_back(newWindow);
 
+	debug("Create new inventory window. Reference: %d", newData.refcon);
+	return newData.refcon;
 }
 
 void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
@@ -464,11 +497,14 @@ void Gui::drawWindows() {
 
 	drawCommandsWindow();
 	drawMainGameWindow();
+	drawSelfWindow();
+	drawInventories();
+	drawExitsWindow();
 
 }
 
 void Gui::drawCommandsWindow() {
-	if (_engine->isPaused()) {
+	if (_engine->needsClickToContinue()) {
 		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
 		WindowData data = getWindowData(kCommandsWindow);
 		uint16 border = borderBounds(data.type).topOffset;
@@ -493,51 +529,113 @@ void Gui::drawCommandsWindow() {
 
 void Gui::drawMainGameWindow() {
 	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
-	BorderBounds border = borderBounds(getWindowData(kMainGameWindow).type);
+	const WindowData &data = getWindowData(kMainGameWindow);
+	BorderBounds border = borderBounds(data.type);
 
 	_mainGameWindow->setDirty(true);
 
+	//if (data.titleLength > 0)
+	//	drawWindowTitle(kMainGameWindow, srf);
+
 	if (!_assets.contains(3)) {
 		_assets[3] = new ImageAsset(3, _graphics);
 	}
 
 	_assets[3]->blitInto(
 		_mainGameWindow->getSurface(),
-		border.leftOffset * 2,
-		border.topOffset * 2,
+		border.leftOffset,
+		border.topOffset,
 		kBlitDirect);
 
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
-
 }
 
 void Gui::drawSelfWindow() {
-	Graphics::ManagedSurface *srf = _selfWindow->getSurface();
-	BorderBounds border = borderBounds(getWindowData(kSelfWindow).type);
+	drawObjectsInWindow(kSelfWindow, _selfWindow->getSurface());
+	if (_engine->isObjSelected(1)) invertWindowColors(kSelfWindow);
+}
+
+void Gui::drawInventories() {
+	Common::List<WindowData>::const_iterator it = _windowData->begin();
+	while (it != _windowData->end() && (*it).refcon >= 0x80) {
+		it++;
+	}
+	Graphics::ManagedSurface *srf;
+	while (it != _windowData->end()) {
+		srf = _inventoryWindows[(*it).refcon]->getSurface();
+		BorderBounds border = borderBounds((*it).type);
+		srf->fillRect(Common::Rect(
+			border.leftOffset,
+			border.topOffset,
+			srf->w + border.rightOffset,
+			srf->h + border.bottomOffset), kColorWhite);
+		drawObjectsInWindow((*it).refcon, _inventoryWindows[(*it).refcon]->getSurface());
+		it++;
+	}
+}
+
+void Gui::drawExitsWindow() {
+	WindowData &data = findWindowData(kExitsWindow);
+	BorderBounds border = borderBounds(data.type);
+	Graphics::ManagedSurface *srf = _exitsWindow->getSurface();
+	srf->fillRect(Common::Rect(
+		border.leftOffset,
+		border.topOffset,
+		srf->w + border.rightOffset,
+		srf->h + border.bottomOffset), kColorWhite);
+
+	drawObjectsInWindow(kExitsWindow, _exitsWindow->getSurface());
 }
 
 void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
-	WindowData &data = findWindowData(kMainGameWindow);
+	WindowData &data = findWindowData(target);
 	BorderBounds border = borderBounds(data.type);
 	Common::Point pos;
 	ObjID child;
 	BlitMode mode;
-	for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
-		child = (*it).obj;
-		mode = (BlitMode)(*it).mode;
+
+	if (data.children.size() == 0) return;
+
+	Common::Point forbidden(0, 0);
+	for (uint i = 0; i < data.children.size(); i++) {
+		child = data.children[i].obj;
+		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
-		if (!_assets.contains(child)) {
-			_assets[child] = new ImageAsset(child, _graphics);
+
+		if (pos != forbidden || child < 600) { // Small HACK until I figre out where the last garbage child in main game window comes from
+			if (!_assets.contains(child)) {
+				_assets[child] = new ImageAsset(child, _graphics);
+			}
+
+			_assets[child]->blitInto(
+				surface,
+				border.leftOffset + pos.x,
+				border.topOffset + pos.y,
+				mode);
 		}
-		_assets[child]->blitInto(
-			surface,
-			border.leftOffset * 2 + pos.x,
-			border.topOffset * 2 + pos.y,
-			mode);
-
-		// To be deleted, this is a big hack, but it doesn't work without it.
-		_wm.draw();
+
 	}
+
+	findWindow(data.refcon)->setDirty(true);
+
+}
+
+void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {
+	WindowData &data = findWindowData(target);
+	BorderBounds border = borderBounds(data.type);
+
+	uint left = 10;//getCurrentFont().getStringWidth(data.title) - 10;
+	uint right = 30;//getCurrentFont().getStringWidth(data.title) + 10;
+
+	surface->fillRect(Common::Rect(left, 0, right, border.topOffset - 1), kColorGray);
+	getCurrentFont().drawString(
+		surface,
+		data.title,
+		0,
+		right,
+		right - left,
+		kColorBlack,
+		Graphics::kTextAlignCenter);
 }
 
 WindowData & Gui::findWindowData(WindowReference reference) {
@@ -554,56 +652,29 @@ WindowData & Gui::findWindowData(WindowReference reference) {
 	error("Could not locate the desired window data");
 }
 
-
-/* CALLBACKS */
-
-bool commandsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processCommandEvents(click, event);
-}
-
-bool mainGameWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processMainGameEvents(click, event);
-}
-
-bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processOutConsoleEvents(click, event);
-}
-
-bool selfWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processSelfEvents(click, event);
-}
-
-bool exitsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processExitsEvents(click, event);
-}
-
-bool diplomaWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processDiplomaEvents(click, event);
-}
-
-bool inventoryWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
-	Gui *g = (Gui*)gui;
-
-	return g->processInventoryEvents(click, event);
+Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
+	if (reference < 0x80) { // It's an inventory window
+		return _inventoryWindows[reference];
+	}
+	switch (reference) {
+	case MacVenture::kNoWindow:
+		return nullptr;
+	case MacVenture::kCommandsWindow:
+		return _controlsWindow;
+	case MacVenture::kMainGameWindow:
+		return _mainGameWindow;
+	case MacVenture::kOutConsoleWindow:
+		return _outConsoleWindow;
+	case MacVenture::kSelfWindow:
+		return _selfWindow;
+	case MacVenture::kExitsWindow:
+		return _exitsWindow;
+	case MacVenture::kDiplomaWindow:
+		return _diplomaWindow;
+	}
+	return nullptr;
 }
 
-void menuCommandsCallback(int action, Common::String &text, void *data) {
-	Gui *g = (Gui *)data;
-
-	g->handleMenuAction((MenuAction)action);
-}
 
 /* HANDLERS */
 void Gui::handleMenuAction(MenuAction action) {
@@ -655,15 +726,66 @@ void Gui::handleMenuAction(MenuAction action) {
 	}
 }
 
+/* CALLBACKS */
+
+bool commandsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+	return g->processCommandEvents(click, event);
+}
+
+bool mainGameWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+	return g->processMainGameEvents(click, event);
+}
+
+bool outConsoleWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+	return g->processOutConsoleEvents(click, event);
+}
+
+bool selfWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processSelfEvents(click, event);
+}
+
+bool exitsWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processExitsEvents(click, event);
+}
+
+bool diplomaWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processDiplomaEvents(click, event);
+}
+
+bool inventoryWindowCallback(Graphics::WindowClick click, Common::Event &event, void *gui) {
+	Gui *g = (Gui*)gui;
+
+	return g->processInventoryEvents(click, event);
+}
+
+void menuCommandsCallback(int action, Common::String &text, void *data) {
+	Gui *g = (Gui *)data;
+
+	g->handleMenuAction((MenuAction)action);
+}
+
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
-	if (winID > 0x90 || winID == kNoWindow) return;
+	if (winID == kNoWindow) return;
 	if (winID == kSelfWindow || containerOpen) {
-		if (winID == kMainGameWindow) {
-			drawMainGameWindow();
+		WindowData &data = findWindowData(winID);
+		if (winID == kCommandsWindow) {
+			Common::List<CommandButton>::iterator it = _controlData->begin();
+			for (; it != _controlData->end(); ++it) {
+				it->unselect();
+			}
 		} else {
-			warning("Unimplemented: fill window with background");
+			Graphics::MacWindow *winRef = findWindow(winID);
+			winRef->getSurface()->fillRect(data.bounds, kColorGray);
 		}
-		WindowData &data = findWindowData(winID);
 		Common::Array<DrawableObject> &children = data.children;
 		for (uint i = 0; i < children.size(); i++) {
 			uint flag = 0;
@@ -680,41 +802,24 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 				children[i] = DrawableObject(child, mode);
 			}
 		}
+		if (winID == kMainGameWindow) {
+			drawMainGameWindow();
+		}
 		if (data.type == kZoomDoc && data.updateScroll) {
 			warning("Unimplemented: update scroll");
 		}
 	}
 }
 
-WindowReference Gui::createInventoryWindow() {
-	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
-	WindowData newData;
-	GlobalSettings settings = _engine->getGlobalSettings();
-	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a hack
-
-	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
-		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
-		newData.bounds.translate(newData.bounds.left + settings.invOffsetX, newData.bounds.top + settings.invOffsetY);
-	} else {
-		newData.bounds = Common::Rect(
-			settings.invLeft,
-			settings.invTop,
-			settings.invLeft + settings.invWidth,
-			settings.invTop + settings.invHeight);
+void Gui::invertWindowColors(WindowReference winID) {
+	Graphics::ManagedSurface *srf = findWindow(winID)->getSurface();
+	for (uint y = 0; y < srf->h; y++) {
+		for (uint x = 0; x < srf->w; x++) {
+			byte p = *(byte *)srf->getBasePtr(x, y);
+			*(byte *)srf->getBasePtr(x, y) =
+				(p == kColorWhite) ? kColorBlack : kColorGray;
+		}
 	}
-	newData.type = kZoomDoc;
-	newData.hasCloseBox = true;
-	newData.visible = true;
-	_windowData->push_back(newData);
-
-	newWindow->setDimensions(newData.bounds);
-	newWindow->setCallback(inventoryWindowCallback, this);
-	loadBorder(newWindow, "border_self_inac.bmp", false);
-	loadBorder(newWindow, "border_self_act.bmp", true);
-	_inventoryWindows.push_back(newWindow);
-
-	debug(3, "Create new inventory window. Reference: %d", newData.refcon);
-	return newData.refcon;
 }
 
 bool Gui::tryCloseWindow(WindowReference winID) {
@@ -729,30 +834,41 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
-	if (event.type == Common::EVENT_LBUTTONDOWN) {
-		debug("Click on the ui");
+	if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP) {
+		_engine->updateDelta(event.mouse);
+		processed = true;
 	}
-	return (processed || _wm.processEvent(event));
+	processed |= _wm.processEvent(event);
+	return (processed);
 }
 
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		if (_engine->isPaused())
+		if (_engine->needsClickToContinue()) {
+			_engine->activateCommand(kControlClickToContinue);
 			return true;
+		}
 
 		Common::Point position(
 			event.mouse.x - _controlsWindow->getDimensions().left,
 			event.mouse.y - _controlsWindow->getDimensions().top);
 
 		CommandButton data;
-		Common::List<CommandButton>::const_iterator it = _controlData->begin();
+		if (!_controlData)
+			return false;
+
+		Common::List<CommandButton>::iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			if (it->isInsideBounds(position)) {
-				debug(4, "Command active: %s", it->getData().title);
+				it->select();
 				data = *it;
 			}
+			else {
+				it->unselect();
+			}
 		}
 
+
 		_engine->selectControl((ControlReference)data.getData().refcon);
 		_engine->activateCommand((ControlReference)data.getData().refcon);
 		_engine->refreshReady();
@@ -762,6 +878,9 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 }
 
 bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & event) {
+	if (_engine->needsClickToContinue())
+		return true;
+
 	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
 		WindowData &data = findWindowData(kMainGameWindow);
 		ObjID child;
@@ -769,36 +888,52 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		Common::Point pos;
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			mode = (BlitMode)(*it).mode;
 			pos = _engine->getObjPosition(child);
-			pos.x += data.bounds.left;
-			pos.y += data.bounds.top;
-			if (_assets[child]->isPointInside(pos, event.mouse)) {
+			pos.x += _mainGameWindow->getDimensions().left;
+			pos.y += _mainGameWindow->getDimensions().top;
+			pos = event.mouse - pos;
+			if (_assets.contains(child) && _assets[child]->isPointInside(pos)) {
 				// select the first object clicked
 				_engine->selectObject(child);
-				return true;
 			}
 		}
 	}
 	return false;
 }
 bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
+	if (_engine->needsClickToContinue())
+		return true;
+
 	return getWindowData(kOutConsoleWindow).visible;
 }
 
 bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event) {
-	return getWindowData(kSelfWindow).visible;
+	if (_engine->needsClickToContinue())
+		return true;
+
+	if (event.type == Common::EVENT_LBUTTONUP) {
+		_engine->selectObject(1);
+	}
+	return true;
 }
 
 bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & event) {
+	if (_engine->needsClickToContinue())
+		return true;
 	return getWindowData(kExitsWindow).visible;
 }
 
 bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & event) {
+	if (_engine->needsClickToContinue())
+		return true;
+
 	return getWindowData(kDiplomaWindow).visible;
 }
 
 bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
+	if (_engine->needsClickToContinue())
+		return true;
+
 	return false;
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 2e8b6e2..b7d5d52 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -117,7 +117,8 @@ enum ControlReference {
 	kControlOperate = 5,
 	kControlGo = 6,
 	kControlHit = 7,
-	kControlConsume = 8
+	kControlConsume = 8,
+	kControlClickToContinue = 9
 };
 
 struct ControlData {
@@ -153,9 +154,11 @@ public:
 	void drawMenu();
 	void drawTitle();
 	void drawExit(ObjID id);
+	void clearControls();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
 	void updateWindow(WindowReference winID, bool containerOpen);
+	void invertWindowColors(WindowReference winID);
 
 	WindowReference createInventoryWindow();
 	bool tryCloseWindow(WindowReference winID);
@@ -225,11 +228,15 @@ private: // Methods
 	void drawCommandsWindow();
 	void drawMainGameWindow();
 	void drawSelfWindow();
+	void drawInventories();
+	void drawExitsWindow();
 
 	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
+	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 
 	// Finders
 	WindowData& findWindowData(WindowReference reference);
+	Graphics::MacWindow *findWindow(WindowReference reference);
 
 };
 
@@ -249,12 +256,16 @@ public:
 	CommandButton(ControlData data, Gui *g) {
 		_data = data;
 		_gui = g;
+		_selected = false;
 	}
 	~CommandButton() {}
 
 	void draw(Graphics::ManagedSurface &surface) const {
 
-		surface.fillRect(_data.bounds, kColorWhite);
+		uint colorFill = _selected ? kColorBlack : kColorWhite;
+		uint colorText = _selected ? kColorWhite : kColorBlack;
+
+		surface.fillRect(_data.bounds, colorFill);
 		surface.frameRect(_data.bounds, kColorBlack);
 
 		const Graphics::Font &font = _gui->getCurrentFont();
@@ -265,7 +276,7 @@ public:
 			_data.bounds.left,
 			_data.bounds.top,
 			_data.bounds.right - _data.bounds.left,
-			kColorBlack,
+			colorText,
 			Graphics::kTextAlignCenter);
 	}
 
@@ -277,7 +288,20 @@ public:
 		return _data;
 	}
 
+	void select() {
+		_selected = true;
+	}
+
+	void unselect() {
+		_selected = false;
+	}
+
+	bool isSelected() {
+		return _selected;
+	}
+
 private:
+	bool _selected;
 	ControlData _data;
 	Gui *_gui;
 };
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index de4e3ba..54d19c9 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -311,40 +311,47 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
 	if (mode == kBlitDirect) {
 		blitDirect(target, x, y, _imgData);
-		return;
-	}
-
-	if (_container->getItemByteSize(_mask)) { // Has mask
-		switch (mode) {
-		case MacVenture::kBlitBIC:
-			blitBIC(target, x, y, _maskData);
-			break;
-		case MacVenture::kBlitOR:
-			blitOR(target, x, y, _maskData);
-			break;
-		}
-	} else if (_container->getItemByteSize(_id)) {
-		switch (mode) {
-		case MacVenture::kBlitBIC:
-			target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorWhite);
-			break;
-		case MacVenture::kBlitOR:
-			target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorBlack);
-			break;
+	} else if (mode < kBlitXOR){
+		if (_container->getItemByteSize(_mask)) { // Has mask
+			switch (mode) {
+			case MacVenture::kBlitBIC:
+				blitBIC(target, x, y, _maskData);
+				break;
+			case MacVenture::kBlitOR:
+				blitOR(target, x, y, _maskData);
+				break;
+			default:
+				break;
+			}
+		} else if (_container->getItemByteSize(_id)) {
+			switch (mode) {
+			case MacVenture::kBlitBIC:
+				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorWhite);
+				break;
+			case MacVenture::kBlitOR:
+				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorBlack);
+				break;
+			default:
+				break;
+			}
 		}
-	}
 
-	if (_container->getItemByteSize(_id) && mode > 0) {
-		blitXOR(target, x, y, _imgData);
-	}
+		if (_container->getItemByteSize(_id) && mode > 0) {
+			blitXOR(target, x, y, _imgData);
+		}
+	}	
 }
 
-bool ImageAsset::isPointInside(Common::Point myPos, Common::Point click) {
-	Common::Rect bounds(myPos.x, myPos.y, myPos.x + _bitWidth, myPos.y + _bitHeight);
-	return bounds.contains(click);
+bool ImageAsset::isPointInside(Common::Point point) {
+	if (point.x >= _bitWidth || point.y >= _bitHeight) return false;
+	if (_maskData.empty()) return false;
+	// We see if the point lands on the mask.
+	uint pix = _maskData[(point.y * _rowBytes) + (point.x >> 3)] & (1 << (7 - (point.x & 7)));
+	return pix != 0;
 }
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
+	/*
 	if (_bitWidth == 0 || _bitHeight == 0) return;
 	uint w = _bitWidth;
 	uint h = _bitHeight;
@@ -355,19 +362,21 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
+	*/
 	
-	for (uint y = 0;y < _bitHeight; y++) {
+	for (uint y = 0; y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < _bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			pix = pix ? kColorBlack : kColorWhite;
-			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
+			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
 		}
 	}
 }
 
 void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	/*
 	if (_bitWidth == 0 || _bitHeight == 0) return;
 	uint w = _bitWidth;
 	uint h = _bitHeight;
@@ -378,19 +387,19 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-
-	for (uint y = 0;y < h; y++) {
+	*/
+	for (uint y = 0; y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < w; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
-			
+		for (uint x = 0; x < _bitWidth; x++) {
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));			
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
 	}
 }
 
 void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	/*
 	if (_bitWidth == 0 || _bitHeight == 0) return;
 	uint w = _bitWidth;
 	uint h = _bitHeight;
@@ -401,8 +410,8 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy,
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	
-	for (uint y = 0;y < _bitHeight; y++) {
+	*/
+	for (uint y = 0; y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < _bitWidth; x++) {
@@ -414,6 +423,7 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy,
 }
 
 void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
+	/*
 	if (_bitWidth == 0 || _bitHeight == 0) return;
 	uint w = _bitWidth;
 	uint h = _bitHeight;
@@ -424,7 +434,7 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	
+	*/
 	for (uint y = 0;y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 0a3ea50..adce9a5 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -59,7 +59,7 @@ public:
 
 	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
 
-	bool isPointInside(Common::Point myPos, Common::Point click);
+	bool isPointInside(Common::Point point);
 
 private:
 	void decodePPIC(ObjID id, Common::Array<byte> &data);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 8d367c7..572677a 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -100,45 +100,55 @@ Common::Error MacVentureEngine::run() {
 	_cmdReady = false;
 	_haltedAtEnd = false;
 	_haltedInSelection = false;
+	_clickToContinue = true;
+	_gameState = kGameStateInit;
+	_destObject = 0;
+	_prepared = true;
 
 	//if !savegame
 	_cmdReady = true;
 	_selectedControl = kStartOrResume;
 	ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
 	_currentSelection.push_back(playerParent);// Push the parent of the player
-	_world->setObjAttr(playerParent, 6, 1);
+	_world->setObjAttr(playerParent, kAttrContainerOpen, 1);
 
-	_prepared = true;
-	while (!(_gameState == kGameStateQuitting)) {
+	_gui->addChild(kSelfWindow, 1);
+	_gui->updateWindow(kSelfWindow, false);
+	
+	while (_gameState != kGameStateQuitting) {
 		processEvents();
 
-		if (_prepared) {
-			_prepared = false;	
-
-			if (!_halted)
-				updateState();
-
-			if (_cmdReady || _halted) {
-				_halted = false;
-				if (runScriptEngine()) {
-					_halted = true;
-					_paused = true;
-				} else {
-					_paused = false;
-					if (!updateState()) {
-						updateControls();
+		if (_gameState != kGameStateQuitting) {
+
+			if (_prepared) {
+				_prepared = false;
+
+				if (!_halted)
+					updateState();
+
+				if (_cmdReady || _halted) {
+					_halted = false;
+					if (runScriptEngine()) {
+						_halted = true;
+						_paused = true;
 					}
+					else {
+						_paused = false;
+						if (!updateState()) {
+							updateControls();
+						}
+					}
+				}
+
+				if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
+					endGame();
 				}
 			}
+			_gui->draw();
 
-			if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
-				endGame();
-			}			
+			g_system->updateScreen();
+			g_system->delayMillis(50);
 		}
-		_gui->draw();
-
-		g_system->updateScreen();
-		g_system->delayMillis(50);
 	}
 
 	return Common::kNoError;
@@ -161,6 +171,11 @@ void MacVentureEngine::selectControl(ControlReference id) {
 }
 
 void MacVentureEngine::activateCommand(ControlReference id) {
+	if (id == kControlClickToContinue) {
+		_clickToContinue = false;
+		_paused = true;
+		return;
+	}
 	ControlAction action = referenceToAction(id);
 	if (action != _activeControl) {
 		if (_activeControl)
@@ -168,6 +183,7 @@ void MacVentureEngine::activateCommand(ControlReference id) {
 		_activeControl = action;
 	}
 	debug(4, "Activating Command %x... Command %x is active", action, _activeControl);
+	refreshReady();
 }
 
 void MacVentureEngine::refreshReady() {
@@ -201,9 +217,16 @@ void MacVentureEngine::loseGame() {
 	_gameState = kGameStateLosing;
 }
 
-void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID) {
+void MacVentureEngine::clickToContinue() {
+	_clickToContinue = true;
+}
+
+void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID target) {
 	QueuedObject obj;
 	obj.id = type;
+
+	if (type == kUpdateWindow) { obj.target = target; }
+
 	if (type != kHightlightExits) {		
 		obj.object = objID;
 		obj.parent = _world->getObjAttr(objID, kAttrParentObject);
@@ -257,7 +280,12 @@ void MacVentureEngine::selectObject(ObjID objID) {
 		else i++;
 	}		
 	
-	if (!found) _currentSelection.push_back(objID);
+	if (!found) {
+		_currentSelection.push_back(objID);
+		debug("Object %d selected", objID);
+	} else {
+		debug("Object %d already selected", objID);
+	}
 
 	found = false;
 	i = 0;
@@ -266,7 +294,15 @@ void MacVentureEngine::selectObject(ObjID objID) {
 		else i++;
 	}
 
-	if (!found) _selectedObjs.push_back(objID);
+	if (!found) _selectedObjs.push_back(objID);	
+}
+
+void MacVentureEngine::updateDelta(Common::Point newPos) {
+	Common::Point newDelta = newPos - _deltaPoint;
+	debug(4, "Update delta: Old(%d, %d), New(%d, %d)",
+		_deltaPoint.x, _deltaPoint.y,
+		newDelta.x, newDelta.y);
+	_deltaPoint = newDelta;
 }
 
 void MacVentureEngine::focusObjWin(ObjID objID) {
@@ -357,11 +393,11 @@ bool MacVentureEngine::updateState() {
 }
 
 void MacVentureEngine::revert() {
-	warning("revert: unimplemented");
+	_gui->invertWindowColors(kMainGameWindow);
+	preparedToRun();
 }
 
 void MacVentureEngine::runObjQueue() {
-	warning("runObjQueue: not fully implemented");
 	while (!_objQueue.empty()) {
 		uint32 biggest = 0;
 		uint32 index = 0;
@@ -389,7 +425,7 @@ void MacVentureEngine::runObjQueue() {
 			checkObject(obj);
 			break;
 		case 0x8:
-			reflectSwap(obj.object);
+			reflectSwap(obj.object, obj.target);
 			break;
 		case 0xc:
 			_world->setObjAttr(_gui->getWindowData(kMainGameWindow).refcon, kAttrContainerOpen, 0);
@@ -408,6 +444,7 @@ void MacVentureEngine::runObjQueue() {
 void MacVentureEngine::updateControls() {
 	if (_activeControl)
 		_activeControl = kNoCommand;
+	_gui->clearControls();
 	toggleExits();	
 	resetVars();
 }
@@ -434,7 +471,7 @@ void MacVentureEngine::openObject(ObjID objID) {
 	debug("openObject: %d", objID);
 	if (getObjWindow(objID)) return;
 	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
-		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true)); // FIXME: Find better name
+		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
 		//_gui->drawExits();
 		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID));
@@ -522,12 +559,30 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 	}
 }
 
-void MacVentureEngine::reflectSwap(ObjID objID) {
-	warning("reflectSwap: unimplemented");
+void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
+	warning("reflectSwap: untested");
+	WindowReference from = getObjWindow(fromID);
+	WindowReference to = getObjWindow(toID);
+	WindowReference tmp = to;
+	if (!to) {
+		tmp = from;
+	}
+	if (tmp) {
+		Common::String newTitle = _world->getText(toID);
+		_gui->setWindowTitle(tmp, newTitle);
+		_gui->updateWindowInfo(tmp, toID, _world->getChildren(toID, true));
+		updateWindow(tmp);
+	}
 }
 
 void MacVentureEngine::toggleExits() {
 	warning("toggleExits: unimplemented");
+	while (!_selectedObjs.empty()) {
+		ObjID obj = _selectedObjs.front();
+		_selectedObjs.remove_at(0);
+		// Todo: highlight exit
+		updateWindow(findParentWindow(obj));
+	}	
 }
 
 void MacVentureEngine::zoomObject(ObjID objID) {
@@ -565,6 +620,10 @@ bool MacVentureEngine::isPaused() {
 	return _paused;
 }
 
+bool MacVentureEngine::needsClickToContinue() {
+	return _clickToContinue;
+}
+
 Common::String MacVentureEngine::getCommandsPausedString() const {
 	return Common::String("Click to continue");
 }
@@ -607,7 +666,10 @@ bool MacVentureEngine::isObjClickable(ObjID objID) {
 }
 
 bool MacVentureEngine::isObjSelected(ObjID objID) {
-	warning("Unimplemented: isObjSelected");
+	Common::Array<ObjID>::const_iterator it;
+	for (it = _currentSelection.begin(); it != _currentSelection.end(); it++) {
+		if (*it == objID) return true;
+	}
 	return false;
 }
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index c45069c..c19021d 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -135,6 +135,7 @@ struct QueuedObject {
 	bool hidden;
 	bool offscreen;
 	bool invisible;
+	ObjID target; // For swapping
 };
 
 enum TextQueueID {
@@ -167,22 +168,25 @@ public:
 	void gameChanged();
 	void winGame();
 	void loseGame();
+	void clickToContinue();
 
 	bool updateState();
 	void revert();
 
-	void enqueueObject(ObjectQueueID type, ObjID objID);
+	void enqueueObject(ObjectQueueID type, ObjID objID, ObjID target = 0);
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
 
 	void runObjQueue();
 	bool printTexts();
 
 	void selectObject(ObjID objID);
+	void updateDelta(Common::Point newPos);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
 
 	// Data retrieval
 	bool isPaused();
+	bool needsClickToContinue();
 	Common::String getCommandsPausedString() const;
 	const GlobalSettings& getGlobalSettings() const;
 	Common::String getFilePath(FilePathID id) const;
@@ -218,7 +222,7 @@ private:
 	void openObject(ObjID objID);
 	void closeObject(ObjID objID);
 	void checkObject(QueuedObject objID);
-	void reflectSwap(ObjID objID);
+	void reflectSwap(ObjID fromID, ObjID toID);
 	void toggleExits();
 	void zoomObject(ObjID objID);
 
@@ -255,6 +259,7 @@ private: // Attributes
 	bool _paused, _halted, _cmdReady, _prepared;
 	bool _haltedAtEnd, _haltedInSelection;
 	bool _gameChanged;
+	bool _clickToContinue;
 
 	Common::Array<QueuedObject> _objQueue;
 	Common::Array<QueuedObject> _inQueue;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index f755036..bf9339f 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -41,9 +41,6 @@ ScriptEngine::~ScriptEngine() {
 }
 
 bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta) {
-	//debug(7, "SCRIPT: Running control %d from obj %d into obj %d, at delta (%d, %d)", 
-	//	action, source, destination, delta.x, delta.y);
-
 	EngineFrame frame;
 	frame.action = action;
 	frame.src = source;
@@ -108,24 +105,37 @@ bool ScriptEngine::execFrame(bool execAll) {
 			}
 			doFamily = true;
 		}
-	}
-
-	//Handle saves
-	/*
+	}	
 
-	uint highest;
-	uint high;
+	// Halted in saves
 	if (frame->haltedInSaves) {
-	frame->haltedInSaves = false;
-	}
-
-
-	do {
-	highest = 0;
-	for (uint i = 0; i < frame->haltedInSaves.size)
+		frame->haltedInSaves = false;
+		if (resumeFunc(frame)) {
+			frame->haltedInSaves = true;
+			return true;
+		}
 	}
-	*/
 
+	uint highest = 0;
+	uint localHigh = 0;
+	do { // Saved function calls
+		highest = 0;
+		for (uint i = 0; i <frame->saves.size(); i++)
+		{
+			if (highest < frame->saves[i].rank) {
+				highest = frame->saves[i].rank;
+				localHigh = i;
+			}
+		}
+		if (highest) {
+			frame->saves[localHigh].rank = 0;
+			if (loadScript(frame, frame->saves[localHigh].func)) {
+				frame->haltedInSaves = true;
+				return true;
+			}
+		}
+	} while (highest);
+	
 	_frames.remove_at(0);
 	return false;
 }
@@ -907,7 +917,7 @@ void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
 void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
 	ObjID from = state->pop();
 	ObjID to = state->pop();
-	_engine->enqueueObject(kUpdateWindow, to);
+	_engine->enqueueObject(kUpdateWindow, from, to);
 	_world->setObjAttr(to, kAttrContainerOpen, _world->getObjAttr(from, 6));
 	_world->setObjAttr(from, kAttrContainerOpen, 0);
 	Common::Array<ObjID> children = _world->getChildren(from, true);
@@ -1057,7 +1067,7 @@ void ScriptEngine::opd9SLEEP(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opdaCLICK(EngineState * state, EngineFrame * frame) {
 	_engine->updateState();
-	//_engine->clickToContinue();
+	_engine->clickToContinue();
 }
 
 void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
@@ -1083,13 +1093,11 @@ void ScriptEngine::opdfFMAI(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::ope0CHGR(EngineState * state, EngineFrame * frame) {
-	word txt = state->pop();
-	op00NOOP(0xe0);
+	state->pop();
 }
 
 void ScriptEngine::ope1CHSO(EngineState * state, EngineFrame * frame) {
-	word txt = state->pop();
-	op00NOOP(0xe1);
+	state->pop();
 }
 
 void ScriptEngine::ope2MDIV(EngineState * state, EngineFrame * frame) {
@@ -1108,7 +1116,6 @@ void ScriptEngine::ope3UPOB(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::ope4PLEV(EngineState * state, EngineFrame * frame) {
 	state->push(0);
-	op00NOOP(0xe4);
 }
 
 void ScriptEngine::ope5WEV(EngineState * state, EngineFrame * frame) {


Commit: 499ebc0b54c79e89f4ee38628cea1f64cdf40bf2
    https://github.com/scummvm/scummvm/commit/499ebc0b54c79e89f4ee38628cea1f64cdf40bf2
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:38:10+02:00

Commit Message:
MACVENTURE: Script engine fixes

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d4fd337..d43be9b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -248,6 +248,7 @@ void Gui::initWindows() {
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
 	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
 	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
+	findWindowData(kMainGameWindow).objRef = 3;
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
@@ -264,6 +265,7 @@ void Gui::initWindows() {
 	_selfWindow->setCallback(selfWindowCallback, this);
 	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
 	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
+	findWindowData(kMainGameWindow).objRef = 0;
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
@@ -273,9 +275,10 @@ void Gui::initWindows() {
 	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
 	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
 
+
 }
 
-WindowReference Gui::createInventoryWindow() {
+WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
 	WindowData newData;
 	GlobalSettings settings = _engine->getGlobalSettings();
@@ -295,6 +298,7 @@ WindowReference Gui::createInventoryWindow() {
 	newData.type = kZoomDoc;
 	newData.hasCloseBox = true;
 	newData.visible = true;
+	newData.objRef = objRef;
 	_windowData->push_back(newData);
 
 	newWindow->setDimensions(newData.bounds);
@@ -528,7 +532,6 @@ void Gui::drawCommandsWindow() {
 }
 
 void Gui::drawMainGameWindow() {
-	Graphics::ManagedSurface *srf = _mainGameWindow->getSurface();
 	const WindowData &data = getWindowData(kMainGameWindow);
 	BorderBounds border = borderBounds(data.type);
 
@@ -612,12 +615,18 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 				border.leftOffset + pos.x,
 				border.topOffset + pos.y,
 				mode);
+
+			if (_engine->isObjSelected(child))
+				_assets[child]->blitInto(
+					surface,
+					border.leftOffset + pos.x,
+					border.topOffset + pos.y,
+					kBlitOR);
 		}
 
 	}
 
 	findWindow(data.refcon)->setDirty(true);
-
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -782,6 +791,9 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 			for (; it != _controlData->end(); ++it) {
 				it->unselect();
 			}
+		}
+		if (winID == kMainGameWindow) {
+			drawMainGameWindow();
 		} else {
 			Graphics::MacWindow *winRef = findWindow(winID);
 			winRef->getSurface()->fillRect(data.bounds, kColorGray);
@@ -802,9 +814,6 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 				children[i] = DrawableObject(child, mode);
 			}
 		}
-		if (winID == kMainGameWindow) {
-			drawMainGameWindow();
-		}
 		if (data.type == kZoomDoc && data.updateScroll) {
 			warning("Unimplemented: update scroll");
 		}
@@ -832,6 +841,16 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 	return true;
 }
 
+uint Gui::getObjWidth(ObjID obj) {
+	if (!_assets.contains(obj)) return 0;
+	return _assets[obj]->getWidth();
+}
+
+uint Gui::getObjHeight(ObjID obj) {
+	if (!_assets.contains(obj)) return 0;
+	return _assets[obj]->getHeight();
+}
+
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
 	if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP) {
@@ -884,7 +903,6 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
 		WindowData &data = findWindowData(kMainGameWindow);
 		ObjID child;
-		BlitMode mode;
 		Common::Point pos;
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
@@ -894,7 +912,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 			pos = event.mouse - pos;
 			if (_assets.contains(child) && _assets[child]->isPointInside(pos)) {
 				// select the first object clicked
-				_engine->selectObject(child);
+				_engine->handleObjectSelect(child, kMainGameWindow, event);
 			}
 		}
 	}
@@ -912,7 +930,7 @@ bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event
 		return true;
 
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		_engine->selectObject(1);
+		_engine->handleObjectSelect(1, kSelfWindow, event);
 	}
 	return true;
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index b7d5d52..1da1b10 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -99,6 +99,7 @@ struct DrawableObject {
 struct WindowData {
 	Common::Rect bounds;
 	MVWindowType type;
+	ObjID objRef;
 	uint16 visible;
 	uint16 hasCloseBox;
 	WindowReference refcon;
@@ -160,9 +161,12 @@ public:
 	void updateWindow(WindowReference winID, bool containerOpen);
 	void invertWindowColors(WindowReference winID);
 
-	WindowReference createInventoryWindow();
+	WindowReference createInventoryWindow(ObjID objRef);
 	bool tryCloseWindow(WindowReference winID);
 
+	uint getObjWidth(ObjID obj);
+	uint getObjHeight(ObjID obj);
+
 	// Event processors
 	bool processCommandEvents(WindowClick click, Common::Event &event);
 	bool processMainGameEvents(WindowClick click, Common::Event &event);
@@ -172,6 +176,8 @@ public:
 	bool processDiplomaEvents(WindowClick click, Common::Event &event);
 	bool processInventoryEvents(WindowClick click, Common::Event &event);
 
+	//bool processClickObject(ObjID obj, WindowReference win, Common::Event event, bool canDrag);
+
 	const WindowData& getWindowData(WindowReference reference);
 
 	const Graphics::Font& getCurrentFont();
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 54d19c9..323b8a1 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -350,6 +350,14 @@ bool ImageAsset::isPointInside(Common::Point point) {
 	return pix != 0;
 }
 
+uint ImageAsset::getWidth() {
+	return _bitWidth;
+}
+
+uint ImageAsset::getHeight() {
+	return _bitWidth;
+}
+
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
 	/*
 	if (_bitWidth == 0 || _bitHeight == 0) return;
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index adce9a5..52f0dfa 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -61,6 +61,9 @@ public:
 
 	bool isPointInside(Common::Point point);
 
+	uint getWidth();
+	uint getHeight();
+
 private:
 	void decodePPIC(ObjID id, Common::Array<byte> &data);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 572677a..21496cd 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -41,7 +41,7 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 	_gameDescription = gameDesc;
 	_rnd = new Common::RandomSource("macventure");
 
-	_debugger= NULL;
+	_debugger = NULL;
 	_gui = NULL;
 
 	debug("MacVenture::MacVentureEngine()");
@@ -96,7 +96,7 @@ Common::Error MacVentureEngine::run() {
 	_scriptEngine = new ScriptEngine(this, _world);
 
 	_paused = false;
-	_halted = true;
+	_halted = false;
 	_cmdReady = false;
 	_haltedAtEnd = false;
 	_haltedInSelection = false;
@@ -114,7 +114,7 @@ Common::Error MacVentureEngine::run() {
 
 	_gui->addChild(kSelfWindow, 1);
 	_gui->updateWindow(kSelfWindow, false);
-	
+
 	while (_gameState != kGameStateQuitting) {
 		processEvents();
 
@@ -227,7 +227,7 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
 
 	if (type == kUpdateWindow) { obj.target = target; }
 
-	if (type != kHightlightExits) {		
+	if (type != kHightlightExits) {
 		obj.object = objID;
 		obj.parent = _world->getObjAttr(objID, kAttrParentObject);
 		obj.x = _world->getObjAttr(objID, kAttrPosX);
@@ -267,34 +267,62 @@ bool MacVentureEngine::printTexts() {
 		case kTextPlain:
 			debug("Print Plain Text: %s", _world->getText(text.asset).c_str());
 			gameChanged();
-			break;		
+			break;
 		}
 	}
+	return false;
 }
 
-void MacVentureEngine::selectObject(ObjID objID) {
-	bool found = false;
-	uint i = 0;
-	while (i < _currentSelection.size() && !found) {
-		if (_currentSelection[i] == objID) found = true;
-		else i++;
-	}		
-	
-	if (!found) {
-		_currentSelection.push_back(objID);
-		debug("Object %d selected", objID);
-	} else {
-		debug("Object %d already selected", objID);
+void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Common::Event event) {
+	if (win == kExitsWindow) {
+		win = kMainGameWindow;
 	}
 
-	found = false;
-	i = 0;
-	while (i < _selectedObjs.size() && !found) {
-		if (_selectedObjs[i] == objID) found = true;
-		else i++;
-	}
+	bool canDrag = (objID && !_world->getObjAttr(objID, kAttrInvisible));
+
+	const WindowData &windata = _gui->getWindowData(win);
 
-	if (!found) _selectedObjs.push_back(objID);	
+	if (event.kbd.flags & Common::KBD_SHIFT) {
+		// Do shift ;)
+	}
+	else {
+		if (_selectedControl && _currentSelection.size() > 0 && getInvolvedObjects() > 1) {
+			if (objID == 0)
+				selectPrimaryObject(windata.objRef);
+			else
+				selectPrimaryObject(objID);
+			preparedToRun();
+		}
+		else {
+			if (objID == 0) {
+				unselectAll();
+				//if (windata.type == kAnimateBack) {
+					//doLasso(win, event, canDrag);
+				//}
+				//else {
+					objID = win;
+				//}
+			}
+			if (objID > 0) {
+				int i = findObjectInArray(objID, _currentSelection);
+
+				/*if (event.type == Common::EVENT  isDoubleClick(event)) { // no double click for now
+					if (!found)
+						unSelectAll();
+					selectObj(obj);
+					doubleClickObject(obj, win, event, canDrag);
+				} else {*/
+				if (i >= 0)
+					unselectAll();
+				selectObject(objID);
+				if (getInvolvedObjects() == 1)
+					_cmdReady = true;
+				preparedToRun();
+				//singleClickObject(objID, win, event, canDrag);
+				//}
+			}
+		}
+	}
 }
 
 void MacVentureEngine::updateDelta(Common::Point newPos) {
@@ -373,7 +401,11 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 	if (_selectedControl == 1)
 		_gameChanged = false;
 
+<<<<<<< HEAD
 	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying){
+=======
+	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying) {
+>>>>>>> 088fc4d... MACVENTURE: Script engine fixes
 		if (_scriptEngine->runControl(kTick, _selectedControl, _destObject, _deltaPoint)) {
 			_haltedAtEnd = true;
 			return true;
@@ -445,7 +477,7 @@ void MacVentureEngine::updateControls() {
 	if (_activeControl)
 		_activeControl = kNoCommand;
 	_gui->clearControls();
-	toggleExits();	
+	toggleExits();
 	resetVars();
 }
 
@@ -458,6 +490,70 @@ void MacVentureEngine::resetVars() {
 	_cmdReady = false;
 }
 
+void MacVentureEngine::unselectAll() {
+	while (!_currentSelection.empty()) {
+		unselectObject(_currentSelection.front());
+		//_currentSelection.remove_at(0);
+	}
+}
+
+void MacVentureEngine::selectObject(ObjID objID) {
+	if (!_currentSelection.empty()) {
+		if (findParentWindow(objID) != findParentWindow(_currentSelection[0]))
+			unselectAll();
+	}
+	if (findObjectInArray(objID, _currentSelection) == -1)
+		_currentSelection.push_back(objID);
+	if (findObjectInArray(objID, _selectedObjs) == -1) {
+		_selectedObjs.push_back(objID);
+		highlightExit(objID);
+	}
+}
+
+void MacVentureEngine::unselectObject(ObjID objID) {
+	int idxCur = findObjectInArray(objID, _currentSelection);
+	int idxSel = findObjectInArray(objID, _selectedObjs);
+	if (idxCur != -1) _currentSelection.remove_at(idxCur);
+	if (idxSel != -1) {
+		_selectedObjs.remove_at(idxSel);
+		highlightExit(objID);
+	}
+}
+
+int MacVentureEngine::findObjectInArray(ObjID objID, const Common::Array<ObjID> &list) {
+	// Find the object in the current selection
+	bool found = false;
+	uint i = 0;
+	while (i < list.size() && !found) {
+		if (list[i] == objID) found = true;
+		else i++;
+	}
+	// HACK, should use iterator
+	return found ? i : -1;
+}
+
+void MacVentureEngine::highlightExit(ObjID objID) {
+	warning("highlightExit: unimplemented");
+}
+
+void MacVentureEngine::selectPrimaryObject(ObjID objID) {
+	if (objID == _destObject) return;
+	int idx;
+	if (_destObject > 0 &&
+		(idx = findObjectInArray(_destObject, _selectedObjs)) != -1 &&
+		findObjectInArray(_destObject, _currentSelection) == -1) 
+	{
+		_selectedObjs.remove_at(idx);
+		highlightExit(_destObject);
+	}
+	_destObject = objID;
+	if (findObjectInArray(_destObject, _selectedObjs) == -1) {
+		_selectedObjs.push_back(_destObject);
+		highlightExit(_destObject);
+	}
+	_cmdReady = true;
+}
+
 void MacVentureEngine::focusObjectWindow(ObjID objID) {
 	if (objID) {
 		WindowReference win = getObjWindow(objID);
@@ -479,7 +575,7 @@ void MacVentureEngine::openObject(ObjID objID) {
 		Common::Point p(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
 		//getParentWin(obj).localToGlobal(p);
 		//globalToDesktop(p);
-		WindowReference invID = _gui->createInventoryWindow();
+		WindowReference invID = _gui->createInventoryWindow(objID);
 		_gui->setWindowTitle(invID, _world->getText(objID));
 		_gui->updateWindowInfo(invID, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(invID, _world->getObjAttr(objID, kAttrContainerOpen));
@@ -576,11 +672,10 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 }
 
 void MacVentureEngine::toggleExits() {
-	warning("toggleExits: unimplemented");
 	while (!_selectedObjs.empty()) {
 		ObjID obj = _selectedObjs.front();
 		_selectedObjs.remove_at(0);
-		// Todo: highlight exit
+		highlightExit(obj);
 		updateWindow(findParentWindow(obj));
 	}	
 }
@@ -666,11 +761,33 @@ bool MacVentureEngine::isObjClickable(ObjID objID) {
 }
 
 bool MacVentureEngine::isObjSelected(ObjID objID) {
-	Common::Array<ObjID>::const_iterator it;
-	for (it = _currentSelection.begin(); it != _currentSelection.end(); it++) {
-		if (*it == objID) return true;
+	int idx = findObjectInArray(objID, _currentSelection);
+	return idx != -1;
+}
+
+Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
+	Common::Point pos = getObjPosition(objID);
+	uint w = _gui->getObjWidth(objID); // This shouldn't go here
+	uint h = _gui->getObjHeight(objID);
+	return Common::Rect(pos.x, pos.y, pos.x + w, pos.y + h);
+}
+
+uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
+	//not the same parent? 0 overlap
+	if (_world->getObjAttr(one, kAttrParentObject) !=
+		_world->getObjAttr(other, kAttrParentObject)) 
+		return 0;
+
+	Common::Rect oneBounds = getObjBounds(one);
+	Common::Rect otherBounds = getObjBounds(other);
+	if (otherBounds.intersects(oneBounds) ||
+		oneBounds.intersects(otherBounds)) 
+	{
+		uint areaOne = oneBounds.width() * oneBounds.height();
+		uint areaOther = otherBounds.width() * otherBounds.height();
+		return (areaOther * 100 / areaOne) | 0;
 	}
-	return false;
+	return 0;
 }
 
 WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index c19021d..4671c2a 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -179,7 +179,7 @@ public:
 	void runObjQueue();
 	bool printTexts();
 
-	void selectObject(ObjID objID);
+	void handleObjectSelect(ObjID objID, WindowReference win, Common::Event event);
 	void updateDelta(Common::Point newPos);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
@@ -201,6 +201,10 @@ public:
 	bool isObjClickable(ObjID objID);
 	bool isObjSelected(ObjID objID);
 
+	// Encapsulation HACK
+	Common::Rect getObjBounds(ObjID objID);
+	uint getOverlapPercent(ObjID one, ObjID other);
+
 	WindowReference getObjWindow(ObjID objID);
 	WindowReference findObjWindow(ObjID objID);
 	WindowReference findParentWindow(ObjID objID);
@@ -217,6 +221,14 @@ private:
 	void updateControls();
 	void resetVars();
 
+	void unselectAll();
+	void selectObject(ObjID objID);
+	void unselectObject(ObjID objID);
+	int findObjectInArray(ObjID objID, const Common::Array<ObjID> &list);
+	void highlightExit(ObjID objID);
+	void selectPrimaryObject(ObjID objID);
+
+
 	// Object queue methods
 	void focusObjectWindow(ObjID objID);
 	void openObject(ObjID objID);
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index bf9339f..4c00054 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -136,32 +136,37 @@ bool ScriptEngine::execFrame(bool execAll) {
 		}
 	} while (highest);
 	
-	_frames.remove_at(0);
+	_frames.pop_front();
 	return false;
 }
 
 bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
-	frame->scripts.push_back(ScriptAsset(scriptID, _scripts));
+	if (_scripts->getItemByteSize(scriptID) > 0) {
+		debug(3, "SCRIPT: Loading function %d", scriptID);
+		// Insert the new script at the front
+		frame->scripts.push_front(ScriptAsset(scriptID, _scripts));
+		return runFunc(frame);
+	}
 	return false;
 }
 
 bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 	bool fail = runFunc(frame);
 	if (fail) return fail;
-	frame->scripts.remove_at(0);
+	frame->scripts.pop_front();
 	if (frame->scripts.size())
 		return resumeFunc(frame);
 	return false;
 }
 
 bool ScriptEngine::runFunc(EngineFrame *frame) {
-	debug(3, "SCRIPT: I'm running the function");
 	ScriptAsset &script = frame->scripts.front();
+	debug(3, "SCRIPT: Executing function %d", script.getId());
 	EngineState *state = &frame->state;
 	byte op;	
 	while (script.hasNext()) {
 		op = script.fetch();
-		debug(3, "SCRIPT: I'm running operation %x", op);
+		debug(3, "SCRIPT: I'm running operation %d", op);
 		if (!(op & 0x80)) {
 			state->push(op);
 		} else {
@@ -857,7 +862,7 @@ void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsse
 void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
 	word rank = state->pop();
 	word func = state->pop();
-	frame->saves.push_back(FunCall(rank, func));
+	frame->saves.push_back(FunCall(func, rank));
 }
 
 void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
@@ -904,9 +909,11 @@ void ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
-	frame->scripts.remove_at(0);
-	frame->scripts.insert_at(0, newfun);
+	ScriptAsset current = script;
+	loadScript(frame, id);
+	frame->scripts.pop_front();
 	script = frame->scripts.front();
+	debug(3, "SCRIPT: Return from fuction %d", id);
 }
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
@@ -1019,17 +1026,15 @@ void ScriptEngine::opd0P1(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opd1GOBD(EngineState * state, EngineFrame * frame) {
 	word obj = state->pop();
-	Common::Rect bounds(0, 0, 1, 1); //= _world->getObjBounds(obj);
+	Common::Rect bounds = _engine->getObjBounds(obj);
 	state->push(bounds.width());
 	state->push(bounds.height());
-	op00NOOP(0xd1);
 }
 
 void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) { 
 	word b = state->pop();
 	word a = state->pop();
-	state->push(0);//_world->getOverlapPercent(b, a));
-	op00NOOP(0xd2);
+	state->push(_engine->getOverlapPercent(b, a));
 }
 
 void ScriptEngine::opd3CAPC(EngineState * state, EngineFrame * frame) {
@@ -1138,11 +1143,11 @@ void ScriptEngine::op00NOOP(byte op) {
 
 
 
-
 ScriptAsset::ScriptAsset(ObjID id, Container * container) {	
 	_id = id;
 	_container = container;
 	_ip = 0x0;	
+	loadInstructions();
 }
 
 void ScriptAsset::reset() {
@@ -1163,6 +1168,10 @@ void ScriptAsset::branch(word amount) {
 	_ip += amount;
 }
 
+ObjID ScriptAsset::getId() {
+	return _id;
+}
+
 void ScriptAsset::loadInstructions() {
 	uint32 amount = _container->getItemByteSize(_id);
 	Common::SeekableReadStream *res = _container->getItem(_id);
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 178e054..1a143cf 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -63,6 +63,8 @@ public:
 	bool hasNext();
 	void branch(word amount);
 
+	ObjID getId();
+
 private:
 
 	void loadInstructions();
@@ -82,12 +84,12 @@ public:
 	}
 
 	void push(word data) {
+		sp--;		
 		stack[sp] = unneg16(data);
-		sp--;
 	}
 
 	word pop() {
-		byte v = stack[sp];
+		word v = stack[sp];
 		sp++;
 		return v;
 	}
@@ -102,6 +104,9 @@ public:
 
 	void clear() {
 		sp = 0x80;
+		for (int i = 0; i < sp; i++) {
+			stack[i] = 0;
+		}
 	}
 
 	word size() {
@@ -139,7 +144,7 @@ struct EngineFrame {
 	int x;
 	int y;
 	EngineState state;
-	Common::Array<ScriptAsset> scripts;
+	Common::List<ScriptAsset> scripts;
 	Common::Array<FunCall> saves;
 	uint32 familyIdx;
 
@@ -288,7 +293,7 @@ private:
 private:
 	MacVentureEngine *_engine;
 	World *_world;
-	Common::Array<EngineFrame> _frames;
+	Common::List<EngineFrame> _frames;
 	Container *_scripts;
 };
 


Commit: 8dd52b6cce3835950f255f48d13f3d09a7dbe0ff
    https://github.com/scummvm/scummvm/commit/8dd52b6cce3835950f255f48d13f3d09a7dbe0ff
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:39:05+02:00

Commit Message:
MACVENTURE: Complete text decoding

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/text.cpp
    engines/macventure/text.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d43be9b..e0fcc5d 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -174,6 +174,7 @@ void Gui::setWindowTitle(WindowReference winID, Common::String string) {
 void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children) {
 	WindowData &data = findWindowData(ref);
 	data.children.clear();
+	data.objRef = objID;
 	uint32 originx = 0x7fff;
 	uint32 originy = 0x7fff;
 	for (uint i = 0; i < children.size(); i++) {
@@ -224,6 +225,8 @@ void Gui::initGUI() {
 
 	initWindows();
 
+	assignObjReferences();
+
 	if (!loadControls())
 		error("Could not load controls");
 
@@ -238,43 +241,47 @@ void Gui::initWindows() {
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
 	_controlsWindow->setActive(false);
 	_controlsWindow->setCallback(commandsWindowCallback, this);
-	loadBorder(_controlsWindow, "border_command.bmp", false);
-	loadBorder(_controlsWindow, "border_command.bmp", true);
+	//loadBorder(_controlsWindow, "border_command.bmp", false);
+	//loadBorder(_controlsWindow, "border_command.bmp", true);
 
 	// Main Game Window
 	_mainGameWindow = _wm.addWindow(false, false, false);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
-	findWindowData(kMainGameWindow).objRef = 3;
+	//loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
 	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
+	//loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
+	//loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, true);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
-	findWindowData(kMainGameWindow).objRef = 0;
+	//loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+	//loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+
+
+}
 
+void Gui::assignObjReferences() {
+
+	findWindowData(kSelfWindow).objRef = 0;
 
 }
 
@@ -282,7 +289,7 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
 	WindowData newData;
 	GlobalSettings settings = _engine->getGlobalSettings();
-	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a hack
+	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a HACK
 
 	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
 		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
@@ -303,8 +310,8 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
-	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -587,7 +594,7 @@ void Gui::drawExitsWindow() {
 		srf->w + border.rightOffset,
 		srf->h + border.bottomOffset), kColorWhite);
 
-	drawObjectsInWindow(kExitsWindow, _exitsWindow->getSurface());
+	drawObjectsInWindow(kMainGameWindow, _exitsWindow->getSurface());
 }
 
 void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -792,12 +799,6 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 				it->unselect();
 			}
 		}
-		if (winID == kMainGameWindow) {
-			drawMainGameWindow();
-		} else {
-			Graphics::MacWindow *winRef = findWindow(winID);
-			winRef->getSurface()->fillRect(data.bounds, kColorGray);
-		}
 		Common::Array<DrawableObject> &children = data.children;
 		for (uint i = 0; i < children.size(); i++) {
 			uint flag = 0;
@@ -812,8 +813,17 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 					mode = kBlitOR;
 				}
 				children[i] = DrawableObject(child, mode);
+			} else {
+				children[i] = DrawableObject(child, kBlitXOR);
 			}
 		}
+		if (winID == kMainGameWindow) {
+			drawMainGameWindow();
+		}
+		else {
+			Graphics::MacWindow *winRef = findWindow(winID);
+			winRef->getSurface()->fillRect(data.bounds, kColorGray);
+		}
 		if (data.type == kZoomDoc && data.updateScroll) {
 			warning("Unimplemented: update scroll");
 		}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 1da1b10..3569df7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -221,6 +221,7 @@ private: // Methods
 	// Initializers
 	void initGUI();
 	void initWindows();
+	void assignObjReferences(); // Mainly guesswork
 
 	// Loaders
 	bool loadMenus();
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 52f0dfa..9538d0c 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -37,6 +37,7 @@ enum BlitMode {
 	kBlitBIC = 1,
 	kBlitOR = 2,
 	kBlitXOR = 3
+	//kBlitNONE = 4,
 };
 
 enum GraphicsEncoding {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 21496cd..3187b39 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -59,8 +59,14 @@ MacVentureEngine::~MacVentureEngine() {
 	if (_filenames)
 		delete _filenames;
 
-	if (_decodingArticles)
-		delete _decodingArticles;
+	if (_decodingDirectArticles)
+		delete _decodingDirectArticles;
+
+	if (_decodingNamingArticles)
+		delete _decodingNamingArticles;
+
+	if (_decodingIndirectArticles)
+		delete _decodingIndirectArticles;
 
 	if (_textHuffman)
 		delete _textHuffman;
@@ -88,7 +94,9 @@ Common::Error MacVentureEngine::run() {
 	_oldTextEncoding = !loadTextHuffman();
 
 	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
-	_decodingArticles = new StringTable(this, _resourceManager, kCommonArticlesStringTableID);
+	_decodingDirectArticles = new StringTable(this, _resourceManager, kCommonArticlesStringTableID);
+	_decodingNamingArticles = new StringTable(this, _resourceManager, kNamingArticlesStringTableID);
+	_decodingDirectArticles = new StringTable(this, _resourceManager, kIndirectArticlesStringTableID);
 
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
@@ -251,7 +259,6 @@ void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source,
 }
 
 bool MacVentureEngine::printTexts() {
-	warning("printTexts: unimplemented");
 	for (uint i = 0; i < _textQueue.size(); i++) {
 		QueuedText text = _textQueue.front();
 		_textQueue.remove_at(0);
@@ -265,7 +272,7 @@ bool MacVentureEngine::printTexts() {
 			gameChanged();
 			break;
 		case kTextPlain:
-			debug("Print Plain Text: %s", _world->getText(text.asset).c_str());
+			debug("Print Plain Text: %s", _world->getText(text.asset, text.source, text.destination).c_str());
 			gameChanged();
 			break;
 		}
@@ -401,11 +408,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 	if (_selectedControl == 1)
 		_gameChanged = false;
 
-<<<<<<< HEAD
-	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying){
-=======
 	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying) {
->>>>>>> 088fc4d... MACVENTURE: Script engine fixes
 		if (_scriptEngine->runControl(kTick, _selectedControl, _destObject, _deltaPoint)) {
 			_haltedAtEnd = true;
 			return true;
@@ -493,7 +496,6 @@ void MacVentureEngine::resetVars() {
 void MacVentureEngine::unselectAll() {
 	while (!_currentSelection.empty()) {
 		unselectObject(_currentSelection.front());
-		//_currentSelection.remove_at(0);
 	}
 }
 
@@ -532,6 +534,22 @@ int MacVentureEngine::findObjectInArray(ObjID objID, const Common::Array<ObjID>
 	return found ? i : -1;
 }
 
+uint MacVentureEngine::getPrefixNdx(ObjID obj) {
+	return _world->getObjAttr(obj, kAttrPrefixes);
+}
+
+Common::String MacVentureEngine::getPrefixString(uint flag, ObjID obj) {
+	uint ndx = _world->getObjAttr(obj, kAttrPrefixes); // HACK should check the type of that one
+	ndx = ((ndx) >> flag) & 3;
+	if (ndx) {
+		return (*_decodingNamingArticles->getStrings())[ndx];
+	}
+}
+
+Common::String MacVentureEngine::getNoun(ObjID ndx) {
+	return (*_decodingIndirectArticles->getStrings())[ndx];
+}
+
 void MacVentureEngine::highlightExit(ObjID objID) {
 	warning("highlightExit: unimplemented");
 }
@@ -541,7 +559,7 @@ void MacVentureEngine::selectPrimaryObject(ObjID objID) {
 	int idx;
 	if (_destObject > 0 &&
 		(idx = findObjectInArray(_destObject, _selectedObjs)) != -1 &&
-		findObjectInArray(_destObject, _currentSelection) == -1) 
+		findObjectInArray(_destObject, _currentSelection) == -1)
 	{
 		_selectedObjs.remove_at(idx);
 		highlightExit(_destObject);
@@ -570,13 +588,13 @@ void MacVentureEngine::openObject(ObjID objID) {
 		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
 		//_gui->drawExits();
-		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID));
+		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID, objID, objID)); // it ignores source and target in the original
 	} else { // Open inventory window
 		Common::Point p(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
 		//getParentWin(obj).localToGlobal(p);
 		//globalToDesktop(p);
 		WindowReference invID = _gui->createInventoryWindow(objID);
-		_gui->setWindowTitle(invID, _world->getText(objID));
+		_gui->setWindowTitle(invID, _world->getText(objID, objID, objID));
 		_gui->updateWindowInfo(invID, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(invID, _world->getObjAttr(objID, kAttrContainerOpen));
 	}
@@ -664,7 +682,7 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 		tmp = from;
 	}
 	if (tmp) {
-		Common::String newTitle = _world->getText(toID);
+		Common::String newTitle = _world->getText(toID, 0, 0); // Ignores src and targ in the original
 		_gui->setWindowTitle(tmp, newTitle);
 		_gui->updateWindowInfo(tmp, toID, _world->getChildren(toID, true));
 		updateWindow(tmp);
@@ -677,7 +695,7 @@ void MacVentureEngine::toggleExits() {
 		_selectedObjs.remove_at(0);
 		highlightExit(obj);
 		updateWindow(findParentWindow(obj));
-	}	
+	}
 }
 
 void MacVentureEngine::zoomObject(ObjID objID) {
@@ -775,13 +793,13 @@ Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
 	//not the same parent? 0 overlap
 	if (_world->getObjAttr(one, kAttrParentObject) !=
-		_world->getObjAttr(other, kAttrParentObject)) 
+		_world->getObjAttr(other, kAttrParentObject))
 		return 0;
 
 	Common::Rect oneBounds = getObjBounds(one);
 	Common::Rect otherBounds = getObjBounds(other);
 	if (otherBounds.intersects(oneBounds) ||
-		oneBounds.intersects(otherBounds)) 
+		oneBounds.intersects(otherBounds))
 	{
 		uint areaOne = oneBounds.width() * oneBounds.height();
 		uint areaOther = otherBounds.width() * otherBounds.height();
@@ -805,7 +823,7 @@ WindowReference MacVentureEngine::findObjWindow(ObjID objID) {
 	// This is a bit of a hack, we take advantage of the consecutive nature of references
 	for (uint i = kCommandsWindow; i <= kDiplomaWindow; i++) {
 		const WindowData &data = _gui->getWindowData((WindowReference)i);
-		if (data.refcon == objID) { return data.refcon; }
+		if (data.objRef == objID) { return data.refcon; }
 	}
 	return kNoWindow;
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 4671c2a..891fdb5 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -194,6 +194,10 @@ public:
 	const HuffmanLists *getDecodingHuffman() const;
 	uint32 randBetween(uint32 min, uint32 max);
 	uint32 getInvolvedObjects();
+	int findObjectInArray(ObjID objID, const Common::Array<ObjID> &list);
+	uint getPrefixNdx(ObjID obj);
+	Common::String getPrefixString(uint flag, ObjID obj);
+	Common::String getNoun(ObjID ndx);
 
 	// Attributes consult
 	Common::Point getObjPosition(ObjID objID);
@@ -224,7 +228,6 @@ private:
 	void unselectAll();
 	void selectObject(ObjID objID);
 	void unselectObject(ObjID objID);
-	int findObjectInArray(ObjID objID, const Common::Array<ObjID> &list);
 	void highlightExit(ObjID objID);
 	void selectPrimaryObject(ObjID objID);
 
@@ -261,7 +264,9 @@ private: // Attributes
 
 	// String tables
 	StringTable *_filenames;
-	StringTable *_decodingArticles;
+	StringTable *_decodingDirectArticles;
+	StringTable *_decodingNamingArticles;
+	StringTable *_decodingIndirectArticles;
 
 	// Engine state
 	GameState _gameState;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 4c00054..2e283e4 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -794,21 +794,21 @@ void ScriptEngine::opacEQ(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opadEQS(EngineState * state, EngineFrame * frame) {
-	Common::String b = _world->getText(state->pop());
-	Common::String a = _world->getText(state->pop());
+	Common::String b = _world->getText(state->pop(), 0, 0); // HACK, these destinations might be wrong
+	Common::String a = _world->getText(state->pop(), 0, 0);
 	state->push((a == b) ? 1 : 0);
 }
 
 void ScriptEngine::opaeCONT(EngineState * state, EngineFrame * frame) {
-	Common::String needle = _world->getText(state->pop());
-	Common::String haystack = _world->getText(state->pop());
+	Common::String needle = _world->getText(state->pop(), 0, 0);
+	Common::String haystack = _world->getText(state->pop(), 0, 0);
 	haystack.toLowercase();
 	state->push(haystack.contains(needle) ? 1 : 0);
 }
 
 void ScriptEngine::opafCONTW(EngineState * state, EngineFrame * frame) {
-	Common::String needle = _world->getText(state->pop());
-	Common::String haystack = _world->getText(state->pop());
+	Common::String needle = _world->getText(state->pop(), 0, 0);
+	Common::String haystack = _world->getText(state->pop(), 0, 0);
 	haystack.toLowercase();
 	state->push(haystack.contains(needle) ? 1 : 0);
 }
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 49df7ed..79c3200 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -23,11 +23,14 @@
 #include "macventure/text.h"
 
 namespace MacVenture {
-TextAsset::TextAsset(ObjID objid, Container *container, bool isOld, const HuffmanLists *huffman) {
+TextAsset::TextAsset(MacVentureEngine *engine, ObjID objid, ObjID source, ObjID target, Container *container, bool isOld, const HuffmanLists *huffman) {
 	_id = objid;
+	_sourceObj = source;
+	_targetObj = target;
 	_container = container;
 	_huffman = huffman;
 	_isOld = isOld;
+	_engine = engine;
 
 	if (_isOld) {
 		decodeOld();
@@ -77,8 +80,20 @@ void TextAsset::decodeOld() {
 			lowercase = true;
 		}
 		else if (val == 0x1D) { // Composite
-			warning("Composite strings not implemented");
-			stream.getBits(16);
+			ObjID subval = stream.getBits(16);
+			Common::String child;
+			if (subval & 0x8000) {
+				// Composite object id
+				subval ^= 0xFFFF;
+				child = getNoun(subval);
+			} else {
+				// Just another id
+				// HACK, see below in getNoun()
+				child = *TextAsset(_engine, subval, _sourceObj, _targetObj, _container, _isOld, _huffman).decode();
+			}
+			if (child.size() > 0) {
+				c = '?'; // HACK Will fix later, should append
+			}
 			lowercase = true;
 		}
 		else if (val == 0x1E) {
@@ -102,7 +117,7 @@ void TextAsset::decodeOld() {
 void TextAsset::decodeHuffman() {
 	_decoded = Common::String("");
 	Common::SeekableReadStream *res = _container->getItem(_id);
-	Common::BitStream32BEMSB stream(res);
+	Common::BitStream8MSB stream(res);
 	uint16 strLen = 0;
 	if (stream.getBit()) {
 		strLen = stream.getBits(15);
@@ -110,12 +125,13 @@ void TextAsset::decodeHuffman() {
 	else {
 		strLen = stream.getBits(7);
 	}
-
+	// OK up to here
 	uint32 mask = 0;
 	uint32 symbol = 0;
 	char c;
 	for (uint16 i = 0; i < strLen; i++) {
-		mask = stream.peekBits(16); // The mask is OK, so it means that I don't know how to use the huffman
+		mask = stream.peekBits(16); // The mask is OK
+
 		uint32 entry;
 		// Find the length index
 		for (entry = 0; entry < _huffman->getNumEntries(); entry++) {
@@ -128,24 +144,63 @@ void TextAsset::decodeHuffman() {
 
 		if (symbol == 1) { // 7-bit ascii
 			c = stream.getBits(7);
-		}
-		else if (symbol == 2) { // Composite
-			warning("Composite huffman strings not tested");
+			_decoded += c;
+		} else if (symbol == 2) { // Composite
 			if (stream.getBit()) { // TextID
 				ObjID embedId = stream.getBits(15);
-				TextAsset embedded(embedId, _container, _isOld, _huffman);
-				_decoded += *embedded.decode();
+				uint pos = stream.pos(); // HACK, part 1
+				TextAsset embedded(_engine, embedId, _sourceObj, _targetObj, _container, _isOld, _huffman);
+				stream.rewind();// HACK, part 2
+				stream.skip(pos);
+
+				_decoded.replace(_decoded.end(), _decoded.end(), *embedded.decode());
+
+				// Another HACK, to get around that EOS char I insert at the end
+				_decoded.replace(_decoded.end() - 1, _decoded.end(), "");
 			} else { //Composite obj string
-				_decoded += Common::String("Unimplemented");
+				ObjID embedId = stream.getBits(8);
+				_decoded.replace(_decoded.end(), _decoded.end(), getNoun(embedId));
+				// Another HACK, to get around that EOS char I insert at the end
+				_decoded.replace(_decoded.end() - 1, _decoded.end(), "");
 			}
-		}
-		else { // Plain ascii
+		} else { // Plain ascii
 			c = symbol & 0xFF;
-		}
-
-		_decoded += c;
+			_decoded.replace(_decoded.end(), _decoded.end(), Common::String(c));
+		}		
 	}
 	_decoded += '\0';
 	debug(7, "Decoded %d'th string (new): %s", _id, _decoded.c_str());	
 }
+Common::String TextAsset::getNoun(ObjID subval) {
+	ObjID obj;
+	Common::String name;
+	if (subval & 8)
+		obj = _targetObj;
+	else
+		obj = _sourceObj;
+	if ((subval & 3) == 1)
+	{
+		uint idx = _engine->getPrefixNdx(obj);
+		idx = ((idx >> 4) & 3) + 1;
+		name = _engine->getNoun(idx);
+	}
+	else
+	{
+		// HACK, there should be a pool of assets or something like in the GUI
+		name = *TextAsset(_engine, obj, _sourceObj, _targetObj, _container, _isOld, _huffman).decode();
+		switch (subval & 3)
+		{
+		case 2:
+			name = _engine->getPrefixString(0, obj) + name;
+			break;
+		case 3:
+			name = _engine->getPrefixString(2, obj) + name;
+			break;
+		}
+	}
+	if (name.size() && (subval & 4))
+		name.toUppercase(); // HACK, should only capitalize first char?
+	return name;
+}
+
 } // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/text.h b/engines/macventure/text.h
index cfe76d6..2389454 100644
--- a/engines/macventure/text.h
+++ b/engines/macventure/text.h
@@ -31,7 +31,7 @@ typedef uint32 ObjID;
 
 class TextAsset {
 public:
-	TextAsset(ObjID objid, Container *container, bool isOld, const HuffmanLists *huffman);
+	TextAsset(MacVentureEngine *engine, ObjID objid, ObjID source, ObjID target, Container *container, bool isOld, const HuffmanLists *huffman);
 	~TextAsset() {}
 
 	const Common::String *decode() {
@@ -42,9 +42,15 @@ private:
 	void decodeOld();
 	void decodeHuffman();
 
+	Common::String getNoun(ObjID id);
+
 private:
+	MacVentureEngine *_engine;
+
 	Container *_container;
 	ObjID _id;
+	ObjID _targetObj;
+	ObjID _sourceObj;
 	const HuffmanLists *_huffman;
 	bool _isOld;
 	
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 2ee7bae..02d388a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -25,9 +25,6 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	
 	warning("Test functions about to happen");
 	_gameText = new Container("Shadowgate II/Shadow Text");	
-
-	ObjID tid = (ObjID)1;
-	TextAsset test = TextAsset(tid, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
 	
 	delete saveGameRes;
 	saveGameFile.close();		
@@ -153,8 +150,8 @@ void World::captureChildren(ObjID objID) {
 void World::releaseChildren(ObjID objID) {
 }
 
-Common::String World::getText(ObjID objID) {
-	TextAsset text = TextAsset(objID, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
+Common::String World::getText(ObjID objID, ObjID source, ObjID target) {
+	TextAsset text = TextAsset(_engine, objID, source, target, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
 	
 	return *text.decode();
 }
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index f42dd3a..c023c70 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -99,7 +99,7 @@ public:
 
 	uint32 getObjAttr(ObjID objID, uint32 attrID);
 	Attribute getGlobal(uint32 attrID);
-	Common::String getText(ObjID objID);
+	Common::String getText(ObjID objID, ObjID source, ObjID target);
 
 	bool isObjActive(ObjID objID);
 


Commit: 25f086e63b2b007ba03a47dcdab2426369edf01f
    https://github.com/scummvm/scummvm/commit/25f086e63b2b007ba03a47dcdab2426369edf01f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:39:06+02:00

Commit Message:
MACVENTURE: Add a small hack for decoding

Changed paths:
    engines/macventure/text.cpp



diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 79c3200..d3fc956 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -159,7 +159,12 @@ void TextAsset::decodeHuffman() {
 				_decoded.replace(_decoded.end() - 1, _decoded.end(), "");
 			} else { //Composite obj string
 				ObjID embedId = stream.getBits(8);
+				uint pos = stream.pos(); // HACK, part 1
+
 				_decoded.replace(_decoded.end(), _decoded.end(), getNoun(embedId));
+				stream.rewind();// HACK, part 2
+				stream.skip(pos);
+
 				// Another HACK, to get around that EOS char I insert at the end
 				_decoded.replace(_decoded.end() - 1, _decoded.end(), "");
 			}


Commit: 4837b7750a5494f7002f8f7c5d47ba44621dd425
    https://github.com/scummvm/scummvm/commit/4837b7750a5494f7002f8f7c5d47ba44621dd425
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:39:27+02:00

Commit Message:
MACVENTURE: Add rect collission for main game window

Changed paths:
    engines/macventure/container.h
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/image.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 4dc5172..440c0cb 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -42,6 +42,8 @@ class Container {
 
 public:
 	Container(const char *filename) {
+		_filename = Common::String(filename);
+
 		if (!_file.open(filename))
 			error("Could not open %s", filename);
 
@@ -172,9 +174,11 @@ public:
 	* getItemByteSize should be called before this one
 	*/
 	Common::SeekableReadStream *getItem(uint32 id) {		
+		_res->seek(0);
+		Common::SeekableReadStream *res = _res->readStream(_res->size()); 
 		if (_simplified) {
-			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
-			return _res;
+			res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
+			return res;
 		} else {
 			uint32 groupID = (id >> 6);
 			uint32 objectIndex = id & 0x3f; // Index within the group		
@@ -184,9 +188,9 @@ public:
 				offset += _groups[groupID].lengths[i];
 			}
 
-			_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
+			res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
 
-			return _res;
+			return res;
 		}
 	}
 	
@@ -202,27 +206,14 @@ protected:
 	uint16 _huff[15];   // huffman masks
 	uint8  _lens[16];   // huffman lengths
 	Common::Array<ItemGroup> _groups;
-
+	
+	Common::String _filename;
 	Common::File _file;
 	Common::SeekableReadStream *_res;
-
-	// To be moved
-	//byte _remainderOffset;
+	
 
 };
 
-/*
-template <typedef T>
-class PersistentContainer : public Container {
-public:
-	PersistentContainer(Common::String filename) :
-		Container(filename) {
-		// Load 
-	}
-
-private:
-
-};*/
 
 } // End of namespace MacVenture
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index e0fcc5d..529d044 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -26,11 +26,19 @@
 #include "macventure/macventure.h"
 #include "macventure/gui.h"
 
+// TBDeleted
+#include "common/system.h"
+
 namespace MacVenture {
 
 enum MenuAction;
 
 enum {
+	kCursorWidth = 4, // HACK Arbitrary width to test
+	kCursorHeight = 4
+};
+
+enum {
 	kMenuHighLevel = -1,
 	kMenuAbout = 0,
 	kMenuFile = 1,
@@ -250,7 +258,7 @@ void Gui::initWindows() {
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
 	//loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
@@ -558,6 +566,17 @@ void Gui::drawMainGameWindow() {
 		kBlitDirect);
 
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
+
+	// To be deleted
+	/*
+	g_system->copyRectToScreen(
+		_mainGameWindow->getSurface()->getPixels(),
+		_mainGameWindow->getSurface()->pitch,
+		0, 0,
+		_mainGameWindow->getSurface()->w,
+		_mainGameWindow->getSurface()->h);
+		*/
+	g_system->updateScreen();
 }
 
 void Gui::drawSelfWindow() {
@@ -914,15 +933,19 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		WindowData &data = findWindowData(kMainGameWindow);
 		ObjID child;
 		Common::Point pos;
+		// Click rect to local coordinates. We assume the click is inside the window ^
+		int left = event.mouse.x - _mainGameWindow->getDimensions().left;
+		int top = event.mouse.y - _mainGameWindow->getDimensions().top;
+		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			pos = _engine->getObjPosition(child);
-			pos.x += _mainGameWindow->getDimensions().left;
-			pos.y += _mainGameWindow->getDimensions().top;
-			pos = event.mouse - pos;
-			if (_assets.contains(child) && _assets[child]->isPointInside(pos)) {
-				// select the first object clicked
-				_engine->handleObjectSelect(child, kMainGameWindow, event);
+			Common::Rect intersection = clickRect.findIntersectingRect(_engine->getObjBounds(child));
+			intersection = Common::Rect(0, 0, intersection.width(), intersection.height());
+			if (_assets.contains(child) && _engine->isObjClickable(child)) {
+				if (_assets[child]->isRectInside(intersection)) {
+					// select the first object clicked
+					_engine->handleObjectSelect(child, kMainGameWindow, event);
+				}
 			}
 		}
 	}
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 323b8a1..1a50a4f 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -350,6 +350,18 @@ bool ImageAsset::isPointInside(Common::Point point) {
 	return pix != 0;
 }
 
+bool ImageAsset::isRectInside(Common::Rect rect) {
+	for (uint y = rect.top; y < rect.top + rect.height(); y++) {
+		uint bmpofs = y * _rowBytes;
+		byte pix;
+		for (uint x = rect.left; x < rect.left + rect.width(); x++) {
+			pix = _maskData[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+			if (pix) return true;
+		}
+	}
+	return false;
+}
+
 uint ImageAsset::getWidth() {
 	return _bitWidth;
 }
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 9538d0c..5cbe146 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -61,6 +61,7 @@ public:
 	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
 
 	bool isPointInside(Common::Point point);
+	bool isRectInside(Common::Rect rect);
 
 	uint getWidth();
 	uint getHeight();


Commit: 45a2aa94b9e79bfe1e384d1240018abdc8df8f84
    https://github.com/scummvm/scummvm/commit/45a2aa94b9e79bfe1e384d1240018abdc8df8f84
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:40:24+02:00

Commit Message:
MACVENTURE: Fix rect collission

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 529d044..e1fb0be 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -39,6 +39,11 @@ enum {
 };
 
 enum {
+	kExitButtonWidth = 10, // HACK Arbitrary width to test
+	kExitButtonHeight = 10
+};
+
+enum {
 	kMenuHighLevel = -1,
 	kMenuAbout = 0,
 	kMenuFile = 1,
@@ -212,7 +217,8 @@ void Gui::removeChild(WindowReference target, ObjID child) {
 		if (data.children[index].obj == child) break;
 	}
 
-	data.children.remove_at(index);
+	if (index < data.children.size())
+		data.children.remove_at(index);
 }
 
 void Gui::initGUI() {
@@ -249,15 +255,15 @@ void Gui::initWindows() {
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
 	_controlsWindow->setActive(false);
 	_controlsWindow->setCallback(commandsWindowCallback, this);
-	//loadBorder(_controlsWindow, "border_command.bmp", false);
-	//loadBorder(_controlsWindow, "border_command.bmp", true);
+	loadBorder(_controlsWindow, "border_command.bmp", false);
+	loadBorder(_controlsWindow, "border_command.bmp", true);
 
 	// Main Game Window
 	_mainGameWindow = _wm.addWindow(false, false, false);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	//loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
 	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
 
 	// In-game Output Console
@@ -265,24 +271,24 @@ void Gui::initWindows() {
 	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	//loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
-	//loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, true);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	//loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
+	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, true, true);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	//loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
 
 
 }
@@ -318,8 +324,8 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
-	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -340,21 +346,12 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
 
 	if (stream) {
-		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename);
-		bmpDecoder.loadStream(*stream);
-		source = *(bmpDecoder.getSurface());
-
-		source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette());
-		surface->create(source.w, source.h, source.format);
-		surface->copyFrom(source);
-		surface->applyColorKey(255, 0, 255, false);
-
-		target->setBorder(*surface, active);
-
-		borderfile.close();
+		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename.c_str());
+		target->loadBorder(*stream, active);
 
 		delete stream;
 	}
+	borderfile.close();
 }
 
 void Gui::loadGraphics() {
@@ -567,21 +564,13 @@ void Gui::drawMainGameWindow() {
 
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
-	// To be deleted
-	/*
-	g_system->copyRectToScreen(
-		_mainGameWindow->getSurface()->getPixels(),
-		_mainGameWindow->getSurface()->pitch,
-		0, 0,
-		_mainGameWindow->getSurface()->w,
-		_mainGameWindow->getSurface()->h);
-		*/
-	g_system->updateScreen();
+	findWindow(kMainGameWindow)->setDirty(true);
 }
 
 void Gui::drawSelfWindow() {
 	drawObjectsInWindow(kSelfWindow, _selfWindow->getSurface());
 	if (_engine->isObjSelected(1)) invertWindowColors(kSelfWindow);
+	findWindow(kSelfWindow)->setDirty(true);
 }
 
 void Gui::drawInventories() {
@@ -600,7 +589,10 @@ void Gui::drawInventories() {
 			srf->h + border.bottomOffset), kColorWhite);
 		drawObjectsInWindow((*it).refcon, _inventoryWindows[(*it).refcon]->getSurface());
 		it++;
+
+		findWindow((*it).refcon)->setDirty(true);
 	}
+
 }
 
 void Gui::drawExitsWindow() {
@@ -613,7 +605,32 @@ void Gui::drawExitsWindow() {
 		srf->w + border.rightOffset,
 		srf->h + border.bottomOffset), kColorWhite);
 
-	drawObjectsInWindow(kMainGameWindow, _exitsWindow->getSurface());
+	// For each obj in the main window, if it is an exit, we draw it
+	WindowData &objData = findWindowData(kMainGameWindow);
+	Common::Point pos;
+	ObjID child;
+	BlitMode mode;
+	Common::Rect exit;
+	for (uint i = 0; i < objData.children.size(); i++) {
+		child = objData.children[i].obj;
+		mode = (BlitMode)objData.children[i].mode;
+		pos = _engine->getObjExitPosition(child);
+		pos.x += border.leftOffset;
+		pos.y += border.topOffset;
+		exit = Common::Rect(pos.x, pos.y, pos.x + kExitButtonWidth, pos.y + kExitButtonHeight);
+		if (_engine->isObjExit(child)) {
+			if (_engine->isObjSelected(child))
+				srf->fillRect(exit, kColorGreen);
+
+			srf->fillRect(exit, kColorGreen);
+		}
+	}
+
+	findWindow(kExitsWindow)->setDirty(true);
+
+	// To be deleted
+	//g_system->copyRectToScreen(srf->getPixels(), srf->pitch, 0, 0, srf->w, srf->h);
+	//g_system->updateScreen();
 }
 
 void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -652,7 +669,6 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 	}
 
-	findWindow(data.refcon)->setDirty(true);
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -939,9 +955,19 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			Common::Rect intersection = clickRect.findIntersectingRect(_engine->getObjBounds(child));
-			intersection = Common::Rect(0, 0, intersection.width(), intersection.height());
-			if (_assets.contains(child) && _engine->isObjClickable(child)) {
+			if (_assets.contains(child) &&
+				_engine->isObjClickable(child) &&
+				_engine->isObjVisible(child)) {
+				Common::Rect bounds = _engine->getObjBounds(child);
+				Common::Rect intersection = bounds.findIntersectingRect(clickRect);
+				// We translate it to the image's coord system
+				intersection = Common::Rect(
+					intersection.left - bounds.left,
+					intersection.top - bounds.top,
+					intersection.left - bounds.left + intersection.width(),
+					intersection.top - bounds.top + intersection.height());
+
+
 				if (_assets[child]->isRectInside(intersection)) {
 					// select the first object clicked
 					_engine->handleObjectSelect(child, kMainGameWindow, event);
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 1a50a4f..e70a821 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -80,7 +80,7 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 	if (size == 2 || size == 0) {
 		realID = _container->getItem(id)->readUint16BE();
 	}
-	Common::BitStream32BEMSB stream(_container->getItem(realID));
+	Common::BitStream32BEMSB stream(_container->getItem(realID), true);
 
 	uint8 mode = stream.getBits(3);
 	int w, h;
@@ -367,7 +367,7 @@ uint ImageAsset::getWidth() {
 }
 
 uint ImageAsset::getHeight() {
-	return _bitWidth;
+	return _bitHeight;
 }
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 3187b39..012c9a7 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -96,7 +96,7 @@ Common::Error MacVentureEngine::run() {
 	_filenames = new StringTable(this, _resourceManager, kFilenamesStringTableID);
 	_decodingDirectArticles = new StringTable(this, _resourceManager, kCommonArticlesStringTableID);
 	_decodingNamingArticles = new StringTable(this, _resourceManager, kNamingArticlesStringTableID);
-	_decodingDirectArticles = new StringTable(this, _resourceManager, kIndirectArticlesStringTableID);
+	_decodingIndirectArticles = new StringTable(this, _resourceManager, kIndirectArticlesStringTableID);
 
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
@@ -783,6 +783,16 @@ bool MacVentureEngine::isObjSelected(ObjID objID) {
 	return idx != -1;
 }
 
+bool MacVentureEngine::isObjExit(ObjID objID) {
+	return _world->getObjAttr(objID, kAttrIsExit);
+}
+
+Common::Point MacVentureEngine::getObjExitPosition(ObjID objID) {
+	uint x = _world->getObjAttr(objID, kAttrExitX);
+	uint y = _world->getObjAttr(objID, kAttrExitY);
+	return Common::Point(x, y);
+}
+
 Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 	Common::Point pos = getObjPosition(objID);
 	uint w = _gui->getObjWidth(objID); // This shouldn't go here
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 891fdb5..c63864d 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -204,6 +204,8 @@ public:
 	bool isObjVisible(ObjID objID);
 	bool isObjClickable(ObjID objID);
 	bool isObjSelected(ObjID objID);
+	bool isObjExit(ObjID objID);
+	Common::Point getObjExitPosition(ObjID objID);
 
 	// Encapsulation HACK
 	Common::Rect getObjBounds(ObjID objID);


Commit: 8bee2a7b1c467a2b442cd0d8a35487ac9e963de9
    https://github.com/scummvm/scummvm/commit/8bee2a7b1c467a2b442cd0d8a35487ac9e963de9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:40:47+02:00

Commit Message:
MACVENTURE: Add inventory callback

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index e1fb0be..04cc390 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -726,6 +726,27 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	return nullptr;
 }
 
+bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
+	if (_assets.contains(obj) &&
+		_engine->isObjClickable(obj) &&
+		_engine->isObjVisible(obj)) {
+		Common::Rect bounds = _engine->getObjBounds(obj);
+		Common::Rect intersection = bounds.findIntersectingRect(target);
+		// We translate it to the image's coord system
+		intersection = Common::Rect(
+			intersection.left - bounds.left,
+			intersection.top - bounds.top,
+			intersection.left - bounds.left + intersection.width(),
+			intersection.top - bounds.top + intersection.height());
+
+
+		if (_assets[obj]->isRectInside(intersection)) {
+			return true;
+		}
+	}
+	return false;
+}
+
 
 /* HANDLERS */
 void Gui::handleMenuAction(MenuAction action) {
@@ -955,23 +976,8 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			if (_assets.contains(child) &&
-				_engine->isObjClickable(child) &&
-				_engine->isObjVisible(child)) {
-				Common::Rect bounds = _engine->getObjBounds(child);
-				Common::Rect intersection = bounds.findIntersectingRect(clickRect);
-				// We translate it to the image's coord system
-				intersection = Common::Rect(
-					intersection.left - bounds.left,
-					intersection.top - bounds.top,
-					intersection.left - bounds.left + intersection.width(),
-					intersection.top - bounds.top + intersection.height());
-
-
-				if (_assets[child]->isRectInside(intersection)) {
-					// select the first object clicked
-					_engine->handleObjectSelect(child, kMainGameWindow, event);
-				}
+			if (isRectInsideObject(clickRect, child)) {
+				_engine->handleObjectSelect(child, kMainGameWindow, event);
 			}
 		}
 	}
@@ -1011,7 +1017,32 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	return false;
+	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
+
+		// Find the appropriate window
+		uint ref = 0;
+		uint i;
+		for (uint i = 0; i < _inventoryWindows.size(); i++) {
+			if (_inventoryWindows[i]->hasAllFocus()) { // HACK
+				ref = i;
+			}
+		}
+
+		WindowData &data = findWindowData((WindowReference) ref);
+		ObjID child;
+		Common::Point pos;
+		// Click rect to local coordinates. We assume the click is inside the window ^
+		int left = event.mouse.x - _inventoryWindows[i]->getDimensions().left;
+		int top = event.mouse.y - _inventoryWindows[i]->getDimensions().top;
+		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
+		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
+			child = (*it).obj;
+			if (isRectInsideObject(clickRect, child)) {
+				_engine->handleObjectSelect(child, (WindowReference)ref, event);
+			}
+		}
+	}
+	return true;
 }
 
 /* Ugly switches */
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 3569df7..cd6fda7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -245,6 +245,9 @@ private: // Methods
 	WindowData& findWindowData(WindowReference reference);
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
+	// Utils
+	bool isRectInsideObject(Common::Rect target, ObjID obj);
+
 };
 
 class CommandButton {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 012c9a7..a87da31 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -291,16 +291,14 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Comm
 
 	if (event.kbd.flags & Common::KBD_SHIFT) {
 		// Do shift ;)
-	}
-	else {
+	} else {
 		if (_selectedControl && _currentSelection.size() > 0 && getInvolvedObjects() > 1) {
 			if (objID == 0)
 				selectPrimaryObject(windata.objRef);
 			else
 				selectPrimaryObject(objID);
 			preparedToRun();
-		}
-		else {
+		} else {
 			if (objID == 0) {
 				unselectAll();
 				//if (windata.type == kAnimateBack) {


Commit: 764d0ad0fed0dd4e65bd9f6b090fbb803666ba45
    https://github.com/scummvm/scummvm/commit/764d0ad0fed0dd4e65bd9f6b090fbb803666ba45
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:40:48+02:00

Commit Message:
MACVENTURE: Fix small script bug

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 04cc390..6f3680b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -34,8 +34,8 @@ namespace MacVenture {
 enum MenuAction;
 
 enum {
-	kCursorWidth = 4, // HACK Arbitrary width to test
-	kCursorHeight = 4
+	kCursorWidth = 10, // HACK Arbitrary width to test
+	kCursorHeight = 10
 };
 
 enum {
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 2e283e4..cca144e 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -593,6 +593,7 @@ void ScriptEngine::op8eCOPYN(EngineState * state, EngineFrame * frame) {
 	while (n) {
 		val = state->peek(offs);
 		state->push(val);
+		n--;
 	}
 }
 


Commit: 08588eb6f914fc77aa443f3844681787bde02949
    https://github.com/scummvm/scummvm/commit/08588eb6f914fc77aa443f3844681787bde02949
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:41:13+02:00

Commit Message:
MACVENTURE: Add first drag implementation

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6f3680b..0b13923 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -26,7 +26,7 @@
 #include "macventure/macventure.h"
 #include "macventure/gui.h"
 
-// TBDeleted
+// For the dragged object
 #include "common/system.h"
 
 namespace MacVenture {
@@ -94,6 +94,11 @@ void menuCommandsCallback(int action, Common::String &text, void *data);
 Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_engine = engine;
 	_resourceManager = resman;
+	_windowData = nullptr;
+	_controlData = nullptr;
+	_draggedObj.id = 0;
+	_draggedObj.pos = Common::Point(0, 0);
+
 	initGUI();
 }
 
@@ -120,6 +125,8 @@ void Gui::draw() {
 
 	_wm.draw();
 
+	drawDraggedObject();
+
 	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
@@ -648,7 +655,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
 
-		if (pos != forbidden || child < 600) { // Small HACK until I figre out where the last garbage child in main game window comes from
+		if (pos != forbidden && child < 600 && child != _draggedObj.id) { // Small HACK until I figre out where the last garbage child in main game window comes from
 			if (!_assets.contains(child)) {
 				_assets[child] = new ImageAsset(child, _graphics);
 			}
@@ -689,6 +696,30 @@ void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * sur
 		Graphics::kTextAlignCenter);
 }
 
+void Gui::drawDraggedObject() {
+	if (_draggedObj.id != 0) {
+		if (!_assets.contains(_draggedObj.id))
+			_assets[_draggedObj.id] = new ImageAsset(_draggedObj.id, _graphics);
+
+		ImageAsset *asset = _assets[_draggedObj.id];
+
+		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
+		_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
+			Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
+
+		asset->blitInto(&_draggedSurface, 0, 0, kBlitOR);
+
+		g_system->copyRectToScreen(
+			_draggedSurface.getPixels(),
+			_draggedSurface.pitch,
+			_draggedObj.pos.x,
+			_draggedObj.pos.y,
+			_draggedSurface.w,
+			_draggedSurface.h);
+
+	}
+}
+
 WindowData & Gui::findWindowData(WindowReference reference) {
 	assert(_windowData);
 
@@ -747,6 +778,18 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	return false;
 }
 
+void Gui::selectDraggable(ObjID child, Common::Point pos) {
+	if (_engine->isObjClickable(child)) {
+		_draggedObj.id = child;
+		_draggedObj.pos = pos;
+	}
+}
+
+void Gui::handleDragRelease(Common::Point pos) {
+	_draggedObj.id = 0;
+	_engine->updateDelta(pos);
+}
+
 
 /* HANDLERS */
 void Gui::handleMenuAction(MenuAction action) {
@@ -919,10 +962,19 @@ uint Gui::getObjHeight(ObjID obj) {
 
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
-	if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP) {
-		_engine->updateDelta(event.mouse);
+	if (event.type == Common::EVENT_MOUSEMOVE) {
+		if (_draggedObj.id != 0) {
+			_draggedObj.pos = event.mouse;
+		}
 		processed = true;
 	}
+	else if (event.type == Common::EVENT_LBUTTONUP) {
+		if (_draggedObj.id != 0) {
+			handleDragRelease(event.mouse);
+		}
+		processed = true;
+	}
+
 	processed |= _wm.processEvent(event);
 	return (processed);
 }
@@ -966,7 +1018,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
+	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
 		WindowData &data = findWindowData(kMainGameWindow);
 		ObjID child;
 		Common::Point pos;
@@ -977,6 +1029,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
+				selectDraggable(child, event.mouse);
 				_engine->handleObjectSelect(child, kMainGameWindow, event);
 			}
 		}
@@ -1017,7 +1070,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONUP) {
+	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
 
 		// Find the appropriate window
 		uint ref = 0;
@@ -1038,6 +1091,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
+				selectDraggable(child, event.mouse);
 				_engine->handleObjectSelect(child, (WindowReference)ref, event);
 			}
 		}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index cd6fda7..9d48d63 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -144,6 +144,11 @@ struct BorderBounds {
 	BorderBounds(uint16 l, uint16 t, uint16 r, uint16 b) : leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
 };
 
+struct DraggedObj {
+	ObjID id;
+	Common::Point pos;
+};
+
 
 class Gui {
 
@@ -216,6 +221,9 @@ private: // Attributes
 	Container *_graphics;
 	Common::HashMap<ObjID, ImageAsset*> _assets;
 
+	Graphics::ManagedSurface _draggedSurface;
+	DraggedObj _draggedObj;
+
 private: // Methods
 
 	// Initializers
@@ -238,6 +246,7 @@ private: // Methods
 	void drawInventories();
 	void drawExitsWindow();
 
+	void drawDraggedObject();
 	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 
@@ -247,6 +256,8 @@ private: // Methods
 
 	// Utils
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
+	void selectDraggable(ObjID child, Common::Point pos);
+	void handleDragRelease(Common::Point pos);
 
 };
 


Commit: 0485483254e9ce94acfd4750122a466984227904
    https://github.com/scummvm/scummvm/commit/0485483254e9ce94acfd4750122a466984227904
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:41:15+02:00

Commit Message:
MACVENTURE: Minor fixes and skull rising

Changed paths:
    engines/macventure/container.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h
    engines/macventure/stringtable.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 440c0cb..f0094a7 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -173,12 +173,9 @@ public:
 	/**
 	* getItemByteSize should be called before this one
 	*/
-	Common::SeekableReadStream *getItem(uint32 id) {		
-		_res->seek(0);
-		Common::SeekableReadStream *res = _res->readStream(_res->size()); 
+	Common::SeekableReadStream *getItem(uint32 id) {	
 		if (_simplified) {
-			res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
-			return res;
+			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
 		} else {
 			uint32 groupID = (id >> 6);
 			uint32 objectIndex = id & 0x3f; // Index within the group		
@@ -188,10 +185,12 @@ public:
 				offset += _groups[groupID].lengths[i];
 			}
 
-			res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
+			_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
 
-			return res;
 		}
+
+		Common::SeekableReadStream *res = _res->readStream(getItemByteSize(id) * 2);
+		return res;
 	}
 	
 protected:
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 0b13923..c8f6b3b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -34,8 +34,8 @@ namespace MacVenture {
 enum MenuAction;
 
 enum {
-	kCursorWidth = 10, // HACK Arbitrary width to test
-	kCursorHeight = 10
+	kCursorWidth = 2, // HACK Arbitrary width to test
+	kCursorHeight = 2
 };
 
 enum {
@@ -126,7 +126,7 @@ void Gui::draw() {
 	_wm.draw();
 
 	drawDraggedObject();
-
+		
 	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
@@ -202,8 +202,8 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 			ObjID child = children[i];
 			if (ref != kMainGameWindow) {
 				Common::Point childPos = _engine->getObjPosition(child);
-				originx = originx > childPos.x ? childPos.x : originx;
-				originy = originy > childPos.y ? childPos.y : originy;
+				originx = originx > (uint)childPos.x ? (uint)childPos.x : originx;
+				originy = originy > (uint)childPos.y ? (uint)childPos.y : originy;
 			}
 			data.children.push_back(DrawableObject(child, kBlitBIC));
 		}
@@ -362,7 +362,7 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 }
 
 void Gui::loadGraphics() {
-	_graphics = new Container("Shadowgate II/Shadow Graphic");
+	_graphics = new Container(_engine->getFilePath(kGraphicPathID).c_str());
 }
 
 bool Gui::loadMenus() {
@@ -616,11 +616,11 @@ void Gui::drawExitsWindow() {
 	WindowData &objData = findWindowData(kMainGameWindow);
 	Common::Point pos;
 	ObjID child;
-	BlitMode mode;
+	//BlitMode mode;
 	Common::Rect exit;
 	for (uint i = 0; i < objData.children.size(); i++) {
 		child = objData.children[i].obj;
-		mode = (BlitMode)objData.children[i].mode;
+		//mode = (BlitMode)objData.children[i].mode;
 		pos = _engine->getObjExitPosition(child);
 		pos.x += border.leftOffset;
 		pos.y += border.topOffset;
@@ -788,6 +788,13 @@ void Gui::selectDraggable(ObjID child, Common::Point pos) {
 void Gui::handleDragRelease(Common::Point pos) {
 	_draggedObj.id = 0;
 	_engine->updateDelta(pos);
+	_engine->preparedToRun();
+}
+
+Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect windowBounds) {
+	int left = clickPos.x - windowBounds.left;
+	int top = clickPos.y - windowBounds.top;
+	return Common::Rect(left - kCursorWidth, top - kCursorHeight, left + kCursorWidth, top + kCursorHeight);
 }
 
 
@@ -967,6 +974,12 @@ bool Gui::processEvent(Common::Event &event) {
 			_draggedObj.pos = event.mouse;
 		}
 		processed = true;
+
+		// TEST
+		Common::Rect mr = calculateClickRect(event.mouse, _screen.getBounds());
+		_screen.fillRect(mr, kColorGreen);
+		g_system->copyRectToScreen(_screen.getPixels(), _screen.pitch, 0, 0, _screen.w, _screen.h);
+		g_system->updateScreen();
 	}
 	else if (event.type == Common::EVENT_LBUTTONUP) {
 		if (_draggedObj.id != 0) {
@@ -1023,9 +1036,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		ObjID child;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
-		int left = event.mouse.x - _mainGameWindow->getDimensions().left;
-		int top = event.mouse.y - _mainGameWindow->getDimensions().top;
-		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
+		Common::Rect clickRect = calculateClickRect(event.mouse, _mainGameWindow->getDimensions());
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
@@ -1085,9 +1096,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		ObjID child;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
-		int left = event.mouse.x - _inventoryWindows[i]->getDimensions().left;
-		int top = event.mouse.y - _inventoryWindows[i]->getDimensions().top;
-		Common::Rect clickRect(left, top, left + kCursorWidth, top + kCursorHeight);
+		Common::Rect clickRect = calculateClickRect(event.mouse, _inventoryWindows[i]->getDimensions());
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 9d48d63..73c4318 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -258,6 +258,7 @@ private: // Methods
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
 	void selectDraggable(ObjID child, Common::Point pos);
 	void handleDragRelease(Common::Point pos);
+	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 
 };
 
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index e70a821..d880e14 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -192,9 +192,9 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		blank = 2 - (blank >> 1);
 	}
 
-	uint pos = 0;
+	uint16 pos = 0;
 	for (uint y = 0; y < _bitHeight; y++) {
-		uint x = 0;
+		uint16 x = 0;
 		for (; x < _bitWidth >> 3; x++) {
 			byte hi = walkHuff(huff, stream) << 4;
 			data[pos++] = walkHuff(huff, stream) | hi;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index a87da31..8624159 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -537,15 +537,17 @@ uint MacVentureEngine::getPrefixNdx(ObjID obj) {
 }
 
 Common::String MacVentureEngine::getPrefixString(uint flag, ObjID obj) {
-	uint ndx = _world->getObjAttr(obj, kAttrPrefixes); // HACK should check the type of that one
+	uint ndx = getPrefixNdx(obj);
 	ndx = ((ndx) >> flag) & 3;
 	if (ndx) {
-		return (*_decodingNamingArticles->getStrings())[ndx];
+		return _decodingNamingArticles->getString(ndx);
+	} else {
+		return Common::String("missigno ");
 	}
 }
 
 Common::String MacVentureEngine::getNoun(ObjID ndx) {
-	return (*_decodingIndirectArticles->getStrings())[ndx];
+	return _decodingIndirectArticles->getString(ndx);
 }
 
 void MacVentureEngine::highlightExit(ObjID objID) {
@@ -740,11 +742,11 @@ Common::String MacVentureEngine::getCommandsPausedString() const {
 }
 
 Common::String MacVentureEngine::getFilePath(FilePathID id) const {
-	const Common::Array<Common::String> *names = _filenames->getStrings();
+	const Common::Array<Common::String> &names = _filenames->getStrings();
 	if (id <= 3) { // We don't want a file in the subdirectory
-		return Common::String((*names)[id]);
+		return Common::String(names[id]);
 	} else { // We want a game file
-		return Common::String((*names)[3] + "/" + (*names)[id]);
+		return Common::String(names[3] + "/" + names[id]);
 	}
 }
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index c63864d..28c3bf9 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -175,7 +175,7 @@ public:
 
 	void enqueueObject(ObjectQueueID type, ObjID objID, ObjID target = 0);
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
-
+		
 	void runObjQueue();
 	bool printTexts();
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index cca144e..cc9474e 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -84,6 +84,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 		else { fail = resumeFunc(frame); }
 		if (fail) {
 			frame->haltedInFirst = true;
+			_engine->preparedToRun();
 			return true;
 		}
 		doFamily = true;
@@ -101,6 +102,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 			if (fail) { // We are stuck, so we don't shift the frame
 				frame->haltedInFamily = true;
 				frame->familyIdx = i;
+				_engine->preparedToRun();
 				return true;
 			}
 			doFamily = true;
@@ -112,6 +114,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 		frame->haltedInSaves = false;
 		if (resumeFunc(frame)) {
 			frame->haltedInSaves = true;
+			_engine->preparedToRun();
 			return true;
 		}
 	}
@@ -131,6 +134,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 			frame->saves[localHigh].rank = 0;
 			if (loadScript(frame, frame->saves[localHigh].func)) {
 				frame->haltedInSaves = true;
+				_engine->preparedToRun();
 				return true;
 			}
 		}
@@ -352,7 +356,8 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 				opbbFORK(state, frame);
 				break;
 			case 0xbc: //call
-				opbcCALL(state, frame, script);
+				if (opbcCALL(state, frame, script))
+					return true;
 				break;
 			case 0xbd: //focus object
 				opbdFOOB(state, frame);
@@ -907,11 +912,12 @@ void ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 	_frames.push_back(newframe);
 }
 
-void ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
+bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
-	loadScript(frame, id);
+	if (loadScript(frame, id))
+		return true;
 	frame->scripts.pop_front();
 	script = frame->scripts.front();
 	debug(3, "SCRIPT: Return from fuction %d", id);
@@ -987,12 +993,23 @@ void ScriptEngine::opc9WAIT(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
-	for (uint i = 0; i < 6; i++) // Dummy
+	for (uint i = 0; i < 3; i++) // We skip year, month and date
 		state->push(0x00);
-	op00NOOP(0xca);
+
+	uint32 totalPlayTime = _engine->getTotalPlayTime() / 1000; // In seconds
+	word hours = totalPlayTime / 3600;
+	totalPlayTime %= 3600;
+	state->push(hours);
+	word minutes = totalPlayTime / 60;
+	totalPlayTime %= 60;
+	state->push(minutes);
+	state->push(totalPlayTime);
+	debug("Saved time: h[%d] m[%d] s[%d]", hours, minutes, totalPlayTime);
+	
 }
 
 void ScriptEngine::opcbDAY(EngineState * state, EngineFrame * frame) {
+	// Probaby irrelevant, so we push Day [9]
 	state->push(9);
 }
 
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 1a143cf..acbffcd 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -240,7 +240,7 @@ private:
 	void opb9CHI(EngineState *state, EngineFrame *frame);	//cancel high priority
 	void opbaCRAN(EngineState *state, EngineFrame *frame);	//cancel priority range
 	void opbbFORK(EngineState *state, EngineFrame *frame);	//fork
-	void opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script);	//call
+	bool opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script);	//call
 	void opbdFOOB(EngineState *state, EngineFrame *frame);	//focus object
 	void opbeSWOB(EngineState *state, EngineFrame *frame);	//swap objects
 	void opbfSNOB(EngineState *state, EngineFrame *frame);	//snap object
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index 87ec977..ffb9d37 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -52,8 +52,13 @@ public:
 
 	}
 
-	const Common::Array<Common::String> *getStrings() {
-		return &_strings;
+	const Common::Array<Common::String> &getStrings() {
+		return _strings;
+	}
+
+	Common::String getString(uint ndx) {
+		assert(ndx < _strings.size());
+		return _strings[ndx];
 	}
 
 private:
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 02d388a..8e83f91 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -23,8 +23,7 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
 	calculateObjectRelations();
 	
-	warning("Test functions about to happen");
-	_gameText = new Container("Shadowgate II/Shadow Text");	
+	_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());	
 	
 	delete saveGameRes;
 	saveGameFile.close();		


Commit: 680790acaa8dca81e66e21da58d91054f983e8ec
    https://github.com/scummvm/scummvm/commit/680790acaa8dca81e66e21da58d91054f983e8ec
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:41:15+02:00

Commit Message:
MACVENTURE: Add proper capitalization

Changed paths:
    engines/macventure/text.cpp



diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index d3fc956..cf74028 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -203,8 +203,12 @@ Common::String TextAsset::getNoun(ObjID subval) {
 			break;
 		}
 	}
-	if (name.size() && (subval & 4))
-		name.toUppercase(); // HACK, should only capitalize first char?
+	if (name.size() && (subval & 4)) {
+		Common::String tmp = name;
+		name.toUppercase();
+		name.replace(1, name.size() - 1, tmp, 1, tmp.size() - 1);
+	}
+		
 	return name;
 }
 


Commit: 246fec28f55ca646a77985cd7b95a33b2cae994d
    https://github.com/scummvm/scummvm/commit/246fec28f55ca646a77985cd7b95a33b2cae994d
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:41:34+02:00

Commit Message:
MACVENTURE: Fix minor object drawing bug

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index c8f6b3b..7cae246 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -126,7 +126,7 @@ void Gui::draw() {
 	_wm.draw();
 
 	drawDraggedObject();
-		
+
 	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
@@ -649,13 +649,12 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 	if (data.children.size() == 0) return;
 
-	Common::Point forbidden(0, 0);
 	for (uint i = 0; i < data.children.size(); i++) {
 		child = data.children[i].obj;
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
 
-		if (pos != forbidden && child < 600 && child != _draggedObj.id) { // Small HACK until I figre out where the last garbage child in main game window comes from
+		if (child < 600 && child != _draggedObj.id) { // Small HACK until I figre out where the last garbage child in main game window comes from
 			if (!_assets.contains(child)) {
 				_assets[child] = new ImageAsset(child, _graphics);
 			}


Commit: 517aceefcb397ccda476dc7e2b02d6da5595e4fd
    https://github.com/scummvm/scummvm/commit/517aceefcb397ccda476dc7e2b02d6da5595e4fd
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:43:13+02:00

Commit Message:
MACVENTURE: Add scene transition

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 7cae246..15d573b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -110,12 +110,42 @@ Gui::~Gui() {
 	if (_controlData)
 		delete _controlData;
 
+	if (_exitsData)
+		delete _exitsData;
+
 	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
 	for (; it != _assets.end(); it++) {
 		delete it->_value;
 	}
 }
 
+void Gui::initGUI() {
+	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+	_wm.setScreen(&_screen);
+
+	// Menu
+	_menu = _wm.addMenu();
+	if (!loadMenus())
+		error("Could not load menus");
+	_menu->setCommandsCallback(menuCommandsCallback, this);
+	_menu->calcDimensions();
+
+	loadGraphics();
+
+	if (!loadWindows())
+		error("Could not load windows");
+
+	initWindows();
+
+	assignObjReferences();
+
+	if (!loadControls())
+		error("Could not load controls");
+
+	draw();
+
+}
+
 void Gui::draw() {
 
 	// Will be performance-improved after the milestone
@@ -138,15 +168,11 @@ void Gui::drawTitle() {
 	warning("drawTitle hasn't been tested yet");
 }
 
-void Gui::drawExit(ObjID id) {
-	findWindowData(kExitsWindow).children.push_back(DrawableObject(id, kBlitDirect));
-}
-
 void Gui::clearControls() {
 	if (!_controlData)
 		return;
 
-	Common::List<CommandButton>::iterator it = _controlData->begin();
+	Common::Array<CommandButton>::iterator it = _controlData->begin();
 	for (; it != _controlData->end(); ++it) {
 		it->unselect();
 	}
@@ -228,33 +254,6 @@ void Gui::removeChild(WindowReference target, ObjID child) {
 		data.children.remove_at(index);
 }
 
-void Gui::initGUI() {
-	_screen.create(kScreenWidth, kScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
-	_wm.setScreen(&_screen);
-
-	// Menu
-	_menu = _wm.addMenu();
-	if (!loadMenus())
-		error("Could not load menus");
-	_menu->setCommandsCallback(menuCommandsCallback, this);
-	_menu->calcDimensions();
-
-	loadGraphics();
-
-	if (!loadWindows())
-		error("Could not load windows");
-
-	initWindows();
-
-	assignObjReferences();
-
-	if (!loadControls())
-		error("Could not load controls");
-
-	draw();
-
-}
-
 void Gui::initWindows() {
 
 	// Game Controls Window
@@ -282,7 +281,7 @@ void Gui::initWindows() {
 	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
 
 	// Self Window
-	_selfWindow = _wm.addWindow(false, true, true);
+	_selfWindow = _wm.addWindow(false, true, false);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
@@ -290,7 +289,7 @@ void Gui::initWindows() {
 	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
 
 	// Exits Window
-	_exitsWindow = _wm.addWindow(false, true, true);
+	_exitsWindow = _wm.addWindow(false, false, false);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
@@ -475,7 +474,8 @@ bool Gui::loadControls() {
 	Common::SeekableReadStream *res;
 	Common::MacResIDArray::const_iterator iter;
 
-	_controlData = new Common::List<CommandButton>();
+	_controlData = new Common::Array<CommandButton>();
+	_exitsData = new Common::Array<CommandButton>();
 
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('C', 'N', 'T', 'L'))).size() == 0)
 		return false;
@@ -541,7 +541,7 @@ void Gui::drawCommandsWindow() {
 			kColorBlack,
 			Graphics::kTextAlignCenter);
 	} else {
-		Common::List<CommandButton>::const_iterator it = _controlData->begin();
+		Common::Array<CommandButton>::const_iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			CommandButton button = *it;
 			if (button.getData().refcon != kControlExitBox)
@@ -553,22 +553,22 @@ void Gui::drawCommandsWindow() {
 void Gui::drawMainGameWindow() {
 	const WindowData &data = getWindowData(kMainGameWindow);
 	BorderBounds border = borderBounds(data.type);
+	ObjID objRef = data.objRef;
 
 	_mainGameWindow->setDirty(true);
 
-	//if (data.titleLength > 0)
-	//	drawWindowTitle(kMainGameWindow, srf);
-
-	if (!_assets.contains(3)) {
-		_assets[3] = new ImageAsset(3, _graphics);
-	}
+	if (data.objRef > 0 && data.objRef < 2000) {
+		if (!_assets.contains(objRef)) {
+			_assets[objRef] = new ImageAsset(objRef, _graphics);
+		}
 
-	_assets[3]->blitInto(
-		_mainGameWindow->getSurface(),
-		border.leftOffset,
-		border.topOffset,
-		kBlitDirect);
+		_assets[objRef]->blitInto(
+			_mainGameWindow->getSurface(),
+			border.leftOffset,
+			border.topOffset,
+			kBlitDirect);
 
+	}
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
 	findWindow(kMainGameWindow)->setDirty(true);
@@ -603,34 +603,20 @@ void Gui::drawInventories() {
 }
 
 void Gui::drawExitsWindow() {
-	WindowData &data = findWindowData(kExitsWindow);
-	BorderBounds border = borderBounds(data.type);
+
 	Graphics::ManagedSurface *srf = _exitsWindow->getSurface();
+	BorderBounds border = borderBounds(getWindowData(kExitsWindow).type);
+
 	srf->fillRect(Common::Rect(
 		border.leftOffset,
 		border.topOffset,
 		srf->w + border.rightOffset,
 		srf->h + border.bottomOffset), kColorWhite);
 
-	// For each obj in the main window, if it is an exit, we draw it
-	WindowData &objData = findWindowData(kMainGameWindow);
-	Common::Point pos;
-	ObjID child;
-	//BlitMode mode;
-	Common::Rect exit;
-	for (uint i = 0; i < objData.children.size(); i++) {
-		child = objData.children[i].obj;
-		//mode = (BlitMode)objData.children[i].mode;
-		pos = _engine->getObjExitPosition(child);
-		pos.x += border.leftOffset;
-		pos.y += border.topOffset;
-		exit = Common::Rect(pos.x, pos.y, pos.x + kExitButtonWidth, pos.y + kExitButtonHeight);
-		if (_engine->isObjExit(child)) {
-			if (_engine->isObjSelected(child))
-				srf->fillRect(exit, kColorGreen);
-
-			srf->fillRect(exit, kColorGreen);
-		}
+	Common::Array<CommandButton>::const_iterator it = _exitsData->begin();
+	for (; it != _exitsData->end(); ++it) {
+		CommandButton button = *it;
+		button.draw(*_exitsWindow->getSurface());
 	}
 
 	findWindow(kExitsWindow)->setDirty(true);
@@ -719,6 +705,92 @@ void Gui::drawDraggedObject() {
 	}
 }
 
+
+void Gui::updateWindow(WindowReference winID, bool containerOpen) {
+	if (winID == kSelfWindow || containerOpen) {
+		WindowData &data = findWindowData(winID);
+		if (winID == kCommandsWindow) {
+			Common::Array<CommandButton>::iterator it = _controlData->begin();
+			for (; it != _controlData->end(); ++it) {
+				it->unselect();
+			}
+		}
+		Common::Array<DrawableObject> &children = data.children;
+		for (uint i = 0; i < children.size(); i++) {
+			uint flag = 0;
+			ObjID child = children[i].obj;
+			BlitMode mode = kBlitDirect;
+			bool off = !_engine->isObjVisible(child);
+			if (flag || !off || !_engine->isObjClickable(child)) {
+				mode = kBlitBIC;
+				if (off || flag) {
+					mode = kBlitXOR;
+				}
+				else if (_engine->isObjSelected(child)) {
+					mode = kBlitOR;
+				}
+				children[i] = DrawableObject(child, mode);
+			}
+			else {
+				children[i] = DrawableObject(child, kBlitXOR);
+			}
+		}
+		if (winID == kMainGameWindow) {
+			drawMainGameWindow();
+		}
+		else {
+			Graphics::MacWindow *winRef = findWindow(winID);
+			winRef->getSurface()->fillRect(data.bounds, kColorGray);
+		}
+		if (data.type == kZoomDoc && data.updateScroll) {
+			warning("Unimplemented: update scroll");
+		}
+	}
+}
+
+void Gui::unselectExits() {
+	Common::Array<CommandButton>::const_iterator it = _exitsData->begin();
+	for (; it != _exitsData->end(); ++it) {
+		CommandButton button = *it;
+		button.unselect();
+	}
+}
+
+void Gui::updateExit(ObjID obj) {
+	if (!_engine->isObjExit(obj)) return;
+
+	BorderBounds border = borderBounds(getWindowData(kExitsWindow).type);
+
+	int ctl = -1;
+	int i = 0;
+	Common::Array<CommandButton>::const_iterator it = _exitsData->begin();
+	for (;it != _exitsData->end(); it++) {
+		if (it->getData().refcon == obj)
+			ctl = i;
+		else
+			i++;
+	}
+
+	if (ctl != -1)
+		_exitsData->remove_at(ctl);
+
+	if (!_engine->isHiddenExit(obj) &&
+		_engine->getParent(obj) == _engine->getParent(1))
+	{
+		ControlData data;
+		data.titleLength = 0;
+		data.refcon = obj;
+		Common::Point pos = _engine->getObjExitPosition(obj);
+		pos.x = border.leftOffset;
+		pos.y = border.topOffset;
+		data.bounds = Common::Rect(pos.x, pos.y, pos.x + kExitButtonWidth, pos.y + kExitButtonHeight);
+		data.visible = true;
+
+		_exitsData->push_back(CommandButton(data, this));
+	}
+}
+
+
 WindowData & Gui::findWindowData(WindowReference reference) {
 	assert(_windowData);
 
@@ -894,46 +966,6 @@ void menuCommandsCallback(int action, Common::String &text, void *data) {
 	g->handleMenuAction((MenuAction)action);
 }
 
-void Gui::updateWindow(WindowReference winID, bool containerOpen) {
-	if (winID == kNoWindow) return;
-	if (winID == kSelfWindow || containerOpen) {
-		WindowData &data = findWindowData(winID);
-		if (winID == kCommandsWindow) {
-			Common::List<CommandButton>::iterator it = _controlData->begin();
-			for (; it != _controlData->end(); ++it) {
-				it->unselect();
-			}
-		}
-		Common::Array<DrawableObject> &children = data.children;
-		for (uint i = 0; i < children.size(); i++) {
-			uint flag = 0;
-			ObjID child = children[i].obj;
-			BlitMode mode = kBlitDirect;
-			bool off = !_engine->isObjVisible(child);
-			if (flag || !off || !_engine->isObjClickable(child)) {
-				mode = kBlitBIC;
-				if (off || flag) {
-					mode = kBlitXOR;
-				} else if (_engine->isObjSelected(child)) {
-					mode = kBlitOR;
-				}
-				children[i] = DrawableObject(child, mode);
-			} else {
-				children[i] = DrawableObject(child, kBlitXOR);
-			}
-		}
-		if (winID == kMainGameWindow) {
-			drawMainGameWindow();
-		}
-		else {
-			Graphics::MacWindow *winRef = findWindow(winID);
-			winRef->getSurface()->fillRect(data.bounds, kColorGray);
-		}
-		if (data.type == kZoomDoc && data.updateScroll) {
-			warning("Unimplemented: update scroll");
-		}
-	}
-}
 
 void Gui::invertWindowColors(WindowReference winID) {
 	Graphics::ManagedSurface *srf = findWindow(winID)->getSurface();
@@ -1006,7 +1038,7 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		if (!_controlData)
 			return false;
 
-		Common::List<CommandButton>::iterator it = _controlData->begin();
+		Common::Array<CommandButton>::iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			if (it->isInsideBounds(position)) {
 				it->select();
@@ -1064,8 +1096,32 @@ bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event
 }
 
 bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & event) {
-	if (_engine->needsClickToContinue())
-		return true;
+	if (event.type == Common::EVENT_LBUTTONUP) {
+		if (_engine->needsClickToContinue()) {
+			return true;
+		}
+
+		Common::Point position(
+			event.mouse.x - _exitsWindow->getDimensions().left,
+			event.mouse.y - _exitsWindow->getDimensions().top);
+
+		CommandButton data;
+		if (!_exitsData)
+			return false;
+
+		Common::Array<CommandButton>::iterator it = _exitsData->begin();
+		for (; it != _exitsData->end(); ++it) {
+			if (it->isInsideBounds(position)) {
+				it->select();
+				data = *it;
+			}
+			else {
+				it->unselect();
+			}
+		}
+
+		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, event);
+	}
 	return getWindowData(kExitsWindow).visible;
 }
 
@@ -1118,7 +1174,7 @@ BorderBounds Gui::borderBounds(MVWindowType type) {
 	case MacVenture::kPlainDBox:
 		return BorderBounds(6, 6, 6, 6);
 	case MacVenture::kAltBox:
-		//return BorderBounds(8, 9, 11, 10); // For now, I'll stick to the original bmp, it's gorgeous
+		return BorderBounds(8, 9, 11, 10); // For now, I'll stick to the original bmp, it's gorgeous
 		break;
 	case MacVenture::kNoGrowDoc:
 		return BorderBounds(1, 17, 1, 1);
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 73c4318..dd08173 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -129,7 +129,7 @@ struct ControlData {
 	uint16 scrollMax;
 	uint16 scrollMin;
 	uint16 cdef;
-	uint32 refcon;
+	uint32 refcon; // If exits window, then the obj id. Otherwise, the control type
 	uint8 titleLength;
 	char* title;
 	uint16 border;
@@ -159,7 +159,7 @@ public:
 	void draw();
 	void drawMenu();
 	void drawTitle();
-	void drawExit(ObjID id);
+
 	void clearControls();
 	bool processEvent(Common::Event &event);
 	void handleMenuAction(MenuAction action);
@@ -195,6 +195,9 @@ public:
 	void addChild(WindowReference target, ObjID child);
 	void removeChild(WindowReference target, ObjID child);
 
+	void unselectExits();
+	void updateExit(ObjID id);
+
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
 
@@ -207,7 +210,8 @@ private: // Attributes
 	Graphics::MacWindowManager _wm;
 
 	Common::List<WindowData> *_windowData;
-	Common::List<CommandButton> *_controlData;
+	Common::Array<CommandButton> *_controlData;
+	Common::Array<CommandButton> *_exitsData;
 
 	Graphics::MacWindow *_controlsWindow;
 	Graphics::MacWindow *_mainGameWindow;
@@ -290,16 +294,18 @@ public:
 		surface.fillRect(_data.bounds, colorFill);
 		surface.frameRect(_data.bounds, kColorBlack);
 
-		const Graphics::Font &font = _gui->getCurrentFont();
-		Common::String title(_data.title);
-		font.drawString(
-			&surface,
-			title,
-			_data.bounds.left,
-			_data.bounds.top,
-			_data.bounds.right - _data.bounds.left,
-			colorText,
-			Graphics::kTextAlignCenter);
+		if (_data.titleLength > 0) {
+			const Graphics::Font &font = _gui->getCurrentFont();
+			Common::String title(_data.title);
+			font.drawString(
+				&surface,
+				title,
+				_data.bounds.left,
+				_data.bounds.top,
+				_data.bounds.right - _data.bounds.left,
+				colorText,
+				Graphics::kTextAlignCenter);
+		}
 	}
 
 	bool isInsideBounds(const Common::Point point) const {
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index d880e14..1aae172 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -77,7 +77,13 @@ ImageAsset::~ImageAsset() {
 void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 	ObjID realID = id;
 	uint32 size = _container->getItemByteSize(id);
-	if (size == 2 || size == 0) {
+	if (size < 2) {
+		_rowBytes = 0;
+		_bitHeight = 0;
+		_bitHeight = 0;
+		return;
+	}
+	if (size == 2) {
 		realID = _container->getItem(id)->readUint16BE();
 	}
 	Common::BitStream32BEMSB stream(_container->getItem(realID), true);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 8624159..08b5ec9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -174,7 +174,7 @@ void MacVentureEngine::requestUnpause() {
 
 void MacVentureEngine::selectControl(ControlReference id) {
 	ControlAction action = referenceToAction(id);
-	debug(4, "Select control %x", action);
+	debug(2, "Select control %x", action);
 	_selectedControl = action;
 }
 
@@ -190,7 +190,7 @@ void MacVentureEngine::activateCommand(ControlReference id) {
 			_activeControl = kNoCommand;
 		_activeControl = action;
 	}
-	debug(4, "Activating Command %x... Command %x is active", action, _activeControl);
+	debug(2, "Activating Command %x... Command %x is active", action, _activeControl);
 	refreshReady();
 }
 
@@ -520,6 +520,17 @@ void MacVentureEngine::unselectObject(ObjID objID) {
 	}
 }
 
+
+void MacVentureEngine::updateExits() {
+	// exitWin.killControls();
+	_gui->unselectExits();	
+
+	Common::Array<ObjID> exits = _world->getChildren(_world->getObjAttr(1, kAttrParentObject), true);
+	for (uint i = 0; i < exits.size(); i++)
+		_gui->updateExit(exits[i]);
+
+}
+
 int MacVentureEngine::findObjectInArray(ObjID objID, const Common::Array<ObjID> &list) {
 	// Find the object in the current selection
 	bool found = false;
@@ -542,7 +553,7 @@ Common::String MacVentureEngine::getPrefixString(uint flag, ObjID obj) {
 	if (ndx) {
 		return _decodingNamingArticles->getString(ndx);
 	} else {
-		return Common::String("missigno ");
+		return Common::String("m1551gn0 ");
 	}
 }
 
@@ -551,7 +562,20 @@ Common::String MacVentureEngine::getNoun(ObjID ndx) {
 }
 
 void MacVentureEngine::highlightExit(ObjID objID) {
-	warning("highlightExit: unimplemented");
+	//ObjID ctl = _gui->getWinChild(obj);
+	/*if (ctl) {
+		if (findObjectInArray(obj, _selectedObjs) != -1)
+			_gui->selectExit(ctl);
+		else
+			_gui->unselectExit(ctl);
+	}
+	if (obj == _world->getObjAttr(1, kAttrParentObject)) {
+		if (findObjectInArray(obj, _selectedObjs) != -1)
+			_gui->selectExit(obj);
+		else
+			_gui->unselectExit(obj);
+	}*/
+	//updateWindow(findParentWindow(obj));
 }
 
 void MacVentureEngine::selectPrimaryObject(ObjID objID) {
@@ -587,7 +611,7 @@ void MacVentureEngine::openObject(ObjID objID) {
 	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
 		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
-		//_gui->drawExits();
+		updateExits();
 		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID, objID, objID)); // it ignores source and target in the original
 	} else { // Open inventory window
 		Common::Point p(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
@@ -649,7 +673,7 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 			old.hidden != _world->getObjAttr(id, kAttrHiddenExit) ||
 			old.exitx != _world->getObjAttr(id, kAttrExitX) ||
 			old.exity != _world->getObjAttr(id, kAttrExitY))
-			_gui->drawExit(id);
+			_gui->updateExit(id);
 	}
 	WindowReference win = getObjWindow(id);
 	ObjID cur = id;
@@ -787,12 +811,20 @@ bool MacVentureEngine::isObjExit(ObjID objID) {
 	return _world->getObjAttr(objID, kAttrIsExit);
 }
 
+bool MacVentureEngine::isHiddenExit(ObjID objID) {
+	return _world->getObjAttr(objID, kAttrHiddenExit);
+}
+
 Common::Point MacVentureEngine::getObjExitPosition(ObjID objID) {
 	uint x = _world->getObjAttr(objID, kAttrExitX);
 	uint y = _world->getObjAttr(objID, kAttrExitY);
 	return Common::Point(x, y);
 }
 
+ObjID MacVentureEngine::getParent(ObjID objID) {
+	return _world->getObjAttr(objID, kAttrParentObject);
+}
+
 Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 	Common::Point pos = getObjPosition(objID);
 	uint w = _gui->getObjWidth(objID); // This shouldn't go here
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 28c3bf9..9ecfbc0 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -205,7 +205,10 @@ public:
 	bool isObjClickable(ObjID objID);
 	bool isObjSelected(ObjID objID);
 	bool isObjExit(ObjID objID);
+	bool isHiddenExit(ObjID objID);
 	Common::Point getObjExitPosition(ObjID objID);
+	ObjID getParent(ObjID objID);
+
 
 	// Encapsulation HACK
 	Common::Rect getObjBounds(ObjID objID);
@@ -232,7 +235,7 @@ private:
 	void unselectObject(ObjID objID);
 	void highlightExit(ObjID objID);
 	void selectPrimaryObject(ObjID objID);
-
+	void updateExits();
 
 	// Object queue methods
 	void focusObjectWindow(ObjID objID);
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 8e83f91..670f399 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -43,17 +43,23 @@ World::~World()	{
 uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	uint32 res;
 	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
+	// HACK, but if I try to initialize it in the else clause, it goes out of scope and segfaults
+	Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);
 	if (!(index & 0x80)) { // It's not a constant
 		res = _saveGame->getAttr(objID, index);
 	} else {
-		Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);
 		index &= 0x7F;
-		objStream->skip((index * 2) - 1);
-		res = objStream->readUint16BE();
+		if (objStream->size() == 0) return 0;
+		// Look for the right attribute inside the object
+		objStream->skip(index * 2);
+		res = objStream->readByte() << 8;
+		res |= objStream->readByte();
 	}
 	res &= _engine->getGlobalSettings().attrMasks[attrID];
 	res >>= _engine->getGlobalSettings().attrShifts[attrID];
-	debug(11, "Attribute %x from object %x is %x", attrID, objID, res);
+	if (res & 0x8000)
+		res = -((res ^ 0xffff) + 1);
+	debug(3, "Attribute %x from object %x is %x", attrID, objID, res);
 	return res;
 }
 


Commit: 03a9ad4899f19de262a9eed6c9c50219ba44d466
    https://github.com/scummvm/scummvm/commit/03a9ad4899f19de262a9eed6c9c50219ba44d466
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:43:14+02:00

Commit Message:
MACVENTURE: Fix game detection

Changed paths:
    engines/macventure/detection_tables.h
    engines/macventure/gui.cpp



diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index 08093da..e2e9426 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -22,12 +22,12 @@
 
 namespace MacVenture {
 
-#define ADGF_DEFAULT (ADGF_DROPLANGUAGE|ADGF_DROPPLATFORM)
+#define ADGF_DEFAULT (ADGF_DROPLANGUAGE|ADGF_DROPPLATFORM|ADGF_MACRESFORK)
 
 #define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
 
 static const ADGameDescription gameDescriptions[] = {
-	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "dea09e16829b99278feb84c121066576", 70528), // Zojoi Rerelease
+	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 15d573b..3d38be5 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1174,7 +1174,7 @@ BorderBounds Gui::borderBounds(MVWindowType type) {
 	case MacVenture::kPlainDBox:
 		return BorderBounds(6, 6, 6, 6);
 	case MacVenture::kAltBox:
-		return BorderBounds(8, 9, 11, 10); // For now, I'll stick to the original bmp, it's gorgeous
+		return BorderBounds(8, 9, 11, 10);
 		break;
 	case MacVenture::kNoGrowDoc:
 		return BorderBounds(1, 17, 1, 1);


Commit: 9403ef720a40ce47688b1957d1a64bc91c87df0a
    https://github.com/scummvm/scummvm/commit/9403ef720a40ce47688b1957d1a64bc91c87df0a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:43:51+02:00

Commit Message:
MACVENTURE: Fix clicks and dragging offset

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 3d38be5..8f8acda 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -639,6 +639,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		child = data.children[i].obj;
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
+		pos += Common::Point(border.leftOffset, border.topOffset);
 
 		if (child < 600 && child != _draggedObj.id) { // Small HACK until I figre out where the last garbage child in main game window comes from
 			if (!_assets.contains(child)) {
@@ -647,16 +648,20 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 			_assets[child]->blitInto(
 				surface,
-				border.leftOffset + pos.x,
-				border.topOffset + pos.y,
+				pos.x,
+				pos.y,
 				mode);
 
 			if (_engine->isObjSelected(child))
 				_assets[child]->blitInto(
-					surface,
-					border.leftOffset + pos.x,
-					border.topOffset + pos.y,
-					kBlitOR);
+					surface, pos.x, pos.y, kBlitOR);
+
+			// For test
+			surface->frameRect(Common::Rect(
+				pos.x,
+				pos.y,
+				pos.x + _assets[child]->getWidth(),
+				pos.y + _assets[child]->getHeight()), kColorGreen);
 		}
 
 	}
@@ -791,6 +796,12 @@ void Gui::updateExit(ObjID obj) {
 }
 
 
+Common::Point Gui::getWindowSurfacePos(WindowReference reference) {
+	const WindowData &data = getWindowData(reference);
+	BorderBounds border = borderBounds(data.type);
+	return Common::Point(data.bounds.left + border.leftOffset, data.bounds.top + border.topOffset);
+}
+
 WindowData & Gui::findWindowData(WindowReference reference) {
 	assert(_windowData);
 
@@ -830,8 +841,9 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	if (_assets.contains(obj) &&
-		_engine->isObjClickable(obj) &&
-		_engine->isObjVisible(obj)) {
+		//_engine->isObjClickable(obj) &&
+		_engine->isObjVisible(obj))
+	{
 		Common::Rect bounds = _engine->getObjBounds(obj);
 		Common::Rect intersection = bounds.findIntersectingRect(target);
 		// We translate it to the image's coord system
@@ -849,16 +861,20 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	return false;
 }
 
-void Gui::selectDraggable(ObjID child, Common::Point pos) {
+void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point startPos) {
 	if (_engine->isObjClickable(child)) {
 		_draggedObj.id = child;
-		_draggedObj.pos = pos;
+		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
+		_draggedObj.pos = startPos + _draggedObj.mouseOffset;
 	}
 }
 
 void Gui::handleDragRelease(Common::Point pos) {
 	_draggedObj.id = 0;
 	_engine->updateDelta(pos);
+	_engine->selectControl(kControlOperate);
+	_engine->activateCommand(kControlOperate);
+	_engine->refreshReady();
 	_engine->preparedToRun();
 }
 
@@ -1002,7 +1018,7 @@ bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
-			_draggedObj.pos = event.mouse;
+			_draggedObj.pos = event.mouse + _draggedObj.mouseOffset;
 		}
 		processed = true;
 
@@ -1071,8 +1087,8 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
-				selectDraggable(child, event.mouse);
-				_engine->handleObjectSelect(child, kMainGameWindow, event);
+				selectDraggable(child, kMainGameWindow, event.mouse);
+				_engine->handleObjectSelect(child, kMainGameWindow, event, false);
 			}
 		}
 	}
@@ -1090,7 +1106,7 @@ bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event
 		return true;
 
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		_engine->handleObjectSelect(1, kSelfWindow, event);
+		_engine->handleObjectSelect(1, kSelfWindow, event, false);
 	}
 	return true;
 }
@@ -1120,7 +1136,7 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 			}
 		}
 
-		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, event);
+		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, event, false);
 	}
 	return getWindowData(kExitsWindow).visible;
 }
@@ -1155,8 +1171,8 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			if (isRectInsideObject(clickRect, child)) {
-				selectDraggable(child, event.mouse);
-				_engine->handleObjectSelect(child, (WindowReference)ref, event);
+				selectDraggable(child, data.refcon, event.mouse);
+				_engine->handleObjectSelect(child, (WindowReference)ref, event, false);
 			}
 		}
 	}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index dd08173..d71ee66 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -147,6 +147,8 @@ struct BorderBounds {
 struct DraggedObj {
 	ObjID id;
 	Common::Point pos;
+	Common::Point mouseOffset;
+	bool hasMoved;
 };
 
 
@@ -255,12 +257,13 @@ private: // Methods
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 
 	// Finders
+	Common::Point getWindowSurfacePos(WindowReference reference);
 	WindowData& findWindowData(WindowReference reference);
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
 	// Utils
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
-	void selectDraggable(ObjID child, Common::Point pos);
+	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
 	void handleDragRelease(Common::Point pos);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 08b5ec9..b26250a 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -280,7 +280,7 @@ bool MacVentureEngine::printTexts() {
 	return false;
 }
 
-void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Common::Event event) {
+void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Common::Event event, bool isDoubleClick) {
 	if (win == kExitsWindow) {
 		win = kMainGameWindow;
 	}
@@ -826,7 +826,10 @@ ObjID MacVentureEngine::getParent(ObjID objID) {
 }
 
 Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
+	BorderBounds bounds = _gui->borderBounds(_gui->getWindowData(findParentWindow(objID)).type); // HACK
 	Common::Point pos = getObjPosition(objID);
+	pos.x += bounds.leftOffset;
+	pos.y += bounds.topOffset;
 	uint w = _gui->getObjWidth(objID); // This shouldn't go here
 	uint h = _gui->getObjHeight(objID);
 	return Common::Rect(pos.x, pos.y, pos.x + w, pos.y + h);
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 9ecfbc0..cdf9a94 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -179,7 +179,7 @@ public:
 	void runObjQueue();
 	bool printTexts();
 
-	void handleObjectSelect(ObjID objID, WindowReference win, Common::Event event);
+	void handleObjectSelect(ObjID objID, WindowReference win, Common::Event event, bool isDoubleClick);
 	void updateDelta(Common::Point newPos);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 670f399..15e3c2a 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -59,7 +59,7 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	res >>= _engine->getGlobalSettings().attrShifts[attrID];
 	if (res & 0x8000)
 		res = -((res ^ 0xffff) + 1);
-	debug(3, "Attribute %x from object %x is %x", attrID, objID, res);
+	debug(6, "Attribute %x from object %x is %x", attrID, objID, res);
 	return res;
 }
 


Commit: a6e1202a0c95c8124536504cf1dee81970ae74bb
    https://github.com/scummvm/scummvm/commit/a6e1202a0c95c8124536504cf1dee81970ae74bb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:44:37+02:00

Commit Message:
MACVENTURE: Fix object selection fallthrough

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 8f8acda..f07b914 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -641,7 +641,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		pos = _engine->getObjPosition(child);
 		pos += Common::Point(border.leftOffset, border.topOffset);
 
-		if (child < 600 && child != _draggedObj.id) { // Small HACK until I figre out where the last garbage child in main game window comes from
+		if (child < 600) { // Small HACK until I figre out where the last garbage child in main game window comes from
 			if (!_assets.contains(child)) {
 				_assets[child] = new ImageAsset(child, _graphics);
 			}
@@ -654,7 +654,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 			if (_engine->isObjSelected(child))
 				_assets[child]->blitInto(
-					surface, pos.x, pos.y, kBlitOR);
+					surface, pos.x, pos.y, kBlitXOR);
 
 			// For test
 			surface->frameRect(Common::Rect(
@@ -697,7 +697,7 @@ void Gui::drawDraggedObject() {
 		_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
 			Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
 
-		asset->blitInto(&_draggedSurface, 0, 0, kBlitOR);
+		asset->blitInto(&_draggedSurface, 0, 0, kBlitBIC);
 
 		g_system->copyRectToScreen(
 			_draggedSurface.getPixels(),
@@ -839,6 +839,16 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	return nullptr;
 }
 
+void Gui::checkSelect(ObjID obj, const Common::Event &event, const Common::Rect & clickRect, WindowReference ref) {
+	if (_engine->isObjVisible(obj) &&
+		_engine->isObjClickable(obj) &&
+		isRectInsideObject(clickRect, obj))
+	{
+		selectDraggable(obj, ref, event.mouse);
+		_engine->handleObjectSelect(obj, (WindowReference)ref, event, false);
+	}
+}
+
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	if (_assets.contains(obj) &&
 		//_engine->isObjClickable(obj) &&
@@ -1086,10 +1096,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		Common::Rect clickRect = calculateClickRect(event.mouse, _mainGameWindow->getDimensions());
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			if (isRectInsideObject(clickRect, child)) {
-				selectDraggable(child, kMainGameWindow, event.mouse);
-				_engine->handleObjectSelect(child, kMainGameWindow, event, false);
-			}
+			checkSelect(child, event, clickRect, kMainGameWindow);
 		}
 	}
 	return false;
@@ -1170,10 +1177,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		Common::Rect clickRect = calculateClickRect(event.mouse, _inventoryWindows[i]->getDimensions());
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
-			if (isRectInsideObject(clickRect, child)) {
-				selectDraggable(child, data.refcon, event.mouse);
-				_engine->handleObjectSelect(child, (WindowReference)ref, event, false);
-			}
+			checkSelect(child, event, clickRect, (WindowReference)ref);
 		}
 	}
 	return true;
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index d71ee66..f93e8db 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -262,6 +262,7 @@ private: // Methods
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
 	// Utils
+	void checkSelect(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
 	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
 	void handleDragRelease(Common::Point pos);
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index cc9474e..cbc47a9 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -794,8 +794,8 @@ void ScriptEngine::opabLTS(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opacEQ(EngineState * state, EngineFrame * frame) {
-	word b = neg16(state->pop());
-	word a = neg16(state->pop());
+	word b = state->pop();
+	word a = state->pop();
 	state->push((a == b) ? 0xFFFF : 0);
 }
 


Commit: 541702206889519515f20c42dd10aaba70630db1
    https://github.com/scummvm/scummvm/commit/541702206889519515f20c42dd10aaba70630db1
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:45:01+02:00

Commit Message:
MACVENTURE: Add double click support

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f07b914..dc0c4af 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -26,7 +26,7 @@
 #include "macventure/macventure.h"
 #include "macventure/gui.h"
 
-// For the dragged object
+#include "common/timer.h"
 #include "common/system.h"
 
 namespace MacVenture {
@@ -81,6 +81,12 @@ static const Graphics::MenuData menuSubItems[] = {
 	{ 0,				NULL,				0, 0, false }
 };
 
+
+static void cursorTimerHandler(void *refCon) {
+	Gui *gui = (Gui *)refCon;
+	gui->processCursorTick();
+}
+
 bool commandsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool mainGameWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
@@ -99,6 +105,9 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_draggedObj.id = 0;
 	_draggedObj.pos = Common::Point(0, 0);
 
+	_cursor = new Cursor(this);
+	g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 1000000, this, "macVentureCursor");
+
 	initGUI();
 }
 
@@ -113,6 +122,9 @@ Gui::~Gui() {
 	if (_exitsData)
 		delete _exitsData;
 
+	if (_cursor)
+		delete _cursor;
+
 	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
 	for (; it != _assets.end(); it++) {
 		delete it->_value;
@@ -654,7 +666,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 			if (_engine->isObjSelected(child))
 				_assets[child]->blitInto(
-					surface, pos.x, pos.y, kBlitXOR);
+					surface, pos.x, pos.y, kBlitOR);
 
 			// For test
 			surface->frameRect(Common::Rect(
@@ -796,6 +808,16 @@ void Gui::updateExit(ObjID obj) {
 }
 
 
+WindowReference Gui::findWindowAtPoint(Common::Point point) {
+	Common::List<WindowData>::iterator it;
+	for (it = _windowData->begin(); it != _windowData->end(); it++) {
+		if (it->bounds.contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
+			return it->refcon;
+		}
+	}
+	return kNoWindow;
+}
+
 Common::Point Gui::getWindowSurfacePos(WindowReference reference) {
 	const WindowData &data = getWindowData(reference);
 	BorderBounds border = borderBounds(data.type);
@@ -845,7 +867,6 @@ void Gui::checkSelect(ObjID obj, const Common::Event &event, const Common::Rect
 		isRectInsideObject(clickRect, obj))
 	{
 		selectDraggable(obj, ref, event.mouse);
-		_engine->handleObjectSelect(obj, (WindowReference)ref, event, false);
 	}
 }
 
@@ -873,19 +894,22 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 
 void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point startPos) {
 	if (_engine->isObjClickable(child)) {
+		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
 		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
 		_draggedObj.pos = startPos + _draggedObj.mouseOffset;
 	}
 }
 
-void Gui::handleDragRelease(Common::Point pos) {
+void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
+	WindowReference destinationWindow = findWindowAtPoint(pos);
+	if (_draggedObj.hasMoved) {
+		ObjID destObject = getWindowData(destinationWindow).objRef;
+		_engine->handleObjectDrop(_draggedObj.id, pos, destObject); //change pos to validate
+	} else {
+		_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
+	}
 	_draggedObj.id = 0;
-	_engine->updateDelta(pos);
-	_engine->selectControl(kControlOperate);
-	_engine->activateCommand(kControlOperate);
-	_engine->refreshReady();
-	_engine->preparedToRun();
 }
 
 Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect windowBounds) {
@@ -1026,9 +1050,13 @@ uint Gui::getObjHeight(ObjID obj) {
 
 bool Gui::processEvent(Common::Event &event) {
 	bool processed = false;
+
+	processed |= _cursor->processEvent(event);
+
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
 			_draggedObj.pos = event.mouse + _draggedObj.mouseOffset;
+			_draggedObj.hasMoved = true;
 		}
 		processed = true;
 
@@ -1038,12 +1066,6 @@ bool Gui::processEvent(Common::Event &event) {
 		g_system->copyRectToScreen(_screen.getPixels(), _screen.pitch, 0, 0, _screen.w, _screen.h);
 		g_system->updateScreen();
 	}
-	else if (event.type == Common::EVENT_LBUTTONUP) {
-		if (_draggedObj.id != 0) {
-			handleDragRelease(event.mouse);
-		}
-		processed = true;
-	}
 
 	processed |= _wm.processEvent(event);
 	return (processed);
@@ -1113,7 +1135,7 @@ bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event
 		return true;
 
 	if (event.type == Common::EVENT_LBUTTONUP) {
-		_engine->handleObjectSelect(1, kSelfWindow, event, false);
+		_engine->handleObjectSelect(1, kSelfWindow, false, false);
 	}
 	return true;
 }
@@ -1143,7 +1165,7 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 			}
 		}
 
-		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, event, false);
+		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, false, false);
 	}
 	return getWindowData(kExitsWindow).visible;
 }
@@ -1183,6 +1205,26 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	return true;
 }
 
+void Gui::processCursorTick() {
+	_cursor->tick();
+
+
+
+
+
+	handleDragRelease(_draggedObj.pos, false, true);
+
+}
+
+void Gui::handleSingleClick(Common::Point pos) {
+	//handleDragRelease(_draggedObj.pos, false, false);
+	debug("Single Click");
+}
+
+void Gui::handleDoubleClick(Common::Point pos) {
+	debug("Double Click");
+}
+
 /* Ugly switches */
 
 BorderBounds Gui::borderBounds(MVWindowType type) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index f93e8db..75bb1e6 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -39,6 +39,7 @@ using namespace Graphics::MacWindowConstants;
 class MacVentureEngine;
 typedef uint32 ObjID;
 
+class Cursor;
 class CommandButton;
 class ImageAsset;
 
@@ -151,6 +152,14 @@ struct DraggedObj {
 	bool hasMoved;
 };
 
+enum CursorState {
+	// HACK, I should define a proper FSM for this
+	kCursorIdle,
+	kCursorSingleClick, // Triggered when mouse goes up
+	kCursorSingleClickAwait, // Triggered when we are in single click and mouse goes down
+	kCursorSingleClickTrap, // Trap state, for when we are in await, and the timer goes off
+	kCursorDoubleClick
+};
 
 class Gui {
 
@@ -183,12 +192,18 @@ public:
 	bool processDiplomaEvents(WindowClick click, Common::Event &event);
 	bool processInventoryEvents(WindowClick click, Common::Event &event);
 
+	void processCursorTick();
+
 	//bool processClickObject(ObjID obj, WindowReference win, Common::Event event, bool canDrag);
 
 	const WindowData& getWindowData(WindowReference reference);
 
 	const Graphics::Font& getCurrentFont();
 
+	// Clicks
+	void handleSingleClick(Common::Point pos);
+	void handleDoubleClick(Common::Point pos);
+
 	// Modifiers
 	void bringToFront(WindowReference window);
 	void setWindowTitle(WindowReference winID, Common::String string);
@@ -230,6 +245,8 @@ private: // Attributes
 	Graphics::ManagedSurface _draggedSurface;
 	DraggedObj _draggedObj;
 
+	Cursor *_cursor;
+
 private: // Methods
 
 	// Initializers
@@ -257,6 +274,7 @@ private: // Methods
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 
 	// Finders
+	WindowReference findWindowAtPoint(Common::Point point);
 	Common::Point getWindowSurfacePos(WindowReference reference);
 	WindowData& findWindowData(WindowReference reference);
 	Graphics::MacWindow *findWindow(WindowReference reference);
@@ -265,11 +283,101 @@ private: // Methods
 	void checkSelect(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
 	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
-	void handleDragRelease(Common::Point pos);
+	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 
 };
 
+class Cursor {
+enum ClickState {
+	kCursorIdle = 0,
+	kCursorSC = 1,
+	kCursorNoTick = 2,
+	kCursorSCTrans = 3,
+	kCursorExecSC = 4,
+	kCursorExecDC = 5,
+	kCursorStateCount
+};
+
+enum CursorInput { // Columns for the FSM transition table
+	kTickCol = 0,
+	kButtonDownCol = 1,
+	kButtonUpCol = 2,
+	kCursorInputCount
+};
+
+
+ClickState _transitionTable[kCursorStateCount][kCursorInputCount] = {
+	/* kCursorIdle */	{kCursorIdle,	kCursorIdle,	kCursorSC		},
+	/* kCursorSC */		{kCursorExecSC,	kCursorSCTrans,	kCursorExecDC	},
+	/* IgnoreTick */	{kCursorNoTick, kCursorNoTick,	kCursorExecSC	},
+	/* SC Transition */	{kCursorNoTick,	kCursorNoTick,	kCursorExecDC	},
+	/* Exec SC */		{kCursorIdle,	kCursorExecSC,	kCursorExecSC	},	// Trap state
+	/* Exec DC */		{kCursorIdle,	kCursorExecDC,	kCursorExecDC	}	// Trap state
+};
+
+public:
+	Cursor(Gui *gui) {
+		_gui = gui;
+		_state = kCursorIdle;
+	}
+
+	~Cursor() {}
+
+	void tick() {
+		executeState();
+		changeState(kTickCol);
+	}
+
+	bool processEvent(const Common::Event &event) {
+		executeState();
+
+		if (event.type == Common::EVENT_MOUSEMOVE) {
+			_pos = event.mouse;
+			return true;
+		}
+		if (event.type == Common::EVENT_LBUTTONDOWN) {
+			changeState(kButtonDownCol);
+			return true;
+		}
+		if (event.type == Common::EVENT_LBUTTONUP) {
+			changeState(kButtonUpCol);
+			return true;
+		}
+
+		return false;
+	}
+
+	Common::Point getPos() {
+		return _pos;
+	}
+
+private:
+
+	void changeState(CursorInput input) {
+		debug("Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
+		_state = _transitionTable[_state][input];
+	}
+
+	void executeState() {
+		if (_state == kCursorExecSC) {
+			_gui->handleSingleClick(_pos);
+			changeState(kTickCol);
+		} else if (_state == kCursorExecDC) {
+			_gui->handleDoubleClick(_pos);
+			changeState(kTickCol);
+		}
+	}
+
+
+private:
+	Gui *_gui;
+
+	Common::Point _pos;
+	ClickState _state;
+
+};
+
 class CommandButton {
 
 enum {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b26250a..1578c57 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -280,7 +280,7 @@ bool MacVentureEngine::printTexts() {
 	return false;
 }
 
-void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Common::Event event, bool isDoubleClick) {
+void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick) {
 	if (win == kExitsWindow) {
 		win = kMainGameWindow;
 	}
@@ -289,7 +289,7 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Comm
 
 	const WindowData &windata = _gui->getWindowData(win);
 
-	if (event.kbd.flags & Common::KBD_SHIFT) {
+	if (shiftPressed) {
 		// Do shift ;)
 	} else {
 		if (_selectedControl && _currentSelection.size() > 0 && getInvolvedObjects() > 1) {
@@ -311,25 +311,47 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, Comm
 			if (objID > 0) {
 				int i = findObjectInArray(objID, _currentSelection);
 
-				/*if (event.type == Common::EVENT  isDoubleClick(event)) { // no double click for now
-					if (!found)
-						unSelectAll();
-					selectObj(obj);
-					doubleClickObject(obj, win, event, canDrag);
-				} else {*/
-				if (i >= 0)
-					unselectAll();
-				selectObject(objID);
-				if (getInvolvedObjects() == 1)
-					_cmdReady = true;
-				preparedToRun();
-				//singleClickObject(objID, win, event, canDrag);
-				//}
+				if (isDoubleClick) { // no double click for now
+					if (i >= 0)
+						unselectAll();
+					selectObject(objID);
+					if (!_cmdReady)
+					{
+						selectPrimaryObject(objID);
+						if (_selectedControl == kNoCommand)	{
+							_selectedControl = kActivateObject;							
+							if (_activeControl)
+								_activeControl = kNoCommand;
+							_activeControl = kActivateObject;							
+							_cmdReady = true;
+						}
+					}
+					preparedToRun();
+					//doubleClickObject(objID, win, event, canDrag);
+					debug("Double click");
+				} else {
+					if (i >= 0)
+						unselectAll();
+					selectObject(objID);
+					if (getInvolvedObjects() == 1)
+						_cmdReady = true;
+					preparedToRun();
+					//singleClickObject(objID, win, event, canDrag);
+				}
 			}
 		}
 	}
 }
 
+void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent) {
+	_destObject = newParent;
+	updateDelta(delta);
+	selectControl(kControlOperate);
+	activateCommand(kControlOperate);
+	refreshReady();
+	preparedToRun();
+}
+
 void MacVentureEngine::updateDelta(Common::Point newPos) {
 	Common::Point newDelta = newPos - _deltaPoint;
 	debug(4, "Update delta: Old(%d, %d), New(%d, %d)",
@@ -508,6 +530,7 @@ void MacVentureEngine::selectObject(ObjID objID) {
 		_selectedObjs.push_back(objID);
 		highlightExit(objID);
 	}
+	_deltaPoint = getObjPosition(objID);
 }
 
 void MacVentureEngine::unselectObject(ObjID objID) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index cdf9a94..ad13d12 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -179,7 +179,8 @@ public:
 	void runObjQueue();
 	bool printTexts();
 
-	void handleObjectSelect(ObjID objID, WindowReference win, Common::Event event, bool isDoubleClick);
+	void handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick);
+	void handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent);
 	void updateDelta(Common::Point newPos);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);


Commit: 46a85f02d6086bb14a6635a6af77ba85520a7e39
    https://github.com/scummvm/scummvm/commit/46a85f02d6086bb14a6635a6af77ba85520a7e39
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:46:11+02:00

Commit Message:
MACVENTURE: Add initial text rendering

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index dc0c4af..7ad5eb0 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -51,6 +51,14 @@ enum {
 	kMenuSpecial = 3
 };
 
+enum {
+	kCommandNum = 8
+};
+
+enum {
+	kDragThreshold = 5
+};
+
 static const Graphics::MenuData menuSubItems[] = {
 	{ kMenuHighLevel,	"File",				0, 0, false },
 	{ kMenuHighLevel,	"Edit",				0, 0, false },
@@ -106,7 +114,9 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_draggedObj.pos = Common::Point(0, 0);
 
 	_cursor = new Cursor(this);
-	g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 1000000, this, "macVentureCursor");
+	g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 500000, this, "macVentureCursor");
+
+	_consoleText = new ConsoleText(this);
 
 	initGUI();
 }
@@ -125,6 +135,9 @@ Gui::~Gui() {
 	if (_cursor)
 		delete _cursor;
 
+	if (_consoleText)
+		delete _consoleText;
+
 	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
 	for (; it != _assets.end(); it++) {
 		delete it->_value;
@@ -297,8 +310,8 @@ void Gui::initWindows() {
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_selfWindow, "border_no_scroll_inac.bmp", true);
+	loadBorder(_selfWindow, "border_none.bmp", false);
+	loadBorder(_selfWindow, "border_none.bmp", true);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, false, false);
@@ -508,7 +521,7 @@ bool Gui::loadControls() {
 		data.scrollMax = res->readUint16BE();
 		data.scrollMin = res->readUint16BE();
 		data.cdef = res->readUint16BE();
-		data.refcon = (ControlReference)id; id++;
+		data.refcon = (ControlType)id; id++;
 		res->readUint32BE();
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
@@ -535,6 +548,7 @@ void Gui::drawWindows() {
 	drawSelfWindow();
 	drawInventories();
 	drawExitsWindow();
+	drawConsoleWindow();
 
 }
 
@@ -579,7 +593,6 @@ void Gui::drawMainGameWindow() {
 			border.leftOffset,
 			border.topOffset,
 			kBlitDirect);
-
 	}
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
@@ -638,6 +651,13 @@ void Gui::drawExitsWindow() {
 	//g_system->updateScreen();
 }
 
+void Gui::drawConsoleWindow() {
+
+	Graphics::ManagedSurface *srf = _outConsoleWindow->getSurface();
+	BorderBounds bounds = borderBounds(getWindowData(kOutConsoleWindow).type);
+	_consoleText->renderInto(srf, bounds.leftOffset);
+}
+
 void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
 	WindowData &data = findWindowData(target);
 	BorderBounds border = borderBounds(data.type);
@@ -796,7 +816,7 @@ void Gui::updateExit(ObjID obj) {
 	{
 		ControlData data;
 		data.titleLength = 0;
-		data.refcon = obj;
+		data.objref = obj;
 		Common::Point pos = _engine->getObjExitPosition(obj);
 		pos.x = border.leftOffset;
 		pos.y = border.topOffset;
@@ -807,6 +827,11 @@ void Gui::updateExit(ObjID obj) {
 	}
 }
 
+void Gui::printText(const Common::String & text) {
+	debug("Print Text: %s", text);
+	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
+}
+
 
 WindowReference Gui::findWindowAtPoint(Common::Point point) {
 	Common::List<WindowData>::iterator it;
@@ -893,7 +918,7 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 }
 
 void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point startPos) {
-	if (_engine->isObjClickable(child)) {
+	if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
 		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
 		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
@@ -903,12 +928,14 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
 
 void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
 	WindowReference destinationWindow = findWindowAtPoint(pos);
-	if (_draggedObj.hasMoved) {
+	if (_draggedObj.id != 0 && _draggedObj.hasMoved) {
 		ObjID destObject = getWindowData(destinationWindow).objRef;
-		_engine->handleObjectDrop(_draggedObj.id, pos, destObject); //change pos to validate
-	} else {
-		_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
+		debug("drop the object at obj %d", destObject);
+		_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
 	}
+	_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
+
+
 	_draggedObj.id = 0;
 }
 
@@ -1055,16 +1082,17 @@ bool Gui::processEvent(Common::Event &event) {
 
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
-			_draggedObj.pos = event.mouse + _draggedObj.mouseOffset;
-			_draggedObj.hasMoved = true;
+			Common::Point newPos = event.mouse + _draggedObj.mouseOffset;
+			_draggedObj.hasMoved = newPos.sqrDist(_draggedObj.pos) >= kDragThreshold;
+			_draggedObj.pos = newPos;
 		}
 		processed = true;
 
 		// TEST
-		Common::Rect mr = calculateClickRect(event.mouse, _screen.getBounds());
-		_screen.fillRect(mr, kColorGreen);
-		g_system->copyRectToScreen(_screen.getPixels(), _screen.pitch, 0, 0, _screen.w, _screen.h);
-		g_system->updateScreen();
+		//Common::Rect mr = calculateClickRect(event.mouse, _screen.getBounds());
+		//_screen.fillRect(mr, kColorGreen);
+		//g_system->copyRectToScreen(_screen.getPixels(), _screen.pitch, 0, 0, _screen.w, _screen.h);
+		//g_system->updateScreen();
 	}
 
 	processed |= _wm.processEvent(event);
@@ -1098,8 +1126,8 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		}
 
 
-		_engine->selectControl((ControlReference)data.getData().refcon);
-		_engine->activateCommand((ControlReference)data.getData().refcon);
+		_engine->selectControl(_engine->referenceToAction(data.getData().refcon));
+		_engine->activateCommand(data.getData().refcon);
 		_engine->refreshReady();
 		_engine->preparedToRun();
 	}
@@ -1207,22 +1235,16 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 
 void Gui::processCursorTick() {
 	_cursor->tick();
-
-
-
-
-
-	handleDragRelease(_draggedObj.pos, false, true);
-
 }
 
 void Gui::handleSingleClick(Common::Point pos) {
-	//handleDragRelease(_draggedObj.pos, false, false);
 	debug("Single Click");
+	handleDragRelease(_draggedObj.pos, false, false);
 }
 
 void Gui::handleDoubleClick(Common::Point pos) {
 	debug("Double Click");
+	handleDragRelease(_draggedObj.pos, false, true);
 }
 
 /* Ugly switches */
@@ -1236,7 +1258,7 @@ BorderBounds Gui::borderBounds(MVWindowType type) {
 	case MacVenture::kPlainDBox:
 		return BorderBounds(6, 6, 6, 6);
 	case MacVenture::kAltBox:
-		return BorderBounds(8, 9, 11, 10);
+		return BorderBounds(4, 4, 4, 4); // Hand-tested
 		break;
 	case MacVenture::kNoGrowDoc:
 		return BorderBounds(1, 17, 1, 1);
@@ -1249,7 +1271,7 @@ BorderBounds Gui::borderBounds(MVWindowType type) {
 	case MacVenture::kRDoc16:
 		break;
 	case MacVenture::kRDoc4:
-		return BorderBounds(1, 19, 1, 1);
+		return BorderBounds(0, 19, 1, 1);
 	case MacVenture::kRDoc6:
 		break;
 	case MacVenture::kRDoc10:
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 75bb1e6..6dd22f5 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -40,6 +40,7 @@ class MacVentureEngine;
 typedef uint32 ObjID;
 
 class Cursor;
+class ConsoleText;
 class CommandButton;
 class ImageAsset;
 
@@ -110,7 +111,7 @@ struct WindowData {
 	bool updateScroll;
 };
 
-enum ControlReference {
+enum ControlType {
 	kControlExitBox = 0,
 	kControlExamine = 1,
 	kControlOpen = 2,
@@ -130,7 +131,8 @@ struct ControlData {
 	uint16 scrollMax;
 	uint16 scrollMin;
 	uint16 cdef;
-	uint32 refcon; // If exits window, then the obj id. Otherwise, the control type
+	ObjID objref;
+	ControlType refcon; // If exits window, then the obj id. Otherwise, the control type
 	uint8 titleLength;
 	char* title;
 	uint16 border;
@@ -215,6 +217,8 @@ public:
 	void unselectExits();
 	void updateExit(ObjID id);
 
+	void printText(const Common::String &text);
+
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
 
@@ -244,9 +248,11 @@ private: // Attributes
 
 	Graphics::ManagedSurface _draggedSurface;
 	DraggedObj _draggedObj;
-
+	
 	Cursor *_cursor;
 
+	ConsoleText *_consoleText;
+
 private: // Methods
 
 	// Initializers
@@ -268,6 +274,7 @@ private: // Methods
 	void drawSelfWindow();
 	void drawInventories();
 	void drawExitsWindow();
+	void drawConsoleWindow();
 
 	void drawDraggedObject();
 	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
@@ -446,6 +453,58 @@ private:
 	Gui *_gui;
 };
 
+class ConsoleText {
+
+public:
+
+	ConsoleText(Gui *gui) {
+		_gui = gui;
+		_lines.push_back("");
+	}
+
+	~ConsoleText() {
+
+	}
+
+	void printLine(const Common::String &str, int maxW) {
+		Common::StringArray wrappedLines;
+		int textW = maxW;
+		const Graphics::Font *font = &_gui->getCurrentFont();
+
+		font->wordWrapText(str, textW, wrappedLines);
+
+		if (wrappedLines.empty()) // Sometimes we have empty lines
+			_lines.push_back("");
+
+		for (Common::StringArray::const_iterator j = wrappedLines.begin(); j != wrappedLines.end(); ++j)
+			_lines.push_back(*j);
+
+		updateScroll();
+	}
+
+	void renderInto(Graphics::ManagedSurface *target, uint leftOffset) {
+		target->fillRect(target->getBounds(), kColorWhite);
+		const Graphics::Font *font = &_gui->getCurrentFont();
+		// HACK print the last lines visible (no scroll)
+		uint y = target->h - font->getFontHeight();
+		for (uint i = _lines.size() - 1; i != 0; i--) {
+			font->drawString(target, _lines[i], leftOffset, y, font->getStringWidth(_lines[i]), kColorBlack);
+			y -= font->getFontHeight();
+		}
+	}
+
+	void updateScroll() {
+		// TODO implemebt
+	}
+
+private:
+
+	Gui *_gui;
+
+	Common::StringArray _lines;
+
+};
+
 } // End of namespace MacVenture
 
 #endif
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 1578c57..6a9f82f 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -172,13 +172,12 @@ void MacVentureEngine::requestUnpause() {
 	_gameState = kGameStatePlaying;
 }
 
-void MacVentureEngine::selectControl(ControlReference id) {
-	ControlAction action = referenceToAction(id);
-	debug(2, "Select control %x", action);
-	_selectedControl = action;
+void MacVentureEngine::selectControl(ControlAction id) {
+	debug(2, "Select control %x", id);
+	_selectedControl = id;
 }
 
-void MacVentureEngine::activateCommand(ControlReference id) {
+void MacVentureEngine::activateCommand(ControlType id) {
 	if (id == kControlClickToContinue) {
 		_clickToContinue = false;
 		_paused = true;
@@ -264,15 +263,15 @@ bool MacVentureEngine::printTexts() {
 		_textQueue.remove_at(0);
 		switch (text.id) {
 		case kTextNumber:
-			debug("Print Number: %d", text.asset);
+			_gui->printText(Common::String(text.asset));
 			gameChanged();
 			break;
 		case kTextNewLine:
-			debug("Print Newline: ");
+			_gui->printText(Common::String("\n"));
 			gameChanged();
 			break;
 		case kTextPlain:
-			debug("Print Plain Text: %s", _world->getText(text.asset, text.source, text.destination).c_str());
+			_gui->printText(_world->getText(text.asset, text.source, text.destination));
 			gameChanged();
 			break;
 		}
@@ -311,24 +310,19 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 			if (objID > 0) {
 				int i = findObjectInArray(objID, _currentSelection);
 
-				if (isDoubleClick) { // no double click for now
+				if (isDoubleClick) {
 					if (i >= 0)
 						unselectAll();
 					selectObject(objID);
 					if (!_cmdReady)
 					{
-						selectPrimaryObject(objID);
-						if (_selectedControl == kNoCommand)	{
-							_selectedControl = kActivateObject;							
-							if (_activeControl)
-								_activeControl = kNoCommand;
-							_activeControl = kActivateObject;							
-							_cmdReady = true;
-						}
+						selectObject(objID);
+						
+						selectControl(kActivateObject);
+						_activeControl = kActivateObject;
+						_cmdReady = true;						
 					}
 					preparedToRun();
-					//doubleClickObject(objID, win, event, canDrag);
-					debug("Double click");
 				} else {
 					if (i >= 0)
 						unselectAll();
@@ -336,7 +330,6 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 					if (getInvolvedObjects() == 1)
 						_cmdReady = true;
 					preparedToRun();
-					//singleClickObject(objID, win, event, canDrag);
 				}
 			}
 		}
@@ -346,7 +339,7 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent) {
 	_destObject = newParent;
 	updateDelta(delta);
-	selectControl(kControlOperate);
+	selectControl(kOperate);
 	activateCommand(kControlOperate);
 	refreshReady();
 	preparedToRun();
@@ -354,7 +347,7 @@ void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID
 
 void MacVentureEngine::updateDelta(Common::Point newPos) {
 	Common::Point newDelta = newPos - _deltaPoint;
-	debug(4, "Update delta: Old(%d, %d), New(%d, %d)",
+	debug("Update delta: Old(%d, %d), New(%d, %d)",
 		_deltaPoint.x, _deltaPoint.y,
 		newDelta.x, newDelta.y);
 	_deltaPoint = newDelta;
@@ -749,7 +742,7 @@ void MacVentureEngine::zoomObject(ObjID objID) {
 	warning("zoomObject: unimplemented");
 }
 
-ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlReference id) {
+ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlType id) {
 	switch (id) {
 	case MacVenture::kControlExitBox:
 		return kActivateObject;//??
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index ad13d12..a1f570e 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -161,8 +161,8 @@ public:
 
 	void requestQuit();
 	void requestUnpause();
-	void selectControl(ControlReference id);
-	void activateCommand(ControlReference id);
+	void selectControl(ControlAction action);
+	void activateCommand(ControlType id);
 	void refreshReady();
 	void preparedToRun();
 	void gameChanged();
@@ -210,6 +210,8 @@ public:
 	Common::Point getObjExitPosition(ObjID objID);
 	ObjID getParent(ObjID objID);
 
+	// Utils
+	ControlAction referenceToAction(ControlType id);
 
 	// Encapsulation HACK
 	Common::Rect getObjBounds(ObjID objID);
@@ -250,10 +252,7 @@ private:
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
-
-	// Utils
-	ControlAction referenceToAction(ControlReference id);
-
+	
 	const char* getGameFileName() const;
 
 private: // Attributes
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index cbc47a9..230198b 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -1071,7 +1071,7 @@ void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
-	_engine->activateCommand((ControlReference)state->pop());
+	_engine->activateCommand((ControlType)state->pop());
 }
 
 void ScriptEngine::opd7LOSE(EngineState * state, EngineFrame * frame) {


Commit: b4609642840917fe08d675960ce9f0e4567bd6c9
    https://github.com/scummvm/scummvm/commit/b4609642840917fe08d675960ce9f0e4567bd6c9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:46:56+02:00

Commit Message:
MACVENTURE: Add double click

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 7ad5eb0..fb6f46b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -521,15 +521,15 @@ bool Gui::loadControls() {
 		data.scrollMax = res->readUint16BE();
 		data.scrollMin = res->readUint16BE();
 		data.cdef = res->readUint16BE();
-		data.refcon = (ControlType)id; id++;
-		res->readUint32BE();
+		data.refcon = (ControlAction)res->readUint32BE();//(ControlType)id; id++;
+		data.type = (ControlType)id; id++;
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
 			data.title = new char[data.titleLength + 1];
 			res->read(data.title, data.titleLength);
 			data.title[data.titleLength] = '\0';
 		}
-		if (data.refcon != kControlExitBox)
+		if (data.type != kControlExitBox)
 			data.border = commandsBorder;
 
 		Common::Rect bounds(left, top, right, bottom); // For some reason, if I remove this it segfaults
@@ -570,7 +570,7 @@ void Gui::drawCommandsWindow() {
 		Common::Array<CommandButton>::const_iterator it = _controlData->begin();
 		for (; it != _controlData->end(); ++it) {
 			CommandButton button = *it;
-			if (button.getData().refcon != kControlExitBox)
+			if (button.getData().type != kControlExitBox)
 				button.draw(*_controlsWindow->getSurface());
 		}
 	}
@@ -816,7 +816,7 @@ void Gui::updateExit(ObjID obj) {
 	{
 		ControlData data;
 		data.titleLength = 0;
-		data.objref = obj;
+		data.refcon = (ControlAction)obj; // Objects can be exits (actions)
 		Common::Point pos = _engine->getObjExitPosition(obj);
 		pos.x = border.leftOffset;
 		pos.y = border.topOffset;
@@ -935,7 +935,6 @@ void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleC
 	}
 	_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
 
-
 	_draggedObj.id = 0;
 }
 
@@ -1102,7 +1101,7 @@ bool Gui::processEvent(Common::Event &event) {
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
 		if (_engine->needsClickToContinue()) {
-			_engine->activateCommand(kControlClickToContinue);
+			_engine->activateCommand(kClickToContinue);
 			return true;
 		}
 
@@ -1126,7 +1125,7 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		}
 
 
-		_engine->selectControl(_engine->referenceToAction(data.getData().refcon));
+		_engine->selectControl(data.getData().refcon);
 		_engine->activateCommand(data.getData().refcon);
 		_engine->refreshReady();
 		_engine->preparedToRun();
@@ -1240,11 +1239,21 @@ void Gui::processCursorTick() {
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
 	handleDragRelease(_draggedObj.pos, false, false);
+
+	// HACK For test, please delete me
+	//WindowReference destinationWindow = findWindowAtPoint(pos);
+	//_engine->handleObjectSelect(_draggedObj.id, destinationWindow, false, false);
+	//_draggedObj.id = 0;
 }
 
 void Gui::handleDoubleClick(Common::Point pos) {
 	debug("Double Click");
 	handleDragRelease(_draggedObj.pos, false, true);
+
+	// HACK For test, please delete me
+	//WindowReference destinationWindow = findWindowAtPoint(pos);
+	//_engine->handleObjectSelect(_draggedObj.id, destinationWindow, false, true);
+	//_draggedObj.id = 0;
 }
 
 /* Ugly switches */
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 6dd22f5..4e4eda7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -111,7 +111,7 @@ struct WindowData {
 	bool updateScroll;
 };
 
-enum ControlType {
+enum ControlType { // HACK, should correspond exactly with the types of controls (sliders etc) 
 	kControlExitBox = 0,
 	kControlExamine = 1,
 	kControlOpen = 2,
@@ -124,6 +124,26 @@ enum ControlType {
 	kControlClickToContinue = 9
 };
 
+enum ControlAction { // HACK, figure out a way to put it in engine
+	kNoCommand = 0,
+	kStartOrResume = 1,
+	kClose = 2,
+	kTick = 3,
+	kActivateObject = 4,
+	kMoveObject = 5,
+	kConsume = 6,
+	kExamine = 7,
+	kGo = 8,
+	kHit = 9,
+	kOpen = 10,
+	kOperate = 11,
+	kSpeak = 12,
+	kBabble = 13,
+	kTargetName = 14,
+	kDebugObject = 15,
+	kClickToContinue = 16
+};
+
 struct ControlData {
 	Common::Rect bounds;
 	uint16 scrollValue;
@@ -131,8 +151,8 @@ struct ControlData {
 	uint16 scrollMax;
 	uint16 scrollMin;
 	uint16 cdef;
-	ObjID objref;
-	ControlType refcon; // If exits window, then the obj id. Otherwise, the control type
+	ControlAction refcon; 
+	ControlType type;
 	uint8 titleLength;
 	char* title;
 	uint16 border;
@@ -362,7 +382,7 @@ public:
 private:
 
 	void changeState(CursorInput input) {
-		debug("Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
+		debug(4, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
 		_state = _transitionTable[_state][input];
 	}
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6a9f82f..42829d9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -177,19 +177,18 @@ void MacVentureEngine::selectControl(ControlAction id) {
 	_selectedControl = id;
 }
 
-void MacVentureEngine::activateCommand(ControlType id) {
-	if (id == kControlClickToContinue) {
+void MacVentureEngine::activateCommand(ControlAction id) {
+	if (id == kClickToContinue) {
 		_clickToContinue = false;
 		_paused = true;
 		return;
-	}
-	ControlAction action = referenceToAction(id);
-	if (action != _activeControl) {
+	}	
+	if (id != _activeControl) {
 		if (_activeControl)
 			_activeControl = kNoCommand;
-		_activeControl = action;
+		_activeControl = id;
 	}
-	debug(2, "Activating Command %x... Command %x is active", action, _activeControl);
+	debug(2, "Activating Command %x... Command %x is active", id, _activeControl);
 	refreshReady();
 }
 
@@ -267,7 +266,7 @@ bool MacVentureEngine::printTexts() {
 			gameChanged();
 			break;
 		case kTextNewLine:
-			_gui->printText(Common::String("\n"));
+			_gui->printText(Common::String(""));
 			gameChanged();
 			break;
 		case kTextPlain:
@@ -314,10 +313,9 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 					if (i >= 0)
 						unselectAll();
 					selectObject(objID);
-					if (!_cmdReady)
-					{
-						selectObject(objID);
-						
+					_destObject = objID;
+					_deltaPoint = Common::Point(0, 0);
+					if (!_cmdReady) {						
 						selectControl(kActivateObject);
 						_activeControl = kActivateObject;
 						_cmdReady = true;						
@@ -340,7 +338,7 @@ void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID
 	_destObject = newParent;
 	updateDelta(delta);
 	selectControl(kOperate);
-	activateCommand(kControlOperate);
+	activateCommand(kOperate);
 	refreshReady();
 	preparedToRun();
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index a1f570e..6dab558 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -71,6 +71,27 @@ enum {
 	kClickToContinueTextID = 0x84,
 	kStartGameFilenameID = 0x85
 };
+/*
+enum ControlAction {
+	kNoCommand = 0,
+	kStartOrResume = 1,
+	kClose = 2,
+	kTick = 3,
+	kActivateObject = 4,
+	kMoveObject = 5,
+	kConsume = 6,
+	kExamine = 7,
+	kGo = 8,
+	kHit = 9,
+	kOpen = 10,
+	kOperate = 11,
+	kSpeak = 12,
+	kBabble = 13,
+	kTargetName = 14,
+	kDebugObject = 15,
+	kClickToContinue = 16
+};
+*/
 
 enum FilePathID {
 	kMCVID = 1,
@@ -162,7 +183,7 @@ public:
 	void requestQuit();
 	void requestUnpause();
 	void selectControl(ControlAction action);
-	void activateCommand(ControlType id);
+	void activateCommand(ControlAction id);
 	void refreshReady();
 	void preparedToRun();
 	void gameChanged();
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 230198b..a86347b 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -353,7 +353,8 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 				opbaCRAN(state, frame);
 				break;
 			case 0xbb: //fork				
-				opbbFORK(state, frame);
+				if (opbbFORK(state, frame))
+					return true;
 				break;
 			case 0xbc: //call
 				if (opbcCALL(state, frame, script))
@@ -902,14 +903,20 @@ void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
 			frame->saves[i].rank = 0;
 }
 
-void ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
+bool ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 	EngineFrame newframe;
 	newframe.action = (ControlAction)state->pop();
 	newframe.src = state->pop();
 	newframe.dest = state->pop();
 	newframe.x = state->pop();
 	newframe.y = state->pop();
-	_frames.push_back(newframe);
+	newframe.haltedInFamily = false;
+	newframe.haltedInFirst = false;
+	newframe.haltedInSaves = false;
+	_frames.push_front(newframe);
+	if (execFrame(true)) {
+		return true;
+	}
 }
 
 bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
@@ -1071,7 +1078,7 @@ void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
-	_engine->activateCommand((ControlType)state->pop());
+	_engine->activateCommand((ControlAction)state->pop());
 }
 
 void ScriptEngine::opd7LOSE(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index acbffcd..8aee88f 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -31,24 +31,6 @@ namespace MacVenture {
 class Container;
 class World;
 
-enum ControlAction {
-	kNoCommand = 0,
-	kStartOrResume = 1,
-	kClose = 2,
-	kTick = 3,
-	kActivateObject = 4,
-	kMoveObject = 5,
-	kConsume = 6,
-	kExamine = 7,
-	kGo = 8,
-	kHit = 9,
-	kOpen = 10,
-	kOperate = 11,
-	kSpeak = 12,
-	kBabble = 13,
-	kTargetName = 14,
-	kDebugObject = 15
-};
 
 typedef uint32 ObjID;
 typedef int16 word;
@@ -239,7 +221,7 @@ private:
 	void opb8CLOW(EngineState *state, EngineFrame *frame);	//cancel low priority
 	void opb9CHI(EngineState *state, EngineFrame *frame);	//cancel high priority
 	void opbaCRAN(EngineState *state, EngineFrame *frame);	//cancel priority range
-	void opbbFORK(EngineState *state, EngineFrame *frame);	//fork
+	bool opbbFORK(EngineState *state, EngineFrame *frame);	//fork
 	bool opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script);	//call
 	void opbdFOOB(EngineState *state, EngineFrame *frame);	//focus object
 	void opbeSWOB(EngineState *state, EngineFrame *frame);	//swap objects


Commit: 9905cd24d3335c6dab612b5a8c0e3682856020d9
    https://github.com/scummvm/scummvm/commit/9905cd24d3335c6dab612b5a8c0e3682856020d9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:48:04+02:00

Commit Message:
MACVENTURE: Tidy up Inventory window system

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index fb6f46b..0012335 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -56,7 +56,7 @@ enum {
 };
 
 enum {
-	kDragThreshold = 5
+	kDragThreshold = 1
 };
 
 static const Graphics::MenuData menuSubItems[] = {
@@ -320,21 +320,17 @@ void Gui::initWindows() {
 	_exitsWindow->setCallback(exitsWindowCallback, this);
 	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
 	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
-
-
 }
 
 void Gui::assignObjReferences() {
-
 	findWindowData(kSelfWindow).objRef = 0;
-
 }
 
 WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
 	WindowData newData;
 	GlobalSettings settings = _engine->getGlobalSettings();
-	newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a HACK
+	newData.refcon = (WindowReference)ABS(_inventoryWindows.size() + kInventoryStart); // This is a HACK
 
 	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
 		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
@@ -606,23 +602,21 @@ void Gui::drawSelfWindow() {
 }
 
 void Gui::drawInventories() {
-	Common::List<WindowData>::const_iterator it = _windowData->begin();
-	while (it != _windowData->end() && (*it).refcon >= 0x80) {
-		it++;
-	}
+
+
 	Graphics::ManagedSurface *srf;
-	while (it != _windowData->end()) {
-		srf = _inventoryWindows[(*it).refcon]->getSurface();
-		BorderBounds border = borderBounds((*it).type);
+	for (uint i = 0; i < _inventoryWindows.size(); i++) {
+		const WindowData &data = getWindowData((WindowReference)(kInventoryStart + i));
+		srf = findWindow(data.refcon)->getSurface(); // HACK
+		BorderBounds border = borderBounds(data.type);
 		srf->fillRect(Common::Rect(
 			border.leftOffset,
 			border.topOffset,
 			srf->w + border.rightOffset,
 			srf->h + border.bottomOffset), kColorWhite);
-		drawObjectsInWindow((*it).refcon, _inventoryWindows[(*it).refcon]->getSurface());
-		it++;
+		drawObjectsInWindow(data.refcon, srf);
 
-		findWindow((*it).refcon)->setDirty(true);
+		findWindow(data.refcon)->setDirty(true);
 	}
 
 }
@@ -864,8 +858,8 @@ WindowData & Gui::findWindowData(WindowReference reference) {
 }
 
 Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
-	if (reference < 0x80) { // It's an inventory window
-		return _inventoryWindows[reference];
+	if (reference < 0x80 && reference >= kInventoryStart) { // It's an inventory window
+		return _inventoryWindows[reference - kInventoryStart];
 	}
 	switch (reference) {
 	case MacVenture::kNoWindow:
@@ -921,6 +915,8 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
 	if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
 		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
+		_draggedObj.startPos = startPos;
+		_draggedObj.startWin = origin;
 		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
 		_draggedObj.pos = startPos + _draggedObj.mouseOffset;
 	}
@@ -928,14 +924,19 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
 
 void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
 	WindowReference destinationWindow = findWindowAtPoint(pos);
-	if (_draggedObj.id != 0 && _draggedObj.hasMoved) {
-		ObjID destObject = getWindowData(destinationWindow).objRef;
-		debug("drop the object at obj %d", destObject);
-		_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
-	}
-	_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
+	if (_draggedObj.id != 0) {
+		if (_draggedObj.hasMoved) {
+			ObjID destObject = getWindowData(destinationWindow).objRef;
+			pos -= _draggedObj.startPos;
+			pos = localize(pos, _draggedObj.startWin, destinationWindow);
+			debug("drop the object at obj %d, pos (%d, %d)", destObject, pos.x, pos.y);
 
-	_draggedObj.id = 0;
+			_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
+		}
+		_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
+		_draggedObj.id = 0;
+		_draggedObj.hasMoved = false;
+	}
 }
 
 Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect windowBounds) {
@@ -944,6 +945,22 @@ Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect window
 	return Common::Rect(left - kCursorWidth, top - kCursorHeight, left + kCursorWidth, top + kCursorHeight);
 }
 
+Common::Point Gui::localize(Common::Point point, WindowReference origin, WindowReference target) {
+	Graphics::MacWindow *oriWin = findWindow(origin);
+	Graphics::MacWindow *destWin = findWindow(target);
+	if (origin != target) {
+		// ori.local to global
+		point.x += oriWin->getDimensions().left;
+		point.y += oriWin->getDimensions().top;
+		if (destWin) {
+			// dest.globalToLocal
+			point.x -= destWin->getDimensions().left;
+			point.y -= destWin->getDimensions().top;
+		}
+	}
+	return point;
+}
+
 
 /* HANDLERS */
 void Gui::handleMenuAction(MenuAction action) {
@@ -1177,7 +1194,7 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 			event.mouse.x - _exitsWindow->getDimensions().left,
 			event.mouse.y - _exitsWindow->getDimensions().top);
 
-		CommandButton data;
+		CommandButton button;
 		if (!_exitsData)
 			return false;
 
@@ -1185,14 +1202,15 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 		for (; it != _exitsData->end(); ++it) {
 			if (it->isInsideBounds(position)) {
 				it->select();
-				data = *it;
+				button = *it;
+				_engine->handleObjectSelect(button.getData().refcon, kExitsWindow, false, false);
+				return true;
 			}
 			else {
 				it->unselect();
 			}
 		}
 
-		_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, false, false);
 	}
 	return getWindowData(kExitsWindow).visible;
 }
@@ -1238,7 +1256,7 @@ void Gui::processCursorTick() {
 
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
-	handleDragRelease(_draggedObj.pos, false, false);
+	handleDragRelease(pos, false, false);
 
 	// HACK For test, please delete me
 	//WindowReference destinationWindow = findWindowAtPoint(pos);
@@ -1248,7 +1266,7 @@ void Gui::handleSingleClick(Common::Point pos) {
 
 void Gui::handleDoubleClick(Common::Point pos) {
 	debug("Double Click");
-	handleDragRelease(_draggedObj.pos, false, true);
+	handleDragRelease(pos, false, true);
 
 	// HACK For test, please delete me
 	//WindowReference destinationWindow = findWindowAtPoint(pos);
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 4e4eda7..54e7b66 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -65,6 +65,7 @@ enum MenuAction {
 
 enum WindowReference {
 	kNoWindow = 0,
+	kInventoryStart = 1,
 	kCommandsWindow = 0x80,
 	kMainGameWindow = 0x81,
 	kOutConsoleWindow = 0x82,
@@ -171,6 +172,8 @@ struct DraggedObj {
 	ObjID id;
 	Common::Point pos;
 	Common::Point mouseOffset;
+	Common::Point startPos;
+	WindowReference startWin;
 	bool hasMoved;
 };
 
@@ -312,6 +315,7 @@ private: // Methods
 	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
 	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
+	Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);
 
 };
 
@@ -352,12 +356,11 @@ public:
 	~Cursor() {}
 
 	void tick() {
-		executeState();
+		executeState(); 
 		changeState(kTickCol);
 	}
 
 	bool processEvent(const Common::Event &event) {
-		executeState();
 
 		if (event.type == Common::EVENT_MOUSEMOVE) {
 			_pos = event.mouse;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 42829d9..b9c46da 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -231,6 +231,10 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
 	QueuedObject obj;
 	obj.id = type;
 
+	if (type == kUpdateObject && isObjEnqueued(objID)) {
+		return;
+	}
+
 	if (type == kUpdateWindow) { obj.target = target; }
 
 	if (type != kHightlightExits) {
@@ -247,6 +251,14 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
 	_objQueue.push_back(obj);
 }
 
+bool MacVentureEngine::isObjEnqueued(ObjID objID) {
+	Common::Array<QueuedObject>::const_iterator it;
+	for (it = _objQueue.begin(); it != _objQueue.end(); it++) {
+		if ((*it).object == objID) return true;
+	}
+	return false;
+}
+
 void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text) {
 	QueuedText newText;
 	newText.id = type;
@@ -337,18 +349,17 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent) {
 	_destObject = newParent;
 	updateDelta(delta);
-	selectControl(kOperate);
-	activateCommand(kOperate);
+	selectControl(kMoveObject);
+	activateCommand(kMoveObject);
 	refreshReady();
 	preparedToRun();
 }
 
 void MacVentureEngine::updateDelta(Common::Point newPos) {
-	Common::Point newDelta = newPos - _deltaPoint;
 	debug("Update delta: Old(%d, %d), New(%d, %d)",
 		_deltaPoint.x, _deltaPoint.y,
-		newDelta.x, newDelta.y);
-	_deltaPoint = newDelta;
+		newPos.x, newPos.y);
+	_deltaPoint = newPos;
 }
 
 void MacVentureEngine::focusObjWin(ObjID objID) {
@@ -620,7 +631,12 @@ void MacVentureEngine::focusObjectWindow(ObjID objID) {
 
 void MacVentureEngine::openObject(ObjID objID) {
 
-	debug("openObject: %d", objID);
+	debug("Open Object[%d] parent[%d] x[%d] y[%d]",
+		objID,
+		_world->getObjAttr(objID, kAttrParentObject),
+		_world->getObjAttr(objID, kAttrPosX),
+		_world->getObjAttr(objID, kAttrPosY));
+
 	if (getObjWindow(objID)) return;
 	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
 		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
@@ -712,10 +728,13 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 }
 
 void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
-	warning("reflectSwap: untested");
+	//warning("reflectSwap: untested");
 	WindowReference from = getObjWindow(fromID);
 	WindowReference to = getObjWindow(toID);
 	WindowReference tmp = to;
+	debug("Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
+		fromID, toID, from, to);
+
 	if (!to) {
 		tmp = from;
 	}
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 6dab558..043218c 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -270,6 +270,8 @@ private:
 	void toggleExits();
 	void zoomObject(ObjID objID);
 
+	bool isObjEnqueued(ObjID obj);
+
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index a86347b..5e8bcd6 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -51,14 +51,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	frame.haltedInFirst = false;
 	frame.haltedInFamily = false;
 	_frames.push_back(frame);
-	debug(3, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+	debug(2, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
 		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
 
 	return resume(true);
 }
 
 bool ScriptEngine::resume(bool execAll) {	
-	debug(3, "SCRIPT: Resume");
+	debug(2, "SCRIPT: Resume");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
@@ -146,7 +146,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 
 bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 	if (_scripts->getItemByteSize(scriptID) > 0) {
-		debug(3, "SCRIPT: Loading function %d", scriptID);
+		debug(2, "SCRIPT: Loading function %d", scriptID);
 		// Insert the new script at the front
 		frame->scripts.push_front(ScriptAsset(scriptID, _scripts));
 		return runFunc(frame);
@@ -165,7 +165,7 @@ bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 
 bool ScriptEngine::runFunc(EngineFrame *frame) {
 	ScriptAsset &script = frame->scripts.front();
-	debug(3, "SCRIPT: Executing function %d", script.getId());
+	debug(2, "SCRIPT: Executing function %d", script.getId());
 	EngineState *state = &frame->state;
 	byte op;	
 	while (script.hasNext()) {
@@ -927,7 +927,7 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 		return true;
 	frame->scripts.pop_front();
 	script = frame->scripts.front();
-	debug(3, "SCRIPT: Return from fuction %d", id);
+	debug(2, "SCRIPT: Return from fuction %d", id);
 }
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
@@ -1203,7 +1203,7 @@ void ScriptAsset::loadInstructions() {
 	for (uint i = 0; i < amount; i++) {
 		_instructions.push_back(res->readByte());
 	}
-	debug(3, "SCRIPT: Load %d instructions for script %d", amount, _id);
+	debug(2, "SCRIPT: Load %d instructions for script %d", amount, _id);
 }
 
 } // End of namespace MacVenture
\ No newline at end of file


Commit: 528283fbe1abb33e61131f7372cda6e2192dbf70
    https://github.com/scummvm/scummvm/commit/528283fbe1abb33e61131f7372cda6e2192dbf70
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:48:35+02:00

Commit Message:
MACVENTURE: First version of working drag

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 0012335..9671dc0 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -243,6 +243,7 @@ void Gui::setWindowTitle(WindowReference winID, Common::String string) {
 }
 
 void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children) {
+	if (ref == kNoWindow) return;
 	WindowData &data = findWindowData(ref);
 	data.children.clear();
 	data.objRef = objID;
@@ -603,7 +604,6 @@ void Gui::drawSelfWindow() {
 
 void Gui::drawInventories() {
 
-
 	Graphics::ManagedSurface *srf;
 	for (uint i = 0; i < _inventoryWindows.size(); i++) {
 		const WindowData &data = getWindowData((WindowReference)(kInventoryStart + i));
@@ -667,7 +667,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		pos = _engine->getObjPosition(child);
 		pos += Common::Point(border.leftOffset, border.topOffset);
 
-		if (child < 600) { // Small HACK until I figre out where the last garbage child in main game window comes from
+		if (child < 650) { // Small HACK until I figre out where the last garbage child in main game window comes from
 			if (!_assets.contains(child)) {
 				_assets[child] = new ImageAsset(child, _graphics);
 			}
@@ -738,6 +738,7 @@ void Gui::drawDraggedObject() {
 
 
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
+	if (winID == kNoWindow) return;
 	if (winID == kSelfWindow || containerOpen) {
 		WindowData &data = findWindowData(winID);
 		if (winID == kCommandsWindow) {
@@ -880,6 +881,32 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	return nullptr;
 }
 
+WindowReference Gui::getObjWindow(ObjID objID) {
+	switch (objID) {
+	case 0xfffc: return kExitsWindow;
+	case 0xfffd: return kSelfWindow;
+	case 0xfffe: return kOutConsoleWindow;
+	case 0xffff: return kCommandsWindow;
+	}
+
+	return findObjWindow(objID);
+}
+
+WindowReference Gui::findObjWindow(ObjID objID) {
+	// This is a bit of a HACK, we take advantage of the consecutive nature of references
+	for (uint i = kCommandsWindow; i <= kDiplomaWindow; i++) {
+		const WindowData &data = getWindowData((WindowReference)i);
+		if (data.objRef == objID) { return data.refcon; }
+	}
+
+	for (uint i = kInventoryStart; i < _inventoryWindows.size() + kInventoryStart; i++) {
+		const WindowData &data = getWindowData((WindowReference)i);
+		if (data.objRef == objID) { return data.refcon; }
+	}
+
+	return kNoWindow;
+}
+
 void Gui::checkSelect(ObjID obj, const Common::Event &event, const Common::Rect & clickRect, WindowReference ref) {
 	if (_engine->isObjVisible(obj) &&
 		_engine->isObjClickable(obj) &&
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 54e7b66..cd0799d 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -208,6 +208,9 @@ public:
 	uint getObjWidth(ObjID obj);
 	uint getObjHeight(ObjID obj);
 
+	WindowReference getObjWindow(ObjID objID);
+	WindowReference findObjWindow(ObjID objID);
+
 	// Event processors
 	bool processCommandEvents(WindowClick click, Common::Event &event);
 	bool processMainGameEvents(WindowClick click, Common::Event &event);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b9c46da..0614382 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -665,11 +665,9 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 	bool hasChanged = false;
 	debug("Check Object[%d] parent[%d] x[%d] y[%d]",
 		old.object,
-		_world->getObjAttr(old.object, kAttrParentObject),
-		_world->getObjAttr(old.object, kAttrPosX),
-		_world->getObjAttr(old.object, kAttrPosY));
-	//bool incoming = isIncomingObj(objID);
-	//if (incoming) removeIncoming(objID);
+		old.parent,
+		old.x,
+		old.y);
 	ObjID id = old.object;
 	if (id == 1) {
 		if (old.parent != _world->getObjAttr(id, kAttrParentObject)) {
@@ -688,7 +686,7 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 			hasChanged = true;
 		}
 
-		WindowReference newWin = getObjWindow(id);
+		WindowReference newWin = findParentWindow(id);
 		if (newWin) {
 			_gui->addChild(newWin, id);
 			hasChanged = true;
@@ -887,28 +885,13 @@ uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
 }
 
 WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
-	switch (objID) {
-	case 0xfffc: return kExitsWindow;
-	case 0xfffd: return kSelfWindow;
-	case 0xfffe: return kOutConsoleWindow;
-	case 0xffff: return kCommandsWindow;
-	}
-
-	return findObjWindow(objID);
-}
-
-WindowReference MacVentureEngine::findObjWindow(ObjID objID) {
-	// This is a bit of a hack, we take advantage of the consecutive nature of references
-	for (uint i = kCommandsWindow; i <= kDiplomaWindow; i++) {
-		const WindowData &data = _gui->getWindowData((WindowReference)i);
-		if (data.objRef == objID) { return data.refcon; }
-	}
-	return kNoWindow;
+	return _gui->getObjWindow(objID);
 }
 
 WindowReference MacVentureEngine::findParentWindow(ObjID objID) {
 	if (objID == 1) return kSelfWindow;
 	ObjID parent = _world->getObjAttr(objID, kAttrParentObject);
+	if (parent == 0) return kNoWindow;
 	return getObjWindow(parent);
 }
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 043218c..735dda5 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -196,7 +196,7 @@ public:
 
 	void enqueueObject(ObjectQueueID type, ObjID objID, ObjID target = 0);
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
-		
+
 	void runObjQueue();
 	bool printTexts();
 
@@ -239,7 +239,6 @@ public:
 	uint getOverlapPercent(ObjID one, ObjID other);
 
 	WindowReference getObjWindow(ObjID objID);
-	WindowReference findObjWindow(ObjID objID);
 	WindowReference findParentWindow(ObjID objID);
 
 	Common::Point getDeltaPoint();
@@ -275,7 +274,7 @@ private:
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
-	
+
 	const char* getGameFileName() const;
 
 private: // Attributes


Commit: 87540eaa8f2b6664ff916605bd8bc57a7658cec3
    https://github.com/scummvm/scummvm/commit/87540eaa8f2b6664ff916605bd8bc57a7658cec3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:48:36+02:00

Commit Message:
MACVENTURE: Fix error with second scene

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 9671dc0..1c626fe 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -683,11 +683,14 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 					surface, pos.x, pos.y, kBlitOR);
 
 			// For test
+			/*
 			surface->frameRect(Common::Rect(
 				pos.x,
 				pos.y,
-				pos.x + _assets[child]->getWidth(),
-				pos.y + _assets[child]->getHeight()), kColorGreen);
+				pos.x + _assets[child]->getWidth() + 1,
+				pos.y + _assets[child]->getHeight() + 1), kColorGreen);
+				*/
+				
 		}
 
 	}
@@ -736,7 +739,6 @@ void Gui::drawDraggedObject() {
 	}
 }
 
-
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 	if (winID == kNoWindow) return;
 	if (winID == kSelfWindow || containerOpen) {


Commit: 6da240a6e75d9e79d6254a338b905fbb2568d0e0
    https://github.com/scummvm/scummvm/commit/6da240a6e75d9e79d6254a338b905fbb2568d0e0
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:49:11+02:00

Commit Message:
MACVENTURE: Fix object selection in inventory

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 1c626fe..43dfe71 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -683,18 +683,14 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 					surface, pos.x, pos.y, kBlitOR);
 
 			// For test
-			/*
-			surface->frameRect(Common::Rect(
+			/*surface->frameRect(Common::Rect(
 				pos.x,
 				pos.y,
 				pos.x + _assets[child]->getWidth() + 1,
 				pos.y + _assets[child]->getHeight() + 1), kColorGreen);
 				*/
-				
 		}
-
 	}
-
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {
@@ -1258,19 +1254,13 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
 
 		// Find the appropriate window
-		uint ref = 0;
-		uint i;
-		for (uint i = 0; i < _inventoryWindows.size(); i++) {
-			if (_inventoryWindows[i]->hasAllFocus()) { // HACK
-				ref = i;
-			}
-		}
-
+		WindowReference ref = findWindowAtPoint(event.mouse);
+		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
 		ObjID child;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
-		Common::Rect clickRect = calculateClickRect(event.mouse, _inventoryWindows[i]->getDimensions());
+		Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
 		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 			child = (*it).obj;
 			checkSelect(child, event, clickRect, (WindowReference)ref);


Commit: 4662642bc3f8ac2e680d48e9bf34c703991c8652
    https://github.com/scummvm/scummvm/commit/4662642bc3f8ac2e680d48e9bf34c703991c8652
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:49:29+02:00

Commit Message:
MACVENTURE: Adjust drag selection to account for window movement

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 43dfe71..f8430e1 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -827,6 +827,7 @@ void Gui::printText(const Common::String & text) {
 
 
 WindowReference Gui::findWindowAtPoint(Common::Point point) {
+	// HACK, MIGHT NEED TO LOOK INTO THE Graphcis::MacWindow dimensions to account for window movement
 	Common::List<WindowData>::iterator it;
 	for (it = _windowData->begin(); it != _windowData->end(); it++) {
 		if (it->bounds.contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
@@ -839,7 +840,8 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
 Common::Point Gui::getWindowSurfacePos(WindowReference reference) {
 	const WindowData &data = getWindowData(reference);
 	BorderBounds border = borderBounds(data.type);
-	return Common::Point(data.bounds.left + border.leftOffset, data.bounds.top + border.topOffset);
+	Graphics::MacWindow *win = findWindow(reference);
+	return Common::Point(win->getDimensions().left + border.leftOffset, win->getDimensions().top + border.topOffset);
 }
 
 WindowData & Gui::findWindowData(WindowReference reference) {
@@ -1251,7 +1253,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
 
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);


Commit: 8aec5e1cdb1e35a8a3dd03fd58cad493c303f434
    https://github.com/scummvm/scummvm/commit/8aec5e1cdb1e35a8a3dd03fd58cad493c303f434
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:49:30+02:00

Commit Message:
MACVENTURE: Fix inventory

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 0614382..bd3374e 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -182,7 +182,7 @@ void MacVentureEngine::activateCommand(ControlAction id) {
 		_clickToContinue = false;
 		_paused = true;
 		return;
-	}	
+	}
 	if (id != _activeControl) {
 		if (_activeControl)
 			_activeControl = kNoCommand;
@@ -327,10 +327,10 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 					selectObject(objID);
 					_destObject = objID;
 					_deltaPoint = Common::Point(0, 0);
-					if (!_cmdReady) {						
+					if (!_cmdReady) {
 						selectControl(kActivateObject);
 						_activeControl = kActivateObject;
-						_cmdReady = true;						
+						_cmdReady = true;
 					}
 					preparedToRun();
 				} else {
@@ -532,7 +532,6 @@ void MacVentureEngine::selectObject(ObjID objID) {
 		_selectedObjs.push_back(objID);
 		highlightExit(objID);
 	}
-	_deltaPoint = getObjPosition(objID);
 }
 
 void MacVentureEngine::unselectObject(ObjID objID) {
@@ -548,7 +547,7 @@ void MacVentureEngine::unselectObject(ObjID objID) {
 
 void MacVentureEngine::updateExits() {
 	// exitWin.killControls();
-	_gui->unselectExits();	
+	_gui->unselectExits();
 
 	Common::Array<ObjID> exits = _world->getChildren(_world->getObjAttr(1, kAttrParentObject), true);
 	for (uint i = 0; i < exits.size(); i++)
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 15e3c2a..ec20ba6 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -6,32 +6,32 @@
 namespace MacVenture {
 
 World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
-	_resourceManager = resMan;	
+	_resourceManager = resMan;
 	_engine = engine;
 
 	if (!loadStartGameFileName())
 		error("Could not load initial game configuration");
 
 	Common::File saveGameFile;
-	if (!saveGameFile.open(_startGameFileName)) 
+	if (!saveGameFile.open(_startGameFileName))
 		error("Could not load initial game configuration");
 
 	debug("Loading save game state from %s", _startGameFileName.c_str());
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
 
-	_saveGame = new SaveGame(_engine, saveGameRes);	
+	_saveGame = new SaveGame(_engine, saveGameRes);
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
 	calculateObjectRelations();
-	
-	_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());	
-	
+
+	_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());
+
 	delete saveGameRes;
-	saveGameFile.close();		
+	saveGameFile.close();
 }
 
 
 World::~World()	{
-	
+
 	if (_saveGame)
 		delete _saveGame;
 
@@ -66,10 +66,10 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
 	if (attrID == kAttrPosX || attrID == kAttrPosY) {}
 		// Round to scale
-	
-	if (attrID == kAttrParentObject) 
+
+	if (attrID == kAttrParentObject)
 		setParent(objID, value);
-	
+
 	if (attrID < kAttrOtherDoor)
 		_engine->enqueueObject(kUpdateObject, objID);
 
@@ -87,17 +87,17 @@ bool MacVenture::World::isObjActive(ObjID obj) {
 	Common::Point p = _engine->getDeltaPoint();
 	ControlAction selectedControl = _engine->getSelectedControl();
 	if (!getAncestor(obj)) return false; // If our ancestor is the garbage (obj 0), we're inactive
-	if (_engine->getInvolvedObjects() >= 2 &&	// If (we need > 1 objs for the command) && 
+	if (_engine->getInvolvedObjects() >= 2 &&	// If (we need > 1 objs for the command) &&
 		destObj > 0 &&			// we have a destination object &&
 		!getAncestor(destObj))  // but that destination object is in the garbage
 		return false;
-	if (selectedControl != kMoveObject) return true; // We only need one 
+	if (selectedControl != kMoveObject) return true; // We only need one
 	// Handle move object
 	if (!isObjDraggable(obj)) return false; // We can't move it
 	if (getObjAttr(1, kAttrParentObject) != destObj) return true; // if the target is not the player's parent, we can go
 	Common::Rect rect(kScreenWidth, kScreenHeight);
 	rect.top -= getObjAttr(obj, kAttrPosY) + p.y;
-	rect.left -= getObjAttr(obj, kAttrPosX) + p.x;	
+	rect.left -= getObjAttr(obj, kAttrPosX) + p.x;
 	return intersects(obj, rect);
 }
 
@@ -157,7 +157,7 @@ void World::releaseChildren(ObjID objID) {
 
 Common::String World::getText(ObjID objID, ObjID source, ObjID target) {
 	TextAsset text = TextAsset(_engine, objID, source, target, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
-	
+
 	return *text.decode();
 }
 
@@ -169,8 +169,7 @@ bool World::isObjDraggable(ObjID objID) {
 }
 
 bool World::intersects(ObjID objID, Common::Rect rect) {
-	warning("Intersects: unimplemented");
-	return true;
+	return _engine->getObjBounds(objID).intersects(rect);	
 }
 
 bool World::loadStartGameFileName() {
@@ -275,7 +274,7 @@ void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *
 		AttributeGroup g;
 		for (int j = 0; j < settings.numObjects; ++j)
 			g.push_back(res->readUint16BE());
-		
+
 		_groups.push_back(g);
 	}
 }


Commit: b35ef40895989d7d64e0f2dd7d0a055082b59569
    https://github.com/scummvm/scummvm/commit/b35ef40895989d7d64e0f2dd7d0a055082b59569
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:49:30+02:00

Commit Message:
MACVENTURE: Fix temporal window reallocation

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index bd3374e..9994df2 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -856,10 +856,14 @@ ObjID MacVentureEngine::getParent(ObjID objID) {
 }
 
 Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
-	BorderBounds bounds = _gui->borderBounds(_gui->getWindowData(findParentWindow(objID)).type); // HACK
 	Common::Point pos = getObjPosition(objID);
-	pos.x += bounds.leftOffset;
-	pos.y += bounds.topOffset;
+
+	WindowReference win  = findParentWindow(objID);
+	if (win != kNoWindow) { // If it's not in a window YET, we don't really care about the border
+		BorderBounds bounds = _gui->borderBounds(_gui->getWindowData(win).type); // HACK
+		pos.x += bounds.leftOffset;
+		pos.y += bounds.topOffset;
+	}
 	uint w = _gui->getObjWidth(objID); // This shouldn't go here
 	uint h = _gui->getObjHeight(objID);
 	return Common::Rect(pos.x, pos.y, pos.x + w, pos.y + h);


Commit: 9ac125392587aa02f1e874fd5bf095cb56da9564
    https://github.com/scummvm/scummvm/commit/9ac125392587aa02f1e874fd5bf095cb56da9564
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:49:58+02:00

Commit Message:
MACVENTURE: Fix the removal of objects in window

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f8430e1..05c479b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -270,7 +270,7 @@ void Gui::addChild(WindowReference target, ObjID child) {
 }
 
 void Gui::removeChild(WindowReference target, ObjID child) {
-	WindowData data = findWindowData(target);
+	WindowData &data = findWindowData(target);
 	uint index = 0;
 	for (;index < data.children.size(); index++) {
 		if (data.children[index].obj == child) break;
@@ -388,8 +388,8 @@ void Gui::loadGraphics() {
 
 bool Gui::loadMenus() {
 
-	// We assume that, if there are static menus, we don't need dynamic ones
-	if (menuSubItems) {
+	if (kLoadStaticMenus) {
+		// We assume that, if there are static menus, we don't need dynamic ones
 		_menu->addStaticMenus(menuSubItems);
 		return true;
 	}
@@ -667,29 +667,27 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		pos = _engine->getObjPosition(child);
 		pos += Common::Point(border.leftOffset, border.topOffset);
 
-		if (child < 650) { // Small HACK until I figre out where the last garbage child in main game window comes from
-			if (!_assets.contains(child)) {
-				_assets[child] = new ImageAsset(child, _graphics);
-			}
+		if (!_assets.contains(child)) {
+			_assets[child] = new ImageAsset(child, _graphics);
+		}
 
+		_assets[child]->blitInto(
+			surface,
+			pos.x,
+			pos.y,
+			mode);
+
+		if (_engine->isObjSelected(child))
 			_assets[child]->blitInto(
-				surface,
-				pos.x,
-				pos.y,
-				mode);
-
-			if (_engine->isObjSelected(child))
-				_assets[child]->blitInto(
-					surface, pos.x, pos.y, kBlitOR);
-
-			// For test
-			/*surface->frameRect(Common::Rect(
-				pos.x,
-				pos.y,
-				pos.x + _assets[child]->getWidth() + 1,
-				pos.y + _assets[child]->getHeight() + 1), kColorGreen);
-				*/
-		}
+				surface, pos.x, pos.y, kBlitOR);
+
+		// For test
+		/*surface->frameRect(Common::Rect(
+			pos.x,
+			pos.y,
+			pos.x + _assets[child]->getWidth() + 1,
+			pos.y + _assets[child]->getHeight() + 1), kColorGreen);
+			*/
 	}
 }
 
@@ -755,20 +753,17 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 				mode = kBlitBIC;
 				if (off || flag) {
 					mode = kBlitXOR;
-				}
-				else if (_engine->isObjSelected(child)) {
+				} else if (!off && _engine->isObjSelected(child)) {
 					mode = kBlitOR;
 				}
 				children[i] = DrawableObject(child, mode);
-			}
-			else {
+			} else {
 				children[i] = DrawableObject(child, kBlitXOR);
 			}
 		}
 		if (winID == kMainGameWindow) {
 			drawMainGameWindow();
-		}
-		else {
+		} else {
 			Graphics::MacWindow *winRef = findWindow(winID);
 			winRef->getSurface()->fillRect(data.bounds, kColorGray);
 		}


Commit: fdd949bb00d5d3b5bda54ef85f8fde3682dc2c27
    https://github.com/scummvm/scummvm/commit/fdd949bb00d5d3b5bda54ef85f8fde3682dc2c27
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:50:19+02:00

Commit Message:
MACVENTURE: Fix exits drawing

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 05c479b..5a26482 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -717,8 +717,8 @@ void Gui::drawDraggedObject() {
 		ImageAsset *asset = _assets[_draggedObj.id];
 
 		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
-		_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
-			Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
+		//_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
+		//	Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
 
 		asset->blitInto(&_draggedSurface, 0, 0, kBlitBIC);
 
@@ -773,6 +773,10 @@ void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 	}
 }
 
+void Gui::clearExits() {
+	_exitsData->clear();
+}
+
 void Gui::unselectExits() {
 	Common::Array<CommandButton>::const_iterator it = _exitsData->begin();
 	for (; it != _exitsData->end(); ++it) {
@@ -806,8 +810,8 @@ void Gui::updateExit(ObjID obj) {
 		data.titleLength = 0;
 		data.refcon = (ControlAction)obj; // Objects can be exits (actions)
 		Common::Point pos = _engine->getObjExitPosition(obj);
-		pos.x = border.leftOffset;
-		pos.y = border.topOffset;
+		pos.x += border.leftOffset;
+		pos.y += border.topOffset;
 		data.bounds = Common::Rect(pos.x, pos.y, pos.x + kExitButtonWidth, pos.y + kExitButtonHeight);
 		data.visible = true;
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index cd0799d..55dd180 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -112,7 +112,7 @@ struct WindowData {
 	bool updateScroll;
 };
 
-enum ControlType { // HACK, should correspond exactly with the types of controls (sliders etc) 
+enum ControlType { // HACK, should correspond exactly with the types of controls (sliders etc)
 	kControlExitBox = 0,
 	kControlExamine = 1,
 	kControlOpen = 2,
@@ -152,7 +152,7 @@ struct ControlData {
 	uint16 scrollMax;
 	uint16 scrollMin;
 	uint16 cdef;
-	ControlAction refcon; 
+	ControlAction refcon;
 	ControlType type;
 	uint8 titleLength;
 	char* title;
@@ -240,6 +240,7 @@ public:
 	void addChild(WindowReference target, ObjID child);
 	void removeChild(WindowReference target, ObjID child);
 
+	void clearExits();
 	void unselectExits();
 	void updateExit(ObjID id);
 
@@ -274,7 +275,7 @@ private: // Attributes
 
 	Graphics::ManagedSurface _draggedSurface;
 	DraggedObj _draggedObj;
-	
+
 	Cursor *_cursor;
 
 	ConsoleText *_consoleText;
@@ -359,7 +360,7 @@ public:
 	~Cursor() {}
 
 	void tick() {
-		executeState(); 
+		executeState();
 		changeState(kTickCol);
 	}
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9994df2..28bfa65 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -546,7 +546,7 @@ void MacVentureEngine::unselectObject(ObjID objID) {
 
 
 void MacVentureEngine::updateExits() {
-	// exitWin.killControls();
+	_gui->clearExits();
 	_gui->unselectExits();
 
 	Common::Array<ObjID> exits = _world->getChildren(_world->getObjAttr(1, kAttrParentObject), true);


Commit: b6acfe868ce4b614bfdc9d510e10e35923a7fed6
    https://github.com/scummvm/scummvm/commit/b6acfe868ce4b614bfdc9d510e10e35923a7fed6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:50:20+02:00

Commit Message:
MACVENTURE: Fix click-through and refactor

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 5a26482..880ec28 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -906,13 +906,20 @@ WindowReference Gui::findObjWindow(ObjID objID) {
 	return kNoWindow;
 }
 
-void Gui::checkSelect(ObjID obj, const Common::Event &event, const Common::Rect & clickRect, WindowReference ref) {
-	if (_engine->isObjVisible(obj) &&
-		_engine->isObjClickable(obj) &&
-		isRectInsideObject(clickRect, obj))
-	{
-		selectDraggable(obj, ref, event.mouse);
+bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
+	return (_engine->isObjVisible(obj) &&
+					_engine->isObjClickable(obj) &&
+					isRectInsideObject(clickRect, obj));
+}
+
+void Gui::checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
+	ObjID child;
+	for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
+		if (canBeSelected((*it).obj, event, clickRect, ref)) {
+			child = (*it).obj;
+		}
 	}
+	if (child != 0) selectDraggable(child, ref, event.mouse);
 }
 
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
@@ -1182,14 +1189,11 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 
 	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
 		WindowData &data = findWindowData(kMainGameWindow);
-		ObjID child;
+		ObjID child = 0;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
 		Common::Rect clickRect = calculateClickRect(event.mouse, _mainGameWindow->getDimensions());
-		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
-			child = (*it).obj;
-			checkSelect(child, event, clickRect, kMainGameWindow);
-		}
+		checkSelect(data, event, clickRect, kMainGameWindow);
 	}
 	return false;
 }
@@ -1262,10 +1266,8 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
 		Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
-		for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
-			child = (*it).obj;
-			checkSelect(child, event, clickRect, (WindowReference)ref);
-		}
+		checkSelect(data, event, clickRect, (WindowReference)ref);
+
 	}
 	return true;
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 55dd180..cd8c162 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -314,7 +314,8 @@ private: // Methods
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
 	// Utils
-	void checkSelect(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
+	bool canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
+	void checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
 	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
 	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);


Commit: a5a094b6bdf1dd61f270e60068c42d9f62b8c447
    https://github.com/scummvm/scummvm/commit/a5a094b6bdf1dd61f270e60068c42d9f62b8c447
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:53:49+02:00

Commit Message:
MACVENTURE: Begin fixing second inventory problem

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 880ec28..1f07e7c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -830,7 +830,8 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
 	Common::List<WindowData>::iterator it;
 	for (it = _windowData->begin(); it != _windowData->end(); it++) {
 		if (it->bounds.contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
-			return it->refcon;
+			if (findWindow(it->refcon)->isActive())
+				return it->refcon;
 		}
 	}
 	return kNoWindow;
@@ -957,6 +958,7 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
 
 void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
 	WindowReference destinationWindow = findWindowAtPoint(pos);
+	if (destinationWindow == kNoWindow) return;
 	if (_draggedObj.id != 0) {
 		if (_draggedObj.hasMoved) {
 			ObjID destObject = getWindowData(destinationWindow).objRef;
@@ -1260,6 +1262,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
+		if (ref == kNoWindow) return false;
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
 		ObjID child;


Commit: 19d732186760bb13be49fb8d5ca4c45de0f77d86
    https://github.com/scummvm/scummvm/commit/19d732186760bb13be49fb8d5ca4c45de0f77d86
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:53:51+02:00

Commit Message:
MACVENTURE: Fix torch drawing problem

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 1f07e7c..b4fada6 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1116,14 +1116,13 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 	return true;
 }
 
-uint Gui::getObjWidth(ObjID obj) {
-	if (!_assets.contains(obj)) return 0;
-	return _assets[obj]->getWidth();
-}
-
-uint Gui::getObjHeight(ObjID obj) {
-	if (!_assets.contains(obj)) return 0;
-	return _assets[obj]->getHeight();
+Common::Point Gui::getObjMeasures(ObjID obj) {
+	if (!_assets.contains(obj)) {
+		_assets[obj] = new ImageAsset(obj, _graphics);
+	}
+	uint w = _assets[obj]->getWidth();
+	uint h = _assets[obj]->getHeight();
+	return Common::Point(w, h);
 }
 
 bool Gui::processEvent(Common::Event &event) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index cd8c162..2c4ef3f 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -205,8 +205,7 @@ public:
 	WindowReference createInventoryWindow(ObjID objRef);
 	bool tryCloseWindow(WindowReference winID);
 
-	uint getObjWidth(ObjID obj);
-	uint getObjHeight(ObjID obj);
+	Common::Point getObjMeasures(ObjID obj);
 
 	WindowReference getObjWindow(ObjID objID);
 	WindowReference findObjWindow(ObjID objID);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 28bfa65..211ba43 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -864,8 +864,9 @@ Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 		pos.x += bounds.leftOffset;
 		pos.y += bounds.topOffset;
 	}
-	uint w = _gui->getObjWidth(objID); // This shouldn't go here
-	uint h = _gui->getObjHeight(objID);
+	Common::Point measures = _gui->getObjMeasures(objID);
+	uint w = measures.x;
+	uint h = measures.y;
 	return Common::Rect(pos.x, pos.y, pos.x + w, pos.y + h);
 }
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 5e8bcd6..5b86c31 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -27,8 +27,8 @@
 #include "macventure/world.h"
 #include "macventure/container.h"
 
-namespace MacVenture {	
-	
+namespace MacVenture {
+
 ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
 	_engine = engine;
 	_world = world;
@@ -57,13 +57,13 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	return resume(true);
 }
 
-bool ScriptEngine::resume(bool execAll) {	
+bool ScriptEngine::resume(bool execAll) {
 	debug(2, "SCRIPT: Resume");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
 	}
-	return false;	
+	return false;
 }
 
 void ScriptEngine::reset() {
@@ -107,7 +107,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 			}
 			doFamily = true;
 		}
-	}	
+	}
 
 	// Halted in saves
 	if (frame->haltedInSaves) {
@@ -139,7 +139,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 			}
 		}
 	} while (highest);
-	
+
 	_frames.pop_front();
 	return false;
 }
@@ -167,7 +167,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 	ScriptAsset &script = frame->scripts.front();
 	debug(2, "SCRIPT: Executing function %d", script.getId());
 	EngineState *state = &frame->state;
-	byte op;	
+	byte op;
 	while (script.hasNext()) {
 		op = script.fetch();
 		debug(3, "SCRIPT: I'm running operation %d", op);
@@ -352,7 +352,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 			case 0xba: //cancel priority range
 				opbaCRAN(state, frame);
 				break;
-			case 0xbb: //fork				
+			case 0xbb: //fork
 				if (opbbFORK(state, frame))
 					return true;
 				break;
@@ -1012,7 +1012,6 @@ void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
 	state->push(minutes);
 	state->push(totalPlayTime);
 	debug("Saved time: h[%d] m[%d] s[%d]", hours, minutes, totalPlayTime);
-	
 }
 
 void ScriptEngine::opcbDAY(EngineState * state, EngineFrame * frame) {
@@ -1056,7 +1055,7 @@ void ScriptEngine::opd1GOBD(EngineState * state, EngineFrame * frame) {
 	state->push(bounds.height());
 }
 
-void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) { 
+void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(_engine->getOverlapPercent(b, a));
@@ -1168,10 +1167,10 @@ void ScriptEngine::op00NOOP(byte op) {
 
 
 
-ScriptAsset::ScriptAsset(ObjID id, Container * container) {	
+ScriptAsset::ScriptAsset(ObjID id, Container * container) {
 	_id = id;
 	_container = container;
-	_ip = 0x0;	
+	_ip = 0x0;
 	loadInstructions();
 }
 
@@ -1206,4 +1205,4 @@ void ScriptAsset::loadInstructions() {
 	debug(2, "SCRIPT: Load %d instructions for script %d", amount, _id);
 }
 
-} // End of namespace MacVenture
\ No newline at end of file
+} // End of namespace MacVenture


Commit: bc29c37f3273ca98fa813349dd1bd66a7af09e80
    https://github.com/scummvm/scummvm/commit/bc29c37f3273ca98fa813349dd1bd66a7af09e80
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:53:51+02:00

Commit Message:
MACVENUTRE: Fix PPIC0 Drawing

Changed paths:
    engines/macventure/image.cpp



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 1aae172..c964ce4 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -64,7 +64,7 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 	_id = (original * 2);
 	_mask = (original * 2) + 1;
 
-	_container = container;	
+	_container = container;
 	decodePPIC(_id, _imgData);
 
 	if (_container->getItemByteSize(_mask)) // Has mask
@@ -124,9 +124,40 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data) {
 	warning("Untested loading function: decode PPIC0");
 	uint words = _bitWidth >> 4;
-	for (uint y = 0; y <_bitHeight; y++)
-		for (uint x = 0; x < words; x++)
-			data[y * words + x] = (byte)stream.getBits(8);
+	uint bytes = _bitWidth & 0xF;
+	uint v = 0;
+	uint p = 0;
+	for (uint y = 0; y <_bitHeight; y++) {
+		for (uint x = 0; x < words; x++) {
+			v = stream.peekBits(32);
+			stream.skip(16);
+			v >>= 16 - (stream.pos() % 8);
+			data[p] = (v >> 8) & 0xff; p++;
+			data[p] = v & 0xff; p++;
+		}
+		if (bytes) {
+			v = stream.getBits(bytes);
+			v <<= 16 - bytes;
+			data[p] = (v >> 8) & 0xff; p++;
+			data[p] = v & 0xff; p++;
+		}
+	}
+	/*
+	for (var i=0;i<words;i++)
+		{
+			v=ppic.peek32(); ppic.seek(2,ppic.cur);
+			v>>>=16-ppic.bit;
+			bitmap.data[p++]=(v>>8)&0xff;
+			bitmap.data[p++]=v&0xff;
+		}
+		if (bytes)
+		{
+			v=ppic.bits(bytes);
+			v<<=16-bytes;
+			bitmap.data[p++]=(v>>8)&0xff;
+			bitmap.data[p++]=v&0xff;
+		}
+		*/
 }
 
 void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data) {
@@ -211,7 +242,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		pos += blank;
 	}
 
-	uint16 edge = _bitWidth & 3;	
+	uint16 edge = _bitWidth & 3;
 	if (edge) {
 		pos = _rowBytes - blank;
 		uint16 bits = 0;
@@ -332,10 +363,10 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 		} else if (_container->getItemByteSize(_id)) {
 			switch (mode) {
 			case MacVenture::kBlitBIC:
-				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorWhite);
+				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight), kColorWhite);
 				break;
 			case MacVenture::kBlitOR:
-				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight * 2), kColorBlack);
+				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight), kColorBlack);
 				break;
 			default:
 				break;
@@ -345,7 +376,7 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 		if (_container->getItemByteSize(_id) && mode > 0) {
 			blitXOR(target, x, y, _imgData);
 		}
-	}	
+	}
 }
 
 bool ImageAsset::isPointInside(Common::Point point) {
@@ -357,6 +388,9 @@ bool ImageAsset::isPointInside(Common::Point point) {
 }
 
 bool ImageAsset::isRectInside(Common::Rect rect) {
+	// HACK is it &&, or ||?
+	if (_maskData.empty()) return (rect.width() > 0 && rect.height() > 0);
+
 	for (uint y = rect.top; y < rect.top + rect.height(); y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix;
@@ -389,7 +423,7 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
 	*/
-	
+
 	for (uint y = 0; y < _bitHeight; y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
@@ -418,7 +452,7 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 		uint bmpofs = y * _rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < _bitWidth; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));			
+			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
 	}
@@ -470,7 +504,7 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 			if (pix) { // We need to xor
 				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
 
-				*((byte *)target->getBasePtr(ox + x, oy + y)) = 
+				*((byte *)target->getBasePtr(ox + x, oy + y)) =
 					(p == kColorWhite) ? kColorBlack : kColorWhite;
 			}
 		}


Commit: d826fcb18b84f3e3eb3e4cad293122c9a44b9871
    https://github.com/scummvm/scummvm/commit/d826fcb18b84f3e3eb3e4cad293122c9a44b9871
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:50+02:00

Commit Message:
MACVENTURE: Fix drag screen overflow problem

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index b4fada6..79df822 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -203,6 +203,48 @@ void Gui::clearControls() {
 	}
 }
 
+void Gui::initWindows() {
+	// Game Controls Window
+	_controlsWindow = _wm.addWindow(false, false, false);
+	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
+	_controlsWindow->setActive(false);
+	_controlsWindow->setCallback(commandsWindowCallback, this);
+	loadBorder(_controlsWindow, "border_command.bmp", false);
+	loadBorder(_controlsWindow, "border_command.bmp", true);
+
+	// Main Game Window
+	_mainGameWindow = _wm.addWindow(false, false, false);
+	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
+	_mainGameWindow->setActive(false);
+	_mainGameWindow->setCallback(mainGameWindowCallback, this);
+	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
+
+	// In-game Output Console
+	_outConsoleWindow = _wm.addWindow(false, true, true);
+	_outConsoleWindow->setDimensions(getWindowData(kOutConsoleWindow).bounds);
+	_outConsoleWindow->setActive(false);
+	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
+
+	// Self Window
+	_selfWindow = _wm.addWindow(false, true, false);
+	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
+	_selfWindow->setActive(false);
+	_selfWindow->setCallback(selfWindowCallback, this);
+	loadBorder(_selfWindow, "border_none.bmp", false);
+	loadBorder(_selfWindow, "border_none.bmp", true);
+
+	// Exits Window
+	_exitsWindow = _wm.addWindow(false, false, false);
+	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
+	_exitsWindow->setActive(false);
+	_exitsWindow->setCallback(exitsWindowCallback, this);
+	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+}
+
 const WindowData& Gui::getWindowData(WindowReference reference) {
 	return findWindowData(reference);
 }
@@ -280,49 +322,6 @@ void Gui::removeChild(WindowReference target, ObjID child) {
 		data.children.remove_at(index);
 }
 
-void Gui::initWindows() {
-
-	// Game Controls Window
-	_controlsWindow = _wm.addWindow(false, false, false);
-	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
-	_controlsWindow->setActive(false);
-	_controlsWindow->setCallback(commandsWindowCallback, this);
-	loadBorder(_controlsWindow, "border_command.bmp", false);
-	loadBorder(_controlsWindow, "border_command.bmp", true);
-
-	// Main Game Window
-	_mainGameWindow = _wm.addWindow(false, false, false);
-	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
-	_mainGameWindow->setActive(false);
-	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
-
-	// In-game Output Console
-	_outConsoleWindow = _wm.addWindow(false, true, true);
-	_outConsoleWindow->setDimensions(Common::Rect(20, 20, 120, 120));
-	_outConsoleWindow->setActive(false);
-	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
-
-	// Self Window
-	_selfWindow = _wm.addWindow(false, true, false);
-	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
-	_selfWindow->setActive(false);
-	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_none.bmp", false);
-	loadBorder(_selfWindow, "border_none.bmp", true);
-
-	// Exits Window
-	_exitsWindow = _wm.addWindow(false, false, false);
-	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
-	_exitsWindow->setActive(false);
-	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
-}
-
 void Gui::assignObjReferences() {
 	findWindowData(kSelfWindow).objRef = 0;
 }
@@ -824,6 +823,31 @@ void Gui::printText(const Common::String & text) {
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
+void Gui::moveDraggedObject(Common::Point target) {
+	Common::Point newPos = target + _draggedObj.mouseOffset;
+	bool movement = false;
+	// If we overflow, move the mouseOffset, not the position.
+	if (newPos.x < 0 || newPos.x + _assets[_draggedObj.id]->getWidth() >= kScreenWidth) {
+		_draggedObj.mouseOffset.x = _draggedObj.pos.x - target.x;
+	} else {
+		_draggedObj.pos.x = newPos.x;
+		movement = true;
+	}
+
+	if (newPos.y < 0 || newPos.y + _assets[_draggedObj.id]->getHeight() >= kScreenHeight) {
+		_draggedObj.mouseOffset.y = _draggedObj.pos.y - target.y;
+	} else {
+		_draggedObj.pos.y = newPos.y;
+		movement = true;
+	}
+
+	// TODO establish an absolute distance, such as _draggedObj.pos.sqrDist(_draggedObj.startPos);
+	_draggedObj.hasMoved |= movement && (newPos.sqrDist(_draggedObj.pos) >= kDragThreshold);
+
+	// TODO DELETE MEEE
+	debug("Dragged obj position: (%d, %d), mouse offset: (%d, %d)",
+				_draggedObj.pos.x, _draggedObj.pos.y, _draggedObj.mouseOffset.x, _draggedObj.mouseOffset.y);
+}
 
 WindowReference Gui::findWindowAtPoint(Common::Point point) {
 	// HACK, MIGHT NEED TO LOOK INTO THE Graphcis::MacWindow dimensions to account for window movement
@@ -1132,9 +1156,7 @@ bool Gui::processEvent(Common::Event &event) {
 
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
-			Common::Point newPos = event.mouse + _draggedObj.mouseOffset;
-			_draggedObj.hasMoved = newPos.sqrDist(_draggedObj.pos) >= kDragThreshold;
-			_draggedObj.pos = newPos;
+			moveDraggedObject(event.mouse);
 		}
 		processed = true;
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 2c4ef3f..65f2ec5 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -306,6 +306,8 @@ private: // Methods
 	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 
+	void moveDraggedObject(Common::Point target);
+
 	// Finders
 	WindowReference findWindowAtPoint(Common::Point point);
 	Common::Point getWindowSurfacePos(WindowReference reference);


Commit: 31a32963b4047e54fa1af93e4bf28c99a72ed580
    https://github.com/scummvm/scummvm/commit/31a32963b4047e54fa1af93e4bf28c99a72ed580
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Fix dragged object move recognition

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 79df822..7eccb16 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -56,7 +56,7 @@ enum {
 };
 
 enum {
-	kDragThreshold = 1
+	kDragThreshold = 5
 };
 
 static const Graphics::MenuData menuSubItems[] = {
@@ -841,12 +841,17 @@ void Gui::moveDraggedObject(Common::Point target) {
 		movement = true;
 	}
 
-	// TODO establish an absolute distance, such as _draggedObj.pos.sqrDist(_draggedObj.startPos);
-	_draggedObj.hasMoved |= movement && (newPos.sqrDist(_draggedObj.pos) >= kDragThreshold);
+	// TODO FInd more elegant way of making pow2
+	_draggedObj.hasMoved = movement && (_draggedObj.startPos.sqrDist(_draggedObj.pos) >= (kDragThreshold * kDragThreshold));
+
+	debug(4, "Dragged obj position: (%d, %d), mouse offset: (%d, %d), hasMoved: %d, dist: %d, threshold: %d",
+		_draggedObj.pos.x, _draggedObj.pos.y,
+		_draggedObj.mouseOffset.x, _draggedObj.mouseOffset.y,
+		_draggedObj.hasMoved,
+		_draggedObj.startPos.sqrDist(_draggedObj.pos),
+		kDragThreshold * kDragThreshold
+	);
 
-	// TODO DELETE MEEE
-	debug("Dragged obj position: (%d, %d), mouse offset: (%d, %d)",
-				_draggedObj.pos.x, _draggedObj.pos.y, _draggedObj.mouseOffset.x, _draggedObj.mouseOffset.y);
 }
 
 WindowReference Gui::findWindowAtPoint(Common::Point point) {
@@ -969,14 +974,14 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	return false;
 }
 
-void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point startPos) {
+void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click) {
 	if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
 		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
-		_draggedObj.startPos = startPos;
 		_draggedObj.startWin = origin;
-		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
-		_draggedObj.pos = startPos + _draggedObj.mouseOffset;
+		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - click;
+		_draggedObj.pos = click + _draggedObj.mouseOffset;
+		_draggedObj.startPos = _draggedObj.pos;
 	}
 }
 


Commit: 777923be660749e792d993be9f8f2c08fb801dc4
    https://github.com/scummvm/scummvm/commit/777923be660749e792d993be9f8f2c08fb801dc4
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Correct object drop position

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 7eccb16..71a7d0c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -681,12 +681,12 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 				surface, pos.x, pos.y, kBlitOR);
 
 		// For test
-		/*surface->frameRect(Common::Rect(
+		surface->frameRect(Common::Rect(
 			pos.x,
 			pos.y,
 			pos.x + _assets[child]->getWidth() + 1,
 			pos.y + _assets[child]->getHeight() + 1), kColorGreen);
-			*/
+
 	}
 }
 
@@ -991,7 +991,7 @@ void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleC
 	if (_draggedObj.id != 0) {
 		if (_draggedObj.hasMoved) {
 			ObjID destObject = getWindowData(destinationWindow).objRef;
-			pos -= _draggedObj.startPos;
+			pos -= (_draggedObj.startPos - _draggedObj.mouseOffset);
 			pos = localize(pos, _draggedObj.startWin, destinationWindow);
 			debug("drop the object at obj %d, pos (%d, %d)", destObject, pos.x, pos.y);
 


Commit: 2ba8b1ca8c418e3c3b3f5d90155e1a76eb95f16e
    https://github.com/scummvm/scummvm/commit/2ba8b1ca8c418e3c3b3f5d90155e1a76eb95f16e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: FIx pesky random drag selection

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 71a7d0c..a056e1b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -716,8 +716,8 @@ void Gui::drawDraggedObject() {
 		ImageAsset *asset = _assets[_draggedObj.id];
 
 		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
-		//_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
-		//	Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
+		_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
+			Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
 
 		asset->blitInto(&_draggedSurface, 0, 0, kBlitBIC);
 
@@ -936,14 +936,8 @@ WindowReference Gui::findObjWindow(ObjID objID) {
 	return kNoWindow;
 }
 
-bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
-	return (_engine->isObjVisible(obj) &&
-					_engine->isObjClickable(obj) &&
-					isRectInsideObject(clickRect, obj));
-}
-
 void Gui::checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
-	ObjID child;
+	ObjID child = 0;
 	for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
 		if (canBeSelected((*it).obj, event, clickRect, ref)) {
 			child = (*it).obj;
@@ -952,6 +946,12 @@ void Gui::checkSelect(const WindowData &data, const Common::Event &event, const
 	if (child != 0) selectDraggable(child, ref, event.mouse);
 }
 
+bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
+	return (_engine->isObjVisible(obj) &&
+					_engine->isObjClickable(obj) &&
+					isRectInsideObject(clickRect, obj));
+}
+
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	if (_assets.contains(obj) &&
 		//_engine->isObjClickable(obj) &&
@@ -993,7 +993,7 @@ void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleC
 			ObjID destObject = getWindowData(destinationWindow).objRef;
 			pos -= (_draggedObj.startPos - _draggedObj.mouseOffset);
 			pos = localize(pos, _draggedObj.startWin, destinationWindow);
-			debug("drop the object at obj %d, pos (%d, %d)", destObject, pos.x, pos.y);
+			debug("drop the object %d at obj %d, pos (%d, %d)", _draggedObj.id, destObject, pos.x, pos.y);
 
 			_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
 		}


Commit: c36f8c429fd213aa9b3fbe58c894036a1dc26473
    https://github.com/scummvm/scummvm/commit/c36f8c429fd213aa9b3fbe58c894036a1dc26473
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Soften conditions for object selection

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index a056e1b..0b7606c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -308,6 +308,9 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 }
 
 void Gui::addChild(WindowReference target, ObjID child) {
+	// HACK WRONG!! Please delete me when you are done testing!
+	if (child == 92) return; // Avoid adding the stones in the waterfall
+
 	findWindowData(target).children.push_back(DrawableObject(child, kBlitBIC));
 }
 
@@ -819,7 +822,7 @@ void Gui::updateExit(ObjID obj) {
 }
 
 void Gui::printText(const Common::String & text) {
-	debug("Print Text: %s", text);
+	debug(1, "Print Text: %s", text.c_str());
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
@@ -947,16 +950,12 @@ void Gui::checkSelect(const WindowData &data, const Common::Event &event, const
 }
 
 bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
-	return (_engine->isObjVisible(obj) &&
-					_engine->isObjClickable(obj) &&
+	return (_engine->isObjClickable(obj) &&
 					isRectInsideObject(clickRect, obj));
 }
 
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
-	if (_assets.contains(obj) &&
-		//_engine->isObjClickable(obj) &&
-		_engine->isObjVisible(obj))
-	{
+	if (_assets.contains(obj)) {
 		Common::Rect bounds = _engine->getObjBounds(obj);
 		Common::Rect intersection = bounds.findIntersectingRect(target);
 		// We translate it to the image's coord system
@@ -966,7 +965,6 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 			intersection.left - bounds.left + intersection.width(),
 			intersection.top - bounds.top + intersection.height());
 
-
 		if (_assets[obj]->isRectInside(intersection)) {
 			return true;
 		}
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index c964ce4..21986e3 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -122,7 +122,6 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 }
 
 void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data) {
-	warning("Untested loading function: decode PPIC0");
 	uint words = _bitWidth >> 4;
 	uint bytes = _bitWidth & 0xF;
 	uint v = 0;


Commit: f8efc58a59bd94579dd58f46bbcaeb059f691995
    https://github.com/scummvm/scummvm/commit/f8efc58a59bd94579dd58f46bbcaeb059f691995
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Fix inventory window selection

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 0b7606c..415e02e 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -308,9 +308,6 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 }
 
 void Gui::addChild(WindowReference target, ObjID child) {
-	// HACK WRONG!! Please delete me when you are done testing!
-	if (child == 92) return; // Avoid adding the stones in the waterfall
-
 	findWindowData(target).children.push_back(DrawableObject(child, kBlitBIC));
 }
 
@@ -609,7 +606,7 @@ void Gui::drawInventories() {
 	Graphics::ManagedSurface *srf;
 	for (uint i = 0; i < _inventoryWindows.size(); i++) {
 		const WindowData &data = getWindowData((WindowReference)(kInventoryStart + i));
-		srf = findWindow(data.refcon)->getSurface(); // HACK
+		srf = findWindow(data.refcon)->getSurface();
 		BorderBounds border = borderBounds(data.type);
 		srf->fillRect(Common::Rect(
 			border.leftOffset,
@@ -858,11 +855,12 @@ void Gui::moveDraggedObject(Common::Point target) {
 }
 
 WindowReference Gui::findWindowAtPoint(Common::Point point) {
-	// HACK, MIGHT NEED TO LOOK INTO THE Graphcis::MacWindow dimensions to account for window movement
 	Common::List<WindowData>::iterator it;
+	Graphics::MacWindow *win;
 	for (it = _windowData->begin(); it != _windowData->end(); it++) {
-		if (it->bounds.contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
-			if (findWindow(it->refcon)->isActive())
+		win = findWindow(it->refcon);
+		if (win && win->getDimensions().contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
+			if (win->isActive())
 				return it->refcon;
 		}
 	}
@@ -1286,6 +1284,8 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
+		// TODO DELETE MEEEE!
+		debug("WindowFound: %d", ref);
 		if (ref == kNoWindow) return false;
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
@@ -1306,21 +1306,11 @@ void Gui::processCursorTick() {
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
 	handleDragRelease(pos, false, false);
-
-	// HACK For test, please delete me
-	//WindowReference destinationWindow = findWindowAtPoint(pos);
-	//_engine->handleObjectSelect(_draggedObj.id, destinationWindow, false, false);
-	//_draggedObj.id = 0;
 }
 
 void Gui::handleDoubleClick(Common::Point pos) {
 	debug("Double Click");
 	handleDragRelease(pos, false, true);
-
-	// HACK For test, please delete me
-	//WindowReference destinationWindow = findWindowAtPoint(pos);
-	//_engine->handleObjectSelect(_draggedObj.id, destinationWindow, false, true);
-	//_draggedObj.id = 0;
 }
 
 /* Ugly switches */


Commit: e32c126348df69d8ec15ef3b67d6250935325860
    https://github.com/scummvm/scummvm/commit/e32c126348df69d8ec15ef3b67d6250935325860
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Refactor asset load checking

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 415e02e..a313e3e 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -580,9 +580,7 @@ void Gui::drawMainGameWindow() {
 	_mainGameWindow->setDirty(true);
 
 	if (data.objRef > 0 && data.objRef < 2000) {
-		if (!_assets.contains(objRef)) {
-			_assets[objRef] = new ImageAsset(objRef, _graphics);
-		}
+		ensureAssetLoaded(objRef);
 
 		_assets[objRef]->blitInto(
 			_mainGameWindow->getSurface(),
@@ -665,10 +663,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
 		pos += Common::Point(border.leftOffset, border.topOffset);
-
-		if (!_assets.contains(child)) {
-			_assets[child] = new ImageAsset(child, _graphics);
-		}
+		ensureAssetLoaded(child);
 
 		_assets[child]->blitInto(
 			surface,
@@ -710,9 +705,7 @@ void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * sur
 
 void Gui::drawDraggedObject() {
 	if (_draggedObj.id != 0) {
-		if (!_assets.contains(_draggedObj.id))
-			_assets[_draggedObj.id] = new ImageAsset(_draggedObj.id, _graphics);
-
+		ensureAssetLoaded(_draggedObj.id);
 		ImageAsset *asset = _assets[_draggedObj.id];
 
 		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
@@ -953,21 +946,17 @@ bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rec
 }
 
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
-	if (_assets.contains(obj)) {
-		Common::Rect bounds = _engine->getObjBounds(obj);
-		Common::Rect intersection = bounds.findIntersectingRect(target);
-		// We translate it to the image's coord system
-		intersection = Common::Rect(
-			intersection.left - bounds.left,
-			intersection.top - bounds.top,
-			intersection.left - bounds.left + intersection.width(),
-			intersection.top - bounds.top + intersection.height());
-
-		if (_assets[obj]->isRectInside(intersection)) {
-			return true;
-		}
-	}
-	return false;
+	ensureAssetLoaded(obj);
+	Common::Rect bounds = _engine->getObjBounds(obj);
+	Common::Rect intersection = bounds.findIntersectingRect(target);
+	// We translate it to the image's coord system
+	intersection = Common::Rect(
+		intersection.left - bounds.left,
+		intersection.top - bounds.top,
+		intersection.left - bounds.left + intersection.width(),
+		intersection.top - bounds.top + intersection.height());
+
+	return _assets[obj]->isRectInside(intersection);
 }
 
 void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click) {
@@ -1142,9 +1131,7 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 }
 
 Common::Point Gui::getObjMeasures(ObjID obj) {
-	if (!_assets.contains(obj)) {
-		_assets[obj] = new ImageAsset(obj, _graphics);
-	}
+	ensureAssetLoaded(obj);
 	uint w = _assets[obj]->getWidth();
 	uint h = _assets[obj]->getHeight();
 	return Common::Point(w, h);
@@ -1313,6 +1300,12 @@ void Gui::handleDoubleClick(Common::Point pos) {
 	handleDragRelease(pos, false, true);
 }
 
+void Gui::ensureAssetLoaded(ObjID obj) {
+	if (!_assets.contains(obj)) {
+		_assets[obj] = new ImageAsset(obj, _graphics);
+	}
+}
+
 /* Ugly switches */
 
 BorderBounds Gui::borderBounds(MVWindowType type) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 65f2ec5..a448135 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -323,6 +323,8 @@ private: // Methods
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 	Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);
 
+	void ensureAssetLoaded(ObjID obj);
+
 };
 
 class Cursor {


Commit: dad1edcef0e5b95b0d4b09e97c2045a3b5ba61f3
    https://github.com/scummvm/scummvm/commit/dad1edcef0e5b95b0d4b09e97c2045a3b5ba61f3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:54:52+02:00

Commit Message:
MACVENTURE: Remove unnecesary window code

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index a313e3e..91df455 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -254,29 +254,7 @@ const Graphics::Font& Gui::getCurrentFont() {
 }
 
 void Gui::bringToFront(WindowReference winID) {
-	// FIXME: There has to be a better way to do this, maybe with the _wm
-	switch (winID) {
-	case MacVenture::kCommandsWindow:
-		_controlsWindow->setActive(true);
-		break;
-	case MacVenture::kMainGameWindow:
-		_mainGameWindow->setActive(true);
-		break;
-	case MacVenture::kOutConsoleWindow:
-		_outConsoleWindow->setActive(true);
-		break;
-	case MacVenture::kSelfWindow:
-		_selfWindow->setActive(true);
-		break;
-	case MacVenture::kExitsWindow:
-		_exitsWindow->setActive(true);
-		break;
-	case MacVenture::kDiplomaWindow:
-		_diplomaWindow->setActive(true);
-		break;
-	default:
-		break;
-	}
+	findWindow(winID)->setActive(true);
 }
 
 void Gui::setWindowTitle(WindowReference winID, Common::String string) {


Commit: 8162483026ec52476a1106e72259c84e5476fd2d
    https://github.com/scummvm/scummvm/commit/8162483026ec52476a1106e72259c84e5476fd2d
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:16+02:00

Commit Message:
MACVENTURE: Add text input logic

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 91df455..02f6036 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -460,7 +460,7 @@ bool Gui::loadWindows() {
 			data.title = Common::String(newTitle);
 		}
 
-		debug(4, "Window loaded: %s", data.title);
+		debug(4, "Window loaded: %s", data.title.c_str());
 
 		_windowData->push_back(data);
 	}
@@ -1163,7 +1163,6 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 			}
 		}
 
-
 		_engine->selectControl(data.getData().refcon);
 		_engine->activateCommand(data.getData().refcon);
 		_engine->refreshReady();
@@ -1178,7 +1177,6 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 
 	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
 		WindowData &data = findWindowData(kMainGameWindow);
-		ObjID child = 0;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
 		Common::Rect clickRect = calculateClickRect(event.mouse, _mainGameWindow->getDimensions());
@@ -1254,7 +1252,6 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		if (ref == kNoWindow) return false;
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
-		ObjID child;
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
 		Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 211ba43..b6db45c 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -370,11 +370,17 @@ void MacVentureEngine::updateWindow(WindowReference winID) {
 	_gui->updateWindow(winID, true);
 }
 
+bool MacVentureEngine::showTextEntry(ObjID text, ObjID srcObj, ObjID destObj) {
+	debug("Showing speech dialog, asset %d from %d to %d", text, srcObj, destObj);
+	_userInput = Common::String("epor");
+	warning("Show text entry: not fully implemented");
+	return true;
+}
+
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
 	return _globalSettings;
 }
 
-
 // Private engine methods
 void MacVentureEngine::processEvents() {
 	Common::Event event;
@@ -585,6 +591,10 @@ Common::String MacVentureEngine::getNoun(ObjID ndx) {
 	return _decodingIndirectArticles->getString(ndx);
 }
 
+Common::String MacVentureEngine::getUserInput() {
+	return _userInput;
+}
+
 void MacVentureEngine::highlightExit(ObjID objID) {
 	//ObjID ctl = _gui->getWinChild(obj);
 	/*if (ctl) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 735dda5..71c3cbe 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -71,27 +71,6 @@ enum {
 	kClickToContinueTextID = 0x84,
 	kStartGameFilenameID = 0x85
 };
-/*
-enum ControlAction {
-	kNoCommand = 0,
-	kStartOrResume = 1,
-	kClose = 2,
-	kTick = 3,
-	kActivateObject = 4,
-	kMoveObject = 5,
-	kConsume = 6,
-	kExamine = 7,
-	kGo = 8,
-	kHit = 9,
-	kOpen = 10,
-	kOperate = 11,
-	kSpeak = 12,
-	kBabble = 13,
-	kTargetName = 14,
-	kDebugObject = 15,
-	kClickToContinue = 16
-};
-*/
 
 enum FilePathID {
 	kMCVID = 1,
@@ -206,6 +185,8 @@ public:
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
 
+	bool showTextEntry(ObjID text, ObjID srcObj, ObjID destObj);
+
 	// Data retrieval
 	bool isPaused();
 	bool needsClickToContinue();
@@ -220,6 +201,7 @@ public:
 	uint getPrefixNdx(ObjID obj);
 	Common::String getPrefixString(uint flag, ObjID obj);
 	Common::String getNoun(ObjID ndx);
+	Common::String getUserInput();
 
 	// Attributes consult
 	Common::Point getObjPosition(ObjID objID);
@@ -317,6 +299,7 @@ private: // Attributes
 	Common::Array<ObjID> _currentSelection;
 	Common::Array<ObjID> _selectedObjs;
 	Common::Point _deltaPoint;
+	Common::String _userInput;
 
 };
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 5b86c31..794bbdd 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -1073,7 +1073,11 @@ void ScriptEngine::opd4RELC(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 	word txt = state->pop();
-	op00NOOP(0xd5);
+	if (_engine->showTextEntry(txt, frame->src, frame->dest)) {
+		state->push(0xFFFF);
+	} else {
+		state->push(0x0000);
+	}
 }
 
 void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 8aee88f..49b6987 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -27,21 +27,20 @@
 #include "macventure/world.h"
 
 namespace MacVenture {
-		
+
 class Container;
 class World;
 
-
 typedef uint32 ObjID;
 typedef int16 word;
 
 class ScriptAsset {
 public:
-	ScriptAsset(ObjID id, Container *container); 
+	ScriptAsset(ObjID id, Container *container);
 	~ScriptAsset() {}
 
 	void reset();
-	uint8 fetch(); 
+	uint8 fetch();
 	bool hasNext();
 	void branch(word amount);
 
@@ -66,7 +65,7 @@ public:
 	}
 
 	void push(word data) {
-		sp--;		
+		sp--;
 		stack[sp] = unneg16(data);
 	}
 
@@ -97,7 +96,7 @@ public:
 
 private:
 	word unneg16(word data) {
-		if (data < 0) 
+		if (data < 0)
 			data = ((-data) ^ 0xFFFF) + 1;
 
 		return data;
@@ -141,17 +140,17 @@ public:
 	~ScriptEngine();
 
 public:
-	bool runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta); 
-	bool resume(bool execAll); 
+	bool runControl(ControlAction action, ObjID source, ObjID destination, Common::Point delta);
+	bool resume(bool execAll);
 	void reset();
 
 private:
 	bool execFrame(bool execAll);
 	bool loadScript(EngineFrame * frame, uint32 scriptID);
-	bool resumeFunc(EngineFrame * frame); 
+	bool resumeFunc(EngineFrame * frame);
 	bool runFunc(EngineFrame * frame);
 
-private: 
+private:
 
 	// Aux
 	word neg16(word val);
@@ -208,7 +207,7 @@ private:
 	void opacEQ(EngineState *state, EngineFrame *frame);	//eq?
 	void opadEQS(EngineState *state, EngineFrame *frame);	//eq string?
 	void opaeCONT(EngineState *state, EngineFrame *frame);	//contains
-	void opafCONTW(EngineState *state, EngineFrame *frame); //contains word	
+	void opafCONTW(EngineState *state, EngineFrame *frame); //contains word
 
 	void opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bra
 	void opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *script);	//bra.b
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index ec20ba6..e247404 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -156,6 +156,9 @@ void World::releaseChildren(ObjID objID) {
 }
 
 Common::String World::getText(ObjID objID, ObjID source, ObjID target) {
+	if (objID & 0x8000){
+		return _engine->getUserInput();
+	}
 	TextAsset text = TextAsset(_engine, objID, source, target, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
 
 	return *text.decode();
@@ -169,7 +172,7 @@ bool World::isObjDraggable(ObjID objID) {
 }
 
 bool World::intersects(ObjID objID, Common::Rect rect) {
-	return _engine->getObjBounds(objID).intersects(rect);	
+	return _engine->getObjBounds(objID).intersects(rect);
 }
 
 bool World::loadStartGameFileName() {


Commit: 2a521bb22df9c5e5d477deb32ebc8b6a54e91fde
    https://github.com/scummvm/scummvm/commit/2a521bb22df9c5e5d477deb32ebc8b6a54e91fde
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Add dialog system

Changed paths:
  A engines/macventure/dialog.cpp
  A engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/module.mk



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
new file mode 100644
index 0000000..78fb942
--- /dev/null
+++ b/engines/macventure/dialog.cpp
@@ -0,0 +1,254 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "common/system.h"
+
+#include "macventure/dialog.h"
+
+namespace MacVenture {
+
+// Prebuilt dialogs
+
+enum {
+  // HACK
+  kMaxPrebuiltDialogElements = 10
+};
+
+struct PrebuiltDialog {
+  Common::Rect bounds;
+  PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
+};
+
+PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
+
+  {/* kSaveAsDialog */
+  Common::Rect(0, 146, 456, 254),
+  { {kDEButton, "YES", kDANone, Common::Point(24, 68), 120, 22},
+    {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
+    {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
+    {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
+    {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
+    {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}}
+  }
+
+};
+
+Dialog::Dialog(Gui *gui, Common::Point pos, uint width, uint height) :
+  _gui(gui), _bounds(Common::Rect(pos.x, pos.y, pos.x + width, pos.y + height)) {}
+
+Dialog::Dialog(Gui *gui, PrebuiltDialogs prebuilt) {
+  _gui = gui;
+  const PrebuiltDialog &dialog = prebuiltDialogs[prebuilt];
+  _bounds = dialog.bounds;
+  for (int i = 0; dialog.elements[i].type != kDEEnd; i++) {
+    addPrebuiltElement(dialog.elements[i]);
+  }
+}
+
+Dialog::~Dialog() {
+  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+    delete *it;
+  }
+}
+
+void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
+  switch(action) {
+  case kDACloseDialog:
+    _gui->closeDialog();
+    break;
+  }
+}
+
+const Graphics::Font& Dialog::getFont() {
+  return _gui->getCurrentFont();
+}
+
+bool Dialog::processEvent(Common::Event event) {
+  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+    if ((*it)->processEvent(this, event)) return true;
+  }
+}
+
+void Dialog::addButton(Common::String title, MacVenture::DialogAction action, Common::Point position, uint width, uint height)  {
+  _elements.push_back(new DialogButton(this, title, action, position, width, height));
+}
+
+void Dialog::addText(Common::String content, Common::Point position)  {
+  _elements.push_back(new DialogPlainText(this, content, position));
+}
+
+void Dialog::addTextInput(Common::Point position, int width, int height) {
+  _elements.push_back(new DialogTextInput(this, position, width, height));
+}
+
+void Dialog::draw()  {
+  Graphics::ManagedSurface compose;
+  // Compose the surface
+  compose.create(_bounds.width(), _bounds.height());
+  Common::Rect base(0, 0, _bounds.width(), _bounds.height());
+  compose.fillRect(base, kColorWhite);
+  compose.frameRect(base, kColorBlack);
+  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+    (*it)->draw(this, compose);
+  }
+
+  g_system->copyRectToScreen(compose.getPixels(), compose.pitch,
+    _bounds.left, _bounds.top, _bounds.width(), _bounds.height());
+}
+
+void Dialog::localize(Common::Point &point) {
+  point.x -= _bounds.left;
+  point.y -= _bounds.top;
+}
+
+void Dialog::setUserInput(Common::String content) {
+  _userInput = content;
+  debug(2, "Set user input: %s", _userInput.c_str());
+}
+
+void Dialog::addPrebuiltElement(const MacVenture::PrebuiltDialogElement &element) {
+  switch(element.type) {
+    case kDEButton:
+      addButton(element.title, element.action, element.position, element.width, element.height);
+      break;
+    case kDEPlainText:
+      addText(element.title, element.position);
+      break;
+    case kDETextInput:
+      addTextInput(element.position, element.width, element.height);
+      break;
+  }
+}
+
+// Dialog Element
+
+DialogElement::DialogElement(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width, uint height) :
+  _text(title), _action(action) {
+    if (width == 0) {
+      width = dialog->getFont().getStringWidth(title);
+    }
+    if (height == 0) {
+      height = dialog->getFont().getFontHeight();
+    }
+    _bounds = Common::Rect(position.x, position.y, position.x + width, position.y + height);
+  }
+
+bool DialogElement::processEvent(MacVenture::Dialog *dialog, Common::Event event)  {
+  // HACK for test, please delete me
+  Common::Point mouse = event.mouse;
+  dialog->localize(mouse);
+  if (_bounds.contains(mouse)) debug(1, "Hovering over: %s", _text.c_str());
+
+  return doProcessEvent(dialog, event);
+}
+
+void DialogElement::draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
+  doDraw(dialog, target);
+}
+
+const Common::String& DialogElement::getText() {
+  return doGetText();
+}
+
+const Common::String& DialogElement::doGetText() {
+  return _text;
+}
+
+// CONCRETE DIALOG ELEMENTS
+
+DialogButton::DialogButton(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width, uint height):
+  DialogElement(dialog, title, action, position, width, height) {}
+
+bool DialogButton::doProcessEvent(MacVenture::Dialog *dialog, Common::Event event) {
+  Common::Point mouse = event.mouse;
+  if (event.type == Common::EVENT_LBUTTONDOWN) {
+    dialog->localize(mouse);
+    if (_bounds.contains(mouse)) {
+      debug(1, "Click! Button: %s", _text.c_str());
+      dialog->handleDialogAction(this, _action);
+      return true;
+    }
+  }
+  return false;
+}
+
+void DialogButton::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
+  target.fillRect(_bounds, kColorWhite);
+  target.frameRect(_bounds, kColorBlack);
+  // Draw title
+  dialog->getFont().drawString(
+    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
+}
+
+DialogPlainText::DialogPlainText(Dialog *dialog, Common::String content, Common::Point position) :
+  DialogElement(dialog, content, kDANone, position, 0, 0) { }
+
+DialogPlainText::~DialogPlainText() {}
+
+bool DialogPlainText::doProcessEvent(MacVenture::Dialog *dialog, Common::Event event) {
+  return false;
+}
+
+void DialogPlainText::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
+  // Draw contents
+  dialog->getFont().drawString(
+    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
+
+}
+
+DialogTextInput::DialogTextInput(Dialog *dialog, Common::Point position, uint width, uint height) :
+  DialogElement(dialog, "", kDANone, position, width, height) {}
+DialogTextInput::~DialogTextInput() {}
+
+bool DialogTextInput::doProcessEvent(Dialog *dialog, Common::Event event) {
+  if (event.type == Common::EVENT_KEYDOWN) {
+    switch (event.kbd.keycode) {
+			case Common::KEYCODE_BACKSPACE:
+				if (!_text.empty()) {
+					_text.deleteLastChar();
+          dialog->setUserInput(_text);
+          return true;
+				}
+				break;
+
+			default:
+				if (event.kbd.ascii >= 0x20 && event.kbd.ascii <= 0x7f) {
+					_text += (char)event.kbd.ascii;
+          dialog->setUserInput(_text);
+          return true;
+				}
+
+				break;
+    }
+  }
+  return false;
+}
+void DialogTextInput::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
+  target.fillRect(_bounds, kColorWhite);
+  target.frameRect(_bounds, kColorBlack);
+  dialog->getFont().drawString(
+    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
+}
+
+
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
new file mode 100644
index 0000000..fa17432
--- /dev/null
+++ b/engines/macventure/dialog.h
@@ -0,0 +1,146 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_DIALOG_H
+#define MACVENTURE_DIALOG_H
+
+#include "graphics/macgui/macwindowmanager.h"
+
+#include "macventure/macventure.h"
+#include "macventure/gui.h"
+
+namespace MacVenture {
+
+using namespace Graphics::MacGUIConstants;
+class Gui;
+
+class DialogElement;
+
+enum DialogAction {
+  kDANone,
+  kDACloseDialog
+};
+
+enum PrebuiltDialogs {
+  kSaveAsDialog = 0,
+  kPrebuiltDialogCount
+};
+
+enum PrebuiltElementType {
+  kDEPlainText,
+  kDEButton,
+  kDETextInput,
+  kDEEnd
+};
+
+struct PrebuiltDialogElement {
+  PrebuiltElementType type;
+  Common::String title;
+  DialogAction action;
+  Common::Point position;
+  uint width;
+  uint height;
+};
+
+class Dialog {
+public:
+	Dialog(Gui *gui, Common::Point pos, uint width, uint height);
+  Dialog(Gui *gui, PrebuiltDialogs prebuilt);
+
+	~Dialog();
+
+  bool processEvent(Common::Event event);
+  void draw();
+  void localize(Common::Point &point);
+  void handleDialogAction(DialogElement *trigger, DialogAction action);
+
+  const Graphics::Font& getFont();
+
+  void addButton(Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+  void addText(Common::String content, Common::Point position);
+  void addTextInput(Common::Point position, int width, int height);
+
+  void setUserInput(Common::String content);
+
+private:
+  void addPrebuiltElement(const PrebuiltDialogElement &element);
+
+private:
+  Gui *_gui;
+
+  Common::String _userInput;
+  Common::Array<DialogElement*> _elements;
+  Common::Rect _bounds;
+};
+
+class DialogElement {
+public:
+  DialogElement(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+  virtual ~DialogElement() {}
+
+  bool processEvent(Dialog *dialog, Common::Event event);
+  void draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+  const Common::String& getText();
+
+private:
+  virtual bool doProcessEvent(Dialog *dialog, Common::Event event) = 0;
+  virtual void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) = 0;
+  virtual const Common::String& doGetText();
+
+protected:
+  Common::String _text;
+  Common::Rect _bounds;
+  DialogAction _action;
+};
+
+// Dialog elements
+class DialogButton : public DialogElement {
+public:
+  DialogButton(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+  ~DialogButton() {}
+
+private:
+  bool doProcessEvent(Dialog *dialog, Common::Event event);
+  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+};
+
+class DialogPlainText : public DialogElement {
+public:
+  DialogPlainText(Dialog *dialog, Common::String content, Common::Point position);
+  ~DialogPlainText();
+private:
+  bool doProcessEvent(Dialog *dialog, Common::Event event);
+  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+};
+
+class DialogTextInput : public DialogElement {
+public:
+  DialogTextInput(Dialog *dialog, Common::Point position, uint width, uint height);
+  ~DialogTextInput();
+private:
+  bool doProcessEvent(Dialog *dialog, Common::Event event);
+  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 02f6036..4b01f8b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -112,6 +112,7 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_controlData = nullptr;
 	_draggedObj.id = 0;
 	_draggedObj.pos = Common::Point(0, 0);
+	_dialog = nullptr;
 
 	_cursor = new Cursor(this);
 	g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 500000, this, "macVentureCursor");
@@ -138,6 +139,9 @@ Gui::~Gui() {
 	if (_consoleText)
 		delete _consoleText;
 
+	if (_dialog)
+		delete _dialog;
+
 	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
 	for (; it != _assets.end(); it++) {
 		delete it->_value;
@@ -181,7 +185,7 @@ void Gui::draw() {
 	_wm.draw();
 
 	drawDraggedObject();
-
+	drawDialog();
 	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
@@ -703,6 +707,10 @@ void Gui::drawDraggedObject() {
 	}
 }
 
+void Gui::drawDialog() {
+	if (_dialog) _dialog->draw();
+}
+
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
 	if (winID == kNoWindow) return;
 	if (winID == kSelfWindow || containerOpen) {
@@ -794,6 +802,11 @@ void Gui::printText(const Common::String & text) {
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
+void Gui::closeDialog() {
+	delete _dialog;
+	_dialog = nullptr;
+}
+
 void Gui::moveDraggedObject(Common::Point target) {
 	Common::Point newPos = target + _draggedObj.mouseOffset;
 	bool movement = false;
@@ -1006,6 +1019,8 @@ void Gui::handleMenuAction(MenuAction action) {
 		break;
 	case MacVenture::kMenuActionSaveAs:
 		debug("MacVenture Menu Action: Save As");
+		// HACK this should be wrapped in a function
+		_dialog = new Dialog(this, kSaveAsDialog);
 		break;
 	case MacVenture::kMenuActionQuit:
 		debug("MacVenture Menu Action: Quit");
@@ -1120,6 +1135,8 @@ bool Gui::processEvent(Common::Event &event) {
 
 	processed |= _cursor->processEvent(event);
 
+	if (_dialog && _dialog->processEvent(event)) return true;
+
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
 			moveDraggedObject(event.mouse);
@@ -1247,8 +1264,6 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
-		// TODO DELETE MEEEE!
-		debug("WindowFound: %d", ref);
 		if (ref == kNoWindow) return false;
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
@@ -1267,11 +1282,14 @@ void Gui::processCursorTick() {
 
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
+	// HACK
+	if (_dialog) return;
 	handleDragRelease(pos, false, false);
 }
 
 void Gui::handleDoubleClick(Common::Point pos) {
 	debug("Double Click");
+	if (_dialog) return;
 	handleDragRelease(pos, false, true);
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index a448135..046e7e5 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -31,6 +31,7 @@
 
 #include "macventure/container.h"
 #include "macventure/image.h"
+#include "macventure/dialog.h"
 
 namespace MacVenture {
 
@@ -43,6 +44,7 @@ class Cursor;
 class ConsoleText;
 class CommandButton;
 class ImageAsset;
+class Dialog;
 
 enum MenuAction {
 	kMenuActionAbout,
@@ -244,6 +246,7 @@ public:
 	void updateExit(ObjID id);
 
 	void printText(const Common::String &text);
+	void closeDialog();
 
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
@@ -268,6 +271,7 @@ private: // Attributes
 	Graphics::MacWindow *_diplomaWindow;
 	Common::Array<Graphics::MacWindow*> _inventoryWindows;
 	Graphics::Menu *_menu;
+	Dialog *_dialog;
 
 	Container *_graphics;
 	Common::HashMap<ObjID, ImageAsset*> _assets;
@@ -305,6 +309,7 @@ private: // Methods
 	void drawDraggedObject();
 	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
+	void drawDialog();
 
 	void moveDraggedObject(Common::Point target);
 
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 21986e3..cbe3cc9 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -100,7 +100,7 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 	_bitWidth = w;
 	_bitHeight = h;
 
-	for (uint i = 0; i < _rowBytes * h; i++) {
+	for (int i = 0; i < _rowBytes * h; i++) {
 		data.push_back(0);
 	}
 
@@ -141,22 +141,7 @@ void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &da
 			data[p] = v & 0xff; p++;
 		}
 	}
-	/*
-	for (var i=0;i<words;i++)
-		{
-			v=ppic.peek32(); ppic.seek(2,ppic.cur);
-			v>>>=16-ppic.bit;
-			bitmap.data[p++]=(v>>8)&0xff;
-			bitmap.data[p++]=v&0xff;
-		}
-		if (bytes)
-		{
-			v=ppic.bits(bytes);
-			v<<=16-bytes;
-			bitmap.data[p++]=(v>>8)&0xff;
-			bitmap.data[p++]=v&0xff;
-		}
-		*/
+
 }
 
 void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data) {
@@ -186,7 +171,7 @@ void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &da
 			if (huff.symbols[j] >= huff.symbols[i - 1])
 				huff.symbols[j]++;
 
-	for (uint i = 0x10; i >= 0; i--) {
+	for (int i = 0x10; i >= 0; i--) {
 		if (huff.symbols[i] == 0x10) {
 			huff.symbols[i] = 0xff;
 			break;
@@ -297,7 +282,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		if (flags & 2) delta *= 2;
 		pos = 0;
 		uint q = delta;
-		for (uint i = 0;i < _bitHeight * _rowBytes - delta;i++) {
+		for (int i = 0; i < _bitHeight * _rowBytes - delta; i++) {
 			data[q] ^= data[pos];
 			q++;
 			pos++;
@@ -390,10 +375,10 @@ bool ImageAsset::isRectInside(Common::Rect rect) {
 	// HACK is it &&, or ||?
 	if (_maskData.empty()) return (rect.width() > 0 && rect.height() > 0);
 
-	for (uint y = rect.top; y < rect.top + rect.height(); y++) {
+	for (int y = rect.top; y < rect.top + rect.height(); y++) {
 		uint bmpofs = y * _rowBytes;
 		byte pix;
-		for (uint x = rect.left; x < rect.left + rect.width(); x++) {
+		for (int x = rect.left; x < rect.left + rect.width(); x++) {
 			pix = _maskData[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			if (pix) return true;
 		}
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 022b8d7..813677c 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -8,7 +8,8 @@ MODULE_OBJS := \
 	text.o \
 	world.o \
 	script.o \
-	macventure.o
+	macventure.o \
+	dialog.o
 
 MODULE_DIRS += \
 	engines/macventure


Commit: 734b453c86bb20b2cb52c4f695f8a770b97be459
    https://github.com/scummvm/scummvm/commit/734b453c86bb20b2cb52c4f695f8a770b97be459
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Add text input dialog

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 78fb942..3a09fef 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -41,13 +41,26 @@ struct PrebuiltDialog {
 PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
 
   {/* kSaveAsDialog */
-  Common::Rect(0, 146, 456, 254),
-  { {kDEButton, "YES", kDANone, Common::Point(24, 68), 120, 22},
-    {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
-    {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
-    {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
-    {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
-    {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}}
+    Common::Rect(0, 146, 456, 254),
+    {
+      {kDEButton, "YES", kDANone, Common::Point(24, 68), 120, 22},
+      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
+      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
+      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
+  },
+
+  { /* kSpeakDialog */
+    Common::Rect(20, 92, 400, 200),
+    {
+      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
+      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
+      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
   }
 
 };
@@ -75,6 +88,10 @@ void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
   case kDACloseDialog:
     _gui->closeDialog();
     break;
+  case kDASubmit:
+    _gui->setTextInput(_userInput);
+    _gui->closeDialog();
+    break;
   }
 }
 
@@ -122,7 +139,6 @@ void Dialog::localize(Common::Point &point) {
 
 void Dialog::setUserInput(Common::String content) {
   _userInput = content;
-  debug(2, "Set user input: %s", _userInput.c_str());
 }
 
 void Dialog::addPrebuiltElement(const MacVenture::PrebuiltDialogElement &element) {
@@ -211,7 +227,7 @@ bool DialogPlainText::doProcessEvent(MacVenture::Dialog *dialog, Common::Event e
 void DialogPlainText::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
   // Draw contents
   dialog->getFont().drawString(
-    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
+    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
 
 }
 
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index fa17432..1dbebf7 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -37,11 +37,13 @@ class DialogElement;
 
 enum DialogAction {
   kDANone,
-  kDACloseDialog
+  kDACloseDialog,
+  kDASubmit
 };
 
 enum PrebuiltDialogs {
   kSaveAsDialog = 0,
+  kSpeakDialog = 1,
   kPrebuiltDialogCount
 };
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 4b01f8b..d8deb4b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -31,6 +31,8 @@
 
 namespace MacVenture {
 
+#define MACVENTURE_DEBUG_GUI true
+
 enum MenuAction;
 
 enum {
@@ -333,8 +335,8 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
-	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -658,11 +660,9 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 				surface, pos.x, pos.y, kBlitOR);
 
 		// For test
-		surface->frameRect(Common::Rect(
-			pos.x,
-			pos.y,
-			pos.x + _assets[child]->getWidth() + 1,
-			pos.y + _assets[child]->getHeight() + 1), kColorGreen);
+		if (MACVENTURE_DEBUG_GUI) {
+			surface->frameRect(_engine->getObjBounds(child), kColorGreen);
+		}
 
 	}
 }
@@ -802,11 +802,25 @@ void Gui::printText(const Common::String & text) {
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
+void Gui::setTextInput(Common::String str) {
+	_engine->setTextInput(str);
+}
+
 void Gui::closeDialog() {
 	delete _dialog;
 	_dialog = nullptr;
 }
 
+void Gui::getTextFromUser() {
+	if (_dialog) {
+		delete _dialog;
+	}
+	_dialog = new Dialog(this, kSpeakDialog);
+	// Hack to pause the engine
+	_engine->clickToContinue();
+}
+
+
 void Gui::moveDraggedObject(Common::Point target) {
 	Common::Point newPos = target + _draggedObj.mouseOffset;
 	bool movement = false;
@@ -1125,8 +1139,8 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 
 Common::Point Gui::getObjMeasures(ObjID obj) {
 	ensureAssetLoaded(obj);
-	uint w = _assets[obj]->getWidth();
-	uint h = _assets[obj]->getHeight();
+ 	int w = MAX(0, (int)_assets[obj]->getWidth());
+	int h = MAX(0, (int)_assets[obj]->getHeight());
 	return Common::Point(w, h);
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 046e7e5..f800aeb 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -246,6 +246,9 @@ public:
 	void updateExit(ObjID id);
 
 	void printText(const Common::String &text);
+
+	void getTextFromUser();
+	void setTextInput(Common::String str);
 	void closeDialog();
 
 	// Ugly switches
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b6db45c..1fca428 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -372,11 +372,25 @@ void MacVentureEngine::updateWindow(WindowReference winID) {
 
 bool MacVentureEngine::showTextEntry(ObjID text, ObjID srcObj, ObjID destObj) {
 	debug("Showing speech dialog, asset %d from %d to %d", text, srcObj, destObj);
-	_userInput = Common::String("epor");
-	warning("Show text entry: not fully implemented");
+	_gui->getTextFromUser();
+
+	// HACK WITH FLAGS
+	_prepared = false;
+	warning("Show text entry: not fully tested");
 	return true;
 }
 
+void MacVentureEngine::setTextInput(Common::String content) {
+	// HACK WITH FLAGS
+	_prepared = true;
+	_userInput = content;
+	_clickToContinue = false;
+}
+
+Common::String MacVentureEngine::getUserInput() {
+	return _userInput;
+}
+
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
 	return _globalSettings;
 }
@@ -591,10 +605,6 @@ Common::String MacVentureEngine::getNoun(ObjID ndx) {
 	return _decodingIndirectArticles->getString(ndx);
 }
 
-Common::String MacVentureEngine::getUserInput() {
-	return _userInput;
-}
-
 void MacVentureEngine::highlightExit(ObjID objID) {
 	//ObjID ctl = _gui->getWinChild(obj);
 	/*if (ctl) {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 71c3cbe..f6a3ea6 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -186,6 +186,8 @@ public:
 	void updateWindow(WindowReference winID);
 
 	bool showTextEntry(ObjID text, ObjID srcObj, ObjID destObj);
+	void setTextInput(Common::String content);
+	Common::String getUserInput();
 
 	// Data retrieval
 	bool isPaused();
@@ -201,7 +203,6 @@ public:
 	uint getPrefixNdx(ObjID obj);
 	Common::String getPrefixString(uint flag, ObjID obj);
 	Common::String getNoun(ObjID ndx);
-	Common::String getUserInput();
 
 	// Attributes consult
 	Common::Point getObjPosition(ObjID objID);
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 794bbdd..fdb470c 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -32,6 +32,7 @@ namespace MacVenture {
 ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
 	_engine = engine;
 	_world = world;
+	// HACK
 	_scripts = new Container("Shadowgate II/Shadow Filter");
 }
 


Commit: a06f291280e0897beed18e63e269938dfa45ccef
    https://github.com/scummvm/scummvm/commit/a06f291280e0897beed18e63e269938dfa45ccef
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Add basic game save/load feature

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 3a09fef..ba489d4 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -43,7 +43,7 @@ PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
   {/* kSaveAsDialog */
     Common::Rect(0, 146, 456, 254),
     {
-      {kDEButton, "YES", kDANone, Common::Point(24, 68), 120, 22},
+      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
       {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
       {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
       {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
@@ -92,6 +92,10 @@ void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
     _gui->setTextInput(_userInput);
     _gui->closeDialog();
     break;
+  case kDASaveAs:
+    _gui->saveInto(0);
+    _gui->closeDialog();
+    break;
   }
 }
 
@@ -169,11 +173,6 @@ DialogElement::DialogElement(Dialog *dialog, Common::String title, DialogAction
   }
 
 bool DialogElement::processEvent(MacVenture::Dialog *dialog, Common::Event event)  {
-  // HACK for test, please delete me
-  Common::Point mouse = event.mouse;
-  dialog->localize(mouse);
-  if (_bounds.contains(mouse)) debug(1, "Hovering over: %s", _text.c_str());
-
   return doProcessEvent(dialog, event);
 }
 
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index 1dbebf7..e773956 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -38,7 +38,8 @@ class DialogElement;
 enum DialogAction {
   kDANone,
   kDACloseDialog,
-  kDASubmit
+  kDASubmit,
+  kDASaveAs
 };
 
 enum PrebuiltDialogs {
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d8deb4b..6c9ccf6 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -335,8 +335,8 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
-	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -686,13 +686,12 @@ void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * sur
 }
 
 void Gui::drawDraggedObject() {
-	if (_draggedObj.id != 0) {
+	if (_draggedObj.id != 0 &&
+			_engine->isObjVisible(_draggedObj.id)) {
 		ensureAssetLoaded(_draggedObj.id);
 		ImageAsset *asset = _assets[_draggedObj.id];
 
 		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
-		_screen.copyRectToSurface(_draggedSurface, _draggedObj.pos.x, _draggedObj.pos.y,
-			Common::Rect(asset->getWidth() - 1, asset->getHeight() - 1));
 
 		asset->blitInto(&_draggedSurface, 0, 0, kBlitBIC);
 
@@ -820,6 +819,14 @@ void Gui::getTextFromUser() {
 	_engine->clickToContinue();
 }
 
+void Gui::loadGame(int slot) {
+	_engine->loadGameState(slot);
+}
+
+void Gui::saveInto(int slot) {
+	_engine->saveGameState(slot, "desc");
+	_engine->preparedToRun();
+}
 
 void Gui::moveDraggedObject(Common::Point target) {
 	Common::Point newPos = target + _draggedObj.mouseOffset;
@@ -857,9 +864,11 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
 	Graphics::MacWindow *win;
 	for (it = _windowData->begin(); it != _windowData->end(); it++) {
 		win = findWindow(it->refcon);
-		if (win && win->getDimensions().contains(point) && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
-			if (win->isActive())
-				return it->refcon;
+		if (win && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
+			if (win->getDimensions().contains(point)) {
+				if (win->isActive())
+					return it->refcon;
+			}
 		}
 	}
 	return kNoWindow;
@@ -869,6 +878,7 @@ Common::Point Gui::getWindowSurfacePos(WindowReference reference) {
 	const WindowData &data = getWindowData(reference);
 	BorderBounds border = borderBounds(data.type);
 	Graphics::MacWindow *win = findWindow(reference);
+	if (!win) return Common::Point(0, 0);
 	return Common::Point(win->getDimensions().left + border.leftOffset, win->getDimensions().top + border.topOffset);
 }
 
@@ -976,9 +986,9 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point cli
 }
 
 void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
-	WindowReference destinationWindow = findWindowAtPoint(pos);
-	if (destinationWindow == kNoWindow) return;
 	if (_draggedObj.id != 0) {
+		WindowReference destinationWindow = findWindowAtPoint(pos);
+		if (destinationWindow == kNoWindow) return;
 		if (_draggedObj.hasMoved) {
 			ObjID destObject = getWindowData(destinationWindow).objRef;
 			pos -= (_draggedObj.startPos - _draggedObj.mouseOffset);
@@ -1027,9 +1037,11 @@ void Gui::handleMenuAction(MenuAction action) {
 		break;
 	case MacVenture::kMenuActionOpen:
 		debug("MacVenture Menu Action: Open");
+		loadGame(0);
 		break;
 	case MacVenture::kMenuActionSave:
 		debug("MacVenture Menu Action: Save");
+		saveInto(0);
 		break;
 	case MacVenture::kMenuActionSaveAs:
 		debug("MacVenture Menu Action: Save As");
@@ -1139,8 +1151,8 @@ bool Gui::tryCloseWindow(WindowReference winID) {
 
 Common::Point Gui::getObjMeasures(ObjID obj) {
 	ensureAssetLoaded(obj);
- 	int w = MAX(0, (int)_assets[obj]->getWidth());
-	int h = MAX(0, (int)_assets[obj]->getHeight());
+ 	int w = _assets[obj]->getWidth();
+	int h = _assets[obj]->getHeight();
 	return Common::Point(w, h);
 }
 
@@ -1296,7 +1308,7 @@ void Gui::processCursorTick() {
 
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
-	// HACK
+	// HACK THERE HAS TO BE A MORE ELEGANT WAY
 	if (_dialog) return;
 	handleDragRelease(pos, false, false);
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index f800aeb..b03ca2a 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -247,10 +247,14 @@ public:
 
 	void printText(const Common::String &text);
 
+	//Dialog interactions
 	void getTextFromUser();
 	void setTextInput(Common::String str);
 	void closeDialog();
 
+	void loadGame(int slot);
+	void saveInto(int slot);
+
 	// Ugly switches
 	BorderBounds borderBounds(MVWindowType type);
 
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index cbe3cc9..fa281eb 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -387,11 +387,11 @@ bool ImageAsset::isRectInside(Common::Rect rect) {
 }
 
 uint ImageAsset::getWidth() {
-	return _bitWidth;
+	return MAX(0, (int)_bitWidth);
 }
 
 uint ImageAsset::getHeight() {
-	return _bitHeight;
+	return MAX(0, (int)_bitHeight);
 }
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 1fca428..9b764d9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -82,7 +82,6 @@ Common::Error MacVentureEngine::run() {
 	// Additional setup.
 	debug("MacVentureEngine::init");
 
-
 	_resourceManager = new Common::MacResManager();
 	if (!_resourceManager->open(getGameFileName()))
 		error("Could not open %s as a resource fork", getGameFileName());
@@ -113,7 +112,6 @@ Common::Error MacVentureEngine::run() {
 	_destObject = 0;
 	_prepared = true;
 
-	//if !savegame
 	_cmdReady = true;
 	_selectedControl = kStartOrResume;
 	ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
@@ -162,6 +160,42 @@ Common::Error MacVentureEngine::run() {
 	return Common::kNoError;
 }
 
+Common::Error MacVentureEngine::loadGameState(int slot) {
+	Common::InSaveFile *file = getSaveFileManager()->openForLoading("Shadowgate.1");
+	_world->loadGameFrom(file);
+	reset();
+	return Common::kNoError;
+}
+
+Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc) {
+	Common::SaveFileManager *manager = getSaveFileManager();
+	// HACK Get a real name!
+	Common::OutSaveFile *file = manager->openForSaving("Shadowgate.1");
+	_world->saveGameInto(file);
+	delete file;
+}
+
+void MacVentureEngine::reset() {
+	resetInternals();
+	resetGui();
+}
+
+void MacVentureEngine::resetInternals() {
+	_scriptEngine->reset();
+	_currentSelection.clear();
+	_selectedObjs.clear();
+	_objQueue.clear();
+	_textQueue.clear();
+}
+
+void MacVentureEngine::resetGui() {
+	_gui->updateWindowInfo(kMainGameWindow, getParent(1), _world->getChildren(getParent(1), true));
+	// HACK! should update all inventories
+	_gui->updateWindowInfo(kInventoryStart, 1, _world->getChildren(1, true));
+	_gui->updateWindowInfo(kExitsWindow, getParent(1), _world->getChildren(getParent(1), true));
+}
+
+
 void MacVentureEngine::requestQuit() {
 	// TODO: Display save game dialog and such
 	_gameState = kGameStateQuitting;
@@ -391,6 +425,20 @@ Common::String MacVentureEngine::getUserInput() {
 	return _userInput;
 }
 
+
+Common::String MacVentureEngine::getStartGameFileName() {
+	Common::SeekableReadStream *res;
+	res = _resourceManager->getResource(MKTAG('S', 'T', 'R', ' '), kStartGameFilenameID);
+	if (!res)
+		return "";
+
+	byte length = res->readByte();
+	char *fileName = new char[length + 1];
+	res->read(fileName, length);
+	fileName[length] = '\0';
+  return Common::String(fileName, length);
+}
+
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
 	return _globalSettings;
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index f6a3ea6..167abcc 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -24,10 +24,13 @@
 #define MACVENTURE_H
 
 #include "engines/engine.h"
+#include "common/scummsys.h"
+#include "common/system.h"
 #include "common/debug.h"
 #include "common/random.h"
 #include "common/macresman.h"
 #include "common/huffman.h"
+#include "common/savefile.h"
 
 #include "gui/debugger.h"
 
@@ -41,6 +44,8 @@ struct ADGameDescription;
 
 namespace MacVenture {
 
+class SaveFileManager;
+
 class Console;
 class World;
 class ScriptEngine;
@@ -158,6 +163,12 @@ public:
 	~MacVentureEngine();
 
 	virtual Common::Error run();
+	virtual Common::Error loadGameState(int slot);
+	virtual Common::Error saveGameState(int slot, const Common::String &desc);
+
+	void reset();
+	void resetInternals();
+	void resetGui();
 
 	void requestQuit();
 	void requestUnpause();
@@ -189,7 +200,9 @@ public:
 	void setTextInput(Common::String content);
 	Common::String getUserInput();
 
+
 	// Data retrieval
+	Common::String getStartGameFileName();
 	bool isPaused();
 	bool needsClickToContinue();
 	Common::String getCommandsPausedString() const;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index e247404..cf13b78 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -9,7 +9,7 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_resourceManager = resMan;
 	_engine = engine;
 
-	if (!loadStartGameFileName())
+	if ((_startGameFileName = _engine->getStartGameFileName()) == "")
 		error("Could not load initial game configuration");
 
 	Common::File saveGameFile;
@@ -150,9 +150,11 @@ void World::updateObj(ObjID objID) {
 }
 
 void World::captureChildren(ObjID objID) {
+	warning("Capture children unimplemented!");
 }
 
 void World::releaseChildren(ObjID objID) {
+	warning("Release children unimplemented!");
 }
 
 Common::String World::getText(ObjID objID, ObjID source, ObjID target) {
@@ -175,23 +177,8 @@ bool World::intersects(ObjID objID, Common::Rect rect) {
 	return _engine->getObjBounds(objID).intersects(rect);
 }
 
-bool World::loadStartGameFileName() {
-	Common::SeekableReadStream *res;
-
-	res = _resourceManager->getResource(MKTAG('S', 'T', 'R', ' '), kStartGameFilenameID);
-	if (!res)
-		return false;
-
-	byte length = res->readByte();
-	char *fileName = new char[length + 1];
-	res->read(fileName, length);
-	fileName[length] = '\0';
-	_startGameFileName = Common::String(fileName, length);
-
-	return true;
-}
-
 void World::calculateObjectRelations() {
+	_relations.clear();
 	ObjID val, next;
 	uint32 numObjs = _engine->getGlobalSettings().numObjects;
 	const AttributeGroup &parents = *_saveGame->getGroup(0);
@@ -228,6 +215,16 @@ void World::setParent(ObjID child, ObjID newParent) {
 	_relations[oldNdx] = child;
 }
 
+void World::loadGameFrom(Common::InSaveFile *file) {
+	if (_saveGame) delete _saveGame;
+	_saveGame = new SaveGame(_engine, file);
+	calculateObjectRelations();
+}
+
+void World::saveGameInto(Common::OutSaveFile *file) {
+	_saveGame->saveInto(file);
+}
+
 // SaveGame
 SaveGame::SaveGame(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	_groups = Common::Array<AttributeGroup>();
@@ -263,14 +260,34 @@ void SaveGame::setGlobal(uint32 attrID, Attribute value) {
 	_globals[attrID] = value;
 }
 
-const Common::Array<uint16>& MacVenture::SaveGame::getGlobals() {
+const Common::Array<uint16>& SaveGame::getGlobals() {
 	return _globals;
 }
 
-const Common::String & MacVenture::SaveGame::getText() {
+const Common::String & SaveGame::getText() {
 	return _text;
 }
 
+void SaveGame::saveInto(Common::OutSaveFile *file) {
+	warning("Saving the game not yet tested!");
+	// Save attibutes
+	Common::Array<AttributeGroup>::const_iterator itg;
+	for(itg = _groups.begin(); itg != _groups.end(); itg++) {
+		Common::Array<Attribute>::const_iterator ita;
+		for (ita = itg->begin(); ita != itg->end(); ita++) {
+			file->writeUint16BE((*ita));
+		}
+	}
+	// Save globals
+	Common::Array<uint16>::const_iterator global;
+	for (global = _globals.begin(); global != _globals.end(); global++) {
+		file->writeUint16BE((*global));
+	}
+	// Save text
+	_text = "Hello";
+	file->write(_text.c_str(), _text.size());
+}
+
 void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream * res) {
 	GlobalSettings settings = engine->getGlobalSettings();
 	for (int i = 0; i < settings.numGroups; ++i) {
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index c023c70..f3933c5 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -74,6 +74,8 @@ public:
 	const AttributeGroup *getGroup(uint32 groupID);
 	const Common::String &getText();
 
+	void saveInto(Common::OutSaveFile *file);
+
 private:
 	void loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *res);
 	void loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream *res);
@@ -90,7 +92,6 @@ public:
 	World(MacVentureEngine *engine, Common::MacResManager *resMan);
 	~World();
 
-	
 	void setObjAttr(ObjID objID, uint32 attrID, Attribute value);
 	void setGlobal(uint32 attrID, Attribute value);
 	void updateObj(ObjID objID);
@@ -105,13 +106,15 @@ public:
 
 	ObjID getAncestor(ObjID objID);
 	Common::Array<ObjID> getFamily(ObjID objID, bool recursive);
-	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);	
+	Common::Array<ObjID> getChildren(ObjID objID, bool recursive);
+
+	void loadGameFrom(Common::InSaveFile *file);
+	void saveGameInto(Common::OutSaveFile *file);
 
 private:
 	bool isObjDraggable(ObjID objID);
 	bool intersects(ObjID objID, Common::Rect rect);
 
-	bool loadStartGameFileName();
 	void calculateObjectRelations();
 	void setParent(ObjID child, ObjID newParent);
 
@@ -119,7 +122,7 @@ private:
 	MacVentureEngine *_engine;
 	Common::MacResManager *_resourceManager;
 
-	Common::String _startGameFileName;	
+	Common::String _startGameFileName;
 
 	SaveGame *_saveGame;
 
@@ -132,4 +135,3 @@ private:
 } // End of namespace MacVenture
 
 #endif
-


Commit: 33ed84ff74fabac68d0900223e82c2717927ef2f
    https://github.com/scummvm/scummvm/commit/33ed84ff74fabac68d0900223e82c2717927ef2f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Fix small render error

Changed paths:
    engines/macventure/image.cpp
    engines/macventure/image.h



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index fa281eb..feb4d2e 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -386,11 +386,13 @@ bool ImageAsset::isRectInside(Common::Rect rect) {
 	return false;
 }
 
-uint ImageAsset::getWidth() {
+int ImageAsset::getWidth() {
+	if (_imgData.size() == 0) return 0;
 	return MAX(0, (int)_bitWidth);
 }
 
-uint ImageAsset::getHeight() {
+int ImageAsset::getHeight() {
+	if (_imgData.size() == 0) return 0;
 	return MAX(0, (int)_bitHeight);
 }
 
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 5cbe146..b529109 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -55,7 +55,7 @@ struct PPICHuff {
 
 class ImageAsset {
 public:
-	ImageAsset(ObjID original, Container *container); 
+	ImageAsset(ObjID original, Container *container);
 	~ImageAsset();
 
 	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
@@ -63,8 +63,8 @@ public:
 	bool isPointInside(Common::Point point);
 	bool isRectInside(Common::Rect rect);
 
-	uint getWidth();
-	uint getHeight();
+	int getWidth();
+	int getHeight();
 
 private:
 	void decodePPIC(ObjID id, Common::Array<byte> &data);


Commit: 886330770ff7b9b1c9bb8c9374628f7b0aef4785
    https://github.com/scummvm/scummvm/commit/886330770ff7b9b1c9bb8c9374628f7b0aef4785
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Fix exits loading from savegame

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9b764d9..9d43761 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -192,7 +192,8 @@ void MacVentureEngine::resetGui() {
 	_gui->updateWindowInfo(kMainGameWindow, getParent(1), _world->getChildren(getParent(1), true));
 	// HACK! should update all inventories
 	_gui->updateWindowInfo(kInventoryStart, 1, _world->getChildren(1, true));
-	_gui->updateWindowInfo(kExitsWindow, getParent(1), _world->getChildren(getParent(1), true));
+	updateControls();
+	updateExits();
 }
 
 


Commit: 014d1b7dcbb27b9db35a02be99338d3525e72349
    https://github.com/scummvm/scummvm/commit/014d1b7dcbb27b9db35a02be99338d3525e72349
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Fix sign issue

Changed paths:
    engines/macventure/script.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index fdb470c..36aabae 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -52,14 +52,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	frame.haltedInFirst = false;
 	frame.haltedInFamily = false;
 	_frames.push_back(frame);
-	debug(2, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+	debug(3, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
 		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
 
 	return resume(true);
 }
 
 bool ScriptEngine::resume(bool execAll) {
-	debug(2, "SCRIPT: Resume");
+	debug(3, "SCRIPT: Resume");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
@@ -166,7 +166,6 @@ bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 
 bool ScriptEngine::runFunc(EngineFrame *frame) {
 	ScriptAsset &script = frame->scripts.front();
-	debug(2, "SCRIPT: Executing function %d", script.getId());
 	EngineState *state = &frame->state;
 	byte op;
 	while (script.hasNext()) {
@@ -772,24 +771,26 @@ void ScriptEngine::opa7LNOT(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opa8GTU(EngineState * state, EngineFrame * frame) {
-	word b = state->pop();
-	word a = state->pop();
+	uint16 b = state->pop();
+	uint16 a = state->pop();
 	state->push((a > b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opa9LTU(EngineState * state, EngineFrame * frame) {
-	word b = state->pop();
-	word a = state->pop();
+	uint16 b = state->pop();
+	uint16 a = state->pop();
 	state->push((a < b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opaaGTS(EngineState * state, EngineFrame * frame) {
+	// HACK !!! May not need the neg16, since word is already a signed int!!
 	word b = neg16(state->pop());
 	word a = neg16(state->pop());
 	state->push((a > b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opabLTS(EngineState * state, EngineFrame * frame) {
+	// HACK !!! May not need the neg16, since word is already a signed int!!
 	word b = neg16(state->pop());
 	word a = neg16(state->pop());
 	state->push((a < b) ? 0xFFFF : 0);
@@ -924,6 +925,7 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
+	debug(2, "SCRIPT: Call function: %d", id);
 	if (loadScript(frame, id))
 		return true;
 	frame->scripts.pop_front();
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index cf13b78..ab35226 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -41,7 +41,7 @@ World::~World()	{
 
 
 uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
-	uint32 res;
+	int res;
 	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
 	// HACK, but if I try to initialize it in the else clause, it goes out of scope and segfaults
 	Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);


Commit: 09a4a4ac39f0cdaf7f8f78eb35ccadcb2cf1b467
    https://github.com/scummvm/scummvm/commit/09a4a4ac39f0cdaf7f8f78eb35ccadcb2cf1b467
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:17+02:00

Commit Message:
MACVENTURE: Fix image to allow mask attributes

Changed paths:
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index feb4d2e..a4db46e 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -64,23 +64,37 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 	_id = (original * 2);
 	_mask = (original * 2) + 1;
 
+	uint imgRowBytes = 0;
+	uint imgBitWidth = 0;
+	uint imgBitHeight = 0;
+	uint maskRowBytes = 0;
+	uint maskBitWidth = 0;
+	uint maskBitHeight = 0;
+
 	_container = container;
-	decodePPIC(_id, _imgData);
+	decodePPIC(_id, _imgData, imgBitHeight, imgBitWidth, imgRowBytes);
+	_imgRowBytes = imgRowBytes;
+	_imgBitWidth = imgBitWidth;
+	_imgBitHeight = imgBitHeight;
 
-	if (_container->getItemByteSize(_mask)) // Has mask
-		decodePPIC(_mask, _maskData);
+	if (_container->getItemByteSize(_mask)) {
+		decodePPIC(_mask, _maskData, maskBitHeight, maskBitWidth, maskRowBytes);
+	}
+	_maskRowBytes = maskRowBytes;
+	_maskBitWidth = maskBitWidth;
+	_maskBitHeight = maskBitHeight;
 }
 
 ImageAsset::~ImageAsset() {
 }
 
-void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
+void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight, uint &bitWidth, uint &rowBytes) {
 	ObjID realID = id;
 	uint32 size = _container->getItemByteSize(id);
 	if (size < 2) {
-		_rowBytes = 0;
-		_bitHeight = 0;
-		_bitHeight = 0;
+		rowBytes = 0;
+		bitHeight = 0;
+		bitWidth = 0;
 		return;
 	}
 	if (size == 2) {
@@ -96,37 +110,37 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data) {
 	if (stream.getBit()) w = stream.getBits(10);
 	else w = stream.getBits(6);
 
-	_rowBytes = ((w + 0xF) >> 3) & 0xFFFE;
-	_bitWidth = w;
-	_bitHeight = h;
+	rowBytes = ((w + 0xF) >> 3) & 0xFFFE;
+	bitWidth = w;
+	bitHeight = h;
 
-	for (int i = 0; i < _rowBytes * h; i++) {
+	for (int i = 0; i < rowBytes * h; i++) {
 		data.push_back(0);
 	}
 
 	switch (mode)
 	{
 	case MacVenture::kPPIC0:
-		decodePPIC0(stream, data);
+		decodePPIC0(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
 	case MacVenture::kPPIC1:
-		decodePPIC1(stream, data);
+		decodePPIC1(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
 	case MacVenture::kPPIC2:
-		decodePPIC2(stream, data);
+		decodePPIC2(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
 	case MacVenture::kPPIC3:
-		decodePPIC3(stream, data);
+		decodePPIC3(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
 	}
 }
 
-void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data) {
-	uint words = _bitWidth >> 4;
-	uint bytes = _bitWidth & 0xF;
+void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	uint words = bitWidth >> 4;
+	uint bytes = bitWidth & 0xF;
 	uint v = 0;
 	uint p = 0;
-	for (uint y = 0; y <_bitHeight; y++) {
+	for (uint y = 0; y < bitHeight; y++) {
 		for (uint x = 0; x < words; x++) {
 			v = stream.peekBits(32);
 			stream.skip(16);
@@ -144,15 +158,15 @@ void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &da
 
 }
 
-void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data) {
-	decodeHuffGraphic(PPIC1Huff, stream, data);
+void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	decodeHuffGraphic(PPIC1Huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodePPIC2(Common::BitStream & stream, Common::Array<byte> &data) {
-	decodeHuffGraphic(PPIC2Huff, stream, data);
+void ImageAsset::decodePPIC2(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	decodeHuffGraphic(PPIC2Huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &data) {
+void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	// We need to load the huffman from the PPIC itself
 	PPICHuff huff;
 	uint16 v, bits;
@@ -193,20 +207,20 @@ void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &da
 	huff.lens[0xf] = bits;
 	huff.lens[0x10] = bits;
 
-	decodeHuffGraphic(huff, stream, data);
+	decodeHuffGraphic(huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream, Common::Array<byte> &data) {
+void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	byte flags = 0;
 	_walkRepeat = 0;
 	_walkLast = 0;
-	if (_bitWidth & 3)
+	if (bitWidth & 3)
 		flags = stream.getBits(5);
 	else
 		flags = stream.getBits(4) << 1;
 
 	byte odd = 0;
-	byte blank = _bitWidth & 0xf;
+	byte blank = bitWidth & 0xf;
 	if (blank) {
 		blank >>= 2;
 		odd = blank & 1;
@@ -214,9 +228,9 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 	}
 
 	uint16 pos = 0;
-	for (uint y = 0; y < _bitHeight; y++) {
+	for (uint y = 0; y < bitHeight; y++) {
 		uint16 x = 0;
-		for (; x < _bitWidth >> 3; x++) {
+		for (; x < bitWidth >> 3; x++) {
 			byte hi = walkHuff(huff, stream) << 4;
 			data[pos++] = walkHuff(huff, stream) | hi;
 		}
@@ -226,13 +240,13 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		pos += blank;
 	}
 
-	uint16 edge = _bitWidth & 3;
+	uint16 edge = bitWidth & 3;
 	if (edge) {
-		pos = _rowBytes - blank;
+		pos = rowBytes - blank;
 		uint16 bits = 0;
 		uint16 val = 0;
 		uint16 v;
-		for (uint y = 0; y < _bitHeight; y++) {
+		for (uint y = 0; y < bitHeight; y++) {
 			if (flags & 1) {
 				if (bits < edge) {
 					v = walkHuff(huff, stream) << 4;
@@ -251,15 +265,15 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 				v >>= 4;
 
 			data[pos] |= v & 0xff;
-			pos += _rowBytes;
+			pos += rowBytes;
 		}
 	}
 	if (flags & 8) {
 		pos = 0;
-		for (uint y = 0; y < _bitHeight; y++) {
+		for (uint y = 0; y < bitHeight; y++) {
 			uint16 v = 0;
 			if (flags & 2) {
-				for (uint x = 0; x < _rowBytes; x++)
+				for (uint x = 0; x < rowBytes; x++)
 				{
 					data[pos] ^= v;
 					v = data[pos];
@@ -267,7 +281,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 				}
 			}
 			else {
-				for (uint x = 0; x < _rowBytes; x++) {
+				for (uint x = 0; x < rowBytes; x++) {
 					uint16 val = data[pos] ^ v;
 					val ^= (val >> 4) & 0xf;
 					data[pos] = val;
@@ -278,11 +292,11 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		}
 	}
 	if (flags & 4) {
-		uint16 delta = _rowBytes * 4;
+		uint16 delta = rowBytes * 4;
 		if (flags & 2) delta *= 2;
 		pos = 0;
 		uint q = delta;
-		for (int i = 0; i < _bitHeight * _rowBytes - delta; i++) {
+		for (int i = 0; i < bitHeight * rowBytes - delta; i++) {
 			data[q] ^= data[pos];
 			q++;
 			pos++;
@@ -331,15 +345,15 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 
 void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
 	if (mode == kBlitDirect) {
-		blitDirect(target, x, y, _imgData);
+		blitDirect(target, x, y, _imgData, _imgBitHeight, _imgBitWidth, _imgRowBytes);
 	} else if (mode < kBlitXOR){
 		if (_container->getItemByteSize(_mask)) { // Has mask
 			switch (mode) {
 			case MacVenture::kBlitBIC:
-				blitBIC(target, x, y, _maskData);
+				blitBIC(target, x, y, _maskData, _maskBitHeight, _maskBitWidth, _maskRowBytes);
 				break;
 			case MacVenture::kBlitOR:
-				blitOR(target, x, y, _maskData);
+				blitOR(target, x, y, _maskData, _maskBitHeight, _maskBitWidth, _maskRowBytes);
 				break;
 			default:
 				break;
@@ -347,10 +361,10 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 		} else if (_container->getItemByteSize(_id)) {
 			switch (mode) {
 			case MacVenture::kBlitBIC:
-				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight), kColorWhite);
+				target->fillRect(Common::Rect(x, y, x + _imgBitWidth, y + _imgBitHeight), kColorWhite);
 				break;
 			case MacVenture::kBlitOR:
-				target->fillRect(Common::Rect(x, y, x + _bitWidth, y + _bitHeight), kColorBlack);
+				target->fillRect(Common::Rect(x, y, x + _imgBitWidth, y + _imgBitHeight), kColorBlack);
 				break;
 			default:
 				break;
@@ -358,16 +372,16 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y,
 		}
 
 		if (_container->getItemByteSize(_id) && mode > 0) {
-			blitXOR(target, x, y, _imgData);
+			blitXOR(target, x, y, _imgData, _imgBitHeight, _imgBitWidth, _imgRowBytes);
 		}
 	}
 }
 
 bool ImageAsset::isPointInside(Common::Point point) {
-	if (point.x >= _bitWidth || point.y >= _bitHeight) return false;
+	if (point.x >= _maskBitWidth || point.y >= _maskBitHeight) return false;
 	if (_maskData.empty()) return false;
 	// We see if the point lands on the mask.
-	uint pix = _maskData[(point.y * _rowBytes) + (point.x >> 3)] & (1 << (7 - (point.x & 7)));
+	uint pix = _maskData[(point.y * _maskRowBytes) + (point.x >> 3)] & (1 << (7 - (point.x & 7)));
 	return pix != 0;
 }
 
@@ -376,7 +390,7 @@ bool ImageAsset::isRectInside(Common::Rect rect) {
 	if (_maskData.empty()) return (rect.width() > 0 && rect.height() > 0);
 
 	for (int y = rect.top; y < rect.top + rect.height(); y++) {
-		uint bmpofs = y * _rowBytes;
+		uint bmpofs = y * _maskRowBytes;
 		byte pix;
 		for (int x = rect.left; x < rect.left + rect.width(); x++) {
 			pix = _maskData[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
@@ -388,19 +402,20 @@ bool ImageAsset::isRectInside(Common::Rect rect) {
 
 int ImageAsset::getWidth() {
 	if (_imgData.size() == 0) return 0;
-	return MAX(0, (int)_bitWidth);
+	return MAX(0, (int)_imgBitWidth);
 }
 
 int ImageAsset::getHeight() {
 	if (_imgData.size() == 0) return 0;
-	return MAX(0, (int)_bitHeight);
+	return MAX(0, (int)_imgBitHeight);
 }
 
-void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data) {
-	/*
-	if (_bitWidth == 0 || _bitHeight == 0) return;
-	uint w = _bitWidth;
-	uint h = _bitHeight;
+void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
+
+/*
+	if (bitWidth == 0 || bitHeight == 0) return;
+	uint w = bitWidth;
+	uint h = bitHeight;
 	uint sx = 0;
 	uint sy = 0;
 	if (ox<0) { sx = -ox; ox = 0; }
@@ -408,12 +423,11 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	*/
-
-	for (uint y = 0; y < _bitHeight; y++) {
-		uint bmpofs = y * _rowBytes;
+*/
+	for (uint y = 0; y < bitHeight; y++) {
+		uint bmpofs = y * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < _bitWidth; x++) {
+		for (uint x = 0; x < bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			pix = pix ? kColorBlack : kColorWhite;
 			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
@@ -421,11 +435,11 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32
 	}
 }
 
-void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
-	/*
-	if (_bitWidth == 0 || _bitHeight == 0) return;
-	uint w = _bitWidth;
-	uint h = _bitHeight;
+void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+/*
+	if (bitWidth == 0 || bitHeight == 0) return;
+	uint w = bitWidth;
+	uint h = bitHeight;
 	uint sx = 0;
 	uint sy = 0;
 	if (ox<0) { sx = -ox; ox = 0; }
@@ -433,22 +447,22 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	*/
-	for (uint y = 0; y < _bitHeight; y++) {
-		uint bmpofs = y * _rowBytes;
+*/
+	for (uint y = 0; y < bitHeight; y++) {
+		uint bmpofs = y * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < _bitWidth; x++) {
+		for (uint x = 0; x < bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
 	}
 }
 
-void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
-	/*
-	if (_bitWidth == 0 || _bitHeight == 0) return;
-	uint w = _bitWidth;
-	uint h = _bitHeight;
+void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+/*
+	if (bitWidth == 0 || bitHeight == 0) return;
+	uint w = bitWidth;
+	uint h = bitHeight;
 	uint sx = 0;
 	uint sy = 0;
 	if (ox<0) { sx = -ox; ox = 0; }
@@ -456,23 +470,22 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy,
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	*/
-	for (uint y = 0; y < _bitHeight; y++) {
-		uint bmpofs = y * _rowBytes;
+*/
+	for (uint y = 0; y < bitHeight; y++) {
+		uint bmpofs = y * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < _bitWidth; x++) {
+		for (uint x = 0; x < bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
-
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
 		}
 	}
 }
 
-void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data) {
-	/*
-	if (_bitWidth == 0 || _bitHeight == 0) return;
-	uint w = _bitWidth;
-	uint h = _bitHeight;
+void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+/*
+	if (bitWidth == 0 || bitHeight == 0) return;
+	uint w = bitWidth;
+	uint h = bitHeight;
 	uint sx = 0;
 	uint sy = 0;
 	if (ox<0) { sx = -ox; ox = 0; }
@@ -480,16 +493,14 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 	if (w + ox >= target->w) w = target->w - ox;
 	if (h + oy >= target->h) h = target->h - oy;
 	if (w == 0 || h == 0) return;
-	*/
-	for (uint y = 0;y < _bitHeight; y++) {
-		uint bmpofs = y * _rowBytes;
+*/
+	for (uint y = 0; y < bitHeight; y++) {
+		uint bmpofs = y * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < _bitWidth; x++) {
+		for (uint x = 0; x < bitWidth; x++) {
 			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
-
 			if (pix) { // We need to xor
 				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
-
 				*((byte *)target->getBasePtr(ox + x, oy + y)) =
 					(p == kColorWhite) ? kColorBlack : kColorWhite;
 			}
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index b529109..e6b2515 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -67,20 +67,20 @@ public:
 	int getHeight();
 
 private:
-	void decodePPIC(ObjID id, Common::Array<byte> &data);
+	void decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight, uint &bitWidth, uint &rowBytes);
 
-	void decodePPIC0(Common::BitStream &stream, Common::Array<byte> &data);
-	void decodePPIC1(Common::BitStream &stream, Common::Array<byte> &data);
-	void decodePPIC2(Common::BitStream &stream, Common::Array<byte> &data);
-	void decodePPIC3(Common::BitStream &stream, Common::Array<byte> &data);
+	void decodePPIC0(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void decodePPIC1(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void decodePPIC2(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void decodePPIC3(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 
-	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data);
+	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
-	void blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
-	void blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
-	void blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
-	void blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data);
+	void blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 
 private:
 	ObjID _id;
@@ -90,12 +90,15 @@ private:
 	uint16 _walkRepeat;
 	uint16 _walkLast;
 
-	uint16 _rowBytes;
-	uint16 _bitWidth;
-	uint16 _bitHeight;
-
 	Common::Array<byte> _imgData;
+	uint16 _imgRowBytes;
+	uint16 _imgBitWidth;
+	uint16 _imgBitHeight;
+
 	Common::Array<byte> _maskData;
+	uint16 _maskRowBytes;
+	uint16 _maskBitWidth;
+	uint16 _maskBitHeight;
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index ab35226..e6efeb5 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -41,7 +41,7 @@ World::~World()	{
 
 
 uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
-	int res;
+	uint res;
 	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
 	// HACK, but if I try to initialize it in the else clause, it goes out of scope and segfaults
 	Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);


Commit: 49a2efe408575dbbbdd4e7fc060df843dd8ecd1f
    https://github.com/scummvm/scummvm/commit/49a2efe408575dbbbdd4e7fc060df843dd8ecd1f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:55:18+02:00

Commit Message:
MACVENTURE: Shadowgate Winnable

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6c9ccf6..c158298 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -219,7 +219,7 @@ void Gui::initWindows() {
 	loadBorder(_controlsWindow, "border_command.bmp", true);
 
 	// Main Game Window
-	_mainGameWindow = _wm.addWindow(false, false, false);
+	_mainGameWindow = _wm.addWindow(true, true, true);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);


Commit: 91493aaeb860edbdc991bca679ad6cf8a9d513eb
    https://github.com/scummvm/scummvm/commit/91493aaeb860edbdc991bca679ad6cf8a9d513eb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:57:26+02:00

Commit Message:
MACVENTURE: Add closeable inventory windows

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index c158298..d38a7a5 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -223,8 +223,8 @@ void Gui::initWindows() {
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
+	//loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
@@ -335,8 +335,9 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
-	loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	newWindow->setCloseable(true);
+	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
+	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -1283,14 +1284,32 @@ bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & ev
 }
 
 bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
+	if (event.type == Common::EVENT_LBUTTONDOWN && click == kBorderCloseButton) {
+		WindowReference ref = findWindowAtPoint(event.mouse);
+		if (ref == kNoWindow) return false;
+
+		if (click == kBorderCloseButton) {
+			_inventoryWindows.remove_at(ref - kInventoryStart);
+			bool found = false;
+			Common::List<WindowData>::iterator it;
+			for (it = _windowData->begin(); it != _windowData->end() && !found; it++) {
+				if (it->refcon == ref) {
+					_windowData->erase(it);
+					found = true;
+				}
+			}
+			return true;
+		}
+	}
+
 	if (_engine->needsClickToContinue())
 		return true;
 
 	if (event.type == Common::EVENT_LBUTTONDOWN) {
-
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) return false;
+
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
 		Common::Point pos;


Commit: 53a5fb6c546bee103526fe444ece0c2cda52d624
    https://github.com/scummvm/scummvm/commit/53a5fb6c546bee103526fe444ece0c2cda52d624
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:57:26+02:00

Commit Message:
MACVENTURE: Refactor dialogs and controls

Changed paths:
  A engines/macventure/controls.cpp
  A engines/macventure/controls.h
  A engines/macventure/prebuilt_dialogs.h
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/script.h
    engines/macventure/text.h



diff --git a/engines/macventure/controls.cpp b/engines/macventure/controls.cpp
new file mode 100644
index 0000000..f467d72
--- /dev/null
+++ b/engines/macventure/controls.cpp
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/gui.h"
+
+namespace MacVenture {
+CommandButton::CommandButton() {
+ _gui = nullptr;
+}
+
+CommandButton::CommandButton(ControlData data, Gui *g) {
+  _data = data;
+  _gui = g;
+  _selected = false;
+}
+
+void CommandButton::draw(Graphics::ManagedSurface &surface) const {
+
+  uint colorFill = _selected ? kColorBlack : kColorWhite;
+  uint colorText = _selected ? kColorWhite : kColorBlack;
+
+  surface.fillRect(_data.bounds, colorFill);
+  surface.frameRect(_data.bounds, kColorBlack);
+
+  if (_data.titleLength > 0) {
+    const Graphics::Font &font = _gui->getCurrentFont();
+    Common::String title(_data.title);
+    font.drawString(
+      &surface,
+      title,
+      _data.bounds.left,
+      _data.bounds.top,
+      _data.bounds.right - _data.bounds.left,
+      colorText,
+      Graphics::kTextAlignCenter);
+  }
+}
+
+bool CommandButton::isInsideBounds(const Common::Point point) const {
+  return _data.bounds.contains(point);
+}
+
+const ControlData& CommandButton::getData() const {
+  return _data;
+}
+
+void CommandButton::select() {
+  _selected = true;
+}
+
+void CommandButton::unselect() {
+	_selected = false;
+}
+
+bool CommandButton::isSelected() {
+  return _selected;
+}
+}
diff --git a/engines/macventure/controls.h b/engines/macventure/controls.h
new file mode 100644
index 0000000..a780f63
--- /dev/null
+++ b/engines/macventure/controls.h
@@ -0,0 +1,105 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_CONTROLS_H
+#define MACVENTURE_CONTROLS_H
+
+namespace MacVenture {
+
+class Gui;
+
+enum ControlType { // HACK, should correspond exactly with the types of controls (sliders etc)
+	kControlExitBox = 0,
+	kControlExamine = 1,
+	kControlOpen = 2,
+	kControlClose = 3,
+	kControlSpeak = 4,
+	kControlOperate = 5,
+	kControlGo = 6,
+	kControlHit = 7,
+	kControlConsume = 8,
+	kControlClickToContinue = 9
+};
+
+enum ControlAction { // HACK, figure out a way to put it in engine
+  kNoCommand = 0,
+  kStartOrResume = 1,
+  kClose = 2,
+  kTick = 3,
+  kActivateObject = 4,
+  kMoveObject = 5,
+  kConsume = 6,
+  kExamine = 7,
+  kGo = 8,
+  kHit = 9,
+  kOpen = 10,
+  kOperate = 11,
+  kSpeak = 12,
+  kBabble = 13,
+  kTargetName = 14,
+  kDebugObject = 15,
+  kClickToContinue = 16
+};
+struct ControlData {
+	Common::Rect bounds;
+	uint16 scrollValue;
+	uint8 visible;
+	uint16 scrollMax;
+	uint16 scrollMin;
+	uint16 cdef;
+	ControlAction refcon;
+	ControlType type;
+	uint8 titleLength;
+	char* title;
+	uint16 border;
+};
+
+class CommandButton {
+
+enum {
+	kCommandsLeftPadding = 0,
+	kCommandsTopPadding = 0
+};
+
+public:
+
+	CommandButton();
+
+	CommandButton(ControlData data, Gui *g);
+	~CommandButton() {}
+
+	void draw(Graphics::ManagedSurface &surface) const;
+	bool isInsideBounds(const Common::Point point) const;
+	const ControlData& getData() const;
+	void select();
+	void unselect();
+	bool isSelected();
+
+private:
+	bool _selected;
+	ControlData _data;
+	Gui *_gui;
+};
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index ba489d4..a6c1e78 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -23,47 +23,8 @@
 #include "common/system.h"
 
 #include "macventure/dialog.h"
-
 namespace MacVenture {
 
-// Prebuilt dialogs
-
-enum {
-  // HACK
-  kMaxPrebuiltDialogElements = 10
-};
-
-struct PrebuiltDialog {
-  Common::Rect bounds;
-  PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
-};
-
-PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
-
-  {/* kSaveAsDialog */
-    Common::Rect(0, 146, 456, 254),
-    {
-      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
-      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
-      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
-      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-  },
-
-  { /* kSpeakDialog */
-    Common::Rect(20, 92, 400, 200),
-    {
-      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
-      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
-      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-  }
-
-};
 
 Dialog::Dialog(Gui *gui, Common::Point pos, uint width, uint height) :
   _gui(gui), _bounds(Common::Rect(pos.x, pos.y, pos.x + width, pos.y + height)) {}
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index e773956..66d68e3 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -26,44 +26,13 @@
 #include "graphics/macgui/macwindowmanager.h"
 
 #include "macventure/macventure.h"
-#include "macventure/gui.h"
-
+#include "macventure/prebuilt_dialogs.h"
 namespace MacVenture {
 
 using namespace Graphics::MacGUIConstants;
 class Gui;
-
 class DialogElement;
 
-enum DialogAction {
-  kDANone,
-  kDACloseDialog,
-  kDASubmit,
-  kDASaveAs
-};
-
-enum PrebuiltDialogs {
-  kSaveAsDialog = 0,
-  kSpeakDialog = 1,
-  kPrebuiltDialogCount
-};
-
-enum PrebuiltElementType {
-  kDEPlainText,
-  kDEButton,
-  kDETextInput,
-  kDEEnd
-};
-
-struct PrebuiltDialogElement {
-  PrebuiltElementType type;
-  Common::String title;
-  DialogAction action;
-  Common::Point position;
-  uint width;
-  uint height;
-};
-
 class Dialog {
 public:
 	Dialog(Gui *gui, Common::Point pos, uint width, uint height);
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d38a7a5..d8db665 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -20,14 +20,14 @@
 *
 */
 
+
 #include "common/file.h"
+#include "common/timer.h"
+#include "common/system.h"
 #include "image/bmp.h"
 
-#include "macventure/macventure.h"
 #include "macventure/gui.h"
-
-#include "common/timer.h"
-#include "common/system.h"
+#include "macventure/dialog.h"
 
 namespace MacVenture {
 
@@ -36,12 +36,12 @@ namespace MacVenture {
 enum MenuAction;
 
 enum {
-	kCursorWidth = 2, // HACK Arbitrary width to test
+	kCursorWidth = 2,
 	kCursorHeight = 2
 };
 
 enum {
-	kExitButtonWidth = 10, // HACK Arbitrary width to test
+	kExitButtonWidth = 10,
 	kExitButtonHeight = 10
 };
 
@@ -802,10 +802,20 @@ void Gui::printText(const Common::String & text) {
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
+void Gui::showPrebuiltDialog(PrebuiltDialogs type) {
+	closeDialog();
+	_dialog = new Dialog(this, type);
+}
+
+bool Gui::isDialogOpen() {
+	return _dialog != nullptr;
+}
+
 void Gui::setTextInput(Common::String str) {
 	_engine->setTextInput(str);
 }
 
+
 void Gui::closeDialog() {
 	delete _dialog;
 	_dialog = nullptr;
@@ -815,9 +825,7 @@ void Gui::getTextFromUser() {
 	if (_dialog) {
 		delete _dialog;
 	}
-	_dialog = new Dialog(this, kSpeakDialog);
-	// Hack to pause the engine
-	_engine->clickToContinue();
+	showPrebuiltDialog(kSpeakDialog);
 }
 
 void Gui::loadGame(int slot) {
@@ -1046,8 +1054,7 @@ void Gui::handleMenuAction(MenuAction action) {
 		break;
 	case MacVenture::kMenuActionSaveAs:
 		debug("MacVenture Menu Action: Save As");
-		// HACK this should be wrapped in a function
-		_dialog = new Dialog(this, kSaveAsDialog);
+		showPrebuiltDialog(kSaveAsDialog);
 		break;
 	case MacVenture::kMenuActionQuit:
 		debug("MacVenture Menu Action: Quit");
@@ -1140,6 +1147,7 @@ void Gui::invertWindowColors(WindowReference winID) {
 	}
 }
 
+
 bool Gui::tryCloseWindow(WindowReference winID) {
 	WindowData data = findWindowData(winID);
 	if (winID < 0x80) { // Inventory window
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index b03ca2a..eb929cf 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -29,9 +29,12 @@
 
 #include "graphics/font.h"
 
+#include "macventure/macventure.h"
 #include "macventure/container.h"
 #include "macventure/image.h"
+#include "macventure/prebuilt_dialogs.h"
 #include "macventure/dialog.h"
+#include "macventure/controls.h"
 
 namespace MacVenture {
 
@@ -114,53 +117,6 @@ struct WindowData {
 	bool updateScroll;
 };
 
-enum ControlType { // HACK, should correspond exactly with the types of controls (sliders etc)
-	kControlExitBox = 0,
-	kControlExamine = 1,
-	kControlOpen = 2,
-	kControlClose = 3,
-	kControlSpeak = 4,
-	kControlOperate = 5,
-	kControlGo = 6,
-	kControlHit = 7,
-	kControlConsume = 8,
-	kControlClickToContinue = 9
-};
-
-enum ControlAction { // HACK, figure out a way to put it in engine
-	kNoCommand = 0,
-	kStartOrResume = 1,
-	kClose = 2,
-	kTick = 3,
-	kActivateObject = 4,
-	kMoveObject = 5,
-	kConsume = 6,
-	kExamine = 7,
-	kGo = 8,
-	kHit = 9,
-	kOpen = 10,
-	kOperate = 11,
-	kSpeak = 12,
-	kBabble = 13,
-	kTargetName = 14,
-	kDebugObject = 15,
-	kClickToContinue = 16
-};
-
-struct ControlData {
-	Common::Rect bounds;
-	uint16 scrollValue;
-	uint8 visible;
-	uint16 scrollMax;
-	uint16 scrollMin;
-	uint16 cdef;
-	ControlAction refcon;
-	ControlType type;
-	uint8 titleLength;
-	char* title;
-	uint16 border;
-};
-
 struct BorderBounds {
 	uint16 leftOffset;
 	uint16 topOffset;
@@ -204,6 +160,7 @@ public:
 	void updateWindow(WindowReference winID, bool containerOpen);
 	void invertWindowColors(WindowReference winID);
 
+
 	WindowReference createInventoryWindow(ObjID objRef);
 	bool tryCloseWindow(WindowReference winID);
 
@@ -223,8 +180,6 @@ public:
 
 	void processCursorTick();
 
-	//bool processClickObject(ObjID obj, WindowReference win, Common::Event event, bool canDrag);
-
 	const WindowData& getWindowData(WindowReference reference);
 
 	const Graphics::Font& getCurrentFont();
@@ -248,6 +203,9 @@ public:
 	void printText(const Common::String &text);
 
 	//Dialog interactions
+	void showPrebuiltDialog(PrebuiltDialogs type);
+	bool isDialogOpen();
+
 	void getTextFromUser();
 	void setTextInput(Common::String str);
 	void closeDialog();
@@ -428,74 +386,6 @@ private:
 
 };
 
-class CommandButton {
-
-enum {
-	kCommandsLeftPadding = 0,
-	kCommandsTopPadding = 0
-};
-
-public:
-
-	CommandButton() {
-		_gui = nullptr;
-	}
-
-	CommandButton(ControlData data, Gui *g) {
-		_data = data;
-		_gui = g;
-		_selected = false;
-	}
-	~CommandButton() {}
-
-	void draw(Graphics::ManagedSurface &surface) const {
-
-		uint colorFill = _selected ? kColorBlack : kColorWhite;
-		uint colorText = _selected ? kColorWhite : kColorBlack;
-
-		surface.fillRect(_data.bounds, colorFill);
-		surface.frameRect(_data.bounds, kColorBlack);
-
-		if (_data.titleLength > 0) {
-			const Graphics::Font &font = _gui->getCurrentFont();
-			Common::String title(_data.title);
-			font.drawString(
-				&surface,
-				title,
-				_data.bounds.left,
-				_data.bounds.top,
-				_data.bounds.right - _data.bounds.left,
-				colorText,
-				Graphics::kTextAlignCenter);
-		}
-	}
-
-	bool isInsideBounds(const Common::Point point) const {
-		return _data.bounds.contains(point);
-	}
-
-	const ControlData& getData() const {
-		return _data;
-	}
-
-	void select() {
-		_selected = true;
-	}
-
-	void unselect() {
-		_selected = false;
-	}
-
-	bool isSelected() {
-		return _selected;
-	}
-
-private:
-	bool _selected;
-	ControlData _data;
-	Gui *_gui;
-};
-
 class ConsoleText {
 
 public:
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9d43761..6cb6db5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -126,7 +126,7 @@ Common::Error MacVentureEngine::run() {
 
 		if (_gameState != kGameStateQuitting) {
 
-			if (_prepared) {
+			if (_prepared && !_gui->isDialogOpen()) {
 				_prepared = false;
 
 				if (!_halted)
@@ -148,6 +148,7 @@ Common::Error MacVentureEngine::run() {
 
 				if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
 					endGame();
+					return Common::kNoError;
 				}
 			}
 			_gui->draw();
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 167abcc..9d1677d 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -39,6 +39,7 @@
 #include "macventure/hufflists.h"
 #include "macventure/stringtable.h"
 #include "macventure/script.h"
+#include "controls.h"
 
 struct ADGameDescription;
 
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 813677c..66039d4 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -3,13 +3,14 @@ MODULE := engines/macventure
 MODULE_OBJS := \
 	image.o \
 	detection.o \
-	gui.o \
 	object.o \
 	text.o \
 	world.o \
 	script.o \
 	macventure.o \
-	dialog.o
+	gui.o \
+	dialog.o \
+	controls.o
 
 MODULE_DIRS += \
 	engines/macventure
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
new file mode 100644
index 0000000..34df91e
--- /dev/null
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -0,0 +1,97 @@
+
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_PREBUIT_DIALOGS_H
+#define MACVENTURE_PREBUIT_DIALOGS_H
+
+namespace MacVenture {
+enum DialogAction {
+  kDANone,
+  kDACloseDialog,
+  kDASubmit,
+  kDASaveAs
+};
+
+enum PrebuiltDialogs {
+  kSaveAsDialog = 0,
+  kSpeakDialog = 1,
+  kPrebuiltDialogCount
+};
+
+enum PrebuiltElementType {
+  kDEPlainText,
+  kDEButton,
+  kDETextInput,
+  kDEEnd
+};
+
+struct PrebuiltDialogElement {
+  PrebuiltElementType type;
+  Common::String title;
+  DialogAction action;
+  Common::Point position;
+  uint width;
+  uint height;
+};
+
+
+// Prebuilt dialogs
+enum {
+  // HACK
+  kMaxPrebuiltDialogElements = 10
+};
+
+struct PrebuiltDialog {
+  Common::Rect bounds;
+  PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
+};
+
+PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
+
+  {/* kSaveAsDialog */
+    Common::Rect(0, 146, 456, 254),
+    {
+      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
+      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
+      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
+      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
+  },
+
+  { /* kSpeakDialog */
+    Common::Rect(20, 92, 400, 200),
+    {
+      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
+      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
+      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
+  }
+
+};
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 49b6987..5760a31 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -25,6 +25,8 @@
 
 #include "macventure/container.h"
 #include "macventure/world.h"
+#include "macventure/macventure.h"
+#include "macventure/controls.h"
 
 namespace MacVenture {
 
diff --git a/engines/macventure/text.h b/engines/macventure/text.h
index 2389454..88dd112 100644
--- a/engines/macventure/text.h
+++ b/engines/macventure/text.h
@@ -28,6 +28,7 @@
 
 namespace MacVenture {
 typedef uint32 ObjID;
+class MacVentureEngine;
 
 class TextAsset {
 public:
@@ -53,7 +54,7 @@ private:
 	ObjID _sourceObj;
 	const HuffmanLists *_huffman;
 	bool _isOld;
-	
+
 	Common::String _decoded;
 
 };


Commit: 2dfbfdbaba780ec4598556299af967f7eb0abf63
    https://github.com/scummvm/scummvm/commit/2dfbfdbaba780ec4598556299af967f7eb0abf63
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:57:26+02:00

Commit Message:
MACVENTURE: Implement in-engine window closing

Changed paths:
  A engines/macventure/prebuilt_dialogs.cpp
  A engines/macventure/windows.cpp
  A engines/macventure/windows.h
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index 66d68e3..d40639a 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -27,11 +27,14 @@
 
 #include "macventure/macventure.h"
 #include "macventure/prebuilt_dialogs.h"
+
 namespace MacVenture {
 
 using namespace Graphics::MacGUIConstants;
 class Gui;
 class DialogElement;
+extern PrebuiltDialog prebuiltDialogs[];
+
 
 class Dialog {
 public:
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d8db665..6fcd48c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -598,6 +598,12 @@ void Gui::drawInventories() {
 			srf->h + border.bottomOffset), kColorWhite);
 		drawObjectsInWindow(data.refcon, srf);
 
+		if (MACVENTURE_DEBUG_GUI) {
+			Common::Rect innerDims  = findWindow(data.refcon)->getInnerDimensions();
+			innerDims = Common::Rect(17, 17, innerDims.width() + 17, innerDims.height() + 17);
+			srf->frameRect(innerDims, kColorGreen);
+		}
+
 		findWindow(data.refcon)->setDirty(true);
 	}
 
@@ -1034,6 +1040,18 @@ Common::Point Gui::localize(Common::Point point, WindowReference origin, WindowR
 	return point;
 }
 
+void Gui::removeInventoryWindow(WindowReference ref) {
+	_inventoryWindows.remove_at(ref - kInventoryStart);
+	bool found = false;
+	Common::List<WindowData>::iterator it;
+	for (it = _windowData->begin(); it != _windowData->end() && !found; it++) {
+		if (it->refcon == ref) {
+			_windowData->erase(it);
+			found = true;
+		}
+	}
+}
+
 
 /* HANDLERS */
 void Gui::handleMenuAction(MenuAction action) {
@@ -1147,13 +1165,12 @@ void Gui::invertWindowColors(WindowReference winID) {
 	}
 }
 
-
 bool Gui::tryCloseWindow(WindowReference winID) {
 	WindowData data = findWindowData(winID);
-	if (winID < 0x80) { // Inventory window
-		warning("Window closing not implemented");
-	} else {
-		warning("Window closing not implemented");
+	Graphics::MacWindow *win = findWindow(winID);
+	_wm.removeWindow(win);
+	if (winID < 0x80) {
+		removeInventoryWindow(winID);
 	}
 	return true;
 }
@@ -1297,15 +1314,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		if (ref == kNoWindow) return false;
 
 		if (click == kBorderCloseButton) {
-			_inventoryWindows.remove_at(ref - kInventoryStart);
-			bool found = false;
-			Common::List<WindowData>::iterator it;
-			for (it = _windowData->begin(); it != _windowData->end() && !found; it++) {
-				if (it->refcon == ref) {
-					_windowData->erase(it);
-					found = true;
-				}
-			}
+			removeInventoryWindow(ref);
 			return true;
 		}
 	}
@@ -1352,40 +1361,5 @@ void Gui::ensureAssetLoaded(ObjID obj) {
 	}
 }
 
-/* Ugly switches */
-
-BorderBounds Gui::borderBounds(MVWindowType type) {
-	switch (type) {
-	case MacVenture::kDocument:
-		break;
-	case MacVenture::kDBox:
-		break;
-	case MacVenture::kPlainDBox:
-		return BorderBounds(6, 6, 6, 6);
-	case MacVenture::kAltBox:
-		return BorderBounds(4, 4, 4, 4); // Hand-tested
-		break;
-	case MacVenture::kNoGrowDoc:
-		return BorderBounds(1, 17, 1, 1);
-	case MacVenture::kMovableDBox:
-		break;
-	case MacVenture::kZoomDoc:
-		return BorderBounds(1, 19, 16, 1);
-	case MacVenture::kZoomNoGrow:
-		break;
-	case MacVenture::kRDoc16:
-		break;
-	case MacVenture::kRDoc4:
-		return BorderBounds(0, 19, 1, 1);
-	case MacVenture::kRDoc6:
-		break;
-	case MacVenture::kRDoc10:
-		break;
-	default:
-		break;
-	}
-
-	return BorderBounds(0, 0, 0, 0);
-}
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index eb929cf..95e1480 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -35,6 +35,7 @@
 #include "macventure/prebuilt_dialogs.h"
 #include "macventure/dialog.h"
 #include "macventure/controls.h"
+#include "macventure/windows.h"
 
 namespace MacVenture {
 
@@ -49,6 +50,9 @@ class CommandButton;
 class ImageAsset;
 class Dialog;
 
+BorderBounds borderBounds(MVWindowType type);
+extern PrebuiltDialog prebuiltDialogs[];
+
 enum MenuAction {
 	kMenuActionAbout,
 	kMenuActionNew,
@@ -68,64 +72,6 @@ enum MenuAction {
 };
 //} using namespace MacVentureMenuActions;
 
-enum WindowReference {
-	kNoWindow = 0,
-	kInventoryStart = 1,
-	kCommandsWindow = 0x80,
-	kMainGameWindow = 0x81,
-	kOutConsoleWindow = 0x82,
-	kSelfWindow = 0x83,
-	kExitsWindow = 0x84,
-	kDiplomaWindow = 0x85
-};
-
-enum MVWindowType {
-	kDocument = 0x00,
-	kDBox = 0x01,
-	kPlainDBox = 0x02,
-	kAltBox = 0x03,
-	kNoGrowDoc = 0x04,
-	kMovableDBox = 0x05,
-	kZoomDoc = 0x08,
-	kZoomNoGrow = 0x0c,
-	kRDoc16 = 0x10,
-	kRDoc4 = 0x12,
-	kRDoc6 = 0x14,
-	kRDoc10 = 0x16
-};
-
-
-struct DrawableObject {
-	ObjID obj;
-	byte mode;
-	DrawableObject(ObjID id, byte md) {
-		obj = id;
-		mode = md;
-	}
-};
-
-struct WindowData {
-	Common::Rect bounds;
-	MVWindowType type;
-	ObjID objRef;
-	uint16 visible;
-	uint16 hasCloseBox;
-	WindowReference refcon;
-	uint8 titleLength;
-	Common::String title;
-	Common::Array<DrawableObject> children;
-	bool updateScroll;
-};
-
-struct BorderBounds {
-	uint16 leftOffset;
-	uint16 topOffset;
-	uint16 rightOffset;
-	uint16 bottomOffset;
-
-	BorderBounds(uint16 l, uint16 t, uint16 r, uint16 b) : leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
-};
-
 struct DraggedObj {
 	ObjID id;
 	Common::Point pos;
@@ -213,8 +159,6 @@ public:
 	void loadGame(int slot);
 	void saveInto(int slot);
 
-	// Ugly switches
-	BorderBounds borderBounds(MVWindowType type);
 
 private: // Attributes
 
@@ -292,6 +236,7 @@ private: // Methods
 	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 	Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);
+	void removeInventoryWindow(WindowReference ref);
 
 	void ensureAssetLoaded(ObjID obj);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6cb6db5..ff4072d 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -930,7 +930,7 @@ Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 
 	WindowReference win  = findParentWindow(objID);
 	if (win != kNoWindow) { // If it's not in a window YET, we don't really care about the border
-		BorderBounds bounds = _gui->borderBounds(_gui->getWindowData(win).type); // HACK
+		BorderBounds bounds = borderBounds(_gui->getWindowData(win).type); // HACK
 		pos.x += bounds.leftOffset;
 		pos.y += bounds.topOffset;
 	}
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 9d1677d..b228a34 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -39,7 +39,8 @@
 #include "macventure/hufflists.h"
 #include "macventure/stringtable.h"
 #include "macventure/script.h"
-#include "controls.h"
+#include "macventure/controls.h"
+#include "macventure/windows.h"
 
 struct ADGameDescription;
 
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 66039d4..48c8930 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -10,7 +10,10 @@ MODULE_OBJS := \
 	macventure.o \
 	gui.o \
 	dialog.o \
-	controls.o
+	controls.o \
+	prebuilt_dialogs.o \
+	windows.o
+
 
 MODULE_DIRS += \
 	engines/macventure
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
new file mode 100644
index 0000000..13d2d44
--- /dev/null
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/prebuilt_dialogs.h"
+
+namespace MacVenture {
+
+PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
+
+  {/* kSaveAsDialog */
+    Common::Rect(0, 146, 456, 254),
+    {
+      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
+      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
+      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
+      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
+  },
+
+  { /* kSpeakDialog */
+    Common::Rect(20, 92, 400, 200),
+    {
+      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
+      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
+      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
+      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
+      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+    }
+  }
+
+};
+} // End of namespace MacVenture
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 34df91e..1e708db 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -1,4 +1,3 @@
-
 /* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
@@ -24,7 +23,10 @@
 #ifndef MACVENTURE_PREBUIT_DIALOGS_H
 #define MACVENTURE_PREBUIT_DIALOGS_H
 
+#include "common/rect.h"
+
 namespace MacVenture {
+
 enum DialogAction {
   kDANone,
   kDACloseDialog,
@@ -54,7 +56,6 @@ struct PrebuiltDialogElement {
   uint height;
 };
 
-
 // Prebuilt dialogs
 enum {
   // HACK
@@ -65,33 +66,6 @@ struct PrebuiltDialog {
   Common::Rect bounds;
   PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
 };
-
-PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
-
-  {/* kSaveAsDialog */
-    Common::Rect(0, 146, 456, 254),
-    {
-      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
-      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
-      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
-      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-  },
-
-  { /* kSpeakDialog */
-    Common::Rect(20, 92, 400, 200),
-    {
-      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
-      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
-      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-  }
-
-};
 } // End of namespace MacVenture
 
 #endif
diff --git a/engines/macventure/windows.cpp b/engines/macventure/windows.cpp
new file mode 100644
index 0000000..33a6370
--- /dev/null
+++ b/engines/macventure/windows.cpp
@@ -0,0 +1,60 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/windows.h"
+
+namespace MacVenture {
+
+BorderBounds borderBounds(MVWindowType type) {
+	switch (type) {
+	case MacVenture::kDocument:
+		break;
+	case MacVenture::kDBox:
+		break;
+	case MacVenture::kPlainDBox:
+		return BorderBounds(6, 6, 6, 6);
+	case MacVenture::kAltBox:
+		return BorderBounds(4, 4, 4, 4); // Hand-tested
+		break;
+	case MacVenture::kNoGrowDoc:
+		return BorderBounds(1, 17, 1, 1);
+	case MacVenture::kMovableDBox:
+		break;
+	case MacVenture::kZoomDoc:
+		return BorderBounds(1, 19, 16, 1);
+	case MacVenture::kZoomNoGrow:
+		break;
+	case MacVenture::kRDoc16:
+		break;
+	case MacVenture::kRDoc4:
+		return BorderBounds(0, 19, 1, 1);
+	case MacVenture::kRDoc6:
+		break;
+	case MacVenture::kRDoc10:
+		break;
+	default:
+		break;
+	}
+
+	return BorderBounds(0, 0, 0, 0);
+}
+} // End of namespace MacVenture
diff --git a/engines/macventure/windows.h b/engines/macventure/windows.h
new file mode 100644
index 0000000..70af446
--- /dev/null
+++ b/engines/macventure/windows.h
@@ -0,0 +1,91 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_WINDOWS_H
+#define MACVENTURE_WINDOWS_H
+
+#include "common/rect.h"
+#include "common/array.h"
+
+namespace MacVenture {
+  // massive HACK
+typedef uint32 ObjID;
+
+enum WindowReference {
+	kNoWindow = 0,
+	kInventoryStart = 1,
+	kCommandsWindow = 0x80,
+	kMainGameWindow = 0x81,
+	kOutConsoleWindow = 0x82,
+	kSelfWindow = 0x83,
+	kExitsWindow = 0x84,
+	kDiplomaWindow = 0x85
+};
+
+enum MVWindowType {
+	kDocument = 0x00,
+	kDBox = 0x01,
+	kPlainDBox = 0x02,
+	kAltBox = 0x03,
+	kNoGrowDoc = 0x04,
+	kMovableDBox = 0x05,
+	kZoomDoc = 0x08,
+	kZoomNoGrow = 0x0c,
+	kRDoc16 = 0x10,
+	kRDoc4 = 0x12,
+	kRDoc6 = 0x14,
+	kRDoc10 = 0x16
+};
+
+struct DrawableObject {
+	ObjID obj;
+	byte mode;
+	DrawableObject(ObjID id, byte md) {
+		obj = id;
+		mode = md;
+	}
+};
+
+struct WindowData {
+	Common::Rect bounds;
+	MVWindowType type;
+	ObjID objRef;
+	uint16 visible;
+	uint16 hasCloseBox;
+	WindowReference refcon;
+	uint8 titleLength;
+	Common::String title;
+	Common::Array<DrawableObject> children;
+	bool updateScroll;
+};
+
+struct BorderBounds {
+	uint16 leftOffset;
+	uint16 topOffset;
+	uint16 rightOffset;
+	uint16 bottomOffset;
+
+	BorderBounds(uint16 l, uint16 t, uint16 r, uint16 b) :
+    leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
+};
+}
+#endif


Commit: 87c6265582f6efa31f6a8dcc77ffe509c3720010
    https://github.com/scummvm/scummvm/commit/87c6265582f6efa31f6a8dcc77ffe509c3720010
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:58:34+02:00

Commit Message:
MACVENTURE: Fix window borders

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/windows.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6fcd48c..37aef21 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -215,40 +215,40 @@ void Gui::initWindows() {
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
 	_controlsWindow->setActive(false);
 	_controlsWindow->setCallback(commandsWindowCallback, this);
-	loadBorder(_controlsWindow, "border_command.bmp", false);
-	loadBorder(_controlsWindow, "border_command.bmp", true);
+	loadBorder(_controlsWindow, "border_command.bmp", false, findWindowData(kCommandsWindow).type);
+	loadBorder(_controlsWindow, "border_command.bmp", true, findWindowData(kCommandsWindow).type);
 
 	// Main Game Window
 	_mainGameWindow = _wm.addWindow(true, true, true);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	//loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false, findWindowData(kMainGameWindow).type);
+	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true, findWindowData(kMainGameWindow).type);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(false, true, true);
 	_outConsoleWindow->setDimensions(getWindowData(kOutConsoleWindow).bounds);
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false, findWindowData(kOutConsoleWindow).type);
+	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true, findWindowData(kOutConsoleWindow).type);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, false);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_none.bmp", false);
-	loadBorder(_selfWindow, "border_none.bmp", true);
+	loadBorder(_selfWindow, "border_none.bmp", false, findWindowData(kSelfWindow).type);
+	loadBorder(_selfWindow, "border_none.bmp", true, findWindowData(kSelfWindow).type);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, false, false);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
-	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false, findWindowData(kExitsWindow).type);
+	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true, findWindowData(kExitsWindow).type);
 }
 
 const WindowData& Gui::getWindowData(WindowReference reference) {
@@ -336,15 +336,15 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
 	newWindow->setCloseable(true);
-	//loadBorder(newWindow, "border_no_scroll_inac.bmp", false);
-	//loadBorder(newWindow, "border_no_scroll_act.bmp", true);
+	loadBorder(newWindow, "border_both_scroll_inac.bmp", false, newData.type);
+	loadBorder(newWindow, "border_both_scroll_inac.bmp", true, newData.type);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
 	return newData.refcon;
 }
 
-void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool active) {
+void Gui::loadBorder(Graphics::MacWindow *target, Common::String filename, bool active, MVWindowType type) {
 	Common::File borderfile;
 
 	if (!borderfile.open(filename)) {
@@ -358,8 +358,9 @@ void Gui::loadBorder(Graphics::MacWindow * target, Common::String filename, bool
 	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
 
 	if (stream) {
+		BorderBounds bbs = borderBounds(type);
 		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename.c_str());
-		target->loadBorder(*stream, active);
+		target->loadBorder(*stream, active, bbs.leftOffset, bbs.rightOffset, bbs.topOffset, bbs.bottomOffset);
 
 		delete stream;
 	}
@@ -575,6 +576,15 @@ void Gui::drawMainGameWindow() {
 	}
 	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
 
+	if (MACVENTURE_DEBUG_GUI) {
+		Graphics::MacWindow *win = findWindow(data.refcon);
+		Common::Rect innerDims  = win->getInnerDimensions();
+		int x = win->getDimensions().left;
+		int y = win->getDimensions().top;
+		innerDims.translate(-x, -y);
+		win->getSurface()->frameRect(innerDims, kColorGreen);
+	}
+
 	findWindow(kMainGameWindow)->setDirty(true);
 }
 
@@ -599,8 +609,11 @@ void Gui::drawInventories() {
 		drawObjectsInWindow(data.refcon, srf);
 
 		if (MACVENTURE_DEBUG_GUI) {
-			Common::Rect innerDims  = findWindow(data.refcon)->getInnerDimensions();
-			innerDims = Common::Rect(17, 17, innerDims.width() + 17, innerDims.height() + 17);
+			Graphics::MacWindow *win = findWindow(data.refcon);
+			Common::Rect innerDims  = win->getInnerDimensions();
+			int x = win->getDimensions().left;
+			int y = win->getDimensions().top;
+			innerDims.translate(-x, -y);
 			srf->frameRect(innerDims, kColorGreen);
 		}
 
@@ -1322,7 +1335,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (event.type == Common::EVENT_LBUTTONDOWN) {
+	if (event.type == Common::EVENT_LBUTTONDOWN && click == kBorderInner) {
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) return false;
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 95e1480..90f2f42 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -203,7 +203,7 @@ private: // Methods
 	bool loadMenus();
 	bool loadWindows();
 	bool loadControls();
-	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active);
+	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active, MVWindowType type);
 	void loadGraphics();
 
 	// Drawers
diff --git a/engines/macventure/windows.cpp b/engines/macventure/windows.cpp
index 33a6370..c89fa93 100644
--- a/engines/macventure/windows.cpp
+++ b/engines/macventure/windows.cpp
@@ -40,7 +40,7 @@ BorderBounds borderBounds(MVWindowType type) {
 	case MacVenture::kMovableDBox:
 		break;
 	case MacVenture::kZoomDoc:
-		return BorderBounds(1, 19, 16, 1);
+		return BorderBounds(1, 19, 16, 16);
 	case MacVenture::kZoomNoGrow:
 		break;
 	case MacVenture::kRDoc16:


Commit: fb180a8cdbf7e75c28502a8f3531d78cc5224535
    https://github.com/scummvm/scummvm/commit/fb180a8cdbf7e75c28502a8f3531d78cc5224535
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:58:57+02:00

Commit Message:
MACVENTURE: Fix gui

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/windows.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 37aef21..13f0a9d 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -232,7 +232,7 @@ void Gui::initWindows() {
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
 	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false, findWindowData(kOutConsoleWindow).type);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", true, findWindowData(kOutConsoleWindow).type);
+	loadBorder(_outConsoleWindow, "border_left_scroll_act.bmp", true, findWindowData(kOutConsoleWindow).type);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, false);
@@ -337,7 +337,7 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	newWindow->setCallback(inventoryWindowCallback, this);
 	newWindow->setCloseable(true);
 	loadBorder(newWindow, "border_both_scroll_inac.bmp", false, newData.type);
-	loadBorder(newWindow, "border_both_scroll_inac.bmp", true, newData.type);
+	loadBorder(newWindow, "border_both_scroll_act.bmp", true, newData.type);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
@@ -539,7 +539,7 @@ void Gui::drawCommandsWindow() {
 		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
 		WindowData data = getWindowData(kCommandsWindow);
 		uint16 border = borderBounds(data.type).topOffset;
-		srf->fillRect(Common::Rect(border * 2, border * 2, srf->w - (border * 3), srf->h - (border * 3)), kColorWhite);
+		srf->fillRect(Common::Rect(0, 0, srf->w, srf->h), kColorWhite);
 		getCurrentFont().drawString(
 			srf,
 			_engine->getCommandsPausedString(),
diff --git a/engines/macventure/windows.cpp b/engines/macventure/windows.cpp
index c89fa93..9825349 100644
--- a/engines/macventure/windows.cpp
+++ b/engines/macventure/windows.cpp
@@ -31,22 +31,22 @@ BorderBounds borderBounds(MVWindowType type) {
 	case MacVenture::kDBox:
 		break;
 	case MacVenture::kPlainDBox:
-		return BorderBounds(6, 6, 6, 6);
+		return BorderBounds(1, 1, 1, 2);
 	case MacVenture::kAltBox:
-		return BorderBounds(4, 4, 4, 4); // Hand-tested
+		return BorderBounds(0, 0, 0, 0); // Hand-tested
 		break;
 	case MacVenture::kNoGrowDoc:
 		return BorderBounds(1, 17, 1, 1);
 	case MacVenture::kMovableDBox:
 		break;
 	case MacVenture::kZoomDoc:
-		return BorderBounds(1, 19, 16, 16);
+		return BorderBounds(1, 19, 17, 17);
 	case MacVenture::kZoomNoGrow:
 		break;
 	case MacVenture::kRDoc16:
 		break;
 	case MacVenture::kRDoc4:
-		return BorderBounds(0, 19, 1, 1);
+		return BorderBounds(1, 19, 1, 1);
 	case MacVenture::kRDoc6:
 		break;
 	case MacVenture::kRDoc10:


Commit: a7f2cea37d7ec5101d4b2235168e2b660993258a
    https://github.com/scummvm/scummvm/commit/a7f2cea37d7ec5101d4b2235168e2b660993258a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:59:10+02:00

Commit Message:
MACVENTURE: Add scroll to console window

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 13f0a9d..6a30985 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1270,6 +1270,12 @@ bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event &
 	if (_engine->needsClickToContinue())
 		return true;
 
+	debug("OutConsoleEvent: %d", click);
+	if (click == kBorderScrollUp) {
+		_consoleText->scrollUp();
+		return true;
+	}
+
 	return getWindowData(kOutConsoleWindow).visible;
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 90f2f42..aea6733 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -363,7 +363,6 @@ public:
 	void renderInto(Graphics::ManagedSurface *target, uint leftOffset) {
 		target->fillRect(target->getBounds(), kColorWhite);
 		const Graphics::Font *font = &_gui->getCurrentFont();
-		// HACK print the last lines visible (no scroll)
 		uint y = target->h - font->getFontHeight();
 		for (uint i = _lines.size() - 1; i != 0; i--) {
 			font->drawString(target, _lines[i], leftOffset, y, font->getStringWidth(_lines[i]), kColorBlack);
@@ -372,14 +371,25 @@ public:
 	}
 
 	void updateScroll() {
-		// TODO implemebt
+		_scrollPos = _lines.size() - 1;
 	}
 
+	void scrollDown() {
+		if (_scrollPos < _lines.size() - 1) _scrollPos++;
+	}
+
+	void scrollUp() {
+		debug("scroll up");
+		if (_scrollPos > 0) _scrollPos--;
+	}
+
+
 private:
 
 	Gui *_gui;
 
 	Common::StringArray _lines;
+	int _scrollPos;
 
 };
 


Commit: e25fb16a3739696fbf85d7666bf013abb40bec24
    https://github.com/scummvm/scummvm/commit/e25fb16a3739696fbf85d7666bf013abb40bec24
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:59:23+02:00

Commit Message:
MACVENTURE: Add scroll to console window

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6a30985..8045c27 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -227,7 +227,7 @@ void Gui::initWindows() {
 	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true, findWindowData(kMainGameWindow).type);
 
 	// In-game Output Console
-	_outConsoleWindow = _wm.addWindow(false, true, true);
+	_outConsoleWindow = _wm.addWindow(true, true, false);
 	_outConsoleWindow->setDimensions(getWindowData(kOutConsoleWindow).bounds);
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
@@ -1266,15 +1266,19 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 	}
 	return false;
 }
+
 bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	debug("OutConsoleEvent: %d", click);
-	if (click == kBorderScrollUp) {
+	if (click == kBorderScrollUp && event.type == Common::EVENT_LBUTTONDOWN) {
 		_consoleText->scrollUp();
 		return true;
 	}
+	if (click == kBorderScrollDown && event.type == Common::EVENT_LBUTTONDOWN) {
+		_consoleText->scrollDown();
+		return true;
+	}
 
 	return getWindowData(kOutConsoleWindow).visible;
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index aea6733..902aa8c 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -364,7 +364,7 @@ public:
 		target->fillRect(target->getBounds(), kColorWhite);
 		const Graphics::Font *font = &_gui->getCurrentFont();
 		uint y = target->h - font->getFontHeight();
-		for (uint i = _lines.size() - 1; i != 0; i--) {
+		for (uint i = _scrollPos; i != 0; i--) {
 			font->drawString(target, _lines[i], leftOffset, y, font->getStringWidth(_lines[i]), kColorBlack);
 			y -= font->getFontHeight();
 		}
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index ff4072d..871b104 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -714,8 +714,6 @@ void MacVentureEngine::openObject(ObjID objID) {
 		_gui->setWindowTitle(kMainGameWindow, _world->getText(objID, objID, objID)); // it ignores source and target in the original
 	} else { // Open inventory window
 		Common::Point p(_world->getObjAttr(objID, kAttrPosX), _world->getObjAttr(objID, kAttrPosY));
-		//getParentWin(obj).localToGlobal(p);
-		//globalToDesktop(p);
 		WindowReference invID = _gui->createInventoryWindow(objID);
 		_gui->setWindowTitle(invID, _world->getText(objID, objID, objID));
 		_gui->updateWindowInfo(invID, objID, _world->getChildren(objID, true));


Commit: b02185432716e9a6a9d163318a0ebf817750a167
    https://github.com/scummvm/scummvm/commit/b02185432716e9a6a9d163318a0ebf817750a167
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T18:59:37+02:00

Commit Message:
MACVENTURE: Add scroll to inventory windows

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/windows.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 8045c27..ed9bad6 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -467,6 +467,7 @@ bool Gui::loadWindows() {
 			newTitle[data.titleLength] = '\0';
 			data.title = Common::String(newTitle);
 		}
+		data.scrollPos = Common::Point(0, 0);
 
 		debug(4, "Window loaded: %s", data.title.c_str());
 
@@ -667,6 +668,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
 		pos += Common::Point(border.leftOffset, border.topOffset);
+		pos -= data.scrollPos;
 		ensureAssetLoaded(child);
 
 		_assets[child]->blitInto(
@@ -1345,18 +1347,33 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (event.type == Common::EVENT_LBUTTONDOWN && click == kBorderInner) {
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) return false;
 
 		Graphics::MacWindow *win = findWindow(ref);
 		WindowData &data = findWindowData((WindowReference) ref);
-		Common::Point pos;
-		// Click rect to local coordinates. We assume the click is inside the window ^
-		Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
-		checkSelect(data, event, clickRect, (WindowReference)ref);
 
+		if (click == kBorderScrollUp) {
+			data.scrollPos.y = MAX(0, data.scrollPos.y - kScrollAmount);
+		}
+		if (click == kBorderScrollDown) {
+			data.scrollPos.y += kScrollAmount;
+		}
+		if (click == kBorderScrollLeft) {
+			data.scrollPos.x = MAX(0, data.scrollPos.x - kScrollAmount);
+		}
+		if (click == kBorderScrollRight) {
+			data.scrollPos.x += kScrollAmount;
+		}
+
+		if (click == kBorderInner) {
+			Common::Point pos;
+			// Click rect to local coordinates. We assume the click is inside the window ^
+			Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
+			checkSelect(data, event, clickRect, (WindowReference)ref);
+		}
 	}
 	return true;
 }
diff --git a/engines/macventure/windows.h b/engines/macventure/windows.h
index 70af446..79b2798 100644
--- a/engines/macventure/windows.h
+++ b/engines/macventure/windows.h
@@ -65,6 +65,10 @@ struct DrawableObject {
 	}
 };
 
+enum {
+	kScrollAmount = 10
+};
+
 struct WindowData {
 	Common::Rect bounds;
 	MVWindowType type;
@@ -76,6 +80,7 @@ struct WindowData {
 	Common::String title;
 	Common::Array<DrawableObject> children;
 	bool updateScroll;
+	Common::Point scrollPos;
 };
 
 struct BorderBounds {


Commit: 518d336e5a5e266c2b443a9cacfa88abd541fe28
    https://github.com/scummvm/scummvm/commit/518d336e5a5e266c2b443a9cacfa88abd541fe28
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:35+02:00

Commit Message:
MACVENTURE: Fix item selection on scroll

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index ed9bad6..738ea90 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -683,7 +683,9 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 		// For test
 		if (MACVENTURE_DEBUG_GUI) {
-			surface->frameRect(_engine->getObjBounds(child), kColorGreen);
+			Common::Rect testBounds = _engine->getObjBounds(child);
+			testBounds.translate(-data.scrollPos.x, -data.scrollPos.y);
+			surface->frameRect(testBounds, kColorGreen);
 		}
 
 	}
@@ -982,7 +984,7 @@ void Gui::checkSelect(const WindowData &data, const Common::Event &event, const
 			child = (*it).obj;
 		}
 	}
-	if (child != 0) selectDraggable(child, ref, event.mouse);
+	if (child != 0) selectDraggable(child, ref, event.mouse, data.scrollPos);
 }
 
 bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
@@ -1004,12 +1006,12 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	return _assets[obj]->isRectInside(intersection);
 }
 
-void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click) {
+void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click, Common::Point scroll) {
 	if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
 		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
 		_draggedObj.startWin = origin;
-		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - click;
+		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - click - scroll;
 		_draggedObj.pos = click + _draggedObj.mouseOffset;
 		_draggedObj.startPos = _draggedObj.pos;
 	}
@@ -1263,7 +1265,7 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 		WindowData &data = findWindowData(kMainGameWindow);
 		Common::Point pos;
 		// Click rect to local coordinates. We assume the click is inside the window ^
-		Common::Rect clickRect = calculateClickRect(event.mouse, _mainGameWindow->getDimensions());
+		Common::Rect clickRect = calculateClickRect(event.mouse + data.scrollPos, _mainGameWindow->getDimensions());
 		checkSelect(data, event, clickRect, kMainGameWindow);
 	}
 	return false;
@@ -1371,7 +1373,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		if (click == kBorderInner) {
 			Common::Point pos;
 			// Click rect to local coordinates. We assume the click is inside the window ^
-			Common::Rect clickRect = calculateClickRect(event.mouse, win->getDimensions());
+			Common::Rect clickRect = calculateClickRect(event.mouse + data.scrollPos, win->getDimensions());
 			checkSelect(data, event, clickRect, (WindowReference)ref);
 		}
 	}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 902aa8c..8b0cbc6 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -232,7 +232,7 @@ private: // Methods
 	bool canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
 	void checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
-	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
+	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos, Common::Point scroll);
 	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
 	Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);


Commit: f58435a2bcf41153b5a0c0e61548dd350e24cad9
    https://github.com/scummvm/scummvm/commit/f58435a2bcf41153b5a0c0e61548dd350e24cad9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:35+02:00

Commit Message:
MACVENTURE: Add dejavu

Changed paths:
    engines/macventure/container.h
    engines/macventure/detection.cpp
    engines/macventure/detection_tables.h
    engines/macventure/gui.cpp
    engines/macventure/script.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index f0094a7..a909122 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -26,6 +26,7 @@
 #include "macventure/macventure.h"
 
 #include "common/file.h"
+#include "common/fs.h"
 #include "common/bitstream.h"
 
 namespace MacVenture {
@@ -38,20 +39,23 @@ struct ItemGroup {
 
 typedef uint32 ContainerHeader;
 
-class Container {	
+class Container {
 
 public:
-	Container(const char *filename) {
-		_filename = Common::String(filename);
+	Container(Common::String filename) {
+		_filename = filename;
 
-		if (!_file.open(filename))
-			error("Could not open %s", filename);
+		FSNode node = FSDirectory(".");
+		debug(node.getDisplayName().c_str());
+
+		if (!_file.open(_filename))
+			error("Could not open %s", _filename.c_str());
 
 		_res = _file.readStream(_file.size());
 		_header = _res->readUint32BE();
 		_simplified = false;
-		
-		if (!(_header & 0x80000000)) { 
+
+		if (!(_header & 0x80000000)) {
 			// Is simplified container
 			_simplified = true;
 			int dataLen = _res->size() - sizeof(_header);
@@ -75,7 +79,7 @@ public:
 
 			for (uint i = 0; i < numGroups; ++i) {
 				ItemGroup group;
-				
+
 				// Place myself in the correct position to read group
 				_res->seek(_header + (i * 6) + 0x30, SEEK_SET);
 				byte b1, b2, b3;
@@ -91,10 +95,10 @@ public:
 
 				// Place the bit reader in the correct position
 				// group.bitOffset indicates the offset from the start of the subHeader
-				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);		
+				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);
 				uint32 bits = group.bitOffset & 7;
 
-				for (uint j = 0; j < 64; ++j) {					
+				for (uint j = 0; j < 64; ++j) {
 					uint32 length = 0;
 					//debug("reading mask from address %x", _res->pos());
 					uint32 mask = _res->readUint32BE();
@@ -107,8 +111,8 @@ public:
 					for (x = 0; x < 16; x++) {
 						if (_huff[x] > mask) break;
 					}
-					
-					// I will opt to copy the code from webventure, 
+
+					// I will opt to copy the code from webventure,
 					// But according to the docs, this call should suffice:
 					// length = bitStream.getBits(_lens[x]);
 					// The problem is that _lens[] usually contains values larger
@@ -131,19 +135,19 @@ public:
 						else length >>= (32 - bitSize) - bits;
 						length &= (1 << bitSize) - 1;
 						length |= 1 << bitSize;
-						bits += bitSize;	
+						bits += bitSize;
 						if (bits & 0x10) {
 							bits &= 0xF;
 							_res->seek(2, SEEK_CUR);
 						}
-					}		
+					}
 
 					group.lengths[j] = length;
 					debug(11, "Load legth of object %d:%d is %d", i, j, length);
 				}
-				
-				_groups.push_back(group);				
-			}			 
+
+				_groups.push_back(group);
+			}
 		}
 	}
 
@@ -173,12 +177,12 @@ public:
 	/**
 	* getItemByteSize should be called before this one
 	*/
-	Common::SeekableReadStream *getItem(uint32 id) {	
+	Common::SeekableReadStream *getItem(uint32 id) {
 		if (_simplified) {
 			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
 		} else {
 			uint32 groupID = (id >> 6);
-			uint32 objectIndex = id & 0x3f; // Index within the group		
+			uint32 objectIndex = id & 0x3f; // Index within the group
 
 			uint32 offset = 0;
 			for (uint i = 0; i < objectIndex; i++) {
@@ -192,24 +196,24 @@ public:
 		Common::SeekableReadStream *res = _res->readStream(getItemByteSize(id) * 2);
 		return res;
 	}
-	
+
 protected:
 
 	bool _simplified;
-	
+
 	uint _lenObjs; // In the case of simple container, lenght of an object
 	uint _numObjs;
 
 	ContainerHeader _header;
-	
+
 	uint16 _huff[15];   // huffman masks
 	uint8  _lens[16];   // huffman lengths
 	Common::Array<ItemGroup> _groups;
-	
+
 	Common::String _filename;
 	Common::File _file;
 	Common::SeekableReadStream *_res;
-	
+
 
 };
 
diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 88fb85d..597f859 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -41,6 +41,7 @@ namespace MacVenture {
 
 static const PlainGameDescriptor macventureGames[] = {
 	{ "shadowgate", "Shadowgate" },
+	{ "deja_vu", "Deja Vu"},
 	{ 0, 0 }
 };
 
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index e2e9426..ebcf35f 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -28,6 +28,7 @@ namespace MacVenture {
 
 static const ADGameDescription gameDescriptions[] = {
 	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
+	BASEGAME("deja_vu", "Zojoi Rerelease", "Déjà Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 738ea90..7691b56 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -368,7 +368,7 @@ void Gui::loadBorder(Graphics::MacWindow *target, Common::String filename, bool
 }
 
 void Gui::loadGraphics() {
-	_graphics = new Container(_engine->getFilePath(kGraphicPathID).c_str());
+	_graphics = new Container(_engine->getFilePath(kGraphicPathID));
 }
 
 bool Gui::loadMenus() {
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 36aabae..51bfa33 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -33,7 +33,7 @@ ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
 	_engine = engine;
 	_world = world;
 	// HACK
-	_scripts = new Container("Shadowgate II/Shadow Filter");
+	_scripts = new Container(_engine->getFilePath(kFilterPathID));
 }
 
 ScriptEngine::~ScriptEngine() {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index e6efeb5..f5af029 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -20,10 +20,10 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
-	_objectConstants = new Container(_engine->getFilePath(kObjectPathID).c_str());
+	_objectConstants = new Container(_engine->getFilePath(kObjectPathID));
 	calculateObjectRelations();
 
-	_gameText = new Container(_engine->getFilePath(kTextPathID).c_str());
+	_gameText = new Container(_engine->getFilePath(kTextPathID));
 
 	delete saveGameRes;
 	saveGameFile.close();


Commit: 5781b738be5b7821982ee966743696c83492dbd3
    https://github.com/scummvm/scummvm/commit/5781b738be5b7821982ee966743696c83492dbd3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Deja Vu playable

Changed paths:
    engines/macventure/container.h
    engines/macventure/detection_tables.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/stringtable.h



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index a909122..21fdc6c 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -45,8 +45,8 @@ public:
 	Container(Common::String filename) {
 		_filename = filename;
 
-		FSNode node = FSDirectory(".");
-		debug(node.getDisplayName().c_str());
+		//FSNode node = FSDirectory(".");
+		//debug(node.getDisplayName().c_str());
 
 		if (!_file.open(_filename))
 			error("Could not open %s", _filename.c_str());
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index ebcf35f..0b55d03 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -28,7 +28,7 @@ namespace MacVenture {
 
 static const ADGameDescription gameDescriptions[] = {
 	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
-	BASEGAME("deja_vu", "Zojoi Rerelease", "Déjà Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
+	BASEGAME("deja_vu", "Zojoi Rerelease", "Deja Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 871b104..9cba050 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -33,6 +33,16 @@
 
 namespace MacVenture {
 
+// HACK, see below
+void toASCII(Common::String &str) {
+	debug("toASCII: %s", str.c_str());
+	Common::String::iterator it = str.begin();
+	for (; it != str.end(); it++) {
+		if (*it == '\216') { str.replace(it, it + 1, "e"); }
+		if (*it == '\210') { str.replace(it, it + 1, "a"); }
+	}
+}
+
 enum {
 	kMaxMenuTitleLength = 30
 };
@@ -438,7 +448,10 @@ Common::String MacVentureEngine::getStartGameFileName() {
 	char *fileName = new char[length + 1];
 	res->read(fileName, length);
 	fileName[length] = '\0';
-  return Common::String(fileName, length);
+	Common::String result = Common::String(fileName, length);
+	// HACK, see definition of toASCII
+	toASCII(result);
+  return result;
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index b228a34..6baaa31 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -54,6 +54,9 @@ class ScriptEngine;
 
 typedef uint32 ObjID;
 
+// HACK, until I find a way to translate correctly
+extern void toASCII(Common::String &str);
+
 enum {
 	kScreenWidth = 512,
 	kScreenHeight = 342
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index ffb9d37..ff9eddc 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -29,6 +29,8 @@
 
 namespace MacVenture {
 
+extern void toASCII(Common::String &str);
+
 enum StringTableID {
 	kErrorStringTableID = 0x80,
 	kFilenamesStringTableID = 0x81,
@@ -39,11 +41,11 @@ enum StringTableID {
 
 class StringTable {
 public:
-	StringTable(MacVentureEngine *engine, Common::MacResManager *resMan, StringTableID id) { 
+	StringTable(MacVentureEngine *engine, Common::MacResManager *resMan, StringTableID id) {
 		_engine = engine;
 		_resourceManager = resMan;
 		_id = id;
-		
+
 		if (!loadStrings())
 			error("Could not load string table %x", id);
 	}
@@ -80,8 +82,11 @@ private:
 			char* str = new char[strLength + 1];
 			res->read(str, strLength);
 			str[strLength] = '\0';
+			// HACK until a proper special char implementation is found, this will have to do.
+			Common::String result = Common::String(str);
+			toASCII(result);
 			debug(11, "Loaded string %s", str);
-			_strings.push_back(Common::String(str));
+			_strings.push_back(Common::String(result));
 			delete[] str;
 		}
 
@@ -101,4 +106,3 @@ private:
 } // End of namespace MacVenture
 
 #endif
-


Commit: 74ea29d0fa489f2fe903c06bdb935bf5f78eb69b
    https://github.com/scummvm/scummvm/commit/74ea29d0fa489f2fe903c06bdb935bf5f78eb69b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add detection for Deja Vu II

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/detection_tables.h



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 597f859..85cbb11 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -42,6 +42,7 @@ namespace MacVenture {
 static const PlainGameDescriptor macventureGames[] = {
 	{ "shadowgate", "Shadowgate" },
 	{ "deja_vu", "Deja Vu"},
+	{ "deja_vu2", "Deja Vu II"},
 	{ 0, 0 }
 };
 
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
index 0b55d03..6ba51e0 100644
--- a/engines/macventure/detection_tables.h
+++ b/engines/macventure/detection_tables.h
@@ -29,6 +29,7 @@ namespace MacVenture {
 static const ADGameDescription gameDescriptions[] = {
 	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
 	BASEGAME("deja_vu", "Zojoi Rerelease", "Deja Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
+	BASEGAME("deja_vu2", "Zojoi Rerelease", "Lost in Las Vegas.bin", "8f8e1d8d41f577ee0fbc03847969af0d", 66520), // Zojoi Rerelease
 	AD_TABLE_END_MARKER
 };
 } // End of namespace MacVenture


Commit: b64622744f480b04dab9603fe0c09fb76e8e25b3
    https://github.com/scummvm/scummvm/commit/b64622744f480b04dab9603fe0c09fb76e8e25b3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add infrastructure to support sound system

Changed paths:
  A engines/macventure/sound.cpp
  A engines/macventure/sound.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk
    engines/macventure/script.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9cba050..5d9d6f9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -54,6 +54,8 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 	_debugger = NULL;
 	_gui = NULL;
 
+	_soundManager = NULL;
+
 	debug("MacVenture::MacVentureEngine()");
 }
 
@@ -80,6 +82,9 @@ MacVentureEngine::~MacVentureEngine() {
 
 	if (_textHuffman)
 		delete _textHuffman;
+
+	if (_soundManager)
+		delete _soundManager;
 }
 
 Common::Error MacVentureEngine::run() {
@@ -112,6 +117,8 @@ Common::Error MacVentureEngine::run() {
 	_world = new World(this, _resourceManager);
 	_scriptEngine = new ScriptEngine(this, _world);
 
+	_soundManager = new SoundManager(this);
+
 	_paused = false;
 	_halted = false;
 	_cmdReady = false;
@@ -314,26 +321,11 @@ void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source,
 	_textQueue.push_back(newText);
 }
 
-bool MacVentureEngine::printTexts() {
-	for (uint i = 0; i < _textQueue.size(); i++) {
-		QueuedText text = _textQueue.front();
-		_textQueue.remove_at(0);
-		switch (text.id) {
-		case kTextNumber:
-			_gui->printText(Common::String(text.asset));
-			gameChanged();
-			break;
-		case kTextNewLine:
-			_gui->printText(Common::String(""));
-			gameChanged();
-			break;
-		case kTextPlain:
-			_gui->printText(_world->getText(text.asset, text.source, text.destination));
-			gameChanged();
-			break;
-		}
-	}
-	return false;
+void MacVentureEngine::enqueueSound(SoundQueueID type, ObjID target) {
+	QueuedSound newSound;
+	newSound.id = type;
+	newSound.reference = target;
+	_soundQueue.push_back(newSound);
 }
 
 void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick) {
@@ -529,6 +521,8 @@ void MacVentureEngine::endGame() {
 bool MacVentureEngine::updateState() {
 	runObjQueue();
 	bool wait = printTexts();
+	// HACK playSounds should accept a bool passed to updateState
+	wait |= playSounds(true);
 	return wait;
 }
 
@@ -581,6 +575,54 @@ void MacVentureEngine::runObjQueue() {
 	}
 }
 
+bool MacVentureEngine::printTexts() {
+	for (uint i = 0; i < _textQueue.size(); i++) {
+		QueuedText text = _textQueue.front();
+		_textQueue.remove_at(0);
+		switch (text.id) {
+		case kTextNumber:
+			_gui->printText(Common::String(text.asset));
+			gameChanged();
+			break;
+		case kTextNewLine:
+			_gui->printText(Common::String(""));
+			gameChanged();
+			break;
+		case kTextPlain:
+			_gui->printText(_world->getText(text.asset, text.source, text.destination));
+			gameChanged();
+			break;
+		}
+	}
+	return false;
+}
+
+bool MacVentureEngine::playSounds(bool pause) {
+	int delay=0;
+	while (!_soundQueue.empty()) {
+		QueuedSound item = _soundQueue.front();
+		_soundQueue.remove_at(0);
+		switch (item.id) {
+		case kSoundPlay:
+			_soundManager->playSound(item.reference);
+			break;
+		case kSoundPlayAndWait:
+			delay = _soundManager->playSound(item.reference);
+			break;
+		case kSoundWait:
+			//wait for sound to finish?
+			break;
+		}
+	}
+	if (pause && delay > 0) {
+		warning("Sound pausing not yet tested. Pausing for %d", delay * 1000);
+		g_system->delayMillis(delay * 1000);
+		preparedToRun();
+		return true;
+	}
+	return false;
+}
+
 void MacVentureEngine::updateControls() {
 	if (_activeControl)
 		_activeControl = kNoCommand;
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 6baaa31..28eb8e4 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -41,6 +41,7 @@
 #include "macventure/script.h"
 #include "macventure/controls.h"
 #include "macventure/windows.h"
+#include "macventure/sound.h"
 
 struct ADGameDescription;
 
@@ -52,6 +53,8 @@ class Console;
 class World;
 class ScriptEngine;
 
+class SoundManager;
+
 typedef uint32 ObjID;
 
 // HACK, until I find a way to translate correctly
@@ -161,6 +164,17 @@ struct QueuedText {
 	ObjID asset;
 };
 
+enum SoundQueueID {
+	kSoundPlay = 1,
+	kSoundPlayAndWait = 2,
+	kSoundWait = 3
+};
+
+struct QueuedSound {
+	SoundQueueID id;
+	ObjID reference;
+};
+
 class MacVentureEngine : public Engine {
 
 public:
@@ -191,9 +205,11 @@ public:
 
 	void enqueueObject(ObjectQueueID type, ObjID objID, ObjID target = 0);
 	void enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text);
+	void enqueueSound(SoundQueueID type, ObjID target);
 
 	void runObjQueue();
 	bool printTexts();
+	bool playSounds(bool pause);
 
 	void handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick);
 	void handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent);
@@ -205,7 +221,6 @@ public:
 	void setTextInput(Common::String content);
 	Common::String getUserInput();
 
-
 	// Data retrieval
 	Common::String getStartGameFileName();
 	bool isPaused();
@@ -296,6 +311,8 @@ private: // Attributes
 	StringTable *_decodingNamingArticles;
 	StringTable *_decodingIndirectArticles;
 
+	SoundManager *_soundManager;
+
 	// Engine state
 	GameState _gameState;
 	GlobalSettings _globalSettings;
@@ -308,7 +325,7 @@ private: // Attributes
 
 	Common::Array<QueuedObject> _objQueue;
 	Common::Array<QueuedObject> _inQueue;
-	Common::Array<QueuedObject> _soundQueue;
+	Common::Array<QueuedSound> _soundQueue;
 	Common::Array<QueuedText> _textQueue;
 
 	// Selections
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 48c8930..a1e2f5e 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -12,7 +12,8 @@ MODULE_OBJS := \
 	dialog.o \
 	controls.o \
 	prebuilt_dialogs.o \
-	windows.o
+	windows.o \
+	sound.o
 
 
 MODULE_DIRS += \
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 51bfa33..55bb406 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -32,7 +32,6 @@ namespace MacVenture {
 ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
 	_engine = engine;
 	_world = world;
-	// HACK
 	_scripts = new Container(_engine->getFilePath(kFilterPathID));
 }
 
@@ -989,17 +988,17 @@ void ScriptEngine::opc6P2(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opc7PLBG(EngineState * state, EngineFrame * frame) {
-	state->pop();
-	op00NOOP(0xc7);
+	word target = state->pop();
+	_engine->enqueueSound(kSoundPlay, target);
 }
 
 void ScriptEngine::opc8PLAW(EngineState * state, EngineFrame * frame) {
-	state->pop();
-	op00NOOP(0xc8);
+	word target = state->pop();
+	_engine->enqueueSound(kSoundPlayAndWait, target);
 }
 
 void ScriptEngine::opc9WAIT(EngineState * state, EngineFrame * frame) {
-	op00NOOP(0xc9);
+	_engine->enqueueSound(kSoundWait, 0);
 }
 
 void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
new file mode 100644
index 0000000..2addb19
--- /dev/null
+++ b/engines/macventure/sound.cpp
@@ -0,0 +1,95 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/sound.h"
+
+namespace MacVenture {
+
+SoundAsset::SoundAsset(Container *container, ObjID id) :
+	_container(container), _id(id) {
+
+	//TODO Decode the sound
+	if (_container->getItemByteSize(_id) == 0)
+		warning("Trying to load an empty sound asset.");
+
+	Common::SeekableReadStream *stream = _container->getItem(_id);
+
+	stream->seek(5, SEEK_SET);
+	SoundType type = (SoundType)stream->readByte();
+
+	switch(type) {
+	case kSound10:
+		decode10(stream);
+		break;
+	default:
+		warning("Unrecognized sound type: %x", type);
+	}
+
+	delete stream;
+}
+
+SoundAsset::~SoundAsset() {}
+
+void SoundAsset::play() {
+	//TODO: Play song
+	warning("SoundAsset::play() not yet implemented");
+}
+
+uint32 SoundAsset::getPlayLength() {
+	return _length / _frequency;
+}
+
+void SoundAsset::decode10(Common::SeekableReadStream *stream) {
+	//TODO: Decode 10
+	debug("Decoding sound type 10");
+}
+
+// SoundManager
+SoundManager::SoundManager(MacVentureEngine *engine) {
+	_container = nullptr;
+	Common::String filename = engine->getFilePath(kSoundPathID);
+	_container = new Container(filename);
+	debug("Created sound manager with file %s", filename.c_str());
+}
+
+SoundManager::~SoundManager(){
+	if (_container)
+		delete _container;
+
+	Common::HashMap<ObjID, SoundAsset*>::iterator it;
+	for (it = _assets.begin(); it != _assets.end(); it++) {
+		delete it->_value;
+	}
+}
+
+uint32 SoundManager::playSound(ObjID sound) {
+	ensureLoaded(sound);
+	_assets[sound]->play();
+	return _assets[sound]->getPlayLength();
+}
+
+void SoundManager::ensureLoaded(ObjID sound) {
+	if (!_assets.contains(sound))
+		_assets[sound] = new SoundAsset(_container, sound);
+}
+
+} //End of namespace MacVenture
diff --git a/engines/macventure/sound.h b/engines/macventure/sound.h
new file mode 100644
index 0000000..3c7a68f
--- /dev/null
+++ b/engines/macventure/sound.h
@@ -0,0 +1,85 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_SOUND_H
+#define MACVENTURE_SOUND_H
+
+#include "macventure/macventure.h"
+#include "macventure/container.h"
+
+#include "common/file.h"
+#include "common/hashmap.h"
+
+namespace MacVenture {
+
+enum SoundType {
+	kSound10 = 0x10,
+	kSound12 = 0x12,
+	kSound18 = 0x18,
+	kSound1a = 0x1a,
+	kSound44 = 0x44,
+	kSound78 = 0x78,
+	kSound7e = 0x7e
+};
+
+class SoundAsset {
+
+public:
+	SoundAsset(Container *container, ObjID id);
+	~SoundAsset();
+
+	void play();
+	uint32 getPlayLength();
+
+private:
+
+	void decode10(Common::SeekableReadStream *stream);
+
+private:
+
+	Container *_container;
+	ObjID _id;
+
+	Common::Array<byte> _data;
+	uint32 _length;
+	uint32 _frequency;
+};
+
+class SoundManager {
+public:
+	SoundManager(MacVentureEngine *engine);
+	~SoundManager();
+
+	uint32 playSound(ObjID sound);
+
+private:
+	void ensureLoaded(ObjID sound);
+
+private:
+
+	Container *_container;
+	Common::HashMap<ObjID, SoundAsset*> _assets;
+
+};
+} // End of namespace MacVenture
+
+#endif


Commit: 2ff5dad423efd34085876dd8acb6b68046751aed
    https://github.com/scummvm/scummvm/commit/2ff5dad423efd34085876dd8acb6b68046751aed
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add decoding for 0x10 and 0x7e sounds

Changed paths:
    engines/macventure/sound.cpp
    engines/macventure/sound.h



diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 2addb19..fe4637e 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -35,11 +35,14 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 
 	stream->seek(5, SEEK_SET);
 	SoundType type = (SoundType)stream->readByte();
-
+	debug(2, "Decoding sound of type %x", type);
 	switch(type) {
 	case kSound10:
 		decode10(stream);
 		break;
+	case kSound7e:
+		decode7e(stream);
+		break;
 	default:
 		warning("Unrecognized sound type: %x", type);
 	}
@@ -59,8 +62,41 @@ uint32 SoundAsset::getPlayLength() {
 }
 
 void SoundAsset::decode10(Common::SeekableReadStream *stream) {
-	//TODO: Decode 10
-	debug("Decoding sound type 10");
+	Common::Array<byte> wavtable;
+	stream->seek(0x198, SEEK_SET);
+	for (int i = 0; i < 16; i++) {
+		wavtable.push_back(stream->readByte());
+	}
+	_length = stream->readUint32BE() * 2;
+	//Unused
+	stream->readUint16BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	byte ch = 0;
+	for (int i = 0; i < _length; i++) {
+		if (i & 1) ch >>= 4;
+		else ch = stream->readByte();
+		_data.push_back(wavtable[ch & 0xf]);
+	}
+}
+
+void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
+	Common::Array<byte> wavtable;
+	stream->seek(0xc2, SEEK_SET);
+	for (int i = 0; i < 16; i++) {
+		wavtable.push_back(stream->readByte());
+	}
+	//Unused
+	stream->readUint32BE();
+	_length = stream->readUint32BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	uint32 last=0x80;
+	byte ch = 0;
+	for (int i = 0; i < _length; i++) {
+		if (i & 1) ch <<= 4;
+		else ch = stream->readByte();
+		last += wavtable[(ch >> 4) & 0xf];
+		_data.push_back(last & 0xff);
+	}
 }
 
 // SoundManager
@@ -68,7 +104,7 @@ SoundManager::SoundManager(MacVentureEngine *engine) {
 	_container = nullptr;
 	Common::String filename = engine->getFilePath(kSoundPathID);
 	_container = new Container(filename);
-	debug("Created sound manager with file %s", filename.c_str());
+	debug(1, "Created sound manager with file %s", filename.c_str());
 }
 
 SoundManager::~SoundManager(){
diff --git a/engines/macventure/sound.h b/engines/macventure/sound.h
index 3c7a68f..d3fb136 100644
--- a/engines/macventure/sound.h
+++ b/engines/macventure/sound.h
@@ -53,6 +53,7 @@ public:
 private:
 
 	void decode10(Common::SeekableReadStream *stream);
+	void decode7e(Common::SeekableReadStream *stream);
 
 private:
 


Commit: f5338f4beb5069ebfbab1d09e8a839e65eeaf8a7
    https://github.com/scummvm/scummvm/commit/f5338f4beb5069ebfbab1d09e8a839e65eeaf8a7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add decoding for the rest of the sounds

Changed paths:
    engines/macventure/sound.cpp
    engines/macventure/sound.h



diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index fe4637e..f7fb0b5 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -40,6 +40,21 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 	case kSound10:
 		decode10(stream);
 		break;
+	case kSound12:
+		decode12(stream);
+		break;
+	case kSound18:
+		decode18(stream);
+		break;
+	case kSound1a:
+		decode1a(stream);
+		break;
+	case kSound44:
+		decode44(stream);
+		break;
+	case kSound78:
+		decode78(stream);
+		break;
 	case kSound7e:
 		decode7e(stream);
 		break;
@@ -62,9 +77,68 @@ uint32 SoundAsset::getPlayLength() {
 }
 
 void SoundAsset::decode10(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x10 untested");
 	Common::Array<byte> wavtable;
 	stream->seek(0x198, SEEK_SET);
-	for (int i = 0; i < 16; i++) {
+	for (uint i = 0; i < 16; i++) {
+		wavtable.push_back(stream->readByte());
+	}
+	_length = stream->readUint32BE() * 2;
+	//Unused
+	stream->readUint16BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	byte ch = 0;
+	for (uint i = 0; i < _length; i++) {
+		if (i & 1) ch >>= 4;
+		else ch = stream->readByte();
+		_data.push_back(wavtable[ch & 0xf]);
+	}
+}
+
+void SoundAsset::decode12(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x12 untested");
+	stream->seek(0xc, SEEK_SET);
+	uint32 repeat = stream->readUint16BE();
+	stream->seek(0x34, SEEK_SET);
+	uint32 base = stream->readUint16BE() + 0x34;
+	stream->seek(base, SEEK_SET);
+	_length = stream->readUint32BE() - 6;
+	stream->readUint16BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	stream->seek(0xe2, SEEK_SET);
+	// TODO: Possible source of bugs, the original just assigns the seek to the scales
+	uint32 scales = stream->pos() + 0xe2;
+	for (uint i = 0; i < repeat; i++) {
+		stream->seek(scales + i * 2, SEEK_SET);
+		uint32 scale = stream->readUint16BE();
+		stream->seek(base + 0xa, SEEK_SET);
+		for (uint j = 0; j < _length; j++) {
+			byte ch = stream->readByte();
+			if (ch & 0x80) {
+				ch -= 0x80;
+				uint32 env= ch * scale;
+				ch = (env >> 8) & 0xff;
+				if (ch & 0x80) ch = 0x7f;
+				ch += 0x80;
+			} else {
+				ch = (ch ^ 0xff) + 1;
+				ch -= 0x80;
+				uint32 env = ch * scale;
+				ch = (env >> 8) & 0xff;
+				if (ch & 0x80) ch = 0x7f;
+				ch += 0x80;
+				ch = (ch ^ 0xff) + 1;
+			}
+			_data.push_back(ch);
+		}
+	}
+}
+
+void SoundAsset::decode18(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x18 untested");
+	Common::Array<byte> wavtable;
+	stream->seek(0x252, SEEK_SET);
+	for (uint i = 0; i < 16; i++) {
 		wavtable.push_back(stream->readByte());
 	}
 	_length = stream->readUint32BE() * 2;
@@ -72,17 +146,65 @@ void SoundAsset::decode10(Common::SeekableReadStream *stream) {
 	stream->readUint16BE();
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	byte ch = 0;
-	for (int i = 0; i < _length; i++) {
+	for (uint i = 0; i < _length; i++) {
+		if (i & 1) ch >>= 4;
+		else ch = stream->readByte();
+		_data.push_back(wavtable[ch & 0xf]);
+	}
+}
+
+void SoundAsset::decode1a(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x1a untested");
+	Common::Array<byte> wavtable;
+	stream->seek(0x220, SEEK_SET);
+	for (uint i = 0; i < 16; i++) {
+		wavtable.push_back(stream->readByte());
+	}
+	_length = stream->readUint32BE();
+	//Unused
+	stream->readUint16BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	byte ch = 0;
+	for (uint i = 0; i < _length; i++) {
 		if (i & 1) ch >>= 4;
 		else ch = stream->readByte();
 		_data.push_back(wavtable[ch & 0xf]);
 	}
 }
 
+void SoundAsset::decode44(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x44 untested");
+	stream->seek(0x5e, SEEK_SET);
+	_length = stream->readUint32BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	for (uint i = 0; i < _length; i++) {
+		_data.push_back(stream->readByte());
+	}
+}
+
+void SoundAsset::decode78(Common::SeekableReadStream *stream) {
+	warning("Decode sound 0x78 untested");
+	Common::Array<byte> wavtable;
+	stream->seek(0xba, SEEK_SET);
+	for (uint i = 0; i < 16; i++) {
+		wavtable.push_back(stream->readByte());
+	}
+	//Unused
+	stream->readUint32BE();
+	_length = stream->readUint32BE();
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	byte ch = 0;
+	for (uint i = 0; i < _length; i++) {
+		if (i & 1) ch <<= 4;
+		else ch = stream->readByte();
+		_data.push_back(wavtable[(ch >> 4) & 0xf]);
+	}
+}
+
 void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	Common::Array<byte> wavtable;
 	stream->seek(0xc2, SEEK_SET);
-	for (int i = 0; i < 16; i++) {
+	for (uint i = 0; i < 16; i++) {
 		wavtable.push_back(stream->readByte());
 	}
 	//Unused
@@ -91,7 +213,7 @@ void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	uint32 last=0x80;
 	byte ch = 0;
-	for (int i = 0; i < _length; i++) {
+	for (uint i = 0; i < _length; i++) {
 		if (i & 1) ch <<= 4;
 		else ch = stream->readByte();
 		last += wavtable[(ch >> 4) & 0xf];
diff --git a/engines/macventure/sound.h b/engines/macventure/sound.h
index d3fb136..58fc650 100644
--- a/engines/macventure/sound.h
+++ b/engines/macventure/sound.h
@@ -53,6 +53,11 @@ public:
 private:
 
 	void decode10(Common::SeekableReadStream *stream);
+	void decode12(Common::SeekableReadStream *stream);
+	void decode18(Common::SeekableReadStream *stream);
+	void decode1a(Common::SeekableReadStream *stream);
+	void decode44(Common::SeekableReadStream *stream);
+	void decode78(Common::SeekableReadStream *stream);
 	void decode7e(Common::SeekableReadStream *stream);
 
 private:


Commit: 842bff03e0fd949bcac1b3fd4c281d3fc5547ca5
    https://github.com/scummvm/scummvm/commit/842bff03e0fd949bcac1b3fd4c281d3fc5547ca5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Implement missing instruction

Changed paths:
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 55bb406..6f0a782 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -453,7 +453,8 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 				opdbROBQ(state, frame);
 				break;
 			case 0xdc: //run sound queue
-				opdcRSQ(state, frame);
+				if (opdcRSQ(state, frame))
+					return true;
 				break;
 			case 0xdd: //run text queue
 				opddRTQ(state, frame);
@@ -1109,8 +1110,8 @@ void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
 	_engine->runObjQueue();
 }
 
-void ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
-	op00NOOP(0xdc);
+bool ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
+	return _engine->playSounds(true);
 }
 
 void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 5760a31..7c4b77d 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -257,7 +257,7 @@ private:
 	void opd9SLEEP(EngineState *state, EngineFrame *frame);	//sleep
 	void opdaCLICK(EngineState *state, EngineFrame *frame);	//click to continue
 	void opdbROBQ(EngineState *state, EngineFrame *frame);	//run queue
-	void opdcRSQ(EngineState *state, EngineFrame *frame);	//run sound queue
+	bool opdcRSQ(EngineState *state, EngineFrame *frame);	//run sound queue
 	void opddRTQ(EngineState *state, EngineFrame *frame);	//run text queue
 	void opdeUPSC(EngineState *state, EngineFrame *frame);	//update screen
 	void opdfFMAI(EngineState *state, EngineFrame *frame);	//flash main window


Commit: dd2908fe42d54037436e7b3a05bc275d11822a93
    https://github.com/scummvm/scummvm/commit/dd2908fe42d54037436e7b3a05bc275d11822a93
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add basic audio playback

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/sound.cpp
    engines/macventure/sound.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 5d9d6f9..21d98b1 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -117,7 +117,7 @@ Common::Error MacVentureEngine::run() {
 	_world = new World(this, _resourceManager);
 	_scriptEngine = new ScriptEngine(this, _world);
 
-	_soundManager = new SoundManager(this);
+	_soundManager = new SoundManager(this, _mixer);
 
 	_paused = false;
 	_halted = false;
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index f7fb0b5..7eca8b4 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -22,12 +22,45 @@
 
 #include "macventure/sound.h"
 
+#include "audio/mixer.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+
 namespace MacVenture {
 
+// SoundManager
+SoundManager::SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer) {
+	_container = nullptr;
+	Common::String filename = engine->getFilePath(kSoundPathID);
+	_container = new Container(filename);
+	_mixer = mixer;
+	debug(1, "Created sound manager with file %s", filename.c_str());
+}
+
+SoundManager::~SoundManager(){
+	if (_container)
+	delete _container;
+
+	Common::HashMap<ObjID, SoundAsset*>::iterator it;
+	for (it = _assets.begin(); it != _assets.end(); it++) {
+		delete it->_value;
+	}
+}
+
+uint32 SoundManager::playSound(ObjID sound) {
+	ensureLoaded(sound);
+	_assets[sound]->play(_mixer, &_handle);
+	return _assets[sound]->getPlayLength();
+}
+
+void SoundManager::ensureLoaded(ObjID sound) {
+	if (!_assets.contains(sound))
+	_assets[sound] = new SoundAsset(_container, sound);
+}
+
 SoundAsset::SoundAsset(Container *container, ObjID id) :
 	_container(container), _id(id) {
 
-	//TODO Decode the sound
 	if (_container->getItemByteSize(_id) == 0)
 		warning("Trying to load an empty sound asset.");
 
@@ -67,9 +100,9 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 
 SoundAsset::~SoundAsset() {}
 
-void SoundAsset::play() {
-	//TODO: Play song
-	warning("SoundAsset::play() not yet implemented");
+void SoundAsset::play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle) {
+	Audio::AudioStream *sound = Audio::makeRawStream(&_data.front(), _length, _frequency, Audio::FLAG_UNSIGNED);
+	mixer->playStream(Audio::Mixer::kPlainSoundType, soundHandle, sound);
 }
 
 uint32 SoundAsset::getPlayLength() {
@@ -221,33 +254,4 @@ void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	}
 }
 
-// SoundManager
-SoundManager::SoundManager(MacVentureEngine *engine) {
-	_container = nullptr;
-	Common::String filename = engine->getFilePath(kSoundPathID);
-	_container = new Container(filename);
-	debug(1, "Created sound manager with file %s", filename.c_str());
-}
-
-SoundManager::~SoundManager(){
-	if (_container)
-		delete _container;
-
-	Common::HashMap<ObjID, SoundAsset*>::iterator it;
-	for (it = _assets.begin(); it != _assets.end(); it++) {
-		delete it->_value;
-	}
-}
-
-uint32 SoundManager::playSound(ObjID sound) {
-	ensureLoaded(sound);
-	_assets[sound]->play();
-	return _assets[sound]->getPlayLength();
-}
-
-void SoundManager::ensureLoaded(ObjID sound) {
-	if (!_assets.contains(sound))
-		_assets[sound] = new SoundAsset(_container, sound);
-}
-
 } //End of namespace MacVenture
diff --git a/engines/macventure/sound.h b/engines/macventure/sound.h
index 58fc650..d1b1bb8 100644
--- a/engines/macventure/sound.h
+++ b/engines/macventure/sound.h
@@ -29,6 +29,8 @@
 #include "common/file.h"
 #include "common/hashmap.h"
 
+#include "audio/mixer.h"
+
 namespace MacVenture {
 
 enum SoundType {
@@ -47,7 +49,7 @@ public:
 	SoundAsset(Container *container, ObjID id);
 	~SoundAsset();
 
-	void play();
+	void play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle);
 	uint32 getPlayLength();
 
 private:
@@ -72,7 +74,7 @@ private:
 
 class SoundManager {
 public:
-	SoundManager(MacVentureEngine *engine);
+	SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer);
 	~SoundManager();
 
 	uint32 playSound(ObjID sound);
@@ -84,6 +86,8 @@ private:
 
 	Container *_container;
 	Common::HashMap<ObjID, SoundAsset*> _assets;
+	Audio::SoundHandle _handle;
+	Audio::Mixer *_mixer;
 
 };
 } // End of namespace MacVenture


Commit: 90b022c07834d13c0ceacadad09d35ff0ea193b3
    https://github.com/scummvm/scummvm/commit/90b022c07834d13c0ceacadad09d35ff0ea193b3
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Test some sound decodings

Changed paths:
    engines/macventure/sound.cpp



diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 7eca8b4..97fe3c6 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -206,7 +206,6 @@ void SoundAsset::decode1a(Common::SeekableReadStream *stream) {
 }
 
 void SoundAsset::decode44(Common::SeekableReadStream *stream) {
-	warning("Decode sound 0x44 untested");
 	stream->seek(0x5e, SEEK_SET);
 	_length = stream->readUint32BE();
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
@@ -216,7 +215,6 @@ void SoundAsset::decode44(Common::SeekableReadStream *stream) {
 }
 
 void SoundAsset::decode78(Common::SeekableReadStream *stream) {
-	warning("Decode sound 0x78 untested");
 	Common::Array<byte> wavtable;
 	stream->seek(0xba, SEEK_SET);
 	for (uint i = 0; i < 16; i++) {


Commit: b7b4862e4c93898e5a315c672e52df0ea1894cc6
    https://github.com/scummvm/scummvm/commit/b7b4862e4c93898e5a315c672e52df0ea1894cc6
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Add metadata to savegames

Changed paths:
  A engines/macventure/saveload.cpp
    engines/macventure/detection.cpp
    engines/macventure/macventure.cpp
    engines/macventure/module.mk



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 85cbb11..64a7923 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -29,10 +29,9 @@
 
 namespace MacVenture {
 
-	const char *MacVentureEngine::getGameFileName() const {
-		return _gameDescription->filesDescriptions[0].fileName;
-	}
-
+const char *MacVentureEngine::getGameFileName() const {
+	return _gameDescription->filesDescriptions[0].fileName;
+}
 }
 
 namespace MacVenture {
@@ -46,6 +45,8 @@ static const PlainGameDescriptor macventureGames[] = {
 	{ 0, 0 }
 };
 
+SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot);
+
 class MacVentureMetaEngine : public AdvancedMetaEngine {
 public:
 	MacVentureMetaEngine() : AdvancedMetaEngine(MacVenture::gameDescriptions, sizeof(ADGameDescription), macventureGames) {
@@ -62,12 +63,57 @@ public:
 
 	virtual bool createInstance(OSystem * syst, Engine ** engine, const ADGameDescription * desc) const;
 	virtual bool hasFeature(MetaEngineFeature f) const;
+	virtual SaveStateList listSaves(const char *target) const;
+	virtual int getMaximumSaveSlot() const;
 };
 
 bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
-	return false;
+	return
+		(f == kSupportsListSaves) ||
+		(f == kSupportsLoadingDuringStartup);
 }
 
+SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Common::StringArray filenames;
+	Common::String pattern = target;
+	pattern += ".###";
+
+	filenames = saveFileMan->listSavefiles(pattern);
+
+	SaveStateList saveList;
+	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+		Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
+
+		SaveStateDescriptor desc;
+		// Do not allow save slot 0 (used for auto-saving) to be deleted or
+		// overwritten.
+		desc.setDeletableFlag(slotNum != 0);
+		desc.setWriteProtectedFlag(slotNum == 0);
+
+		if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
+			Common::InSaveFile *in = saveFileMan->openForLoading(*file);
+			if (in) {
+				SaveStateDescriptor desc = loadMetaData(in, slotNum);
+				if (desc.getSaveSlot() != slotNum) {
+					// invalid
+					delete in;
+					continue;
+				}
+				saveList.push_back(desc);
+				delete in;
+			}
+		}
+	}
+
+	// Sort saves based on slot number.
+	Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
+	return saveList;
+}
+
+int MacVentureMetaEngine::getMaximumSaveSlot() const { return 999; }
+
 bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, const ADGameDescription *game) const {
 	if (game) {
 		*engine = new MacVentureEngine(syst, game);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 21d98b1..6a7c147 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -178,21 +178,6 @@ Common::Error MacVentureEngine::run() {
 	return Common::kNoError;
 }
 
-Common::Error MacVentureEngine::loadGameState(int slot) {
-	Common::InSaveFile *file = getSaveFileManager()->openForLoading("Shadowgate.1");
-	_world->loadGameFrom(file);
-	reset();
-	return Common::kNoError;
-}
-
-Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc) {
-	Common::SaveFileManager *manager = getSaveFileManager();
-	// HACK Get a real name!
-	Common::OutSaveFile *file = manager->openForSaving("Shadowgate.1");
-	_world->saveGameInto(file);
-	delete file;
-}
-
 void MacVentureEngine::reset() {
 	resetInternals();
 	resetGui();
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index a1e2f5e..244401b 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -13,7 +13,8 @@ MODULE_OBJS := \
 	controls.o \
 	prebuilt_dialogs.o \
 	windows.o \
-	sound.o
+	sound.o \
+	saveload.o
 
 
 MODULE_DIRS += \
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
new file mode 100644
index 0000000..a256713
--- /dev/null
+++ b/engines/macventure/saveload.cpp
@@ -0,0 +1,89 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/macventure.h"
+
+#include "common/error.h"
+#include "common/savefile.h"
+#include "engines/savestate.h"
+
+namespace MacVenture {
+
+#define MACVENTURE_SAVE_HEADER MKTAG('M', 'V', 'S', 'S') // (M)ac(V)enture (S)cummVM (S)ave (0x4d565353, uint32)
+#define MACVENTURE_SAVE_VERSION 1 //1 BYTE
+#define MACVENTURE_DESC_LENGTH 1 //1 BYTE for the description length
+
+SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
+	// Metadata is stored at the end of the file
+	// |DESCRIPTION						|
+	// |HEADER			|VERSION|DESCLEN|
+	s->seek(-(5 + MACVENTURE_DESC_LENGTH), SEEK_END);
+	uint32 sig = s->readUint32BE();
+	byte version = s->readByte();
+
+	SaveStateDescriptor desc(-1, "");	// init to an invalid save slot
+
+	if (sig != MACVENTURE_SAVE_HEADER || version > MACVENTURE_SAVE_VERSION)
+		return desc;
+
+	// Save is valid, set its slot number
+	desc.setSaveSlot(slot);
+
+	// Load the description
+	Common::String name;
+	// Depends on MACVENTURE_DESC_LENGTH
+	byte descSize = s->readByte();
+	s->seek(-(5 + MACVENTURE_DESC_LENGTH + descSize), SEEK_END);
+	for (int i = 0; i < descSize; ++i)
+		name += s->readByte();
+	desc.setDescription(name);
+
+	return desc;
+}
+
+void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
+	if (desc.size() >= (1 << (MACVENTURE_DESC_LENGTH * 4))) {
+		desc.erase((1 << (MACVENTURE_DESC_LENGTH * 4)) - 1);
+	}
+	file->writeString(desc);
+	file->writeUint32BE(MACVENTURE_SAVE_HEADER);
+	file->writeByte(MACVENTURE_SAVE_VERSION);
+	file->writeByte(desc.size());
+}
+
+Common::Error MacVentureEngine::loadGameState(int slot) {
+	Common::InSaveFile *file = getSaveFileManager()->openForLoading("shadowgate.001");
+	_world->loadGameFrom(file);
+	reset();
+	return Common::kNoError;
+}
+
+Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc) {
+	Common::SaveFileManager *manager = getSaveFileManager();
+	// HACK Get a real name!
+	Common::OutSaveFile *file = manager->openForSaving(desc);
+	_world->saveGameInto(file);
+	writeMetaData(file, desc);
+	delete file;
+}
+
+} // End of namespace MacVenture


Commit: 9ab6ce04a11de0bf5f56a7866a4837c7431cefbe
    https://github.com/scummvm/scummvm/commit/9ab6ce04a11de0bf5f56a7866a4837c7431cefbe
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:36+02:00

Commit Message:
MACVENTURE: Change GUI to accept ScummVM dialogs

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.h
    engines/macventure/prebuilt_dialogs.h
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 64a7923..082a8ac 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -32,9 +32,7 @@ namespace MacVenture {
 const char *MacVentureEngine::getGameFileName() const {
 	return _gameDescription->filesDescriptions[0].fileName;
 }
-}
-
-namespace MacVenture {
+} // End of namespace MacVenture
 
 #include "macventure/detection_tables.h"
 
@@ -45,6 +43,8 @@ static const PlainGameDescriptor macventureGames[] = {
 	{ 0, 0 }
 };
 
+namespace MacVenture {
+
 SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot);
 
 class MacVentureMetaEngine : public AdvancedMetaEngine {
@@ -73,6 +73,12 @@ bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 		(f == kSupportsLoadingDuringStartup);
 }
 
+bool MacVentureEngine::hasFeature(EngineFeature f) const {
+	return
+		(f == kSupportsLoadingDuringRuntime) ||
+		(f == kSupportsSavingDuringRuntime);
+}
+
 SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	Common::StringArray filenames;
@@ -116,14 +122,11 @@ int MacVentureMetaEngine::getMaximumSaveSlot() const { return 999; }
 
 bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, const ADGameDescription *game) const {
 	if (game) {
-		*engine = new MacVentureEngine(syst, game);
+		*engine = new MacVenture::MacVentureEngine(syst, game);
 	}
 	return game != 0;
 }
 
-
-
-
 } // End of namespace MacVenture
 
 #if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index d40639a..a01011f 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -39,7 +39,7 @@ extern PrebuiltDialog prebuiltDialogs[];
 class Dialog {
 public:
 	Dialog(Gui *gui, Common::Point pos, uint width, uint height);
-  Dialog(Gui *gui, PrebuiltDialogs prebuilt);
+ 	Dialog(Gui *gui, PrebuiltDialogs prebuilt);
 
 	~Dialog();
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 7691b56..d615493 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1081,15 +1081,15 @@ void Gui::handleMenuAction(MenuAction action) {
 		break;
 	case MacVenture::kMenuActionOpen:
 		debug("MacVenture Menu Action: Open");
-		loadGame(0);
+		_engine->scummVMSaveLoadDialog(false);
 		break;
 	case MacVenture::kMenuActionSave:
 		debug("MacVenture Menu Action: Save");
-		saveInto(0);
+		_engine->scummVMSaveLoadDialog(true);
 		break;
 	case MacVenture::kMenuActionSaveAs:
 		debug("MacVenture Menu Action: Save As");
-		showPrebuiltDialog(kSaveAsDialog);
+		_engine->scummVMSaveLoadDialog(true);
 		break;
 	case MacVenture::kMenuActionQuit:
 		debug("MacVenture Menu Action: Quit");
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 8b0cbc6..31cacd7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -156,6 +156,8 @@ public:
 	void setTextInput(Common::String str);
 	void closeDialog();
 
+
+	// TODO: Currently unused, we are using ScummVM dialogs instead.
 	void loadGame(int slot);
 	void saveInto(int slot);
 
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 28eb8e4..3e6f7c0 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -181,7 +181,11 @@ public:
 	MacVentureEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~MacVentureEngine();
 
+	virtual bool hasFeature(EngineFeature f) const;
+
 	virtual Common::Error run();
+
+	bool scummVMSaveLoadDialog(bool isSave);
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 1e708db..58e8f0b 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -35,7 +35,7 @@ enum DialogAction {
 };
 
 enum PrebuiltDialogs {
-  kSaveAsDialog = 0,
+  kSaveAsDialog = 0, //TODO: Currently unused, we are using ScummVM dialogs instead.
   kSpeakDialog = 1,
   kPrebuiltDialogCount
 };
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index a256713..e1b6227 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -25,6 +25,7 @@
 #include "common/error.h"
 #include "common/savefile.h"
 #include "engines/savestate.h"
+#include "gui/saveload.h"
 
 namespace MacVenture {
 
@@ -71,19 +72,55 @@ void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
 }
 
 Common::Error MacVentureEngine::loadGameState(int slot) {
-	Common::InSaveFile *file = getSaveFileManager()->openForLoading("shadowgate.001");
+	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	Common::InSaveFile *file;
+	if(!(file = getSaveFileManager()->openForLoading(saveFileName))) {
+		error("missing savegame file %s", saveFileName.c_str());
+	}
 	_world->loadGameFrom(file);
 	reset();
 	return Common::kNoError;
 }
 
 Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc) {
+	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
 	Common::SaveFileManager *manager = getSaveFileManager();
 	// HACK Get a real name!
-	Common::OutSaveFile *file = manager->openForSaving(desc);
+	Common::OutSaveFile *file = manager->openForSaving(saveFileName);
 	_world->saveGameInto(file);
 	writeMetaData(file, desc);
 	delete file;
 }
 
+bool MacVentureEngine::scummVMSaveLoadDialog(bool isSave) {
+	if (!isSave) {
+		// do loading
+		GUI::SaveLoadChooser dialog = GUI::SaveLoadChooser(Common::String("Load game:"), Common::String("Load"), false);
+		int slot = dialog.runModalWithCurrentTarget();
+
+		if (slot < 0)
+			return true;
+
+		return loadGameState(slot).getCode() == Common::kNoError;
+	}
+
+	// do saving
+	GUI::SaveLoadChooser dialog = GUI::SaveLoadChooser(Common::String("Save game:"), Common::String("Save"), true);
+	int slot = dialog.runModalWithCurrentTarget();
+	Common::String desc = dialog.getResultString();
+
+	if (desc.empty()) {
+		// create our own description for the saved game, the user didnt enter it
+		desc = dialog.createDefaultSaveDescription(slot);
+	}
+
+	if (desc.size() > (1 << MACVENTURE_DESC_LENGTH * 4) - 1)
+		desc = Common::String(desc.c_str(), (1 << MACVENTURE_DESC_LENGTH * 4) - 1);
+
+	if (slot < 0)
+		return true;
+
+	return saveGameState(slot, desc).getCode() == Common::kNoError;
+}
+
 } // End of namespace MacVenture


Commit: 0acdf0c459eaf96c0b181cd3a6a94ba58a97475b
    https://github.com/scummvm/scummvm/commit/0acdf0c459eaf96c0b181cd3a6a94ba58a97475b
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:37+02:00

Commit Message:
MACVENTURE: Implement savefile deletion

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 082a8ac..f4edaef 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -65,12 +65,14 @@ public:
 	virtual bool hasFeature(MetaEngineFeature f) const;
 	virtual SaveStateList listSaves(const char *target) const;
 	virtual int getMaximumSaveSlot() const;
+	virtual void removeSaveState(const char *target, int slot) const;
 };
 
 bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return
 		(f == kSupportsListSaves) ||
-		(f == kSupportsLoadingDuringStartup);
+		(f == kSupportsLoadingDuringStartup) ||
+		(f == kSupportsDeleteSave);
 }
 
 bool MacVentureEngine::hasFeature(EngineFeature f) const {
@@ -127,6 +129,10 @@ bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, cons
 	return game != 0;
 }
 
+void MacVentureMetaEngine::removeSaveState(const char *target, int slot) const {
+	g_system->getSavefileManager()->removeSavefile(Common::String::format("%s.%03d", target, slot));
+}
+
 } // End of namespace MacVenture
 
 #if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index e1b6227..1322a43 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -89,6 +89,11 @@ Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &de
 	Common::OutSaveFile *file = manager->openForSaving(saveFileName);
 	_world->saveGameInto(file);
 	writeMetaData(file, desc);
+
+	file->finalize();
+	if (file->err()) {
+		warning("Could not save '%s' correctly.", saveFileName.c_str());
+	}
 	delete file;
 }
 


Commit: f0dde375c13a262d5d71cdf74114b64754fa0755
    https://github.com/scummvm/scummvm/commit/f0dde375c13a262d5d71cdf74114b64754fa0755
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:37+02:00

Commit Message:
MACVENTURE: Add missing methods for runtime load

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/macventure.h
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index f4edaef..9bf94cf 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -77,6 +77,7 @@ bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 
 bool MacVentureEngine::hasFeature(EngineFeature f) const {
 	return
+		(f == kSupportsRTL) ||
 		(f == kSupportsLoadingDuringRuntime) ||
 		(f == kSupportsSavingDuringRuntime);
 }
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 3e6f7c0..b4f8192 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -186,6 +186,8 @@ public:
 	virtual Common::Error run();
 
 	bool scummVMSaveLoadDialog(bool isSave);
+	bool canLoadGameStateCurrently();
+	bool canSaveGameStateCurrently();
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index 1322a43..95d290d 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -128,4 +128,12 @@ bool MacVentureEngine::scummVMSaveLoadDialog(bool isSave) {
 	return saveGameState(slot, desc).getCode() == Common::kNoError;
 }
 
+bool MacVentureEngine::canLoadGameStateCurrently() {
+	return true;
+}
+
+bool MacVentureEngine::canSaveGameStateCurrently() {
+	return true;
+}
+
 } // End of namespace MacVenture


Commit: d1a31ff5dbb3fb9cd7a3cda2945ee7f9183a6497
    https://github.com/scummvm/scummvm/commit/d1a31ff5dbb3fb9cd7a3cda2945ee7f9183a6497
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:37+02:00

Commit Message:
MACVENTURE: Fix startup loading bug

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d615493..b3f282f 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -951,6 +951,13 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	return nullptr;
 }
 
+void Gui::ensureInventoryOpen(WindowReference reference, ObjID id) {
+	assert(reference < 0x80 && reference >= kInventoryStart);
+	if (reference - kInventoryStart == _inventoryWindows.size()) {
+		createInventoryWindow(id);
+	}
+}
+
 WindowReference Gui::getObjWindow(ObjID objID) {
 	switch (objID) {
 	case 0xfffc: return kExitsWindow;
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 31cacd7..18be9b9 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -106,7 +106,6 @@ public:
 	void updateWindow(WindowReference winID, bool containerOpen);
 	void invertWindowColors(WindowReference winID);
 
-
 	WindowReference createInventoryWindow(ObjID objRef);
 	bool tryCloseWindow(WindowReference winID);
 
@@ -138,6 +137,7 @@ public:
 	void bringToFront(WindowReference window);
 	void setWindowTitle(WindowReference winID, Common::String string);
 	void updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children);
+	void ensureInventoryOpen(WindowReference reference, ObjID id);
 
 	void addChild(WindowReference target, ObjID child);
 	void removeChild(WindowReference target, ObjID child);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6a7c147..b52379d 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -24,6 +24,7 @@
 #include "common/debug-channels.h"
 #include "common/debug.h"
 #include "common/error.h"
+#include "common/config-manager.h"
 #include "engines/util.h"
 
 #include "macventure/macventure.h"
@@ -129,11 +130,18 @@ Common::Error MacVentureEngine::run() {
 	_destObject = 0;
 	_prepared = true;
 
-	_cmdReady = true;
+	int directSaveSlotLoading = ConfMan.getInt("save_slot");
+	if (directSaveSlotLoading >= 0) {
+		if (loadGameState(directSaveSlotLoading).getCode() != Common::kNoError) {
+			error("Could not load game from slot '%d'", directSaveSlotLoading);
+		}
+	} else {
+		_cmdReady = true;
+		ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
+		_currentSelection.push_back(playerParent);// Push the parent of the player
+		_world->setObjAttr(playerParent, kAttrContainerOpen, 1);
+	}
 	_selectedControl = kStartOrResume;
-	ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
-	_currentSelection.push_back(playerParent);// Push the parent of the player
-	_world->setObjAttr(playerParent, kAttrContainerOpen, 1);
 
 	_gui->addChild(kSelfWindow, 1);
 	_gui->updateWindow(kSelfWindow, false);
@@ -194,6 +202,7 @@ void MacVentureEngine::resetInternals() {
 void MacVentureEngine::resetGui() {
 	_gui->updateWindowInfo(kMainGameWindow, getParent(1), _world->getChildren(getParent(1), true));
 	// HACK! should update all inventories
+	_gui->ensureInventoryOpen(kInventoryStart, 1);
 	_gui->updateWindowInfo(kInventoryStart, 1, _world->getChildren(1, true));
 	updateControls();
 	updateExits();


Commit: 5c43e3049936c28b57147c2062e1f7724a9165ce
    https://github.com/scummvm/scummvm/commit/5c43e3049936c28b57147c2062e1f7724a9165ce
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:00:59+02:00

Commit Message:
MACVENTURE: Implement loading borders from zip

Changed paths:
  A engines/macventure/datafiles.cpp
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/module.mk



diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
new file mode 100644
index 0000000..71407a7
--- /dev/null
+++ b/engines/macventure/datafiles.cpp
@@ -0,0 +1,83 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef MACVENTURE_DATAFILES_H
+#define MACVENTURE_DATAFILES_H
+
+#include "macventure/macventure.h"
+#include "macventure/windows.h"
+
+#include "common/unzip.h"
+
+namespace MacVenture {
+
+#define MACVENTURE_DATA_BUNDLE Common::String("macventure.zip")
+
+Common::String windowTypeName(MVWindowType windowType) {
+	switch (windowType) {
+	case kDocument:
+		return "Document";
+	case kDBox:
+		return "DBox";
+	case kPlainDBox:
+		return "PlainDBox";
+	case kAltBox:
+		return "AltBox";
+	case kNoGrowDoc:
+		return "NoGrowDoc";
+	case kMovableDBox:
+		return "MovableDBox";
+	case kZoomDoc:
+		return "ZoomDoc";
+	case kZoomNoGrow:
+		return "ZoomNoGrow";
+	case kRDoc16:
+		return "RDoc16";
+	case kRDoc4:
+		return "RDoc4";
+	case kRDoc6:
+		return "RDoc6";
+	case kRDoc10:
+		return "RDoc10";
+	}
+}
+
+void MacVentureEngine::loadDataBundle() {
+	_dataBundle = Common::makeZipArchive(MACVENTURE_DATA_BUNDLE);
+	if (!_dataBundle)
+		error("Couldn't load data bundle '%s'.", MACVENTURE_DATA_BUNDLE.c_str());
+}
+
+Common::SeekableReadStream *MacVentureEngine::getBorderFile(MVWindowType windowType, bool isActive) {
+	Common::String filename = windowTypeName(windowType);
+	filename += (isActive ? "_act.bmp" : "_inac.bmp");
+	if (!_dataBundle->hasFile(filename)) {
+		warning("Missing border file '%s' in data bundle", filename.c_str());
+		return nullptr;
+	}
+
+	return _dataBundle->createReadStreamForMember(filename);
+}
+
+} // End of namespace MacVenture
+
+#endif
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index b3f282f..4f11478 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -215,40 +215,35 @@ void Gui::initWindows() {
 	_controlsWindow->setDimensions(getWindowData(kCommandsWindow).bounds);
 	_controlsWindow->setActive(false);
 	_controlsWindow->setCallback(commandsWindowCallback, this);
-	loadBorder(_controlsWindow, "border_command.bmp", false, findWindowData(kCommandsWindow).type);
-	loadBorder(_controlsWindow, "border_command.bmp", true, findWindowData(kCommandsWindow).type);
+	loadBorders(_controlsWindow, findWindowData(kCommandsWindow).type);
 
 	// Main Game Window
 	_mainGameWindow = _wm.addWindow(true, true, true);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);
-	loadBorder(_mainGameWindow, "border_no_scroll_inac.bmp", false, findWindowData(kMainGameWindow).type);
-	loadBorder(_mainGameWindow, "border_no_scroll_act.bmp", true, findWindowData(kMainGameWindow).type);
+	loadBorders(_mainGameWindow, findWindowData(kMainGameWindow).type);
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(true, true, false);
 	_outConsoleWindow->setDimensions(getWindowData(kOutConsoleWindow).bounds);
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
-	loadBorder(_outConsoleWindow, "border_left_scroll_inac.bmp", false, findWindowData(kOutConsoleWindow).type);
-	loadBorder(_outConsoleWindow, "border_left_scroll_act.bmp", true, findWindowData(kOutConsoleWindow).type);
+	loadBorders(_outConsoleWindow, findWindowData(kOutConsoleWindow).type);
 
 	// Self Window
 	_selfWindow = _wm.addWindow(false, true, false);
 	_selfWindow->setDimensions(getWindowData(kSelfWindow).bounds);
 	_selfWindow->setActive(false);
 	_selfWindow->setCallback(selfWindowCallback, this);
-	loadBorder(_selfWindow, "border_none.bmp", false, findWindowData(kSelfWindow).type);
-	loadBorder(_selfWindow, "border_none.bmp", true, findWindowData(kSelfWindow).type);
+	loadBorders(_selfWindow, findWindowData(kSelfWindow).type);
 
 	// Exits Window
 	_exitsWindow = _wm.addWindow(false, false, false);
 	_exitsWindow->setDimensions(getWindowData(kExitsWindow).bounds);
 	_exitsWindow->setActive(false);
 	_exitsWindow->setCallback(exitsWindowCallback, this);
-	loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false, findWindowData(kExitsWindow).type);
-	loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true, findWindowData(kExitsWindow).type);
+	loadBorders(_exitsWindow, findWindowData(kExitsWindow).type);
 }
 
 const WindowData& Gui::getWindowData(WindowReference reference) {
@@ -336,35 +331,28 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	newWindow->setDimensions(newData.bounds);
 	newWindow->setCallback(inventoryWindowCallback, this);
 	newWindow->setCloseable(true);
-	loadBorder(newWindow, "border_both_scroll_inac.bmp", false, newData.type);
-	loadBorder(newWindow, "border_both_scroll_act.bmp", true, newData.type);
+	loadBorders(newWindow, newData.type);
 	_inventoryWindows.push_back(newWindow);
 
 	debug("Create new inventory window. Reference: %d", newData.refcon);
 	return newData.refcon;
 }
 
-void Gui::loadBorder(Graphics::MacWindow *target, Common::String filename, bool active, MVWindowType type) {
-	Common::File borderfile;
+void Gui::loadBorders(Graphics::MacWindow * target, MVWindowType type) {
+	loadBorder(target, type, false);
+	loadBorder(target, type, true);
+}
 
-	if (!borderfile.open(filename)) {
-		debug(1, "Cannot open border file");
-		return;
-	}
+void Gui::loadBorder(Graphics::MacWindow * target, MVWindowType type, bool active) {
 
-	Image::BitmapDecoder bmpDecoder;
-	Common::SeekableReadStream *stream = borderfile.readStream(borderfile.size());
-	Graphics::Surface source;
-	Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
+	Common::SeekableReadStream *stream = _engine->getBorderFile(type, active);
 
 	if (stream) {
 		BorderBounds bbs = borderBounds(type);
-		debug(4, "Loading %s border from %s", (active ? "active" : "inactive"), filename.c_str());
 		target->loadBorder(*stream, active, bbs.leftOffset, bbs.rightOffset, bbs.topOffset, bbs.bottomOffset);
 
 		delete stream;
 	}
-	borderfile.close();
 }
 
 void Gui::loadGraphics() {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 18be9b9..fb9bccf 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -156,7 +156,6 @@ public:
 	void setTextInput(Common::String str);
 	void closeDialog();
 
-
 	// TODO: Currently unused, we are using ScummVM dialogs instead.
 	void loadGame(int slot);
 	void saveInto(int slot);
@@ -205,7 +204,8 @@ private: // Methods
 	bool loadMenus();
 	bool loadWindows();
 	bool loadControls();
-	void loadBorder(Graphics::MacWindow * target, Common::String filename, bool active, MVWindowType type);
+	void loadBorders(Graphics::MacWindow *target, MVWindowType type);
+	void loadBorder(Graphics::MacWindow *target, MVWindowType type, bool active);
 	void loadGraphics();
 
 	// Drawers
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b52379d..ac9ae8e 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -86,6 +86,9 @@ MacVentureEngine::~MacVentureEngine() {
 
 	if (_soundManager)
 		delete _soundManager;
+
+	if (_dataBundle)
+		delete _dataBundle;
 }
 
 Common::Error MacVentureEngine::run() {
@@ -113,6 +116,8 @@ Common::Error MacVentureEngine::run() {
 	_decodingNamingArticles = new StringTable(this, _resourceManager, kNamingArticlesStringTableID);
 	_decodingIndirectArticles = new StringTable(this, _resourceManager, kIndirectArticlesStringTableID);
 
+	loadDataBundle();
+
 	// Big class instantiation
 	_gui = new Gui(this, _resourceManager);
 	_world = new World(this, _resourceManager);
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index b4f8192..6953b61 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -191,6 +191,10 @@ public:
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 
+	// datafiles.cpp
+	void loadDataBundle();
+	Common::SeekableReadStream *getBorderFile(MVWindowType windowType, bool isActive);
+
 	void reset();
 	void resetInternals();
 	void resetGui();
@@ -319,6 +323,8 @@ private: // Attributes
 
 	SoundManager *_soundManager;
 
+	Common::Archive *_dataBundle;
+
 	// Engine state
 	GameState _gameState;
 	GlobalSettings _globalSettings;
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 244401b..7b81018 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -14,7 +14,8 @@ MODULE_OBJS := \
 	prebuilt_dialogs.o \
 	windows.o \
 	sound.o \
-	saveload.o
+	saveload.o \
+	datafiles.o
 
 
 MODULE_DIRS += \


Commit: 06d9e188dfbe465c3adcc3e35d9547213c759d65
    https://github.com/scummvm/scummvm/commit/06d9e188dfbe465c3adcc3e35d9547213c759d65
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Fix scroll in GUI

Changed paths:
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index fb9bccf..a44e394 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -340,6 +340,7 @@ public:
 	ConsoleText(Gui *gui) {
 		_gui = gui;
 		_lines.push_back("");
+		updateScroll();
 	}
 
 	~ConsoleText() {
@@ -377,11 +378,10 @@ public:
 	}
 
 	void scrollDown() {
-		if (_scrollPos < _lines.size() - 1) _scrollPos++;
+		if (_scrollPos < (int)(_lines.size() - 1)) _scrollPos++;
 	}
 
 	void scrollUp() {
-		debug("scroll up");
 		if (_scrollPos > 0) _scrollPos--;
 	}
 


Commit: 427d69535f87c7a4ba4e82eedc3cae845f454535
    https://github.com/scummvm/scummvm/commit/427d69535f87c7a4ba4e82eedc3cae845f454535
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Fix object overflow

Changed paths:
    engines/macventure/image.cpp
    engines/macventure/image.h



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index a4db46e..05ec68c 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -410,95 +410,58 @@ int ImageAsset::getHeight() {
 	return MAX(0, (int)_imgBitHeight);
 }
 
-void ImageAsset::blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
-
-/*
-	if (bitWidth == 0 || bitHeight == 0) return;
-	uint w = bitWidth;
-	uint h = bitHeight;
-	uint sx = 0;
-	uint sy = 0;
-	if (ox<0) { sx = -ox; ox = 0; }
-	if (oy<0) { sy = -oy; oy = 0; }
-	if (w + ox >= target->w) w = target->w - ox;
-	if (h + oy >= target->h) h = target->h - oy;
-	if (w == 0 || h == 0) return;
-*/
-	for (uint y = 0; y < bitHeight; y++) {
-		uint bmpofs = y * rowBytes;
+void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	uint sx, sy, w, h;
+	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+
+	for (uint y = 0; y < h; y++) {
+		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < bitWidth; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+		for (uint x = 0; x < w; x++) {
+			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			pix = pix ? kColorBlack : kColorWhite;
 			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
 		}
 	}
 }
 
-void ImageAsset::blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
-/*
-	if (bitWidth == 0 || bitHeight == 0) return;
-	uint w = bitWidth;
-	uint h = bitHeight;
-	uint sx = 0;
-	uint sy = 0;
-	if (ox<0) { sx = -ox; ox = 0; }
-	if (oy<0) { sy = -oy; oy = 0; }
-	if (w + ox >= target->w) w = target->w - ox;
-	if (h + oy >= target->h) h = target->h - oy;
-	if (w == 0 || h == 0) return;
-*/
-	for (uint y = 0; y < bitHeight; y++) {
-		uint bmpofs = y * rowBytes;
+void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	uint sx, sy, w, h;
+	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+
+	for (uint y = 0; y < h; y++) {
+		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < bitWidth; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+		for (uint x = sx; x < w; x++) {
+			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
 	}
 }
 
-void ImageAsset::blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
-/*
-	if (bitWidth == 0 || bitHeight == 0) return;
-	uint w = bitWidth;
-	uint h = bitHeight;
-	uint sx = 0;
-	uint sy = 0;
-	if (ox<0) { sx = -ox; ox = 0; }
-	if (oy<0) { sy = -oy; oy = 0; }
-	if (w + ox >= target->w) w = target->w - ox;
-	if (h + oy >= target->h) h = target->h - oy;
-	if (w == 0 || h == 0) return;
-*/
-	for (uint y = 0; y < bitHeight; y++) {
-		uint bmpofs = y * rowBytes;
+void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	uint sx, sy, w, h;
+	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+
+	for (uint y = 0; y < h; y++) {
+		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < bitWidth; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+		for (uint x = 0; x < w; x++) {
+			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
 		}
 	}
 }
 
-void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
-/*
-	if (bitWidth == 0 || bitHeight == 0) return;
-	uint w = bitWidth;
-	uint h = bitHeight;
-	uint sx = 0;
-	uint sy = 0;
-	if (ox<0) { sx = -ox; ox = 0; }
-	if (oy<0) { sy = -oy; oy = 0; }
-	if (w + ox >= target->w) w = target->w - ox;
-	if (h + oy >= target->h) h = target->h - oy;
-	if (w == 0 || h == 0) return;
-*/
-	for (uint y = 0; y < bitHeight; y++) {
-		uint bmpofs = y * rowBytes;
+void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+	uint sx, sy, w, h;
+	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+
+	for (uint y = 0; y < h; y++) {
+		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
-		for (uint x = 0; x < bitWidth; x++) {
-			pix = data[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
+		for (uint x = 0; x < w; x++) {
+			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) { // We need to xor
 				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
 				*((byte *)target->getBasePtr(ox + x, oy + y)) =
@@ -508,4 +471,13 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy
 	}
 }
 
+void ImageAsset::calculateSubsection(int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h) {
+	sx = (ox < 0) ? -ox : 0;
+	sy = (oy < 0) ? -oy : 0;
+	ox = (ox < 0) ? 0 : ox;
+	oy = (oy < 0) ? 0 : oy;
+	w = MAX((int)(bitWidth - sx), 0);
+	h = MAX((int)(bitHeight - sy), 0);
+}
+
 } // End of namespace MacVenture
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index e6b2515..3520f81 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -77,10 +77,12 @@ private:
 	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
-	void blitDirect(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitBIC(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitXOR(Graphics::ManagedSurface * target, uint32 ox, uint32 oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+
+	void calculateSubsection(int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
 
 private:
 	ObjID _id;


Commit: 0202ff9c508ad8d510014a7c5581d57385d2acd2
    https://github.com/scummvm/scummvm/commit/0202ff9c508ad8d510014a7c5581d57385d2acd2
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Fix exit highlighting

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index ac9ae8e..6ed11eb 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -172,6 +172,7 @@ Common::Error MacVentureEngine::run() {
 						_paused = false;
 						if (!updateState()) {
 							updateControls();
+							updateExits();
 						}
 					}
 				}


Commit: 5b63e29d5e2ff4710cf4d417474b607d84317dee
    https://github.com/scummvm/scummvm/commit/5b63e29d5e2ff4710cf4d417474b607d84317dee
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Clean up updateState function

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 6ed11eb..867504b 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -160,20 +160,18 @@ Common::Error MacVentureEngine::run() {
 				_prepared = false;
 
 				if (!_halted)
-					updateState();
+					updateState(false);
 
 				if (_cmdReady || _halted) {
 					_halted = false;
 					if (runScriptEngine()) {
 						_halted = true;
 						_paused = true;
-					}
-					else {
+					} else {
 						_paused = false;
-						if (!updateState()) {
-							updateControls();
-							updateExits();
-						}
+						updateState(true);
+						updateControls();
+						updateExits();
 					}
 				}
 
@@ -485,8 +483,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 			_haltedInSelection = true;
 			return true;
 		}
-		if (updateState())
-			return true;
+		updateState(true);
 	}
 
 	while (!_currentSelection.empty()) {
@@ -497,9 +494,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 				_haltedInSelection = true;
 				return true;
 			}
-			if (updateState()) {
-				return true;
-			}
+			updateState(true);
 		}
 	}
 	if (_selectedControl == 1)
@@ -518,12 +513,10 @@ void MacVentureEngine::endGame() {
 	requestQuit();
 }
 
-bool MacVentureEngine::updateState() {
+void MacVentureEngine::updateState(bool pause) {
 	runObjQueue();
-	bool wait = printTexts();
-	// HACK playSounds should accept a bool passed to updateState
-	wait |= playSounds(true);
-	return wait;
+	printTexts();
+	playSounds(pause);
 }
 
 void MacVentureEngine::revert() {
@@ -575,7 +568,7 @@ void MacVentureEngine::runObjQueue() {
 	}
 }
 
-bool MacVentureEngine::printTexts() {
+void MacVentureEngine::printTexts() {
 	for (uint i = 0; i < _textQueue.size(); i++) {
 		QueuedText text = _textQueue.front();
 		_textQueue.remove_at(0);
@@ -594,10 +587,9 @@ bool MacVentureEngine::printTexts() {
 			break;
 		}
 	}
-	return false;
 }
 
-bool MacVentureEngine::playSounds(bool pause) {
+void MacVentureEngine::playSounds(bool pause) {
 	int delay=0;
 	while (!_soundQueue.empty()) {
 		QueuedSound item = _soundQueue.front();
@@ -618,9 +610,7 @@ bool MacVentureEngine::playSounds(bool pause) {
 		warning("Sound pausing not yet tested. Pausing for %d", delay * 1000);
 		g_system->delayMillis(delay * 1000);
 		preparedToRun();
-		return true;
 	}
-	return false;
 }
 
 void MacVentureEngine::updateControls() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 6953b61..275a7ac 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -210,7 +210,7 @@ public:
 	void loseGame();
 	void clickToContinue();
 
-	bool updateState();
+	void updateState(bool pause);
 	void revert();
 
 	void enqueueObject(ObjectQueueID type, ObjID objID, ObjID target = 0);
@@ -218,8 +218,8 @@ public:
 	void enqueueSound(SoundQueueID type, ObjID target);
 
 	void runObjQueue();
-	bool printTexts();
-	bool playSounds(bool pause);
+	void printTexts();
+	void playSounds(bool pause);
 
 	void handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick);
 	void handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent);
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 6f0a782..ef1d36c 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -453,8 +453,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 				opdbROBQ(state, frame);
 				break;
 			case 0xdc: //run sound queue
-				if (opdcRSQ(state, frame))
-					return true;
+				opdcRSQ(state, frame);
 				break;
 			case 0xdd: //run text queue
 				opddRTQ(state, frame);
@@ -1102,7 +1101,7 @@ void ScriptEngine::opd9SLEEP(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opdaCLICK(EngineState * state, EngineFrame * frame) {
-	_engine->updateState();
+	_engine->updateState(false);
 	_engine->clickToContinue();
 }
 
@@ -1110,8 +1109,8 @@ void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
 	_engine->runObjQueue();
 }
 
-bool ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
-	return _engine->playSounds(true);
+void ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
+	_engine->playSounds(true);
 }
 
 void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
@@ -1119,7 +1118,7 @@ void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opdeUPSC(EngineState * state, EngineFrame * frame) {
-	_engine->updateState();
+	_engine->updateState(true);
 }
 
 void ScriptEngine::opdfFMAI(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 7c4b77d..5760a31 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -257,7 +257,7 @@ private:
 	void opd9SLEEP(EngineState *state, EngineFrame *frame);	//sleep
 	void opdaCLICK(EngineState *state, EngineFrame *frame);	//click to continue
 	void opdbROBQ(EngineState *state, EngineFrame *frame);	//run queue
-	bool opdcRSQ(EngineState *state, EngineFrame *frame);	//run sound queue
+	void opdcRSQ(EngineState *state, EngineFrame *frame);	//run sound queue
 	void opddRTQ(EngineState *state, EngineFrame *frame);	//run text queue
 	void opdeUPSC(EngineState *state, EngineFrame *frame);	//update screen
 	void opdfFMAI(EngineState *state, EngineFrame *frame);	//flash main window


Commit: 0aef29a8c5f364e53f6bef57fee890005bcda129
    https://github.com/scummvm/scummvm/commit/0aef29a8c5f364e53f6bef57fee890005bcda129
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Revamp double click detection

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 4f11478..327a2e8 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -20,9 +20,7 @@
 *
 */
 
-
 #include "common/file.h"
-#include "common/timer.h"
 #include "common/system.h"
 #include "image/bmp.h"
 
@@ -92,11 +90,6 @@ static const Graphics::MenuData menuSubItems[] = {
 };
 
 
-static void cursorTimerHandler(void *refCon) {
-	Gui *gui = (Gui *)refCon;
-	gui->processCursorTick();
-}
-
 bool commandsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool mainGameWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
 bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
@@ -117,7 +110,6 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_dialog = nullptr;
 
 	_cursor = new Cursor(this);
-	g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 500000, this, "macVentureCursor");
 
 	_consoleText = new ConsoleText(this);
 
@@ -886,8 +878,7 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
 		win = findWindow(it->refcon);
 		if (win && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
 			if (win->getDimensions().contains(point)) {
-				if (win->isActive())
-					return it->refcon;
+				return it->refcon;
 			}
 		}
 	}
@@ -979,7 +970,10 @@ void Gui::checkSelect(const WindowData &data, const Common::Event &event, const
 			child = (*it).obj;
 		}
 	}
-	if (child != 0) selectDraggable(child, ref, event.mouse, data.scrollPos);
+	if (child != 0) {
+		selectDraggable(child, ref, event.mouse, data.scrollPos);
+		bringToFront(ref);
+	}
 }
 
 bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
@@ -1375,10 +1369,6 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	return true;
 }
 
-void Gui::processCursorTick() {
-	_cursor->tick();
-}
-
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
 	// HACK THERE HAS TO BE A MORE ELEGANT WAY
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index a44e394..bc9ca14 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -29,6 +29,8 @@
 
 #include "graphics/font.h"
 
+#include "common/timer.h"
+
 #include "macventure/macventure.h"
 #include "macventure/container.h"
 #include "macventure/image.h"
@@ -123,8 +125,6 @@ public:
 	bool processDiplomaEvents(WindowClick click, Common::Event &event);
 	bool processInventoryEvents(WindowClick click, Common::Event &event);
 
-	void processCursorTick();
-
 	const WindowData& getWindowData(WindowReference reference);
 
 	const Graphics::Font& getCurrentFont();
@@ -244,32 +244,35 @@ private: // Methods
 
 };
 
+static void cursorTimerHandler(void *refCon);
+
 class Cursor {
 enum ClickState {
 	kCursorIdle = 0,
-	kCursorSC = 1,
-	kCursorNoTick = 2,
-	kCursorSCTrans = 3,
-	kCursorExecSC = 4,
-	kCursorExecDC = 5,
+	kCursorSCStart = 1,
+	kCursorSCDrag = 2,
+	kCursorDCStart = 3,
+	kCursorDCDo = 4,
+	kCursorSCSink = 5,
 	kCursorStateCount
 };
 
 enum CursorInput { // Columns for the FSM transition table
-	kTickCol = 0,
-	kButtonDownCol = 1,
-	kButtonUpCol = 2,
+	kButtonDownCol = 0,
+	kButtonUpCol = 1,
+	kTickCol = 2,
 	kCursorInputCount
 };
 
 
 ClickState _transitionTable[kCursorStateCount][kCursorInputCount] = {
-	/* kCursorIdle */	{kCursorIdle,	kCursorIdle,	kCursorSC		},
-	/* kCursorSC */		{kCursorExecSC,	kCursorSCTrans,	kCursorExecDC	},
-	/* IgnoreTick */	{kCursorNoTick, kCursorNoTick,	kCursorExecSC	},
-	/* SC Transition */	{kCursorNoTick,	kCursorNoTick,	kCursorExecDC	},
-	/* Exec SC */		{kCursorIdle,	kCursorExecSC,	kCursorExecSC	},	// Trap state
-	/* Exec DC */		{kCursorIdle,	kCursorExecDC,	kCursorExecDC	}	// Trap state
+	/*				Button down,		Button Up,		Tick		*/
+	/* Idle */		{kCursorSCStart,	kCursorIdle,	kCursorIdle	},
+	/* SC Start */	{kCursorSCStart,	kCursorDCStart,	kCursorSCDrag},
+	/* SC Do */		{kCursorSCDrag, 	kCursorIdle,	kCursorSCDrag},
+	/* DC Start */	{kCursorDCDo,		kCursorDCStart,	kCursorSCSink},
+	/* DC Do */		{kCursorDCDo,		kCursorIdle,	kCursorDCDo	},
+	/* SC Sink */	{kCursorIdle,		kCursorIdle,	kCursorIdle	},
 };
 
 public:
@@ -281,12 +284,10 @@ public:
 	~Cursor() {}
 
 	void tick() {
-		executeState();
 		changeState(kTickCol);
 	}
 
 	bool processEvent(const Common::Event &event) {
-
 		if (event.type == Common::EVENT_MOUSEMOVE) {
 			_pos = event.mouse;
 			return true;
@@ -310,17 +311,49 @@ public:
 private:
 
 	void changeState(CursorInput input) {
-		debug(4, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
-		_state = _transitionTable[_state][input];
+		debug(1, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
+		if (_state != _transitionTable[_state][input]) {
+			executeStateOut();
+			_state = _transitionTable[_state][input];
+			executeStateIn();
+		}
 	}
 
-	void executeState() {
-		if (_state == kCursorExecSC) {
+	void executeStateIn() {
+		switch (_state) {
+		case kCursorSCStart:
+			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
+			break;
+		case kCursorDCStart:
+			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
+			break;
+		case kCursorSCSink:
 			_gui->handleSingleClick(_pos);
 			changeState(kTickCol);
-		} else if (_state == kCursorExecDC) {
+			break;
+		default:
+			break;
+		}
+	}
+
+	void executeStateOut() {
+		switch (_state) {
+		case kCursorIdle:
+			break;
+		case kCursorSCStart:
+			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
+			break;
+		case kCursorSCDrag:
+			_gui->handleSingleClick(_pos);
+			break;
+		case kCursorDCStart:
+			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
+			break;
+		case kCursorDCDo:
 			_gui->handleDoubleClick(_pos);
-			changeState(kTickCol);
+			break;
+		default:
+			break;
 		}
 	}
 
@@ -330,9 +363,14 @@ private:
 
 	Common::Point _pos;
 	ClickState _state;
-
 };
 
+static void cursorTimerHandler(void *refCon) {
+	Cursor *cursor = (Cursor *)refCon;
+	cursor->tick();
+}
+
+
 class ConsoleText {
 
 public:


Commit: 409a665867d5c310bf335436d05bf728c26c2f4a
    https://github.com/scummvm/scummvm/commit/409a665867d5c310bf335436d05bf728c26c2f4a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Adapt dragging to new click detection

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 327a2e8..24f7031 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -963,22 +963,22 @@ WindowReference Gui::findObjWindow(ObjID objID) {
 	return kNoWindow;
 }
 
-void Gui::checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
+void Gui::checkSelect(const WindowData &data, Common::Point pos, const Common::Rect &clickRect, WindowReference ref) {
 	ObjID child = 0;
 	for (Common::Array<DrawableObject>::const_iterator it = data.children.begin(); it != data.children.end(); it++) {
-		if (canBeSelected((*it).obj, event, clickRect, ref)) {
+		if (canBeSelected((*it).obj, clickRect, ref)) {
 			child = (*it).obj;
 		}
 	}
 	if (child != 0) {
-		selectDraggable(child, ref, event.mouse, data.scrollPos);
+		selectDraggable(child, ref, pos, data.scrollPos);
 		bringToFront(ref);
 	}
 }
 
-bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
+bool Gui::canBeSelected(ObjID obj, const Common::Rect &clickRect, WindowReference ref) {
 	return (_engine->isObjClickable(obj) &&
-					isRectInsideObject(clickRect, obj));
+			isRectInsideObject(clickRect, obj));
 }
 
 bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
@@ -1007,6 +1007,7 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point cli
 }
 
 void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
+
 	if (_draggedObj.id != 0) {
 		WindowReference destinationWindow = findWindowAtPoint(pos);
 		if (destinationWindow == kNoWindow) return;
@@ -1250,13 +1251,6 @@ bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & e
 	if (_engine->needsClickToContinue())
 		return true;
 
-	if (click == kBorderInner && event.type == Common::EVENT_LBUTTONDOWN) {
-		WindowData &data = findWindowData(kMainGameWindow);
-		Common::Point pos;
-		// Click rect to local coordinates. We assume the click is inside the window ^
-		Common::Rect clickRect = calculateClickRect(event.mouse + data.scrollPos, _mainGameWindow->getDimensions());
-		checkSelect(data, event, clickRect, kMainGameWindow);
-	}
 	return false;
 }
 
@@ -1342,8 +1336,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) return false;
-
-		Graphics::MacWindow *win = findWindow(ref);
+		
 		WindowData &data = findWindowData((WindowReference) ref);
 
 		if (click == kBorderScrollUp) {
@@ -1358,17 +1351,21 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		if (click == kBorderScrollRight) {
 			data.scrollPos.x += kScrollAmount;
 		}
-
-		if (click == kBorderInner) {
-			Common::Point pos;
-			// Click rect to local coordinates. We assume the click is inside the window ^
-			Common::Rect clickRect = calculateClickRect(event.mouse + data.scrollPos, win->getDimensions());
-			checkSelect(data, event, clickRect, (WindowReference)ref);
-		}
 	}
 	return true;
 }
 
+void Gui::selectForDrag(Common::Point pos) {
+	WindowReference ref = findWindowAtPoint(pos);
+	if (ref == kNoWindow) return;
+
+	Graphics::MacWindow *win = findWindow(ref);
+	WindowData &data = findWindowData((WindowReference) ref);
+
+	Common::Rect clickRect = calculateClickRect(pos + data.scrollPos, win->getDimensions());
+	checkSelect(data, pos, clickRect, (WindowReference)ref);
+}
+
 void Gui::handleSingleClick(Common::Point pos) {
 	debug("Single Click");
 	// HACK THERE HAS TO BE A MORE ELEGANT WAY
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index bc9ca14..8155fb5 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -130,6 +130,7 @@ public:
 	const Graphics::Font& getCurrentFont();
 
 	// Clicks
+	void selectForDrag(Common::Point pos);
 	void handleSingleClick(Common::Point pos);
 	void handleDoubleClick(Common::Point pos);
 
@@ -231,8 +232,8 @@ private: // Methods
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
 	// Utils
-	bool canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
-	void checkSelect(const WindowData &data, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref);
+	void checkSelect(const WindowData &data, Common::Point pos, const Common::Rect &clickRect, WindowReference ref);
+	bool canBeSelected(ObjID obj, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
 	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos, Common::Point scroll);
 	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
@@ -308,6 +309,10 @@ public:
 		return _pos;
 	}
 
+	bool canSelectDraggable() {
+		return _state == kCursorSCDrag;
+	}
+
 private:
 
 	void changeState(CursorInput input) {
@@ -323,6 +328,7 @@ private:
 		switch (_state) {
 		case kCursorSCStart:
 			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
+			_gui->selectForDrag(_pos);
 			break;
 		case kCursorDCStart:
 			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");


Commit: cb4650247fa10f530cc1ac5d2e4c312b055c988d
    https://github.com/scummvm/scummvm/commit/cb4650247fa10f530cc1ac5d2e4c312b055c988d
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:00+02:00

Commit Message:
MACVENTURE: Fix segfault when saving

Changed paths:
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index 95d290d..54009a1 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -95,6 +95,7 @@ Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &de
 		warning("Could not save '%s' correctly.", saveFileName.c_str());
 	}
 	delete file;
+	return Common::kNoError;
 }
 
 bool MacVentureEngine::scummVMSaveLoadDialog(bool isSave) {


Commit: d925d2c2cec380ff5422a6c737a8f7ee49085fd7
    https://github.com/scummvm/scummvm/commit/d925d2c2cec380ff5422a6c737a8f7ee49085fd7
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix segfault with death sound

Changed paths:
    engines/macventure/sound.cpp



diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 97fe3c6..0f9ea43 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -59,7 +59,7 @@ void SoundManager::ensureLoaded(ObjID sound) {
 }
 
 SoundAsset::SoundAsset(Container *container, ObjID id) :
-	_container(container), _id(id) {
+	_container(container), _id(id), _length(0), _frequency(1) {
 
 	if (_container->getItemByteSize(_id) == 0)
 		warning("Trying to load an empty sound asset.");
@@ -93,6 +93,7 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 		break;
 	default:
 		warning("Unrecognized sound type: %x", type);
+		break;
 	}
 
 	delete stream;
@@ -101,11 +102,13 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 SoundAsset::~SoundAsset() {}
 
 void SoundAsset::play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle) {
+	if (_data.size() == 0) return;
 	Audio::AudioStream *sound = Audio::makeRawStream(&_data.front(), _length, _frequency, Audio::FLAG_UNSIGNED);
 	mixer->playStream(Audio::Mixer::kPlainSoundType, soundHandle, sound);
 }
 
 uint32 SoundAsset::getPlayLength() {
+
 	return _length / _frequency;
 }
 


Commit: d1a249bc9e35ffb141f52e50b07f542a64978383
    https://github.com/scummvm/scummvm/commit/d1a249bc9e35ffb141f52e50b07f542a64978383
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix selected object drawing

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 24f7031..b449855 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -657,9 +657,14 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 			pos.y,
 			mode);
 
-		if (_engine->isObjSelected(child))
-			_assets[child]->blitInto(
-				surface, pos.x, pos.y, kBlitOR);
+		if (_engine->isObjVisible(child)) {
+			if (_engine->isObjSelected(child) ||
+				child == _draggedObj.id) {
+
+				_assets[child]->blitInto(
+					surface, pos.x, pos.y, kBlitOR);
+			}
+		}
 
 		// For test
 		if (MACVENTURE_DEBUG_GUI) {
@@ -1336,7 +1341,7 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) return false;
-		
+
 		WindowData &data = findWindowData((WindowReference) ref);
 
 		if (click == kBorderScrollUp) {


Commit: 0c0be43a3e1e4d012eb6742a88aaa2e398360f2c
    https://github.com/scummvm/scummvm/commit/0c0be43a3e1e4d012eb6742a88aaa2e398360f2c
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix corner case drawing overflow

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/image.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index b449855..6833de7 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -696,22 +696,34 @@ void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * sur
 
 void Gui::drawDraggedObject() {
 	if (_draggedObj.id != 0 &&
-			_engine->isObjVisible(_draggedObj.id)) {
+		_engine->isObjVisible(_draggedObj.id)) {
 		ensureAssetLoaded(_draggedObj.id);
 		ImageAsset *asset = _assets[_draggedObj.id];
 
-		_draggedSurface.create(asset->getWidth(), asset->getHeight(), _screen.format);
+		// In case of overflow from the right/top
+		uint w = asset->getWidth() + MIN((int16)0, _draggedObj.pos.x);
+		uint h = asset->getHeight() + MIN((int16)0, _draggedObj.pos.y);
 
-		asset->blitInto(&_draggedSurface, 0, 0, kBlitBIC);
+		// In case of overflow from the bottom/left
+		if (_draggedObj.pos.x > 0 && _draggedObj.pos.x + w > kScreenWidth) { w = kScreenWidth - _draggedObj.pos.x; }
+		if (_draggedObj.pos.y > 0 && _draggedObj.pos.y + h > kScreenHeight) { h = kScreenHeight - _draggedObj.pos.y; }
+
+		_draggedSurface.create(w, h, _screen.format);
+
+		asset->blitInto(&_draggedSurface, MIN((int16)0, _draggedObj.pos.x), MIN((int16)0, _draggedObj.pos.y), kBlitBIC);
+
+		Common::Point target = _draggedObj.pos;
+		if (target.x < 0) { target.x = 0; }
+		if (target.y < 0) { target.y = 0; }
 
 		g_system->copyRectToScreen(
-			_draggedSurface.getPixels(),
+			_draggedSurface.getBasePtr(0, 0),
 			_draggedSurface.pitch,
-			_draggedObj.pos.x,
-			_draggedObj.pos.y,
+			target.x,
+			target.y,
 			_draggedSurface.w,
-			_draggedSurface.h);
-
+			_draggedSurface.h
+		);
 	}
 }
 
@@ -846,25 +858,11 @@ void Gui::saveInto(int slot) {
 }
 
 void Gui::moveDraggedObject(Common::Point target) {
-	Common::Point newPos = target + _draggedObj.mouseOffset;
-	bool movement = false;
-	// If we overflow, move the mouseOffset, not the position.
-	if (newPos.x < 0 || newPos.x + _assets[_draggedObj.id]->getWidth() >= kScreenWidth) {
-		_draggedObj.mouseOffset.x = _draggedObj.pos.x - target.x;
-	} else {
-		_draggedObj.pos.x = newPos.x;
-		movement = true;
-	}
-
-	if (newPos.y < 0 || newPos.y + _assets[_draggedObj.id]->getHeight() >= kScreenHeight) {
-		_draggedObj.mouseOffset.y = _draggedObj.pos.y - target.y;
-	} else {
-		_draggedObj.pos.y = newPos.y;
-		movement = true;
-	}
+	ensureAssetLoaded(_draggedObj.id);
+	_draggedObj.pos = target + _draggedObj.mouseOffset;
 
 	// TODO FInd more elegant way of making pow2
-	_draggedObj.hasMoved = movement && (_draggedObj.startPos.sqrDist(_draggedObj.pos) >= (kDragThreshold * kDragThreshold));
+	_draggedObj.hasMoved = (_draggedObj.startPos.sqrDist(_draggedObj.pos) >= (kDragThreshold * kDragThreshold));
 
 	debug(4, "Dragged obj position: (%d, %d), mouse offset: (%d, %d), hasMoved: %d, dist: %d, threshold: %d",
 		_draggedObj.pos.x, _draggedObj.pos.y,
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 05ec68c..a89eae9 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -412,7 +412,7 @@ int ImageAsset::getHeight() {
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
@@ -427,12 +427,12 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, c
 
 void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
-		for (uint x = sx; x < w; x++) {
+		for (uint x = 0; x < w; x++) {
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
@@ -441,7 +441,7 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, cons
 
 void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
@@ -455,7 +455,7 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const
 
 void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
@@ -471,13 +471,15 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, cons
 	}
 }
 
-void ImageAsset::calculateSubsection(int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h) {
+void ImageAsset::calculateSubsection(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h) {
 	sx = (ox < 0) ? -ox : 0;
 	sy = (oy < 0) ? -oy : 0;
 	ox = (ox < 0) ? 0 : ox;
 	oy = (oy < 0) ? 0 : oy;
 	w = MAX((int)(bitWidth - sx), 0);
 	h = MAX((int)(bitHeight - sy), 0);
+	w = w > target->w ? target->w : w;
+	h = h > target->h ? target->h : h;
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 3520f81..3910f83 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -82,7 +82,7 @@ private:
 	void blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 	void blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 
-	void calculateSubsection(int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
+	void calculateSubsection(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
 
 private:
 	ObjID _id;


Commit: 47916aca622f42fe210e7d4738c91f3aca3e9fb2
    https://github.com/scummvm/scummvm/commit/47916aca622f42fe210e7d4738c91f3aca3e9fb2
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix dragged object drawing

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6833de7..0f5a264 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -708,14 +708,21 @@ void Gui::drawDraggedObject() {
 		if (_draggedObj.pos.x > 0 && _draggedObj.pos.x + w > kScreenWidth) { w = kScreenWidth - _draggedObj.pos.x; }
 		if (_draggedObj.pos.y > 0 && _draggedObj.pos.y + h > kScreenHeight) { h = kScreenHeight - _draggedObj.pos.y; }
 
-		_draggedSurface.create(w, h, _screen.format);
-
-		asset->blitInto(&_draggedSurface, MIN((int16)0, _draggedObj.pos.x), MIN((int16)0, _draggedObj.pos.y), kBlitBIC);
-
 		Common::Point target = _draggedObj.pos;
 		if (target.x < 0) { target.x = 0; }
 		if (target.y < 0) { target.y = 0; }
 
+		_draggedSurface.create(w, h, _screen.format);
+		_draggedSurface.blitFrom(
+			_screen,
+			Common::Rect(
+				target.x,
+				target.y,
+				target.x + _draggedSurface.w,
+				target.y + _draggedSurface.h),
+			Common::Point(0, 0));
+		asset->blitInto(&_draggedSurface, MIN((int16)0, _draggedObj.pos.x), MIN((int16)0, _draggedObj.pos.y), kBlitBIC);
+
 		g_system->copyRectToScreen(
 			_draggedSurface.getBasePtr(0, 0),
 			_draggedSurface.pitch,


Commit: 28bf4f11683eb165805e6f94e32ccf07819ed44c
    https://github.com/scummvm/scummvm/commit/28bf4f11683eb165805e6f94e32ccf07819ed44c
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix some of the offsets

Changed paths:
    engines/macventure/datafiles.cpp
    engines/macventure/gui.cpp
    engines/macventure/windows.cpp
    engines/macventure/windows.h



diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index 71407a7..77ecaee 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -50,6 +50,8 @@ Common::String windowTypeName(MVWindowType windowType) {
 		return "ZoomDoc";
 	case kZoomNoGrow:
 		return "ZoomNoGrow";
+	case kInvWindow:
+		return "InvWindow";
 	case kRDoc16:
 		return "RDoc16";
 	case kRDoc4:
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 0f5a264..4c69923 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -218,7 +218,11 @@ void Gui::initWindows() {
 
 	// In-game Output Console
 	_outConsoleWindow = _wm.addWindow(true, true, false);
-	_outConsoleWindow->setDimensions(getWindowData(kOutConsoleWindow).bounds);
+	// HACK We have to hand-create the dimensions, otherwise they don't fit
+	const WindowData &wd = getWindowData(kOutConsoleWindow);
+	Common::Rect dimensions = wd.bounds;
+	dimensions.setWidth(dimensions.width() - borderBounds(wd.type).rightOffset);
+	_outConsoleWindow->setDimensions(dimensions);
 	_outConsoleWindow->setActive(false);
 	_outConsoleWindow->setCallback(outConsoleWindowCallback, this);
 	loadBorders(_outConsoleWindow, findWindowData(kOutConsoleWindow).type);
@@ -306,15 +310,15 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
 		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
 		newData.bounds.translate(newData.bounds.left + settings.invOffsetX, newData.bounds.top + settings.invOffsetY);
-	}
-	else {
+	} else {
+		BorderBounds bbs = borderBounds(kInvWindow);
 		newData.bounds = Common::Rect(
-			settings.invLeft,
-			settings.invTop,
+			settings.invLeft - bbs.leftOffset,
+			settings.invTop - bbs.topOffset,
 			settings.invLeft + settings.invWidth,
 			settings.invTop + settings.invHeight);
 	}
-	newData.type = kZoomDoc;
+	newData.type = kInvWindow;
 	newData.hasCloseBox = true;
 	newData.visible = true;
 	newData.objRef = objRef;
@@ -431,11 +435,13 @@ bool Gui::loadWindows() {
 		bottom = res->readUint16BE();
 		right = res->readUint16BE();
 		data.type = (MVWindowType)res->readUint16BE();
+		BorderBounds bbs = borderBounds(data.type);
 		data.bounds = Common::Rect(
-			left - borderBounds(data.type).leftOffset,
-			top - borderBounds(data.type).topOffset,
-			right + borderBounds(data.type).rightOffset * 2,
-			bottom + borderBounds(data.type).bottomOffset * 2);
+			left - bbs.leftOffset,
+			top - bbs.topOffset,
+			right + bbs.rightOffset,
+			bottom + bbs.bottomOffset);
+
 		data.visible = res->readUint16BE();
 		data.hasCloseBox = res->readUint16BE();
 		data.refcon = (WindowReference)id; id++;
@@ -492,11 +498,14 @@ bool Gui::loadControls() {
 			res->read(data.title, data.titleLength);
 			data.title[data.titleLength] = '\0';
 		}
-		if (data.type != kControlExitBox)
-			data.border = commandsBorder;
+		if (data.type != kControlExitBox) {
+			BorderBounds bbs = borderBounds(getWindowData(kCommandsWindow).type);
+			// We just want to move the button, not change it's size
+			data.bounds = Common::Rect(left + bbs.leftOffset, top + bbs.topOffset, right + bbs.leftOffset, bottom + bbs.topOffset);
+		} else {
+			data.bounds = Common::Rect(left, top, right, bottom);
+		}
 
-		Common::Rect bounds(left, top, right, bottom); // For some reason, if I remove this it segfaults
-		data.bounds = Common::Rect(left + data.border, top + data.border, right + data.border, bottom + data.border);
 
 		i++;
 	}
diff --git a/engines/macventure/windows.cpp b/engines/macventure/windows.cpp
index 9825349..b3d5449 100644
--- a/engines/macventure/windows.cpp
+++ b/engines/macventure/windows.cpp
@@ -31,22 +31,23 @@ BorderBounds borderBounds(MVWindowType type) {
 	case MacVenture::kDBox:
 		break;
 	case MacVenture::kPlainDBox:
-		return BorderBounds(1, 1, 1, 2);
+		return BorderBounds(3, 3, 3, 3);
 	case MacVenture::kAltBox:
 		return BorderBounds(0, 0, 0, 0); // Hand-tested
-		break;
 	case MacVenture::kNoGrowDoc:
-		return BorderBounds(1, 17, 1, 1);
+		return BorderBounds(1, 20, 1, 1);
 	case MacVenture::kMovableDBox:
 		break;
 	case MacVenture::kZoomDoc:
-		return BorderBounds(1, 19, 17, 17);
+		return BorderBounds(1, 20, 17, 1);
 	case MacVenture::kZoomNoGrow:
 		break;
+	case MacVenture::kInvWindow:
+		return BorderBounds(1, 20, 17, 17);
 	case MacVenture::kRDoc16:
 		break;
 	case MacVenture::kRDoc4:
-		return BorderBounds(1, 19, 1, 1);
+		return BorderBounds(1, 20, 1, 1);
 	case MacVenture::kRDoc6:
 		break;
 	case MacVenture::kRDoc10:
diff --git a/engines/macventure/windows.h b/engines/macventure/windows.h
index 79b2798..fe3f927 100644
--- a/engines/macventure/windows.h
+++ b/engines/macventure/windows.h
@@ -50,6 +50,8 @@ enum MVWindowType {
 	kMovableDBox = 0x05,
 	kZoomDoc = 0x08,
 	kZoomNoGrow = 0x0c,
+	// WebVenture assigns arbitrary kinds post-loading
+	kInvWindow = 0x0e,
 	kRDoc16 = 0x10,
 	kRDoc4 = 0x12,
 	kRDoc6 = 0x14,


Commit: 5fade27a0cbac0ac8014bfff9a14d112baf3f7cd
    https://github.com/scummvm/scummvm/commit/5fade27a0cbac0ac8014bfff9a14d112baf3f7cd
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Fix indentation in controls.cpp

Changed paths:
    engines/macventure/controls.cpp



diff --git a/engines/macventure/controls.cpp b/engines/macventure/controls.cpp
index f467d72..26807a3 100644
--- a/engines/macventure/controls.cpp
+++ b/engines/macventure/controls.cpp
@@ -24,47 +24,47 @@
 
 namespace MacVenture {
 CommandButton::CommandButton() {
- _gui = nullptr;
+	_gui = nullptr;
 }
 
 CommandButton::CommandButton(ControlData data, Gui *g) {
-  _data = data;
-  _gui = g;
-  _selected = false;
+	_data = data;
+	_gui = g;
+	_selected = false;
 }
 
 void CommandButton::draw(Graphics::ManagedSurface &surface) const {
 
-  uint colorFill = _selected ? kColorBlack : kColorWhite;
-  uint colorText = _selected ? kColorWhite : kColorBlack;
+	uint colorFill = _selected ? kColorBlack : kColorWhite;
+	uint colorText = _selected ? kColorWhite : kColorBlack;
 
-  surface.fillRect(_data.bounds, colorFill);
-  surface.frameRect(_data.bounds, kColorBlack);
+	surface.fillRect(_data.bounds, colorFill);
+	surface.frameRect(_data.bounds, kColorBlack);
 
-  if (_data.titleLength > 0) {
-    const Graphics::Font &font = _gui->getCurrentFont();
-    Common::String title(_data.title);
-    font.drawString(
-      &surface,
-      title,
-      _data.bounds.left,
-      _data.bounds.top,
-      _data.bounds.right - _data.bounds.left,
-      colorText,
-      Graphics::kTextAlignCenter);
-  }
+	if (_data.titleLength > 0) {
+		const Graphics::Font &font = _gui->getCurrentFont();
+		Common::String title(_data.title);
+		font.drawString(
+			&surface,
+			title,
+			_data.bounds.left,
+			_data.bounds.top,
+			_data.bounds.right - _data.bounds.left,
+			colorText,
+			Graphics::kTextAlignCenter);
+	}
 }
 
 bool CommandButton::isInsideBounds(const Common::Point point) const {
-  return _data.bounds.contains(point);
+	return _data.bounds.contains(point);
 }
 
 const ControlData& CommandButton::getData() const {
-  return _data;
+	return _data;
 }
 
 void CommandButton::select() {
-  _selected = true;
+	_selected = true;
 }
 
 void CommandButton::unselect() {
@@ -72,6 +72,6 @@ void CommandButton::unselect() {
 }
 
 bool CommandButton::isSelected() {
-  return _selected;
+	return _selected;
 }
 }


Commit: 0b36a77af42868edaab4434215bbae5d8c3a5e2f
    https://github.com/scummvm/scummvm/commit/0b36a77af42868edaab4434215bbae5d8c3a5e2f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Refactor dragging code

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 4c69923..17d31d8 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -904,12 +904,14 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
 	return kNoWindow;
 }
 
-Common::Point Gui::getWindowSurfacePos(WindowReference reference) {
+Common::Point Gui::getGlobalScrolledSurfacePosition(WindowReference reference) {
 	const WindowData &data = getWindowData(reference);
 	BorderBounds border = borderBounds(data.type);
 	Graphics::MacWindow *win = findWindow(reference);
 	if (!win) return Common::Point(0, 0);
-	return Common::Point(win->getDimensions().left + border.leftOffset, win->getDimensions().top + border.topOffset);
+	return Common::Point(
+		win->getDimensions().left + border.leftOffset - data.scrollPos.x,
+		win->getDimensions().top + border.topOffset - data.scrollPos.y);
 }
 
 WindowData & Gui::findWindowData(WindowReference reference) {
@@ -990,7 +992,7 @@ void Gui::checkSelect(const WindowData &data, Common::Point pos, const Common::R
 		}
 	}
 	if (child != 0) {
-		selectDraggable(child, ref, pos, data.scrollPos);
+		selectDraggable(child, ref, pos);
 		bringToFront(ref);
 	}
 }
@@ -1014,29 +1016,30 @@ bool Gui::isRectInsideObject(Common::Rect target, ObjID obj) {
 	return _assets[obj]->isRectInside(intersection);
 }
 
-void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click, Common::Point scroll) {
+void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point click) {
 	if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
 		_draggedObj.hasMoved = false;
 		_draggedObj.id = child;
 		_draggedObj.startWin = origin;
-		_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - click - scroll;
+		Common::Point localizedClick = click - getGlobalScrolledSurfacePosition(origin);
+		_draggedObj.mouseOffset = _engine->getObjPosition(child) - localizedClick;
 		_draggedObj.pos = click + _draggedObj.mouseOffset;
 		_draggedObj.startPos = _draggedObj.pos;
 	}
 }
 
-void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
-
+void Gui::handleDragRelease(bool shiftPressed, bool isDoubleClick) {
 	if (_draggedObj.id != 0) {
-		WindowReference destinationWindow = findWindowAtPoint(pos);
+		WindowReference destinationWindow = findWindowAtPoint(_draggedObj.pos);
 		if (destinationWindow == kNoWindow) return;
 		if (_draggedObj.hasMoved) {
-			ObjID destObject = getWindowData(destinationWindow).objRef;
-			pos -= (_draggedObj.startPos - _draggedObj.mouseOffset);
-			pos = localize(pos, _draggedObj.startWin, destinationWindow);
-			debug("drop the object %d at obj %d, pos (%d, %d)", _draggedObj.id, destObject, pos.x, pos.y);
+			const WindowData &destinationWindowData = getWindowData(destinationWindow);
+			ObjID destObject = destinationWindowData.objRef;
+			Common::Point dropPosition = _draggedObj.pos - _draggedObj.startPos;
+			dropPosition = localizeTravelledDistance(dropPosition, _draggedObj.startWin, destinationWindow);
+			debug(3, "drop the object %d at obj %d, pos (%d, %d)", _draggedObj.id, destObject, dropPosition.x, dropPosition.y);
 
-			_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
+			_engine->handleObjectDrop(_draggedObj.id, dropPosition, destObject);
 		}
 		_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
 		_draggedObj.id = 0;
@@ -1050,17 +1053,13 @@ Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect window
 	return Common::Rect(left - kCursorWidth, top - kCursorHeight, left + kCursorWidth, top + kCursorHeight);
 }
 
-Common::Point Gui::localize(Common::Point point, WindowReference origin, WindowReference target) {
-	Graphics::MacWindow *oriWin = findWindow(origin);
-	Graphics::MacWindow *destWin = findWindow(target);
+Common::Point Gui::localizeTravelledDistance(Common::Point point, WindowReference origin, WindowReference target) {
 	if (origin != target) {
 		// ori.local to global
-		point.x += oriWin->getDimensions().left;
-		point.y += oriWin->getDimensions().top;
-		if (destWin) {
+		point += getGlobalScrolledSurfacePosition(origin);
+		if (findWindow(target)) {
 			// dest.globalToLocal
-			point.x -= destWin->getDimensions().left;
-			point.y -= destWin->getDimensions().top;
+			point -= getGlobalScrolledSurfacePosition(target);
 		}
 	}
 	return point;
@@ -1374,28 +1373,28 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	return true;
 }
 
-void Gui::selectForDrag(Common::Point pos) {
-	WindowReference ref = findWindowAtPoint(pos);
+void Gui::selectForDrag(Common::Point cursorPosition) {
+	WindowReference ref = findWindowAtPoint(cursorPosition);
 	if (ref == kNoWindow) return;
 
 	Graphics::MacWindow *win = findWindow(ref);
 	WindowData &data = findWindowData((WindowReference) ref);
 
-	Common::Rect clickRect = calculateClickRect(pos + data.scrollPos, win->getDimensions());
-	checkSelect(data, pos, clickRect, (WindowReference)ref);
+	Common::Rect clickRect = calculateClickRect(cursorPosition + data.scrollPos, win->getDimensions());
+	checkSelect(data, cursorPosition, clickRect, (WindowReference)ref);
 }
 
-void Gui::handleSingleClick(Common::Point pos) {
+void Gui::handleSingleClick() {
 	debug("Single Click");
 	// HACK THERE HAS TO BE A MORE ELEGANT WAY
 	if (_dialog) return;
-	handleDragRelease(pos, false, false);
+	handleDragRelease(false, false);
 }
 
-void Gui::handleDoubleClick(Common::Point pos) {
+void Gui::handleDoubleClick() {
 	debug("Double Click");
 	if (_dialog) return;
-	handleDragRelease(pos, false, true);
+	handleDragRelease(false, true);
 }
 
 void Gui::ensureAssetLoaded(ObjID obj) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 8155fb5..c7fb1c7 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -130,9 +130,9 @@ public:
 	const Graphics::Font& getCurrentFont();
 
 	// Clicks
-	void selectForDrag(Common::Point pos);
-	void handleSingleClick(Common::Point pos);
-	void handleDoubleClick(Common::Point pos);
+	void selectForDrag(Common::Point cursorPosition);
+	void handleSingleClick();
+	void handleDoubleClick();
 
 	// Modifiers
 	void bringToFront(WindowReference window);
@@ -227,7 +227,7 @@ private: // Methods
 
 	// Finders
 	WindowReference findWindowAtPoint(Common::Point point);
-	Common::Point getWindowSurfacePos(WindowReference reference);
+	Common::Point getGlobalScrolledSurfacePosition(WindowReference reference);
 	WindowData& findWindowData(WindowReference reference);
 	Graphics::MacWindow *findWindow(WindowReference reference);
 
@@ -235,10 +235,10 @@ private: // Methods
 	void checkSelect(const WindowData &data, Common::Point pos, const Common::Rect &clickRect, WindowReference ref);
 	bool canBeSelected(ObjID obj, const Common::Rect &clickRect, WindowReference ref);
 	bool isRectInsideObject(Common::Rect target, ObjID obj);
-	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos, Common::Point scroll);
-	void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
+	void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
+	void handleDragRelease(bool shiftPressed, bool isDoubleClick);
 	Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
-	Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);
+	Common::Point localizeTravelledDistance(Common::Point point, WindowReference origin, WindowReference target);
 	void removeInventoryWindow(WindowReference ref);
 
 	void ensureAssetLoaded(ObjID obj);
@@ -334,7 +334,7 @@ private:
 			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
 			break;
 		case kCursorSCSink:
-			_gui->handleSingleClick(_pos);
+			_gui->handleSingleClick();
 			changeState(kTickCol);
 			break;
 		default:
@@ -350,13 +350,13 @@ private:
 			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
 			break;
 		case kCursorSCDrag:
-			_gui->handleSingleClick(_pos);
+			_gui->handleSingleClick();
 			break;
 		case kCursorDCStart:
 			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
 			break;
 		case kCursorDCDo:
-			_gui->handleDoubleClick(_pos);
+			_gui->handleDoubleClick();
 			break;
 		default:
 			break;


Commit: 8608776768e9926d5be09904232647bff39d7e72
    https://github.com/scummvm/scummvm/commit/8608776768e9926d5be09904232647bff39d7e72
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-14T19:01:01+02:00

Commit Message:
MACVENTURE: Add debug channels

Changed paths:
  A engines/macventure/debug.h
    engines/macventure/container.h
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp
    engines/macventure/sound.cpp
    engines/macventure/stringtable.h
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 21fdc6c..013a11d 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -45,9 +45,6 @@ public:
 	Container(Common::String filename) {
 		_filename = filename;
 
-		//FSNode node = FSDirectory(".");
-		//debug(node.getDisplayName().c_str());
-
 		if (!_file.open(_filename))
 			error("Could not open %s", _filename.c_str());
 
@@ -100,11 +97,10 @@ public:
 
 				for (uint j = 0; j < 64; ++j) {
 					uint32 length = 0;
-					//debug("reading mask from address %x", _res->pos());
 					uint32 mask = _res->readUint32BE();
 					mask >>= (16 - bits);
 					mask &= 0xFFFF;
-					debug(11, "Load mask of object &%d:%d is %x", i, j, mask);
+					debugC(11, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
 					_res->seek(-4, SEEK_CUR);
 					// Look in the Huffman table
 					int x = 0;
@@ -143,7 +139,7 @@ public:
 					}
 
 					group.lengths[j] = length;
-					debug(11, "Load legth of object %d:%d is %d", i, j, length);
+					debugC(11, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
 				}
 
 				_groups.push_back(group);
@@ -214,7 +210,6 @@ protected:
 	Common::File _file;
 	Common::SeekableReadStream *_res;
 
-
 };
 
 
diff --git a/engines/macventure/debug.h b/engines/macventure/debug.h
new file mode 100644
index 0000000..8ee9ebe
--- /dev/null
+++ b/engines/macventure/debug.h
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef MACVENTURE_DEBUG_H
+#define MACVENTURE_DEBUG_H
+
+namespace MacVenture {
+enum MacVentureDebugChannel {
+   kMVDebugMain = 1 << 0,
+   kMVDebugGUI = 1 << 1,
+   kMVDebugImage = 1 << 2,
+   kMVDebugText = 1 << 3,
+   kMVDebugScript = 1 << 4,
+   kMVDebugSound = 1 << 5,
+   kMVDebugContainer = 1 << 6,
+   kMVDebugTests = 1 << 31
+};
+} // End namespace MacVenture
+
+#endif
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index a6c1e78..fe01d8f 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -159,7 +159,7 @@ bool DialogButton::doProcessEvent(MacVenture::Dialog *dialog, Common::Event even
   if (event.type == Common::EVENT_LBUTTONDOWN) {
     dialog->localize(mouse);
     if (_bounds.contains(mouse)) {
-      debug(1, "Click! Button: %s", _text.c_str());
+      debugC(1, kMVDebugGUI, "Click! Button: %s", _text.c_str());
       dialog->handleDialogAction(this, _action);
       return true;
     }
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 17d31d8..5fa746c 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -330,7 +330,7 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	loadBorders(newWindow, newData.type);
 	_inventoryWindows.push_back(newWindow);
 
-	debug("Create new inventory window. Reference: %d", newData.refcon);
+	debugC(1, kMVDebugGUI, "Create new inventory window. Reference: %d", newData.refcon);
 	return newData.refcon;
 }
 
@@ -455,7 +455,7 @@ bool Gui::loadWindows() {
 		}
 		data.scrollPos = Common::Point(0, 0);
 
-		debug(4, "Window loaded: %s", data.title.c_str());
+		debugC(4, kMVDebugGUI, "Window loaded: %s", data.title.c_str());
 
 		_windowData->push_back(data);
 	}
@@ -834,7 +834,7 @@ void Gui::updateExit(ObjID obj) {
 }
 
 void Gui::printText(const Common::String & text) {
-	debug(1, "Print Text: %s", text.c_str());
+	debugC(1, kMVDebugGUI, "Print Text: %s", text.c_str());
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
 
@@ -880,7 +880,7 @@ void Gui::moveDraggedObject(Common::Point target) {
 	// TODO FInd more elegant way of making pow2
 	_draggedObj.hasMoved = (_draggedObj.startPos.sqrDist(_draggedObj.pos) >= (kDragThreshold * kDragThreshold));
 
-	debug(4, "Dragged obj position: (%d, %d), mouse offset: (%d, %d), hasMoved: %d, dist: %d, threshold: %d",
+	debugC(4, kMVDebugGUI, "Dragged obj position: (%d, %d), mouse offset: (%d, %d), hasMoved: %d, dist: %d, threshold: %d",
 		_draggedObj.pos.x, _draggedObj.pos.y,
 		_draggedObj.mouseOffset.x, _draggedObj.mouseOffset.y,
 		_draggedObj.hasMoved,
@@ -1037,7 +1037,7 @@ void Gui::handleDragRelease(bool shiftPressed, bool isDoubleClick) {
 			ObjID destObject = destinationWindowData.objRef;
 			Common::Point dropPosition = _draggedObj.pos - _draggedObj.startPos;
 			dropPosition = localizeTravelledDistance(dropPosition, _draggedObj.startWin, destinationWindow);
-			debug(3, "drop the object %d at obj %d, pos (%d, %d)", _draggedObj.id, destObject, dropPosition.x, dropPosition.y);
+			debugC(3, kMVDebugGUI, "Drop the object %d at obj %d, pos (%d, %d)", _draggedObj.id, destObject, dropPosition.x, dropPosition.y);
 
 			_engine->handleObjectDrop(_draggedObj.id, dropPosition, destObject);
 		}
@@ -1082,49 +1082,46 @@ void Gui::removeInventoryWindow(WindowReference ref) {
 void Gui::handleMenuAction(MenuAction action) {
 	switch (action)	{
 	case MacVenture::kMenuActionAbout:
-		debug("MacVenture Menu Action: About");
+		warning("Unimplemented MacVenture Menu Action: About");
 		break;
 	case MacVenture::kMenuActionNew:
-		debug("MacVenture Menu Action: New");
+		warning("Unimplemented MacVenture Menu Action: New");
 		break;
 	case MacVenture::kMenuActionOpen:
-		debug("MacVenture Menu Action: Open");
 		_engine->scummVMSaveLoadDialog(false);
 		break;
 	case MacVenture::kMenuActionSave:
-		debug("MacVenture Menu Action: Save");
 		_engine->scummVMSaveLoadDialog(true);
 		break;
 	case MacVenture::kMenuActionSaveAs:
-		debug("MacVenture Menu Action: Save As");
 		_engine->scummVMSaveLoadDialog(true);
 		break;
 	case MacVenture::kMenuActionQuit:
 		debug("MacVenture Menu Action: Quit");
 		break;
 	case MacVenture::kMenuActionUndo:
-		debug("MacVenture Menu Action: Undo");
+		warning("Unimplemented MacVenture Menu Action: Undo");
 		break;
 	case MacVenture::kMenuActionCut:
-		debug("MacVenture Menu Action: Cut");
+		warning("Unimplemented MacVenture Menu Action: Cut");
 		break;
 	case MacVenture::kMenuActionCopy:
-		debug("MacVenture Menu Action: Copy");
+		warning("Unimplemented MacVenture Menu Action: Copy");
 		break;
 	case MacVenture::kMenuActionPaste:
-		debug("MacVenture Menu Action: Paste");
+		warning("Unimplemented MacVenture Menu Action: Paste");
 		break;
 	case MacVenture::kMenuActionClear:
-		debug("MacVenture Menu Action: Clear");
+		warning("Unimplemented MacVenture Menu Action: Clear");
 		break;
 	case MacVenture::kMenuActionCleanUp:
-		debug("MacVenture Menu Action: Clean Up");
+		warning("Unimplemented MacVenture Menu Action: Clean Up");
 		break;
 	case MacVenture::kMenuActionMessUp:
-		debug("MacVenture Menu Action: Mess Up");
+		warning("Unimplemented MacVenture Menu Action: Mess Up");
 		break;
 	case MacVenture::kMenuActionCommand:
-		debug("MacVenture Menu Action: GENERIC");
+		warning("Unimplemented MacVenture Menu Action: GENERIC");
 		break;
 	default:
 		break;
@@ -1385,14 +1382,14 @@ void Gui::selectForDrag(Common::Point cursorPosition) {
 }
 
 void Gui::handleSingleClick() {
-	debug("Single Click");
+	debugC(2, kMVDebugGUI, "Registered Single Click");
 	// HACK THERE HAS TO BE A MORE ELEGANT WAY
 	if (_dialog) return;
 	handleDragRelease(false, false);
 }
 
 void Gui::handleDoubleClick() {
-	debug("Double Click");
+	debugC(2, kMVDebugGUI, "Registered Double Click");
 	if (_dialog) return;
 	handleDragRelease(false, true);
 }
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index c7fb1c7..a62264c 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -316,7 +316,7 @@ public:
 private:
 
 	void changeState(CursorInput input) {
-		debug(1, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
+		debugC(3, kMVDebugGUI, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
 		if (_state != _transitionTable[_state][input]) {
 			executeStateOut();
 			_state = _transitionTable[_state][input];
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 867504b..e1d1feb 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -36,7 +36,7 @@ namespace MacVenture {
 
 // HACK, see below
 void toASCII(Common::String &str) {
-	debug("toASCII: %s", str.c_str());
+	debugC(1, kMVDebugMain, "toASCII: %s", str.c_str());
 	Common::String::iterator it = str.begin();
 	for (; it != str.end(); it++) {
 		if (*it == '\216') { str.replace(it, it + 1, "e"); }
@@ -52,11 +52,14 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 	_gameDescription = gameDesc;
 	_rnd = new Common::RandomSource("macventure");
 
+	initDebugChannels();
+
 	_debugger = NULL;
 	_gui = NULL;
 
 	_soundManager = NULL;
 
+
 	debug("MacVenture::MacVentureEngine()");
 }
 
@@ -91,6 +94,16 @@ MacVentureEngine::~MacVentureEngine() {
 		delete _dataBundle;
 }
 
+void MacVentureEngine::initDebugChannels() {
+	DebugMan.addDebugChannel(kMVDebugMain, "main", "Engine state");
+	DebugMan.addDebugChannel(kMVDebugGUI, "gui", "Gui");
+	DebugMan.addDebugChannel(kMVDebugText, "text", "Text decoders and printers");
+	DebugMan.addDebugChannel(kMVDebugImage, "image", "Image decoders and renderers");
+	DebugMan.addDebugChannel(kMVDebugScript, "script", "Script engine");
+	DebugMan.addDebugChannel(kMVDebugSound, "sound", "Sound decoders");
+	DebugMan.addDebugChannel(kMVDebugContainer, "container", "Containers");
+}
+
 Common::Error MacVentureEngine::run() {
 	debug("MacVenture::MacVentureEngine::init()");
 
@@ -224,7 +237,7 @@ void MacVentureEngine::requestUnpause() {
 }
 
 void MacVentureEngine::selectControl(ControlAction id) {
-	debug(2, "Select control %x", id);
+	debugC(2, kMVDebugMain, "Select control %x", id);
 	_selectedControl = id;
 }
 
@@ -239,7 +252,7 @@ void MacVentureEngine::activateCommand(ControlAction id) {
 			_activeControl = kNoCommand;
 		_activeControl = id;
 	}
-	debug(2, "Activating Command %x... Command %x is active", id, _activeControl);
+	debugC(2, kMVDebugMain, "Activating Command %x... Command %x is active", id, _activeControl);
 	refreshReady();
 }
 
@@ -392,7 +405,7 @@ void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID
 }
 
 void MacVentureEngine::updateDelta(Common::Point newPos) {
-	debug("Update delta: Old(%d, %d), New(%d, %d)",
+	debugC(4, kMVDebugMain, "Update delta: Old(%d, %d), New(%d, %d)",
 		_deltaPoint.x, _deltaPoint.y,
 		newPos.x, newPos.y);
 	_deltaPoint = newPos;
@@ -407,7 +420,7 @@ void MacVentureEngine::updateWindow(WindowReference winID) {
 }
 
 bool MacVentureEngine::showTextEntry(ObjID text, ObjID srcObj, ObjID destObj) {
-	debug("Showing speech dialog, asset %d from %d to %d", text, srcObj, destObj);
+	debugC(3, kMVDebugMain, "Showing speech dialog, asset %d from %d to %d", text, srcObj, destObj);
 	_gui->getTextFromUser();
 
 	// HACK WITH FLAGS
@@ -467,7 +480,7 @@ void MacVentureEngine::processEvents() {
 }
 
 bool MacVenture::MacVentureEngine::runScriptEngine() {
-	debug(4, "MAIN: Running script engine");
+	debugC(4, kMVDebugMain, "MAIN: Running script engine");
 	if (_haltedAtEnd) {
 		_haltedAtEnd = false;
 		if (_scriptEngine->resume(false)) {
@@ -745,7 +758,7 @@ void MacVentureEngine::focusObjectWindow(ObjID objID) {
 
 void MacVentureEngine::openObject(ObjID objID) {
 
-	debug("Open Object[%d] parent[%d] x[%d] y[%d]",
+	debugC(1, kMVDebugMain, "Open Object[%d] parent[%d] x[%d] y[%d]",
 		objID,
 		_world->getObjAttr(objID, kAttrParentObject),
 		_world->getObjAttr(objID, kAttrPosX),
@@ -775,7 +788,7 @@ void MacVentureEngine::closeObject(ObjID objID) {
 void MacVentureEngine::checkObject(QueuedObject old) {
 	//warning("checkObject: unimplemented");
 	bool hasChanged = false;
-	debug("Check Object[%d] parent[%d] x[%d] y[%d]",
+	debugC(1, kMVDebugMain, "Check Object[%d] parent[%d] x[%d] y[%d]",
 		old.object,
 		old.parent,
 		old.x,
@@ -842,7 +855,7 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 	WindowReference from = getObjWindow(fromID);
 	WindowReference to = getObjWindow(toID);
 	WindowReference tmp = to;
-	debug("Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
+	debugC(1, kMVDebugMain, "Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
 		fromID, toID, from, to);
 
 	if (!to) {
@@ -1098,7 +1111,7 @@ bool MacVentureEngine::loadTextHuffman() {
 			values[i] = res->readByte();
 
 		_textHuffman = new HuffmanLists(numEntries, lengths, masks, values);
-		debug(4, "Text is huffman-encoded");
+		debugC(4, kMVDebugMain, "Text is huffman-encoded");
 		return true;
 	}
 	return false;
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 275a7ac..e9d4e12 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -34,6 +34,7 @@
 
 #include "gui/debugger.h"
 
+#include "macventure/debug.h"
 #include "macventure/gui.h"
 #include "macventure/world.h"
 #include "macventure/hufflists.h"
@@ -66,13 +67,6 @@ enum {
 };
 
 enum {
-	kMacVentureDebugExample = 1 << 0,
-	kMacVentureDebugExample2 = 1 << 1
-	// next new level must be 1 << 2 (4)
-	// the current limitation is 32 debug levels (1 << 31 is the last one)
-};
-
-enum {
 	kGlobalSettingsID = 0x80,
 	kDiplomaGeometryID = 0x81,
 	kTextHuffmanTableID = 0x83
@@ -191,6 +185,8 @@ public:
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 
+	void initDebugChannels();
+
 	// datafiles.cpp
 	void loadDataBundle();
 	Common::SeekableReadStream *getBorderFile(MVWindowType windowType, bool isActive);
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index ef1d36c..d191cef 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -51,14 +51,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	frame.haltedInFirst = false;
 	frame.haltedInFamily = false;
 	_frames.push_back(frame);
-	debug(3, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+	debugC(3, kMVDebugScript, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
 		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
 
 	return resume(true);
 }
 
 bool ScriptEngine::resume(bool execAll) {
-	debug(3, "SCRIPT: Resume");
+	debugC(3, kMVDebugScript, "SCRIPT: Resume");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
@@ -146,7 +146,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 
 bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 	if (_scripts->getItemByteSize(scriptID) > 0) {
-		debug(2, "SCRIPT: Loading function %d", scriptID);
+		debugC(2, kMVDebugScript, "SCRIPT: Loading function %d", scriptID);
 		// Insert the new script at the front
 		frame->scripts.push_front(ScriptAsset(scriptID, _scripts));
 		return runFunc(frame);
@@ -169,7 +169,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 	byte op;
 	while (script.hasNext()) {
 		op = script.fetch();
-		debug(3, "SCRIPT: I'm running operation %d", op);
+		debugC(3, kMVDebugScript, "SCRIPT: I'm running operation %d", op);
 		if (!(op & 0x80)) {
 			state->push(op);
 		} else {
@@ -924,12 +924,12 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
-	debug(2, "SCRIPT: Call function: %d", id);
+	debugC(2, kMVDebugScript, "SCRIPT: Call function: %d", id);
 	if (loadScript(frame, id))
 		return true;
 	frame->scripts.pop_front();
 	script = frame->scripts.front();
-	debug(2, "SCRIPT: Return from fuction %d", id);
+	debugC(2, kMVDebugScript, "SCRIPT: Return from fuction %d", id);
 }
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
@@ -1013,7 +1013,7 @@ void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
 	totalPlayTime %= 60;
 	state->push(minutes);
 	state->push(totalPlayTime);
-	debug("Saved time: h[%d] m[%d] s[%d]", hours, minutes, totalPlayTime);
+	debugC(2, kMVDebugScript, "Saved time: h[%d] m[%d] s[%d]", hours, minutes, totalPlayTime);
 }
 
 void ScriptEngine::opcbDAY(EngineState * state, EngineFrame * frame) {
@@ -1168,7 +1168,7 @@ void ScriptEngine::ope7CFIB(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::op00NOOP(byte op) {
-	debug("SCRIPT: Opcode not implemented => %x", op);
+	warning("SCRIPT: Opcode not implemented => %x", op);
 }
 
 
@@ -1208,7 +1208,7 @@ void ScriptAsset::loadInstructions() {
 	for (uint i = 0; i < amount; i++) {
 		_instructions.push_back(res->readByte());
 	}
-	debug(2, "SCRIPT: Load %d instructions for script %d", amount, _id);
+	debugC(2, kMVDebugScript, "SCRIPT: Load %d instructions for script %d", amount, _id);
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 0f9ea43..785c83e 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -34,7 +34,7 @@ SoundManager::SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer) {
 	Common::String filename = engine->getFilePath(kSoundPathID);
 	_container = new Container(filename);
 	_mixer = mixer;
-	debug(1, "Created sound manager with file %s", filename.c_str());
+	debugC(1, kMVDebugSound, "Created sound manager with file %s", filename.c_str());
 }
 
 SoundManager::~SoundManager(){
@@ -68,7 +68,7 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 
 	stream->seek(5, SEEK_SET);
 	SoundType type = (SoundType)stream->readByte();
-	debug(2, "Decoding sound of type %x", type);
+	debugC(2, kMVDebugSound, "Decoding sound of type %x", type);
 	switch(type) {
 	case kSound10:
 		decode10(stream);
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index ff9eddc..f05b793 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -85,7 +85,7 @@ private:
 			// HACK until a proper special char implementation is found, this will have to do.
 			Common::String result = Common::String(str);
 			toASCII(result);
-			debug(11, "Loaded string %s", str);
+			debugC(5, kMVDebugText, "Loaded string %s", str);
 			_strings.push_back(Common::String(result));
 			delete[] str;
 		}
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index cf74028..74b5685 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -37,7 +37,7 @@ TextAsset::TextAsset(MacVentureEngine *engine, ObjID objid, ObjID source, ObjID
 	}
 	else {
 		decodeHuffman();
-	}	
+	}
 }
 
 void TextAsset::decodeOld() {
@@ -110,7 +110,7 @@ void TextAsset::decodeOld() {
 	}
 
 	str[strLen] = '\0';
-	debug(7, "Decoded %d string (old): %s", _id, str);
+	debugC(3, kMVDebugText, "Decoded %d string (old): %s", _id, str);
 	_decoded = Common::String(str);
 }
 
@@ -136,7 +136,7 @@ void TextAsset::decodeHuffman() {
 		// Find the length index
 		for (entry = 0; entry < _huffman->getNumEntries(); entry++) {
 			if (mask < _huffman->getMask(entry)) break;
-		}			
+		}
 
 		stream.skip(_huffman->getLength(entry));
 
@@ -171,10 +171,10 @@ void TextAsset::decodeHuffman() {
 		} else { // Plain ascii
 			c = symbol & 0xFF;
 			_decoded.replace(_decoded.end(), _decoded.end(), Common::String(c));
-		}		
+		}
 	}
 	_decoded += '\0';
-	debug(7, "Decoded %d'th string (new): %s", _id, _decoded.c_str());	
+	debugC(4, kMVDebugText, "Decoded %d'th string (new): %s", _id, _decoded.c_str());
 }
 Common::String TextAsset::getNoun(ObjID subval) {
 	ObjID obj;
@@ -208,8 +208,8 @@ Common::String TextAsset::getNoun(ObjID subval) {
 		name.toUppercase();
 		name.replace(1, name.size() - 1, tmp, 1, tmp.size() - 1);
 	}
-		
+
 	return name;
 }
 
-} // End of namespace MacVenture
\ No newline at end of file
+} // End of namespace MacVenture
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index f5af029..012e872 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -59,7 +59,7 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	res >>= _engine->getGlobalSettings().attrShifts[attrID];
 	if (res & 0x8000)
 		res = -((res ^ 0xffff) + 1);
-	debug(6, "Attribute %x from object %x is %x", attrID, objID, res);
+	debugC(5, kMVDebugMain, "Attribute %x from object %x is %x", attrID, objID, res);
 	return res;
 }
 


Commit: dd3527517690c3fdd065dfaacfef936666f139e0
    https://github.com/scummvm/scummvm/commit/dd3527517690c3fdd065dfaacfef936666f139e0
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:00+02:00

Commit Message:
MACVENTURE: Add conditionals to engine destructors

Changed paths:
    engines/macventure/debug.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/debug.h b/engines/macventure/debug.h
index 8ee9ebe..c223d01 100644
--- a/engines/macventure/debug.h
+++ b/engines/macventure/debug.h
@@ -31,8 +31,7 @@ enum MacVentureDebugChannel {
    kMVDebugText = 1 << 3,
    kMVDebugScript = 1 << 4,
    kMVDebugSound = 1 << 5,
-   kMVDebugContainer = 1 << 6,
-   kMVDebugTests = 1 << 31
+   kMVDebugContainer = 1 << 6
 };
 } // End namespace MacVenture
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index e1d1feb..37a57ca 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -56,9 +56,17 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 
 	_debugger = NULL;
 	_gui = NULL;
+	_scriptEngine = NULL;
+	_filenames = NULL;
+
+	_decodingDirectArticles = NULL;
+	_decodingNamingArticles = NULL;
+	_decodingIndirectArticles = NULL;
+	_textHuffman = NULL;
 
 	_soundManager = NULL;
 
+	_dataBundle = NULL;
 
 	debug("MacVenture::MacVentureEngine()");
 }
@@ -67,10 +75,18 @@ MacVentureEngine::~MacVentureEngine() {
 	debug("MacVenture::~MacVentureEngine()");
 
 	DebugMan.clearAllDebugChannels();
-	delete _rnd;
-	delete _debugger;
-	delete _gui;
-	delete _scriptEngine;
+
+	if (_rnd)
+		delete _rnd;
+
+	if (_debugger)
+		delete _debugger;
+
+	if (_gui)
+		delete _gui;
+
+	if (_scriptEngine)
+		delete _scriptEngine;
 
 	if (_filenames)
 		delete _filenames;
@@ -106,7 +122,6 @@ void MacVentureEngine::initDebugChannels() {
 
 Common::Error MacVentureEngine::run() {
 	debug("MacVenture::MacVentureEngine::init()");
-
 	initGraphics(kScreenWidth, kScreenHeight, true);
 
 	_debugger = new Console(this);


Commit: 9676b6f7fe2c9f6ec94ebcce17da5f78c362b3ac
    https://github.com/scummvm/scummvm/commit/9676b6f7fe2c9f6ec94ebcce17da5f78c362b3ac
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix window resizing bug

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 5fa746c..66288d0 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -589,13 +589,11 @@ void Gui::drawInventories() {
 	Graphics::ManagedSurface *srf;
 	for (uint i = 0; i < _inventoryWindows.size(); i++) {
 		const WindowData &data = getWindowData((WindowReference)(kInventoryStart + i));
-		srf = findWindow(data.refcon)->getSurface();
+		Graphics::MacWindow *win = findWindow(data.refcon);
+		srf = win->getSurface();
+		srf->clear(kColorGreen);
 		BorderBounds border = borderBounds(data.type);
-		srf->fillRect(Common::Rect(
-			border.leftOffset,
-			border.topOffset,
-			srf->w + border.rightOffset,
-			srf->h + border.bottomOffset), kColorWhite);
+		srf->fillRect(srf->getBounds(), kColorWhite);
 		drawObjectsInWindow(data.refcon, srf);
 
 		if (MACVENTURE_DEBUG_GUI) {
@@ -643,7 +641,7 @@ void Gui::drawConsoleWindow() {
 	_consoleText->renderInto(srf, bounds.leftOffset);
 }
 
-void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface * surface) {
+void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface) {
 	WindowData &data = findWindowData(target);
 	BorderBounds border = borderBounds(data.type);
 	Common::Point pos;
@@ -652,16 +650,22 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 
 	if (data.children.size() == 0) return;
 
+	Graphics::ManagedSurface *composeSurface = new Graphics::ManagedSurface();
+	composeSurface->create(
+		surface->w - border.leftOffset - border.rightOffset,
+		surface->h - border.topOffset - border.bottomOffset,
+		surface->format);
+	composeSurface->clear(kColorGreen);
+
 	for (uint i = 0; i < data.children.size(); i++) {
 		child = data.children[i].obj;
 		mode = (BlitMode)data.children[i].mode;
 		pos = _engine->getObjPosition(child);
-		pos += Common::Point(border.leftOffset, border.topOffset);
 		pos -= data.scrollPos;
 		ensureAssetLoaded(child);
 
 		_assets[child]->blitInto(
-			surface,
+			composeSurface,
 			pos.x,
 			pos.y,
 			mode);
@@ -671,7 +675,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 				child == _draggedObj.id) {
 
 				_assets[child]->blitInto(
-					surface, pos.x, pos.y, kBlitOR);
+					composeSurface, pos.x, pos.y, kBlitOR);
 			}
 		}
 
@@ -681,8 +685,10 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 			testBounds.translate(-data.scrollPos.x, -data.scrollPos.y);
 			surface->frameRect(testBounds, kColorGreen);
 		}
-
 	}
+	Common::Point composePosition = Common::Point(border.leftOffset, border.topOffset);
+	surface->transBlitFrom(*composeSurface, composePosition, kColorGreen);
+	delete composeSurface;
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {


Commit: 4f6609f704edf2ee38582cb2d2f17a7017d79732
    https://github.com/scummvm/scummvm/commit/4f6609f704edf2ee38582cb2d2f17a7017d79732
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Refactor object drawing

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 66288d0..caa756f 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -564,7 +564,8 @@ void Gui::drawMainGameWindow() {
 			border.topOffset,
 			kBlitDirect);
 	}
-	drawObjectsInWindow(kMainGameWindow, _mainGameWindow->getSurface());
+
+	drawObjectsInWindow(data, _mainGameWindow->getSurface());
 
 	if (MACVENTURE_DEBUG_GUI) {
 		Graphics::MacWindow *win = findWindow(data.refcon);
@@ -579,7 +580,7 @@ void Gui::drawMainGameWindow() {
 }
 
 void Gui::drawSelfWindow() {
-	drawObjectsInWindow(kSelfWindow, _selfWindow->getSurface());
+	drawObjectsInWindow(getWindowData(kSelfWindow), _selfWindow->getSurface());
 	if (_engine->isObjSelected(1)) invertWindowColors(kSelfWindow);
 	findWindow(kSelfWindow)->setDirty(true);
 }
@@ -594,7 +595,7 @@ void Gui::drawInventories() {
 		srf->clear(kColorGreen);
 		BorderBounds border = borderBounds(data.type);
 		srf->fillRect(srf->getBounds(), kColorWhite);
-		drawObjectsInWindow(data.refcon, srf);
+		drawObjectsInWindow(data, srf);
 
 		if (MACVENTURE_DEBUG_GUI) {
 			Graphics::MacWindow *win = findWindow(data.refcon);
@@ -641,14 +642,13 @@ void Gui::drawConsoleWindow() {
 	_consoleText->renderInto(srf, bounds.leftOffset);
 }
 
-void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface) {
-	WindowData &data = findWindowData(target);
-	BorderBounds border = borderBounds(data.type);
+void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSurface *surface) {
+	BorderBounds border = borderBounds(targetData.type);
 	Common::Point pos;
 	ObjID child;
 	BlitMode mode;
 
-	if (data.children.size() == 0) return;
+	if (targetData.children.size() == 0) return;
 
 	Graphics::ManagedSurface *composeSurface = new Graphics::ManagedSurface();
 	composeSurface->create(
@@ -657,11 +657,11 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		surface->format);
 	composeSurface->clear(kColorGreen);
 
-	for (uint i = 0; i < data.children.size(); i++) {
-		child = data.children[i].obj;
-		mode = (BlitMode)data.children[i].mode;
+	for (uint i = 0; i < targetData.children.size(); i++) {
+		child = targetData.children[i].obj;
+		mode = (BlitMode)targetData.children[i].mode;
 		pos = _engine->getObjPosition(child);
-		pos -= data.scrollPos;
+		pos -= targetData.scrollPos;
 		ensureAssetLoaded(child);
 
 		_assets[child]->blitInto(
@@ -682,7 +682,7 @@ void Gui::drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *
 		// For test
 		if (MACVENTURE_DEBUG_GUI) {
 			Common::Rect testBounds = _engine->getObjBounds(child);
-			testBounds.translate(-data.scrollPos.x, -data.scrollPos.y);
+			testBounds.translate(-targetData.scrollPos.x, -targetData.scrollPos.y);
 			surface->frameRect(testBounds, kColorGreen);
 		}
 	}
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index a62264c..12b499a 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -219,7 +219,7 @@ private: // Methods
 	void drawConsoleWindow();
 
 	void drawDraggedObject();
-	void drawObjectsInWindow(WindowReference target, Graphics::ManagedSurface *surface);
+	void drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSurface *surface);
 	void drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface);
 	void drawDialog();
 


Commit: 560185903cf13dbb91ce916dc7347cec6f968c12
    https://github.com/scummvm/scummvm/commit/560185903cf13dbb91ce916dc7347cec6f968c12
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix console drawing bug

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index caa756f..deb4a09 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -639,7 +639,7 @@ void Gui::drawConsoleWindow() {
 
 	Graphics::ManagedSurface *srf = _outConsoleWindow->getSurface();
 	BorderBounds bounds = borderBounds(getWindowData(kOutConsoleWindow).type);
-	_consoleText->renderInto(srf, bounds.leftOffset);
+	_consoleText->renderInto(srf, bounds, kConsoleLeftOffset);
 }
 
 void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSurface *surface) {
@@ -651,10 +651,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 	if (targetData.children.size() == 0) return;
 
 	Graphics::ManagedSurface *composeSurface = new Graphics::ManagedSurface();
-	composeSurface->create(
-		surface->w - border.leftOffset - border.rightOffset,
-		surface->h - border.topOffset - border.bottomOffset,
-		surface->format);
+	createInnerSurface(composeSurface, surface, border);
 	composeSurface->clear(kColorGreen);
 
 	for (uint i = 0; i < targetData.children.size(); i++) {
@@ -879,6 +876,13 @@ void Gui::saveInto(int slot) {
 	_engine->preparedToRun();
 }
 
+void Gui::createInnerSurface(Graphics::ManagedSurface *innerSurface, Graphics::ManagedSurface *outerSurface, const BorderBounds &borders) {
+	innerSurface->create(
+		outerSurface->w - borders.leftOffset - borders.rightOffset,
+		outerSurface->h - borders.topOffset - borders.bottomOffset,
+		outerSurface->format);
+}
+
 void Gui::moveDraggedObject(Common::Point target) {
 	ensureAssetLoaded(_draggedObj.id);
 	_draggedObj.pos = target + _draggedObj.mouseOffset;
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 12b499a..7d1a08a 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -161,6 +161,8 @@ public:
 	void loadGame(int slot);
 	void saveInto(int slot);
 
+	void createInnerSurface(Graphics::ManagedSurface *innerSurface, Graphics::ManagedSurface *outerSurface, const BorderBounds &borders);
+
 
 private: // Attributes
 
@@ -377,6 +379,10 @@ static void cursorTimerHandler(void *refCon) {
 }
 
 
+enum {
+	kConsoleLeftOffset = 2
+};
+
 class ConsoleText {
 
 public:
@@ -407,14 +413,23 @@ public:
 		updateScroll();
 	}
 
-	void renderInto(Graphics::ManagedSurface *target, uint leftOffset) {
+	void renderInto(Graphics::ManagedSurface *target, const BorderBounds borders, int textOffset) {
 		target->fillRect(target->getBounds(), kColorWhite);
+
+		Graphics::ManagedSurface *composeSurface = new Graphics::ManagedSurface();
+		_gui->createInnerSurface(composeSurface, target, borders);
+		composeSurface->clear(kColorGreen);
+
 		const Graphics::Font *font = &_gui->getCurrentFont();
 		uint y = target->h - font->getFontHeight();
 		for (uint i = _scrollPos; i != 0; i--) {
-			font->drawString(target, _lines[i], leftOffset, y, font->getStringWidth(_lines[i]), kColorBlack);
+			font->drawString(target, _lines[i], textOffset, y, font->getStringWidth(_lines[i]), kColorBlack);
 			y -= font->getFontHeight();
 		}
+
+		Common::Point composePosition = Common::Point(borders.leftOffset, borders.topOffset);
+		target->transBlitFrom(*composeSurface, composePosition, kColorGreen);
+		delete composeSurface;
 	}
 
 	void updateScroll() {


Commit: fd601f016f952f0a1b7fb4170fa05293813e7da5
    https://github.com/scummvm/scummvm/commit/fd601f016f952f0a1b7fb4170fa05293813e7da5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix small if

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/sound.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 37a57ca..8b947d5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -205,7 +205,6 @@ Common::Error MacVentureEngine::run() {
 
 				if (_gameState == kGameStateWinnig || _gameState == kGameStateLosing) {
 					endGame();
-					return Common::kNoError;
 				}
 			}
 			_gui->draw();
@@ -240,7 +239,6 @@ void MacVentureEngine::resetGui() {
 	updateExits();
 }
 
-
 void MacVentureEngine::requestQuit() {
 	// TODO: Display save game dialog and such
 	_gameState = kGameStateQuitting;
@@ -542,6 +540,7 @@ void MacVentureEngine::endGame() {
 }
 
 void MacVentureEngine::updateState(bool pause) {
+	_prepared = false;
 	runObjQueue();
 	printTexts();
 	playSounds(pause);
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 785c83e..ea3b2d9 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -39,7 +39,7 @@ SoundManager::SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer) {
 
 SoundManager::~SoundManager(){
 	if (_container)
-	delete _container;
+		delete _container;
 
 	Common::HashMap<ObjID, SoundAsset*>::iterator it;
 	for (it = _assets.begin(); it != _assets.end(); it++) {


Commit: 7f533ff7df2e54efc01a44a838cd8f67ddf551b0
    https://github.com/scummvm/scummvm/commit/7f533ff7df2e54efc01a44a838cd8f67ddf551b0
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix double free on sound

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/sound.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 8b947d5..beee71a 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -634,8 +634,8 @@ void MacVentureEngine::playSounds(bool pause) {
 		}
 	}
 	if (pause && delay > 0) {
-		warning("Sound pausing not yet tested. Pausing for %d", delay * 1000);
-		g_system->delayMillis(delay * 1000);
+		warning("Sound pausing not yet tested. Pausing for %d", delay);
+		g_system->delayMillis(delay);
 		preparedToRun();
 	}
 }
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index ea3b2d9..f05c88f 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -42,7 +42,8 @@ SoundManager::~SoundManager(){
 		delete _container;
 
 	Common::HashMap<ObjID, SoundAsset*>::iterator it;
-	for (it = _assets.begin(); it != _assets.end(); it++) {
+	Common::HashMap<ObjID, SoundAsset*>::iterator end = _assets.end();
+	for (it = _assets.begin(); it != end; it++) {
 		delete it->_value;
 	}
 }
@@ -60,7 +61,7 @@ void SoundManager::ensureLoaded(ObjID sound) {
 
 SoundAsset::SoundAsset(Container *container, ObjID id) :
 	_container(container), _id(id), _length(0), _frequency(1) {
-
+	debug("SoundAsset::SoundAsset(%d)", _id);
 	if (_container->getItemByteSize(_id) == 0)
 		warning("Trying to load an empty sound asset.");
 
@@ -99,17 +100,19 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 	delete stream;
 }
 
-SoundAsset::~SoundAsset() {}
+SoundAsset::~SoundAsset() {
+	debug("SoundAsset::~SoundAsset(%d)", _id);
+}
 
 void SoundAsset::play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle) {
 	if (_data.size() == 0) return;
-	Audio::AudioStream *sound = Audio::makeRawStream(&_data.front(), _length, _frequency, Audio::FLAG_UNSIGNED);
+	Audio::AudioStream *sound = Audio::makeRawStream(&_data.front(), _length, _frequency, Audio::FLAG_UNSIGNED, DisposeAfterUse::NO);
 	mixer->playStream(Audio::Mixer::kPlainSoundType, soundHandle, sound);
 }
 
 uint32 SoundAsset::getPlayLength() {
-
-	return _length / _frequency;
+	// Transform to milliseconds
+	return _length * 1000 / _frequency;
 }
 
 void SoundAsset::decode10(Common::SeekableReadStream *stream) {


Commit: 5c38a0c33b3c7487fcfa441c4d6406c5decce809
    https://github.com/scummvm/scummvm/commit/5c38a0c33b3c7487fcfa441c4d6406c5decce809
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Add win game dialog

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp
    engines/macventure/prebuilt_dialogs.cpp
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index fe01d8f..7cbf0cb 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -45,18 +45,30 @@ Dialog::~Dialog() {
 }
 
 void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
-  switch(action) {
-  case kDACloseDialog:
-    _gui->closeDialog();
-    break;
-  case kDASubmit:
-    _gui->setTextInput(_userInput);
-    _gui->closeDialog();
-    break;
-  case kDASaveAs:
-    _gui->saveInto(0);
-    _gui->closeDialog();
-    break;
+	switch(action) {
+ 		case kDACloseDialog:
+			_gui->closeDialog();
+			break;
+ 		case kDASubmit:
+			_gui->setTextInput(_userInput);
+			_gui->closeDialog();
+			break;
+		case kDASaveAs:
+			_gui->saveGame();
+			_gui->closeDialog();
+			break;
+		case kDALoadGame:
+			_gui->loadGame();
+			_gui->closeDialog();
+			break;
+		case kDANewGame:
+			_gui->newGame();
+			_gui->closeDialog();
+			break;
+		case kDAQuit:
+			_gui->quitGame();
+			_gui->closeDialog();
+			break;
   }
 }
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index deb4a09..6c8122d 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -867,13 +867,20 @@ void Gui::getTextFromUser() {
 	showPrebuiltDialog(kSpeakDialog);
 }
 
-void Gui::loadGame(int slot) {
-	_engine->loadGameState(slot);
+void Gui::loadGame() {
+	_engine->scummVMSaveLoadDialog(false);
 }
 
-void Gui::saveInto(int slot) {
-	_engine->saveGameState(slot, "desc");
-	_engine->preparedToRun();
+void Gui::saveGame() {
+	_engine->scummVMSaveLoadDialog(true);
+}
+
+void Gui::newGame() {
+	warning("New Game not implemented!");
+}
+
+void Gui::quitGame() {
+	_engine->requestQuit();
 }
 
 void Gui::createInnerSurface(Graphics::ManagedSurface *innerSurface, Graphics::ManagedSurface *outerSurface, const BorderBounds &borders) {
@@ -1098,13 +1105,13 @@ void Gui::handleMenuAction(MenuAction action) {
 		warning("Unimplemented MacVenture Menu Action: New");
 		break;
 	case MacVenture::kMenuActionOpen:
-		_engine->scummVMSaveLoadDialog(false);
+		loadGame();
 		break;
 	case MacVenture::kMenuActionSave:
-		_engine->scummVMSaveLoadDialog(true);
+		saveGame();
 		break;
 	case MacVenture::kMenuActionSaveAs:
-		_engine->scummVMSaveLoadDialog(true);
+		saveGame();
 		break;
 	case MacVenture::kMenuActionQuit:
 		debug("MacVenture Menu Action: Quit");
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 7d1a08a..185171f 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -157,9 +157,10 @@ public:
 	void setTextInput(Common::String str);
 	void closeDialog();
 
-	// TODO: Currently unused, we are using ScummVM dialogs instead.
-	void loadGame(int slot);
-	void saveInto(int slot);
+	void loadGame();
+	void saveGame();
+	void newGame();
+	void quitGame();
 
 	void createInnerSurface(Graphics::ManagedSurface *innerSurface, Graphics::ManagedSurface *outerSurface, const BorderBounds &borders);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index beee71a..a1b2387 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -293,10 +293,13 @@ void MacVentureEngine::gameChanged() {
 }
 
 void MacVentureEngine::winGame() {
+	_gui->showPrebuiltDialog(kWinGameDialog);
 	_gameState = kGameStateWinnig;
 }
 
 void MacVentureEngine::loseGame() {
+	_gui->showPrebuiltDialog(kWinGameDialog);
+	_paused = true;
 	_gameState = kGameStateLosing;
 }
 
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index 13d2d44..945808b 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -47,6 +47,18 @@ PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
       {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
       {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
     }
+},
+
+  { /* kWinGameDialog */
+	  Common::Rect(20, 100, 400, 200),
+	  {
+		  {kDEPlainText, "You Won!", kDANone, Common::Point(10, 10), 400, 20},
+		  {kDEPlainText, "What do you want to do?", kDANone, Common::Point(10, 30), 400, 20},
+		  {kDEButton, "New Game", kDANewGame, Common::Point(40, 30), 50, 20},
+		  {kDEButton, "Load", kDALoadGame, Common::Point(100, 30), 50, 20},
+		  {kDEButton, "Quit", kDAQuit, Common::Point(160, 30), 50, 20},
+		  {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+	  }
   }
 
 };
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 58e8f0b..5deda1b 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -31,12 +31,16 @@ enum DialogAction {
   kDANone,
   kDACloseDialog,
   kDASubmit,
-  kDASaveAs
+  kDASaveAs,
+  kDALoadGame,
+  kDAQuit,
+  kDANewGame
 };
 
 enum PrebuiltDialogs {
   kSaveAsDialog = 0, //TODO: Currently unused, we are using ScummVM dialogs instead.
   kSpeakDialog = 1,
+  kWinGameDialog = 2,
   kPrebuiltDialogCount
 };
 


Commit: 90298b00d359ac3895a93a32813a95fea4e3efab
    https://github.com/scummvm/scummvm/commit/90298b00d359ac3895a93a32813a95fea4e3efab
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix indentation in dialog system

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/prebuilt_dialogs.cpp
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 7cbf0cb..0edec40 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -27,216 +27,215 @@ namespace MacVenture {
 
 
 Dialog::Dialog(Gui *gui, Common::Point pos, uint width, uint height) :
-  _gui(gui), _bounds(Common::Rect(pos.x, pos.y, pos.x + width, pos.y + height)) {}
+	_gui(gui), _bounds(Common::Rect(pos.x, pos.y, pos.x + width, pos.y + height)) {}
 
 Dialog::Dialog(Gui *gui, PrebuiltDialogs prebuilt) {
-  _gui = gui;
-  const PrebuiltDialog &dialog = prebuiltDialogs[prebuilt];
-  _bounds = dialog.bounds;
-  for (int i = 0; dialog.elements[i].type != kDEEnd; i++) {
-    addPrebuiltElement(dialog.elements[i]);
-  }
+	_gui = gui;
+	const PrebuiltDialog &dialog = prebuiltDialogs[prebuilt];
+	_bounds = dialog.bounds;
+	for (int i = 0; dialog.elements[i].type != kDEEnd; i++) {
+		addPrebuiltElement(dialog.elements[i]);
+	}
 }
 
 Dialog::~Dialog() {
-  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
-    delete *it;
-  }
+	for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+		delete *it;
+	}
 }
 
 void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
 	switch(action) {
- 		case kDACloseDialog:
-			_gui->closeDialog();
-			break;
- 		case kDASubmit:
-			_gui->setTextInput(_userInput);
-			_gui->closeDialog();
-			break;
-		case kDASaveAs:
-			_gui->saveGame();
-			_gui->closeDialog();
-			break;
-		case kDALoadGame:
-			_gui->loadGame();
-			_gui->closeDialog();
-			break;
-		case kDANewGame:
-			_gui->newGame();
-			_gui->closeDialog();
-			break;
-		case kDAQuit:
-			_gui->quitGame();
-			_gui->closeDialog();
-			break;
+		case kDACloseDialog:
+		_gui->closeDialog();
+		break;
+		case kDASubmit:
+		_gui->setTextInput(_userInput);
+		_gui->closeDialog();
+		break;
+	case kDASaveAs:
+		_gui->saveGame();
+		_gui->closeDialog();
+		break;
+	case kDALoadGame:
+		_gui->loadGame();
+		_gui->closeDialog();
+		break;
+	case kDANewGame:
+		_gui->newGame();
+		_gui->closeDialog();
+		break;
+	case kDAQuit:
+		_gui->quitGame();
+		_gui->closeDialog();
+		break;
+	default:
+		break;
   }
 }
 
 const Graphics::Font& Dialog::getFont() {
-  return _gui->getCurrentFont();
+	return _gui->getCurrentFont();
 }
 
 bool Dialog::processEvent(Common::Event event) {
-  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
-    if ((*it)->processEvent(this, event)) return true;
-  }
+	for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+		if ((*it)->processEvent(this, event)) return true;
+	}
 }
 
 void Dialog::addButton(Common::String title, MacVenture::DialogAction action, Common::Point position, uint width, uint height)  {
-  _elements.push_back(new DialogButton(this, title, action, position, width, height));
+	_elements.push_back(new DialogButton(this, title, action, position, width, height));
 }
 
 void Dialog::addText(Common::String content, Common::Point position)  {
-  _elements.push_back(new DialogPlainText(this, content, position));
+	_elements.push_back(new DialogPlainText(this, content, position));
 }
 
 void Dialog::addTextInput(Common::Point position, int width, int height) {
-  _elements.push_back(new DialogTextInput(this, position, width, height));
+	_elements.push_back(new DialogTextInput(this, position, width, height));
 }
 
 void Dialog::draw()  {
-  Graphics::ManagedSurface compose;
-  // Compose the surface
-  compose.create(_bounds.width(), _bounds.height());
-  Common::Rect base(0, 0, _bounds.width(), _bounds.height());
-  compose.fillRect(base, kColorWhite);
-  compose.frameRect(base, kColorBlack);
-  for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
-    (*it)->draw(this, compose);
-  }
-
-  g_system->copyRectToScreen(compose.getPixels(), compose.pitch,
-    _bounds.left, _bounds.top, _bounds.width(), _bounds.height());
-}
+	Graphics::ManagedSurface compose;
+	// Compose the surface
+	compose.create(_bounds.width(), _bounds.height());
+	Common::Rect base(0, 0, _bounds.width(), _bounds.height());
+	compose.fillRect(base, kColorWhite);
+	compose.frameRect(base, kColorBlack);
+	for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
+		(*it)->draw(this, compose);
+	}
+
+	g_system->copyRectToScreen(compose.getPixels(), compose.pitch,
+		_bounds.left, _bounds.top, _bounds.width(), _bounds.height());
+	}
 
 void Dialog::localize(Common::Point &point) {
-  point.x -= _bounds.left;
-  point.y -= _bounds.top;
+	point.x -= _bounds.left;
+	point.y -= _bounds.top;
 }
 
 void Dialog::setUserInput(Common::String content) {
-  _userInput = content;
+	_userInput = content;
 }
 
 void Dialog::addPrebuiltElement(const MacVenture::PrebuiltDialogElement &element) {
-  switch(element.type) {
-    case kDEButton:
-      addButton(element.title, element.action, element.position, element.width, element.height);
-      break;
-    case kDEPlainText:
-      addText(element.title, element.position);
-      break;
-    case kDETextInput:
-      addTextInput(element.position, element.width, element.height);
-      break;
-  }
+	switch(element.type) {
+	case kDEButton:
+		addButton(element.title, element.action, element.position, element.width, element.height);
+		break;
+	case kDEPlainText:
+		addText(element.title, element.position);
+		break;
+	case kDETextInput:
+		addTextInput(element.position, element.width, element.height);
+		break;
+	default:
+		break;
+	}
 }
 
 // Dialog Element
 
 DialogElement::DialogElement(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width, uint height) :
-  _text(title), _action(action) {
-    if (width == 0) {
-      width = dialog->getFont().getStringWidth(title);
-    }
-    if (height == 0) {
-      height = dialog->getFont().getFontHeight();
-    }
-    _bounds = Common::Rect(position.x, position.y, position.x + width, position.y + height);
-  }
+	_text(title), _action(action) {
+	if (width == 0) {
+		width = dialog->getFont().getStringWidth(title);
+	}
+	if (height == 0) {
+		height = dialog->getFont().getFontHeight();
+	}
+	_bounds = Common::Rect(position.x, position.y, position.x + width, position.y + height);
+}
 
 bool DialogElement::processEvent(MacVenture::Dialog *dialog, Common::Event event)  {
-  return doProcessEvent(dialog, event);
+	return doProcessEvent(dialog, event);
 }
 
 void DialogElement::draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
-  doDraw(dialog, target);
+	doDraw(dialog, target);
 }
 
 const Common::String& DialogElement::getText() {
-  return doGetText();
+	return doGetText();
 }
 
 const Common::String& DialogElement::doGetText() {
-  return _text;
+	return _text;
 }
 
 // CONCRETE DIALOG ELEMENTS
 
 DialogButton::DialogButton(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width, uint height):
-  DialogElement(dialog, title, action, position, width, height) {}
+	DialogElement(dialog, title, action, position, width, height) {}
 
 bool DialogButton::doProcessEvent(MacVenture::Dialog *dialog, Common::Event event) {
-  Common::Point mouse = event.mouse;
-  if (event.type == Common::EVENT_LBUTTONDOWN) {
-    dialog->localize(mouse);
-    if (_bounds.contains(mouse)) {
-      debugC(1, kMVDebugGUI, "Click! Button: %s", _text.c_str());
-      dialog->handleDialogAction(this, _action);
-      return true;
-    }
-  }
-  return false;
+	Common::Point mouse = event.mouse;
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
+		dialog->localize(mouse);
+		if (_bounds.contains(mouse)) {
+			debugC(1, kMVDebugGUI, "Click! Button: %s", _text.c_str());
+			dialog->handleDialogAction(this, _action);
+			return true;
+		}
+ 	}
+ 	return false;
 }
 
 void DialogButton::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
-  target.fillRect(_bounds, kColorWhite);
-  target.frameRect(_bounds, kColorBlack);
-  // Draw title
-  dialog->getFont().drawString(
-    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
+	target.fillRect(_bounds, kColorWhite);
+	target.frameRect(_bounds, kColorBlack);
+	// Draw title
+	dialog->getFont().drawString(
+		&target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
 }
 
 DialogPlainText::DialogPlainText(Dialog *dialog, Common::String content, Common::Point position) :
-  DialogElement(dialog, content, kDANone, position, 0, 0) { }
+	DialogElement(dialog, content, kDANone, position, 0, 0) { }
 
 DialogPlainText::~DialogPlainText() {}
 
 bool DialogPlainText::doProcessEvent(MacVenture::Dialog *dialog, Common::Event event) {
-  return false;
+	return false;
 }
 
 void DialogPlainText::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
-  // Draw contents
-  dialog->getFont().drawString(
-    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
+	// Draw contents
+	dialog->getFont().drawString(
+		&target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack, Graphics::kTextAlignCenter);
 
 }
 
 DialogTextInput::DialogTextInput(Dialog *dialog, Common::Point position, uint width, uint height) :
-  DialogElement(dialog, "", kDANone, position, width, height) {}
+	DialogElement(dialog, "", kDANone, position, width, height) {}
 DialogTextInput::~DialogTextInput() {}
 
 bool DialogTextInput::doProcessEvent(Dialog *dialog, Common::Event event) {
-  if (event.type == Common::EVENT_KEYDOWN) {
-    switch (event.kbd.keycode) {
-			case Common::KEYCODE_BACKSPACE:
-				if (!_text.empty()) {
-					_text.deleteLastChar();
-          dialog->setUserInput(_text);
-          return true;
-				}
-				break;
-
-			default:
-				if (event.kbd.ascii >= 0x20 && event.kbd.ascii <= 0x7f) {
-					_text += (char)event.kbd.ascii;
-          dialog->setUserInput(_text);
-          return true;
-				}
-
-				break;
+	if (event.type == Common::EVENT_KEYDOWN) {
+		switch (event.kbd.keycode) {
+		case Common::KEYCODE_BACKSPACE:
+			if (!_text.empty()) {
+				_text.deleteLastChar();
+				dialog->setUserInput(_text);
+      			return true;
+			}
+			break;
+		default:
+			if (event.kbd.ascii >= 0x20 && event.kbd.ascii <= 0x7f) {
+				_text += (char)event.kbd.ascii;
+				dialog->setUserInput(_text);
+				return true;
+			}
+			break;
     }
   }
   return false;
 }
+
 void DialogTextInput::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
-  target.fillRect(_bounds, kColorWhite);
-  target.frameRect(_bounds, kColorBlack);
-  dialog->getFont().drawString(
-    &target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
+	target.fillRect(_bounds, kColorWhite);
+	target.frameRect(_bounds, kColorBlack);
+	dialog->getFont().drawString(&target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
 }
-
-
-
 } // End of namespace MacVenture
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index a01011f..2ea38b1 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -35,85 +35,86 @@ class Gui;
 class DialogElement;
 extern PrebuiltDialog prebuiltDialogs[];
 
-
 class Dialog {
 public:
 	Dialog(Gui *gui, Common::Point pos, uint width, uint height);
- 	Dialog(Gui *gui, PrebuiltDialogs prebuilt);
+	Dialog(Gui *gui, PrebuiltDialogs prebuilt);
 
 	~Dialog();
 
-  bool processEvent(Common::Event event);
-  void draw();
-  void localize(Common::Point &point);
-  void handleDialogAction(DialogElement *trigger, DialogAction action);
+	bool processEvent(Common::Event event);
+	void draw();
+	void localize(Common::Point &point);
+	void handleDialogAction(DialogElement *trigger, DialogAction action);
 
-  const Graphics::Font& getFont();
+	const Graphics::Font& getFont();
 
-  void addButton(Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
-  void addText(Common::String content, Common::Point position);
-  void addTextInput(Common::Point position, int width, int height);
+	void addButton(Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+	void addText(Common::String content, Common::Point position);
+	void addTextInput(Common::Point position, int width, int height);
 
-  void setUserInput(Common::String content);
+	void setUserInput(Common::String content);
 
 private:
-  void addPrebuiltElement(const PrebuiltDialogElement &element);
+	void addPrebuiltElement(const PrebuiltDialogElement &element);
 
 private:
-  Gui *_gui;
+	Gui *_gui;
 
-  Common::String _userInput;
-  Common::Array<DialogElement*> _elements;
-  Common::Rect _bounds;
+	Common::String _userInput;
+	Common::Array<DialogElement*> _elements;
+	Common::Rect _bounds;
 };
 
 class DialogElement {
 public:
-  DialogElement(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
-  virtual ~DialogElement() {}
+	DialogElement(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+	virtual ~DialogElement() {}
 
-  bool processEvent(Dialog *dialog, Common::Event event);
-  void draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
-  const Common::String& getText();
+	bool processEvent(Dialog *dialog, Common::Event event);
+	void draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+	const Common::String& getText();
 
 private:
-  virtual bool doProcessEvent(Dialog *dialog, Common::Event event) = 0;
-  virtual void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) = 0;
-  virtual const Common::String& doGetText();
+	virtual bool doProcessEvent(Dialog *dialog, Common::Event event) = 0;
+	virtual void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) = 0;
+	virtual const Common::String& doGetText();
 
 protected:
-  Common::String _text;
-  Common::Rect _bounds;
-  DialogAction _action;
+	Common::String _text;
+	Common::Rect _bounds;
+	DialogAction _action;
 };
 
 // Dialog elements
 class DialogButton : public DialogElement {
 public:
-  DialogButton(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
-  ~DialogButton() {}
+	DialogButton(Dialog *dialog, Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
+	~DialogButton() {}
 
 private:
-  bool doProcessEvent(Dialog *dialog, Common::Event event);
-  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+	bool doProcessEvent(Dialog *dialog, Common::Event event);
+	void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
 };
 
 class DialogPlainText : public DialogElement {
 public:
-  DialogPlainText(Dialog *dialog, Common::String content, Common::Point position);
-  ~DialogPlainText();
+	DialogPlainText(Dialog *dialog, Common::String content, Common::Point position);
+	~DialogPlainText();
+
 private:
-  bool doProcessEvent(Dialog *dialog, Common::Event event);
-  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+	bool doProcessEvent(Dialog *dialog, Common::Event event);
+	void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
 };
 
 class DialogTextInput : public DialogElement {
 public:
-  DialogTextInput(Dialog *dialog, Common::Point position, uint width, uint height);
-  ~DialogTextInput();
+	DialogTextInput(Dialog *dialog, Common::Point position, uint width, uint height);
+	~DialogTextInput();
+
 private:
-  bool doProcessEvent(Dialog *dialog, Common::Event event);
-  void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
+	bool doProcessEvent(Dialog *dialog, Common::Event event);
+	void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
 };
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index 945808b..bb9ea65 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -26,40 +26,39 @@ namespace MacVenture {
 
 PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
 
-  {/* kSaveAsDialog */
-    Common::Rect(0, 146, 456, 254),
-    {
-      {kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
-      {kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
-      {kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
-      {kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-  },
+	{/* kSaveAsDialog */
+		Common::Rect(0, 146, 456, 254),
+		{
+			{kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
+			{kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
+			{kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
+			{kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
+			{kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
+			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+		}
+	},
 
-  { /* kSpeakDialog */
-    Common::Rect(20, 92, 400, 200),
-    {
-      {kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
-      {kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
-      {kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
-      {kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
-      {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-    }
-},
-
-  { /* kWinGameDialog */
-	  Common::Rect(20, 100, 400, 200),
-	  {
-		  {kDEPlainText, "You Won!", kDANone, Common::Point(10, 10), 400, 20},
-		  {kDEPlainText, "What do you want to do?", kDANone, Common::Point(10, 30), 400, 20},
-		  {kDEButton, "New Game", kDANewGame, Common::Point(40, 30), 50, 20},
-		  {kDEButton, "Load", kDALoadGame, Common::Point(100, 30), 50, 20},
-		  {kDEButton, "Quit", kDAQuit, Common::Point(160, 30), 50, 20},
-		  {kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
-	  }
-  }
+	{ /* kSpeakDialog */
+		Common::Rect(20, 92, 400, 200),
+		{
+			{kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
+			{kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
+			{kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
+			{kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
+			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+		}
+	},
 
+	{ /* kWinGameDialog */
+		Common::Rect(20, 100, 400, 200),
+		{
+			{kDEPlainText, "You Won!", kDANone, Common::Point(10, 10), 400, 20},
+			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(10, 30), 400, 20},
+			{kDEButton, "New Game", kDANewGame, Common::Point(40, 30), 50, 20},
+			{kDEButton, "Load", kDALoadGame, Common::Point(100, 30), 50, 20},
+			{kDEButton, "Quit", kDAQuit, Common::Point(160, 30), 50, 20},
+			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+		}
+	}
 };
 } // End of namespace MacVenture
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 5deda1b..4c6f386 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -28,47 +28,47 @@
 namespace MacVenture {
 
 enum DialogAction {
-  kDANone,
-  kDACloseDialog,
-  kDASubmit,
-  kDASaveAs,
-  kDALoadGame,
-  kDAQuit,
-  kDANewGame
+	kDANone,
+	kDACloseDialog,
+	kDASubmit,
+	kDASaveAs,
+	kDALoadGame,
+	kDAQuit,
+	kDANewGame
 };
 
 enum PrebuiltDialogs {
-  kSaveAsDialog = 0, //TODO: Currently unused, we are using ScummVM dialogs instead.
-  kSpeakDialog = 1,
-  kWinGameDialog = 2,
-  kPrebuiltDialogCount
+	kSaveAsDialog = 0, //TODO: Currently unused, we are using ScummVM dialogs instead.
+	kSpeakDialog = 1,
+	kWinGameDialog = 2,
+	kPrebuiltDialogCount
 };
 
 enum PrebuiltElementType {
-  kDEPlainText,
-  kDEButton,
-  kDETextInput,
-  kDEEnd
+	kDEPlainText,
+	kDEButton,
+	kDETextInput,
+	kDEEnd
 };
 
 struct PrebuiltDialogElement {
-  PrebuiltElementType type;
-  Common::String title;
-  DialogAction action;
-  Common::Point position;
-  uint width;
-  uint height;
+	PrebuiltElementType type;
+	Common::String title;
+	DialogAction action;
+	Common::Point position;
+	uint width;
+	uint height;
 };
 
 // Prebuilt dialogs
 enum {
-  // HACK
-  kMaxPrebuiltDialogElements = 10
+	// HACK
+	kMaxPrebuiltDialogElements = 10
 };
 
 struct PrebuiltDialog {
-  Common::Rect bounds;
-  PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
+	Common::Rect bounds;
+	PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
 };
 } // End of namespace MacVenture
 


Commit: c8a2b0afe29da6daab4f448f1eb0acc108cdf8ae
    https://github.com/scummvm/scummvm/commit/c8a2b0afe29da6daab4f448f1eb0acc108cdf8ae
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:15+02:00

Commit Message:
MACVENTURE: Fix engine mause in dialog

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6c8122d..2c2e4b5 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -876,7 +876,7 @@ void Gui::saveGame() {
 }
 
 void Gui::newGame() {
-	warning("New Game not implemented!");
+	_engine->newGame();
 }
 
 void Gui::quitGame() {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index a1b2387..b3b3463 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -182,9 +182,9 @@ Common::Error MacVentureEngine::run() {
 	while (_gameState != kGameStateQuitting) {
 		processEvents();
 
-		if (_gameState != kGameStateQuitting) {
+		if (_gameState != kGameStateQuitting && !_gui->isDialogOpen()) {
 
-			if (_prepared && !_gui->isDialogOpen()) {
+			if (_prepared) {
 				_prepared = false;
 
 				if (!_halted)
@@ -207,16 +207,20 @@ Common::Error MacVentureEngine::run() {
 					endGame();
 				}
 			}
-			_gui->draw();
-
-			g_system->updateScreen();
-			g_system->delayMillis(50);
 		}
+		_gui->draw();
+
+		g_system->updateScreen();
+		g_system->delayMillis(50);
 	}
 
 	return Common::kNoError;
 }
 
+void MacVentureEngine::newGame() {
+	warning("New Game not implemented!");
+}
+
 void MacVentureEngine::reset() {
 	resetInternals();
 	resetGui();
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index e9d4e12..576fd9b 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -184,6 +184,7 @@ public:
 	bool canSaveGameStateCurrently();
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
+	void newGame();
 
 	void initDebugChannels();
 


Commit: 1d5b7a6e19377c0b279c337ef4ca60749b31f6c9
    https://github.com/scummvm/scummvm/commit/1d5b7a6e19377c0b279c337ef4ca60749b31f6c9
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Refactor world to extract new game method

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/world.cpp
    engines/macventure/world.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b3b3463..37e1472 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -304,7 +304,7 @@ void MacVentureEngine::winGame() {
 void MacVentureEngine::loseGame() {
 	_gui->showPrebuiltDialog(kWinGameDialog);
 	_paused = true;
-	_gameState = kGameStateLosing;
+	//_gameState = kGameStateLosing;
 }
 
 void MacVentureEngine::clickToContinue() {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 012e872..2c9b55c 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -8,25 +8,17 @@ namespace MacVenture {
 World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_resourceManager = resMan;
 	_engine = engine;
+	_saveGame = NULL;
 
-	if ((_startGameFileName = _engine->getStartGameFileName()) == "")
-		error("Could not load initial game configuration");
 
-	Common::File saveGameFile;
-	if (!saveGameFile.open(_startGameFileName))
-		error("Could not load initial game configuration");
+	startNewGame();
 
-	debug("Loading save game state from %s", _startGameFileName.c_str());
-	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
+	//_--------------------
 
-	_saveGame = new SaveGame(_engine, saveGameRes);
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID));
 	calculateObjectRelations();
 
 	_gameText = new Container(_engine->getFilePath(kTextPathID));
-
-	delete saveGameRes;
-	saveGameFile.close();
 }
 
 
@@ -39,6 +31,25 @@ World::~World()	{
 		delete _objectConstants;
 }
 
+void World::startNewGame() {
+	if (_saveGame)
+		delete _saveGame;
+
+	if ((_startGameFileName = _engine->getStartGameFileName()) == "")
+		error("Could not load initial game configuration");
+
+	Common::File saveGameFile;
+	if (!saveGameFile.open(_startGameFileName))
+		error("Could not load initial game configuration");
+
+	debug("Loading save game state from %s", _startGameFileName.c_str());
+	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
+
+	_saveGame = new SaveGame(_engine, saveGameRes);
+
+	delete saveGameRes;
+	saveGameFile.close();
+}
 
 uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	uint res;
diff --git a/engines/macventure/world.h b/engines/macventure/world.h
index f3933c5..e78ab7f 100644
--- a/engines/macventure/world.h
+++ b/engines/macventure/world.h
@@ -92,6 +92,8 @@ public:
 	World(MacVentureEngine *engine, Common::MacResManager *resMan);
 	~World();
 
+	void startNewGame();
+
 	void setObjAttr(ObjID objID, uint32 attrID, Attribute value);
 	void setGlobal(uint32 attrID, Attribute value);
 	void updateObj(ObjID objID);


Commit: 0cd9e876297872269d83f38e93e6525dd4efd8e5
    https://github.com/scummvm/scummvm/commit/0cd9e876297872269d83f38e93e6525dd4efd8e5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Add 'new game' functionality

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 37e1472..0a27bab 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -153,15 +153,7 @@ Common::Error MacVentureEngine::run() {
 
 	_soundManager = new SoundManager(this, _mixer);
 
-	_paused = false;
-	_halted = false;
-	_cmdReady = false;
-	_haltedAtEnd = false;
-	_haltedInSelection = false;
-	_clickToContinue = true;
-	_gameState = kGameStateInit;
-	_destObject = 0;
-	_prepared = true;
+	setInitialFlags();
 
 	int directSaveSlotLoading = ConfMan.getInt("save_slot");
 	if (directSaveSlotLoading >= 0) {
@@ -169,10 +161,7 @@ Common::Error MacVentureEngine::run() {
 			error("Could not load game from slot '%d'", directSaveSlotLoading);
 		}
 	} else {
-		_cmdReady = true;
-		ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
-		_currentSelection.push_back(playerParent);// Push the parent of the player
-		_world->setObjAttr(playerParent, kAttrContainerOpen, 1);
+		setNewGameState();
 	}
 	_selectedControl = kStartOrResume;
 
@@ -208,17 +197,42 @@ Common::Error MacVentureEngine::run() {
 				}
 			}
 		}
-		_gui->draw();
-
-		g_system->updateScreen();
-		g_system->delayMillis(50);
+		refreshScreen();
 	}
 
 	return Common::kNoError;
 }
 
+void MacVentureEngine::refreshScreen() {
+	_gui->draw();
+	g_system->updateScreen();
+	g_system->delayMillis(50);
+}
+
 void MacVentureEngine::newGame() {
-	warning("New Game not implemented!");
+	_world->startNewGame();
+	reset();
+	setInitialFlags();
+	setNewGameState();
+}
+
+void MacVentureEngine::setInitialFlags() {
+	_paused = false;
+	_halted = false;
+	_cmdReady = false;
+	_haltedAtEnd = false;
+	_haltedInSelection = false;
+	_clickToContinue = true;
+	_gameState = kGameStateInit;
+	_destObject = 0;
+	_prepared = true;
+}
+
+void MacVentureEngine::setNewGameState() {
+	_cmdReady = true;
+	ObjID playerParent = _world->getObjAttr(1, kAttrParentObject);
+	_currentSelection.push_back(playerParent);// Push the parent of the player
+	_world->setObjAttr(playerParent, kAttrContainerOpen, 1);
 }
 
 void MacVentureEngine::reset() {
@@ -241,6 +255,7 @@ void MacVentureEngine::resetGui() {
 	_gui->updateWindowInfo(kInventoryStart, 1, _world->getChildren(1, true));
 	updateControls();
 	updateExits();
+	refreshScreen();
 }
 
 void MacVentureEngine::requestQuit() {
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 576fd9b..3f0ce0c 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -185,17 +185,19 @@ public:
 	virtual Common::Error loadGameState(int slot);
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 	void newGame();
+	void setInitialFlags();
+	void setNewGameState();
 
 	void initDebugChannels();
+	void reset();
+	void resetInternals();
+	void resetGui();
+	void refreshScreen();
 
 	// datafiles.cpp
 	void loadDataBundle();
 	Common::SeekableReadStream *getBorderFile(MVWindowType windowType, bool isActive);
 
-	void reset();
-	void resetInternals();
-	void resetGui();
-
 	void requestQuit();
 	void requestUnpause();
 	void selectControl(ControlAction action);
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 2c9b55c..82a8952 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -10,11 +10,8 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_engine = engine;
 	_saveGame = NULL;
 
-
 	startNewGame();
 
-	//_--------------------
-
 	_objectConstants = new Container(_engine->getFilePath(kObjectPathID));
 	calculateObjectRelations();
 
@@ -47,6 +44,8 @@ void World::startNewGame() {
 
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
+	calculateObjectRelations();
+	
 	delete saveGameRes;
 	saveGameFile.close();
 }


Commit: 02138548aeb91ee6d435dc71763c74bfed125121
    https://github.com/scummvm/scummvm/commit/02138548aeb91ee6d435dc71763c74bfed125121
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Fix win game dialog

Changed paths:
    engines/macventure/prebuilt_dialogs.cpp



diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index bb9ea65..76d2c15 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -50,13 +50,13 @@ PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
 	},
 
 	{ /* kWinGameDialog */
-		Common::Rect(20, 100, 400, 200),
+		Common::Rect(20, 100, 320, 200),
 		{
-			{kDEPlainText, "You Won!", kDANone, Common::Point(10, 10), 400, 20},
-			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(10, 30), 400, 20},
-			{kDEButton, "New Game", kDANewGame, Common::Point(40, 30), 50, 20},
-			{kDEButton, "Load", kDALoadGame, Common::Point(100, 30), 50, 20},
-			{kDEButton, "Quit", kDAQuit, Common::Point(160, 30), 50, 20},
+			{kDEPlainText, "You Won!", kDANone, Common::Point(20, 16), 280, 20},
+			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(20, 30), 280, 20},
+			{kDEButton, "New Game", kDANewGame, Common::Point(20, 60), 70, 20},
+			{kDEButton, "Load", kDALoadGame, Common::Point(110, 60), 70, 20},
+			{kDEButton, "Quit", kDAQuit, Common::Point(200, 60), 70, 20},
 			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
 		}
 	}


Commit: e886f2c6e170ae2af96371c5c3e035cef8a05827
    https://github.com/scummvm/scummvm/commit/e886f2c6e170ae2af96371c5c3e035cef8a05827
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Add lose game dialog

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/prebuilt_dialogs.cpp
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 0a27bab..a18bdcf 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -317,7 +317,7 @@ void MacVentureEngine::winGame() {
 }
 
 void MacVentureEngine::loseGame() {
-	_gui->showPrebuiltDialog(kWinGameDialog);
+	_gui->showPrebuiltDialog(kLoseGameDialog);
 	_paused = true;
 	//_gameState = kGameStateLosing;
 }
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index 76d2c15..46b71ab 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -59,6 +59,18 @@ PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
 			{kDEButton, "Quit", kDAQuit, Common::Point(200, 60), 70, 20},
 			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
 		}
+	},
+
+	{ /* kLoseGameDialog */
+		Common::Rect(20, 100, 320, 200),
+		{
+			{kDEPlainText, "You Died", kDANone, Common::Point(20, 16), 280, 20},
+			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(20, 30), 280, 20},
+			{kDEButton, "New Game", kDANewGame, Common::Point(20, 60), 70, 20},
+			{kDEButton, "Load", kDALoadGame, Common::Point(110, 60), 70, 20},
+			{kDEButton, "Quit", kDAQuit, Common::Point(200, 60), 70, 20},
+			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+		}
 	}
 };
 } // End of namespace MacVenture
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 4c6f386..1c97847 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -41,6 +41,7 @@ enum PrebuiltDialogs {
 	kSaveAsDialog = 0, //TODO: Currently unused, we are using ScummVM dialogs instead.
 	kSpeakDialog = 1,
 	kWinGameDialog = 2,
+	kLoseGameDialog = 3,
 	kPrebuiltDialogCount
 };
 


Commit: 896e08cde8cd13d0ba3c4c7df253d4619e3b5933
    https://github.com/scummvm/scummvm/commit/896e08cde8cd13d0ba3c4c7df253d4619e3b5933
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Add proper flags to gui debug rects

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 2c2e4b5..5638136 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -22,6 +22,8 @@
 
 #include "common/file.h"
 #include "common/system.h"
+#include "common/debug-channels.h"
+#include "common/debug.h"
 #include "image/bmp.h"
 
 #include "macventure/gui.h"
@@ -29,8 +31,6 @@
 
 namespace MacVenture {
 
-#define MACVENTURE_DEBUG_GUI true
-
 enum MenuAction;
 
 enum {
@@ -567,7 +567,7 @@ void Gui::drawMainGameWindow() {
 
 	drawObjectsInWindow(data, _mainGameWindow->getSurface());
 
-	if (MACVENTURE_DEBUG_GUI) {
+	if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
 		Graphics::MacWindow *win = findWindow(data.refcon);
 		Common::Rect innerDims  = win->getInnerDimensions();
 		int x = win->getDimensions().left;
@@ -597,7 +597,7 @@ void Gui::drawInventories() {
 		srf->fillRect(srf->getBounds(), kColorWhite);
 		drawObjectsInWindow(data, srf);
 
-		if (MACVENTURE_DEBUG_GUI) {
+		if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
 			Graphics::MacWindow *win = findWindow(data.refcon);
 			Common::Rect innerDims  = win->getInnerDimensions();
 			int x = win->getDimensions().left;
@@ -676,8 +676,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 			}
 		}
 
-		// For test
-		if (MACVENTURE_DEBUG_GUI) {
+		if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
 			Common::Rect testBounds = _engine->getObjBounds(child);
 			testBounds.translate(-targetData.scrollPos.x, -targetData.scrollPos.y);
 			surface->frameRect(testBounds, kColorGreen);


Commit: 1bb3d1412918be5faa0f1994beb6afaddf3b768a
    https://github.com/scummvm/scummvm/commit/1bb3d1412918be5faa0f1994beb6afaddf3b768a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Unify NULLs

Changed paths:
    engines/macventure/controls.cpp
    engines/macventure/datafiles.cpp
    engines/macventure/gui.cpp
    engines/macventure/sound.cpp



diff --git a/engines/macventure/controls.cpp b/engines/macventure/controls.cpp
index 26807a3..898ddac 100644
--- a/engines/macventure/controls.cpp
+++ b/engines/macventure/controls.cpp
@@ -24,7 +24,7 @@
 
 namespace MacVenture {
 CommandButton::CommandButton() {
-	_gui = nullptr;
+	_gui = NULL;
 }
 
 CommandButton::CommandButton(ControlData data, Gui *g) {
diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index 77ecaee..496fa91 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -74,7 +74,7 @@ Common::SeekableReadStream *MacVentureEngine::getBorderFile(MVWindowType windowT
 	filename += (isActive ? "_act.bmp" : "_inac.bmp");
 	if (!_dataBundle->hasFile(filename)) {
 		warning("Missing border file '%s' in data bundle", filename.c_str());
-		return nullptr;
+		return NULL;
 	}
 
 	return _dataBundle->createReadStreamForMember(filename);
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 5638136..65b11ee 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -103,11 +103,11 @@ void menuCommandsCallback(int action, Common::String &text, void *data);
 Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_engine = engine;
 	_resourceManager = resman;
-	_windowData = nullptr;
-	_controlData = nullptr;
+	_windowData = NULL;
+	_controlData = NULL;
 	_draggedObj.id = 0;
 	_draggedObj.pos = Common::Point(0, 0);
-	_dialog = nullptr;
+	_dialog = NULL;
 
 	_cursor = new Cursor(this);
 
@@ -846,7 +846,7 @@ void Gui::showPrebuiltDialog(PrebuiltDialogs type) {
 }
 
 bool Gui::isDialogOpen() {
-	return _dialog != nullptr;
+	return _dialog != NULL;
 }
 
 void Gui::setTextInput(Common::String str) {
@@ -856,7 +856,7 @@ void Gui::setTextInput(Common::String str) {
 
 void Gui::closeDialog() {
 	delete _dialog;
-	_dialog = nullptr;
+	_dialog = NULL;
 }
 
 void Gui::getTextFromUser() {
@@ -950,7 +950,7 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	}
 	switch (reference) {
 	case MacVenture::kNoWindow:
-		return nullptr;
+		return NULL;
 	case MacVenture::kCommandsWindow:
 		return _controlsWindow;
 	case MacVenture::kMainGameWindow:
@@ -964,7 +964,7 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 	case MacVenture::kDiplomaWindow:
 		return _diplomaWindow;
 	}
-	return nullptr;
+	return NULL;
 }
 
 void Gui::ensureInventoryOpen(WindowReference reference, ObjID id) {
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index f05c88f..455a191 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -30,7 +30,7 @@ namespace MacVenture {
 
 // SoundManager
 SoundManager::SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer) {
-	_container = nullptr;
+	_container = NULL;
 	Common::String filename = engine->getFilePath(kSoundPathID);
 	_container = new Container(filename);
 	_mixer = mixer;


Commit: 4e3daab04f8243f4672d723b51948d8700e74847
    https://github.com/scummvm/scummvm/commit/4e3daab04f8243f4672d723b51948d8700e74847
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Minor refactorings

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index a18bdcf..1ef657f 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -334,7 +334,9 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
 		return;
 	}
 
-	if (type == kUpdateWindow) { obj.target = target; }
+	if (type == kUpdateWindow) {
+		obj.target = target;
+	}
 
 	if (type != kHightlightExits) {
 		obj.object = objID;
@@ -350,14 +352,6 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
 	_objQueue.push_back(obj);
 }
 
-bool MacVentureEngine::isObjEnqueued(ObjID objID) {
-	Common::Array<QueuedObject>::const_iterator it;
-	for (it = _objQueue.begin(); it != _objQueue.end(); it++) {
-		if ((*it).object == objID) return true;
-	}
-	return false;
-}
-
 void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text) {
 	QueuedText newText;
 	newText.id = type;
@@ -403,28 +397,26 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 				//}
 			}
 			if (objID > 0) {
-				int i = findObjectInArray(objID, _currentSelection);
+				int currentObjectIndex = findObjectInArray(objID, _currentSelection);
+
+				if (currentObjectIndex >= 0)
+					unselectAll();
 
 				if (isDoubleClick) {
-					if (i >= 0)
-						unselectAll();
 					selectObject(objID);
 					_destObject = objID;
-					_deltaPoint = Common::Point(0, 0);
+					setDeltaPoint(Common::Point(0, 0));
 					if (!_cmdReady) {
 						selectControl(kActivateObject);
 						_activeControl = kActivateObject;
 						_cmdReady = true;
 					}
-					preparedToRun();
 				} else {
-					if (i >= 0)
-						unselectAll();
 					selectObject(objID);
 					if (getInvolvedObjects() == 1)
 						_cmdReady = true;
-					preparedToRun();
 				}
+				preparedToRun();
 			}
 		}
 	}
@@ -432,14 +424,14 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 
 void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent) {
 	_destObject = newParent;
-	updateDelta(delta);
+	setDeltaPoint(delta);
 	selectControl(kMoveObject);
 	activateCommand(kMoveObject);
 	refreshReady();
 	preparedToRun();
 }
 
-void MacVentureEngine::updateDelta(Common::Point newPos) {
+void MacVentureEngine::setDeltaPoint(Common::Point newPos) {
 	debugC(4, kMVDebugMain, "Update delta: Old(%d, %d), New(%d, %d)",
 		_deltaPoint.x, _deltaPoint.y,
 		newPos.x, newPos.y);
@@ -489,7 +481,7 @@ Common::String MacVentureEngine::getStartGameFileName() {
 	Common::String result = Common::String(fileName, length);
 	// HACK, see definition of toASCII
 	toASCII(result);
-  return result;
+	return result;
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
@@ -537,7 +529,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 	while (!_currentSelection.empty()) {
 		ObjID obj = _currentSelection.front();
 		_currentSelection.remove_at(0);
-		if ((_gameState == kGameStateInit || _gameState == kGameStatePlaying) && _world->isObjActive(obj)) {
+		if (isGameRunning() && _world->isObjActive(obj)) {
 			if (_scriptEngine->runControl(_selectedControl, obj, _destObject, _deltaPoint)) {
 				_haltedInSelection = true;
 				return true;
@@ -548,7 +540,7 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 	if (_selectedControl == 1)
 		_gameChanged = false;
 
-	else if (_gameState == kGameStateInit || _gameState == kGameStatePlaying) {
+	else if (isGameRunning()) {
 		if (_scriptEngine->runControl(kTick, _selectedControl, _destObject, _deltaPoint)) {
 			_haltedAtEnd = true;
 			return true;
@@ -675,7 +667,7 @@ void MacVentureEngine::resetVars() {
 	_activeControl = kNoCommand;
 	_currentSelection.clear();
 	_destObject = 0;
-	_deltaPoint = Common::Point(0, 0);
+	setDeltaPoint(Common::Point(0, 0));
 	_cmdReady = false;
 }
 
@@ -918,6 +910,18 @@ void MacVentureEngine::zoomObject(ObjID objID) {
 	warning("zoomObject: unimplemented");
 }
 
+bool MacVentureEngine::isObjEnqueued(ObjID objID) {
+	Common::Array<QueuedObject>::const_iterator it;
+	for (it = _objQueue.begin(); it != _objQueue.end(); it++) {
+		if ((*it).object == objID) return true;
+	}
+	return false;
+}
+
+bool MacVentureEngine::isGameRunning() {
+	return (_gameState == kGameStateInit || _gameState == kGameStatePlaying);
+}
+
 ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlType id) {
 	switch (id) {
 	case MacVenture::kControlExitBox:
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 3f0ce0c..a87af74 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -222,7 +222,7 @@ public:
 
 	void handleObjectSelect(ObjID objID, WindowReference win, bool shiftPressed, bool isDoubleClick);
 	void handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent);
-	void updateDelta(Common::Point newPos);
+	void setDeltaPoint(Common::Point newPos);
 	void focusObjWin(ObjID objID);
 	void updateWindow(WindowReference winID);
 
@@ -296,6 +296,8 @@ private:
 
 	bool isObjEnqueued(ObjID obj);
 
+	bool isGameRunning();
+
 	// Data loading
 	bool loadGlobalSettings();
 	bool loadTextHuffman();


Commit: 580c8136f44b59b48aeb776c0d62ad20ab8c07ef
    https://github.com/scummvm/scummvm/commit/580c8136f44b59b48aeb776c0d62ad20ab8c07ef
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Some more refactoring

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 1ef657f..2eb3115 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -761,18 +761,17 @@ void MacVentureEngine::highlightExit(ObjID objID) {
 void MacVentureEngine::selectPrimaryObject(ObjID objID) {
 	if (objID == _destObject) return;
 	int idx;
+	debugC(5, kMVDebugMain, "Select primary object (%d)", objID);
 	if (_destObject > 0 &&
 		(idx = findObjectInArray(_destObject, _selectedObjs)) != -1 &&
-		findObjectInArray(_destObject, _currentSelection) == -1)
-	{
-		_selectedObjs.remove_at(idx);
-		highlightExit(_destObject);
+		findObjectInArray(_destObject, _currentSelection) == -1) {
+		unselectAll();
 	}
 	_destObject = objID;
 	if (findObjectInArray(_destObject, _selectedObjs) == -1) {
-		_selectedObjs.push_back(_destObject);
-		highlightExit(_destObject);
+		selectObject(_destObject);
 	}
+
 	_cmdReady = true;
 }
 


Commit: 7b9c63b1b919ce042f72b9cd05bde5e84b8edf85
    https://github.com/scummvm/scummvm/commit/7b9c63b1b919ce042f72b9cd05bde5e84b8edf85
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Delete duplicate code

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/script.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 65b11ee..b66e2ee 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1247,7 +1247,7 @@ bool Gui::processEvent(Common::Event &event) {
 bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
 		if (_engine->needsClickToContinue()) {
-			_engine->activateCommand(kClickToContinue);
+			_engine->selectControl(kClickToContinue);
 			return true;
 		}
 
@@ -1271,7 +1271,6 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 		}
 
 		_engine->selectControl(data.getData().refcon);
-		_engine->activateCommand(data.getData().refcon);
 		_engine->refreshReady();
 		_engine->preparedToRun();
 	}
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 2eb3115..48511c9 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -270,21 +270,13 @@ void MacVentureEngine::requestUnpause() {
 
 void MacVentureEngine::selectControl(ControlAction id) {
 	debugC(2, kMVDebugMain, "Select control %x", id);
-	_selectedControl = id;
-}
-
-void MacVentureEngine::activateCommand(ControlAction id) {
 	if (id == kClickToContinue) {
 		_clickToContinue = false;
 		_paused = true;
 		return;
 	}
-	if (id != _activeControl) {
-		if (_activeControl)
-			_activeControl = kNoCommand;
-		_activeControl = id;
-	}
-	debugC(2, kMVDebugMain, "Activating Command %x... Command %x is active", id, _activeControl);
+
+	_selectedControl = id;
 	refreshReady();
 }
 
@@ -408,7 +400,6 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 					setDeltaPoint(Common::Point(0, 0));
 					if (!_cmdReady) {
 						selectControl(kActivateObject);
-						_activeControl = kActivateObject;
 						_cmdReady = true;
 					}
 				} else {
@@ -426,7 +417,6 @@ void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID
 	_destObject = newParent;
 	setDeltaPoint(delta);
 	selectControl(kMoveObject);
-	activateCommand(kMoveObject);
 	refreshReady();
 	preparedToRun();
 }
@@ -655,16 +645,14 @@ void MacVentureEngine::playSounds(bool pause) {
 }
 
 void MacVentureEngine::updateControls() {
-	if (_activeControl)
-		_activeControl = kNoCommand;
+	_selectedControl = kNoCommand;
 	_gui->clearControls();
 	toggleExits();
 	resetVars();
 }
 
 void MacVentureEngine::resetVars() {
-	_selectedControl = kNoCommand;
-	_activeControl = kNoCommand;
+	selectControl(kNoCommand);
 	_currentSelection.clear();
 	_destObject = 0;
 	setDeltaPoint(Common::Point(0, 0));
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index a87af74..72d09a8 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -201,7 +201,6 @@ public:
 	void requestQuit();
 	void requestUnpause();
 	void selectControl(ControlAction action);
-	void activateCommand(ControlAction id);
 	void refreshReady();
 	void preparedToRun();
 	void gameChanged();
@@ -344,7 +343,6 @@ private: // Attributes
 	// Selections
 	ObjID _destObject;
 	ControlAction _selectedControl;
-	ControlAction _activeControl;
 	Common::Array<ObjID> _currentSelection;
 	Common::Array<ObjID> _selectedObjs;
 	Common::Point _deltaPoint;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index d191cef..a051ca8 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -1083,7 +1083,7 @@ void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 }
 
 void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
-	_engine->activateCommand((ControlAction)state->pop());
+	_engine->selectControl((ControlAction)state->pop());
 }
 
 void ScriptEngine::opd7LOSE(EngineState * state, EngineFrame * frame) {


Commit: 8417e6f22deaf026c3c59cfc9175d357c6ec286a
    https://github.com/scummvm/scummvm/commit/8417e6f22deaf026c3c59cfc9175d357c6ec286a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:16+02:00

Commit Message:
MACVENTURE: Delete unnecessary attribute

Changed paths:
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 48511c9..b96a8bf 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -163,7 +163,7 @@ Common::Error MacVentureEngine::run() {
 	} else {
 		setNewGameState();
 	}
-	_selectedControl = kStartOrResume;
+	selectControl(kStartOrResume);
 
 	_gui->addChild(kSelfWindow, 1);
 	_gui->updateWindow(kSelfWindow, false);
@@ -243,7 +243,6 @@ void MacVentureEngine::reset() {
 void MacVentureEngine::resetInternals() {
 	_scriptEngine->reset();
 	_currentSelection.clear();
-	_selectedObjs.clear();
 	_objQueue.clear();
 	_textQueue.clear();
 }
@@ -645,7 +644,7 @@ void MacVentureEngine::playSounds(bool pause) {
 }
 
 void MacVentureEngine::updateControls() {
-	_selectedControl = kNoCommand;
+	selectControl(kNoCommand);
 	_gui->clearControls();
 	toggleExits();
 	resetVars();
@@ -670,20 +669,16 @@ void MacVentureEngine::selectObject(ObjID objID) {
 		if (findParentWindow(objID) != findParentWindow(_currentSelection[0]))
 			unselectAll();
 	}
-	if (findObjectInArray(objID, _currentSelection) == -1)
+	if (findObjectInArray(objID, _currentSelection) == -1) {
 		_currentSelection.push_back(objID);
-	if (findObjectInArray(objID, _selectedObjs) == -1) {
-		_selectedObjs.push_back(objID);
 		highlightExit(objID);
 	}
 }
 
 void MacVentureEngine::unselectObject(ObjID objID) {
 	int idxCur = findObjectInArray(objID, _currentSelection);
-	int idxSel = findObjectInArray(objID, _selectedObjs);
-	if (idxCur != -1) _currentSelection.remove_at(idxCur);
-	if (idxSel != -1) {
-		_selectedObjs.remove_at(idxSel);
+	if (idxCur != -1){
+		_currentSelection.remove_at(idxCur);
 		highlightExit(objID);
 	}
 }
@@ -751,12 +746,11 @@ void MacVentureEngine::selectPrimaryObject(ObjID objID) {
 	int idx;
 	debugC(5, kMVDebugMain, "Select primary object (%d)", objID);
 	if (_destObject > 0 &&
-		(idx = findObjectInArray(_destObject, _selectedObjs)) != -1 &&
-		findObjectInArray(_destObject, _currentSelection) == -1) {
+		(idx = findObjectInArray(_destObject, _currentSelection)) != -1) {
 		unselectAll();
 	}
 	_destObject = objID;
-	if (findObjectInArray(_destObject, _selectedObjs) == -1) {
+	if (findObjectInArray(_destObject, _currentSelection) == -1) {
 		selectObject(_destObject);
 	}
 
@@ -885,9 +879,11 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 }
 
 void MacVentureEngine::toggleExits() {
-	while (!_selectedObjs.empty()) {
-		ObjID obj = _selectedObjs.front();
-		_selectedObjs.remove_at(0);
+	warning("delete this when done testing!");
+	Common::Array<ObjID> exits = _currentSelection;
+	while (!exits.empty()) {
+		ObjID obj = exits.front();
+		exits.remove_at(0);
 		highlightExit(obj);
 		updateWindow(findParentWindow(obj));
 	}
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 72d09a8..e78774d 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -344,7 +344,6 @@ private: // Attributes
 	ObjID _destObject;
 	ControlAction _selectedControl;
 	Common::Array<ObjID> _currentSelection;
-	Common::Array<ObjID> _selectedObjs;
 	Common::Point _deltaPoint;
 	Common::String _userInput;
 


Commit: 479f01b5a708ed1e3294ef1d553d37d270cb97c4
    https://github.com/scummvm/scummvm/commit/479f01b5a708ed1e3294ef1d553d37d270cb97c4
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Implement gui reloading

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index b66e2ee..85f1cdb 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -112,6 +112,7 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
 	_cursor = new Cursor(this);
 
 	_consoleText = new ConsoleText(this);
+	_graphics = NULL;
 
 	initGUI();
 }
@@ -136,10 +137,7 @@ Gui::~Gui() {
 	if (_dialog)
 		delete _dialog;
 
-	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
-	for (; it != _assets.end(); it++) {
-		delete it->_value;
-	}
+	clearAssets();
 }
 
 void Gui::initGUI() {
@@ -169,8 +167,12 @@ void Gui::initGUI() {
 
 }
 
-void Gui::draw() {
+void Gui::reloadInternals() {
+	loadGraphics();
+	clearAssets();
+}
 
+void Gui::draw() {
 	// Will be performance-improved after the milestone
 	_wm.setFullRefresh(true);
 
@@ -352,9 +354,18 @@ void Gui::loadBorder(Graphics::MacWindow * target, MVWindowType type, bool activ
 }
 
 void Gui::loadGraphics() {
+	if (_graphics)
+		delete _graphics;
 	_graphics = new Container(_engine->getFilePath(kGraphicPathID));
 }
 
+void Gui::clearAssets() {
+	Common::HashMap<ObjID, ImageAsset*>::const_iterator it = _assets.begin();
+	for (; it != _assets.end(); it++) {
+		delete it->_value;
+	}
+}
+
 bool Gui::loadMenus() {
 
 	if (kLoadStaticMenus) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 185171f..5835202 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -98,6 +98,8 @@ public:
 	Gui(MacVentureEngine *engine, Common::MacResManager *resman);
 	~Gui();
 
+	void reloadInternals();
+
 	void draw();
 	void drawMenu();
 	void drawTitle();
@@ -211,6 +213,7 @@ private: // Methods
 	void loadBorders(Graphics::MacWindow *target, MVWindowType type);
 	void loadBorder(Graphics::MacWindow *target, MVWindowType type, bool active);
 	void loadGraphics();
+	void clearAssets();
 
 	// Drawers
 	void drawWindows();
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b96a8bf..21fb709 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -248,6 +248,7 @@ void MacVentureEngine::resetInternals() {
 }
 
 void MacVentureEngine::resetGui() {
+	_gui->reloadInternals();
 	_gui->updateWindowInfo(kMainGameWindow, getParent(1), _world->getChildren(getParent(1), true));
 	// HACK! should update all inventories
 	_gui->ensureInventoryOpen(kInventoryStart, 1);


Commit: 44a6f8a1dbdfa271aaa9ccf4b1ecc48e275ca11a
    https://github.com/scummvm/scummvm/commit/44a6f8a1dbdfa271aaa9ccf4b1ecc48e275ca11a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix minor memory leaks

Changed paths:
    engines/macventure/container.h
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/stringtable.h
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 013a11d..1abab1c 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -52,6 +52,12 @@ public:
 		_header = _res->readUint32BE();
 		_simplified = false;
 
+		for (uint i = 0; i < 16; ++i)
+			_huff.push_back(0);
+
+		for (uint i = 0; i < 16; ++i)
+			_lens.push_back(0);
+
 		if (!(_header & 0x80000000)) {
 			// Is simplified container
 			_simplified = true;
@@ -97,7 +103,8 @@ public:
 
 				for (uint j = 0; j < 64; ++j) {
 					uint32 length = 0;
-					uint32 mask = _res->readUint32BE();
+					uint32 mask = 0;
+					mask = _res->readUint32BE();
 					mask >>= (16 - bits);
 					mask &= 0xFFFF;
 					debugC(11, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
@@ -202,8 +209,8 @@ protected:
 
 	ContainerHeader _header;
 
-	uint16 _huff[15];   // huffman masks
-	uint8  _lens[16];   // huffman lengths
+	Common::Array<uint16> _huff;   // huffman masks
+	Common::Array<uint8> _lens;   // huffman lengths
 	Common::Array<ItemGroup> _groups;
 
 	Common::String _filename;
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 85f1cdb..f8f9497 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -138,6 +138,9 @@ Gui::~Gui() {
 		delete _dialog;
 
 	clearAssets();
+
+	if (_graphics)
+		delete _graphics;
 }
 
 void Gui::initGUI() {
@@ -421,6 +424,7 @@ bool Gui::loadMenus() {
 		}
 
 		i++;
+		delete res;
 	}
 
 	return true;
@@ -463,12 +467,15 @@ bool Gui::loadWindows() {
 			res->read(newTitle, data.titleLength);
 			newTitle[data.titleLength] = '\0';
 			data.title = Common::String(newTitle);
+			delete[] newTitle;
 		}
 		data.scrollPos = Common::Point(0, 0);
 
 		debugC(4, kMVDebugGUI, "Window loaded: %s", data.title.c_str());
 
 		_windowData->push_back(data);
+
+		delete res;
 	}
 
 	return true;
@@ -518,7 +525,9 @@ bool Gui::loadControls() {
 		}
 
 
-		i++;
+		_controlData->push_back(CommandButton(data, this));
+
+		delete res;
 	}
 
 	return true;
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index a89eae9..604d9db 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -98,9 +98,12 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 		return;
 	}
 	if (size == 2) {
-		realID = _container->getItem(id)->readUint16BE();
+		Common::SeekableReadStream *newItemStream = _container->getItem(id);
+		realID = newItemStream->readUint16BE();
+		delete newItemStream;
 	}
-	Common::BitStream32BEMSB stream(_container->getItem(realID), true);
+	Common::SeekableReadStream *baseStream = _container->getItem(realID);
+	Common::BitStream32BEMSB stream(baseStream);
 
 	uint8 mode = stream.getBits(3);
 	int w, h;
@@ -133,6 +136,8 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 		decodePPIC3(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
 	}
+
+	delete baseStream;
 }
 
 void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 21fb709..81bb267 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -55,7 +55,9 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 	initDebugChannels();
 
 	_debugger = NULL;
+	_resourceManager = NULL;
 	_gui = NULL;
+	_world = NULL;
 	_scriptEngine = NULL;
 	_filenames = NULL;
 
@@ -82,9 +84,15 @@ MacVentureEngine::~MacVentureEngine() {
 	if (_debugger)
 		delete _debugger;
 
+	if (_resourceManager)
+		delete _resourceManager;
+
 	if (_gui)
 		delete _gui;
 
+	if (_world)
+		delete _world;
+
 	if (_scriptEngine)
 		delete _scriptEngine;
 
@@ -471,6 +479,10 @@ Common::String MacVentureEngine::getStartGameFileName() {
 	Common::String result = Common::String(fileName, length);
 	// HACK, see definition of toASCII
 	toASCII(result);
+
+	delete[] fileName;
+	delete res;
+
 	return result;
 }
 
@@ -1065,11 +1077,11 @@ ControlAction MacVentureEngine::getSelectedControl() {
 
 bool MacVentureEngine::loadGlobalSettings() {
 	Common::MacResIDArray resArray;
-	Common::SeekableReadStream *res;
 
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('G', 'N', 'R', 'L'))).size() == 0)
 		return false;
 
+	Common::SeekableReadStream *res;
 	res = _resourceManager->getResource(MKTAG('G', 'N', 'R', 'L'), kGlobalSettingsID);
 	if (res) {
 		_globalSettings.numObjects = res->readUint16BE();
@@ -1103,9 +1115,9 @@ bool MacVentureEngine::loadGlobalSettings() {
 		_globalSettings.commands = new uint8[_globalSettings.numCommands];
 		res->read(_globalSettings.commands, _globalSettings.numCommands);
 
+		delete res;
 		return true;
 	}
-
 	return false;
 }
 
@@ -1136,6 +1148,12 @@ bool MacVentureEngine::loadTextHuffman() {
 
 		_textHuffman = new HuffmanLists(numEntries, lengths, masks, values);
 		debugC(4, kMVDebugMain, "Text is huffman-encoded");
+
+
+		delete res;
+		delete masks;
+		delete lengths;
+		delete values;
 		return true;
 	}
 	return false;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index a051ca8..5aa8e3c 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -1208,6 +1208,7 @@ void ScriptAsset::loadInstructions() {
 	for (uint i = 0; i < amount; i++) {
 		_instructions.push_back(res->readByte());
 	}
+	delete res;
 	debugC(2, kMVDebugScript, "SCRIPT: Load %d instructions for script %d", amount, _id);
 }
 
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index f05b793..0a5419e 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -90,6 +90,7 @@ private:
 			delete[] str;
 		}
 
+		delete res;
 		return true;
 	}
 
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 74b5685..d15401a 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -117,7 +117,7 @@ void TextAsset::decodeOld() {
 void TextAsset::decodeHuffman() {
 	_decoded = Common::String("");
 	Common::SeekableReadStream *res = _container->getItem(_id);
-	Common::BitStream8MSB stream(res);
+	Common::BitStream8MSB stream(res, true);
 	uint16 strLen = 0;
 	if (stream.getBit()) {
 		strLen = stream.getBits(15);
@@ -174,6 +174,7 @@ void TextAsset::decodeHuffman() {
 		}
 	}
 	_decoded += '\0';
+	delete res;
 	debugC(4, kMVDebugText, "Decoded %d'th string (new): %s", _id, _decoded.c_str());
 }
 Common::String TextAsset::getNoun(ObjID subval) {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 82a8952..708ccfe 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -9,6 +9,7 @@ World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
 	_resourceManager = resMan;
 	_engine = engine;
 	_saveGame = NULL;
+	_gameText = NULL;
 
 	startNewGame();
 
@@ -26,6 +27,9 @@ World::~World()	{
 
 	if (_objectConstants)
 		delete _objectConstants;
+
+	if (_gameText)
+		delete _gameText;
 }
 
 void World::startNewGame() {
@@ -45,7 +49,7 @@ void World::startNewGame() {
 	_saveGame = new SaveGame(_engine, saveGameRes);
 
 	calculateObjectRelations();
-	
+
 	delete saveGameRes;
 	saveGameFile.close();
 }
@@ -70,6 +74,7 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	if (res & 0x8000)
 		res = -((res ^ 0xffff) + 1);
 	debugC(5, kMVDebugMain, "Attribute %x from object %x is %x", attrID, objID, res);
+	delete objStream;
 	return res;
 }
 


Commit: 019f3d4b626f290fa7e2bc6c6be0ab5c43ecd468
    https://github.com/scummvm/scummvm/commit/019f3d4b626f290fa7e2bc6c6be0ab5c43ecd468
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Add wrapper class for global settings

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f8f9497..834ffc1 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -314,14 +314,14 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 
 	if (_windowData->back().refcon < 0x80) { // There is already another inventory window
 		newData.bounds = _windowData->back().bounds; // Inventory windows are always last
-		newData.bounds.translate(newData.bounds.left + settings.invOffsetX, newData.bounds.top + settings.invOffsetY);
+		newData.bounds.translate(newData.bounds.left + settings._invOffsetX, newData.bounds.top + settings._invOffsetY);
 	} else {
 		BorderBounds bbs = borderBounds(kInvWindow);
 		newData.bounds = Common::Rect(
-			settings.invLeft - bbs.leftOffset,
-			settings.invTop - bbs.topOffset,
-			settings.invLeft + settings.invWidth,
-			settings.invTop + settings.invHeight);
+			settings._invLeft - bbs.leftOffset,
+			settings._invTop - bbs.topOffset,
+			settings._invLeft + settings._invWidth,
+			settings._invTop + settings._invHeight);
 	}
 	newData.type = kInvWindow;
 	newData.hasCloseBox = true;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 81bb267..9c601dd 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -56,6 +56,7 @@ MacVentureEngine::MacVentureEngine(OSystem *syst, const ADGameDescription *gameD
 
 	_debugger = NULL;
 	_resourceManager = NULL;
+	_globalSettings = NULL;
 	_gui = NULL;
 	_world = NULL;
 	_scriptEngine = NULL;
@@ -87,6 +88,9 @@ MacVentureEngine::~MacVentureEngine() {
 	if (_resourceManager)
 		delete _resourceManager;
 
+	if (_globalSettings)
+		delete _globalSettings;
+
 	if (_gui)
 		delete _gui;
 
@@ -487,7 +491,7 @@ Common::String MacVentureEngine::getStartGameFileName() {
 }
 
 const GlobalSettings& MacVentureEngine::getGlobalSettings() const {
-	return _globalSettings;
+	return *_globalSettings;
 }
 
 // Private engine methods
@@ -979,7 +983,7 @@ uint32 MacVentureEngine::randBetween(uint32 min, uint32 max) {
 }
 
 uint32 MacVentureEngine::getInvolvedObjects() {
-	return (_selectedControl ? _globalSettings.cmdArgCnts[_selectedControl - 1] : 3000);
+	return (_selectedControl ? getGlobalSettings()._cmdArgCnts[_selectedControl - 1] : 3000);
 }
 
 Common::Point MacVentureEngine::getObjPosition(ObjID objID) {
@@ -1084,37 +1088,8 @@ bool MacVentureEngine::loadGlobalSettings() {
 	Common::SeekableReadStream *res;
 	res = _resourceManager->getResource(MKTAG('G', 'N', 'R', 'L'), kGlobalSettingsID);
 	if (res) {
-		_globalSettings.numObjects = res->readUint16BE();
-		_globalSettings.numGlobals = res->readUint16BE();
-		_globalSettings.numCommands = res->readUint16BE();
-		_globalSettings.numAttributes = res->readUint16BE();
-		_globalSettings.numGroups = res->readUint16BE();
-		res->readUint16BE(); // unknown
-		_globalSettings.invTop = res->readUint16BE();
-		_globalSettings.invLeft = res->readUint16BE();
-		_globalSettings.invWidth = res->readUint16BE();
-		_globalSettings.invHeight = res->readUint16BE();
-		_globalSettings.invOffsetY = res->readUint16BE();
-		_globalSettings.invOffsetX = res->readSint16BE();
-		_globalSettings.defaultFont = res->readUint16BE();
-		_globalSettings.defaultSize = res->readUint16BE();
-
-		_globalSettings.attrIndices = new uint8[_globalSettings.numAttributes];
-		res->read(_globalSettings.attrIndices, _globalSettings.numAttributes);
-
-		_globalSettings.attrMasks = new uint16[_globalSettings.numAttributes];
-		for (int i = 0; i < _globalSettings.numAttributes; i++)
-			_globalSettings.attrMasks[i] = res->readUint16BE();
-
-		_globalSettings.attrShifts = new uint8[_globalSettings.numAttributes];
-		res->read(_globalSettings.attrShifts, _globalSettings.numAttributes);
-
-		_globalSettings.cmdArgCnts = new uint8[_globalSettings.numCommands];
-		res->read(_globalSettings.cmdArgCnts, _globalSettings.numCommands);
-
-		_globalSettings.commands = new uint8[_globalSettings.numCommands];
-		res->read(_globalSettings.commands, _globalSettings.numCommands);
-
+		_globalSettings = new GlobalSettings();
+		_globalSettings->loadSettings(res);
 		delete res;
 		return true;
 	}
@@ -1149,7 +1124,6 @@ bool MacVentureEngine::loadTextHuffman() {
 		_textHuffman = new HuffmanLists(numEntries, lengths, masks, values);
 		debugC(4, kMVDebugMain, "Text is huffman-encoded");
 
-
 		delete res;
 		delete masks;
 		delete lengths;
@@ -1159,6 +1133,52 @@ bool MacVentureEngine::loadTextHuffman() {
 	return false;
 }
 
+// Global Settings
+GlobalSettings::GlobalSettings() {
+}
+
+GlobalSettings::~GlobalSettings() {
+
+}
 
+void GlobalSettings::loadSettings(Common::SeekableReadStream *dataStream) {
+	_numObjects = dataStream->readUint16BE();
+	_numGlobals = dataStream->readUint16BE();
+	_numCommands = dataStream->readUint16BE();
+	_numAttributes = dataStream->readUint16BE();
+	_numGroups = dataStream->readUint16BE();
+	dataStream->readUint16BE(); // unknown
+	_invTop = dataStream->readUint16BE();
+	_invLeft = dataStream->readUint16BE();
+	_invWidth = dataStream->readUint16BE();
+	_invHeight = dataStream->readUint16BE();
+	_invOffsetY = dataStream->readUint16BE();
+	_invOffsetX = dataStream->readSint16BE();
+	_defaultFont = dataStream->readUint16BE();
+	_defaultSize = dataStream->readUint16BE();
+
+	uint8 *attrIndices = new uint8[_numAttributes];
+	dataStream->read(attrIndices, _numAttributes);
+	_attrIndices = Common::Array<uint8>(attrIndices, _numAttributes);
+	delete[] attrIndices;
+
+	for (int i = 0; i < _numAttributes; i++)
+		_attrMasks.push_back(dataStream->readUint16BE());
+
+	uint8 *attrShifts = new uint8[_numAttributes];
+	dataStream->read(attrShifts, _numAttributes);
+	_attrShifts = Common::Array<uint8>(attrShifts, _numAttributes);
+	delete[] attrShifts;
+
+	uint8 *cmdArgCnts = new uint8[_numCommands];
+	dataStream->read(cmdArgCnts, _numCommands);
+	_cmdArgCnts = Common::Array<uint8>(cmdArgCnts, _numCommands);
+	delete[] cmdArgCnts;
+
+	uint8 *commands = new uint8[_numCommands];
+	dataStream->read(commands, _numCommands);
+	_commands = Common::Array<uint8>(commands, _numCommands);
+	delete[] commands;
+}
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index e78774d..7e53eb2 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -91,25 +91,34 @@ enum FilePathID {
 };
 
 
-struct GlobalSettings {
-	uint16 numObjects;    // number of game objects defined
-	uint16 numGlobals;    // number of globals defined
-	uint16 numCommands;   // number of commands defined
-	uint16 numAttributes; // number of attributes
-	uint16 numGroups;     // number of object groups
-	uint16 invTop;        // inventory window bounds
-	uint16 invLeft;
-	uint16 invHeight;
-	uint16 invWidth;
-	uint16 invOffsetY;    // positioning offset for
-	uint16 invOffsetX;    // new inventory windows
-	uint16 defaultFont;   // default font
-	uint16 defaultSize;   // default font size
-	uint8  *attrIndices; // attribute indices into attribute table
-	uint16 *attrMasks;   // attribute masks
-	uint8  *attrShifts;  // attribute bit shifts
-	uint8  *cmdArgCnts;  // command argument counts
-	uint8  *commands;    // command buttons
+class GlobalSettings {
+public:
+	GlobalSettings();
+	~GlobalSettings();
+
+	void loadSettings(Common::SeekableReadStream *dataStream);
+
+// HACK MAybe this should be private, but the class is only here to handle
+// memory allocation/deallocation
+public:
+	uint16 _numObjects;    // number of game objects defined
+	uint16 _numGlobals;    // number of globals defined
+	uint16 _numCommands;   // number of commands defined
+	uint16 _numAttributes; // number of attributes
+	uint16 _numGroups;     // number of object groups
+	uint16 _invTop;        // inventory window bounds
+	uint16 _invLeft;
+	uint16 _invHeight;
+	uint16 _invWidth;
+	uint16 _invOffsetY;    // positioning offset for
+	uint16 _invOffsetX;    // new inventory windows
+	uint16 _defaultFont;   // default font
+	uint16 _defaultSize;   // default font size
+	Common::Array<uint8> _attrIndices; // attribute indices into attribute table
+	Common::Array<uint16> _attrMasks;   // attribute masks
+	Common::Array<uint8> _attrShifts;  // attribute bit shifts
+	Common::Array<uint8> _cmdArgCnts;  // command argument counts
+	Common::Array<uint8> _commands;    // command buttons
 };
 
 enum GameState {
@@ -327,7 +336,7 @@ private: // Attributes
 
 	// Engine state
 	GameState _gameState;
-	GlobalSettings _globalSettings;
+	GlobalSettings *_globalSettings;
 	HuffmanLists *_textHuffman;
 	bool _oldTextEncoding;
 	bool _paused, _halted, _cmdReady, _prepared;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 708ccfe..20695db 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -56,7 +56,7 @@ void World::startNewGame() {
 
 uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 	uint res;
-	uint32 index = _engine->getGlobalSettings().attrIndices[attrID];
+	uint32 index = _engine->getGlobalSettings()._attrIndices[attrID];
 	// HACK, but if I try to initialize it in the else clause, it goes out of scope and segfaults
 	Common::SeekableReadStream *objStream = _objectConstants->getItem(objID);
 	if (!(index & 0x80)) { // It's not a constant
@@ -69,8 +69,8 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 		res = objStream->readByte() << 8;
 		res |= objStream->readByte();
 	}
-	res &= _engine->getGlobalSettings().attrMasks[attrID];
-	res >>= _engine->getGlobalSettings().attrShifts[attrID];
+	res &= _engine->getGlobalSettings()._attrMasks[attrID];
+	res >>= _engine->getGlobalSettings()._attrShifts[attrID];
 	if (res & 0x8000)
 		res = -((res ^ 0xffff) + 1);
 	debugC(5, kMVDebugMain, "Attribute %x from object %x is %x", attrID, objID, res);
@@ -88,11 +88,11 @@ void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
 	if (attrID < kAttrOtherDoor)
 		_engine->enqueueObject(kUpdateObject, objID);
 
-	uint32 idx = _engine->getGlobalSettings().attrIndices[attrID];
-	value <<= _engine->getGlobalSettings().attrShifts[attrID];
-	value &= _engine->getGlobalSettings().attrMasks[attrID];
+	uint32 idx = _engine->getGlobalSettings()._attrIndices[attrID];
+	value <<= _engine->getGlobalSettings()._attrShifts[attrID];
+	value &= _engine->getGlobalSettings()._attrMasks[attrID];
 	Attribute oldVal = _saveGame->getAttr(objID, idx);
-	oldVal &= ~_engine->getGlobalSettings().attrMasks[attrID];
+	oldVal &= ~_engine->getGlobalSettings()._attrMasks[attrID];
 	_saveGame->setAttr(idx, objID, (value | oldVal));
 	_engine->gameChanged();
 }
@@ -195,7 +195,7 @@ bool World::intersects(ObjID objID, Common::Rect rect) {
 void World::calculateObjectRelations() {
 	_relations.clear();
 	ObjID val, next;
-	uint32 numObjs = _engine->getGlobalSettings().numObjects;
+	uint32 numObjs = _engine->getGlobalSettings()._numObjects;
 	const AttributeGroup &parents = *_saveGame->getGroup(0);
 	for (uint i = 0; i < numObjs * 2; i++) {
 		_relations.push_back(0);
@@ -305,9 +305,9 @@ void SaveGame::saveInto(Common::OutSaveFile *file) {
 
 void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream * res) {
 	GlobalSettings settings = engine->getGlobalSettings();
-	for (int i = 0; i < settings.numGroups; ++i) {
+	for (int i = 0; i < settings._numGroups; ++i) {
 		AttributeGroup g;
-		for (int j = 0; j < settings.numObjects; ++j)
+		for (int j = 0; j < settings._numObjects; ++j)
 			g.push_back(res->readUint16BE());
 
 		_groups.push_back(g);
@@ -316,7 +316,7 @@ void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *
 
 void SaveGame::loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream * res) {
 	GlobalSettings settings = engine->getGlobalSettings();
-	for (int i = 0; i < settings.numGlobals; ++i) {
+	for (int i = 0; i < settings._numGlobals; ++i) {
 		_globals.push_back(res->readUint16BE());
 	}
 }


Commit: 2f2d9bead758a001e3e003bc782540ad4c0c3d22
    https://github.com/scummvm/scummvm/commit/2f2d9bead758a001e3e003bc782540ad4c0c3d22
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix double free

Changed paths:
    engines/macventure/text.cpp



diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index d15401a..76ea7df 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -174,7 +174,6 @@ void TextAsset::decodeHuffman() {
 		}
 	}
 	_decoded += '\0';
-	delete res;
 	debugC(4, kMVDebugText, "Decoded %d'th string (new): %s", _id, _decoded.c_str());
 }
 Common::String TextAsset::getNoun(ObjID subval) {


Commit: 28698ba697012edd1b3159400342d04b5d3df530
    https://github.com/scummvm/scummvm/commit/28698ba697012edd1b3159400342d04b5d3df530
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix leak on loadControls

Changed paths:
    engines/macventure/controls.h
    engines/macventure/gui.cpp



diff --git a/engines/macventure/controls.h b/engines/macventure/controls.h
index a780f63..574ae6a 100644
--- a/engines/macventure/controls.h
+++ b/engines/macventure/controls.h
@@ -69,7 +69,7 @@ struct ControlData {
 	ControlAction refcon;
 	ControlType type;
 	uint8 titleLength;
-	char* title;
+	Common::String title;
 	uint16 border;
 };
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 834ffc1..bf8455e 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -512,9 +512,11 @@ bool Gui::loadControls() {
 		data.type = (ControlType)id; id++;
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
-			data.title = new char[data.titleLength + 1];
-			res->read(data.title, data.titleLength);
-			data.title[data.titleLength] = '\0';
+			char *title = new char[data.titleLength + 1];
+			res->read(title, data.titleLength);
+			title[data.titleLength] = '\0';
+			data.title = Common::String(title);
+			delete[] title;
 		}
 		if (data.type != kControlExitBox) {
 			BorderBounds bbs = borderBounds(getWindowData(kCommandsWindow).type);


Commit: d1cd77208e9517c50a65a32f33dfe5ce5039ef1e
    https://github.com/scummvm/scummvm/commit/d1cd77208e9517c50a65a32f33dfe5ce5039ef1e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix mismatched new and delete[]

Changed paths:
    engines/macventure/container.h
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 1abab1c..6979afb 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -196,7 +196,8 @@ public:
 
 		}
 
-		Common::SeekableReadStream *res = _res->readStream(getItemByteSize(id) * 2);
+		// HACK Should Limit the size of the stream returned
+		Common::SeekableReadStream *res = _res->readStream(_res->size() - _res->pos() + 1);
 		return res;
 	}
 
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index bf8455e..ff14cf3 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -171,8 +171,8 @@ void Gui::initGUI() {
 }
 
 void Gui::reloadInternals() {
-	loadGraphics();
 	clearAssets();
+	loadGraphics();
 }
 
 void Gui::draw() {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 9c601dd..16be24b 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -1125,9 +1125,9 @@ bool MacVentureEngine::loadTextHuffman() {
 		debugC(4, kMVDebugMain, "Text is huffman-encoded");
 
 		delete res;
-		delete masks;
-		delete lengths;
-		delete values;
+		delete[] masks;
+		delete[] lengths;
+		delete[] values;
 		return true;
 	}
 	return false;


Commit: 6f9a17199cc01b72de2045cda7eee2c97e8c6ccb
    https://github.com/scummvm/scummvm/commit/6f9a17199cc01b72de2045cda7eee2c97e8c6ccb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix leak on text decoding

Changed paths:
    engines/macventure/text.cpp



diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 76ea7df..745def2 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -43,7 +43,7 @@ TextAsset::TextAsset(MacVentureEngine *engine, ObjID objid, ObjID source, ObjID
 void TextAsset::decodeOld() {
 	Common::SeekableReadStream *res = _container->getItem(_id);
 	uint16 strLen = res->readUint16BE();
-	Common::BitStream32BELSB stream(res);
+	Common::BitStream32BELSB stream(res, true);
 	char* str = new char[strLen + 1];
 	bool lowercase = false;
 	char c;


Commit: 2f1368646f11e9569bd981a93035a2e43edd2aca
    https://github.com/scummvm/scummvm/commit/2f1368646f11e9569bd981a93035a2e43edd2aca
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix window object drawing

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index ff14cf3..9359097 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -367,6 +367,7 @@ void Gui::clearAssets() {
 	for (; it != _assets.end(); it++) {
 		delete it->_value;
 	}
+	_assets.clear();
 }
 
 bool Gui::loadMenus() {
@@ -672,9 +673,11 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 
 	if (targetData.children.size() == 0) return;
 
-	Graphics::ManagedSurface *composeSurface = new Graphics::ManagedSurface();
-	createInnerSurface(composeSurface, surface, border);
-	composeSurface->clear(kColorGreen);
+	Graphics::ManagedSurface composeSurface;
+	createInnerSurface(&composeSurface, surface, border);
+	assert(composeSurface.w <= surface->w &&
+			composeSurface.h <= surface->h);
+	composeSurface.clear(kColorGreen);
 
 	for (uint i = 0; i < targetData.children.size(); i++) {
 		child = targetData.children[i].obj;
@@ -684,7 +687,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 		ensureAssetLoaded(child);
 
 		_assets[child]->blitInto(
-			composeSurface,
+			&composeSurface,
 			pos.x,
 			pos.y,
 			mode);
@@ -694,7 +697,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 				child == _draggedObj.id) {
 
 				_assets[child]->blitInto(
-					composeSurface, pos.x, pos.y, kBlitOR);
+					&composeSurface, pos.x, pos.y, kBlitOR);
 			}
 		}
 
@@ -705,8 +708,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 		}
 	}
 	Common::Point composePosition = Common::Point(border.leftOffset, border.topOffset);
-	surface->transBlitFrom(*composeSurface, composePosition, kColorGreen);
-	delete composeSurface;
+	surface->transBlitFrom(composeSurface, composePosition, kColorGreen);
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {


Commit: d86a426dcbf0ca0ec38df70bfe4567b2fada08ce
    https://github.com/scummvm/scummvm/commit/d86a426dcbf0ca0ec38df70bfe4567b2fada08ce
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix image overflow blitting

Changed paths:
    engines/macventure/image.cpp
    engines/macventure/image.h



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 604d9db..812e2e3 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -86,6 +86,7 @@ ImageAsset::ImageAsset(ObjID original, Container * container) {
 }
 
 ImageAsset::~ImageAsset() {
+	debugC(3, kMVDebugImage, "~ImageAsset(%d)", _id / 2);
 }
 
 void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight, uint &bitWidth, uint &rowBytes) {
@@ -348,7 +349,7 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 	return val;
 }
 
-void ImageAsset::blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode) {
+void ImageAsset::blitInto(Graphics::ManagedSurface *target, int x, int y, BlitMode mode) {
 	if (mode == kBlitDirect) {
 		blitDirect(target, x, y, _imgData, _imgBitHeight, _imgBitWidth, _imgRowBytes);
 	} else if (mode < kBlitXOR){
@@ -417,12 +418,14 @@ int ImageAsset::getHeight() {
 
 void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < w; x++) {
+			assert(ox + x <= target->w);
+			assert(oy + y <= target->h);
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			pix = pix ? kColorBlack : kColorWhite;
 			*((byte *)target->getBasePtr(ox + x, oy + y)) = pix;
@@ -432,12 +435,14 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, c
 
 void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < w; x++) {
+			assert(ox + x <= target->w);
+			assert(oy + y <= target->h);
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
 		}
@@ -446,12 +451,14 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, cons
 
 void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
 		byte pix = 0;
 		for (uint x = 0; x < w; x++) {
+			assert(ox + x <= target->w);
+			assert(oy + y <= target->h);
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
 		}
@@ -460,7 +467,7 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const
 
 void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
-	calculateSubsection(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
+	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
 	for (uint y = 0; y < h; y++) {
 		uint bmpofs = (y + sy) * rowBytes;
@@ -468,6 +475,8 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, cons
 		for (uint x = 0; x < w; x++) {
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
 			if (pix) { // We need to xor
+				assert(ox + x <= target->w);
+				assert(oy + y <= target->h);
 				byte p = *((byte *)target->getBasePtr(ox + x, oy + y));
 				*((byte *)target->getBasePtr(ox + x, oy + y)) =
 					(p == kColorWhite) ? kColorBlack : kColorWhite;
@@ -476,15 +485,42 @@ void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, cons
 	}
 }
 
-void ImageAsset::calculateSubsection(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h) {
-	sx = (ox < 0) ? -ox : 0;
-	sy = (oy < 0) ? -oy : 0;
-	ox = (ox < 0) ? 0 : ox;
-	oy = (oy < 0) ? 0 : oy;
-	w = MAX((int)(bitWidth - sx), 0);
-	h = MAX((int)(bitHeight - sy), 0);
-	w = w > target->w ? target->w : w;
-	h = h > target->h ? target->h : h;
+void ImageAsset::calculateSectionToDraw(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h) {
+
+	calculateSectionInDirection(target->w, bitWidth, ox, sx, w);
+	calculateSectionInDirection(target->h, bitHeight, oy, sy, h);
+
+	assert(w <= target->w);
+	assert((int)w >= 0);
+	assert(w <= bitWidth);
+	assert(h <= target->h);
+	assert((int)h >= 0);
+	assert(h <= bitHeight);
+}
+
+void ImageAsset::calculateSectionInDirection(uint targetWhole, uint originWhole, int &originPosition, uint &startPosition, uint &blittedWhole) {
+	blittedWhole = originWhole;
+	if (originPosition + blittedWhole > targetWhole) {
+		if (originPosition > (int)targetWhole) {
+			blittedWhole = 0;
+		} else {
+			blittedWhole = (blittedWhole) - ((blittedWhole + originPosition) - targetWhole);
+		}
+
+	}
+	if (originPosition < 0) {
+		if (ABS(originPosition) > (int)blittedWhole) {
+			blittedWhole = 0;
+		} else {
+			blittedWhole -= -originPosition;
+		}
+	}
+
+	startPosition = 0;
+	if (originPosition < 0) {
+		startPosition = -originPosition;
+		originPosition = 0;
+	}
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 3910f83..1f7d3e9 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -58,7 +58,7 @@ public:
 	ImageAsset(ObjID original, Container *container);
 	~ImageAsset();
 
-	void blitInto(Graphics::ManagedSurface *target, uint32 x, uint32 y, BlitMode mode);
+	void blitInto(Graphics::ManagedSurface *target, int x, int y, BlitMode mode);
 
 	bool isPointInside(Common::Point point);
 	bool isRectInside(Common::Rect rect);
@@ -82,7 +82,8 @@ private:
 	void blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 	void blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 
-	void calculateSubsection(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
+	void calculateSectionToDraw(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
+	void calculateSectionInDirection(uint targetWhole, uint originWhole, int &originPosition, uint &startPosition, uint &blittedWhole);
 
 private:
 	ObjID _id;


Commit: 62af855e33aee4cf8e7a66cc9c2b5d0948f526b1
    https://github.com/scummvm/scummvm/commit/62af855e33aee4cf8e7a66cc9c2b5d0948f526b1
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:17+02:00

Commit Message:
MACVENTURE: Fix operate command

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 16be24b..1244c83 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -683,8 +683,9 @@ void MacVentureEngine::unselectAll() {
 
 void MacVentureEngine::selectObject(ObjID objID) {
 	if (!_currentSelection.empty()) {
-		if (findParentWindow(objID) != findParentWindow(_currentSelection[0]))
-			unselectAll();
+		if (findParentWindow(objID) != findParentWindow(_currentSelection[0])) {
+			//unselectAll();
+		}
 	}
 	if (findObjectInArray(objID, _currentSelection) == -1) {
 		_currentSelection.push_back(objID);
@@ -896,7 +897,6 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 }
 
 void MacVentureEngine::toggleExits() {
-	warning("delete this when done testing!");
 	Common::Array<ObjID> exits = _currentSelection;
 	while (!exits.empty()) {
 		ObjID obj = exits.front();


Commit: fd01961d55e5e749adea193cdadd184aefcd5887
    https://github.com/scummvm/scummvm/commit/fd01961d55e5e749adea193cdadd184aefcd5887
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:29:18+02:00

Commit Message:
MACVENTURE: Fix lost constant

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 9359097..6613610 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -59,6 +59,8 @@ enum {
 	kDragThreshold = 5
 };
 
+const bool kLoadStaticMenus = true;
+
 static const Graphics::MenuData menuSubItems[] = {
 	{ kMenuHighLevel,	"File",				0, 0, false },
 	{ kMenuHighLevel,	"Edit",				0, 0, false },


Commit: 09fe00eb2a8f11e274901a4af4e19ec5275ff7e8
    https://github.com/scummvm/scummvm/commit/09fe00eb2a8f11e274901a4af4e19ec5275ff7e8
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:18+02:00

Commit Message:
MACVENTURE: Fix indentation and braces

Changed paths:
  R engines/macventure/object.cpp
  R engines/macventure/object.h
    engines/macventure/container.h
    engines/macventure/controls.h
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/module.mk
    engines/macventure/script.cpp
    engines/macventure/sound.cpp
    engines/macventure/text.cpp
    engines/macventure/windows.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 6979afb..b65c157 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -210,8 +210,8 @@ protected:
 
 	ContainerHeader _header;
 
-	Common::Array<uint16> _huff;   // huffman masks
-	Common::Array<uint8> _lens;   // huffman lengths
+	Common::Array<uint16> _huff; // huffman masks
+	Common::Array<uint8> _lens; // huffman lengths
 	Common::Array<ItemGroup> _groups;
 
 	Common::String _filename;
diff --git a/engines/macventure/controls.h b/engines/macventure/controls.h
index 574ae6a..3f23aa8 100644
--- a/engines/macventure/controls.h
+++ b/engines/macventure/controls.h
@@ -41,24 +41,25 @@ enum ControlType { // HACK, should correspond exactly with the types of controls
 };
 
 enum ControlAction { // HACK, figure out a way to put it in engine
-  kNoCommand = 0,
-  kStartOrResume = 1,
-  kClose = 2,
-  kTick = 3,
-  kActivateObject = 4,
-  kMoveObject = 5,
-  kConsume = 6,
-  kExamine = 7,
-  kGo = 8,
-  kHit = 9,
-  kOpen = 10,
-  kOperate = 11,
-  kSpeak = 12,
-  kBabble = 13,
-  kTargetName = 14,
-  kDebugObject = 15,
-  kClickToContinue = 16
+	kNoCommand = 0,
+	kStartOrResume = 1,
+	kClose = 2,
+	kTick = 3,
+	kActivateObject = 4,
+	kMoveObject = 5,
+	kConsume = 6,
+	kExamine = 7,
+	kGo = 8,
+	kHit = 9,
+	kOpen = 10,
+	kOperate = 11,
+	kSpeak = 12,
+	kBabble = 13,
+	kTargetName = 14,
+	kDebugObject = 15,
+	kClickToContinue = 16
 };
+
 struct ControlData {
 	Common::Rect bounds;
 	uint16 scrollValue;
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 0edec40..ce420a2 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -46,7 +46,7 @@ Dialog::~Dialog() {
 
 void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
 	switch(action) {
-		case kDACloseDialog:
+	case kDACloseDialog:
 		_gui->closeDialog();
 		break;
 		case kDASubmit:
@@ -71,7 +71,7 @@ void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
 		break;
 	default:
 		break;
-  }
+	}
 }
 
 const Graphics::Font& Dialog::getFont() {
@@ -84,11 +84,11 @@ bool Dialog::processEvent(Common::Event event) {
 	}
 }
 
-void Dialog::addButton(Common::String title, MacVenture::DialogAction action, Common::Point position, uint width, uint height)  {
+void Dialog::addButton(Common::String title, MacVenture::DialogAction action, Common::Point position, uint width, uint height) {
 	_elements.push_back(new DialogButton(this, title, action, position, width, height));
 }
 
-void Dialog::addText(Common::String content, Common::Point position)  {
+void Dialog::addText(Common::String content, Common::Point position) {
 	_elements.push_back(new DialogPlainText(this, content, position));
 }
 
@@ -96,7 +96,7 @@ void Dialog::addTextInput(Common::Point position, int width, int height) {
 	_elements.push_back(new DialogTextInput(this, position, width, height));
 }
 
-void Dialog::draw()  {
+void Dialog::draw() {
 	Graphics::ManagedSurface compose;
 	// Compose the surface
 	compose.create(_bounds.width(), _bounds.height());
@@ -149,7 +149,7 @@ DialogElement::DialogElement(Dialog *dialog, Common::String title, DialogAction
 	_bounds = Common::Rect(position.x, position.y, position.x + width, position.y + height);
 }
 
-bool DialogElement::processEvent(MacVenture::Dialog *dialog, Common::Event event)  {
+bool DialogElement::processEvent(MacVenture::Dialog *dialog, Common::Event event) {
 	return doProcessEvent(dialog, event);
 }
 
@@ -218,7 +218,7 @@ bool DialogTextInput::doProcessEvent(Dialog *dialog, Common::Event event) {
 			if (!_text.empty()) {
 				_text.deleteLastChar();
 				dialog->setUserInput(_text);
-      			return true;
+				return true;
 			}
 			break;
 		default:
@@ -228,9 +228,9 @@ bool DialogTextInput::doProcessEvent(Dialog *dialog, Common::Event event) {
 				return true;
 			}
 			break;
-    }
-  }
-  return false;
+		}
+	}
+	return false;
 }
 
 void DialogTextInput::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) {
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 6613610..8ced279 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -594,7 +594,7 @@ void Gui::drawMainGameWindow() {
 
 	if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
 		Graphics::MacWindow *win = findWindow(data.refcon);
-		Common::Rect innerDims  = win->getInnerDimensions();
+		Common::Rect innerDims = win->getInnerDimensions();
 		int x = win->getDimensions().left;
 		int y = win->getDimensions().top;
 		innerDims.translate(-x, -y);
@@ -624,7 +624,7 @@ void Gui::drawInventories() {
 
 		if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
 			Graphics::MacWindow *win = findWindow(data.refcon);
-			Common::Rect innerDims  = win->getInnerDimensions();
+			Common::Rect innerDims = win->getInnerDimensions();
 			int x = win->getDimensions().left;
 			int y = win->getDimensions().top;
 			innerDims.translate(-x, -y);
@@ -846,8 +846,7 @@ void Gui::updateExit(ObjID obj) {
 		_exitsData->remove_at(ctl);
 
 	if (!_engine->isHiddenExit(obj) &&
-		_engine->getParent(obj) == _engine->getParent(1))
-	{
+		_engine->getParent(obj) == _engine->getParent(1)) {
 		ControlData data;
 		data.titleLength = 0;
 		data.refcon = (ControlAction)obj; // Objects can be exits (actions)
@@ -1290,8 +1289,7 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 			if (it->isInsideBounds(position)) {
 				it->select();
 				data = *it;
-			}
-			else {
+			} else {
 				it->unselect();
 			}
 		}
@@ -1357,8 +1355,7 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 				button = *it;
 				_engine->handleObjectSelect(button.getData().refcon, kExitsWindow, false, false);
 				return true;
-			}
-			else {
+			} else {
 				it->unselect();
 			}
 		}
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 812e2e3..1b0e59d 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -122,8 +122,7 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 		data.push_back(0);
 	}
 
-	switch (mode)
-	{
+	switch (mode) {
 	case MacVenture::kPPIC0:
 		decodePPIC0(stream, data, bitHeight, bitWidth, rowBytes);
 		break;
@@ -279,8 +278,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		for (uint y = 0; y < bitHeight; y++) {
 			uint16 v = 0;
 			if (flags & 2) {
-				for (uint x = 0; x < rowBytes; x++)
-				{
+				for (uint x = 0; x < rowBytes; x++) {
 					data[pos] ^= v;
 					v = data[pos];
 					pos++;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 1244c83..76a4791 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -393,12 +393,7 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 		} else {
 			if (objID == 0) {
 				unselectAll();
-				//if (windata.type == kAnimateBack) {
-					//doLasso(win, event, canDrag);
-				//}
-				//else {
-					objID = win;
-				//}
+				objID = win;
 			}
 			if (objID > 0) {
 				int currentObjectIndex = findObjectInArray(objID, _currentSelection);
@@ -543,10 +538,9 @@ bool MacVenture::MacVentureEngine::runScriptEngine() {
 			updateState(true);
 		}
 	}
-	if (_selectedControl == 1)
+	if (_selectedControl == 1) {
 		_gameChanged = false;
-
-	else if (isGameRunning()) {
+	} else if (isGameRunning()) {
 		if (_scriptEngine->runControl(kTick, _selectedControl, _destObject, _deltaPoint)) {
 			_haltedAtEnd = true;
 			return true;
@@ -1024,7 +1018,7 @@ ObjID MacVentureEngine::getParent(ObjID objID) {
 Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 	Common::Point pos = getObjPosition(objID);
 
-	WindowReference win  = findParentWindow(objID);
+	WindowReference win = findParentWindow(objID);
 	if (win != kNoWindow) { // If it's not in a window YET, we don't really care about the border
 		BorderBounds bounds = borderBounds(_gui->getWindowData(win).type); // HACK
 		pos.x += bounds.leftOffset;
@@ -1045,8 +1039,7 @@ uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
 	Common::Rect oneBounds = getObjBounds(one);
 	Common::Rect otherBounds = getObjBounds(other);
 	if (otherBounds.intersects(oneBounds) ||
-		oneBounds.intersects(otherBounds))
-	{
+		oneBounds.intersects(otherBounds)) {
 		uint areaOne = oneBounds.width() * oneBounds.height();
 		uint areaOther = otherBounds.width() * otherBounds.height();
 		return (areaOther * 100 / areaOne) | 0;
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 7b81018..ee24026 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -1,21 +1,20 @@
 MODULE := engines/macventure
 
 MODULE_OBJS := \
-	image.o \
+	controls.o \
+	datafiles.o \
 	detection.o \
-	object.o \
-	text.o \
-	world.o \
-	script.o \
-	macventure.o \
-	gui.o \
 	dialog.o \
-	controls.o \
+	gui.o \
+	image.o \
+	macventure.o \
 	prebuilt_dialogs.o \
-	windows.o \
-	sound.o \
 	saveload.o \
-	datafiles.o
+	script.o \
+	sound.o \
+	text.o \
+	windows.o \
+	world.o
 
 
 MODULE_DIRS += \
diff --git a/engines/macventure/object.cpp b/engines/macventure/object.cpp
deleted file mode 100644
index 18a734c..0000000
--- a/engines/macventure/object.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#include "macventure/object.h"
-
-namespace MacVenture {
-
-Object::Object() {}
-Object::~Object() {}
-
-} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/object.h b/engines/macventure/object.h
deleted file mode 100644
index 1712ec6..0000000
--- a/engines/macventure/object.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef MACVENTURE_OBJECT_H
-#define MACVENTURE_OBJECT_H
-
-#include "macventure/macventure.h"
-
-namespace MacVenture {
-
-class Object {
-public:
-	Object();
-	~Object();
-};
-
-} // End of namespace MacVenture
-
-#endif
\ No newline at end of file
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 5aa8e3c..3dc9509 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -648,17 +648,13 @@ void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
 	if (step<0) step += num;
 	word end = 0;
 	word start = 0;
-	for (word i = 1;i<num;i++)
-	{
+	for (word i = 1;i<num;i++) {
 		start += step;
 		if (start >= num) start -= num;
-		if (start == end)
-		{
+		if (start == end) {
 			end++;
 			start = end;
-		}
-		else
-		{
+		} else {
 			word a = state->peek(end);
 			word b = state->peek(start);
 			state->poke(end, b);
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 455a191..eb09416 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -56,7 +56,7 @@ uint32 SoundManager::playSound(ObjID sound) {
 
 void SoundManager::ensureLoaded(ObjID sound) {
 	if (!_assets.contains(sound))
-	_assets[sound] = new SoundAsset(_container, sound);
+		_assets[sound] = new SoundAsset(_container, sound);
 }
 
 SoundAsset::SoundAsset(Container *container, ObjID id) :
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 745def2..095b0f3 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -34,8 +34,7 @@ TextAsset::TextAsset(MacVentureEngine *engine, ObjID objid, ObjID source, ObjID
 
 	if (_isOld) {
 		decodeOld();
-	}
-	else {
+	} else {
 		decodeHuffman();
 	}
 }
@@ -51,35 +50,28 @@ void TextAsset::decodeOld() {
 		char val = stream.getBits(5);
 		if (val == 0x0) { // Space
 			c = ' ';
-		}
-		else if (val >= 0x1 && val <= 0x1A) {
+		} else if (val >= 0x1 && val <= 0x1A) {
 			if (lowercase) { // Ascii a-z
 				c = val + 0x60;
-			}
-			else { // Ascii A-Z
+			} else { // Ascii A-Z
 				c = val + 0x40;
 			}
 			lowercase = true;
-		}
-		else if (val == 0x1B) {
+		} else if (val == 0x1B) {
 			if (lowercase) {
 				c = '.';
-			}
-			else {
+			} else {
 				c = ',';
 			}
 			lowercase = true;
-		}
-		else if (val == 0x1C) {
+		} else if (val == 0x1C) {
 			if (lowercase) {
 				c = 0x27; // Ascii '
-			}
-			else {
+			} else {
 				c = 0x22; // Ascii '"'
 			}
 			lowercase = true;
-		}
-		else if (val == 0x1D) { // Composite
+		} else if (val == 0x1D) { // Composite
 			ObjID subval = stream.getBits(16);
 			Common::String child;
 			if (subval & 0x8000) {
@@ -95,15 +87,12 @@ void TextAsset::decodeOld() {
 				c = '?'; // HACK Will fix later, should append
 			}
 			lowercase = true;
-		}
-		else if (val == 0x1E) {
+		} else if (val == 0x1E) {
 			c = stream.getBits(8);
 			lowercase = true;
-		}
-		else if (val == 0x1F) {
+		} else if (val == 0x1F) {
 			lowercase = !lowercase;
-		}
-		else {
+		} else {
 			warning("Unrecognized char in old text %d, pos %d", _id, i);
 		}
 		str[i] = c;
@@ -121,8 +110,7 @@ void TextAsset::decodeHuffman() {
 	uint16 strLen = 0;
 	if (stream.getBit()) {
 		strLen = stream.getBits(15);
-	}
-	else {
+	} else {
 		strLen = stream.getBits(7);
 	}
 	// OK up to here
@@ -179,22 +167,19 @@ void TextAsset::decodeHuffman() {
 Common::String TextAsset::getNoun(ObjID subval) {
 	ObjID obj;
 	Common::String name;
-	if (subval & 8)
+	if (subval & 8) {
 		obj = _targetObj;
-	else
+	} else {
 		obj = _sourceObj;
-	if ((subval & 3) == 1)
-	{
+	}
+	if ((subval & 3) == 1) {
 		uint idx = _engine->getPrefixNdx(obj);
 		idx = ((idx >> 4) & 3) + 1;
 		name = _engine->getNoun(idx);
-	}
-	else
-	{
+	} else {
 		// HACK, there should be a pool of assets or something like in the GUI
 		name = *TextAsset(_engine, obj, _sourceObj, _targetObj, _container, _isOld, _huffman).decode();
-		switch (subval & 3)
-		{
+		switch (subval & 3) {
 		case 2:
 			name = _engine->getPrefixString(0, obj) + name;
 			break;
diff --git a/engines/macventure/windows.h b/engines/macventure/windows.h
index fe3f927..1727698 100644
--- a/engines/macventure/windows.h
+++ b/engines/macventure/windows.h
@@ -27,7 +27,7 @@
 #include "common/array.h"
 
 namespace MacVenture {
-  // massive HACK
+// massive HACK
 typedef uint32 ObjID;
 
 enum WindowReference {
@@ -92,7 +92,7 @@ struct BorderBounds {
 	uint16 bottomOffset;
 
 	BorderBounds(uint16 l, uint16 t, uint16 r, uint16 b) :
-    leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
+	leftOffset(l), topOffset(t), rightOffset(r), bottomOffset(b) {}
 };
 }
 #endif
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 20695db..35cfbd1 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -5,7 +5,7 @@
 
 namespace MacVenture {
 
-World::World(MacVentureEngine *engine, Common::MacResManager *resMan)  {
+World::World(MacVentureEngine *engine, Common::MacResManager *resMan) {
 	_resourceManager = resMan;
 	_engine = engine;
 	_saveGame = NULL;
@@ -104,7 +104,7 @@ bool MacVenture::World::isObjActive(ObjID obj) {
 	if (!getAncestor(obj)) return false; // If our ancestor is the garbage (obj 0), we're inactive
 	if (_engine->getInvolvedObjects() >= 2 &&	// If (we need > 1 objs for the command) &&
 		destObj > 0 &&			// we have a destination object &&
-		!getAncestor(destObj))  // but that destination object is in the garbage
+		!getAncestor(destObj))	// but that destination object is in the garbage
 		return false;
 	if (selectedControl != kMoveObject) return true; // We only need one
 	// Handle move object


Commit: 9c0777efbf5a59df90728087276245208c13988f
    https://github.com/scummvm/scummvm/commit/9c0777efbf5a59df90728087276245208c13988f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:23+02:00

Commit Message:
MACVENTURE: Fix some compiler warnings

Changed paths:
    engines/macventure/datafiles.cpp
    engines/macventure/detection.cpp
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp



diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index 496fa91..a86e922 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -61,6 +61,7 @@ Common::String windowTypeName(MVWindowType windowType) {
 	case kRDoc10:
 		return "RDoc10";
 	}
+	return "";
 }
 
 void MacVentureEngine::loadDataBundle() {
diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 9bf94cf..d0a2940 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -93,8 +93,6 @@ SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
 	SaveStateList saveList;
 	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
 		int slotNum = atoi(file->c_str() + file->size() - 3);
-		Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
-
 		SaveStateDescriptor desc;
 		// Do not allow save slot 0 (used for auto-saving) to be deleted or
 		// overwritten.
@@ -104,7 +102,7 @@ SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
 		if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
 			Common::InSaveFile *in = saveFileMan->openForLoading(*file);
 			if (in) {
-				SaveStateDescriptor desc = loadMetaData(in, slotNum);
+				desc = loadMetaData(in, slotNum);
 				if (desc.getSaveSlot() != slotNum) {
 					// invalid
 					delete in;
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index ce420a2..043cd38 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -82,6 +82,7 @@ bool Dialog::processEvent(Common::Event event) {
 	for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
 		if ((*it)->processEvent(this, event)) return true;
 	}
+	return false;
 }
 
 void Dialog::addButton(Common::String title, MacVenture::DialogAction action, Common::Point position, uint width, uint height) {
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 8ced279..310cf92 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -392,7 +392,6 @@ bool Gui::loadMenus() {
 	int i = 1;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('M', 'E', 'N', 'U'), *iter);
-		bool enabled;
 		uint16 key;
 		uint16 style;
 		uint8 titleLength;
@@ -400,7 +399,6 @@ bool Gui::loadMenus() {
 
 		/* Skip menuID, width, height, resourceID, placeholder */
 		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
-		enabled = res->readUint32BE();
 		titleLength = res->readByte();
 		title = new char[titleLength + 1];
 		res->read(title, titleLength);
@@ -410,7 +408,7 @@ bool Gui::loadMenus() {
 			_menu->addMenuItem(title);
 
 			// Read submenu items
-			while (titleLength = res->readByte()) {
+			while ((titleLength = res->readByte())) {
 				title = new char[titleLength + 1];
 				res->read(title, titleLength);
 				title[titleLength] = '\0';
@@ -495,7 +493,6 @@ bool Gui::loadControls() {
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('C', 'N', 'T', 'L'))).size() == 0)
 		return false;
 
-	uint16 commandsBorder = borderBounds(kPlainDBox).topOffset;
 	uint32 id = kControlExitBox;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
 		res = _resourceManager->getResource(MKTAG('C', 'N', 'T', 'L'), *iter);
@@ -553,7 +550,6 @@ void Gui::drawCommandsWindow() {
 	if (_engine->needsClickToContinue()) {
 		Graphics::ManagedSurface *srf = _controlsWindow->getSurface();
 		WindowData data = getWindowData(kCommandsWindow);
-		uint16 border = borderBounds(data.type).topOffset;
 		srf->fillRect(Common::Rect(0, 0, srf->w, srf->h), kColorWhite);
 		getCurrentFont().drawString(
 			srf,
@@ -618,12 +614,10 @@ void Gui::drawInventories() {
 		Graphics::MacWindow *win = findWindow(data.refcon);
 		srf = win->getSurface();
 		srf->clear(kColorGreen);
-		BorderBounds border = borderBounds(data.type);
 		srf->fillRect(srf->getBounds(), kColorWhite);
 		drawObjectsInWindow(data, srf);
 
 		if (DebugMan.isDebugChannelEnabled(kMVDebugGUI)) {
-			Graphics::MacWindow *win = findWindow(data.refcon);
 			Common::Rect innerDims = win->getInnerDimensions();
 			int x = win->getDimensions().left;
 			int y = win->getDimensions().top;
@@ -988,13 +982,15 @@ Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
 		return _exitsWindow;
 	case MacVenture::kDiplomaWindow:
 		return _diplomaWindow;
+	default:
+		return NULL;
 	}
 	return NULL;
 }
 
 void Gui::ensureInventoryOpen(WindowReference reference, ObjID id) {
 	assert(reference < 0x80 && reference >= kInventoryStart);
-	if (reference - kInventoryStart == _inventoryWindows.size()) {
+	if (reference - kInventoryStart == (int)_inventoryWindows.size()) {
 		createInventoryWindow(id);
 	}
 }
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index 1b0e59d..a472c68 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -118,7 +118,7 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 	bitWidth = w;
 	bitHeight = h;
 
-	for (int i = 0; i < rowBytes * h; i++) {
+	for (uint i = 0; i < rowBytes * h; i++) {
 		data.push_back(0);
 	}
 
@@ -300,7 +300,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 		if (flags & 2) delta *= 2;
 		pos = 0;
 		uint q = delta;
-		for (int i = 0; i < bitHeight * rowBytes - delta; i++) {
+		for (uint i = 0; i < bitHeight * rowBytes - delta; i++) {
 			data[q] ^= data[pos];
 			q++;
 			pos++;
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 76a4791..0542665 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -377,8 +377,6 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 		win = kMainGameWindow;
 	}
 
-	bool canDrag = (objID && !_world->getObjAttr(objID, kAttrInvisible));
-
 	const WindowData &windata = _gui->getWindowData(win);
 
 	if (shiftPressed) {
@@ -802,7 +800,7 @@ void MacVentureEngine::openObject(ObjID objID) {
 
 void MacVentureEngine::closeObject(ObjID objID) {
 	warning("closeObject: not fully implemented");
-	bool success = _gui->tryCloseWindow(getObjWindow(objID));
+	_gui->tryCloseWindow(getObjWindow(objID));
 	return;
 }
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 3dc9509..c743e49 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -119,7 +119,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 		}
 	}
 
-	uint highest = 0;
+	int highest = 0;
 	uint localHigh = 0;
 	do { // Saved function calls
 		highest = 0;
@@ -914,6 +914,7 @@ bool ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 	if (execFrame(true)) {
 		return true;
 	}
+	return false;
 }
 
 bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
@@ -926,6 +927,7 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 	frame->scripts.pop_front();
 	script = frame->scripts.front();
 	debugC(2, kMVDebugScript, "SCRIPT: Return from fuction %d", id);
+	return false;
 }
 
 void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
@@ -1072,9 +1074,9 @@ void ScriptEngine::opd4RELC(EngineState * state, EngineFrame * frame) {
 void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 	word txt = state->pop();
 	if (_engine->showTextEntry(txt, frame->src, frame->dest)) {
-		state->push(0xFFFF);
+		state->push(0xFF);
 	} else {
-		state->push(0x0000);
+		state->push(0x00);
 	}
 }
 


Commit: 234a3b95a29e3ec11c9c02a2435bf42829550cce
    https://github.com/scummvm/scummvm/commit/234a3b95a29e3ec11c9c02a2435bf42829550cce
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:23+02:00

Commit Message:
MACVENTURE: Fix cursor warning

Changed paths:
  A engines/macventure/cursor.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/module.mk



diff --git a/engines/macventure/cursor.cpp b/engines/macventure/cursor.cpp
new file mode 100644
index 0000000..655615a
--- /dev/null
+++ b/engines/macventure/cursor.cpp
@@ -0,0 +1,128 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/gui.h"
+
+namespace MacVenture {
+
+static void cursorTimerHandler(void *refCon);
+
+static const ClickState _transitionTable[kCursorStateCount][kCursorInputCount] = {
+	/*				Button down,		Button Up,		Tick		*/
+	/* Idle */		{kCursorSCStart,	kCursorIdle,	kCursorIdle	},
+	/* SC Start */	{kCursorSCStart,	kCursorDCStart,	kCursorSCDrag},
+	/* SC Do */		{kCursorSCDrag, 	kCursorIdle,	kCursorSCDrag},
+	/* DC Start */	{kCursorDCDo,		kCursorDCStart,	kCursorSCSink},
+	/* DC Do */		{kCursorDCDo,		kCursorIdle,	kCursorDCDo	},
+	/* SC Sink */	{kCursorIdle,		kCursorIdle,	kCursorIdle	}
+};
+
+Cursor::Cursor(Gui *gui) {
+	_gui = gui;
+	_state = kCursorIdle;
+}
+Cursor::~Cursor() {}
+
+void Cursor::tick() {
+	changeState(kTickCol);
+}
+
+bool Cursor::processEvent(const Common::Event &event) {
+	if (event.type == Common::EVENT_MOUSEMOVE) {
+		_pos = event.mouse;
+		return true;
+	}
+	if (event.type == Common::EVENT_LBUTTONDOWN) {
+		changeState(kButtonDownCol);
+		return true;
+	}
+	if (event.type == Common::EVENT_LBUTTONUP) {
+		changeState(kButtonUpCol);
+		return true;
+	}
+
+	return false;
+}
+
+Common::Point Cursor::getPos() {
+	return _pos;
+}
+
+bool Cursor::canSelectDraggable() {
+	return _state == kCursorSCDrag;
+}
+
+void Cursor::changeState(CursorInput input) {
+	debugC(3, kMVDebugGUI, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
+	if (_state != _transitionTable[_state][input]) {
+		executeStateOut();
+		_state = _transitionTable[_state][input];
+		executeStateIn();
+	}
+}
+
+void Cursor::executeStateIn() {
+	switch (_state) {
+	case kCursorSCStart:
+		g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
+		_gui->selectForDrag(_pos);
+		break;
+	case kCursorDCStart:
+		g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
+		break;
+	case kCursorSCSink:
+		_gui->handleSingleClick();
+		changeState(kTickCol);
+		break;
+	default:
+		break;
+	}
+}
+
+void Cursor::executeStateOut() {
+	switch (_state) {
+	case kCursorIdle:
+		break;
+	case kCursorSCStart:
+		g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
+		break;
+	case kCursorSCDrag:
+		_gui->handleSingleClick();
+		break;
+	case kCursorDCStart:
+		g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
+		break;
+	case kCursorDCDo:
+		_gui->handleDoubleClick();
+		break;
+	default:
+		break;
+	}
+}
+
+static void cursorTimerHandler(void *refCon) {
+	Cursor *cursor = (Cursor *)refCon;
+	cursor->tick();
+}
+
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 5835202..28ee85d 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -83,15 +83,6 @@ struct DraggedObj {
 	bool hasMoved;
 };
 
-enum CursorState {
-	// HACK, I should define a proper FSM for this
-	kCursorIdle,
-	kCursorSingleClick, // Triggered when mouse goes up
-	kCursorSingleClickAwait, // Triggered when we are in single click and mouse goes down
-	kCursorSingleClickTrap, // Trap state, for when we are in await, and the timer goes off
-	kCursorDoubleClick
-};
-
 class Gui {
 
 public:
@@ -251,9 +242,6 @@ private: // Methods
 
 };
 
-static void cursorTimerHandler(void *refCon);
-
-class Cursor {
 enum ClickState {
 	kCursorIdle = 0,
 	kCursorSCStart = 1,
@@ -271,103 +259,22 @@ enum CursorInput { // Columns for the FSM transition table
 	kCursorInputCount
 };
 
-
-ClickState _transitionTable[kCursorStateCount][kCursorInputCount] = {
-	/*				Button down,		Button Up,		Tick		*/
-	/* Idle */		{kCursorSCStart,	kCursorIdle,	kCursorIdle	},
-	/* SC Start */	{kCursorSCStart,	kCursorDCStart,	kCursorSCDrag},
-	/* SC Do */		{kCursorSCDrag, 	kCursorIdle,	kCursorSCDrag},
-	/* DC Start */	{kCursorDCDo,		kCursorDCStart,	kCursorSCSink},
-	/* DC Do */		{kCursorDCDo,		kCursorIdle,	kCursorDCDo	},
-	/* SC Sink */	{kCursorIdle,		kCursorIdle,	kCursorIdle	},
-};
+class Cursor {
 
 public:
-	Cursor(Gui *gui) {
-		_gui = gui;
-		_state = kCursorIdle;
-	}
-
-	~Cursor() {}
-
-	void tick() {
-		changeState(kTickCol);
-	}
+	Cursor(Gui *gui);
+	~Cursor();
 
-	bool processEvent(const Common::Event &event) {
-		if (event.type == Common::EVENT_MOUSEMOVE) {
-			_pos = event.mouse;
-			return true;
-		}
-		if (event.type == Common::EVENT_LBUTTONDOWN) {
-			changeState(kButtonDownCol);
-			return true;
-		}
-		if (event.type == Common::EVENT_LBUTTONUP) {
-			changeState(kButtonUpCol);
-			return true;
-		}
-
-		return false;
-	}
-
-	Common::Point getPos() {
-		return _pos;
-	}
-
-	bool canSelectDraggable() {
-		return _state == kCursorSCDrag;
-	}
+	void tick();
+	bool processEvent(const Common::Event &event);
+	Common::Point getPos();
+	bool canSelectDraggable();
 
 private:
 
-	void changeState(CursorInput input) {
-		debugC(3, kMVDebugGUI, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
-		if (_state != _transitionTable[_state][input]) {
-			executeStateOut();
-			_state = _transitionTable[_state][input];
-			executeStateIn();
-		}
-	}
-
-	void executeStateIn() {
-		switch (_state) {
-		case kCursorSCStart:
-			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
-			_gui->selectForDrag(_pos);
-			break;
-		case kCursorDCStart:
-			g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
-			break;
-		case kCursorSCSink:
-			_gui->handleSingleClick();
-			changeState(kTickCol);
-			break;
-		default:
-			break;
-		}
-	}
-
-	void executeStateOut() {
-		switch (_state) {
-		case kCursorIdle:
-			break;
-		case kCursorSCStart:
-			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
-			break;
-		case kCursorSCDrag:
-			_gui->handleSingleClick();
-			break;
-		case kCursorDCStart:
-			g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
-			break;
-		case kCursorDCDo:
-			_gui->handleDoubleClick();
-			break;
-		default:
-			break;
-		}
-	}
+	void changeState(CursorInput input);
+	void executeStateIn();
+	void executeStateOut();
 
 
 private:
@@ -377,10 +284,6 @@ private:
 	ClickState _state;
 };
 
-static void cursorTimerHandler(void *refCon) {
-	Cursor *cursor = (Cursor *)refCon;
-	cursor->tick();
-}
 
 
 enum {
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index a472c68..f4d46b0 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -24,7 +24,7 @@
 
 namespace MacVenture {
 
-PPICHuff PPIC1Huff = {
+static const PPICHuff PPIC1Huff = {
 	// Masks
 	{ 0x0000,0x2000,0x4000,0x5000,0x6000,0x7000,0x8000,0x9000,0xa000,
 	0xb000,0xc000,0xd000,0xd800,0xe000,0xe800,0xf000,0xf800 },
@@ -35,7 +35,7 @@ PPICHuff PPIC1Huff = {
 	0x02,0x04,0x0b,0x0d,0xe }
 };
 
-PPICHuff PPIC2Huff = {
+static const PPICHuff PPIC2Huff = {
 	// Masks
 	{ 0x0000,0x4000,0x8000,0xc000,0xc800,0xd000,0xd800,0xe000,0xe800,
 	0xf000,0xf400,0xf600,0xf800,0xfa00,0xfc00,0xfe00,0xff00 },
@@ -47,18 +47,19 @@ PPICHuff PPIC2Huff = {
 };
 
 // Used to load the huffman table in PPIC3 decoding
-byte loadBits[] = {
-		0x08, 0x0f, 0x02, 0xff, 0x00,
-		0x04, 0xff, 0x01,
-		0x07, 0x09, 0x08, 0xff, 0x03,
-		0x04, 0xff, 0x04,
-		0x0a, 0x07, 0x0a, 0x0b, 0x06, 0xff, 0x05,
-		0x06, 0x06, 0x0b, 0xff, 0x07,
-		0x03, 0xff, 0x09,
-		0x04, 0x03, 0x0e, 0xff, 0x0c,
-		0x02, 0xff, 0x0d,
-		0x01, 0xff, 0x0f,
-		0xff };
+static const byte loadBits[] = {
+	0x08, 0x0f, 0x02, 0xff, 0x00,
+	0x04, 0xff, 0x01,
+	0x07, 0x09, 0x08, 0xff, 0x03,
+	0x04, 0xff, 0x04,
+	0x0a, 0x07, 0x0a, 0x0b, 0x06, 0xff, 0x05,
+	0x06, 0x06, 0x0b, 0xff, 0x07,
+	0x03, 0xff, 0x09,
+	0x04, 0x03, 0x0e, 0xff, 0x0c,
+	0x02, 0xff, 0x0d,
+	0x01, 0xff, 0x0f,
+	0xff
+};
 
 ImageAsset::ImageAsset(ObjID original, Container * container) {
 	_id = (original * 2);
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index ee24026..44b0fa0 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -2,6 +2,7 @@ MODULE := engines/macventure
 
 MODULE_OBJS := \
 	controls.o \
+	cursor.o \
 	datafiles.o \
 	detection.o \
 	dialog.o \


Commit: b1eb6da6fab27b215ffd339ccef7e43169ad0a17
    https://github.com/scummvm/scummvm/commit/b1eb6da6fab27b215ffd339ccef7e43169ad0a17
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:23+02:00

Commit Message:
MACVENTURE: Add prefixes to error messages

Changed paths:
    engines/macventure/container.h
    engines/macventure/datafiles.cpp
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/menu.cpp
    engines/macventure/saveload.cpp
    engines/macventure/stringtable.h
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index b65c157..6b9c646 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -46,7 +46,7 @@ public:
 		_filename = filename;
 
 		if (!_file.open(_filename))
-			error("Could not open %s", _filename.c_str());
+			error("CONTAINER: Could not open %s", _filename.c_str());
 
 		_res = _file.readStream(_file.size());
 		_header = _res->readUint32BE();
diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index a86e922..9532434 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -67,7 +67,7 @@ Common::String windowTypeName(MVWindowType windowType) {
 void MacVentureEngine::loadDataBundle() {
 	_dataBundle = Common::makeZipArchive(MACVENTURE_DATA_BUNDLE);
 	if (!_dataBundle)
-		error("Couldn't load data bundle '%s'.", MACVENTURE_DATA_BUNDLE.c_str());
+		error("ENGINE: Couldn't load data bundle '%s'.", MACVENTURE_DATA_BUNDLE.c_str());
 }
 
 Common::SeekableReadStream *MacVentureEngine::getBorderFile(MVWindowType windowType, bool isActive) {
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 310cf92..264e577 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -152,21 +152,21 @@ void Gui::initGUI() {
 	// Menu
 	_menu = _wm.addMenu();
 	if (!loadMenus())
-		error("Could not load menus");
+		error("GUI: Could not load menus");
 	_menu->setCommandsCallback(menuCommandsCallback, this);
 	_menu->calcDimensions();
 
 	loadGraphics();
 
 	if (!loadWindows())
-		error("Could not load windows");
+		error("GUI: Could not load windows");
 
 	initWindows();
 
 	assignObjReferences();
 
 	if (!loadControls())
-		error("Could not load controls");
+		error("GUI: Could not load controls");
 
 	draw();
 
@@ -960,7 +960,7 @@ WindowData & Gui::findWindowData(WindowReference reference) {
 	if (iter->refcon == reference)
 		return *iter;
 
-	error("Could not locate the desired window data");
+	error("GUI: Could not locate the desired window data");
 }
 
 Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 0542665..ef2b7fa 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -143,11 +143,11 @@ Common::Error MacVentureEngine::run() {
 
 	_resourceManager = new Common::MacResManager();
 	if (!_resourceManager->open(getGameFileName()))
-		error("Could not open %s as a resource fork", getGameFileName());
+		error("ENGINE: Could not open %s as a resource fork", getGameFileName());
 
 	// Engine-wide loading
 	if (!loadGlobalSettings())
-		error("Could not load the engine settings");
+		error("ENGINE: Could not load the engine settings");
 
 	_oldTextEncoding = !loadTextHuffman();
 
@@ -170,7 +170,7 @@ Common::Error MacVentureEngine::run() {
 	int directSaveSlotLoading = ConfMan.getInt("save_slot");
 	if (directSaveSlotLoading >= 0) {
 		if (loadGameState(directSaveSlotLoading).getCode() != Common::kNoError) {
-			error("Could not load game from slot '%d'", directSaveSlotLoading);
+			error("ENGINE: Could not load game from slot '%d'", directSaveSlotLoading);
 		}
 	} else {
 		setNewGameState();
diff --git a/engines/macventure/menu.cpp b/engines/macventure/menu.cpp
index dd3c495..ea80104 100644
--- a/engines/macventure/menu.cpp
+++ b/engines/macventure/menu.cpp
@@ -35,7 +35,7 @@ Menu::Menu(MacVentureEngine *engine, Graphics::MacWindowManager *wm) {
 	_menu = _wm->addMenu();
 
 	if (!loadMenuData())
-		error("Could not load menu data from %s", _engine->getGameFileName());
+		error("GUI: Could not load menu data from %s", _engine->getGameFileName());
 }
 
 Menu::~Menu() {
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index 54009a1..a341487 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -75,7 +75,7 @@ Common::Error MacVentureEngine::loadGameState(int slot) {
 	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
 	Common::InSaveFile *file;
 	if(!(file = getSaveFileManager()->openForLoading(saveFileName))) {
-		error("missing savegame file %s", saveFileName.c_str());
+		error("ENGINE: Missing savegame file %s", saveFileName.c_str());
 	}
 	_world->loadGameFrom(file);
 	reset();
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index 0a5419e..a03fb28 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -47,7 +47,7 @@ public:
 		_id = id;
 
 		if (!loadStrings())
-			error("Could not load string table %x", id);
+			error("ENGINE: Could not load string table %x", id);
 	}
 
 	~StringTable() {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 35cfbd1..4ef5509 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -37,11 +37,11 @@ void World::startNewGame() {
 		delete _saveGame;
 
 	if ((_startGameFileName = _engine->getStartGameFileName()) == "")
-		error("Could not load initial game configuration");
+		error("WORLD: Could not load initial game configuration");
 
 	Common::File saveGameFile;
 	if (!saveGameFile.open(_startGameFileName))
-		error("Could not load initial game configuration");
+		error("WORLD: Could not load initial game configuration");
 
 	debug("Loading save game state from %s", _startGameFileName.c_str());
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());


Commit: 1c687a7e2c1a848de426a23180c80e07dd4bd135
    https://github.com/scummvm/scummvm/commit/1c687a7e2c1a848de426a23180c80e07dd4bd135
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Remove unused files

Changed paths:
  R engines/macventure/menu.cpp
  R engines/macventure/menu.h



diff --git a/engines/macventure/menu.cpp b/engines/macventure/menu.cpp
deleted file mode 100644
index ea80104..0000000
--- a/engines/macventure/menu.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-#include "macventure/menu.h"
-#include "macventure/macventure.h"
-
-#include "common/file.h"
-#include "graphics/macgui/macwindowmanager.h"
-
-namespace MacVenture {
-
-Menu::Menu(MacVentureEngine *engine, Graphics::MacWindowManager *wm) {
-
-	_engine = engine;
-	_wm = wm;
-
-	_menu = _wm->addMenu();
-
-	if (!loadMenuData())
-		error("GUI: Could not load menu data from %s", _engine->getGameFileName());
-}
-
-Menu::~Menu() {
-	delete _
-}
-
-void Menu::draw() {
-
-}
-
-bool Menu::loadMenuData() {
-
-}
-
-} // End of namespace MacVenture
\ No newline at end of file
diff --git a/engines/macventure/menu.h b/engines/macventure/menu.h
deleted file mode 100644
index dab6369..0000000
--- a/engines/macventure/menu.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef MACVENTURE_MENU_H
-#define MACVENTURE_MENU_H
-
-namespace MacVenture {
-
-class MacVentureEngine;
-
-class Graphics::MacWindowManager;
-
-class Menu {
-
-public:
-	Menu(MacVentureEngine *engine, Graphics::MacWindowManager *wm);
-	~Menu();
-
-	void draw();
-
-private: // Attributes
-
-	MacVentureEngine *_engine;
-	Graphics::MacWindowManager *_wm;
-	Graphics::Menu *_menu;
-
-private: // Methods
-
-	void init();
-	bool loadMenuData();
-
-};
-
-} // End of namespace MacVenture
-
-#endif
-


Commit: b24c04736c377be9bdf9142e852dd6ff6afb8a0e
    https://github.com/scummvm/scummvm/commit/b24c04736c377be9bdf9142e852dd6ff6afb8a0e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Extract implementation of Container

Changed paths:
  A engines/macventure/container.cpp
    engines/macventure/container.h
    engines/macventure/module.mk



diff --git a/engines/macventure/container.cpp b/engines/macventure/container.cpp
new file mode 100644
index 0000000..73f706a
--- /dev/null
+++ b/engines/macventure/container.cpp
@@ -0,0 +1,180 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "macventure/container.h"
+
+namespace MacVenture {
+
+Container::Container(Common::String filename) {
+	_filename = filename;
+
+	if (!_file.open(_filename))
+		error("CONTAINER: Could not open %s", _filename.c_str());
+
+	_res = _file.readStream(_file.size());
+	_header = _res->readUint32BE();
+	_simplified = false;
+
+	for (uint i = 0; i < 16; ++i)
+		_huff.push_back(0);
+
+	for (uint i = 0; i < 16; ++i)
+		_lens.push_back(0);
+
+	if (!(_header & 0x80000000)) {
+		// Is simplified container
+		_simplified = true;
+		int dataLen = _res->size() - sizeof(_header);
+		_lenObjs = _header;
+		_numObjs = dataLen / _lenObjs;
+	} else {
+		_header &= 0x7fffffff;
+		_res->seek(_header, SEEK_SET);
+		_numObjs = _res->readUint16BE();
+
+		for (uint i = 0; i < 15; ++i)
+			_huff[i] = _res->readUint16BE();
+
+		for (uint i = 0; i < 16; ++i)
+			_lens[i] = _res->readByte();
+
+		// Read groups
+		uint numGroups = _numObjs / 64;
+		if ((_numObjs % 64) > 0)
+			numGroups++;
+
+		for (uint i = 0; i < numGroups; ++i) {
+			ItemGroup group;
+
+			// Place myself in the correct position to read group
+			_res->seek(_header + (i * 6) + 0x30, SEEK_SET);
+			byte b1, b2, b3;
+			b1 = _res->readByte();
+			b2 = _res->readByte();
+			b3 = _res->readByte();
+			group.bitOffset = (b1 << 16) + (b2 << 8) + (b3 << 0);
+
+			b1 = _res->readByte();
+			b2 = _res->readByte();
+			b3 = _res->readByte();
+			group.offset = (b1 << 16) + (b2 << 8) + (b3 << 0);
+
+			// Place the bit reader in the correct position
+			// group.bitOffset indicates the offset from the start of the subHeader
+			_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);
+			uint32 bits = group.bitOffset & 7;
+
+			for (uint j = 0; j < 64; ++j) {
+				uint32 length = 0;
+				uint32 mask = 0;
+				mask = _res->readUint32BE();
+				mask >>= (16 - bits);
+				mask &= 0xFFFF;
+				debugC(11, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
+				_res->seek(-4, SEEK_CUR);
+				// Look in the Huffman table
+				int x = 0;
+				for (x = 0; x < 16; x++) {
+					if (_huff[x] > mask) break;
+				}
+
+				// I will opt to copy the code from webventure,
+				// But according to the docs, this call should suffice:
+				// length = bitStream.getBits(_lens[x]);
+				// The problem is that _lens[] usually contains values larger
+				// Than 32, so we have to read them with the method below
+
+				//This code below, taken from the implementation, seems to give the same results.
+
+				uint32 bitSize = _lens[x];
+				bits += bitSize & 0xF;
+				if (bits & 0x10) {
+					bits &= 0xF;
+					_res->seek(2, SEEK_CUR);
+				}
+				bitSize >>= 4;
+				if (bitSize) {
+					length = _res->readUint32BE();
+					_res->seek(-4, SEEK_CUR);
+					bitSize--;
+					if (bitSize == 0) length = 0;
+					else length >>= (32 - bitSize) - bits;
+					length &= (1 << bitSize) - 1;
+					length |= 1 << bitSize;
+					bits += bitSize;
+					if (bits & 0x10) {
+						bits &= 0xF;
+						_res->seek(2, SEEK_CUR);
+					}
+				}
+
+				group.lengths[j] = length;
+				debugC(11, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
+			}
+
+			_groups.push_back(group);
+		}
+	}
+}
+
+Container::~Container() {
+
+	if (_file.isOpen())
+		_file.close();
+
+	if (_res)
+		delete _res;
+}
+
+uint32 Container::getItemByteSize(uint32 id) {
+	if (_simplified) {
+		return _lenObjs;
+	} else {
+		uint32 groupID = (id >> 6);
+		uint32 objectIndex = id & 0x3f; // Index within the group
+		return _groups[groupID].lengths[objectIndex];
+	}
+}
+
+Common::SeekableReadStream *Container::getItem(uint32 id) {
+	if (_simplified) {
+		_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
+	} else {
+		uint32 groupID = (id >> 6);
+		uint32 objectIndex = id & 0x3f; // Index within the group
+
+		uint32 offset = 0;
+		for (uint i = 0; i < objectIndex; i++) {
+			offset += _groups[groupID].lengths[i];
+		}
+
+		_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
+
+	}
+
+	// HACK Should Limit the size of the stream returned
+	Common::SeekableReadStream *res = _res->readStream(_res->size() - _res->pos() + 1);
+	return res;
+}
+
+
+} // End of namespace MacVenture
diff --git a/engines/macventure/container.h b/engines/macventure/container.h
index 6b9c646..e630bdf 100644
--- a/engines/macventure/container.h
+++ b/engines/macventure/container.h
@@ -42,164 +42,19 @@ typedef uint32 ContainerHeader;
 class Container {
 
 public:
-	Container(Common::String filename) {
-		_filename = filename;
-
-		if (!_file.open(_filename))
-			error("CONTAINER: Could not open %s", _filename.c_str());
-
-		_res = _file.readStream(_file.size());
-		_header = _res->readUint32BE();
-		_simplified = false;
-
-		for (uint i = 0; i < 16; ++i)
-			_huff.push_back(0);
-
-		for (uint i = 0; i < 16; ++i)
-			_lens.push_back(0);
-
-		if (!(_header & 0x80000000)) {
-			// Is simplified container
-			_simplified = true;
-			int dataLen = _res->size() - sizeof(_header);
-			_lenObjs = _header;
-			_numObjs = dataLen / _lenObjs;
-		} else {
-			_header &= 0x7fffffff;
-			_res->seek(_header, SEEK_SET);
-			_numObjs = _res->readUint16BE();
-
-			for (uint i = 0; i < 15; ++i)
-				_huff[i] = _res->readUint16BE();
-
-			for (uint i = 0; i < 16; ++i)
-				_lens[i] = _res->readByte();
-
-			// Read groups
-			uint numGroups = _numObjs / 64;
-			if ((_numObjs % 64) > 0)
-				numGroups++;
-
-			for (uint i = 0; i < numGroups; ++i) {
-				ItemGroup group;
-
-				// Place myself in the correct position to read group
-				_res->seek(_header + (i * 6) + 0x30, SEEK_SET);
-				byte b1, b2, b3;
-				b1 = _res->readByte();
-				b2 = _res->readByte();
-				b3 = _res->readByte();
-				group.bitOffset = (b1 << 16) + (b2 << 8) + (b3 << 0);
-
-				b1 = _res->readByte();
-				b2 = _res->readByte();
-				b3 = _res->readByte();
-				group.offset = (b1 << 16) + (b2 << 8) + (b3 << 0);
-
-				// Place the bit reader in the correct position
-				// group.bitOffset indicates the offset from the start of the subHeader
-				_res->seek(_header + (group.bitOffset >> 3), SEEK_SET);
-				uint32 bits = group.bitOffset & 7;
-
-				for (uint j = 0; j < 64; ++j) {
-					uint32 length = 0;
-					uint32 mask = 0;
-					mask = _res->readUint32BE();
-					mask >>= (16 - bits);
-					mask &= 0xFFFF;
-					debugC(11, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
-					_res->seek(-4, SEEK_CUR);
-					// Look in the Huffman table
-					int x = 0;
-					for (x = 0; x < 16; x++) {
-						if (_huff[x] > mask) break;
-					}
-
-					// I will opt to copy the code from webventure,
-					// But according to the docs, this call should suffice:
-					// length = bitStream.getBits(_lens[x]);
-					// The problem is that _lens[] usually contains values larger
-					// Than 32, so we have to read them with the method below
-
-					//This code below, taken from the implementation, seems to give the same results.
-
-					uint32 bitSize = _lens[x];
-					bits += bitSize & 0xF;
-					if (bits & 0x10) {
-						bits &= 0xF;
-						_res->seek(2, SEEK_CUR);
-					}
-					bitSize >>= 4;
-					if (bitSize) {
-						length = _res->readUint32BE();
-						_res->seek(-4, SEEK_CUR);
-						bitSize--;
-						if (bitSize == 0) length = 0;
-						else length >>= (32 - bitSize) - bits;
-						length &= (1 << bitSize) - 1;
-						length |= 1 << bitSize;
-						bits += bitSize;
-						if (bits & 0x10) {
-							bits &= 0xF;
-							_res->seek(2, SEEK_CUR);
-						}
-					}
-
-					group.lengths[j] = length;
-					debugC(11, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
-				}
-
-				_groups.push_back(group);
-			}
-		}
-	}
-
-	~Container() {
-
-		if (_file.isOpen())
-			_file.close();
-
-		if (_res)
-			delete _res;
-	}
+	Container(Common::String filename);
+	~Container();
 
 public:
 	/**
 	* Must be called before retrieving an object.
 	*/
-	uint32 getItemByteSize(uint32 id) {
-		if (_simplified) {
-			return _lenObjs;
-		} else {
-			uint32 groupID = (id >> 6);
-			uint32 objectIndex = id & 0x3f; // Index within the group
-			return _groups[groupID].lengths[objectIndex];
-		}
-	}
+	uint32 getItemByteSize(uint32 id);
 
 	/**
 	* getItemByteSize should be called before this one
 	*/
-	Common::SeekableReadStream *getItem(uint32 id) {
-		if (_simplified) {
-			_res->seek((id * _lenObjs) + sizeof(_header), SEEK_SET);
-		} else {
-			uint32 groupID = (id >> 6);
-			uint32 objectIndex = id & 0x3f; // Index within the group
-
-			uint32 offset = 0;
-			for (uint i = 0; i < objectIndex; i++) {
-				offset += _groups[groupID].lengths[i];
-			}
-
-			_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
-
-		}
-
-		// HACK Should Limit the size of the stream returned
-		Common::SeekableReadStream *res = _res->readStream(_res->size() - _res->pos() + 1);
-		return res;
-	}
+	Common::SeekableReadStream *getItem(uint32 id);
 
 protected:
 
diff --git a/engines/macventure/module.mk b/engines/macventure/module.mk
index 44b0fa0..227eb41 100644
--- a/engines/macventure/module.mk
+++ b/engines/macventure/module.mk
@@ -1,6 +1,7 @@
 MODULE := engines/macventure
 
 MODULE_OBJS := \
+	container.o \
 	controls.o \
 	cursor.o \
 	datafiles.o \


Commit: f928deebaf09e9498da9658f36bf318d67660733
    https://github.com/scummvm/scummvm/commit/f928deebaf09e9498da9658f36bf318d67660733
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Implement quit from menu

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 264e577..9346a1b 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -1134,7 +1134,7 @@ void Gui::handleMenuAction(MenuAction action) {
 		saveGame();
 		break;
 	case MacVenture::kMenuActionQuit:
-		debug("MacVenture Menu Action: Quit");
+		_engine->requestQuit();
 		break;
 	case MacVenture::kMenuActionUndo:
 		warning("Unimplemented MacVenture Menu Action: Undo");


Commit: 34fdec37b26c7328f07f6251263f1c1afc7d1629
    https://github.com/scummvm/scummvm/commit/34fdec37b26c7328f07f6251263f1c1afc7d1629
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Fix debug messages

Changed paths:
    engines/macventure/container.cpp
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/sound.cpp
    engines/macventure/stringtable.h
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.cpp b/engines/macventure/container.cpp
index 73f706a..1781f96 100644
--- a/engines/macventure/container.cpp
+++ b/engines/macventure/container.cpp
@@ -89,7 +89,7 @@ Container::Container(Common::String filename) {
 				mask = _res->readUint32BE();
 				mask >>= (16 - bits);
 				mask &= 0xFFFF;
-				debugC(11, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
+				debugC(4, kMVDebugContainer, "Load mask of object &%d:%d is %x", i, j, mask);
 				_res->seek(-4, SEEK_CUR);
 				// Look in the Huffman table
 				int x = 0;
@@ -128,7 +128,7 @@ Container::Container(Common::String filename) {
 				}
 
 				group.lengths[j] = length;
-				debugC(11, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
+				debugC(4, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
 			}
 
 			_groups.push_back(group);
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 043cd38..27ef224 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -176,7 +176,7 @@ bool DialogButton::doProcessEvent(MacVenture::Dialog *dialog, Common::Event even
 	if (event.type == Common::EVENT_LBUTTONDOWN) {
 		dialog->localize(mouse);
 		if (_bounds.contains(mouse)) {
-			debugC(1, kMVDebugGUI, "Click! Button: %s", _text.c_str());
+			debugC(2, kMVDebugGUI, "Click! Button: %s", _text.c_str());
 			dialog->handleDialogAction(this, _action);
 			return true;
 		}
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 9346a1b..ac429d0 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -472,7 +472,7 @@ bool Gui::loadWindows() {
 		}
 		data.scrollPos = Common::Point(0, 0);
 
-		debugC(4, kMVDebugGUI, "Window loaded: %s", data.title.c_str());
+		debugC(1, kMVDebugGUI, "Window loaded: %s", data.title.c_str());
 
 		_windowData->push_back(data);
 
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index ef2b7fa..2c91680 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -36,7 +36,7 @@ namespace MacVenture {
 
 // HACK, see below
 void toASCII(Common::String &str) {
-	debugC(1, kMVDebugMain, "toASCII: %s", str.c_str());
+	debugC(3, kMVDebugMain, "toASCII: %s", str.c_str());
 	Common::String::iterator it = str.begin();
 	for (; it != str.end(); it++) {
 		if (*it == '\216') { str.replace(it, it + 1, "e"); }
@@ -506,7 +506,7 @@ void MacVentureEngine::processEvents() {
 }
 
 bool MacVenture::MacVentureEngine::runScriptEngine() {
-	debugC(4, kMVDebugMain, "MAIN: Running script engine");
+	debugC(3, kMVDebugMain, "Running script engine");
 	if (_haltedAtEnd) {
 		_haltedAtEnd = false;
 		if (_scriptEngine->resume(false)) {
@@ -754,7 +754,7 @@ void MacVentureEngine::highlightExit(ObjID objID) {
 void MacVentureEngine::selectPrimaryObject(ObjID objID) {
 	if (objID == _destObject) return;
 	int idx;
-	debugC(5, kMVDebugMain, "Select primary object (%d)", objID);
+	debugC(4, kMVDebugMain, "Select primary object (%d)", objID);
 	if (_destObject > 0 &&
 		(idx = findObjectInArray(_destObject, _currentSelection)) != -1) {
 		unselectAll();
@@ -776,8 +776,7 @@ void MacVentureEngine::focusObjectWindow(ObjID objID) {
 }
 
 void MacVentureEngine::openObject(ObjID objID) {
-
-	debugC(1, kMVDebugMain, "Open Object[%d] parent[%d] x[%d] y[%d]",
+	debugC(3, kMVDebugMain, "Open Object[%d] parent[%d] x[%d] y[%d]",
 		objID,
 		_world->getObjAttr(objID, kAttrParentObject),
 		_world->getObjAttr(objID, kAttrPosX),
@@ -807,7 +806,7 @@ void MacVentureEngine::closeObject(ObjID objID) {
 void MacVentureEngine::checkObject(QueuedObject old) {
 	//warning("checkObject: unimplemented");
 	bool hasChanged = false;
-	debugC(1, kMVDebugMain, "Check Object[%d] parent[%d] x[%d] y[%d]",
+	debugC(3, kMVDebugMain, "Check Object[%d] parent[%d] x[%d] y[%d]",
 		old.object,
 		old.parent,
 		old.x,
@@ -874,7 +873,7 @@ void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
 	WindowReference from = getObjWindow(fromID);
 	WindowReference to = getObjWindow(toID);
 	WindowReference tmp = to;
-	debugC(1, kMVDebugMain, "Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
+	debugC(3, kMVDebugMain, "Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
 		fromID, toID, from, to);
 
 	if (!to) {
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index c743e49..c88ac0b 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -51,14 +51,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
 	frame.haltedInFirst = false;
 	frame.haltedInFamily = false;
 	_frames.push_back(frame);
-	debugC(3, kMVDebugScript, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
+	debugC(3, kMVDebugScript, "Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
 		_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
 
 	return resume(true);
 }
 
 bool ScriptEngine::resume(bool execAll) {
-	debugC(3, kMVDebugScript, "SCRIPT: Resume");
+	debugC(3, kMVDebugScript, "Resume Script");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
 		if (fail) return true;
@@ -146,7 +146,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 
 bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 	if (_scripts->getItemByteSize(scriptID) > 0) {
-		debugC(2, kMVDebugScript, "SCRIPT: Loading function %d", scriptID);
+		debugC(2, kMVDebugScript, "Loading function %d", scriptID);
 		// Insert the new script at the front
 		frame->scripts.push_front(ScriptAsset(scriptID, _scripts));
 		return runFunc(frame);
@@ -169,7 +169,7 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 	byte op;
 	while (script.hasNext()) {
 		op = script.fetch();
-		debugC(3, kMVDebugScript, "SCRIPT: I'm running operation %d", op);
+		debugC(4, kMVDebugScript, "Running operation %d", op);
 		if (!(op & 0x80)) {
 			state->push(op);
 		} else {
@@ -921,12 +921,12 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
-	debugC(2, kMVDebugScript, "SCRIPT: Call function: %d", id);
+	debugC(2, kMVDebugScript, "Call function: %d", id);
 	if (loadScript(frame, id))
 		return true;
 	frame->scripts.pop_front();
 	script = frame->scripts.front();
-	debugC(2, kMVDebugScript, "SCRIPT: Return from fuction %d", id);
+	debugC(2, kMVDebugScript, "Return from fuction %d", id);
 	return false;
 }
 
@@ -1207,7 +1207,7 @@ void ScriptAsset::loadInstructions() {
 		_instructions.push_back(res->readByte());
 	}
 	delete res;
-	debugC(2, kMVDebugScript, "SCRIPT: Load %d instructions for script %d", amount, _id);
+	debugC(2, kMVDebugScript, "Load %d instructions for script %d", amount, _id);
 }
 
 } // End of namespace MacVenture
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index eb09416..590da2e 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -61,9 +61,8 @@ void SoundManager::ensureLoaded(ObjID sound) {
 
 SoundAsset::SoundAsset(Container *container, ObjID id) :
 	_container(container), _id(id), _length(0), _frequency(1) {
-	debug("SoundAsset::SoundAsset(%d)", _id);
 	if (_container->getItemByteSize(_id) == 0)
-		warning("Trying to load an empty sound asset.");
+		warning("Trying to load an empty sound asset (%d).", _id);
 
 	Common::SeekableReadStream *stream = _container->getItem(_id);
 
@@ -101,7 +100,7 @@ SoundAsset::SoundAsset(Container *container, ObjID id) :
 }
 
 SoundAsset::~SoundAsset() {
-	debug("SoundAsset::~SoundAsset(%d)", _id);
+	debugC(3, kMVDebugSound, "~SoundAsset(%d)", _id);
 }
 
 void SoundAsset::play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle) {
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index a03fb28..54aba03 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -85,7 +85,7 @@ private:
 			// HACK until a proper special char implementation is found, this will have to do.
 			Common::String result = Common::String(str);
 			toASCII(result);
-			debugC(5, kMVDebugText, "Loaded string %s", str);
+			debugC(4, kMVDebugText, "Loaded string %s", str);
 			_strings.push_back(Common::String(result));
 			delete[] str;
 		}
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 095b0f3..5a2d029 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -99,7 +99,7 @@ void TextAsset::decodeOld() {
 	}
 
 	str[strLen] = '\0';
-	debugC(3, kMVDebugText, "Decoded %d string (old): %s", _id, str);
+	debugC(3, kMVDebugText, "Decoded string [%d] (old encoding): %s", _id, str);
 	_decoded = Common::String(str);
 }
 
@@ -162,7 +162,7 @@ void TextAsset::decodeHuffman() {
 		}
 	}
 	_decoded += '\0';
-	debugC(4, kMVDebugText, "Decoded %d'th string (new): %s", _id, _decoded.c_str());
+	debugC(3, kMVDebugText, "Decoded string [%d] (new encoding): %s", _id, _decoded.c_str());
 }
 Common::String TextAsset::getNoun(ObjID subval) {
 	ObjID obj;
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 4ef5509..c514ebd 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -43,7 +43,7 @@ void World::startNewGame() {
 	if (!saveGameFile.open(_startGameFileName))
 		error("WORLD: Could not load initial game configuration");
 
-	debug("Loading save game state from %s", _startGameFileName.c_str());
+	debugC(2, kMVDebugMain, "Loading save game state from %s", _startGameFileName.c_str());
 	Common::SeekableReadStream *saveGameRes = saveGameFile.readStream(saveGameFile.size());
 
 	_saveGame = new SaveGame(_engine, saveGameRes);


Commit: e5cf0332f2d08c7f6bc45c1f1fd8edaf276ea76d
    https://github.com/scummvm/scummvm/commit/e5cf0332f2d08c7f6bc45c1f1fd8edaf276ea76d
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Break up one-line ifs and fix braces

Changed paths:
    engines/macventure/container.cpp
    engines/macventure/datafiles.cpp
    engines/macventure/dialog.cpp
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/sound.cpp
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/container.cpp b/engines/macventure/container.cpp
index 1781f96..ff98d69 100644
--- a/engines/macventure/container.cpp
+++ b/engines/macventure/container.cpp
@@ -27,18 +27,21 @@ namespace MacVenture {
 Container::Container(Common::String filename) {
 	_filename = filename;
 
-	if (!_file.open(_filename))
+	if (!_file.open(_filename)) {
 		error("CONTAINER: Could not open %s", _filename.c_str());
+	}
 
 	_res = _file.readStream(_file.size());
 	_header = _res->readUint32BE();
 	_simplified = false;
 
-	for (uint i = 0; i < 16; ++i)
+	for (uint i = 0; i < 16; ++i) {
 		_huff.push_back(0);
+	}
 
-	for (uint i = 0; i < 16; ++i)
+	for (uint i = 0; i < 16; ++i) {
 		_lens.push_back(0);
+	}
 
 	if (!(_header & 0x80000000)) {
 		// Is simplified container
@@ -51,16 +54,19 @@ Container::Container(Common::String filename) {
 		_res->seek(_header, SEEK_SET);
 		_numObjs = _res->readUint16BE();
 
-		for (uint i = 0; i < 15; ++i)
+		for (uint i = 0; i < 15; ++i) {
 			_huff[i] = _res->readUint16BE();
+		}
 
-		for (uint i = 0; i < 16; ++i)
+		for (uint i = 0; i < 16; ++i) {
 			_lens[i] = _res->readByte();
+		}
 
 		// Read groups
 		uint numGroups = _numObjs / 64;
-		if ((_numObjs % 64) > 0)
+		if ((_numObjs % 64) > 0) {
 			numGroups++;
+		}
 
 		for (uint i = 0; i < numGroups; ++i) {
 			ItemGroup group;
@@ -94,7 +100,9 @@ Container::Container(Common::String filename) {
 				// Look in the Huffman table
 				int x = 0;
 				for (x = 0; x < 16; x++) {
-					if (_huff[x] > mask) break;
+					if (_huff[x] > mask) {
+						break;
+					}
 				}
 
 				// I will opt to copy the code from webventure,
@@ -116,8 +124,11 @@ Container::Container(Common::String filename) {
 					length = _res->readUint32BE();
 					_res->seek(-4, SEEK_CUR);
 					bitSize--;
-					if (bitSize == 0) length = 0;
-					else length >>= (32 - bitSize) - bits;
+					if (bitSize == 0) {
+						length = 0;
+					} else {
+						length >>= (32 - bitSize) - bits;
+					}
 					length &= (1 << bitSize) - 1;
 					length |= 1 << bitSize;
 					bits += bitSize;
@@ -126,11 +137,9 @@ Container::Container(Common::String filename) {
 						_res->seek(2, SEEK_CUR);
 					}
 				}
-
 				group.lengths[j] = length;
 				debugC(4, kMVDebugContainer, "Load legth of object %d:%d is %d", i, j, length);
 			}
-
 			_groups.push_back(group);
 		}
 	}
@@ -166,9 +175,7 @@ Common::SeekableReadStream *Container::getItem(uint32 id) {
 		for (uint i = 0; i < objectIndex; i++) {
 			offset += _groups[groupID].lengths[i];
 		}
-
 		_res->seek(_groups[groupID].offset + offset + sizeof(_header), SEEK_SET);
-
 	}
 
 	// HACK Should Limit the size of the stream returned
diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index 9532434..aa47869 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -66,8 +66,9 @@ Common::String windowTypeName(MVWindowType windowType) {
 
 void MacVentureEngine::loadDataBundle() {
 	_dataBundle = Common::makeZipArchive(MACVENTURE_DATA_BUNDLE);
-	if (!_dataBundle)
+	if (!_dataBundle) {
 		error("ENGINE: Couldn't load data bundle '%s'.", MACVENTURE_DATA_BUNDLE.c_str());
+	}
 }
 
 Common::SeekableReadStream *MacVentureEngine::getBorderFile(MVWindowType windowType, bool isActive) {
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 27ef224..7c375d4 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -80,7 +80,9 @@ const Graphics::Font& Dialog::getFont() {
 
 bool Dialog::processEvent(Common::Event event) {
 	for (Common::Array<DialogElement*>::iterator it = _elements.begin(); it != _elements.end(); it++) {
-		if ((*it)->processEvent(this, event)) return true;
+		if ((*it)->processEvent(this, event)) {
+			return true;
+		}
 	}
 	return false;
 }
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index ac429d0..f4cb8ee 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -267,7 +267,9 @@ void Gui::setWindowTitle(WindowReference winID, Common::String string) {
 }
 
 void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array<ObjID> &children) {
-	if (ref == kNoWindow) return;
+	if (ref == kNoWindow) {
+		return;
+	}
 	WindowData &data = findWindowData(ref);
 	data.children.clear();
 	data.objRef = objID;
@@ -284,9 +286,15 @@ void Gui::updateWindowInfo(WindowReference ref, ObjID objID, const Common::Array
 			data.children.push_back(DrawableObject(child, kBlitBIC));
 		}
 	}
-	if (originx != 0x7fff) data.bounds.left = originx;
-	if (originy != 0x7fff) data.bounds.top = originy;
-	if (ref != kMainGameWindow) data.updateScroll = true;
+	if (originx != 0x7fff) {
+		data.bounds.left = originx;
+	}
+	if (originy != 0x7fff) {
+		data.bounds.top = originy;
+	}
+	if (ref != kMainGameWindow) {
+		data.updateScroll = true;
+	}
 }
 
 void Gui::addChild(WindowReference target, ObjID child) {
@@ -297,7 +305,9 @@ void Gui::removeChild(WindowReference target, ObjID child) {
 	WindowData &data = findWindowData(target);
 	uint index = 0;
 	for (;index < data.children.size(); index++) {
-		if (data.children[index].obj == child) break;
+		if (data.children[index].obj == child) {
+			break;
+		}
 	}
 
 	if (index < data.children.size())
@@ -602,7 +612,9 @@ void Gui::drawMainGameWindow() {
 
 void Gui::drawSelfWindow() {
 	drawObjectsInWindow(getWindowData(kSelfWindow), _selfWindow->getSurface());
-	if (_engine->isObjSelected(1)) invertWindowColors(kSelfWindow);
+	if (_engine->isObjSelected(1)) {
+		invertWindowColors(kSelfWindow);
+	}
 	findWindow(kSelfWindow)->setDirty(true);
 }
 
@@ -667,7 +679,9 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 	ObjID child;
 	BlitMode mode;
 
-	if (targetData.children.size() == 0) return;
+	if (targetData.children.size() == 0) {
+		return;
+	}
 
 	Graphics::ManagedSurface composeSurface;
 	createInnerSurface(&composeSurface, surface, border);
@@ -736,12 +750,20 @@ void Gui::drawDraggedObject() {
 		uint h = asset->getHeight() + MIN((int16)0, _draggedObj.pos.y);
 
 		// In case of overflow from the bottom/left
-		if (_draggedObj.pos.x > 0 && _draggedObj.pos.x + w > kScreenWidth) { w = kScreenWidth - _draggedObj.pos.x; }
-		if (_draggedObj.pos.y > 0 && _draggedObj.pos.y + h > kScreenHeight) { h = kScreenHeight - _draggedObj.pos.y; }
+		if (_draggedObj.pos.x > 0 && _draggedObj.pos.x + w > kScreenWidth) {
+			w = kScreenWidth - _draggedObj.pos.x;
+		}
+		if (_draggedObj.pos.y > 0 && _draggedObj.pos.y + h > kScreenHeight) {
+			h = kScreenHeight - _draggedObj.pos.y;
+		}
 
 		Common::Point target = _draggedObj.pos;
-		if (target.x < 0) { target.x = 0; }
-		if (target.y < 0) { target.y = 0; }
+		if (target.x < 0) {
+			target.x = 0;
+		}
+		if (target.y < 0) {
+			target.y = 0;
+		}
 
 		_draggedSurface.create(w, h, _screen.format);
 		_draggedSurface.blitFrom(
@@ -766,11 +788,15 @@ void Gui::drawDraggedObject() {
 }
 
 void Gui::drawDialog() {
-	if (_dialog) _dialog->draw();
+	if (_dialog) {
+		_dialog->draw();
+	}
 }
 
 void Gui::updateWindow(WindowReference winID, bool containerOpen) {
-	if (winID == kNoWindow) return;
+	if (winID == kNoWindow) {
+		return;
+	}
 	if (winID == kSelfWindow || containerOpen) {
 		WindowData &data = findWindowData(winID);
 		if (winID == kCommandsWindow) {
@@ -822,8 +848,9 @@ void Gui::unselectExits() {
 }
 
 void Gui::updateExit(ObjID obj) {
-	if (!_engine->isObjExit(obj)) return;
-
+	if (!_engine->isObjExit(obj)) {
+		return;
+	}
 	BorderBounds border = borderBounds(getWindowData(kExitsWindow).type);
 
 	int ctl = -1;
@@ -943,7 +970,9 @@ Common::Point Gui::getGlobalScrolledSurfacePosition(WindowReference reference) {
 	const WindowData &data = getWindowData(reference);
 	BorderBounds border = borderBounds(data.type);
 	Graphics::MacWindow *win = findWindow(reference);
-	if (!win) return Common::Point(0, 0);
+	if (!win) {
+		return Common::Point(0, 0);
+	}
 	return Common::Point(
 		win->getDimensions().left + border.leftOffset - data.scrollPos.x,
 		win->getDimensions().top + border.topOffset - data.scrollPos.y);
@@ -1010,12 +1039,16 @@ WindowReference Gui::findObjWindow(ObjID objID) {
 	// This is a bit of a HACK, we take advantage of the consecutive nature of references
 	for (uint i = kCommandsWindow; i <= kDiplomaWindow; i++) {
 		const WindowData &data = getWindowData((WindowReference)i);
-		if (data.objRef == objID) { return data.refcon; }
+		if (data.objRef == objID) {
+			return data.refcon;
+		}
 	}
 
 	for (uint i = kInventoryStart; i < _inventoryWindows.size() + kInventoryStart; i++) {
 		const WindowData &data = getWindowData((WindowReference)i);
-		if (data.objRef == objID) { return data.refcon; }
+		if (data.objRef == objID) {
+			return data.refcon;
+		}
 	}
 
 	return kNoWindow;
@@ -1068,7 +1101,9 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point cli
 void Gui::handleDragRelease(bool shiftPressed, bool isDoubleClick) {
 	if (_draggedObj.id != 0) {
 		WindowReference destinationWindow = findWindowAtPoint(_draggedObj.pos);
-		if (destinationWindow == kNoWindow) return;
+		if (destinationWindow == kNoWindow) {
+			return;
+		}
 		if (_draggedObj.hasMoved) {
 			const WindowData &destinationWindowData = getWindowData(destinationWindow);
 			ObjID destObject = destinationWindowData.objRef;
@@ -1246,7 +1281,9 @@ bool Gui::processEvent(Common::Event &event) {
 
 	processed |= _cursor->processEvent(event);
 
-	if (_dialog && _dialog->processEvent(event)) return true;
+	if (_dialog && _dialog->processEvent(event)) {
+		return true;
+	}
 
 	if (event.type == Common::EVENT_MOUSEMOVE) {
 		if (_draggedObj.id != 0) {
@@ -1370,7 +1407,9 @@ bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & ev
 bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (event.type == Common::EVENT_LBUTTONDOWN && click == kBorderCloseButton) {
 		WindowReference ref = findWindowAtPoint(event.mouse);
-		if (ref == kNoWindow) return false;
+		if (ref == kNoWindow) {
+			return false;
+		}
 
 		if (click == kBorderCloseButton) {
 			removeInventoryWindow(ref);
@@ -1384,7 +1423,9 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 	if (event.type == Common::EVENT_LBUTTONDOWN) {
 		// Find the appropriate window
 		WindowReference ref = findWindowAtPoint(event.mouse);
-		if (ref == kNoWindow) return false;
+		if (ref == kNoWindow) {
+			return false;
+		}
 
 		WindowData &data = findWindowData((WindowReference) ref);
 
@@ -1406,7 +1447,9 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
 
 void Gui::selectForDrag(Common::Point cursorPosition) {
 	WindowReference ref = findWindowAtPoint(cursorPosition);
-	if (ref == kNoWindow) return;
+	if (ref == kNoWindow) {
+		return;
+	}
 
 	Graphics::MacWindow *win = findWindow(ref);
 	WindowData &data = findWindowData((WindowReference) ref);
@@ -1418,13 +1461,17 @@ void Gui::selectForDrag(Common::Point cursorPosition) {
 void Gui::handleSingleClick() {
 	debugC(2, kMVDebugGUI, "Registered Single Click");
 	// HACK THERE HAS TO BE A MORE ELEGANT WAY
-	if (_dialog) return;
+	if (_dialog) {
+		return;
+	}
 	handleDragRelease(false, false);
 }
 
 void Gui::handleDoubleClick() {
 	debugC(2, kMVDebugGUI, "Registered Double Click");
-	if (_dialog) return;
+	if (_dialog) {
+		return;
+	}
 	handleDragRelease(false, true);
 }
 
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 28ee85d..4ad1709 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -344,11 +344,15 @@ public:
 	}
 
 	void scrollDown() {
-		if (_scrollPos < (int)(_lines.size() - 1)) _scrollPos++;
+		if (_scrollPos < (int)(_lines.size() - 1)) {
+			_scrollPos++;
+		}
 	}
 
 	void scrollUp() {
-		if (_scrollPos > 0) _scrollPos--;
+		if (_scrollPos > 0) {
+			_scrollPos--;
+		}
 	}
 
 
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index f4d46b0..c1bfd75 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -109,11 +109,17 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 
 	uint8 mode = stream.getBits(3);
 	int w, h;
-	if (stream.getBit()) h = stream.getBits(10);
-	else h = stream.getBits(6);
+	if (stream.getBit()) {
+		h = stream.getBits(10);
+	} else {
+		h = stream.getBits(6);
+	}
 
-	if (stream.getBit()) w = stream.getBits(10);
-	else w = stream.getBits(6);
+	if (stream.getBit()) {
+		w = stream.getBits(10);
+	} else {
+		w = stream.getBits(6);
+	}
 
 	rowBytes = ((w + 0xF) >> 3) & 0xFFFE;
 	bitWidth = w;
@@ -284,8 +290,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 					v = data[pos];
 					pos++;
 				}
-			}
-			else {
+			} else {
 				for (uint x = 0; x < rowBytes; x++) {
 					uint16 val = data[pos] ^ v;
 					val ^= (val >> 4) & 0xf;
@@ -298,7 +303,9 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 	}
 	if (flags & 4) {
 		uint16 delta = rowBytes * 4;
-		if (flags & 2) delta *= 2;
+		if (flags & 2) {
+			delta *= 2;
+		}
 		pos = 0;
 		uint q = delta;
 		for (uint i = 0; i < bitHeight * rowBytes - delta; i++) {
@@ -318,8 +325,9 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 	uint16 dw = stream.peekBits(16);
 	uint16 i = 0;
 	for (;i < 16; i++) {
-		if (huff.masks[i + 1] > dw)
+		if (huff.masks[i + 1] > dw) {
 			break;
+		}
 	}
 	stream.skip(huff.lens[i]);
 	uint8 val = huff.symbols[i];
@@ -351,7 +359,7 @@ byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
 void ImageAsset::blitInto(Graphics::ManagedSurface *target, int x, int y, BlitMode mode) {
 	if (mode == kBlitDirect) {
 		blitDirect(target, x, y, _imgData, _imgBitHeight, _imgBitWidth, _imgRowBytes);
-	} else if (mode < kBlitXOR){
+	} else if (mode < kBlitXOR) {
 		if (_container->getItemByteSize(_mask)) { // Has mask
 			switch (mode) {
 			case MacVenture::kBlitBIC:
@@ -383,35 +391,46 @@ void ImageAsset::blitInto(Graphics::ManagedSurface *target, int x, int y, BlitMo
 }
 
 bool ImageAsset::isPointInside(Common::Point point) {
-	if (point.x >= _maskBitWidth || point.y >= _maskBitHeight) return false;
-	if (_maskData.empty()) return false;
+	if (point.x >= _maskBitWidth || point.y >= _maskBitHeight) {
+		return false;
+	}
+	if (_maskData.empty()) {
+		return false;
+	}
 	// We see if the point lands on the mask.
 	uint pix = _maskData[(point.y * _maskRowBytes) + (point.x >> 3)] & (1 << (7 - (point.x & 7)));
 	return pix != 0;
 }
 
 bool ImageAsset::isRectInside(Common::Rect rect) {
-	// HACK is it &&, or ||?
-	if (_maskData.empty()) return (rect.width() > 0 && rect.height() > 0);
+	if (_maskData.empty()) {
+		return (rect.width() > 0 && rect.height() > 0);
+	}
 
 	for (int y = rect.top; y < rect.top + rect.height(); y++) {
 		uint bmpofs = y * _maskRowBytes;
 		byte pix;
 		for (int x = rect.left; x < rect.left + rect.width(); x++) {
 			pix = _maskData[bmpofs + (x >> 3)] & (1 << (7 - (x & 7)));
-			if (pix) return true;
+			if (pix) {
+				return true;
+			}
 		}
 	}
 	return false;
 }
 
 int ImageAsset::getWidth() {
-	if (_imgData.size() == 0) return 0;
+	if (_imgData.size() == 0) {
+		return 0;
+	}
 	return MAX(0, (int)_imgBitWidth);
 }
 
 int ImageAsset::getHeight() {
-	if (_imgData.size() == 0) return 0;
+	if (_imgData.size() == 0) {
+		return 0;
+	}
 	return MAX(0, (int)_imgBitHeight);
 }
 
@@ -443,7 +462,9 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, cons
 			assert(ox + x <= target->w);
 			assert(oy + y <= target->h);
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
-			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
+			if (pix) {
+				*((byte *)target->getBasePtr(ox + x, oy + y)) = kColorWhite;
+			}
 		}
 	}
 }
@@ -459,7 +480,9 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const
 			assert(ox + x <= target->w);
 			assert(oy + y <= target->h);
 			pix = data[bmpofs + ((x + sx) >> 3)] & (1 << (7 - ((x + sx) & 7)));
-			if (pix) *((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
+			if (pix) {
+				*((byte *)target->getBasePtr(ox + x, oy + y)) = kColorBlack;
+			}
 		}
 	}
 }
@@ -505,7 +528,6 @@ void ImageAsset::calculateSectionInDirection(uint targetWhole, uint originWhole,
 		} else {
 			blittedWhole = (blittedWhole) - ((blittedWhole + originPosition) - targetWhole);
 		}
-
 	}
 	if (originPosition < 0) {
 		if (ABS(originPosition) > (int)blittedWhole) {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 2c91680..7f754c4 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -39,8 +39,12 @@ void toASCII(Common::String &str) {
 	debugC(3, kMVDebugMain, "toASCII: %s", str.c_str());
 	Common::String::iterator it = str.begin();
 	for (; it != str.end(); it++) {
-		if (*it == '\216') { str.replace(it, it + 1, "e"); }
-		if (*it == '\210') { str.replace(it, it + 1, "a"); }
+		if (*it == '\216') {
+			str.replace(it, it + 1, "e");
+		}
+		if (*it == '\210') {
+			str.replace(it, it + 1, "a");
+		}
 	}
 }
 
@@ -687,7 +691,7 @@ void MacVentureEngine::selectObject(ObjID objID) {
 
 void MacVentureEngine::unselectObject(ObjID objID) {
 	int idxCur = findObjectInArray(objID, _currentSelection);
-	if (idxCur != -1){
+	if (idxCur != -1) {
 		_currentSelection.remove_at(idxCur);
 		highlightExit(objID);
 	}
@@ -709,8 +713,11 @@ int MacVentureEngine::findObjectInArray(ObjID objID, const Common::Array<ObjID>
 	bool found = false;
 	uint i = 0;
 	while (i < list.size() && !found) {
-		if (list[i] == objID) found = true;
-		else i++;
+		if (list[i] == objID) {
+			found = true;
+		} else {
+			i++;
+		}
 	}
 	// HACK, should use iterator
 	return found ? i : -1;
@@ -752,7 +759,9 @@ void MacVentureEngine::highlightExit(ObjID objID) {
 }
 
 void MacVentureEngine::selectPrimaryObject(ObjID objID) {
-	if (objID == _destObject) return;
+	if (objID == _destObject) {
+		return;
+	}
 	int idx;
 	debugC(4, kMVDebugMain, "Select primary object (%d)", objID);
 	if (_destObject > 0 &&
@@ -782,7 +791,9 @@ void MacVentureEngine::openObject(ObjID objID) {
 		_world->getObjAttr(objID, kAttrPosX),
 		_world->getObjAttr(objID, kAttrPosY));
 
-	if (getObjWindow(objID)) return;
+	if (getObjWindow(objID)) {
+		return;
+	}
 	if (objID == _world->getObjAttr(1, kAttrParentObject)) {
 		_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
 		_gui->updateWindow(kMainGameWindow, _world->getObjAttr(objID, kAttrContainerOpen));
@@ -850,14 +861,20 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 	ObjID cur = id;
 	ObjID root = _world->getObjAttr(1, kAttrParentObject);
 	while (cur != root)	{
-		if (cur == 0 || !_world->getObjAttr(cur, kAttrContainerOpen)) break;
+		if (cur == 0 || !_world->getObjAttr(cur, kAttrContainerOpen)) {
+			break;
+		}
 		cur = _world->getObjAttr(cur, kAttrParentObject);
 	}
 	if (cur == root) {
-		if (win) return;
+		if (win) {
+			return;
+		}
 		enqueueObject(kOpenWindow, id); //open
 	} else {
-		if (!win) return;
+		if (!win) {
+			return;
+		}
 		enqueueObject(kCloseWindow, id); //close
 	}
 
@@ -904,7 +921,9 @@ void MacVentureEngine::zoomObject(ObjID objID) {
 bool MacVentureEngine::isObjEnqueued(ObjID objID) {
 	Common::Array<QueuedObject>::const_iterator it;
 	for (it = _objQueue.begin(); it != _objQueue.end(); it++) {
-		if ((*it).object == objID) return true;
+		if ((*it).object == objID) {
+			return true;
+		}
 	}
 	return false;
 }
@@ -1049,9 +1068,13 @@ WindowReference MacVentureEngine::getObjWindow(ObjID objID) {
 }
 
 WindowReference MacVentureEngine::findParentWindow(ObjID objID) {
-	if (objID == 1) return kSelfWindow;
+	if (objID == 1) {
+		return kSelfWindow;
+	}
 	ObjID parent = _world->getObjAttr(objID, kAttrParentObject);
-	if (parent == 0) return kNoWindow;
+	if (parent == 0) {
+		return kNoWindow;
+	}
 	return getObjWindow(parent);
 }
 
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index c88ac0b..f7e49c6 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -61,7 +61,9 @@ bool ScriptEngine::resume(bool execAll) {
 	debugC(3, kMVDebugScript, "Resume Script");
 	while (_frames.size()) {
 		bool fail = execFrame(execAll);
-		if (fail) return true;
+		if (fail) {
+			return true;
+		}
 	}
 	return false;
 }
@@ -80,8 +82,11 @@ bool ScriptEngine::execFrame(bool execAll) {
 	// Do first dispatch script (script 0)
 	if (frame->haltedInFirst || doFirst) { // We were stuck or it's the first time
 		frame->haltedInFirst = false;
-		if (doFirst) { fail = loadScript(frame, 0); }
-		else { fail = resumeFunc(frame); }
+		if (doFirst) {
+			fail = loadScript(frame, 0);
+		} else {
+			fail = resumeFunc(frame);
+		}
 		if (fail) {
 			frame->haltedInFirst = true;
 			_engine->preparedToRun();
@@ -97,7 +102,9 @@ bool ScriptEngine::execFrame(bool execAll) {
 		Common::Array<ObjID> family = _world->getFamily(_world->getObjAttr(1, kAttrParentObject), false);
 		uint32 i = frame->familyIdx;
 		for (; i < family.size(); i++) {
-			if (doFamily) { fail = loadScript(frame, family[i]); }
+			if (doFamily) {
+				fail = loadScript(frame, family[i]);
+			}
 			else { fail = resumeFunc(frame); }
 			if (fail) { // We are stuck, so we don't shift the frame
 				frame->haltedInFamily = true;
@@ -123,8 +130,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 	uint localHigh = 0;
 	do { // Saved function calls
 		highest = 0;
-		for (uint i = 0; i <frame->saves.size(); i++)
-		{
+		for (uint i = 0; i <frame->saves.size(); i++) {
 			if (highest < frame->saves[i].rank) {
 				highest = frame->saves[i].rank;
 				localHigh = i;
@@ -156,7 +162,9 @@ bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 
 bool ScriptEngine::resumeFunc(EngineFrame * frame) {
 	bool fail = runFunc(frame);
-	if (fail) return fail;
+	if (fail) {
+		return fail;
+	}
 	frame->scripts.pop_front();
 	if (frame->scripts.size())
 		return resumeFunc(frame);
@@ -645,12 +653,16 @@ void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
 	word step = neg16(state->pop());
 	word num = neg16(state->pop());
 	step %= num;
-	if (step<0) step += num;
+	if (step < 0) {
+		step += num;
+	}
 	word end = 0;
 	word start = 0;
 	for (word i = 1;i<num;i++) {
 		start += step;
-		if (start >= num) start -= num;
+		if (start >= num) {
+			start -= num;
+		}
 		if (start == end) {
 			end++;
 			start = end;
@@ -710,7 +722,9 @@ void ScriptEngine::op9dDMOD(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::op9eABS(EngineState * state, EngineFrame * frame) {
 	word val = neg16(state->pop());
-	if (val<0) val = -val;
+	if (val < 0) {
+		val = -val;
+	}
 	state->push(val);
 }
 
@@ -837,14 +851,18 @@ void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset
 	val = val | script->fetch();
 	val = neg16(val);
 	word b = state->pop();
-	if (b != 0) script->branch(val);
+	if (b != 0) {
+		script->branch(val);
+	}
 }
 
 void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
-	if (b != 0) script->branch(val);
+	if (b != 0) {
+		script->branch(val);
+	}
 }
 
 void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
@@ -853,14 +871,18 @@ void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset
 	val = val | script->fetch();
 	val = neg16(val);
 	word b = state->pop();
-	if (b == 0) script->branch(val);
+	if (b == 0) {
+		script->branch(val);
+	}
 }
 
 void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
-	if (b == 0) script->branch(val);
+	if (b == 0) {
+		script->branch(val);
+	}
 }
 
 void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
@@ -886,18 +908,22 @@ void ScriptEngine::opb8CLOW(EngineState * state, EngineFrame * frame) {
 
 void ScriptEngine::opb9CHI(EngineState * state, EngineFrame * frame) {
 	word lo = state->pop();
-	for (uint i = 0;i<frame->saves.size();i++)
-		if (frame->saves[i].rank >= lo)
+	for (uint i = 0;i<frame->saves.size();i++) {
+		if (frame->saves[i].rank >= lo) {
 			frame->saves[i].rank = 0;
+		}
+	}
 }
 
 void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
 	word hi = state->pop();
 	word lo = state->pop();
-	for (uint i = 0;i<frame->saves.size();i++)
+	for (uint i = 0;i<frame->saves.size();i++) {
 		if (frame->saves[i].rank >= lo &&
-			frame->saves[i].rank <= hi)
+			frame->saves[i].rank <= hi) {
 			frame->saves[i].rank = 0;
+		}
+	}
 }
 
 bool ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
@@ -942,8 +968,9 @@ void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
 	_world->setObjAttr(to, kAttrContainerOpen, _world->getObjAttr(from, 6));
 	_world->setObjAttr(from, kAttrContainerOpen, 0);
 	Common::Array<ObjID> children = _world->getChildren(from, true);
-	for (uint i = 0; i < children.size(); i++)
+	for (uint i = 0; i < children.size(); i++) {
 		_world->setObjAttr(children[i], 0, to);
+	}
 }
 
 void ScriptEngine::opbfSNOB(EngineState * state, EngineFrame * frame) {
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 590da2e..492bf55 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -104,7 +104,9 @@ SoundAsset::~SoundAsset() {
 }
 
 void SoundAsset::play(Audio::Mixer *mixer, Audio::SoundHandle *soundHandle) {
-	if (_data.size() == 0) return;
+	if (_data.size() == 0) {
+		return;
+	}
 	Audio::AudioStream *sound = Audio::makeRawStream(&_data.front(), _length, _frequency, Audio::FLAG_UNSIGNED, DisposeAfterUse::NO);
 	mixer->playStream(Audio::Mixer::kPlainSoundType, soundHandle, sound);
 }
@@ -127,8 +129,11 @@ void SoundAsset::decode10(Common::SeekableReadStream *stream) {
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
-		if (i & 1) ch >>= 4;
-		else ch = stream->readByte();
+		if (i & 1) {
+			ch >>= 4;
+		} else {
+			ch = stream->readByte();
+		}
 		_data.push_back(wavtable[ch & 0xf]);
 	}
 }
@@ -156,14 +161,18 @@ void SoundAsset::decode12(Common::SeekableReadStream *stream) {
 				ch -= 0x80;
 				uint32 env= ch * scale;
 				ch = (env >> 8) & 0xff;
-				if (ch & 0x80) ch = 0x7f;
+				if (ch & 0x80) {
+					ch = 0x7f;
+				}
 				ch += 0x80;
 			} else {
 				ch = (ch ^ 0xff) + 1;
 				ch -= 0x80;
 				uint32 env = ch * scale;
 				ch = (env >> 8) & 0xff;
-				if (ch & 0x80) ch = 0x7f;
+				if (ch & 0x80) {
+					ch = 0x7f;
+				}
 				ch += 0x80;
 				ch = (ch ^ 0xff) + 1;
 			}
@@ -185,8 +194,11 @@ void SoundAsset::decode18(Common::SeekableReadStream *stream) {
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
-		if (i & 1) ch >>= 4;
-		else ch = stream->readByte();
+		if (i & 1) {
+			ch >>= 4;
+		} else {
+			ch = stream->readByte();
+		}
 		_data.push_back(wavtable[ch & 0xf]);
 	}
 }
@@ -204,8 +216,11 @@ void SoundAsset::decode1a(Common::SeekableReadStream *stream) {
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
-		if (i & 1) ch >>= 4;
-		else ch = stream->readByte();
+		if (i & 1) {
+			ch >>= 4;
+		} else {
+			ch = stream->readByte();
+		}
 		_data.push_back(wavtable[ch & 0xf]);
 	}
 }
@@ -231,8 +246,11 @@ void SoundAsset::decode78(Common::SeekableReadStream *stream) {
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
-		if (i & 1) ch <<= 4;
-		else ch = stream->readByte();
+		if (i & 1) {
+			ch <<= 4;
+		} else {
+			ch = stream->readByte();
+		}
 		_data.push_back(wavtable[(ch >> 4) & 0xf]);
 	}
 }
@@ -250,8 +268,11 @@ void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	uint32 last=0x80;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
-		if (i & 1) ch <<= 4;
-		else ch = stream->readByte();
+		if (i & 1) {
+			ch <<= 4;
+		} else {
+			ch = stream->readByte();
+		}
 		last += wavtable[(ch >> 4) & 0xf];
 		_data.push_back(last & 0xff);
 	}
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 5a2d029..7981692 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -123,7 +123,9 @@ void TextAsset::decodeHuffman() {
 		uint32 entry;
 		// Find the length index
 		for (entry = 0; entry < _huffman->getNumEntries(); entry++) {
-			if (mask < _huffman->getMask(entry)) break;
+			if (mask < _huffman->getMask(entry)) {
+				break;
+			}
 		}
 
 		stream.skip(_huffman->getLength(entry));
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index c514ebd..fc563cb 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -63,7 +63,9 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 		res = _saveGame->getAttr(objID, index);
 	} else {
 		index &= 0x7F;
-		if (objStream->size() == 0) return 0;
+		if (objStream->size() == 0) {
+			return 0;
+		}
 		// Look for the right attribute inside the object
 		objStream->skip(index * 2);
 		res = objStream->readByte() << 8;
@@ -79,8 +81,10 @@ uint32 World::getObjAttr(ObjID objID, uint32 attrID) {
 }
 
 void World::setObjAttr(ObjID objID, uint32 attrID, Attribute value) {
-	if (attrID == kAttrPosX || attrID == kAttrPosY) {}
+	if (attrID == kAttrPosX || attrID == kAttrPosY) {
 		// Round to scale
+		// Intentionally empty, we don't seem to require this functionality
+	}
 
 	if (attrID == kAttrParentObject)
 		setParent(objID, value);
@@ -101,15 +105,24 @@ bool MacVenture::World::isObjActive(ObjID obj) {
 	ObjID destObj = _engine->getDestObject();
 	Common::Point p = _engine->getDeltaPoint();
 	ControlAction selectedControl = _engine->getSelectedControl();
-	if (!getAncestor(obj)) return false; // If our ancestor is the garbage (obj 0), we're inactive
+	if (!getAncestor(obj)) {
+		return false; // If our ancestor is the garbage (obj 0), we're inactive
+	}
 	if (_engine->getInvolvedObjects() >= 2 &&	// If (we need > 1 objs for the command) &&
 		destObj > 0 &&			// we have a destination object &&
-		!getAncestor(destObj))	// but that destination object is in the garbage
+		!getAncestor(destObj)) {	// but that destination object is in the garbage
 		return false;
-	if (selectedControl != kMoveObject) return true; // We only need one
+	}
+	if (selectedControl != kMoveObject) {
+		return true; // We only need one
+	}
 	// Handle move object
-	if (!isObjDraggable(obj)) return false; // We can't move it
-	if (getObjAttr(1, kAttrParentObject) != destObj) return true; // if the target is not the player's parent, we can go
+	if (!isObjDraggable(obj)) {
+		return false; // We can't move it
+	}
+	if (getObjAttr(1, kAttrParentObject) != destObj) {
+		return true; // if the target is not the player's parent, we can go
+	}
 	Common::Rect rect(kScreenWidth, kScreenHeight);
 	rect.top -= getObjAttr(obj, kAttrPosY) + p.y;
 	rect.left -= getObjAttr(obj, kAttrPosX) + p.x;
@@ -173,7 +186,7 @@ void World::releaseChildren(ObjID objID) {
 }
 
 Common::String World::getText(ObjID objID, ObjID source, ObjID target) {
-	if (objID & 0x8000){
+	if (objID & 0x8000) {
 		return _engine->getUserInput();
 	}
 	TextAsset text = TextAsset(_engine, objID, source, target, _gameText, _engine->isOldText(), _engine->getDecodingHuffman());
@@ -203,7 +216,9 @@ void World::calculateObjectRelations() {
 	for (uint i = numObjs - 1; i > 0; i--) {
 		val = parents[i];
 		next = _relations[val * 2];
-		if (next) { _relations[i * 2 + 1] = next; }
+		if (next) {
+			_relations[i * 2 + 1] = next;
+		}
 		_relations[val * 2] = i;
 	}
 }
@@ -231,7 +246,9 @@ void World::setParent(ObjID child, ObjID newParent) {
 }
 
 void World::loadGameFrom(Common::InSaveFile *file) {
-	if (_saveGame) delete _saveGame;
+	if (_saveGame) {
+		delete _saveGame;
+	}
 	_saveGame = new SaveGame(_engine, file);
 	calculateObjectRelations();
 }
@@ -287,7 +304,7 @@ void SaveGame::saveInto(Common::OutSaveFile *file) {
 	warning("Saving the game not yet tested!");
 	// Save attibutes
 	Common::Array<AttributeGroup>::const_iterator itg;
-	for(itg = _groups.begin(); itg != _groups.end(); itg++) {
+	for (itg = _groups.begin(); itg != _groups.end(); itg++) {
 		Common::Array<Attribute>::const_iterator ita;
 		for (ita = itg->begin(); ita != itg->end(); ita++) {
 			file->writeUint16BE((*ita));
@@ -307,8 +324,9 @@ void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *
 	GlobalSettings settings = engine->getGlobalSettings();
 	for (int i = 0; i < settings._numGroups; ++i) {
 		AttributeGroup g;
-		for (int j = 0; j < settings._numObjects; ++j)
+		for (int j = 0; j < settings._numObjects; ++j) {
 			g.push_back(res->readUint16BE());
+		}
 
 		_groups.push_back(g);
 	}


Commit: 8bea8ecb17d6615b8bf095b31cb41d2201f8f8a5
    https://github.com/scummvm/scummvm/commit/8bea8ecb17d6615b8bf095b31cb41d2201f8f8a5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Remove unnecessary comment

Changed paths:
    engines/macventure/controls.h



diff --git a/engines/macventure/controls.h b/engines/macventure/controls.h
index 3f23aa8..0adbf06 100644
--- a/engines/macventure/controls.h
+++ b/engines/macventure/controls.h
@@ -40,7 +40,7 @@ enum ControlType { // HACK, should correspond exactly with the types of controls
 	kControlClickToContinue = 9
 };
 
-enum ControlAction { // HACK, figure out a way to put it in engine
+enum ControlAction {
 	kNoCommand = 0,
 	kStartOrResume = 1,
 	kClose = 2,


Commit: fa815e73adb88bfd42eb2bec8b2afabbc0e8d7ad
    https://github.com/scummvm/scummvm/commit/fa815e73adb88bfd42eb2bec8b2afabbc0e8d7ad
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Fix indentation

Changed paths:
    engines/macventure/dialog.cpp



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 7c375d4..ab77f11 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -49,7 +49,7 @@ void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
 	case kDACloseDialog:
 		_gui->closeDialog();
 		break;
-		case kDASubmit:
+	case kDASubmit:
 		_gui->setTextInput(_userInput);
 		_gui->closeDialog();
 		break;


Commit: ace515643654b07002ee528bbc01f679f699b8cb
    https://github.com/scummvm/scummvm/commit/ace515643654b07002ee528bbc01f679f699b8cb
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Enforce const in prebuilt dialogs

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.h
    engines/macventure/prebuilt_dialogs.cpp
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index ab77f11..c631527 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -31,7 +31,7 @@ Dialog::Dialog(Gui *gui, Common::Point pos, uint width, uint height) :
 
 Dialog::Dialog(Gui *gui, PrebuiltDialogs prebuilt) {
 	_gui = gui;
-	const PrebuiltDialog &dialog = prebuiltDialogs[prebuilt];
+	const PrebuiltDialog &dialog = g_prebuiltDialogs[prebuilt];
 	_bounds = dialog.bounds;
 	for (int i = 0; dialog.elements[i].type != kDEEnd; i++) {
 		addPrebuiltElement(dialog.elements[i]);
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index 2ea38b1..34f99dc 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -33,7 +33,6 @@ namespace MacVenture {
 using namespace Graphics::MacGUIConstants;
 class Gui;
 class DialogElement;
-extern PrebuiltDialog prebuiltDialogs[];
 
 class Dialog {
 public:
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 4ad1709..f521286 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -53,7 +53,6 @@ class ImageAsset;
 class Dialog;
 
 BorderBounds borderBounds(MVWindowType type);
-extern PrebuiltDialog prebuiltDialogs[];
 
 enum MenuAction {
 	kMenuActionAbout,
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index 46b71ab..49f2853 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -24,7 +24,7 @@
 
 namespace MacVenture {
 
-PrebuiltDialog prebuiltDialogs[kPrebuiltDialogCount] = {
+const PrebuiltDialog g_prebuiltDialogs[kPrebuiltDialogCount] = {
 
 	{/* kSaveAsDialog */
 		Common::Rect(0, 146, 456, 254),
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 1c97847..9aff5c7 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -71,6 +71,9 @@ struct PrebuiltDialog {
 	Common::Rect bounds;
 	PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
 };
+
+extern const PrebuiltDialog g_prebuiltDialogs[];
+
 } // End of namespace MacVenture
 
 #endif


Commit: 68b171f328712d39072b5fd133eec93cb1bea3dd
    https://github.com/scummvm/scummvm/commit/68b171f328712d39072b5fd133eec93cb1bea3dd
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Remove constructors from prebuilt dialogs

Changed paths:
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/prebuilt_dialogs.cpp
    engines/macventure/prebuilt_dialogs.h



diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index c631527..383befc 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -32,7 +32,7 @@ Dialog::Dialog(Gui *gui, Common::Point pos, uint width, uint height) :
 Dialog::Dialog(Gui *gui, PrebuiltDialogs prebuilt) {
 	_gui = gui;
 	const PrebuiltDialog &dialog = g_prebuiltDialogs[prebuilt];
-	_bounds = dialog.bounds;
+	calculateBoundsFromPrebuilt(dialog.bounds);
 	for (int i = 0; dialog.elements[i].type != kDEEnd; i++) {
 		addPrebuiltElement(dialog.elements[i]);
 	}
@@ -124,15 +124,16 @@ void Dialog::setUserInput(Common::String content) {
 }
 
 void Dialog::addPrebuiltElement(const MacVenture::PrebuiltDialogElement &element) {
+	Common::Point position(element.left, element.top);
 	switch(element.type) {
 	case kDEButton:
-		addButton(element.title, element.action, element.position, element.width, element.height);
+		addButton(element.title, element.action, position, element.width, element.height);
 		break;
 	case kDEPlainText:
-		addText(element.title, element.position);
+		addText(element.title, position);
 		break;
 	case kDETextInput:
-		addTextInput(element.position, element.width, element.height);
+		addTextInput(position, element.width, element.height);
 		break;
 	default:
 		break;
@@ -241,4 +242,12 @@ void DialogTextInput::doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurfac
 	target.frameRect(_bounds, kColorBlack);
 	dialog->getFont().drawString(&target, _text, _bounds.left, _bounds.top, _bounds.width(), kColorBlack);
 }
+
+void Dialog::calculateBoundsFromPrebuilt(const PrebuiltDialogBounds &bounds) {
+	_bounds = Common::Rect(
+		bounds.left,
+		bounds.top,
+		bounds.right,
+		bounds.bottom);
+}
 } // End of namespace MacVenture
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index 34f99dc..7e85ccc 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -57,6 +57,8 @@ public:
 private:
 	void addPrebuiltElement(const PrebuiltDialogElement &element);
 
+	void calculateBoundsFromPrebuilt(const PrebuiltDialogBounds &bounds);
+
 private:
 	Gui *_gui;
 
diff --git a/engines/macventure/prebuilt_dialogs.cpp b/engines/macventure/prebuilt_dialogs.cpp
index 49f2853..6137fed 100644
--- a/engines/macventure/prebuilt_dialogs.cpp
+++ b/engines/macventure/prebuilt_dialogs.cpp
@@ -27,49 +27,49 @@ namespace MacVenture {
 const PrebuiltDialog g_prebuiltDialogs[kPrebuiltDialogCount] = {
 
 	{/* kSaveAsDialog */
-		Common::Rect(0, 146, 456, 254),
+		{0, 146, 456, 254},
 		{
-			{kDEButton, "YES", kDASaveAs, Common::Point(24, 68), 120, 22},
-			{kDEButton, "NO", kDACloseDialog, Common::Point(168, 68), 120, 22},
-			{kDEButton, "CANCEL", kDACloseDialog, Common::Point(312, 68), 120, 22},
-			{kDEPlainText, "Save As...", kDANone, Common::Point(100, 10), 340, 38},
-			{kDETextInput, "", kDANone, Common::Point(100, 30), 340, 20},
-			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+			{kDEButton, "YES", kDASaveAs, 24, 68, 120, 22},
+			{kDEButton, "NO", kDACloseDialog, 168, 68, 120, 22},
+			{kDEButton, "CANCEL", kDACloseDialog, 312, 68, 120, 22},
+			{kDEPlainText, "Save As...", kDANone, 100, 10, 340, 38},
+			{kDETextInput, "", kDANone, 100, 30, 340, 20},
+			{kDEEnd, "", kDANone, 0, 0, 0, 0}
 		}
 	},
 
 	{ /* kSpeakDialog */
-		Common::Rect(20, 92, 400, 200),
+		{20, 92, 400, 200},
 		{
-			{kDEButton, "OK", kDASubmit, Common::Point(10, 70), 50, 20},
-			{kDEButton, "CANCEL", kDACloseDialog, Common::Point(96, 70), 50, 20},
-			{kDEPlainText, "What would you like to say?", kDANone, Common::Point(10, 10), 400, 20},
-			{kDETextInput, "", kDANone, Common::Point(10, 25), 350, 40},
-			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+			{kDEButton, "OK", kDASubmit, 10, 70, 50, 20},
+			{kDEButton, "CANCEL", kDACloseDialog, 96, 70, 50, 20},
+			{kDEPlainText, "What would you like to say?", kDANone, 10, 10, 400, 20},
+			{kDETextInput, "", kDANone, 10, 25, 350, 40},
+			{kDEEnd, "", kDANone, 0, 0, 0, 0}
 		}
 	},
 
 	{ /* kWinGameDialog */
-		Common::Rect(20, 100, 320, 200),
+		{20, 100, 320, 200},
 		{
-			{kDEPlainText, "You Won!", kDANone, Common::Point(20, 16), 280, 20},
-			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(20, 30), 280, 20},
-			{kDEButton, "New Game", kDANewGame, Common::Point(20, 60), 70, 20},
-			{kDEButton, "Load", kDALoadGame, Common::Point(110, 60), 70, 20},
-			{kDEButton, "Quit", kDAQuit, Common::Point(200, 60), 70, 20},
-			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+			{kDEPlainText, "You Won!", kDANone, 20, 16, 280, 20},
+			{kDEPlainText, "What do you want to do?", kDANone, 20, 30, 280, 20},
+			{kDEButton, "New Game", kDANewGame, 20, 60, 70, 20},
+			{kDEButton, "Load", kDALoadGame, 110, 60, 70, 20},
+			{kDEButton, "Quit", kDAQuit, 200, 60, 70, 20},
+			{kDEEnd, "", kDANone, 0, 0, 0, 0}
 		}
 	},
 
 	{ /* kLoseGameDialog */
-		Common::Rect(20, 100, 320, 200),
+		{20, 100, 320, 200},
 		{
-			{kDEPlainText, "You Died", kDANone, Common::Point(20, 16), 280, 20},
-			{kDEPlainText, "What do you want to do?", kDANone, Common::Point(20, 30), 280, 20},
-			{kDEButton, "New Game", kDANewGame, Common::Point(20, 60), 70, 20},
-			{kDEButton, "Load", kDALoadGame, Common::Point(110, 60), 70, 20},
-			{kDEButton, "Quit", kDAQuit, Common::Point(200, 60), 70, 20},
-			{kDEEnd, "", kDANone, Common::Point(0, 0), 0, 0}
+			{kDEPlainText, "You Died", kDANone, 20, 16, 280, 20},
+			{kDEPlainText, "What do you want to do?", kDANone, 20, 30, 280, 20},
+			{kDEButton, "New Game", kDANewGame, 20, 60, 70, 20},
+			{kDEButton, "Load", kDALoadGame, 110, 60, 70, 20},
+			{kDEButton, "Quit", kDAQuit, 200, 60, 70, 20},
+			{kDEEnd, "", kDANone, 0, 0, 0, 0}
 		}
 	}
 };
diff --git a/engines/macventure/prebuilt_dialogs.h b/engines/macventure/prebuilt_dialogs.h
index 9aff5c7..9cd8f4c 100644
--- a/engines/macventure/prebuilt_dialogs.h
+++ b/engines/macventure/prebuilt_dialogs.h
@@ -52,11 +52,19 @@ enum PrebuiltElementType {
 	kDEEnd
 };
 
+struct PrebuiltDialogBounds {
+	uint left;
+	uint top;
+	uint right;
+	uint bottom;
+};
+
 struct PrebuiltDialogElement {
 	PrebuiltElementType type;
-	Common::String title;
+	const char *title;
 	DialogAction action;
-	Common::Point position;
+	uint left;
+	uint top;
 	uint width;
 	uint height;
 };
@@ -68,7 +76,7 @@ enum {
 };
 
 struct PrebuiltDialog {
-	Common::Rect bounds;
+	PrebuiltDialogBounds bounds;
 	PrebuiltDialogElement elements[kMaxPrebuiltDialogElements];
 };
 


Commit: 19c7bcf9d492dc25ef7458df001accfced21edff
    https://github.com/scummvm/scummvm/commit/19c7bcf9d492dc25ef7458df001accfced21edff
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Fix formatting

Changed paths:
    engines/macventure/controls.cpp
    engines/macventure/controls.h
    engines/macventure/detection.cpp
    engines/macventure/dialog.cpp
    engines/macventure/dialog.h
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.cpp
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/macventure.h
    engines/macventure/saveload.cpp
    engines/macventure/script.cpp
    engines/macventure/script.h
    engines/macventure/sound.cpp
    engines/macventure/stringtable.h
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/controls.cpp b/engines/macventure/controls.cpp
index 898ddac..078ea88 100644
--- a/engines/macventure/controls.cpp
+++ b/engines/macventure/controls.cpp
@@ -59,7 +59,7 @@ bool CommandButton::isInsideBounds(const Common::Point point) const {
 	return _data.bounds.contains(point);
 }
 
-const ControlData& CommandButton::getData() const {
+const ControlData &CommandButton::getData() const {
 	return _data;
 }
 
diff --git a/engines/macventure/controls.h b/engines/macventure/controls.h
index 0adbf06..81b5278 100644
--- a/engines/macventure/controls.h
+++ b/engines/macventure/controls.h
@@ -90,7 +90,7 @@ public:
 
 	void draw(Graphics::ManagedSurface &surface) const;
 	bool isInsideBounds(const Common::Point point) const;
-	const ControlData& getData() const;
+	const ControlData &getData() const;
 	void select();
 	void unselect();
 	bool isSelected();
diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index d0a2940..9329a9a 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -54,14 +54,14 @@ public:
 		_md5Bytes = 5000000; // TODO: Upper limit, adjust it once all games are added
 	}
 
-	virtual const char * getName() const override {
+	virtual const char *getName() const override {
 		return "MacVenture";
 	}
-	virtual const char * getOriginalCopyright() const override {
+	virtual const char *getOriginalCopyright() const override {
 		return "(C) ICOM Simulations";
 	}
 
-	virtual bool createInstance(OSystem * syst, Engine ** engine, const ADGameDescription * desc) const;
+	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
 	virtual bool hasFeature(MetaEngineFeature f) const;
 	virtual SaveStateList listSaves(const char *target) const;
 	virtual int getMaximumSaveSlot() const;
@@ -121,7 +121,7 @@ SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
 
 int MacVentureMetaEngine::getMaximumSaveSlot() const { return 999; }
 
-bool MacVentureMetaEngine::createInstance(OSystem * syst, Engine ** engine, const ADGameDescription *game) const {
+bool MacVentureMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *game) const {
 	if (game) {
 		*engine = new MacVenture::MacVentureEngine(syst, game);
 	}
diff --git a/engines/macventure/dialog.cpp b/engines/macventure/dialog.cpp
index 383befc..7827bdd 100644
--- a/engines/macventure/dialog.cpp
+++ b/engines/macventure/dialog.cpp
@@ -74,7 +74,7 @@ void Dialog::handleDialogAction(DialogElement *trigger, DialogAction action) {
 	}
 }
 
-const Graphics::Font& Dialog::getFont() {
+const Graphics::Font &Dialog::getFont() {
 	return _gui->getCurrentFont();
 }
 
@@ -161,11 +161,11 @@ void DialogElement::draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &t
 	doDraw(dialog, target);
 }
 
-const Common::String& DialogElement::getText() {
+const Common::String &DialogElement::getText() {
 	return doGetText();
 }
 
-const Common::String& DialogElement::doGetText() {
+const Common::String &DialogElement::doGetText() {
 	return _text;
 }
 
diff --git a/engines/macventure/dialog.h b/engines/macventure/dialog.h
index 7e85ccc..67331d7 100644
--- a/engines/macventure/dialog.h
+++ b/engines/macventure/dialog.h
@@ -46,7 +46,7 @@ public:
 	void localize(Common::Point &point);
 	void handleDialogAction(DialogElement *trigger, DialogAction action);
 
-	const Graphics::Font& getFont();
+	const Graphics::Font &getFont();
 
 	void addButton(Common::String title, DialogAction action, Common::Point position, uint width = 0, uint height = 0);
 	void addText(Common::String content, Common::Point position);
@@ -74,12 +74,12 @@ public:
 
 	bool processEvent(Dialog *dialog, Common::Event event);
 	void draw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target);
-	const Common::String& getText();
+	const Common::String &getText();
 
 private:
 	virtual bool doProcessEvent(Dialog *dialog, Common::Event event) = 0;
 	virtual void doDraw(MacVenture::Dialog *dialog, Graphics::ManagedSurface &target) = 0;
-	virtual const Common::String& doGetText();
+	virtual const Common::String &doGetText();
 
 protected:
 	Common::String _text;
diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index f4cb8ee..d0af4ed 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -249,11 +249,11 @@ void Gui::initWindows() {
 	loadBorders(_exitsWindow, findWindowData(kExitsWindow).type);
 }
 
-const WindowData& Gui::getWindowData(WindowReference reference) {
+const WindowData &Gui::getWindowData(WindowReference reference) {
 	return findWindowData(reference);
 }
 
-const Graphics::Font& Gui::getCurrentFont() {
+const Graphics::Font &Gui::getCurrentFont() {
 	return *_wm.getFont("Chicago-12", Graphics::FontManager::kBigGUIFont);
 }
 
@@ -351,12 +351,12 @@ WindowReference Gui::createInventoryWindow(ObjID objRef) {
 	return newData.refcon;
 }
 
-void Gui::loadBorders(Graphics::MacWindow * target, MVWindowType type) {
+void Gui::loadBorders(Graphics::MacWindow *target, MVWindowType type) {
 	loadBorder(target, type, false);
 	loadBorder(target, type, true);
 }
 
-void Gui::loadBorder(Graphics::MacWindow * target, MVWindowType type, bool active) {
+void Gui::loadBorder(Graphics::MacWindow *target, MVWindowType type, bool active) {
 
 	Common::SeekableReadStream *stream = _engine->getBorderFile(type, active);
 
@@ -405,7 +405,7 @@ bool Gui::loadMenus() {
 		uint16 key;
 		uint16 style;
 		uint8 titleLength;
-		char* title;
+		char *title;
 
 		/* Skip menuID, width, height, resourceID, placeholder */
 		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
@@ -474,7 +474,7 @@ bool Gui::loadWindows() {
 		res->readUint32BE(); // Skip the true id. For some reason it's reading 0
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
-			char* newTitle = new char[data.titleLength + 1];
+			char *newTitle = new char[data.titleLength + 1];
 			res->read(newTitle, data.titleLength);
 			newTitle[data.titleLength] = '\0';
 			data.title = Common::String(newTitle);
@@ -721,7 +721,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 	surface->transBlitFrom(composeSurface, composePosition, kColorGreen);
 }
 
-void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface * surface) {
+void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface) {
 	WindowData &data = findWindowData(target);
 	BorderBounds border = borderBounds(data.type);
 
@@ -881,7 +881,7 @@ void Gui::updateExit(ObjID obj) {
 	}
 }
 
-void Gui::printText(const Common::String & text) {
+void Gui::printText(const Common::String &text) {
 	debugC(1, kMVDebugGUI, "Print Text: %s", text.c_str());
 	_consoleText->printLine(text, _outConsoleWindow->getDimensions().width());
 }
@@ -978,7 +978,7 @@ Common::Point Gui::getGlobalScrolledSurfacePosition(WindowReference reference) {
 		win->getDimensions().top + border.topOffset - data.scrollPos.y);
 }
 
-WindowData & Gui::findWindowData(WindowReference reference) {
+WindowData &Gui::findWindowData(WindowReference reference) {
 	assert(_windowData);
 
 	Common::List<WindowData>::iterator iter = _windowData->begin();
@@ -992,7 +992,7 @@ WindowData & Gui::findWindowData(WindowReference reference) {
 	error("GUI: Could not locate the desired window data");
 }
 
-Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
+Graphics::MacWindow *Gui::findWindow(WindowReference reference) {
 	if (reference < 0x80 && reference >= kInventoryStart) { // It's an inventory window
 		return _inventoryWindows[reference - kInventoryStart];
 	}
@@ -1334,14 +1334,14 @@ bool Gui::processCommandEvents(WindowClick click, Common::Event &event) {
 	return false;
 }
 
-bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event & event) {
+bool MacVenture::Gui::processMainGameEvents(WindowClick click, Common::Event &event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
 	return false;
 }
 
-bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event & event) {
+bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event &event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
@@ -1357,7 +1357,7 @@ bool MacVenture::Gui::processOutConsoleEvents(WindowClick click, Common::Event &
 	return getWindowData(kOutConsoleWindow).visible;
 }
 
-bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event) {
+bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event &event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
@@ -1367,7 +1367,7 @@ bool MacVenture::Gui::processSelfEvents(WindowClick click, Common::Event & event
 	return true;
 }
 
-bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & event) {
+bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONUP) {
 		if (_engine->needsClickToContinue()) {
 			return true;
@@ -1397,14 +1397,14 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
 	return getWindowData(kExitsWindow).visible;
 }
 
-bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event & event) {
+bool MacVenture::Gui::processDiplomaEvents(WindowClick click, Common::Event &event) {
 	if (_engine->needsClickToContinue())
 		return true;
 
 	return getWindowData(kDiplomaWindow).visible;
 }
 
-bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
+bool Gui::processInventoryEvents(WindowClick click, Common::Event &event) {
 	if (event.type == Common::EVENT_LBUTTONDOWN && click == kBorderCloseButton) {
 		WindowReference ref = findWindowAtPoint(event.mouse);
 		if (ref == kNoWindow) {
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index f521286..960c2b8 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -313,8 +313,9 @@ public:
 		if (wrappedLines.empty()) // Sometimes we have empty lines
 			_lines.push_back("");
 
-		for (Common::StringArray::const_iterator j = wrappedLines.begin(); j != wrappedLines.end(); ++j)
+		for (Common::StringArray::const_iterator j = wrappedLines.begin(); j != wrappedLines.end(); ++j) {
 			_lines.push_back(*j);
+		}
 
 		updateScroll();
 	}
diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index c1bfd75..f0146e3 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -61,7 +61,7 @@ static const byte loadBits[] = {
 	0xff
 };
 
-ImageAsset::ImageAsset(ObjID original, Container * container) {
+ImageAsset::ImageAsset(ObjID original, Container *container) {
 	_id = (original * 2);
 	_mask = (original * 2) + 1;
 
@@ -147,7 +147,7 @@ void ImageAsset::decodePPIC(ObjID id, Common::Array<byte> &data, uint &bitHeight
 	delete baseStream;
 }
 
-void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::decodePPIC0(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint words = bitWidth >> 4;
 	uint bytes = bitWidth & 0xF;
 	uint v = 0;
@@ -170,15 +170,15 @@ void ImageAsset::decodePPIC0(Common::BitStream & stream, Common::Array<byte> &da
 
 }
 
-void ImageAsset::decodePPIC1(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::decodePPIC1(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	decodeHuffGraphic(PPIC1Huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodePPIC2(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::decodePPIC2(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	decodeHuffGraphic(PPIC2Huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::decodePPIC3(Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	// We need to load the huffman from the PPIC itself
 	PPICHuff huff;
 	uint16 v, bits;
@@ -192,10 +192,13 @@ void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &da
 		huff.symbols[loadBits[load++]] = v;
 	}
 	huff.symbols[0x10] = 0;
-	for (uint i = 0x10; i > 0; i--)
-		for (uint j = i; j <= 0x10; j++)
-			if (huff.symbols[j] >= huff.symbols[i - 1])
+	for (uint i = 0x10; i > 0; i--) {
+		for (uint j = i; j <= 0x10; j++) {
+			if (huff.symbols[j] >= huff.symbols[i - 1]) {
 				huff.symbols[j]++;
+			}
+		}
+	}
 
 	for (int i = 0x10; i >= 0; i--) {
 		if (huff.symbols[i] == 0x10) {
@@ -207,14 +210,19 @@ void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &da
 	bits = stream.getBits(2) + 1;
 	uint16 mask = 0;
 	for (uint i = 0; i < 0xf; i++) {
-		if (i)
-			while (!stream.getBit()) bits++;
+		if (i) {
+			while (!stream.getBit()) {
+				bits++;
+			}
+		}
 		huff.lens[i] = bits;
 		huff.masks[i] = mask;
 		mask += 1 << (16 - bits);
 	}
 	huff.masks[0xf] = mask;
-	while (mask&(1 << (16 - bits))) bits++;
+	while (mask&(1 << (16 - bits))) {
+		bits++;
+	}
 	huff.masks[0x10] = mask | (1 << (16 - bits));
 	huff.lens[0xf] = bits;
 	huff.lens[0x10] = bits;
@@ -222,14 +230,15 @@ void ImageAsset::decodePPIC3(Common::BitStream & stream, Common::Array<byte> &da
 	decodeHuffGraphic(huff, stream, data, bitHeight, bitWidth, rowBytes);
 }
 
-void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	byte flags = 0;
 	_walkRepeat = 0;
 	_walkLast = 0;
-	if (bitWidth & 3)
+	if (bitWidth & 3) {
 		flags = stream.getBits(5);
-	else
+	} else {
 		flags = stream.getBits(4) << 1;
+	}
 
 	byte odd = 0;
 	byte blank = bitWidth & 0xf;
@@ -316,7 +325,7 @@ void ImageAsset::decodeHuffGraphic(const PPICHuff & huff, Common::BitStream & st
 	}
 }
 
-byte ImageAsset::walkHuff(const PPICHuff & huff, Common::BitStream & stream) {
+byte ImageAsset::walkHuff(const PPICHuff &huff, Common::BitStream &stream) {
 	if (_walkRepeat) {
 		_walkRepeat--;
 		_walkLast = ((_walkLast << 8) & 0xFF00) | (_walkLast >> 8);
@@ -434,7 +443,7 @@ int ImageAsset::getHeight() {
 	return MAX(0, (int)_imgBitHeight);
 }
 
-void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte>& data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::blitDirect(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
 	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
@@ -451,7 +460,7 @@ void ImageAsset::blitDirect(Graphics::ManagedSurface * target, int ox, int oy, c
 	}
 }
 
-void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::blitBIC(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
 	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
@@ -469,7 +478,7 @@ void ImageAsset::blitBIC(Graphics::ManagedSurface * target, int ox, int oy, cons
 	}
 }
 
-void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::blitOR(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
 	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
@@ -487,7 +496,7 @@ void ImageAsset::blitOR(Graphics::ManagedSurface * target, int ox, int oy, const
 	}
 }
 
-void ImageAsset::blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
+void ImageAsset::blitXOR(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes) {
 	uint sx, sy, w, h;
 	calculateSectionToDraw(target, ox, oy, bitWidth, bitHeight, sx, sy, w, h);
 
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index 1f7d3e9..a026c3b 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -77,10 +77,10 @@ private:
 	void decodeHuffGraphic(const PPICHuff &huff, Common::BitStream &stream, Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 	byte walkHuff(const PPICHuff &huff, Common::BitStream &stream);
 
-	void blitDirect(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitBIC(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
-	void blitXOR(Graphics::ManagedSurface * target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitDirect(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitBIC(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitOR(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
+	void blitXOR(Graphics::ManagedSurface *target, int ox, int oy, const Common::Array<byte> &data, uint bitHeight, uint bitWidth, uint rowBytes);
 
 	void calculateSectionToDraw(Graphics::ManagedSurface *target, int &ox, int &oy, uint bitWidth, uint bitHeight, uint &sx, uint &sy, uint &w, uint &h);
 	void calculateSectionInDirection(uint targetWhole, uint originWhole, int &originPosition, uint &startPosition, uint &blittedWhole);
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 7f754c4..999d411 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -387,10 +387,11 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 		// Do shift ;)
 	} else {
 		if (_selectedControl && _currentSelection.size() > 0 && getInvolvedObjects() > 1) {
-			if (objID == 0)
+			if (objID == 0) {
 				selectPrimaryObject(windata.objRef);
-			else
+			} else {
 				selectPrimaryObject(objID);
+			}
 			preparedToRun();
 		} else {
 			if (objID == 0) {
@@ -633,7 +634,7 @@ void MacVentureEngine::printTexts() {
 }
 
 void MacVentureEngine::playSounds(bool pause) {
-	int delay=0;
+	int delay = 0;
 	while (!_soundQueue.empty()) {
 		QueuedSound item = _soundQueue.front();
 		_soundQueue.remove_at(0);
@@ -984,7 +985,7 @@ bool MacVentureEngine::isOldText() const {
 	return _oldTextEncoding;
 }
 
-const HuffmanLists * MacVentureEngine::getDecodingHuffman() const {
+const HuffmanLists *MacVentureEngine::getDecodingHuffman() const {
 	return _textHuffman;
 }
 
@@ -1122,17 +1123,20 @@ bool MacVentureEngine::loadTextHuffman() {
 		res->readUint16BE(); // Skip
 
 		uint32 *masks = new uint32[numEntries];
-		for (uint i = 0; i < numEntries - 1; i++)
+		for (uint i = 0; i < numEntries - 1; i++) {
 			// For some reason there are one lass mask than entries
 			masks[i] = res->readUint16BE();
+		}
 
 		uint32 *lengths = new uint32[numEntries];
-		for (uint i = 0; i < numEntries; i++)
+		for (uint i = 0; i < numEntries; i++) {
 			lengths[i] = res->readByte();
+		}
 
 		uint32 *values = new uint32[numEntries];
-		for (uint i = 0; i < numEntries; i++)
+		for (uint i = 0; i < numEntries; i++) {
 			values[i] = res->readByte();
+		}
 
 		_textHuffman = new HuffmanLists(numEntries, lengths, masks, values);
 		debugC(4, kMVDebugMain, "Text is huffman-encoded");
@@ -1175,8 +1179,9 @@ void GlobalSettings::loadSettings(Common::SeekableReadStream *dataStream) {
 	_attrIndices = Common::Array<uint8>(attrIndices, _numAttributes);
 	delete[] attrIndices;
 
-	for (int i = 0; i < _numAttributes; i++)
+	for (int i = 0; i < _numAttributes; i++) {
 		_attrMasks.push_back(dataStream->readUint16BE());
+	}
 
 	uint8 *attrShifts = new uint8[_numAttributes];
 	dataStream->read(attrShifts, _numAttributes);
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 7e53eb2..6908bc6 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef MACVENTURE_H
-#define MACVENTURE_H
+#ifndef MACVENTURE_MACVENTURE_H
+#define MACVENTURE_MACVENTURE_H
 
 #include "engines/engine.h"
 #include "common/scummsys.h"
@@ -243,7 +243,7 @@ public:
 	bool isPaused();
 	bool needsClickToContinue();
 	Common::String getCommandsPausedString() const;
-	const GlobalSettings& getGlobalSettings() const;
+	const GlobalSettings &getGlobalSettings() const;
 	Common::String getFilePath(FilePathID id) const;
 	bool isOldText() const;
 	const HuffmanLists *getDecodingHuffman() const;
@@ -310,7 +310,7 @@ private:
 	bool loadGlobalSettings();
 	bool loadTextHuffman();
 
-	const char* getGameFileName() const;
+	const char *getGameFileName() const;
 
 private: // Attributes
 
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index a341487..e5cc9b6 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -54,8 +54,9 @@ SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 	// Depends on MACVENTURE_DESC_LENGTH
 	byte descSize = s->readByte();
 	s->seek(-(5 + MACVENTURE_DESC_LENGTH + descSize), SEEK_END);
-	for (int i = 0; i < descSize; ++i)
+	for (int i = 0; i < descSize; ++i) {
 		name += s->readByte();
+	}
 	desc.setDescription(name);
 
 	return desc;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index f7e49c6..5f5273c 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -29,7 +29,7 @@
 
 namespace MacVenture {
 
-ScriptEngine::ScriptEngine(MacVentureEngine * engine, World * world) {
+ScriptEngine::ScriptEngine(MacVentureEngine *engine, World *world) {
 	_engine = engine;
 	_world = world;
 	_scripts = new Container(_engine->getFilePath(kFilterPathID));
@@ -100,12 +100,12 @@ bool ScriptEngine::execFrame(bool execAll) {
 	if (frame->haltedInFamily || doFamily) { // We have to do the family or we were stuck here
 		frame->haltedInFamily = false;
 		Common::Array<ObjID> family = _world->getFamily(_world->getObjAttr(1, kAttrParentObject), false);
-		uint32 i = frame->familyIdx;
-		for (; i < family.size(); i++) {
+		for (uint32 i = frame->familyIdx; i < family.size(); i++) {
 			if (doFamily) {
 				fail = loadScript(frame, family[i]);
+			} else {
+				fail = resumeFunc(frame);
 			}
-			else { fail = resumeFunc(frame); }
 			if (fail) { // We are stuck, so we don't shift the frame
 				frame->haltedInFamily = true;
 				frame->familyIdx = i;
@@ -130,7 +130,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 	uint localHigh = 0;
 	do { // Saved function calls
 		highest = 0;
-		for (uint i = 0; i <frame->saves.size(); i++) {
+		for (uint i = 0; i < frame->saves.size(); i++) {
 			if (highest < frame->saves[i].rank) {
 				highest = frame->saves[i].rank;
 				localHigh = i;
@@ -150,7 +150,7 @@ bool ScriptEngine::execFrame(bool execAll) {
 	return false;
 }
 
-bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
+bool ScriptEngine::loadScript(EngineFrame *frame, uint32 scriptID) {
 	if (_scripts->getItemByteSize(scriptID) > 0) {
 		debugC(2, kMVDebugScript, "Loading function %d", scriptID);
 		// Insert the new script at the front
@@ -160,7 +160,7 @@ bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
 	return false;
 }
 
-bool ScriptEngine::resumeFunc(EngineFrame * frame) {
+bool ScriptEngine::resumeFunc(EngineFrame *frame) {
 	bool fail = runFunc(frame);
 	if (fail) {
 		return fail;
@@ -525,81 +525,81 @@ word ScriptEngine::sumChildrenAttr(word obj, word attr, bool recursive) {
 	return sum;
 }
 
-void MacVenture::ScriptEngine::op80GATT(EngineState * state, EngineFrame * frame) {
+void MacVenture::ScriptEngine::op80GATT(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	word attr = state->pop();
 	state->push(_world->getObjAttr(obj, attr));
 }
 
-void ScriptEngine::op81SATT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op81SATT(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	word attr = state->pop();
 	word val = neg16(state->pop());
 	_world->setObjAttr(obj, attr, val);
 }
 
-void ScriptEngine::op82SUCH(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op82SUCH(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	word attr = state->pop();
 	word recursive = neg16(state->pop());
 	state->push(sumChildrenAttr(obj, attr, recursive));
 }
 
-void ScriptEngine::op83PUCT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op83PUCT(EngineState *state, EngineFrame *frame) {
 	state->push(frame->action);
 }
 
-void ScriptEngine::op84PUOB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op84PUOB(EngineState *state, EngineFrame *frame) {
 	state->push(frame->src);
 }
 
-void ScriptEngine::op85PUTA(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op85PUTA(EngineState *state, EngineFrame *frame) {
 	state->push(frame->dest);
 }
 
-void ScriptEngine::op86PUDX(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op86PUDX(EngineState *state, EngineFrame *frame) {
 	state->push(frame->x);
 }
 
-void ScriptEngine::op87PUDY(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op87PUDY(EngineState *state, EngineFrame *frame) {
 	state->push(frame->y);
 }
 
-void ScriptEngine::op88PUIB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::op88PUIB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	state->push(script->fetch());
 }
 
-void ScriptEngine::op89PUI(EngineState * state, EngineFrame * frame, ScriptAsset * script) {
+void ScriptEngine::op89PUI(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
 	state->push(val);
 }
 
-void ScriptEngine::op8aGGLO(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8aGGLO(EngineState *state, EngineFrame *frame) {
 	word idx = state->pop();
 	state->push(_world->getGlobal(idx));
 }
 
-void ScriptEngine::op8bSGLO(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8bSGLO(EngineState *state, EngineFrame *frame) {
 	word idx = state->pop();
 	word val = neg16(state->pop());
 	_world->setGlobal(idx, val);
 	_engine->gameChanged();
 }
 
-void ScriptEngine::op8cRAND(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8cRAND(EngineState *state, EngineFrame *frame) {
 	word max = state->pop();
 	state->push(_engine->randBetween(0, max));
 }
 
-void ScriptEngine::op8dCOPY(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8dCOPY(EngineState *state, EngineFrame *frame) {
 	word val = state->pop();
 	state->push(val);
 	state->push(val);
 }
 
-void ScriptEngine::op8eCOPYN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8eCOPYN(EngineState *state, EngineFrame *frame) {
 	word n = state->pop();
 	word offs = n - 1;
 	word val;
@@ -610,14 +610,14 @@ void ScriptEngine::op8eCOPYN(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-void ScriptEngine::op8fSWAP(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op8fSWAP(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(b);
 	state->push(a);
 }
 
-void ScriptEngine::op90SWAPN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op90SWAPN(EngineState *state, EngineFrame *frame) {
 	word idx = state->pop();
 	word a = state->peek(idx);
 	word b = state->peek(0);
@@ -625,22 +625,22 @@ void ScriptEngine::op90SWAPN(EngineState * state, EngineFrame * frame) {
 	state->poke(0, a);
 }
 
-void ScriptEngine::op91POP(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op91POP(EngineState *state, EngineFrame *frame) {
 	state->pop();
 }
 
-void ScriptEngine::op92COPYP(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op92COPYP(EngineState *state, EngineFrame *frame) {
 	word val = state->peek(1);
 	state->push(val);
 }
 
-void ScriptEngine::op93COPYPN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op93COPYPN(EngineState *state, EngineFrame *frame) {
 	word idx = state->pop();
 	word val = state->peek(idx);
 	state->push(val);
 }
 
-void ScriptEngine::op94SHUFF(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op94SHUFF(EngineState *state, EngineFrame *frame) {
 	word a = state->pop();
 	word b = state->pop();
 	word c = state->pop();
@@ -649,7 +649,7 @@ void ScriptEngine::op94SHUFF(EngineState * state, EngineFrame * frame) {
 	state->push(b);
 }
 
-void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op95SORT(EngineState *state, EngineFrame *frame) {
 	word step = neg16(state->pop());
 	word num = neg16(state->pop());
 	step %= num;
@@ -658,7 +658,7 @@ void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
 	}
 	word end = 0;
 	word start = 0;
-	for (word i = 1;i<num;i++) {
+	for (word i = 1; i < num; i++) {
 		start += step;
 		if (start >= num) {
 			start -= num;
@@ -675,52 +675,52 @@ void ScriptEngine::op95SORT(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-void ScriptEngine::op96CLEAR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op96CLEAR(EngineState *state, EngineFrame *frame) {
 	state->clear();
 }
 
-void ScriptEngine::op97SIZE(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op97SIZE(EngineState *state, EngineFrame *frame) {
 	state->push(state->size());
 }
 
-void ScriptEngine::op98ADD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op98ADD(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a + b);
 }
 
-void ScriptEngine::op99SUB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op99SUB(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a - b);
 }
 
-void ScriptEngine::op9aMUL(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9aMUL(EngineState *state, EngineFrame *frame) {
 	int16 b = state->pop();
 	int16 a = state->pop();
 	state->push(a * b);
 }
 
-void ScriptEngine::op9bDIV(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9bDIV(EngineState *state, EngineFrame *frame) {
 	int16 b = state->pop();
 	int16 a = state->pop();
 	state->push((a / b) | 0);
 }
 
-void ScriptEngine::op9cMOD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9cMOD(EngineState *state, EngineFrame *frame) {
 	int16 b = state->pop();
 	int16 a = state->pop();
 	state->push(a % b);
 }
 
-void ScriptEngine::op9dDMOD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9dDMOD(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a % b);
 	state->push((a / b) | 0);
 }
 
-void ScriptEngine::op9eABS(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9eABS(EngineState *state, EngineFrame *frame) {
 	word val = neg16(state->pop());
 	if (val < 0) {
 		val = -val;
@@ -728,110 +728,110 @@ void ScriptEngine::op9eABS(EngineState * state, EngineFrame * frame) {
 	state->push(val);
 }
 
-void ScriptEngine::op9fNEG(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::op9fNEG(EngineState *state, EngineFrame *frame) {
 	word val = -neg16(state->pop());
 	state->push(val);
 }
 
-void ScriptEngine::opa0AND(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa0AND(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a & b);
 }
 
-void ScriptEngine::opa1OR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa1OR(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a | b);
 }
 
-void ScriptEngine::opa2XOR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa2XOR(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(a ^ b);
 }
 
-void ScriptEngine::opa3NOT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa3NOT(EngineState *state, EngineFrame *frame) {
 	word a = state->pop();
 	state->push(a ^ 0xFFFF);
 }
 
-void ScriptEngine::opa4LAND(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa4LAND(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push((a && b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opa5LOR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa5LOR(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push((a || b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opa6LXOR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa6LXOR(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push((!a != !b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opa7LNOT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa7LNOT(EngineState *state, EngineFrame *frame) {
 	word a = state->pop();
 	state->push((a == 0) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opa8GTU(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa8GTU(EngineState *state, EngineFrame *frame) {
 	uint16 b = state->pop();
 	uint16 a = state->pop();
 	state->push((a > b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opa9LTU(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opa9LTU(EngineState *state, EngineFrame *frame) {
 	uint16 b = state->pop();
 	uint16 a = state->pop();
 	state->push((a < b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opaaGTS(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opaaGTS(EngineState *state, EngineFrame *frame) {
 	// HACK !!! May not need the neg16, since word is already a signed int!!
 	word b = neg16(state->pop());
 	word a = neg16(state->pop());
 	state->push((a > b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opabLTS(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opabLTS(EngineState *state, EngineFrame *frame) {
 	// HACK !!! May not need the neg16, since word is already a signed int!!
 	word b = neg16(state->pop());
 	word a = neg16(state->pop());
 	state->push((a < b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opacEQ(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opacEQ(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push((a == b) ? 0xFFFF : 0);
 }
 
-void ScriptEngine::opadEQS(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opadEQS(EngineState *state, EngineFrame *frame) {
 	Common::String b = _world->getText(state->pop(), 0, 0); // HACK, these destinations might be wrong
 	Common::String a = _world->getText(state->pop(), 0, 0);
 	state->push((a == b) ? 1 : 0);
 }
 
-void ScriptEngine::opaeCONT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opaeCONT(EngineState *state, EngineFrame *frame) {
 	Common::String needle = _world->getText(state->pop(), 0, 0);
 	Common::String haystack = _world->getText(state->pop(), 0, 0);
 	haystack.toLowercase();
 	state->push(haystack.contains(needle) ? 1 : 0);
 }
 
-void ScriptEngine::opafCONTW(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opafCONTW(EngineState *state, EngineFrame *frame) {
 	Common::String needle = _world->getText(state->pop(), 0, 0);
 	Common::String haystack = _world->getText(state->pop(), 0, 0);
 	haystack.toLowercase();
 	state->push(haystack.contains(needle) ? 1 : 0);
 }
 
-void ScriptEngine::opb0BRA(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
@@ -839,13 +839,13 @@ void ScriptEngine::opb0BRA(EngineState * state, EngineFrame * frame, ScriptAsset
 	script->branch(val);
 }
 
-void ScriptEngine::opb1BRAB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val = neg8(val);
 	script->branch(val);
 }
 
-void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb2BEQ(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
@@ -856,7 +856,7 @@ void ScriptEngine::opb2BEQ(EngineState * state, EngineFrame * frame, ScriptAsset
 	}
 }
 
-void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb3BEQB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
@@ -865,7 +865,7 @@ void ScriptEngine::opb3BEQB(EngineState * state, EngineFrame * frame, ScriptAsse
 	}
 }
 
-void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb4BNE(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
@@ -876,7 +876,7 @@ void ScriptEngine::opb4BNE(EngineState * state, EngineFrame * frame, ScriptAsset
 	}
 }
 
-void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsset *script) {
+void ScriptEngine::opb5BNEB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
 	word val = script->fetch();
 	val = neg8(val);
 	word b = state->pop();
@@ -885,13 +885,13 @@ void ScriptEngine::opb5BNEB(EngineState * state, EngineFrame * frame, ScriptAsse
 	}
 }
 
-void ScriptEngine::opb6CLAT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opb6CLAT(EngineState *state, EngineFrame *frame) {
 	word rank = state->pop();
 	word func = state->pop();
 	frame->saves.push_back(FunCall(func, rank));
 }
 
-void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opb7CCA(EngineState *state, EngineFrame *frame) {
 	word func = state->pop();
 	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].func == func)
@@ -899,26 +899,26 @@ void ScriptEngine::opb7CCA(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-void ScriptEngine::opb8CLOW(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opb8CLOW(EngineState *state, EngineFrame *frame) {
 	word hi = state->pop();
-	for (uint i = 0;i<frame->saves.size();i++)
+	for (uint i = 0; i < frame->saves.size(); i++)
 		if (frame->saves[i].rank <= hi)
 			frame->saves[i].rank = 0;
 }
 
-void ScriptEngine::opb9CHI(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opb9CHI(EngineState *state, EngineFrame *frame) {
 	word lo = state->pop();
-	for (uint i = 0;i<frame->saves.size();i++) {
+	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].rank >= lo) {
 			frame->saves[i].rank = 0;
 		}
 	}
 }
 
-void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opbaCRAN(EngineState *state, EngineFrame *frame) {
 	word hi = state->pop();
 	word lo = state->pop();
-	for (uint i = 0;i<frame->saves.size();i++) {
+	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].rank >= lo &&
 			frame->saves[i].rank <= hi) {
 			frame->saves[i].rank = 0;
@@ -926,7 +926,7 @@ void ScriptEngine::opbaCRAN(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-bool ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
+bool ScriptEngine::opbbFORK(EngineState *state, EngineFrame *frame) {
 	EngineFrame newframe;
 	newframe.action = (ControlAction)state->pop();
 	newframe.src = state->pop();
@@ -943,7 +943,7 @@ bool ScriptEngine::opbbFORK(EngineState * state, EngineFrame * frame) {
 	return false;
 }
 
-bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsset &script) {
+bool ScriptEngine::opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script) {
 	word id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
@@ -956,12 +956,12 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
 	return false;
 }
 
-void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opbdFOOB(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	_engine->enqueueObject(kFocusWindow, obj);
 }
 
-void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opbeSWOB(EngineState *state, EngineFrame *frame) {
 	ObjID from = state->pop();
 	ObjID to = state->pop();
 	_engine->enqueueObject(kUpdateWindow, from, to);
@@ -973,62 +973,63 @@ void ScriptEngine::opbeSWOB(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-void ScriptEngine::opbfSNOB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opbfSNOB(EngineState *state, EngineFrame *frame) {
 	_engine->enqueueObject(kAnimateBack, frame->src);
 }
 
-void ScriptEngine::opc0TEXI(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc0TEXI(EngineState *state, EngineFrame *frame) {
 	_engine->enqueueObject(kHightlightExits, 0);
 }
 
-void ScriptEngine::opc1PTXT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc1PTXT(EngineState *state, EngineFrame *frame) {
 	word tid = state->pop();
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 }
 
-void ScriptEngine::opc2PNEW(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc2PNEW(EngineState *state, EngineFrame *frame) {
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 }
 
-void ScriptEngine::opc3PTNE(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc3PTNE(EngineState *state, EngineFrame *frame) {
 	word tid = state->pop();
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 }
 
-void ScriptEngine::opc4PNTN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc4PNTN(EngineState *state, EngineFrame *frame) {
 	word tid = state->pop();
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 }
 
-void ScriptEngine::opc5PNUM(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc5PNUM(EngineState *state, EngineFrame *frame) {
 	word tid = state->pop();
 	_engine->enqueueText(kTextNumber, frame->dest, frame->src, tid);
 }
 
-void ScriptEngine::opc6P2(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc6P2(EngineState *state, EngineFrame *frame) {
 	state->push(2);
 }
 
-void ScriptEngine::opc7PLBG(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc7PLBG(EngineState *state, EngineFrame *frame) {
 	word target = state->pop();
 	_engine->enqueueSound(kSoundPlay, target);
 }
 
-void ScriptEngine::opc8PLAW(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc8PLAW(EngineState *state, EngineFrame *frame) {
 	word target = state->pop();
 	_engine->enqueueSound(kSoundPlayAndWait, target);
 }
 
-void ScriptEngine::opc9WAIT(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opc9WAIT(EngineState *state, EngineFrame *frame) {
 	_engine->enqueueSound(kSoundWait, 0);
 }
 
-void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
-	for (uint i = 0; i < 3; i++) // We skip year, month and date
+void ScriptEngine::opcaTIME(EngineState *state, EngineFrame *frame) {
+	for (uint i = 0; i < 3; i++) {// We skip year, month and date
 		state->push(0x00);
+	}
 
 	uint32 totalPlayTime = _engine->getTotalPlayTime() / 1000; // In seconds
 	word hours = totalPlayTime / 3600;
@@ -1041,12 +1042,12 @@ void ScriptEngine::opcaTIME(EngineState * state, EngineFrame * frame) {
 	debugC(2, kMVDebugScript, "Saved time: h[%d] m[%d] s[%d]", hours, minutes, totalPlayTime);
 }
 
-void ScriptEngine::opcbDAY(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opcbDAY(EngineState *state, EngineFrame *frame) {
 	// Probaby irrelevant, so we push Day [9]
 	state->push(9);
 }
 
-void ScriptEngine::opccCHLD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opccCHLD(EngineState *state, EngineFrame *frame) {
 	bool recursive = state->pop() != 0;
 	word obj = state->pop();
 	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
@@ -1056,49 +1057,49 @@ void ScriptEngine::opccCHLD(EngineState * state, EngineFrame * frame) {
 	state->push(children.size());
 }
 
-void ScriptEngine::opcdNCHLD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opcdNCHLD(EngineState *state, EngineFrame *frame) {
 	bool recursive = state->pop() != 0;
 	word obj = state->pop();
 	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
 	state->push(children.size());
 }
 
-void ScriptEngine::opceVERS(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opceVERS(EngineState *state, EngineFrame *frame) {
 	state->push(86);
 }
 
-void ScriptEngine::opcfPSCE(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opcfPSCE(EngineState *state, EngineFrame *frame) {
 	state->push(0); //Not release
 }
 
-void ScriptEngine::opd0P1(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd0P1(EngineState *state, EngineFrame *frame) {
 	state->push(1);
 }
 
-void ScriptEngine::opd1GOBD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd1GOBD(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	Common::Rect bounds = _engine->getObjBounds(obj);
 	state->push(bounds.width());
 	state->push(bounds.height());
 }
 
-void ScriptEngine::opd2GOVP(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd2GOVP(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	state->push(_engine->getOverlapPercent(b, a));
 }
 
-void ScriptEngine::opd3CAPC(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd3CAPC(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	_world->captureChildren(obj);
 }
 
-void ScriptEngine::opd4RELC(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd4RELC(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	_world->releaseChildren(obj);
 }
 
-void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd5DLOG(EngineState *state, EngineFrame *frame) {
 	word txt = state->pop();
 	if (_engine->showTextEntry(txt, frame->src, frame->dest)) {
 		state->push(0xFF);
@@ -1107,60 +1108,60 @@ void ScriptEngine::opd5DLOG(EngineState * state, EngineFrame * frame) {
 	}
 }
 
-void ScriptEngine::opd6ACMD(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd6ACMD(EngineState *state, EngineFrame *frame) {
 	_engine->selectControl((ControlAction)state->pop());
 }
 
-void ScriptEngine::opd7LOSE(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd7LOSE(EngineState *state, EngineFrame *frame) {
 	_engine->loseGame();
 }
 
-void ScriptEngine::opd8WIN(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd8WIN(EngineState *state, EngineFrame *frame) {
 	_engine->winGame();
 }
 
-void ScriptEngine::opd9SLEEP(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opd9SLEEP(EngineState *state, EngineFrame *frame) {
 	word ticks = state->pop();
 	g_system->delayMillis((ticks / 60) * 1000);
 	_engine->preparedToRun();
 }
 
-void ScriptEngine::opdaCLICK(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opdaCLICK(EngineState *state, EngineFrame *frame) {
 	_engine->updateState(false);
 	_engine->clickToContinue();
 }
 
-void ScriptEngine::opdbROBQ(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opdbROBQ(EngineState *state, EngineFrame *frame) {
 	_engine->runObjQueue();
 }
 
-void ScriptEngine::opdcRSQ(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opdcRSQ(EngineState *state, EngineFrame *frame) {
 	_engine->playSounds(true);
 }
 
-void ScriptEngine::opddRTQ(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opddRTQ(EngineState *state, EngineFrame *frame) {
 	_engine->printTexts();
 }
 
-void ScriptEngine::opdeUPSC(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opdeUPSC(EngineState *state, EngineFrame *frame) {
 	_engine->updateState(true);
 }
 
-void ScriptEngine::opdfFMAI(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::opdfFMAI(EngineState *state, EngineFrame *frame) {
 	word ticks = state->pop();
 	g_system->delayMillis((ticks / 60) * 1000);
 	_engine->revert();
 }
 
-void ScriptEngine::ope0CHGR(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope0CHGR(EngineState *state, EngineFrame *frame) {
 	state->pop();
 }
 
-void ScriptEngine::ope1CHSO(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope1CHSO(EngineState *state, EngineFrame *frame) {
 	state->pop();
 }
 
-void ScriptEngine::ope2MDIV(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope2MDIV(EngineState *state, EngineFrame *frame) {
 	word b = state->pop();
 	word a = state->pop();
 	a *= b;
@@ -1169,25 +1170,25 @@ void ScriptEngine::ope2MDIV(EngineState * state, EngineFrame * frame) {
 	state->push(a | 0);
 }
 
-void ScriptEngine::ope3UPOB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope3UPOB(EngineState *state, EngineFrame *frame) {
 	word obj = state->pop();
 	_world->updateObj(obj);
 }
 
-void ScriptEngine::ope4PLEV(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope4PLEV(EngineState *state, EngineFrame *frame) {
 	state->push(0);
 }
 
-void ScriptEngine::ope5WEV(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope5WEV(EngineState *state, EngineFrame *frame) {
 	op00NOOP(0xe5);
 }
 
-void ScriptEngine::ope6GFIB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope6GFIB(EngineState *state, EngineFrame *frame) {
 	state->push(0);
 	op00NOOP(0xe6);
 }
 
-void ScriptEngine::ope7CFIB(EngineState * state, EngineFrame * frame) {
+void ScriptEngine::ope7CFIB(EngineState *state, EngineFrame *frame) {
 	state->pop();
 	op00NOOP(0xe7);
 }
@@ -1198,7 +1199,7 @@ void ScriptEngine::op00NOOP(byte op) {
 
 
 
-ScriptAsset::ScriptAsset(ObjID id, Container * container) {
+ScriptAsset::ScriptAsset(ObjID id, Container *container) {
 	_id = id;
 	_container = container;
 	_ip = 0x0;
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index 5760a31..afeed4a 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -148,9 +148,9 @@ public:
 
 private:
 	bool execFrame(bool execAll);
-	bool loadScript(EngineFrame * frame, uint32 scriptID);
-	bool resumeFunc(EngineFrame * frame);
-	bool runFunc(EngineFrame * frame);
+	bool loadScript(EngineFrame *frame, uint32 scriptID);
+	bool resumeFunc(EngineFrame *frame);
+	bool runFunc(EngineFrame *frame);
 
 private:
 
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index 492bf55..fd39e2b 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -37,7 +37,7 @@ SoundManager::SoundManager(MacVentureEngine *engine, Audio::Mixer *mixer) {
 	debugC(1, kMVDebugSound, "Created sound manager with file %s", filename.c_str());
 }
 
-SoundManager::~SoundManager(){
+SoundManager::~SoundManager() {
 	if (_container)
 		delete _container;
 
@@ -159,7 +159,7 @@ void SoundAsset::decode12(Common::SeekableReadStream *stream) {
 			byte ch = stream->readByte();
 			if (ch & 0x80) {
 				ch -= 0x80;
-				uint32 env= ch * scale;
+				uint32 env = ch * scale;
 				ch = (env >> 8) & 0xff;
 				if (ch & 0x80) {
 					ch = 0x7f;
@@ -265,7 +265,7 @@ void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	stream->readUint32BE();
 	_length = stream->readUint32BE();
 	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
-	uint32 last=0x80;
+	uint32 last = 0x80;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
 		if (i & 1) {
diff --git a/engines/macventure/stringtable.h b/engines/macventure/stringtable.h
index 54aba03..2f1d671 100644
--- a/engines/macventure/stringtable.h
+++ b/engines/macventure/stringtable.h
@@ -79,7 +79,7 @@ private:
 		uint8 strLength = 0;
 		for (uint i = 0; i < numStrings; ++i) {
 			strLength = res->readByte();
-			char* str = new char[strLength + 1];
+			char *str = new char[strLength + 1];
 			res->read(str, strLength);
 			str[strLength] = '\0';
 			// HACK until a proper special char implementation is found, this will have to do.
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 7981692..a2777f8 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -43,7 +43,7 @@ void TextAsset::decodeOld() {
 	Common::SeekableReadStream *res = _container->getItem(_id);
 	uint16 strLen = res->readUint16BE();
 	Common::BitStream32BELSB stream(res, true);
-	char* str = new char[strLen + 1];
+	char *str = new char[strLen + 1];
 	bool lowercase = false;
 	char c;
 	for (uint16 i = 0; i < strLen; i++) {
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index fc563cb..4847dcf 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -131,8 +131,9 @@ bool MacVenture::World::isObjActive(ObjID obj) {
 
 ObjID World::getAncestor(ObjID objID) {
 	ObjID root = getObjAttr(1, kAttrParentObject);
-	while (objID != 0 && objID != 1 && objID != root)
+	while (objID != 0 && objID != 1 && objID != root) {
 		objID = getObjAttr(objID, kAttrParentObject);
+	}
 	return objID;
 }
 
@@ -279,11 +280,11 @@ void SaveGame::setAttr(uint32 attrID, ObjID objID, Attribute value) {
 	_groups[attrID][objID] = value;
 }
 
-const Common::Array<AttributeGroup>& MacVenture::SaveGame::getGroups() {
+const Common::Array<AttributeGroup> &MacVenture::SaveGame::getGroups() {
 	return _groups;
 }
 
-const AttributeGroup * SaveGame::getGroup(uint32 groupID) {
+const AttributeGroup *SaveGame::getGroup(uint32 groupID) {
 	assert(groupID < _groups.size());
 	return &(_groups[groupID]);
 }
@@ -292,11 +293,11 @@ void SaveGame::setGlobal(uint32 attrID, Attribute value) {
 	_globals[attrID] = value;
 }
 
-const Common::Array<uint16>& SaveGame::getGlobals() {
+const Common::Array<uint16> &SaveGame::getGlobals() {
 	return _globals;
 }
 
-const Common::String & SaveGame::getText() {
+const Common::String &SaveGame::getText() {
 	return _text;
 }
 
@@ -320,7 +321,7 @@ void SaveGame::saveInto(Common::OutSaveFile *file) {
 	file->write(_text.c_str(), _text.size());
 }
 
-void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	GlobalSettings settings = engine->getGlobalSettings();
 	for (int i = 0; i < settings._numGroups; ++i) {
 		AttributeGroup g;
@@ -332,14 +333,14 @@ void SaveGame::loadGroups(MacVentureEngine *engine, Common::SeekableReadStream *
 	}
 }
 
-void SaveGame::loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+void SaveGame::loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	GlobalSettings settings = engine->getGlobalSettings();
 	for (int i = 0; i < settings._numGlobals; ++i) {
 		_globals.push_back(res->readUint16BE());
 	}
 }
 
-void SaveGame::loadText(MacVentureEngine *engine, Common::SeekableReadStream * res) {
+void SaveGame::loadText(MacVentureEngine *engine, Common::SeekableReadStream *res) {
 	_text = "Placeholder Console Text";
 }
 


Commit: d8e4d18f7a2226aec3010683de8f40dee3b7e831
    https://github.com/scummvm/scummvm/commit/d8e4d18f7a2226aec3010683de8f40dee3b7e831
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Remove leftover comments and document magic constants

Changed paths:
    engines/macventure/gui.cpp
    engines/macventure/gui.h
    engines/macventure/image.h
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/text.cpp
    engines/macventure/world.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index d0af4ed..2745405 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -187,6 +187,7 @@ void Gui::draw() {
 
 	drawDraggedObject();
 	drawDialog();
+	// TODO: When window titles with custom borders are in MacGui, this should be used.
 	//drawWindowTitle(kMainGameWindow, _mainGameWindow->getSurface());
 }
 
@@ -408,7 +409,9 @@ bool Gui::loadMenus() {
 		char *title;
 
 		/* Skip menuID, width, height, resourceID, placeholder */
-		for (int skip = 0; skip < 5; skip++) { res->readUint16BE(); }
+		for (int skip = 0; skip < 5; skip++) {
+			res->readUint16BE();
+		}
 		titleLength = res->readByte();
 		title = new char[titleLength + 1];
 		res->read(title, titleLength);
@@ -518,7 +521,7 @@ bool Gui::loadControls() {
 		data.scrollMax = res->readUint16BE();
 		data.scrollMin = res->readUint16BE();
 		data.cdef = res->readUint16BE();
-		data.refcon = (ControlAction)res->readUint32BE();//(ControlType)id; id++;
+		data.refcon = (ControlAction)res->readUint32BE();
 		data.type = (ControlType)id; id++;
 		data.titleLength = res->readByte();
 		if (data.titleLength) {
@@ -660,10 +663,6 @@ void Gui::drawExitsWindow() {
 	}
 
 	findWindow(kExitsWindow)->setDirty(true);
-
-	// To be deleted
-	//g_system->copyRectToScreen(srf->getPixels(), srf->pitch, 0, 0, srf->w, srf->h);
-	//g_system->updateScreen();
 }
 
 void Gui::drawConsoleWindow() {
@@ -722,21 +721,7 @@ void Gui::drawObjectsInWindow(const WindowData &targetData, Graphics::ManagedSur
 }
 
 void Gui::drawWindowTitle(WindowReference target, Graphics::ManagedSurface *surface) {
-	WindowData &data = findWindowData(target);
-	BorderBounds border = borderBounds(data.type);
-
-	uint left = 10;//getCurrentFont().getStringWidth(data.title) - 10;
-	uint right = 30;//getCurrentFont().getStringWidth(data.title) + 10;
-
-	surface->fillRect(Common::Rect(left, 0, right, border.topOffset - 1), kColorGray);
-	getCurrentFont().drawString(
-		surface,
-		data.title,
-		0,
-		right,
-		right - left,
-		kColorBlack,
-		Graphics::kTextAlignCenter);
+	// TODO: Implement when MacGui supports titles in windows with custom borders.
 }
 
 void Gui::drawDraggedObject() {
@@ -1290,12 +1275,6 @@ bool Gui::processEvent(Common::Event &event) {
 			moveDraggedObject(event.mouse);
 		}
 		processed = true;
-
-		// TEST
-		//Common::Rect mr = calculateClickRect(event.mouse, _screen.getBounds());
-		//_screen.fillRect(mr, kColorGreen);
-		//g_system->copyRectToScreen(_screen.getPixels(), _screen.pitch, 0, 0, _screen.w, _screen.h);
-		//g_system->updateScreen();
 	}
 
 	processed |= _wm.processEvent(event);
diff --git a/engines/macventure/gui.h b/engines/macventure/gui.h
index 960c2b8..8ae4a15 100644
--- a/engines/macventure/gui.h
+++ b/engines/macventure/gui.h
@@ -71,7 +71,6 @@ enum MenuAction {
 
 	kMenuActionCommand
 };
-//} using namespace MacVentureMenuActions;
 
 struct DraggedObj {
 	ObjID id;
diff --git a/engines/macventure/image.h b/engines/macventure/image.h
index a026c3b..6f6b960 100644
--- a/engines/macventure/image.h
+++ b/engines/macventure/image.h
@@ -37,7 +37,6 @@ enum BlitMode {
 	kBlitBIC = 1,
 	kBlitOR = 2,
 	kBlitXOR = 3
-	//kBlitNONE = 4,
 };
 
 enum GraphicsEncoding {
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index 999d411..e28bc4e 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -384,7 +384,7 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
 	const WindowData &windata = _gui->getWindowData(win);
 
 	if (shiftPressed) {
-		// Do shift ;)
+		// TODO: Implement shift functionality.
 	} else {
 		if (_selectedControl && _currentSelection.size() > 0 && getInvolvedObjects() > 1) {
 			if (objID == 0) {
@@ -450,14 +450,12 @@ bool MacVentureEngine::showTextEntry(ObjID text, ObjID srcObj, ObjID destObj) {
 	debugC(3, kMVDebugMain, "Showing speech dialog, asset %d from %d to %d", text, srcObj, destObj);
 	_gui->getTextFromUser();
 
-	// HACK WITH FLAGS
 	_prepared = false;
 	warning("Show text entry: not fully tested");
 	return true;
 }
 
 void MacVentureEngine::setTextInput(Common::String content) {
-	// HACK WITH FLAGS
 	_prepared = true;
 	_userInput = content;
 	_clickToContinue = false;
@@ -646,7 +644,7 @@ void MacVentureEngine::playSounds(bool pause) {
 			delay = _soundManager->playSound(item.reference);
 			break;
 		case kSoundWait:
-			//wait for sound to finish?
+			// Empty in the original.
 			break;
 		}
 	}
@@ -681,6 +679,7 @@ void MacVentureEngine::unselectAll() {
 void MacVentureEngine::selectObject(ObjID objID) {
 	if (!_currentSelection.empty()) {
 		if (findParentWindow(objID) != findParentWindow(_currentSelection[0])) {
+			// TODO: Needs further testing, but it doesn't seem necessary.
 			//unselectAll();
 		}
 	}
@@ -731,11 +730,7 @@ uint MacVentureEngine::getPrefixNdx(ObjID obj) {
 Common::String MacVentureEngine::getPrefixString(uint flag, ObjID obj) {
 	uint ndx = getPrefixNdx(obj);
 	ndx = ((ndx) >> flag) & 3;
-	if (ndx) {
-		return _decodingNamingArticles->getString(ndx);
-	} else {
-		return Common::String("m1551gn0 ");
-	}
+	return _decodingNamingArticles->getString(ndx);
 }
 
 Common::String MacVentureEngine::getNoun(ObjID ndx) {
@@ -743,20 +738,9 @@ Common::String MacVentureEngine::getNoun(ObjID ndx) {
 }
 
 void MacVentureEngine::highlightExit(ObjID objID) {
-	//ObjID ctl = _gui->getWinChild(obj);
-	/*if (ctl) {
-		if (findObjectInArray(obj, _selectedObjs) != -1)
-			_gui->selectExit(ctl);
-		else
-			_gui->unselectExit(ctl);
-	}
-	if (obj == _world->getObjAttr(1, kAttrParentObject)) {
-		if (findObjectInArray(obj, _selectedObjs) != -1)
-			_gui->selectExit(obj);
-		else
-			_gui->unselectExit(obj);
-	}*/
-	//updateWindow(findParentWindow(obj));
+	// TODO: It seems unnecessary since the GUI checks whether an object
+	//		is selected, which includes exits.
+	warning("STUB: highlightExit");
 }
 
 void MacVentureEngine::selectPrimaryObject(ObjID objID) {
@@ -816,7 +800,6 @@ void MacVentureEngine::closeObject(ObjID objID) {
 }
 
 void MacVentureEngine::checkObject(QueuedObject old) {
-	//warning("checkObject: unimplemented");
 	bool hasChanged = false;
 	debugC(3, kMVDebugMain, "Check Object[%d] parent[%d] x[%d] y[%d]",
 		old.object,
@@ -887,7 +870,6 @@ void MacVentureEngine::checkObject(QueuedObject old) {
 }
 
 void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
-	//warning("reflectSwap: untested");
 	WindowReference from = getObjWindow(fromID);
 	WindowReference to = getObjWindow(toID);
 	WindowReference tmp = to;
@@ -936,7 +918,7 @@ bool MacVentureEngine::isGameRunning() {
 ControlAction MacVenture::MacVentureEngine::referenceToAction(ControlType id) {
 	switch (id) {
 	case MacVenture::kControlExitBox:
-		return kActivateObject;//??
+		return kActivateObject;//?? Like this in the original
 	case MacVenture::kControlExamine:
 		return kExamine;
 	case MacVenture::kControlOpen:
@@ -994,6 +976,8 @@ uint32 MacVentureEngine::randBetween(uint32 min, uint32 max) {
 }
 
 uint32 MacVentureEngine::getInvolvedObjects() {
+	// If there is no valid control selected, we return a number too big
+	// to be useful. There is no control that uses that many objects.
 	return (_selectedControl ? getGlobalSettings()._cmdArgCnts[_selectedControl - 1] : 3000);
 }
 
@@ -1048,7 +1032,7 @@ Common::Rect MacVentureEngine::getObjBounds(ObjID objID) {
 }
 
 uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
-	//not the same parent? 0 overlap
+	// If it's not the same parent, there's 0 overlap
 	if (_world->getObjAttr(one, kAttrParentObject) !=
 		_world->getObjAttr(other, kAttrParentObject))
 		return 0;
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index 5f5273c..f0a3bac 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -1065,11 +1065,11 @@ void ScriptEngine::opcdNCHLD(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opceVERS(EngineState *state, EngineFrame *frame) {
-	state->push(86);
+	state->push(86); // Engine version is irrelevant. Like this in the original.
 }
 
 void ScriptEngine::opcfPSCE(EngineState *state, EngineFrame *frame) {
-	state->push(0); //Not release
+	state->push(0); // Any value greater than 0 indicates "Release".
 }
 
 void ScriptEngine::opd0P1(EngineState *state, EngineFrame *frame) {
diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index a2777f8..46a54bd 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -113,12 +113,11 @@ void TextAsset::decodeHuffman() {
 	} else {
 		strLen = stream.getBits(7);
 	}
-	// OK up to here
 	uint32 mask = 0;
 	uint32 symbol = 0;
 	char c;
 	for (uint16 i = 0; i < strLen; i++) {
-		mask = stream.peekBits(16); // The mask is OK
+		mask = stream.peekBits(16);
 
 		uint32 entry;
 		// Find the length index
diff --git a/engines/macventure/world.cpp b/engines/macventure/world.cpp
index 4847dcf..7c14618 100644
--- a/engines/macventure/world.cpp
+++ b/engines/macventure/world.cpp
@@ -317,6 +317,7 @@ void SaveGame::saveInto(Common::OutSaveFile *file) {
 		file->writeUint16BE((*global));
 	}
 	// Save text
+	// TODO: Insert text from GUI console
 	_text = "Hello";
 	file->write(_text.c_str(), _text.size());
 }
@@ -341,6 +342,7 @@ void SaveGame::loadGlobals(MacVentureEngine *engine, Common::SeekableReadStream
 }
 
 void SaveGame::loadText(MacVentureEngine *engine, Common::SeekableReadStream *res) {
+	// TODO: Load console text. For now, the GUI doesn't even look at this.
 	_text = "Placeholder Console Text";
 }
 


Commit: 12ce17d90c8409c29cb8f88d9af3ffd6a28bd459
    https://github.com/scummvm/scummvm/commit/12ce17d90c8409c29cb8f88d9af3ffd6a28bd459
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:24+02:00

Commit Message:
MACVENTURE: Merge detection tables into detection.cpp

Changed paths:
  R engines/macventure/detection_tables.h
    engines/macventure/detection.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 9329a9a..2b16114 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -29,13 +29,22 @@
 
 namespace MacVenture {
 
+#define ADGF_DEFAULT (ADGF_DROPLANGUAGE|ADGF_DROPPLATFORM|ADGF_MACRESFORK)
+
+#define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
+
+static const ADGameDescription gameDescriptions[] = {
+	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
+	BASEGAME("deja_vu", "Zojoi Rerelease", "Deja Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
+	BASEGAME("deja_vu2", "Zojoi Rerelease", "Lost in Las Vegas.bin", "8f8e1d8d41f577ee0fbc03847969af0d", 66520), // Zojoi Rerelease
+	AD_TABLE_END_MARKER
+};
+
 const char *MacVentureEngine::getGameFileName() const {
 	return _gameDescription->filesDescriptions[0].fileName;
 }
 } // End of namespace MacVenture
 
-#include "macventure/detection_tables.h"
-
 static const PlainGameDescriptor macventureGames[] = {
 	{ "shadowgate", "Shadowgate" },
 	{ "deja_vu", "Deja Vu"},
diff --git a/engines/macventure/detection_tables.h b/engines/macventure/detection_tables.h
deleted file mode 100644
index 6ba51e0..0000000
--- a/engines/macventure/detection_tables.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-namespace MacVenture {
-
-#define ADGF_DEFAULT (ADGF_DROPLANGUAGE|ADGF_DROPPLATFORM|ADGF_MACRESFORK)
-
-#define BASEGAME(n, v, f, md5, s) {n, v, AD_ENTRY1s(f, md5, s), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_DEFAULT, GUIO0()}
-
-static const ADGameDescription gameDescriptions[] = {
-	BASEGAME("shadowgate", "Zojoi Rerelease", "Shadowgate.bin", "ebbfbcbf93938bd2900cb0c0213b19ad", 68974), // Zojoi Rerelease
-	BASEGAME("deja_vu", "Zojoi Rerelease", "Deja Vu.bin", "5e9f5a8e3c8eb29ed02b34ae5937354f", 69034), // Zojoi Rerelease
-	BASEGAME("deja_vu2", "Zojoi Rerelease", "Lost in Las Vegas.bin", "8f8e1d8d41f577ee0fbc03847969af0d", 66520), // Zojoi Rerelease
-	AD_TABLE_END_MARKER
-};
-} // End of namespace MacVenture


Commit: 97af2b6e14ab25e37aa0c3d226c0264ac2a8ec12
    https://github.com/scummvm/scummvm/commit/97af2b6e14ab25e37aa0c3d226c0264ac2a8ec12
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:25+02:00

Commit Message:
MACVENTURE: Remove word typedef

Changed paths:
    engines/macventure/script.cpp
    engines/macventure/script.h



diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index f0a3bac..e18bf65 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -504,20 +504,20 @@ bool ScriptEngine::runFunc(EngineFrame *frame) {
 	return false;
 }
 
-word ScriptEngine::neg16(word val) {
+int16 ScriptEngine::neg16(int16 val) {
 	if (val & 0x8000)
 		val = -((val ^ 0xFFFF) + 1);
 	return val;
 }
 
-word ScriptEngine::neg8(word val) {
+int16 ScriptEngine::neg8(int16 val) {
 	if (val & 0x80)
 		val = -((val ^ 0xff) + 1);
 	return val;
 }
 
-word ScriptEngine::sumChildrenAttr(word obj, word attr, bool recursive) {
-	word sum = 0;
+int16 ScriptEngine::sumChildrenAttr(int16 obj, int16 attr, bool recursive) {
+	int16 sum = 0;
 	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
 	for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
 		sum += _world->getObjAttr(*it, attr);
@@ -526,22 +526,22 @@ word ScriptEngine::sumChildrenAttr(word obj, word attr, bool recursive) {
 }
 
 void MacVenture::ScriptEngine::op80GATT(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
-	word attr = state->pop();
+	int16 obj = state->pop();
+	int16 attr = state->pop();
 	state->push(_world->getObjAttr(obj, attr));
 }
 
 void ScriptEngine::op81SATT(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
-	word attr = state->pop();
-	word val = neg16(state->pop());
+	int16 obj = state->pop();
+	int16 attr = state->pop();
+	int16 val = neg16(state->pop());
 	_world->setObjAttr(obj, attr, val);
 }
 
 void ScriptEngine::op82SUCH(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
-	word attr = state->pop();
-	word recursive = neg16(state->pop());
+	int16 obj = state->pop();
+	int16 attr = state->pop();
+	int16 recursive = neg16(state->pop());
 	state->push(sumChildrenAttr(obj, attr, recursive));
 }
 
@@ -570,39 +570,39 @@ void ScriptEngine::op88PUIB(EngineState *state, EngineFrame *frame, ScriptAsset
 }
 
 void ScriptEngine::op89PUI(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
 	state->push(val);
 }
 
 void ScriptEngine::op8aGGLO(EngineState *state, EngineFrame *frame) {
-	word idx = state->pop();
+	int16 idx = state->pop();
 	state->push(_world->getGlobal(idx));
 }
 
 void ScriptEngine::op8bSGLO(EngineState *state, EngineFrame *frame) {
-	word idx = state->pop();
-	word val = neg16(state->pop());
+	int16 idx = state->pop();
+	int16 val = neg16(state->pop());
 	_world->setGlobal(idx, val);
 	_engine->gameChanged();
 }
 
 void ScriptEngine::op8cRAND(EngineState *state, EngineFrame *frame) {
-	word max = state->pop();
+	int16 max = state->pop();
 	state->push(_engine->randBetween(0, max));
 }
 
 void ScriptEngine::op8dCOPY(EngineState *state, EngineFrame *frame) {
-	word val = state->pop();
+	int16 val = state->pop();
 	state->push(val);
 	state->push(val);
 }
 
 void ScriptEngine::op8eCOPYN(EngineState *state, EngineFrame *frame) {
-	word n = state->pop();
-	word offs = n - 1;
-	word val;
+	int16 n = state->pop();
+	int16 offs = n - 1;
+	int16 val;
 	while (n) {
 		val = state->peek(offs);
 		state->push(val);
@@ -611,16 +611,16 @@ void ScriptEngine::op8eCOPYN(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::op8fSWAP(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(b);
 	state->push(a);
 }
 
 void ScriptEngine::op90SWAPN(EngineState *state, EngineFrame *frame) {
-	word idx = state->pop();
-	word a = state->peek(idx);
-	word b = state->peek(0);
+	int16 idx = state->pop();
+	int16 a = state->peek(idx);
+	int16 b = state->peek(0);
 	state->poke(idx, b);
 	state->poke(0, a);
 }
@@ -630,35 +630,35 @@ void ScriptEngine::op91POP(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::op92COPYP(EngineState *state, EngineFrame *frame) {
-	word val = state->peek(1);
+	int16 val = state->peek(1);
 	state->push(val);
 }
 
 void ScriptEngine::op93COPYPN(EngineState *state, EngineFrame *frame) {
-	word idx = state->pop();
-	word val = state->peek(idx);
+	int16 idx = state->pop();
+	int16 val = state->peek(idx);
 	state->push(val);
 }
 
 void ScriptEngine::op94SHUFF(EngineState *state, EngineFrame *frame) {
-	word a = state->pop();
-	word b = state->pop();
-	word c = state->pop();
+	int16 a = state->pop();
+	int16 b = state->pop();
+	int16 c = state->pop();
 	state->push(a);
 	state->push(c);
 	state->push(b);
 }
 
 void ScriptEngine::op95SORT(EngineState *state, EngineFrame *frame) {
-	word step = neg16(state->pop());
-	word num = neg16(state->pop());
+	int16 step = neg16(state->pop());
+	int16 num = neg16(state->pop());
 	step %= num;
 	if (step < 0) {
 		step += num;
 	}
-	word end = 0;
-	word start = 0;
-	for (word i = 1; i < num; i++) {
+	int16 end = 0;
+	int16 start = 0;
+	for (int16 i = 1; i < num; i++) {
 		start += step;
 		if (start >= num) {
 			start -= num;
@@ -667,8 +667,8 @@ void ScriptEngine::op95SORT(EngineState *state, EngineFrame *frame) {
 			end++;
 			start = end;
 		} else {
-			word a = state->peek(end);
-			word b = state->peek(start);
+			int16 a = state->peek(end);
+			int16 b = state->peek(start);
 			state->poke(end, b);
 			state->poke(start, a);
 		}
@@ -684,14 +684,14 @@ void ScriptEngine::op97SIZE(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::op98ADD(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a + b);
 }
 
 void ScriptEngine::op99SUB(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a - b);
 }
 
@@ -714,14 +714,14 @@ void ScriptEngine::op9cMOD(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::op9dDMOD(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a % b);
 	state->push((a / b) | 0);
 }
 
 void ScriptEngine::op9eABS(EngineState *state, EngineFrame *frame) {
-	word val = neg16(state->pop());
+	int16 val = neg16(state->pop());
 	if (val < 0) {
 		val = -val;
 	}
@@ -729,53 +729,53 @@ void ScriptEngine::op9eABS(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::op9fNEG(EngineState *state, EngineFrame *frame) {
-	word val = -neg16(state->pop());
+	int16 val = -neg16(state->pop());
 	state->push(val);
 }
 
 void ScriptEngine::opa0AND(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a & b);
 }
 
 void ScriptEngine::opa1OR(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a | b);
 }
 
 void ScriptEngine::opa2XOR(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(a ^ b);
 }
 
 void ScriptEngine::opa3NOT(EngineState *state, EngineFrame *frame) {
-	word a = state->pop();
+	int16 a = state->pop();
 	state->push(a ^ 0xFFFF);
 }
 
 void ScriptEngine::opa4LAND(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push((a && b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opa5LOR(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push((a || b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opa6LXOR(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push((!a != !b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opa7LNOT(EngineState *state, EngineFrame *frame) {
-	word a = state->pop();
+	int16 a = state->pop();
 	state->push((a == 0) ? 0xFFFF : 0);
 }
 
@@ -792,22 +792,22 @@ void ScriptEngine::opa9LTU(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opaaGTS(EngineState *state, EngineFrame *frame) {
-	// HACK !!! May not need the neg16, since word is already a signed int!!
-	word b = neg16(state->pop());
-	word a = neg16(state->pop());
+	// HACK !!! May not need the neg16, since it's already a signed int!!
+	int16 b = neg16(state->pop());
+	int16 a = neg16(state->pop());
 	state->push((a > b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opabLTS(EngineState *state, EngineFrame *frame) {
-	// HACK !!! May not need the neg16, since word is already a signed int!!
-	word b = neg16(state->pop());
-	word a = neg16(state->pop());
+	// HACK !!! May not need the neg16, since it's already a signed int!!
+	int16 b = neg16(state->pop());
+	int16 a = neg16(state->pop());
 	state->push((a < b) ? 0xFFFF : 0);
 }
 
 void ScriptEngine::opacEQ(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push((a == b) ? 0xFFFF : 0);
 }
 
@@ -832,7 +832,7 @@ void ScriptEngine::opafCONTW(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
 	val = neg16(val);
@@ -840,59 +840,59 @@ void ScriptEngine::opb0BRA(EngineState *state, EngineFrame *frame, ScriptAsset *
 }
 
 void ScriptEngine::opb1BRAB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val = neg8(val);
 	script->branch(val);
 }
 
 void ScriptEngine::opb2BEQ(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
 	val = neg16(val);
-	word b = state->pop();
+	int16 b = state->pop();
 	if (b != 0) {
 		script->branch(val);
 	}
 }
 
 void ScriptEngine::opb3BEQB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val = neg8(val);
-	word b = state->pop();
+	int16 b = state->pop();
 	if (b != 0) {
 		script->branch(val);
 	}
 }
 
 void ScriptEngine::opb4BNE(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val <<= 8;
 	val = val | script->fetch();
 	val = neg16(val);
-	word b = state->pop();
+	int16 b = state->pop();
 	if (b == 0) {
 		script->branch(val);
 	}
 }
 
 void ScriptEngine::opb5BNEB(EngineState *state, EngineFrame *frame, ScriptAsset *script) {
-	word val = script->fetch();
+	int16 val = script->fetch();
 	val = neg8(val);
-	word b = state->pop();
+	int16 b = state->pop();
 	if (b == 0) {
 		script->branch(val);
 	}
 }
 
 void ScriptEngine::opb6CLAT(EngineState *state, EngineFrame *frame) {
-	word rank = state->pop();
-	word func = state->pop();
+	int16 rank = state->pop();
+	int16 func = state->pop();
 	frame->saves.push_back(FunCall(func, rank));
 }
 
 void ScriptEngine::opb7CCA(EngineState *state, EngineFrame *frame) {
-	word func = state->pop();
+	int16 func = state->pop();
 	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].func == func)
 			frame->saves[i].rank = 0;
@@ -900,14 +900,14 @@ void ScriptEngine::opb7CCA(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opb8CLOW(EngineState *state, EngineFrame *frame) {
-	word hi = state->pop();
+	int16 hi = state->pop();
 	for (uint i = 0; i < frame->saves.size(); i++)
 		if (frame->saves[i].rank <= hi)
 			frame->saves[i].rank = 0;
 }
 
 void ScriptEngine::opb9CHI(EngineState *state, EngineFrame *frame) {
-	word lo = state->pop();
+	int16 lo = state->pop();
 	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].rank >= lo) {
 			frame->saves[i].rank = 0;
@@ -916,8 +916,8 @@ void ScriptEngine::opb9CHI(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opbaCRAN(EngineState *state, EngineFrame *frame) {
-	word hi = state->pop();
-	word lo = state->pop();
+	int16 hi = state->pop();
+	int16 lo = state->pop();
 	for (uint i = 0; i < frame->saves.size(); i++) {
 		if (frame->saves[i].rank >= lo &&
 			frame->saves[i].rank <= hi) {
@@ -944,7 +944,7 @@ bool ScriptEngine::opbbFORK(EngineState *state, EngineFrame *frame) {
 }
 
 bool ScriptEngine::opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset &script) {
-	word id = state->pop();
+	int16 id = state->pop();
 	ScriptAsset newfun = ScriptAsset(id, _scripts);
 	ScriptAsset current = script;
 	debugC(2, kMVDebugScript, "Call function: %d", id);
@@ -957,7 +957,7 @@ bool ScriptEngine::opbcCALL(EngineState *state, EngineFrame *frame, ScriptAsset
 }
 
 void ScriptEngine::opbdFOOB(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
+	int16 obj = state->pop();
 	_engine->enqueueObject(kFocusWindow, obj);
 }
 
@@ -982,7 +982,7 @@ void ScriptEngine::opc0TEXI(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opc1PTXT(EngineState *state, EngineFrame *frame) {
-	word tid = state->pop();
+	int16 tid = state->pop();
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 }
 
@@ -991,20 +991,20 @@ void ScriptEngine::opc2PNEW(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opc3PTNE(EngineState *state, EngineFrame *frame) {
-	word tid = state->pop();
+	int16 tid = state->pop();
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 }
 
 void ScriptEngine::opc4PNTN(EngineState *state, EngineFrame *frame) {
-	word tid = state->pop();
+	int16 tid = state->pop();
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 	_engine->enqueueText(kTextPlain, frame->dest, frame->src, tid);
 	_engine->enqueueText(kTextNewLine, frame->dest, frame->src, 0);
 }
 
 void ScriptEngine::opc5PNUM(EngineState *state, EngineFrame *frame) {
-	word tid = state->pop();
+	int16 tid = state->pop();
 	_engine->enqueueText(kTextNumber, frame->dest, frame->src, tid);
 }
 
@@ -1013,12 +1013,12 @@ void ScriptEngine::opc6P2(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opc7PLBG(EngineState *state, EngineFrame *frame) {
-	word target = state->pop();
+	int16 target = state->pop();
 	_engine->enqueueSound(kSoundPlay, target);
 }
 
 void ScriptEngine::opc8PLAW(EngineState *state, EngineFrame *frame) {
-	word target = state->pop();
+	int16 target = state->pop();
 	_engine->enqueueSound(kSoundPlayAndWait, target);
 }
 
@@ -1032,10 +1032,10 @@ void ScriptEngine::opcaTIME(EngineState *state, EngineFrame *frame) {
 	}
 
 	uint32 totalPlayTime = _engine->getTotalPlayTime() / 1000; // In seconds
-	word hours = totalPlayTime / 3600;
+	int16 hours = totalPlayTime / 3600;
 	totalPlayTime %= 3600;
 	state->push(hours);
-	word minutes = totalPlayTime / 60;
+	int16 minutes = totalPlayTime / 60;
 	totalPlayTime %= 60;
 	state->push(minutes);
 	state->push(totalPlayTime);
@@ -1049,7 +1049,7 @@ void ScriptEngine::opcbDAY(EngineState *state, EngineFrame *frame) {
 
 void ScriptEngine::opccCHLD(EngineState *state, EngineFrame *frame) {
 	bool recursive = state->pop() != 0;
-	word obj = state->pop();
+	int16 obj = state->pop();
 	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
 	for (Common::Array<ObjID>::const_iterator it = children.begin(); it != children.end(); it++) {
 		state->push(*it);
@@ -1059,7 +1059,7 @@ void ScriptEngine::opccCHLD(EngineState *state, EngineFrame *frame) {
 
 void ScriptEngine::opcdNCHLD(EngineState *state, EngineFrame *frame) {
 	bool recursive = state->pop() != 0;
-	word obj = state->pop();
+	int16 obj = state->pop();
 	Common::Array<ObjID> children = _world->getChildren(obj, recursive);
 	state->push(children.size());
 }
@@ -1077,30 +1077,30 @@ void ScriptEngine::opd0P1(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opd1GOBD(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
+	int16 obj = state->pop();
 	Common::Rect bounds = _engine->getObjBounds(obj);
 	state->push(bounds.width());
 	state->push(bounds.height());
 }
 
 void ScriptEngine::opd2GOVP(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	state->push(_engine->getOverlapPercent(b, a));
 }
 
 void ScriptEngine::opd3CAPC(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
+	int16 obj = state->pop();
 	_world->captureChildren(obj);
 }
 
 void ScriptEngine::opd4RELC(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
+	int16 obj = state->pop();
 	_world->releaseChildren(obj);
 }
 
 void ScriptEngine::opd5DLOG(EngineState *state, EngineFrame *frame) {
-	word txt = state->pop();
+	int16 txt = state->pop();
 	if (_engine->showTextEntry(txt, frame->src, frame->dest)) {
 		state->push(0xFF);
 	} else {
@@ -1121,7 +1121,7 @@ void ScriptEngine::opd8WIN(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opd9SLEEP(EngineState *state, EngineFrame *frame) {
-	word ticks = state->pop();
+	int16 ticks = state->pop();
 	g_system->delayMillis((ticks / 60) * 1000);
 	_engine->preparedToRun();
 }
@@ -1148,7 +1148,7 @@ void ScriptEngine::opdeUPSC(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::opdfFMAI(EngineState *state, EngineFrame *frame) {
-	word ticks = state->pop();
+	int16 ticks = state->pop();
 	g_system->delayMillis((ticks / 60) * 1000);
 	_engine->revert();
 }
@@ -1162,16 +1162,16 @@ void ScriptEngine::ope1CHSO(EngineState *state, EngineFrame *frame) {
 }
 
 void ScriptEngine::ope2MDIV(EngineState *state, EngineFrame *frame) {
-	word b = state->pop();
-	word a = state->pop();
+	int16 b = state->pop();
+	int16 a = state->pop();
 	a *= b;
-	word c = state->pop();
+	int16 c = state->pop();
 	a /= c;
 	state->push(a | 0);
 }
 
 void ScriptEngine::ope3UPOB(EngineState *state, EngineFrame *frame) {
-	word obj = state->pop();
+	int16 obj = state->pop();
 	_world->updateObj(obj);
 }
 
@@ -1220,7 +1220,7 @@ bool ScriptAsset::hasNext() {
 	return _ip < _instructions.size();
 }
 
-void ScriptAsset::branch(word amount) {
+void ScriptAsset::branch(int16 amount) {
 	_ip += amount;
 }
 
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index afeed4a..e5ad6e5 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -34,7 +34,6 @@ class Container;
 class World;
 
 typedef uint32 ObjID;
-typedef int16 word;
 
 class ScriptAsset {
 public:
@@ -44,7 +43,7 @@ public:
 	void reset();
 	uint8 fetch();
 	bool hasNext();
-	void branch(word amount);
+	void branch(int16 amount);
 
 	ObjID getId();
 
@@ -66,22 +65,22 @@ public:
 		clear();
 	}
 
-	void push(word data) {
+	void push(int16 data) {
 		sp--;
 		stack[sp] = unneg16(data);
 	}
 
-	word pop() {
-		word v = stack[sp];
+	int16 pop() {
+		int16 v = stack[sp];
 		sp++;
 		return v;
 	}
 
-	word peek(word off) {
+	int16 peek(int16 off) {
 		return stack[sp + off];
 	}
 
-	void poke(word off, word val) {
+	void poke(int16 off, int16 val) {
 		stack[sp + off] = unneg16(val);
 	}
 
@@ -92,12 +91,12 @@ public:
 		}
 	}
 
-	word size() {
+	int16 size() {
 		return 0x80 - sp;
 	}
 
 private:
-	word unneg16(word data) {
+	int16 unneg16(int16 data) {
 		if (data < 0)
 			data = ((-data) ^ 0xFFFF) + 1;
 
@@ -106,15 +105,15 @@ private:
 
 private:
 
-	word stack[0x80];
-	word sp;
+	int16 stack[0x80];
+	int16 sp;
 };
 
 struct FunCall {
-	word func;
-	word rank;
+	int16 func;
+	int16 rank;
 
-	FunCall(word f, word r) {
+	FunCall(int16 f, int16 r) {
 		func = f;
 		rank = r;
 	}
@@ -155,9 +154,9 @@ private:
 private:
 
 	// Aux
-	word neg16(word val);
-	word neg8(word val);
-	word sumChildrenAttr(word obj, word attr, bool recursive);
+	int16 neg16(int16 val);
+	int16 neg8(int16 val);
+	int16 sumChildrenAttr(int16 obj, int16 attr, bool recursive);
 
 	// Opcodes
 	void op80GATT(EngineState *state, EngineFrame *frame);	//get attribute


Commit: 69f2302a1adb9ead458e38a45429477eac2b6ce4
    https://github.com/scummvm/scummvm/commit/69f2302a1adb9ead458e38a45429477eac2b6ce4
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:25+02:00

Commit Message:
MACVENTURE: Remove JavaScript constructs

Changed paths:
    engines/macventure/image.cpp
    engines/macventure/macventure.cpp
    engines/macventure/script.cpp
    engines/macventure/script.h
    engines/macventure/sound.cpp



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index f0146e3..aeb5a50 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -187,7 +187,7 @@ void ImageAsset::decodePPIC3(Common::BitStream &stream, Common::Array<byte> &dat
 		v = stream.getBits(bits);
 		while ((bits = loadBits[load++]) != 0xFF) {
 			huff.symbols[loadBits[load++]] = v % bits;
-			v = (v / bits) | 0;
+			v = (bits != 0) ? (v / bits) : 0;
 		}
 		huff.symbols[loadBits[load++]] = v;
 	}
diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index e28bc4e..b6fcba5 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -1043,7 +1043,7 @@ uint MacVentureEngine::getOverlapPercent(ObjID one, ObjID other) {
 		oneBounds.intersects(otherBounds)) {
 		uint areaOne = oneBounds.width() * oneBounds.height();
 		uint areaOther = otherBounds.width() * otherBounds.height();
-		return (areaOther * 100 / areaOne) | 0;
+		return (areaOne != 0) ? (areaOther * 100 / areaOne) : 0;
 	}
 	return 0;
 }
diff --git a/engines/macventure/script.cpp b/engines/macventure/script.cpp
index e18bf65..d373148 100644
--- a/engines/macventure/script.cpp
+++ b/engines/macventure/script.cpp
@@ -525,6 +525,13 @@ int16 ScriptEngine::sumChildrenAttr(int16 obj, int16 attr, bool recursive) {
 	return sum;
 }
 
+void ScriptEngine::ensureNonzeroDivisor(int16 divisor, byte opcode) {
+	// TODO Untested, since that occassion rarely comes up.
+	if (divisor == 0) {
+		error("SCRIPT: Attempt to divide by 0 in operation %x", opcode);
+	}
+}
+
 void MacVenture::ScriptEngine::op80GATT(EngineState *state, EngineFrame *frame) {
 	int16 obj = state->pop();
 	int16 attr = state->pop();
@@ -704,7 +711,8 @@ void ScriptEngine::op9aMUL(EngineState *state, EngineFrame *frame) {
 void ScriptEngine::op9bDIV(EngineState *state, EngineFrame *frame) {
 	int16 b = state->pop();
 	int16 a = state->pop();
-	state->push((a / b) | 0);
+	ensureNonzeroDivisor(b, 0x9b);
+	state->push(a / b);
 }
 
 void ScriptEngine::op9cMOD(EngineState *state, EngineFrame *frame) {
@@ -716,8 +724,9 @@ void ScriptEngine::op9cMOD(EngineState *state, EngineFrame *frame) {
 void ScriptEngine::op9dDMOD(EngineState *state, EngineFrame *frame) {
 	int16 b = state->pop();
 	int16 a = state->pop();
+	ensureNonzeroDivisor(b, 0x9d);
 	state->push(a % b);
-	state->push((a / b) | 0);
+	state->push(a / b);
 }
 
 void ScriptEngine::op9eABS(EngineState *state, EngineFrame *frame) {
@@ -1166,8 +1175,9 @@ void ScriptEngine::ope2MDIV(EngineState *state, EngineFrame *frame) {
 	int16 a = state->pop();
 	a *= b;
 	int16 c = state->pop();
+	ensureNonzeroDivisor(c, 0xe2);
 	a /= c;
-	state->push(a | 0);
+	state->push(a);
 }
 
 void ScriptEngine::ope3UPOB(EngineState *state, EngineFrame *frame) {
diff --git a/engines/macventure/script.h b/engines/macventure/script.h
index e5ad6e5..0e81e41 100644
--- a/engines/macventure/script.h
+++ b/engines/macventure/script.h
@@ -157,6 +157,7 @@ private:
 	int16 neg16(int16 val);
 	int16 neg8(int16 val);
 	int16 sumChildrenAttr(int16 obj, int16 attr, bool recursive);
+	void ensureNonzeroDivisor(int16 divisor, byte opcode);
 
 	// Opcodes
 	void op80GATT(EngineState *state, EngineFrame *frame);	//get attribute
diff --git a/engines/macventure/sound.cpp b/engines/macventure/sound.cpp
index fd39e2b..422e365 100644
--- a/engines/macventure/sound.cpp
+++ b/engines/macventure/sound.cpp
@@ -126,7 +126,7 @@ void SoundAsset::decode10(Common::SeekableReadStream *stream) {
 	_length = stream->readUint32BE() * 2;
 	//Unused
 	stream->readUint16BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
 		if (i & 1) {
@@ -147,7 +147,7 @@ void SoundAsset::decode12(Common::SeekableReadStream *stream) {
 	stream->seek(base, SEEK_SET);
 	_length = stream->readUint32BE() - 6;
 	stream->readUint16BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	stream->seek(0xe2, SEEK_SET);
 	// TODO: Possible source of bugs, the original just assigns the seek to the scales
 	uint32 scales = stream->pos() + 0xe2;
@@ -191,7 +191,8 @@ void SoundAsset::decode18(Common::SeekableReadStream *stream) {
 	_length = stream->readUint32BE() * 2;
 	//Unused
 	stream->readUint16BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	// TODO: It had `| 0` at the end of this line, possible source of bugs.
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
 		if (i & 1) {
@@ -213,7 +214,7 @@ void SoundAsset::decode1a(Common::SeekableReadStream *stream) {
 	_length = stream->readUint32BE();
 	//Unused
 	stream->readUint16BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
 		if (i & 1) {
@@ -228,7 +229,7 @@ void SoundAsset::decode1a(Common::SeekableReadStream *stream) {
 void SoundAsset::decode44(Common::SeekableReadStream *stream) {
 	stream->seek(0x5e, SEEK_SET);
 	_length = stream->readUint32BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	for (uint i = 0; i < _length; i++) {
 		_data.push_back(stream->readByte());
 	}
@@ -243,7 +244,7 @@ void SoundAsset::decode78(Common::SeekableReadStream *stream) {
 	//Unused
 	stream->readUint32BE();
 	_length = stream->readUint32BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {
 		if (i & 1) {
@@ -264,7 +265,7 @@ void SoundAsset::decode7e(Common::SeekableReadStream *stream) {
 	//Unused
 	stream->readUint32BE();
 	_length = stream->readUint32BE();
-	_frequency = (stream->readUint32BE() * 22100 / 0x10000) | 0;
+	_frequency = (stream->readUint32BE() * 22100 / 0x10000);
 	uint32 last = 0x80;
 	byte ch = 0;
 	for (uint i = 0; i < _length; i++) {


Commit: ccd5ad5162652dd3bcc06136ed1917b9f0f0b2ac
    https://github.com/scummvm/scummvm/commit/ccd5ad5162652dd3bcc06136ed1917b9f0f0b2ac
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:30:25+02:00

Commit Message:
MACVENTURE: Fix double overflow when blitting

Changed paths:
    engines/macventure/image.cpp



diff --git a/engines/macventure/image.cpp b/engines/macventure/image.cpp
index aeb5a50..172121a 100644
--- a/engines/macventure/image.cpp
+++ b/engines/macventure/image.cpp
@@ -530,27 +530,24 @@ void ImageAsset::calculateSectionToDraw(Graphics::ManagedSurface *target, int &o
 }
 
 void ImageAsset::calculateSectionInDirection(uint targetWhole, uint originWhole, int &originPosition, uint &startPosition, uint &blittedWhole) {
+	startPosition = 0;
 	blittedWhole = originWhole;
-	if (originPosition + blittedWhole > targetWhole) {
-		if (originPosition > (int)targetWhole) {
-			blittedWhole = 0;
-		} else {
-			blittedWhole = (blittedWhole) - ((blittedWhole + originPosition) - targetWhole);
-		}
-	}
 	if (originPosition < 0) {
 		if (ABS(originPosition) > (int)blittedWhole) {
 			blittedWhole = 0;
 		} else {
 			blittedWhole -= -originPosition;
 		}
-	}
-
-	startPosition = 0;
-	if (originPosition < 0) {
 		startPosition = -originPosition;
 		originPosition = 0;
 	}
+	if (originPosition + blittedWhole > targetWhole) {
+		if (originPosition > (int)targetWhole) {
+			blittedWhole = 0;
+		} else {
+			blittedWhole = targetWhole - originPosition;
+		}
+	}
 }
 
 } // End of namespace MacVenture


Commit: b884e6e29f26018f01cbaec5731e7a06f0b10d6e
    https://github.com/scummvm/scummvm/commit/b884e6e29f26018f01cbaec5731e7a06f0b10d6e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:41:25+02:00

Commit Message:
MACVENTURE: Fix game file path retrieval

Changed paths:
    engines/macventure/macventure.cpp



diff --git a/engines/macventure/macventure.cpp b/engines/macventure/macventure.cpp
index b6fcba5..826409f 100644
--- a/engines/macventure/macventure.cpp
+++ b/engines/macventure/macventure.cpp
@@ -955,11 +955,10 @@ Common::String MacVentureEngine::getCommandsPausedString() const {
 }
 
 Common::String MacVentureEngine::getFilePath(FilePathID id) const {
-	const Common::Array<Common::String> &names = _filenames->getStrings();
 	if (id <= 3) { // We don't want a file in the subdirectory
-		return Common::String(names[id]);
+		return _filenames->getString(id);
 	} else { // We want a game file
-		return Common::String(names[3] + "/" + names[id]);
+		return _filenames->getString(3) + "/" + _filenames->getString(id);
 	}
 }
 


Commit: d1ce6793fa7f46935709d4bf7f84d0b13c535193
    https://github.com/scummvm/scummvm/commit/d1ce6793fa7f46935709d4bf7f84d0b13c535193
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T16:56:44+02:00

Commit Message:
MACVENTURE: Add static array for border names

Changed paths:
    engines/macventure/datafiles.cpp
    engines/macventure/windows.h



diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index aa47869..d41aa99 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -32,34 +32,35 @@ namespace MacVenture {
 
 #define MACVENTURE_DATA_BUNDLE Common::String("macventure.zip")
 
+struct BorderName {
+	MVWindowType type;
+	const char *name;
+};
+
+static const BorderName g_borderNames[] = {
+	{kDocument, "Document"},
+	{kDBox, "DBox"},
+	{kPlainDBox, "PlainDBox"},
+	{kAltBox, "AltBox"},
+	{kNoGrowDoc, "NoGrowDoc"},
+	{kMovableDBox, "MovableDBox"},
+	{kZoomDoc, "ZoomDoc"},
+	{kZoomNoGrow, "ZoomNoGrow"},
+	{kInvWindow, "InvWindow"},
+	{kRDoc16, "RDoc16"},
+	{kRDoc4, "RDoc4"},
+	{kRDoc6, "RDoc6"},
+	{kRDoc10, "RDoc10"},
+	{kNoType, "No type"}
+};
+
 Common::String windowTypeName(MVWindowType windowType) {
-	switch (windowType) {
-	case kDocument:
-		return "Document";
-	case kDBox:
-		return "DBox";
-	case kPlainDBox:
-		return "PlainDBox";
-	case kAltBox:
-		return "AltBox";
-	case kNoGrowDoc:
-		return "NoGrowDoc";
-	case kMovableDBox:
-		return "MovableDBox";
-	case kZoomDoc:
-		return "ZoomDoc";
-	case kZoomNoGrow:
-		return "ZoomNoGrow";
-	case kInvWindow:
-		return "InvWindow";
-	case kRDoc16:
-		return "RDoc16";
-	case kRDoc4:
-		return "RDoc4";
-	case kRDoc6:
-		return "RDoc6";
-	case kRDoc10:
-		return "RDoc10";
+	int i = 0;
+	while (g_borderNames[i].type != kNoType) {
+		i++;
+		if (g_borderNames[i].type == windowType) {
+			return g_borderNames[i].name;
+		}
 	}
 	return "";
 }
diff --git a/engines/macventure/windows.h b/engines/macventure/windows.h
index 1727698..fd3acef 100644
--- a/engines/macventure/windows.h
+++ b/engines/macventure/windows.h
@@ -55,7 +55,8 @@ enum MVWindowType {
 	kRDoc16 = 0x10,
 	kRDoc4 = 0x12,
 	kRDoc6 = 0x14,
-	kRDoc10 = 0x16
+	kRDoc10 = 0x16,
+	kNoType = 0xFF
 };
 
 struct DrawableObject {


Commit: 059c9a64d9505901a0c150e55af3c2ded372a214
    https://github.com/scummvm/scummvm/commit/059c9a64d9505901a0c150e55af3c2ded372a214
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-19T17:02:48+02:00

Commit Message:
MACVENTURE: Substitute charcodes with char constants

Changed paths:
    engines/macventure/text.cpp



diff --git a/engines/macventure/text.cpp b/engines/macventure/text.cpp
index 46a54bd..6671c28 100644
--- a/engines/macventure/text.cpp
+++ b/engines/macventure/text.cpp
@@ -66,9 +66,9 @@ void TextAsset::decodeOld() {
 			lowercase = true;
 		} else if (val == 0x1C) {
 			if (lowercase) {
-				c = 0x27; // Ascii '
+				c = '\'';
 			} else {
-				c = 0x22; // Ascii '"'
+				c = '"';
 			}
 			lowercase = true;
 		} else if (val == 0x1D) { // Composite


Commit: 1210f05842b927ef07b4817552002b97cdd6906e
    https://github.com/scummvm/scummvm/commit/1210f05842b927ef07b4817552002b97cdd6906e
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-21T13:19:08+02:00

Commit Message:
MACVENTURE: Fix upper limit in savefile names

Changed paths:
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index e5cc9b6..1b56980 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -63,8 +63,8 @@ SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 }
 
 void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
-	if (desc.size() >= (1 << (MACVENTURE_DESC_LENGTH * 4))) {
-		desc.erase((1 << (MACVENTURE_DESC_LENGTH * 4)) - 1);
+	if (desc.size() >= (1 << (MACVENTURE_DESC_LENGTH * 8))) {
+		desc.erase((1 << (MACVENTURE_DESC_LENGTH * 8)) - 1);
 	}
 	file->writeString(desc);
 	file->writeUint32BE(MACVENTURE_SAVE_HEADER);
@@ -121,8 +121,8 @@ bool MacVentureEngine::scummVMSaveLoadDialog(bool isSave) {
 		desc = dialog.createDefaultSaveDescription(slot);
 	}
 
-	if (desc.size() > (1 << MACVENTURE_DESC_LENGTH * 4) - 1)
-		desc = Common::String(desc.c_str(), (1 << MACVENTURE_DESC_LENGTH * 4) - 1);
+	if (desc.size() > (1 << MACVENTURE_DESC_LENGTH * 8) - 1)
+		desc = Common::String(desc.c_str(), (1 << MACVENTURE_DESC_LENGTH * 8) - 1);
 
 	if (slot < 0)
 		return true;


Commit: 0d868742d4016f8f50a8135c20115d911d920cf5
    https://github.com/scummvm/scummvm/commit/0d868742d4016f8f50a8135c20115d911d920cf5
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-21T16:19:55+02:00

Commit Message:
MACVENTURE: Add thumbnail to savegames

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 2b16114..801cc59 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -75,13 +75,16 @@ public:
 	virtual SaveStateList listSaves(const char *target) const;
 	virtual int getMaximumSaveSlot() const;
 	virtual void removeSaveState(const char *target, int slot) const;
+	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
 };
 
 bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return
 		(f == kSupportsListSaves) ||
 		(f == kSupportsLoadingDuringStartup) ||
-		(f == kSupportsDeleteSave);
+		(f == kSupportsDeleteSave) ||
+		(f == kSavesSupportMetaInfo) ||
+		(f == kSavesSupportThumbnail);
 }
 
 bool MacVentureEngine::hasFeature(EngineFeature f) const {
@@ -141,6 +144,30 @@ void MacVentureMetaEngine::removeSaveState(const char *target, int slot) const {
 	g_system->getSavefileManager()->removeSavefile(Common::String::format("%s.%03d", target, slot));
 }
 
+
+SaveStateDescriptor MacVentureMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	SaveStateDescriptor desc;
+	Common::String saveFileName;
+	Common::String pattern = target;
+	pattern += ".###";
+	Common::StringArray filenames = saveFileMan->listSavefiles(pattern);
+	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+		if (slotNum == slot) {
+			saveFileName = *file;
+		}
+	}
+
+	Common::InSaveFile *in = saveFileMan->openForLoading(saveFileName);
+	if (in) {
+		desc = loadMetaData(in, slot);
+		delete in;
+		return desc;
+	}
+	return SaveStateDescriptor(-1, "");
+}
+
 } // End of namespace MacVenture
 
 #if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index 1b56980..a1a5e3c 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -26,16 +26,19 @@
 #include "common/savefile.h"
 #include "engines/savestate.h"
 #include "gui/saveload.h"
+#include "graphics/thumbnail.h"
 
 namespace MacVenture {
 
 #define MACVENTURE_SAVE_HEADER MKTAG('M', 'V', 'S', 'S') // (M)ac(V)enture (S)cummVM (S)ave (0x4d565353, uint32)
 #define MACVENTURE_SAVE_VERSION 1 //1 BYTE
-#define MACVENTURE_DESC_LENGTH 1 //1 BYTE for the description length
+#define MACVENTURE_DESC_LENGTH 4 //4 BYTE for the metadata length
 
 SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 	// Metadata is stored at the end of the file
-	// |DESCRIPTION						|
+	// |THUMBNAIL						|
+	// |								|
+	// |DESCSIZE| DESCRIPTION			|
 	// |HEADER			|VERSION|DESCLEN|
 	s->seek(-(5 + MACVENTURE_DESC_LENGTH), SEEK_END);
 	uint32 sig = s->readUint32BE();
@@ -49,12 +52,18 @@ SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 	// Save is valid, set its slot number
 	desc.setSaveSlot(slot);
 
+	// Depends on MACVENTURE_DESC_LENGTH
+	uint32 metaSize = s->readUint32BE();
+	s->seek(-(5 + MACVENTURE_DESC_LENGTH + metaSize), SEEK_END);
+
+	// Load the thumbnail
+	Graphics::Surface *thumb = Graphics::loadThumbnail(*s);
+	desc.setThumbnail(thumb);
+
 	// Load the description
 	Common::String name;
-	// Depends on MACVENTURE_DESC_LENGTH
-	byte descSize = s->readByte();
-	s->seek(-(5 + MACVENTURE_DESC_LENGTH + descSize), SEEK_END);
-	for (int i = 0; i < descSize; ++i) {
+	uint32 descSize = s->readUint32BE();
+	for (uint32 i = 0; i < descSize; ++i) {
 		name += s->readByte();
 	}
 	desc.setDescription(name);
@@ -63,13 +72,15 @@ SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 }
 
 void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
-	if (desc.size() >= (1 << (MACVENTURE_DESC_LENGTH * 8))) {
-		desc.erase((1 << (MACVENTURE_DESC_LENGTH * 8)) - 1);
-	}
+	uint thumbSize = file->pos();
+	Graphics::saveThumbnail(*file);
+	thumbSize = file->pos() - thumbSize;
+
+	file->writeUint32BE(desc.size());
 	file->writeString(desc);
 	file->writeUint32BE(MACVENTURE_SAVE_HEADER);
 	file->writeByte(MACVENTURE_SAVE_VERSION);
-	file->writeByte(desc.size());
+	file->writeUint32BE(4 + desc.size() + thumbSize);
 }
 
 Common::Error MacVentureEngine::loadGameState(int slot) {
@@ -121,9 +132,10 @@ bool MacVentureEngine::scummVMSaveLoadDialog(bool isSave) {
 		desc = dialog.createDefaultSaveDescription(slot);
 	}
 
+	/*
 	if (desc.size() > (1 << MACVENTURE_DESC_LENGTH * 8) - 1)
 		desc = Common::String(desc.c_str(), (1 << MACVENTURE_DESC_LENGTH * 8) - 1);
-
+	*/
 	if (slot < 0)
 		return true;
 


Commit: b7b258474f0a135f626ec3d46d19b4f54926f50f
    https://github.com/scummvm/scummvm/commit/b7b258474f0a135f626ec3d46d19b4f54926f50f
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-21T16:42:19+02:00

Commit Message:
MACVENTURE: Add creation date and playtime to savegames

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/saveload.cpp



diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index 801cc59..10676d5 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -84,7 +84,9 @@ bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 		(f == kSupportsLoadingDuringStartup) ||
 		(f == kSupportsDeleteSave) ||
 		(f == kSavesSupportMetaInfo) ||
-		(f == kSavesSupportThumbnail);
+		(f == kSavesSupportThumbnail) ||
+		(f == kSavesSupportCreationDate) ||
+		(f == kSavesSupportPlayTime);
 }
 
 bool MacVentureEngine::hasFeature(EngineFeature f) const {
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index a1a5e3c..5373630 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -68,19 +68,63 @@ SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot) {
 	}
 	desc.setDescription(name);
 
+	// Load date
+	uint32 saveDate = s->readUint32LE();
+	int day = (saveDate >> 24) & 0xFF;
+	int month = (saveDate >> 16) & 0xFF;
+	int year = saveDate & 0xFFFF;
+	desc.setSaveDate(year, month, day);
+
+	uint16 saveTime = s->readUint16LE();
+	int hour = (saveTime >> 8) & 0xFF;
+	int minutes = saveTime & 0xFF;
+	desc.setSaveTime(hour, minutes);
+
+	// Load playtime
+	uint32 playTime = s->readUint32LE();
+	desc.setPlayTime(playTime * 1000);
+
 	return desc;
 }
 
+uint saveCurrentDate(Common::OutSaveFile *file) {
+	TimeDate curTime;
+	g_system->getTimeAndDate(curTime);
+
+	uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF);
+	uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF);
+
+	file->writeUint32LE(saveDate);
+	file->writeUint16LE(saveTime);
+
+	// Return the number of bytes occupied
+	return 6;
+}
+
+uint savePlayTime(Common::OutSaveFile *file) {
+	uint32 playTime = g_engine->getTotalPlayTime() / 1000;
+	file->writeUint32LE(playTime);
+	// Return the number of bytes occupied
+	return 4;
+}
+
 void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
+
+	// Write thumbnail
 	uint thumbSize = file->pos();
 	Graphics::saveThumbnail(*file);
 	thumbSize = file->pos() - thumbSize;
 
+	// Write description
 	file->writeUint32BE(desc.size());
 	file->writeString(desc);
+
+	uint dateSize = saveCurrentDate(file);
+	uint playTimeSize = savePlayTime(file);
+
 	file->writeUint32BE(MACVENTURE_SAVE_HEADER);
 	file->writeByte(MACVENTURE_SAVE_VERSION);
-	file->writeUint32BE(4 + desc.size() + thumbSize);
+	file->writeUint32BE(4 + desc.size() + dateSize + playTimeSize + thumbSize);
 }
 
 Common::Error MacVentureEngine::loadGameState(int slot) {


Commit: 841c22704c33057a292a1b0d44ba104d77dd8c18
    https://github.com/scummvm/scummvm/commit/841c22704c33057a292a1b0d44ba104d77dd8c18
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-24T11:59:30+02:00

Commit Message:
MACVENTURE: Include border bitmaps in ScummVM

Changed paths:
  A devtools/create_macventure/AltBox_act.bmp
  A devtools/create_macventure/AltBox_inac.bmp
  A devtools/create_macventure/InvWindow_act.bmp
  A devtools/create_macventure/InvWindow_inac.bmp
  A devtools/create_macventure/NoGrowDoc_act.bmp
  A devtools/create_macventure/NoGrowDoc_inac.bmp
  A devtools/create_macventure/PlainDBox_act.bmp
  A devtools/create_macventure/PlainDBox_inac.bmp
  A devtools/create_macventure/RDoc4_act.bmp
  A devtools/create_macventure/RDoc4_inac.bmp
  A devtools/create_macventure/ZoomDoc_act.bmp
  A devtools/create_macventure/ZoomDoc_inac.bmp
  A devtools/create_macventure/create_macventure.sh
    Makefile.common
    engines/macventure/datafiles.cpp



diff --git a/Makefile.common b/Makefile.common
index df24d39..762b905 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -285,6 +285,9 @@ endif
 ifdef ENABLE_WINTERMUTE
 DIST_FILES_ENGINEDATA+=wintermute.zip
 endif
+ifdef ENABLE_MACVENTURE
+DIST_FILES_ENGINEDATA+=macventure.dat
+endif
 DIST_FILES_ENGINEDATA:=$(addprefix $(srcdir)/dists/engine-data/,$(DIST_FILES_ENGINEDATA))
 
 # pred.dic is currently only used for the AGI engine
diff --git a/devtools/create_macventure/AltBox_act.bmp b/devtools/create_macventure/AltBox_act.bmp
new file mode 100644
index 0000000..aa9fa7e
Binary files /dev/null and b/devtools/create_macventure/AltBox_act.bmp differ
diff --git a/devtools/create_macventure/AltBox_inac.bmp b/devtools/create_macventure/AltBox_inac.bmp
new file mode 100644
index 0000000..aa9fa7e
Binary files /dev/null and b/devtools/create_macventure/AltBox_inac.bmp differ
diff --git a/devtools/create_macventure/InvWindow_act.bmp b/devtools/create_macventure/InvWindow_act.bmp
new file mode 100644
index 0000000..a38b0a9
Binary files /dev/null and b/devtools/create_macventure/InvWindow_act.bmp differ
diff --git a/devtools/create_macventure/InvWindow_inac.bmp b/devtools/create_macventure/InvWindow_inac.bmp
new file mode 100644
index 0000000..f3f2cfa
Binary files /dev/null and b/devtools/create_macventure/InvWindow_inac.bmp differ
diff --git a/devtools/create_macventure/NoGrowDoc_act.bmp b/devtools/create_macventure/NoGrowDoc_act.bmp
new file mode 100644
index 0000000..3570e79
Binary files /dev/null and b/devtools/create_macventure/NoGrowDoc_act.bmp differ
diff --git a/devtools/create_macventure/NoGrowDoc_inac.bmp b/devtools/create_macventure/NoGrowDoc_inac.bmp
new file mode 100644
index 0000000..f3f9765
Binary files /dev/null and b/devtools/create_macventure/NoGrowDoc_inac.bmp differ
diff --git a/devtools/create_macventure/PlainDBox_act.bmp b/devtools/create_macventure/PlainDBox_act.bmp
new file mode 100644
index 0000000..6521080
Binary files /dev/null and b/devtools/create_macventure/PlainDBox_act.bmp differ
diff --git a/devtools/create_macventure/PlainDBox_inac.bmp b/devtools/create_macventure/PlainDBox_inac.bmp
new file mode 100644
index 0000000..6521080
Binary files /dev/null and b/devtools/create_macventure/PlainDBox_inac.bmp differ
diff --git a/devtools/create_macventure/RDoc4_act.bmp b/devtools/create_macventure/RDoc4_act.bmp
new file mode 100644
index 0000000..ab78661
Binary files /dev/null and b/devtools/create_macventure/RDoc4_act.bmp differ
diff --git a/devtools/create_macventure/RDoc4_inac.bmp b/devtools/create_macventure/RDoc4_inac.bmp
new file mode 100644
index 0000000..ab78661
Binary files /dev/null and b/devtools/create_macventure/RDoc4_inac.bmp differ
diff --git a/devtools/create_macventure/ZoomDoc_act.bmp b/devtools/create_macventure/ZoomDoc_act.bmp
new file mode 100644
index 0000000..b2ccc9c
Binary files /dev/null and b/devtools/create_macventure/ZoomDoc_act.bmp differ
diff --git a/devtools/create_macventure/ZoomDoc_inac.bmp b/devtools/create_macventure/ZoomDoc_inac.bmp
new file mode 100644
index 0000000..963949b
Binary files /dev/null and b/devtools/create_macventure/ZoomDoc_inac.bmp differ
diff --git a/devtools/create_macventure/create_macventure.sh b/devtools/create_macventure/create_macventure.sh
new file mode 100755
index 0000000..1408179
--- /dev/null
+++ b/devtools/create_macventure/create_macventure.sh
@@ -0,0 +1,8 @@
+printf "Creating border file...\n"
+
+zip -r macventure.zip *.bmp
+mv macventure.zip macventure.dat
+
+echo done
+
+ls -l macventure.dat
diff --git a/engines/macventure/datafiles.cpp b/engines/macventure/datafiles.cpp
index d41aa99..2c17b66 100644
--- a/engines/macventure/datafiles.cpp
+++ b/engines/macventure/datafiles.cpp
@@ -30,7 +30,7 @@
 
 namespace MacVenture {
 
-#define MACVENTURE_DATA_BUNDLE Common::String("macventure.zip")
+#define MACVENTURE_DATA_BUNDLE Common::String("macventure.dat")
 
 struct BorderName {
 	MVWindowType type;


Commit: e15e6dcfb35a164567165685d79e891b48e8d73a
    https://github.com/scummvm/scummvm/commit/e15e6dcfb35a164567165685d79e891b48e8d73a
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-26T17:04:44+02:00

Commit Message:
MACVENTURE: Fix menu flags and add newgame

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 2745405..4084a89 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -78,15 +78,15 @@ static const Graphics::MenuData menuSubItems[] = {
 	{ kMenuFile,		NULL,				0, 0, false },
 	{ kMenuFile,		"Quit",				kMenuActionQuit, 0, true },
 
-	{ kMenuEdit,		"Undo",				kMenuActionUndo, 'Z', true },
+	{ kMenuEdit,		"Undo",				kMenuActionUndo, 'Z', false },
 	{ kMenuEdit,		NULL,				0, 0, false },
-	{ kMenuEdit,		"Cut",				kMenuActionCut, 'K', true },
-	{ kMenuEdit,		"Copy",				kMenuActionCopy, 'C', true },
-	{ kMenuEdit,		"Paste",			kMenuActionPaste, 'V', true },
-	{ kMenuEdit,		"Clear",			kMenuActionClear, 'B', true },
+	{ kMenuEdit,		"Cut",				kMenuActionCut, 'K', false },
+	{ kMenuEdit,		"Copy",				kMenuActionCopy, 'C', false },
+	{ kMenuEdit,		"Paste",			kMenuActionPaste, 'V', false },
+	{ kMenuEdit,		"Clear",			kMenuActionClear, 'B', false },
 
-	{ kMenuSpecial,		"Clean Up",			kMenuActionCleanUp, 0, true },
-	{ kMenuSpecial,		"Mess Up",			kMenuActionMessUp, 0, true },
+	{ kMenuSpecial,		"Clean Up",			kMenuActionCleanUp, 0, false },
+	{ kMenuSpecial,		"Mess Up",			kMenuActionMessUp, 0, false },
 
 	{ 0,				NULL,				0, 0, false }
 };
@@ -1142,7 +1142,7 @@ void Gui::handleMenuAction(MenuAction action) {
 		warning("Unimplemented MacVenture Menu Action: About");
 		break;
 	case MacVenture::kMenuActionNew:
-		warning("Unimplemented MacVenture Menu Action: New");
+		_engine->newGame();
 		break;
 	case MacVenture::kMenuActionOpen:
 		loadGame();


Commit: 31e1e02ad6f589d927c361026722cfaf7ac74d94
    https://github.com/scummvm/scummvm/commit/31e1e02ad6f589d927c361026722cfaf7ac74d94
Author: Borja Lorente (blorente at ucm.es)
Date: 2016-08-26T17:04:44+02:00

Commit Message:
MACVENTURE: Fix window initialization

Changed paths:
    engines/macventure/gui.cpp



diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index 4084a89..dff41b3 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -218,7 +218,7 @@ void Gui::initWindows() {
 	loadBorders(_controlsWindow, findWindowData(kCommandsWindow).type);
 
 	// Main Game Window
-	_mainGameWindow = _wm.addWindow(true, true, true);
+	_mainGameWindow = _wm.addWindow(false, false, false);
 	_mainGameWindow->setDimensions(getWindowData(kMainGameWindow).bounds);
 	_mainGameWindow->setActive(false);
 	_mainGameWindow->setCallback(mainGameWindowCallback, this);


Commit: 9d4d4f6803252383b4488638092f004e6cc7a214
    https://github.com/scummvm/scummvm/commit/9d4d4f6803252383b4488638092f004e6cc7a214
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-09-03T10:41:31+02:00

Commit Message:
Merge pull request #807 from blorente/macventure-clean

MACVENTURE: Add MacVenture engine.

Changed paths:
  A devtools/create_macventure/AltBox_act.bmp
  A devtools/create_macventure/AltBox_inac.bmp
  A devtools/create_macventure/InvWindow_act.bmp
  A devtools/create_macventure/InvWindow_inac.bmp
  A devtools/create_macventure/NoGrowDoc_act.bmp
  A devtools/create_macventure/NoGrowDoc_inac.bmp
  A devtools/create_macventure/PlainDBox_act.bmp
  A devtools/create_macventure/PlainDBox_inac.bmp
  A devtools/create_macventure/RDoc4_act.bmp
  A devtools/create_macventure/RDoc4_inac.bmp
  A devtools/create_macventure/ZoomDoc_act.bmp
  A devtools/create_macventure/ZoomDoc_inac.bmp
  A devtools/create_macventure/create_macventure.sh
  A engines/macventure/configure.engine
  A engines/macventure/container.cpp
  A engines/macventure/container.h
  A engines/macventure/controls.cpp
  A engines/macventure/controls.h
  A engines/macventure/cursor.cpp
  A engines/macventure/datafiles.cpp
  A engines/macventure/debug.h
  A engines/macventure/detection.cpp
  A engines/macventure/dialog.cpp
  A engines/macventure/dialog.h
  A engines/macventure/gui.cpp
  A engines/macventure/gui.h
  A engines/macventure/hufflists.h
  A engines/macventure/image.cpp
  A engines/macventure/image.h
  A engines/macventure/macventure.cpp
  A engines/macventure/macventure.h
  A engines/macventure/module.mk
  A engines/macventure/prebuilt_dialogs.cpp
  A engines/macventure/prebuilt_dialogs.h
  A engines/macventure/saveload.cpp
  A engines/macventure/script.cpp
  A engines/macventure/script.h
  A engines/macventure/sound.cpp
  A engines/macventure/sound.h
  A engines/macventure/stringtable.h
  A engines/macventure/text.cpp
  A engines/macventure/text.h
  A engines/macventure/windows.cpp
  A engines/macventure/windows.h
  A engines/macventure/world.cpp
  A engines/macventure/world.h
    Makefile.common








More information about the Scummvm-git-logs mailing list