mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-31 07:53:36 +00:00
more callbacks, removed anotherMansionTry()
svn-id: r43964
This commit is contained in:
parent
6ed62584ed
commit
549e2b0540
@ -41,22 +41,6 @@ void TeenAgentEngine::rejectMessage() {
|
||||
scene->displayMessage((const char *)res->dseg.ptr(res->dseg.get_word(0x339e + 2 * i)));
|
||||
}
|
||||
|
||||
void TeenAgentEngine::anotherMansionTry() {
|
||||
Resources * res = Resources::instance();
|
||||
byte tries = ++ *(res->dseg.ptr(0xDBEA));
|
||||
debug(0, "another mansion try: %u", tries);
|
||||
if (tries >= 7)
|
||||
return;
|
||||
uint16 ptr = res->dseg.get_word(res->dseg.get_word((tries - 2) * 2 + 0x6035));
|
||||
|
||||
playMusic(11);
|
||||
debug(0, "FIXME: cutscene: meanwhile in a mansion #%u, %04x", tries, ptr);
|
||||
processCallback(ptr);
|
||||
playMusic(6);
|
||||
if (scene->getId() == 11 && CHECK_FLAG(0xDBEC, 1))
|
||||
return;
|
||||
//call 0xac27
|
||||
}
|
||||
|
||||
bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
if (addr == 0)
|
||||
@ -534,17 +518,20 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
return true;
|
||||
|
||||
case 0x4cf1: { //talking with mansion guard
|
||||
playAnimation(529, 1);
|
||||
SET_FLAG(0xda96, 1);
|
||||
if (Dialog::pop(scene, 0xdaa6) != 0x1b4)
|
||||
if (Dialog::pop(scene, 0xdaa6, 529) != 0x1b4)
|
||||
return true;
|
||||
|
||||
Common::Point p = scene->getPosition();
|
||||
moveTo(159, 189, 0);
|
||||
|
||||
playAnimation(550);
|
||||
playAnimation(551, 1);
|
||||
|
||||
moveTo(p, 0);
|
||||
playSound(5, 2);
|
||||
playSound(5, 19);
|
||||
playAnimation(550, 0, true);
|
||||
playAnimation(551, 1, true);
|
||||
waitAnimation();
|
||||
|
||||
moveTo(p, 2);
|
||||
inventory->add(0x13);
|
||||
playAnimation(529, 1);
|
||||
Dialog::pop(scene, 0xdaa6);
|
||||
@ -555,6 +542,24 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
loadScene(14, 280, 198);
|
||||
return true;
|
||||
|
||||
case 0x4d56:
|
||||
inventory->add(16);
|
||||
disableObject(2);
|
||||
setOns(0, 0);
|
||||
playSound(5);
|
||||
playAnimation(547);
|
||||
return true;
|
||||
|
||||
|
||||
case 0x4eb9://Pick up wrapper
|
||||
playSound(5, 12);
|
||||
playSound(5, 18);
|
||||
inventory->add(0x12);
|
||||
setOns(1, 0);
|
||||
playAnimation(549);
|
||||
disableObject(13);
|
||||
return true;
|
||||
|
||||
case 0x4f25:
|
||||
playAnimation(967);
|
||||
displayMessage(0x3542);
|
||||
@ -598,7 +603,14 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
setOns(0, 16);
|
||||
enableObject(2);
|
||||
Dialog::show(scene, 0x0917);
|
||||
return true;
|
||||
|
||||
case 0x51f0:
|
||||
setOns(0, 0);
|
||||
playSound(5, 11);
|
||||
playAnimation(637);
|
||||
disableObject(7);
|
||||
inventory->add(49);
|
||||
return true;
|
||||
|
||||
case 0x5217:
|
||||
@ -708,6 +720,27 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
playAnimation(541);
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x6205:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
displayMessage(0x450e);
|
||||
else
|
||||
processCallback(0x61fe);
|
||||
return true;
|
||||
|
||||
case 0x6217:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
displayMessage(0x44d6);
|
||||
else
|
||||
processCallback(0x61fe);
|
||||
return true;
|
||||
|
||||
case 0x62c1:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
return false;
|
||||
|
||||
processCallback(0x61fe);
|
||||
return true;
|
||||
|
||||
case 0x646e:
|
||||
case 0x6475:
|
||||
@ -799,6 +832,12 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
Dialog::show(scene, 0x2193);
|
||||
SET_FLAG(0xDBAF, 1);
|
||||
return true;
|
||||
|
||||
case 0x79c3:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
return false;
|
||||
processCallback(0x61fe);
|
||||
return true;
|
||||
|
||||
case 0x7b26: //cutting the fence
|
||||
setOns(0, 0);
|
||||
@ -963,8 +1002,9 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
//alredy shown
|
||||
displayMessage(0x53F2);
|
||||
} else {
|
||||
playSound(5);
|
||||
displayMessage(0x53DD);
|
||||
playSound(5, 2);
|
||||
playSound(5, 18);
|
||||
playAnimation(810, false);
|
||||
Dialog::show(scene, 0x60BF);
|
||||
SET_FLAG(0xDBDA, 1);
|
||||
@ -988,22 +1028,6 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
|
||||
//Shore
|
||||
|
||||
case 0x4d56:
|
||||
inventory->add(16);
|
||||
disableObject(2);
|
||||
setOns(0, 0);
|
||||
playSound(5);
|
||||
playAnimation(547);
|
||||
return true;
|
||||
|
||||
|
||||
case 0x4eb9://Pick up wrapper
|
||||
inventory->add(0x12);
|
||||
setOns(1, 0);
|
||||
playAnimation(549);
|
||||
disableObject(13);
|
||||
return true;
|
||||
|
||||
case 0x5348:
|
||||
if (CHECK_FLAG(0xdb99, 1)) { //got broken paddle from boat
|
||||
displayMessage(0x351f);
|
||||
@ -1285,24 +1309,51 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x607f:
|
||||
processCallback(0x60b5);
|
||||
return true;
|
||||
|
||||
case 0x6083:
|
||||
if (CHECK_FLAG(0xDBA4, 1)) {
|
||||
setOns(0, 0);
|
||||
playSound(56, 10);
|
||||
playAnimation(599);
|
||||
inventory->add(37);
|
||||
disableObject(2);
|
||||
} else
|
||||
processCallback(0x60b5);
|
||||
return true;
|
||||
|
||||
case 0x60b5:
|
||||
if (CHECK_FLAG(0xDBAE, 1)) {
|
||||
processCallback(0x60d9);
|
||||
Dialog::show(scene, 0x2FDD);
|
||||
Dialog::show(scene, 0x2fdd);
|
||||
} else {
|
||||
Dialog::show(scene, 0x2E41);
|
||||
Dialog::show(scene, 0x2e41);
|
||||
processCallback(0x60d9);
|
||||
Dialog::show(scene, 0x2E6d);
|
||||
Dialog::show(scene, 0x2e6d);
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x60d9: {
|
||||
Object *obj = scene->getObject(3);
|
||||
moveTo(obj->actor_rect.right, obj->actor_rect.bottom, obj->actor_orientation);
|
||||
moveTo(obj);
|
||||
processCallback(0x612b);
|
||||
moveTo(48, 190, 3);
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x612b:
|
||||
playSound(52, 10);
|
||||
playSound(52, 14);
|
||||
playSound(52, 18);
|
||||
playSound(52, 21);
|
||||
playSound(52, 25);
|
||||
playSound(52, 28);
|
||||
playSound(52, 32);
|
||||
playAnimation(600);
|
||||
loadScene(21, 297, 178, 3);
|
||||
return true;
|
||||
|
||||
case 0x6176:
|
||||
if (CHECK_FLAG(0xDBA4, 1)) {
|
||||
@ -1311,15 +1362,55 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
}
|
||||
playSound(71, 6);
|
||||
playAnimation(598);
|
||||
loadScene(24, scene->getPosition());
|
||||
setOns(2, 0);
|
||||
setLan(1, 0);
|
||||
playAnimation(660, 1);
|
||||
disableObject(1);
|
||||
setLan(1, 0);
|
||||
SET_FLAG(0xDBA4, 1);
|
||||
loadScene(24, scene->getPosition());
|
||||
|
||||
return true;
|
||||
|
||||
case 0x61e9:
|
||||
if (CHECK_FLAG(0xDBA4, 1)) {
|
||||
Dialog::pop(scene, 0xdb1e);
|
||||
} else
|
||||
processCallback(0x61fe);
|
||||
|
||||
return true;
|
||||
|
||||
case 0x6229: //shelves in cellar
|
||||
if (CHECK_FLAG(0xDBA4, 1)) {
|
||||
Common::Point p = scene->getPosition();
|
||||
byte v = GET_FLAG(0xDBB4);
|
||||
switch(v) {
|
||||
case 0:
|
||||
displayMessage(0x4532);
|
||||
moveRel(-34, 0, 1);
|
||||
displayMessage(0x4555);
|
||||
moveRel(20, 0, 1);
|
||||
displayMessage(0x4568);
|
||||
moveRel(20, 0, 1);
|
||||
displayMessage(0x457b);
|
||||
moveRel(20, 0, 1);
|
||||
displayMessage(0x458e);
|
||||
moveTo(p, 3);
|
||||
SET_FLAG(0xDBB4, 1);
|
||||
break;
|
||||
case 1:
|
||||
displayMessage(0x45b8);
|
||||
displayMessage(0x45da);
|
||||
SET_FLAG(0xDBB4, 2);
|
||||
break;
|
||||
default:
|
||||
displayMessage(0x4603);
|
||||
}
|
||||
} else
|
||||
processCallback(0x61fe);
|
||||
|
||||
return true;
|
||||
|
||||
case 0x6480: //flips
|
||||
if (CHECK_FLAG(0xDB96, 1)) {
|
||||
setOns(3, 36);
|
||||
@ -1350,36 +1441,6 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
} else
|
||||
return false;
|
||||
|
||||
case 0x612b://climb basement ladder(exit)
|
||||
playSound(52, 10);
|
||||
playSound(52, 14);
|
||||
playSound(52, 18);
|
||||
playSound(52, 21);
|
||||
playSound(52, 25);
|
||||
playSound(52, 28);
|
||||
playAnimation(600);
|
||||
loadScene(21, 297, 178, 3);
|
||||
return true;
|
||||
|
||||
case 0x6351:
|
||||
if (CHECK_FLAG(0xdaca, 1)) { //cave bush is cut down
|
||||
playMusic(8);
|
||||
loadScene(26, 319, 169);
|
||||
return true;
|
||||
} else {
|
||||
displayMessage(0x3bd2);
|
||||
return true;
|
||||
}
|
||||
|
||||
case 0x6592: //Rake
|
||||
setOns(1, 0);
|
||||
playSound(18, 10);
|
||||
playAnimation(553);
|
||||
inventory->add(0x15);
|
||||
displayMessage(0x3605);
|
||||
disableObject(11);
|
||||
return true;
|
||||
|
||||
case 0x62d0://Get bone from under rock
|
||||
playSound(26, 6);
|
||||
setOns(0, 0);
|
||||
@ -1393,6 +1454,16 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
displayMessage(0x3790);
|
||||
return true;
|
||||
|
||||
case 0x6351:
|
||||
if (CHECK_FLAG(0xdaca, 1)) { //cave bush is cut down
|
||||
playMusic(8);
|
||||
loadScene(26, 319, 169);
|
||||
return true;
|
||||
} else {
|
||||
displayMessage(0x3bd2);
|
||||
return true;
|
||||
}
|
||||
|
||||
case 0x6411://Kick hen
|
||||
if (CHECK_FLAG(0xdb93, 1)) { //already kicked hen
|
||||
displayMessage(0x3e08);
|
||||
@ -1410,6 +1481,21 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
case 0x6592: //Rake
|
||||
setOns(1, 0);
|
||||
playSound(18, 10);
|
||||
playAnimation(553);
|
||||
inventory->add(0x15);
|
||||
displayMessage(0x3605);
|
||||
disableObject(11);
|
||||
return true;
|
||||
|
||||
case 0x66b5:
|
||||
playAnimation(969);
|
||||
playSound(89);
|
||||
loadScene(33, 319, 181);
|
||||
return true;
|
||||
|
||||
case 0x6519://Sickle
|
||||
setOns(4, 0);
|
||||
playSound(5, 11);
|
||||
@ -1510,6 +1596,20 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
|
||||
displayMessage(0x3DAF);
|
||||
return true;
|
||||
|
||||
case 0x7975:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
return false;
|
||||
displayMessage(0x3832);
|
||||
return true;
|
||||
|
||||
case 0x7987:
|
||||
case 0x7996:
|
||||
case 0x79a5:
|
||||
case 0x79b4:
|
||||
if (CHECK_FLAG(0xDBA4, 1))
|
||||
return false;
|
||||
return processCallback(0x61fe);
|
||||
|
||||
case 0x8174:
|
||||
setOns(0, 0);
|
||||
@ -1849,6 +1949,50 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
playAnimation(971);
|
||||
loadScene(32, 139, 199);
|
||||
return true;
|
||||
|
||||
case 0x9002:
|
||||
|
||||
return true;
|
||||
|
||||
case 0x9aca:
|
||||
if (scene->getId() == 13) {
|
||||
moveTo(172, 181, 1);
|
||||
playSound(26, 19);
|
||||
for(uint i = 0; i < 8; ++i)
|
||||
playSound(26, 30 + i * 11);
|
||||
playAnimation(661);
|
||||
//cutscene 3c80 at 30484
|
||||
playSound(56, 10);
|
||||
playSound(56, 21);
|
||||
|
||||
playSound(8, 48);
|
||||
for(uint i = 0; i < 7; ++i)
|
||||
playSound(26, 117 + i * 11);
|
||||
|
||||
moveRel(-20, 0, 0, true);
|
||||
playAnimation(662, 0, true);
|
||||
playAnimation(663, 2, true);
|
||||
waitAnimation();
|
||||
setOns(1, 49);
|
||||
|
||||
//cutscene 0x3c9a at 30453
|
||||
moveTo(162, 184, 0, true);
|
||||
playSound(26, 6);
|
||||
playSound(26, 17);
|
||||
playSound(56, 10);
|
||||
playSound(56, 21);
|
||||
playSound(19, 27);
|
||||
playSound(24, 38);
|
||||
playSound(23, 44);
|
||||
playAnimation(664);
|
||||
playAnimation(665, 2);
|
||||
displayMessage(0x3cbc);
|
||||
displayMessage(0x3cea);
|
||||
inventory->remove(37);
|
||||
processCallback(0x9d45); //another mansion try
|
||||
} else
|
||||
displayMessage(0x3c58);
|
||||
return true;
|
||||
|
||||
case 0x9c79:
|
||||
if (scene->getId() != 36) {
|
||||
@ -1884,13 +2028,35 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x66b5:
|
||||
playAnimation(969);
|
||||
playSound(89);
|
||||
loadScene(33, 319, 181);
|
||||
return true;
|
||||
case 0x9d45: {
|
||||
byte tries = ++ *(res->dseg.ptr(0xDBEA));
|
||||
debug(0, "another mansion try: %u", tries);
|
||||
if (tries >= 7)
|
||||
return false;
|
||||
|
||||
uint16 ptr = res->dseg.get_word((tries - 2) * 2 + 0x6035);
|
||||
byte id = scene->getId();
|
||||
|
||||
playMusic(11);
|
||||
debug(0, "FIXME: cutscene: meanwhile in a mansion #%u, %04x", tries, ptr);
|
||||
processCallback(ptr);
|
||||
playMusic(6);
|
||||
if (scene->getId() == 11 && CHECK_FLAG(0xDBEC, 1))
|
||||
return true;
|
||||
//some effect
|
||||
loadScene(id, scene->getPosition());
|
||||
}
|
||||
return true;
|
||||
|
||||
case 0x9d90:
|
||||
loadScene(34, scene->getPosition());
|
||||
Dialog::show(scene, 0x6f60, 987, 986);
|
||||
playAnimation(990, 0, true);
|
||||
playAnimation(991, 1, true);
|
||||
waitAnimation();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//unimplemented callback :(
|
||||
for (uint i = 0; i < 32; ++i) {
|
||||
debug(0, "code[%u] = %02x ", i, code[i]);
|
||||
|
@ -402,15 +402,21 @@ bool Scene::processEventQueue() {
|
||||
|
||||
case SceneEvent::LoadScene: {
|
||||
init(current_event.scene, current_event.dst);
|
||||
sounds.clear();
|
||||
current_event.clear();
|
||||
} break;
|
||||
|
||||
case SceneEvent::Walk: {
|
||||
if (current_event.color != 0) {
|
||||
warp(current_event.dst, current_event.orientation);
|
||||
Common::Point dst = current_event.dst;
|
||||
if ((current_event.color & 2) != 0) { //relative move
|
||||
dst.x += position.x;
|
||||
dst.y += position.y;
|
||||
}
|
||||
if ((current_event.color & 1) != 0) {
|
||||
warp(dst, current_event.orientation);
|
||||
current_event.clear();
|
||||
} else
|
||||
moveTo(current_event.dst, current_event.orientation);
|
||||
moveTo(dst, current_event.orientation);
|
||||
} break;
|
||||
|
||||
case SceneEvent::Message: {
|
||||
|
@ -51,13 +51,11 @@ void TeenAgentEngine::processObject() {
|
||||
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 (callback == 0) {
|
||||
if (callback == 0 || !processCallback(callback)) {
|
||||
Common::String desc = dst_object->description();
|
||||
scene->displayMessage(desc);
|
||||
//debug(0, "%s[%u]: description: %s", current_object->name, current_object->id, desc.c_str());
|
||||
break;
|
||||
}
|
||||
processCallback(callback);
|
||||
}
|
||||
break;
|
||||
case ActionUse:
|
||||
@ -70,8 +68,9 @@ void TeenAgentEngine::processObject() {
|
||||
if (obj->inventory_id == inv->id && dst_object->id == obj->object_id) {
|
||||
debug(0, "combine! %u,%u", obj->x, obj->y);
|
||||
//moveTo(Common::Point(obj->x, obj->y), NULL, Examine);
|
||||
processCallback(obj->callback);
|
||||
inventory->resetSelectedObject();
|
||||
if (!processCallback(obj->callback))
|
||||
debug(0, "fixme! display proper description");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -86,7 +85,8 @@ void TeenAgentEngine::processObject() {
|
||||
dcall = res->dseg.ptr(READ_LE_UINT16(dcall + scene->getId() * 2 - 2));
|
||||
dcall += 2 * dst_object->id - 2;
|
||||
uint16 callback = READ_LE_UINT16(dcall);
|
||||
processCallback(callback);
|
||||
if (!processCallback(callback))
|
||||
scene->displayMessage(dst_object->description());
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -104,8 +104,9 @@ void TeenAgentEngine::use(Object *object) {
|
||||
dst_object = object;
|
||||
object->rect.dump();
|
||||
object->actor_rect.dump();
|
||||
if (object->actor_rect.valid()) //some objects have 0xffff in left/right
|
||||
scene->moveTo(object->actor_rect.center(), object->actor_orientation);
|
||||
|
||||
if (object->actor_rect.valid())
|
||||
scene->moveTo(Common::Point(object->actor_rect.right, object->actor_rect.bottom), object->actor_orientation);
|
||||
if (object->actor_orientation > 0)
|
||||
scene->setOrientation(object->actor_orientation);
|
||||
action = ActionUse;
|
||||
@ -352,6 +353,10 @@ void TeenAgentEngine::moveTo(const Common::Point & dst, byte o, bool warp) {
|
||||
moveTo(dst.x, dst.y, o, warp);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::moveTo(Object *obj) {
|
||||
moveTo(obj->actor_rect.right, obj->actor_rect.bottom, obj->actor_orientation);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::moveTo(uint16 x, uint16 y, byte o, bool warp) {
|
||||
SceneEvent event(SceneEvent::Walk);
|
||||
event.dst.x = x;
|
||||
@ -361,6 +366,15 @@ void TeenAgentEngine::moveTo(uint16 x, uint16 y, byte o, bool warp) {
|
||||
scene->push(event);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::moveRel(int16 x, int16 y, byte o, bool warp) {
|
||||
SceneEvent event(SceneEvent::Walk);
|
||||
event.dst.x = x;
|
||||
event.dst.y = y;
|
||||
event.orientation = o;
|
||||
event.color = (warp? 1: 0) | 2;
|
||||
scene->push(event);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::playAnimation(uint16 id, byte slot, bool async) {
|
||||
SceneEvent event(SceneEvent::PlayAnimation);
|
||||
event.animation = id;
|
||||
|
@ -69,6 +69,8 @@ public:
|
||||
void displayMessage(const Common::String &str, byte color = 0xd1);
|
||||
void moveTo(const Common::Point & dst, byte o, bool warp = false);
|
||||
void moveTo(uint16 x, uint16 y, byte o, bool warp = false);
|
||||
void moveTo(Object * obj);
|
||||
void moveRel(int16 x, int16 y, byte o, bool warp = false);
|
||||
void playAnimation(uint16 id, byte slot = 0, bool async = false);
|
||||
void loadScene(byte id, const Common::Point &pos, byte o = 0);
|
||||
void loadScene(byte id, uint16 x, uint16 y, byte o = 0);
|
||||
@ -94,7 +96,6 @@ public:
|
||||
|
||||
private:
|
||||
void processObject();
|
||||
void anotherMansionTry();
|
||||
|
||||
bool scene_busy;
|
||||
Action action;
|
||||
|
Loading…
x
Reference in New Issue
Block a user