aboutsummaryrefslogtreecommitdiff
path: root/engines/teenagent/teenagent.cpp
diff options
context:
space:
mode:
authorVladimir Menshakov2009-12-01 08:00:13 +0000
committerVladimir Menshakov2009-12-01 08:00:13 +0000
commitc839eeda81079d63394f96677c2afb86409c5bd5 (patch)
tree425bf2704f0461e70bcda36a535194b82313c069 /engines/teenagent/teenagent.cpp
parent7bbcc1830b27777627cbe2f04c0b2e03cc89b696 (diff)
downloadscummvm-rg350-c839eeda81079d63394f96677c2afb86409c5bd5.tar.gz
scummvm-rg350-c839eeda81079d63394f96677c2afb86409c5bd5.tar.bz2
scummvm-rg350-c839eeda81079d63394f96677c2afb86409c5bd5.zip
use selected object with both mouse buttons as in original game
svn-id: r46227
Diffstat (limited to 'engines/teenagent/teenagent.cpp')
-rw-r--r--engines/teenagent/teenagent.cpp92
1 files changed, 50 insertions, 42 deletions
diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp
index 9b3b2da18b..56e7462d19 100644
--- a/engines/teenagent/teenagent.cpp
+++ b/engines/teenagent/teenagent.cpp
@@ -42,6 +42,45 @@ TeenAgentEngine::TeenAgentEngine(OSystem *system, const ADGameDescription *gd) :
music = new MusicPlayer();
}
+bool TeenAgentEngine::trySelectedObject() {
+ InventoryObject *inv = inventory->selectedObject();
+ if (inv == NULL)
+ return false;
+
+ Resources *res = Resources::instance();
+ debug(0, "checking active object %u on %u", inv->id, dst_object->id);
+
+ //mouse time challenge hack:
+ if (
+ (res->dseg.get_byte(0) == 1 && inv->id == 49 && dst_object->id == 5) ||
+ (res->dseg.get_byte(0) == 2 && inv->id == 29 && dst_object->id == 5)
+ ) {
+ //putting rock into hole or superglue on rock
+ processCallback(0x8d57);
+ return true;
+ }
+
+ 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, "use object on hotspot!");
+ spot.dump();
+ if (spot.actor_x != 0xffff && spot.actor_y != 0xffff)
+ moveTo(spot.actor_x, spot.actor_y, spot.orientation);
+ inventory->resetSelectedObject();
+ if (!processCallback(TO_LE_16(spot.callback)))
+ debug(0, "fixme! display proper description");
+ return true;
+ }
+ }
+
+ //error
+ inventory->resetSelectedObject();
+ displayMessage(0x3457);
+ return true;
+}
+
void TeenAgentEngine::processObject() {
if (dst_object == NULL)
return;
@@ -49,6 +88,9 @@ void TeenAgentEngine::processObject() {
Resources *res = Resources::instance();
switch (action) {
case kActionExamine: {
+ if (trySelectedObject())
+ break;
+
byte *dcall = res->dseg.ptr(0xb5ce);
dcall = res->dseg.ptr(READ_LE_UINT16(dcall + scene->getId() * 2 - 2));
dcall += 2 * dst_object->id - 2;
@@ -61,49 +103,15 @@ void TeenAgentEngine::processObject() {
}
break;
case kActionUse: {
- InventoryObject *inv = inventory->selectedObject();
- if (inv != NULL) {
- debug(0, "checking active object %u on %u", inv->id, dst_object->id);
-
- //mouse time challenge hack:
- if (
- (res->dseg.get_byte(0) == 1 && inv->id == 49 && dst_object->id == 5) ||
- (res->dseg.get_byte(0) == 2 && inv->id == 29 && dst_object->id == 5)
- ) {
- //putting rock into hole or superglue on rock
- processCallback(0x8d57);
- return;
- }
-
-
- 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, "use object on hotspot!");
- spot.dump();
- if (spot.actor_x != 0xffff && spot.actor_y != 0xffff)
- moveTo(spot.actor_x, spot.actor_y, spot.orientation);
- inventory->resetSelectedObject();
- if (!processCallback(TO_LE_16(spot.callback)))
- debug(0, "fixme! display proper description");
- return;
- }
- }
-
- //error
- inventory->resetSelectedObject();
- displayMessage(0x3457);
-
+ if (trySelectedObject())
break;
- } else {
- byte *dcall = res->dseg.ptr(0xb89c);
- dcall = res->dseg.ptr(READ_LE_UINT16(dcall + scene->getId() * 2 - 2));
- dcall += 2 * dst_object->id - 2;
- uint16 callback = READ_LE_UINT16(dcall);
- if (!processCallback(callback))
- scene->displayMessage(dst_object->description);
- }
+
+ byte *dcall = res->dseg.ptr(0xb89c);
+ dcall = res->dseg.ptr(READ_LE_UINT16(dcall + scene->getId() * 2 - 2));
+ dcall += 2 * dst_object->id - 2;
+ uint16 callback = READ_LE_UINT16(dcall);
+ if (!processCallback(callback))
+ scene->displayMessage(dst_object->description);
}
break;