[Scummvm-cvs-logs] SF.net SVN: scummvm:[44377] scummvm/trunk/engines/teenagent

megath at users.sourceforge.net megath at users.sourceforge.net
Sat Sep 26 17:04:13 CEST 2009


Revision: 44377
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44377&view=rev
Author:   megath
Date:     2009-09-26 15:04:09 +0000 (Sat, 26 Sep 2009)

Log Message:
-----------
removed packed structs/direct read/writes, so the game should work on big-endian archs. 

Modified Paths:
--------------
    scummvm/trunk/engines/teenagent/callbacks.cpp
    scummvm/trunk/engines/teenagent/inventory.cpp
    scummvm/trunk/engines/teenagent/inventory.h
    scummvm/trunk/engines/teenagent/objects.cpp
    scummvm/trunk/engines/teenagent/objects.h
    scummvm/trunk/engines/teenagent/scene.cpp
    scummvm/trunk/engines/teenagent/scene.h
    scummvm/trunk/engines/teenagent/teenagent.cpp
    scummvm/trunk/engines/teenagent/teenagent.h

Modified: scummvm/trunk/engines/teenagent/callbacks.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/callbacks.cpp	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/callbacks.cpp	2009-09-26 15:04:09 UTC (rev 44377)
@@ -344,7 +344,7 @@
 			setOns(3, 0x5b);
 			displayMessage(0x55db);
 			SET_FLAG(0xdbdd, 3);
-			strcpy(scene->getObject(4)->name, "body");
+			scene->getObject(4)->setName("body");
 		} else {
 			if (Dialog::pop(scene, 0xdb5c) != 0x636b) //not 'im getting hungry'
 				return true;
@@ -1363,7 +1363,7 @@
 
 	case 0x58a2:
 		Dialog::pop(scene, 0xdaba);
-		strcpy(scene->getObject(13)->name, (const char *)res->dseg.ptr(0x92e5));
+		scene->getObject(13)->setName((const char *)res->dseg.ptr(0x92e5));
 		return true;
 
 	case 0x58b7://Get comb from car
@@ -1532,7 +1532,7 @@
 			playSound(55, 5);
 			playActorAnimation(527);
 			Dialog::show(scene, 0x2219);
-			strcpy(scene->getObject(2)->name, (const char *)res->dseg.ptr(0x9820));
+			scene->getObject(2)->setName((const char *)res->dseg.ptr(0x9820));
 		}
 		return true;
 
@@ -2415,6 +2415,7 @@
 			setOns(3, 0);
 			setOns(4, 0);
 			scene->getWalkbox(0)->rect.clear();
+			scene->getWalkbox(0)->save();
 			playSound(62);
 			//patch lan, 1
 			displayMessage(0x3d3a);
@@ -2985,7 +2986,7 @@
 
 	case 0x6c83:
 		Dialog::pop(scene, 0xdb2e);
-		strcpy(scene->getObject(1)->name, (const char *)res->dseg.ptr(0xaa94));
+		scene->getObject(1)->setName((const char *)res->dseg.ptr(0xaa94));
 		SET_FLAG(0xDBD1, 1);
 		return true;
 

Modified: scummvm/trunk/engines/teenagent/inventory.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/inventory.cpp	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/inventory.cpp	2009-09-26 15:04:09 UTC (rev 44377)
@@ -49,7 +49,15 @@
 	for (byte i = 0; i < offsets; ++i) {
 		offset[i] = items->readUint16LE();
 	}
-	objects = res->dseg.ptr(0xc4a4);
+
+	for(byte i = 0; i < 92; ++i) {
+		InventoryObject io;
+		uint16 obj_addr = res->dseg.get_word(0xc4a4 + i * 2);
+		if (obj_addr != 0) 
+			io.load(res->dseg.ptr(obj_addr));
+		objects.push_back(io);
+	}
+
 	inventory = res->dseg.ptr(0xc48d);
 
 	for (int y = 0; y < 4; ++y)
@@ -138,7 +146,7 @@
 
 			graphics[i].hovered = graphics[i].rect.in(mouse);
 			if (graphics[i].hovered)
-				hovered_obj = (InventoryObject *)res->dseg.ptr(READ_LE_UINT16(objects + item * 2));
+				hovered_obj = &objects[item];
 		}
 		return true;
 
@@ -149,7 +157,7 @@
 
 		if (selected_obj == NULL) {
 			activate(false);
-			_engine->displayMessage(hovered_obj->description());
+			_engine->displayMessage(hovered_obj->description);
 			return true;
 		}
 
@@ -202,7 +210,7 @@
 
 		selected_obj = hovered_obj;
 		if (selected_obj)
-			debug(0, "selected object %s", selected_obj->name);
+			debug(0, "selected object %s", selected_obj->name.c_str());
 		return true;
 
 	case Common::EVENT_KEYDOWN:
@@ -275,7 +283,6 @@
 		return;
 
 	background.render(surface);
-	Resources *res = Resources::instance();
 
 	for (int y = 0; y < 4; y++) {
 		for (int x = 0; x < 6; x++) {
@@ -286,7 +293,7 @@
 
 			//debug(0, "%d,%d -> %u", x0, y0, item);
 
-			InventoryObject *obj = (InventoryObject *)res->dseg.ptr(READ_LE_UINT16(objects + item * 2));
+			InventoryObject *obj = &objects[item];
 			graphics[idx].render(this, obj, surface);
 		}
 	}

Modified: scummvm/trunk/engines/teenagent/inventory.h
===================================================================
--- scummvm/trunk/engines/teenagent/inventory.h	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/inventory.h	2009-09-26 15:04:09 UTC (rev 44377)
@@ -28,6 +28,7 @@
 #include "teenagent/surface.h"
 #include "teenagent/animation.h"
 #include "common/events.h"
+#include "common/array.h"
 #include "teenagent/objects.h"
 
 namespace TeenAgent {
@@ -59,7 +60,7 @@
 	Common::SeekableReadStream *items;
 	uint16 offset[92];
 
-	byte *objects;
+	Common::Array<InventoryObject> objects;
 	byte *inventory;
 	struct Item {
 		Animation animation;

Modified: scummvm/trunk/engines/teenagent/objects.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/objects.cpp	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/objects.cpp	2009-09-26 15:04:09 UTC (rev 44377)
@@ -22,11 +22,31 @@
  * $Id$
  */
 
+#include "common/debug.h"
+#include "common/stream.h"
 #include "teenagent/objects.h"
-#include "common/debug.h"
+#include "teenagent/resources.h"
 
 namespace TeenAgent {
 
+void Rect::load(byte * src) {
+	_base = src;
+	Common::MemoryReadStreamEndian ins(src, 8);
+	left = ins.readUint16();
+	top = ins.readUint16();
+	right = ins.readUint16();
+	bottom = ins.readUint16();
+}
+
+void Rect::save() {
+	assert(_base != NULL);
+	//Common::MemoryWriteStreamEndian out(_base, 8);  //FIXME: maybe add this class to common?
+	WRITE_LE_UINT16(_base + 0, left);
+	WRITE_LE_UINT16(_base + 2, top);
+	WRITE_LE_UINT16(_base + 4, right);
+	WRITE_LE_UINT16(_base + 6, bottom);
+}
+
 void Rect::render(Graphics::Surface *surface, uint8 color) const {
 	surface->hLine(left, bottom, right, color);
 	surface->vLine(left, bottom, top, color);
@@ -34,22 +54,38 @@
 	surface->vLine(right, bottom, top, color);
 }
 
-void Walkbox::dump() {
-	debug(0, "walkbox %02x %02x [%d, %d, %d, %d] %02x %02x %02x %02x  ",
-	      unk00, orientation,
-	      rect.left, rect.right, rect.top, rect.bottom,
-	      unk0a, unk0b, unk0c, unk0d);
+
+void Object::load(byte * src) {
+	_base = src;
+
+	id = *src++;
+
+	rect.load(src); 
+	src += 8;
+	actor_rect.load(src); 
+	src += 8;
+
+	actor_orientation = *src++;
+	enabled = *src++;
+	name = (const char *)src;
+	description = parse_description((const char *)src);
 }
 
+void Object::setName(const Common::String &new_name) {
+	assert(_base != 0);
+	strcpy((char *)(_base + 19), new_name.c_str());
+	name = new_name;
+}
+
 void Object::dump() {
 	debug(0, "object: %u %u [%u,%u,%u,%u], actor: [%u,%u,%u,%u], orientation: %u, name: %s", id, enabled,
 	      rect.left, rect.top, rect.right, rect.bottom,
 	      actor_rect.left, actor_rect.top, actor_rect.right, actor_rect.bottom,
-	      actor_orientation, name
+	      actor_orientation, name.c_str()
 	     );
 }
 
-Common::String Object::description(const char *name) {
+Common::String Object::parse_description(const char *name) {
 	const char *desc = name + strlen(name) + 1;
 	if (*desc == 0)
 		return Common::String();
@@ -77,13 +113,49 @@
 	return result;
 }
 
+void InventoryObject::load(byte *src) {
+	_base = src;
+	id = *src++;
+	animated = *src++;
+	name = (const char *)src;
+	description = Object::parse_description((const char *)src);
+}
 
-Common::String Object::description() const {
-	return description(name);
+void UseHotspot::load(byte *src) {
+	Common::MemoryReadStreamEndian in(src, 9);
+	inventory_id = in.readByte();
+	object_id = in.readByte();
+	unk02 = in.readByte();
+	x = in.readUint16();
+	y = in.readUint16();
+	callback = in.readUint16();
 }
 
-Common::String InventoryObject::description() const {
-	return Object::description(name);
+void Walkbox::dump() {
+	debug(0, "walkbox %02x %02x [%d, %d, %d, %d] %02x %02x %02x %02x  ",
+	      unk00, orientation,
+	      rect.left, rect.right, rect.top, rect.bottom,
+	      unk0a, unk0b, unk0c, unk0d);
 }
 
+void Walkbox::load(byte *src) {
+	_base = src;
+
+	unk00 = *src++;
+	orientation = *src++;
+	rect.load(src);
+	src += 8;
+	unk0a = *src++;
+	unk0b = *src++;
+	unk0c = *src++;
+	unk0d = *src++;
+}
+
+void Walkbox::save() {
+	assert(_base != NULL);
+	_base[1] = orientation;
+	rect.save();
+}
+
+
 } // End of namespace TeenAgent

Modified: scummvm/trunk/engines/teenagent/objects.h
===================================================================
--- scummvm/trunk/engines/teenagent/objects.h	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/objects.h	2009-09-26 15:04:09 UTC (rev 44377)
@@ -27,68 +27,88 @@
 #define TEENAGENT_OBJECTS_H
 
 #include "common/rect.h"
+#include "common/stream.h"
 #include "graphics/surface.h"
 
 namespace TeenAgent {
 
-//move into separate header:
-
-#include "common/pack-start.h"	// START STRUCT PACKING
-
 struct Rect {
 	uint16 left, top, right, bottom;
 
-	inline Rect() : left(0), top(0), right(0), bottom(0) {}
-	inline Rect(uint16 l, uint16 t, uint16 r, uint16 b) : left(l), top(t), right(r), bottom(b) {}
+	inline Rect() : left(0), top(0), right(0), bottom(0), _base(NULL) {}
 
+	inline Rect(uint16 l, uint16 t, uint16 r, uint16 b) : left(l), top(t), right(r), bottom(b), _base(NULL) {}
+
 	inline bool in(const Common::Point &point) const {
 		return point.x >= left && point.x <= right && point.y >= top && point.y <= bottom;
 	}
+
 	inline Common::Point center() const {
 		return Common::Point((right + left) / 2, (bottom + top) / 2);
 	}
+
 	inline bool valid() const {
 		return left < 320 && right < 320 && top < 200 && bottom < 200;
 	}
+
 	void render(Graphics::Surface *surface, uint8 color) const;
-	void dump() {
+
+	void dump() const {
 		debug(0, "rect[%u, %u, %u, %u]", left, top, right, bottom);
 	}
 
-	void clear() {
+	inline void clear() {
 		left = top = right = bottom = 0;
 	}
-} PACKED_STRUCT;
+	
+	void load(byte *src); //8 bytes
+	void save();
 
+protected:
+	byte * _base;
+};
+
 struct Object {
+	enum {kActorUp = 1, kActorRight = 2, kActorDown = 3, kActorLeft = 4 };
+
 	byte id;
 	Rect rect;
 	Rect actor_rect;
 	byte actor_orientation;
-	byte enabled;
-	char name[1];
+	byte enabled; //19 bytes
+	Common::String name, description;
 
-	enum {kActorUp = 1, kActorRight = 2, kActorDown = 3, kActorLeft = 4 };
-
+	Object(): _base(NULL) {}
 	void dump();
-	static Common::String description(const char *name);
-	Common::String description() const;
-} PACKED_STRUCT;
+	void setName(const Common::String &name);
+	void load(byte *addr);
+	
+	static Common::String parse_description(const char *name);
 
+protected:
+	byte * _base;
+};
+
 struct InventoryObject {
 	byte id;
 	byte animated;
-	char name[1];
-	Common::String description() const;
-} PACKED_STRUCT;
+	Common::String name, description;
+	
+	InventoryObject(): id(0), animated(0), _base(0) {}
+	void load(byte *addr);
 
-struct UseObject {
+protected:
+	byte * _base;
+};
+
+struct UseHotspot {
 	byte inventory_id;
 	byte object_id;
 	byte unk02;
 	uint16 x, y;
 	uint16 callback;
-} PACKED_STRUCT;
+	void load(byte *src);
+};
 
 struct Walkbox {
 	byte unk00;
@@ -98,10 +118,15 @@
 	byte unk0b;
 	byte unk0c;
 	byte unk0d;
+
+	Walkbox() : _base(NULL) {}
 	void dump();
-} PACKED_STRUCT;
+	void load(byte *src);
+	void save();
 
-#include "common/pack-end.h"	// END STRUCT PACKING
+protected:
+	byte * _base;
+};
 
 } // End of namespace TeenAgent
 

Modified: scummvm/trunk/engines/teenagent/scene.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/scene.cpp	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/scene.cpp	2009-09-26 15:04:09 UTC (rev 44377)
@@ -35,7 +35,7 @@
 
 Scene::Scene() : intro(false), _engine(NULL),
 		_system(NULL),
-		_id(0), ons(0), walkboxes(0),
+		_id(0), ons(0),
 		orientation(Object::kActorRight),
 		current_event(SceneEvent::kNone), hide_actor(false) {}
 
@@ -52,23 +52,24 @@
 	Common::Point point(_point);
 	debug(0, "moveTo(%d, %d, %u)", point.x, point.y, orient);
 	if (validate) {
-		for (byte i = 0; i < walkboxes; ++i) {
-			Walkbox *w = walkbox[i];
-			if (w->rect.in(point)) {
+		const Common::Array<Walkbox> &scene_walkboxes = walkboxes[_id - 1];
+		for (byte i = 0; i < scene_walkboxes.size(); ++i) {
+			const Walkbox &w = scene_walkboxes[i];
+			if (w.rect.in(point)) {
 				debug(0, "bumped into walkbox %u", i);
-				byte o = w->orientation;
+				byte o = w.orientation;
 				switch (o) {
 				case 1:
-					point.y = w->rect.top - 1;
+					point.y = w.rect.top - 1;
 					break;
 				case 2:
-					point.x = w->rect.right + 1;
+					point.x = w.rect.right + 1;
 					break;
 				case 3:
-					point.y = w->rect.bottom + 1;
+					point.y = w.rect.bottom + 1;
 					break;
 				case 4:
-					point.x = w->rect.left - 1;
+					point.x = w.rect.left - 1;
 					break;
 				default:
 					return;
@@ -110,8 +111,56 @@
 	teenagent_idle.load(s, Animation::kTypeVaria);
 	if (teenagent_idle.empty())
 		error("invalid mark animation");
+		
+	//loading objects & walkboxes
+	objects.resize(42);
+	walkboxes.resize(42);
+	
+	for(byte i = 0; i < 42; ++i) {
+		Common::Array<Object> &scene_objects = objects[i];
+		scene_objects.clear();
+		
+		uint16 scene_table = res->dseg.get_word(0x7254 + i * 2);
+		uint16 object_addr;
+		while ((object_addr = res->dseg.get_word(scene_table)) != 0) {
+			Object obj;
+			obj.load(res->dseg.ptr(object_addr));
+			//obj.dump();
+			scene_objects.push_back(obj);
+			scene_table += 2;
+		}
+		debug(0, "scene[%u] has %u object(s)", i + 1, scene_objects.size());
+
+		byte *walkboxes_base = res->dseg.ptr(READ_LE_UINT16(res->dseg.ptr(0x6746 + i * 2)));
+		byte walkboxes_n = *walkboxes_base++;
+		debug(0, "scene[%u] has %u walkboxes", i + 1, walkboxes_n);
+
+		Common::Array<Walkbox> &scene_walkboxes = walkboxes[i];
+		for (byte j = 0; j < walkboxes_n; ++j) {
+			Walkbox w;
+			w.load(walkboxes_base + 14 * j);
+			//walkbox[i]->dump();
+			scene_walkboxes.push_back(w);
+		}
+	}
 }
 
+Object *Scene::findObject(const Common::Point &point) {
+	if (_id == 0)
+		return NULL;
+	
+	Common::Array<Object> &scene_objects = objects[_id - 1];
+	
+	for(uint i = 0; i < scene_objects.size(); ++i) {
+		Object &obj = scene_objects[i];
+		if (obj.enabled != 0 && obj.rect.in(point))
+			return &obj;
+	}
+	return NULL;
+}
+
+
+
 byte *Scene::getOns(int id) {
 	Resources *res = Resources::instance();
 	return res->dseg.ptr(res->dseg.get_word(0xb4f5 + (id - 1) * 2));
@@ -215,15 +264,6 @@
 	loadOns();
 	loadLans();
 
-	byte *walkboxes_base = res->dseg.ptr(READ_LE_UINT16(res->dseg.ptr(0x6746 + (id - 1) * 2)));
-	walkboxes = *walkboxes_base++;
-
-	debug(0, "found %d walkboxes", walkboxes);
-	for (byte i = 0; i < walkboxes; ++i) {
-		walkbox[i] = (Walkbox *)(walkboxes_base + 14 * i);
-		walkbox[i]->dump();
-	}
-
 	//check music
 	int now_playing = _engine->music->getId();
 
@@ -407,12 +447,13 @@
 
 		//if (!current_event.empty())
 		//	current_event.dump();
-		/*
-		for (byte i = 0; i < walkboxes; ++i) {
-			Walkbox *w = walkbox[i];
-			w->rect.render(surface, 0xd0 + i);
+		{
+			const Common::Array<Walkbox> & scene_walkboxes = walkboxes[_id - 1];
+			for (uint i = 0; i < scene_walkboxes.size(); ++i) {
+				scene_walkboxes[i].rect.render(surface, 0xd0 + i);
+			}
 		}
-		*/
+		
 
 	} while (restart);
 
@@ -585,16 +626,15 @@
 }
 
 Object *Scene::getObject(int id, int scene_id) {
+	assert(id > 0);
+	
 	if (scene_id == 0)
 		scene_id = _id;
 
-	Resources *res = Resources::instance();
-	uint16 addr = res->dseg.get_word(0x7254 + (scene_id - 1) * 2);
-	//debug(0, "object base: %04x, x: %d, %d", addr, point.x, point.y);
-	uint16 object = res->dseg.get_word(addr + 2 * id - 2);
+	if (scene_id == 0)
+		return NULL;
 
-	Object *obj = (Object *)res->dseg.ptr(object);
-	return obj;
+	return &objects[scene_id - 1][id - 1];
 }
 
 Common::Point Scene::messagePosition(const Common::String &str, Common::Point position) {

Modified: scummvm/trunk/engines/teenagent/scene.h
===================================================================
--- scummvm/trunk/engines/teenagent/scene.h	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/scene.h	2009-09-26 15:04:09 UTC (rev 44377)
@@ -29,12 +29,10 @@
 #include "teenagent/actor.h"
 #include "common/system.h"
 #include "common/list.h"
+#include "teenagent/objects.h"
 
 namespace TeenAgent {
 
-struct Walkbox;
-struct Object;
-
 class TeenAgentEngine;
 class Dialog;
 
@@ -130,8 +128,9 @@
 
 	bool eventRunning() const { return !current_event.empty(); }
 
-	Walkbox *getWalkbox(byte id) { return walkbox[id]; }
+	Walkbox *getWalkbox(byte id) { return &walkboxes[_id - 1][id]; }
 	Object *getObject(int id, int scene_id = 0);
+	Object *findObject(const Common::Point &point);
 
 private:
 	void loadOns();
@@ -166,8 +165,8 @@
 	int progress, progress_total;
 	uint8 orientation;
 
-	byte walkboxes;
-	Walkbox *walkbox[255];
+	Common::Array<Common::Array<Object> > objects;
+	Common::Array<Common::Array<Walkbox> > walkboxes;
 
 	Common::String message;
 	Common::Point message_pos;

Modified: scummvm/trunk/engines/teenagent/teenagent.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/teenagent.cpp	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/teenagent.cpp	2009-09-26 15:04:09 UTC (rev 44377)
@@ -52,7 +52,7 @@
 		dcall += 2 * dst_object->id - 2;
 		uint16 callback = READ_LE_UINT16(dcall);
 		if (callback == 0 || !processCallback(callback)) {
-			Common::String desc = dst_object->description();
+			Common::String desc = dst_object->description;
 			scene->displayMessage(desc);
 			//debug(0, "%s[%u]: description: %s", current_object->name, current_object->id, desc.c_str());
 		}
@@ -61,14 +61,14 @@
 	case kActionUse: {
 		InventoryObject *inv = inventory->selectedObject();
 		if (inv != NULL) {
-			byte *dcall = res->dseg.ptr(0xbb87);
-			dcall = res->dseg.ptr(READ_LE_UINT16(dcall + scene->getId() * 2 - 2));
-			for (UseObject *obj = (UseObject *)dcall; obj->inventory_id != 0; ++obj) {
-				if (obj->inventory_id == inv->id && dst_object->id == obj->object_id) {
-					debug(0, "combine! %u,%u", obj->x, obj->y);
+			const Common::Array<UseHotspot> &hotspots = use_hotspots[scene->getId() - 1];
+			for (uint i = 0; i < hotspots.size(); ++i) {
+				const UseHotspot &spot = hotspots[i];
+				if (spot.inventory_id == inv->id && dst_object->id == spot.object_id) {
+					debug(0, "combine! pos?: %u,%u", spot.x, spot.y);
 					//moveTo(Common::Point(obj->x, obj->y), NULL, Examine);
 					inventory->resetSelectedObject();
-					if (!processCallback(TO_LE_16(obj->callback)))
+					if (!processCallback(TO_LE_16(spot.callback)))
 						debug(0, "fixme! display proper description");
 					return;
 				}
@@ -85,7 +85,7 @@
 			dcall += 2 * dst_object->id - 2;
 			uint16 callback = READ_LE_UINT16(dcall);
 			if (!processCallback(callback))
-				scene->displayMessage(dst_object->description());
+				scene->displayMessage(dst_object->description);
 		}
 	}
 	break;
@@ -130,6 +130,24 @@
 	}
 }
 
+void TeenAgentEngine::init() {
+	Resources * res = Resources::instance();
+	use_hotspots.resize(42);
+	byte *scene_hotspots = res->dseg.ptr(0xbb87);
+	for(byte i = 0; i < 42; ++i) {
+		Common::Array<UseHotspot> & hotspots = use_hotspots[i];
+		byte * hotspots_ptr = res->dseg.ptr(READ_LE_UINT16(scene_hotspots + i * 2));
+		while(*hotspots_ptr) {
+			UseHotspot h;
+			h.load(hotspots_ptr);
+			hotspots_ptr += 9;
+			hotspots.push_back(h);
+		}
+	}
+}
+
+
+
 void TeenAgentEngine::deinit() {
 	_mixer->stopAll();
 	delete scene;
@@ -138,6 +156,7 @@
 	inventory = NULL;
 	//delete music;
 	//music = NULL;
+	use_hotspots.clear();
 	Resources::instance()->deinit();
 }
 
@@ -207,6 +226,8 @@
 
 	scene->init(this, _system);
 	inventory->init(this);
+	
+	init();
 
 	_system->setMouseCursor(res->dseg.ptr(0x00da), 8, 12, 0, 0, 1);
 
@@ -236,7 +257,7 @@
 	do {
 		_system->showMouse(true);
 		uint32 t0 = _system->getMillis();
-		Object *current_object = findObject(scene->getId(), mouse);
+		Object *current_object = scene->findObject(mouse);
 
 		while (_event->pollEvent(event)) {
 			if (event.type == Common::EVENT_RTL) {
@@ -314,23 +335,6 @@
 	return Common::kNoError;
 }
 
-Object *TeenAgentEngine::findObject(int id, const Common::Point &point) {
-	Resources *res = Resources::instance();
-	uint16 addr = res->dseg.get_word(0x7254 + (id - 1) * 2);
-	//debug(0, "object base: %04x, x: %d, %d", addr, point.x, point.y);
-	uint16 object;
-	for (; (object = res->dseg.get_word(addr)) != 0; addr += 2) {
-		if (object == 0)
-			return NULL;
-
-		Object *obj = (Object *)res->dseg.ptr(object);
-		//obj->dump();
-		if (obj->enabled != 0 && obj->rect.in(point))
-			return obj;
-	}
-	return NULL;
-}
-
 void TeenAgentEngine::displayMessage(const Common::String &str, byte color) {
 	if (str.empty()) {
 		return;

Modified: scummvm/trunk/engines/teenagent/teenagent.h
===================================================================
--- scummvm/trunk/engines/teenagent/teenagent.h	2009-09-26 13:47:32 UTC (rev 44376)
+++ scummvm/trunk/engines/teenagent/teenagent.h	2009-09-26 15:04:09 UTC (rev 44377)
@@ -53,11 +53,9 @@
 	virtual bool canSaveGameStateCurrently() { return !scene_busy; }
 	virtual bool hasFeature(EngineFeature f) const;
 
-
+	void init();
 	void deinit();
 
-	Object *findObject(int id, const Common::Point &point);
-
 	void examine(const Common::Point &point, Object *object);
 	void use(Object *object);
 
@@ -111,6 +109,8 @@
 	Audio::AudioStream *_musicStream;
 	Audio::SoundHandle _musicHandle, _soundHandle;
 	const ADGameDescription *_gameDescription;
+	
+	Common::Array<Common::Array<UseHotspot> > use_hotspots;
 };
 
 } // End of namespace TeenAgent


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list