[Scummvm-cvs-logs] SF.net SVN: scummvm:[53681] scummvm/trunk/engines/lastexpress

littleboy at users.sourceforge.net littleboy at users.sourceforge.net
Fri Oct 22 01:39:48 CEST 2010


Revision: 53681
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53681&view=rev
Author:   littleboy
Date:     2010-10-21 23:39:48 +0000 (Thu, 21 Oct 2010)

Log Message:
-----------
LASTEXPRESS: Implement 7 AI logic functions

Modified Paths:
--------------
    scummvm/trunk/engines/lastexpress/entities/coudert.cpp
    scummvm/trunk/engines/lastexpress/entities/francois.cpp
    scummvm/trunk/engines/lastexpress/entities/kahina.cpp
    scummvm/trunk/engines/lastexpress/entities/milos.cpp
    scummvm/trunk/engines/lastexpress/entities/mmeboutarel.cpp
    scummvm/trunk/engines/lastexpress/entities/tatiana.cpp
    scummvm/trunk/engines/lastexpress/shared.h

Modified: scummvm/trunk/engines/lastexpress/entities/coudert.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/coudert.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/coudert.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -3124,7 +3124,105 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(51, Coudert, function51)
-	error("Coudert: callback function 51 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		if (getState()->time > kTime2133000 && !getProgress().field_40) {
+			getEntities()->exitCompartment(kEntityCoudert, kObjectCompartmentB);
+			getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
+			getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+			setCallback(1);
+			setup_updateEntity(kCarRedSleeping, kPosition_2000);
+		}
+		break;
+
+	case kActionOpenDoor:
+		if (savepoint.param.intValue == kObjectCompartmentB)
+			getData()->entityPosition = kPosition_7500;
+
+		getSound()->playSound(kEntityPlayer, "LIB014");
+		getAction()->playAnimation(kEventCoudertGoingOutOfVassiliCompartment);
+		getEntities()->updateEntity(kEntityCoudert, kCarRedSleeping, kPosition_2000);
+		getScenes()->loadSceneFromObject(savepoint.param.intValue == kObjectCompartmentB ? kObjectCompartmentB : kObjectCompartmentA);
+		getEntities()->exitCompartment(kEntityCoudert, kObjectCompartmentB, true);
+		getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
+		getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+		setCallback(3);
+		setup_updateEntity(kCarRedSleeping, kPosition_2000);
+		break;
+
+	case kActionDefault:
+		getData()->car = kCarRedSleeping;
+		getData()->entityPosition = kPosition_7500;
+		getData()->location = kLocationOutsideCompartment;
+
+		getSavePoints()->push(kEntityCoudert, kEntityMax, kActionMaxFreeFromCage);
+
+		if (ENTITY_PARAM(0, 5)) {
+			ENTITY_PARAM(0, 5) = 0;
+
+			getSavePoints()->push(kEntityCoudert, kEntityMertens, kAction155853632);
+			getSavePoints()->push(kEntityCoudert, kEntityMertens, kActionEndSound);
+		}
+
+		if (ENTITY_PARAM(0, 3)) {
+			ENTITY_PARAM(0, 3) = 0;
+
+			getSavePoints()->push(kEntityCoudert, kEntityVerges, kAction155853632);
+			getSavePoints()->push(kEntityCoudert, kEntityVerges, kActionEndSound);
+		}
+
+		getEntities()->drawSequenceLeft(kEntityCoudert, "627Wb");
+		getEntities()->enterCompartment(kEntityCoudert, kObjectCompartmentB, true);
+		getSavePoints()->push(kEntityCoudert, kEntityTatiana, kAction154071333);
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_function18();
+			break;
+
+		case 2:
+		case 4:
+		case 6:
+			setup_function45();
+			break;
+
+		case 3:
+			setCallback(4);
+			setup_function18();
+			break;
+
+		case 5:
+			setCallback(5);
+			setup_function18();
+			break;
+		}
+		break;
+
+	case kAction168316032:
+		getObjects()->update(kObjectCompartmentA, kEntityCoudert, kObjectLocationNone, kCursorNormal, kCursorHand);
+		getObjects()->update(kObjectCompartmentB, kEntityCoudert, kObjectLocation1, kCursorNormal, kCursorHand);
+		break;
+
+	case kAction235061888:
+		getEntities()->exitCompartment(kEntityCoudert, kObjectCompartmentB, true);
+		getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
+		getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+		setCallback(5);
+		setup_updateEntity(kCarRedSleeping, kPosition_2000);
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/entities/francois.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/francois.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/francois.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -109,7 +109,92 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION_II(8, Francois, updateEntity, CarIndex, EntityPosition)
-	error("Francois: callback function 8 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) {
+			CALLBACK_ACTION();
+		} else {
+			if (!getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 2000)
+			 || !getInventory()->hasItem(kItemFirebird)
+			 || getEvent(kEventFrancoisShowEgg)
+			 || getEvent(kEventFrancoisShowEggD)
+			 || getEvent(kEventFrancoisShowEggNight)
+			 || getEvent(kEventFrancoisShowEggNightD)) {
+				if (getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 2000)
+				 && getInventory()->get(kItemBeetle)->location == kObjectLocation1
+				 && !getEvent(kEventFrancoisShowBeetle)
+				 && !getEvent(kEventFrancoisShowBeetleD))
+				getData()->inventoryItem = kItemMatchBox;
+			} else {
+				getData()->inventoryItem = kItemFirebird;
+			}
+
+			if (ENTITY_PARAM(0, 1)
+			 && getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 1000)
+			 && !getEntities()->isInsideCompartments(kEntityPlayer)
+			 && !getEntities()->checkFields10(kEntityPlayer)) {
+				setCallback(1);
+				setup_savegame(kSavegameTypeEvent, kEventFrancoisTradeWhistle);
+			}
+		}
+		break;
+
+	case kAction1:
+		switch (savepoint.param.intValue) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_savegame(kSavegameTypeEvent, kEventFrancoisShowBeetle);
+			break;
+
+		case 18:
+			if (isNight())
+				getAction()->playAnimation(getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition ? kEventFrancoisShowEggNightD : kEventFrancoisShowEggNight);
+			else
+				getAction()->playAnimation(getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition ? kEventFrancoisShowEggD : kEventFrancoisShowEgg);
+
+			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
+			break;
+		}
+		break;
+
+	case kActionExcuseMeCath:
+	case kActionExcuseMe:
+		getSound()->excuseMe(_entityIndex);
+		break;
+
+	case kActionDefault:
+		if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2))
+			CALLBACK_ACTION();
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			getAction()->playAnimation(getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition ? kEventFrancoisTradeWhistleD : kEventFrancoisTradeWhistle);
+			getInventory()->addItem(kItemWhistle);
+			getInventory()->removeItem(kItemMatchBox);
+			getInventory()->get(kItemBeetle)->location = kObjectLocation2;
+			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
+			ENTITY_PARAM(0, 1) = 0;
+			break;
+
+		case 2:
+			getAction()->playAnimation(getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition ? kEventFrancoisShowBeetleD : kEventFrancoisShowBeetle);
+			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
+			getData()->inventoryItem = kItemNone;
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -539,7 +624,96 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
-	error("Francois: callback function 14 not implemented!");
+	// Expose parameters as IISS and ignore the default exposed parameters
+	EntityData::EntityParametersIISS *parameters = (EntityData::EntityParametersIISS*)_data->getCurrentParameters();
+
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionDefault:
+		strcpy((char *)&parameters->seq2, "605H");
+		strcat((char *)&parameters->seq2, (char *)&parameters->seq1);
+
+		setCallback(1);
+		setup_function9();
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_updateEntity(kCarRedSleeping, (EntityPosition)parameters->param2);
+			break;
+
+		case 2:
+			if (getInventory()->get(kItemBeetle)->location == kObjectLocation3) {
+				getEntities()->drawSequenceLeft(kEntityFrancois, (char *)&parameters->seq2);
+				getEntities()->enterCompartment(kEntityFrancois, (ObjectIndex)parameters->param1, true);
+
+				setCallback(3);
+				setup_playSound("Fra2005A");
+			} else {
+				if (parameters->param2 >= kPosition_5790) {
+					setCallback(10);
+					setup_updateEntity(kCarRedSleeping, kPosition_9460);
+				} else {
+					setCallback(9);
+					setup_updateEntity(kCarRedSleeping, kPosition_540);
+				}
+			}
+			break;
+
+		case 3:
+		case 5:
+			setCallback(getCallback() == 3 ? 4 : 6);
+			setup_updateFromTime(rnd(450));
+			break;
+
+		case 4:
+		case 6:
+			setCallback(getCallback() == 4 ? 5 : 7);
+			setup_playSound(rnd(2) ? "Fra2005B" : "Fra2005C");
+			break;
+
+		case 7:
+			setCallback(8);
+			setup_updateFromTime(rnd(150));
+			break;
+
+		case 8:
+			getEntities()->exitCompartment(kEntityFrancois, (ObjectIndex)parameters->param1);
+			// Fallback to next case
+
+		case 9:
+			setCallback(10);
+			setup_updateEntity(kCarRedSleeping, kPosition_9460);
+			break;
+
+		case 10:
+			setCallback(11);
+			setup_updateFromTime(900);
+			break;
+
+		case 11:
+			setCallback(12);
+			setup_updateEntity(kCarRedSleeping, kPosition_5790);
+			break;
+
+		case 12:
+			setCallback(13);
+			setup_function10();
+			break;
+
+		case 13:
+			CALLBACK_ACTION();
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/entities/kahina.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/kahina.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/kahina.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -1120,7 +1120,103 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(26, Kahina, function26)
-	error("Kahina: callback function 26 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionDefault:
+		if (!getEvent(kEventAnnaBaggageArgument)) {
+			setCallback(1);
+			setup_function19(kCarRedSleeping, kPosition_8200);
+			break;
+		}
+
+		getScenes()->loadSceneFromItemPosition(kItemFirebird);
+		getInventory()->get(kItemFirebird)->location = kObjectLocation5;
+		getSavePoints()->push(kEntityKahina, kEntityKronos, kAction138085344);
+		getInventory()->setLocationAndProcess(kItemBriefcase, kObjectLocation2);
+		getProgress().field_78 = 1;
+
+		CALLBACK_ACTION();
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			if (getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850)) {
+				setCallback(2);
+				setup_function19(kCarRedSleeping, kPosition_9460);
+			} else {
+				setCallback(6);
+				setup_enterExitCompartment("616Aa", kObjectCompartmentA);
+			}
+			break;
+
+		case 2:
+			setCallback(3);
+			setup_updateFromTime(1800);
+			break;
+
+		case 3:
+			setCallback(4);
+			setup_function19(kCarRedSleeping, kPosition_8200);
+			break;
+
+		case 4:
+			if (getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850)) {
+				setCallback(5);
+				setup_function19(kCarRedSleeping, kPosition_9270);
+			} else {
+				setCallback(6);
+				setup_enterExitCompartment("616Aa", kObjectCompartmentA);
+			}
+			break;
+
+		case 5:
+		case 9:
+			getEntities()->clearSequences(kEntityKahina);
+
+			CALLBACK_ACTION();
+			break;
+
+		case 6:
+			getData()->location = kLocationInsideCompartment;
+			getEntities()->clearSequences(kEntityKahina);
+
+			getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).location, kCursorNormal, kCursorNormal);
+			getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).location, kCursorNormal, kCursorNormal);
+
+			setCallback(7);
+			setup_updateFromTime(900);
+			break;
+
+		case 7:
+			getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).location, kCursorHandKnock, kCursorHand);
+			getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).location, kCursorHandKnock, kCursorHand);
+
+			if (getInventory()->get(kItemFirebird)->location == kObjectLocation1 || getInventory()->get(kItemFirebird)->location == kObjectLocation2) {
+				getScenes()->loadSceneFromItemPosition(kItemFirebird);
+				getInventory()->get(kItemFirebird)->location = kObjectLocation5;
+				getSavePoints()->push(kEntityKahina, kEntityKronos, kAction138085344);
+				ENTITY_PARAM(0, 3) = 1;
+			}
+
+			setCallback(8);
+			setup_enterExitCompartment("616Ba", kObjectCompartmentA);
+			break;
+
+		case 8:
+			getData()->location = kLocationOutsideCompartment;
+
+			setCallback(9);
+			setup_updateEntity(kCarKronos, kPosition_9270);
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/entities/milos.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/milos.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/milos.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -25,6 +25,8 @@
 
 #include "lastexpress/entities/milos.h"
 
+#include "lastexpress/entities/vesna.h"
+
 #include "lastexpress/game/action.h"
 #include "lastexpress/game/entities.h"
 #include "lastexpress/game/inventory.h"
@@ -973,7 +975,104 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(25, Milos, function25)
-	error("Milos: callback function 25 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		if (!getEvent(kEventMilosCompartmentVisitTyler) && !getProgress().field_54 && !ENTITY_PARAM(0, 4)) {
+			UPDATE_PARAM_PROC(params->param3, getState()->time, 13500)
+				getSavePoints()->push(kEntityMilos, kEntityVesna, kAction155913424);
+				params->param3 = 0;
+			UPDATE_PARAM_PROC_END
+		}
+
+		if (params->param1) {
+			UPDATE_PARAM(params->param4, getState()->timeTicks, 75);
+
+			params->param1 = 0;
+			params->param2 = 1;
+			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorNormal, kCursorNormal);
+		}
+
+		params->param4 = 0;
+		break;
+
+	case kActionKnock:
+	case kActionOpenDoor:
+		getObjects()->update(kObjectCompartmentG, kEntityMilos, params->param1 ? kObjectLocation3 : kObjectLocation1, kCursorNormal, kCursorNormal);
+
+		if (params->param1) {
+			setCallback(5);
+			setup_playSound(rnd(2) ? "CAT1505" : "CAT1505A");
+		} else {
+			setCallback(savepoint.action == kActionKnock ? 1 : 2);
+			setup_playSound(savepoint.action == kActionKnock ?  "LIB012" : "LIB013");
+		}
+		break;
+
+	case kActionDefault:
+		getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation3, kCursorHandKnock, kCursorHand);
+
+		if (!getEvent(kEventMilosCompartmentVisitTyler) && !getProgress().field_54 && !ENTITY_PARAM(0, 4))
+			getSavePoints()->push(kEntityMilos, kEntityVesna, kAction155913424);
+		break;
+
+	case kActionDrawScene:
+		if (params->param1 || params->param2) {
+			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation3, kCursorHandKnock, kCursorHand);
+
+			params->param1 = 0;
+			params->param2 = 0;
+		}
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+		case 2:
+			if (getEntities()->isInsideCompartment(kEntityVesna, kCarRedSleeping, kPosition_3050)) {
+				setCallback(3);
+				setup_playSound("VES1015A");
+				break;
+			}
+
+			if (getEvent(kEventMilosCompartmentVisitTyler) || ENTITY_PARAM(0, 4)) {
+				getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorHandKnock, kCursorHand);
+				break;
+			}
+
+			RESET_ENTITY_STATE(kEntityVesna, Vesna, setup_chapter3Handler);
+
+			getData()->location = kLocationInsideCompartment;
+
+			setCallback(4);
+			setup_savegame(kSavegameTypeEvent, kEventMilosCompartmentVisitTyler);
+			break;
+
+		case 3:
+			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorTalk, kCursorNormal);
+			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+			params->param1 = 1;
+			break;
+
+		case 4:
+			getAction()->playAnimation(kEventMilosCompartmentVisitTyler);
+			getScenes()->loadSceneFromPosition(kCarRestaurant, 5);
+			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorHandKnock, kCursorHand);
+			break;
+
+		case 5:
+			params->param1 = 0;
+			params->param2 = 1;
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/entities/mmeboutarel.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/mmeboutarel.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/mmeboutarel.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -796,7 +796,105 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(24, MmeBoutarel, function24)
-	error("MmeBoutarel: callback function 24 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		TIME_CHECK(kTime2470500, params->param4, setup_function25);
+
+		if (params->param2) {
+			UPDATE_PARAM(params->param5, getState()->timeTicks, 75);
+
+			params->param1 = 1;
+			params->param2 = 0;
+
+			getObjects()->update(kObjectCompartmentD, kEntityMmeBoutarel, kObjectLocation1, kCursorNormal, kCursorNormal);
+			getObjects()->update(kObject51, kEntityMmeBoutarel, kObjectLocation1, kCursorHandKnock, kCursorHand);
+		}
+
+		params->param5 = 0;
+		break;
+
+	case kActionKnock:
+	case kActionOpenDoor:
+		getObjects()->update(kObjectCompartmentD, kEntityMmeBoutarel, kObjectLocation1, kCursorNormal, kCursorNormal);
+		getObjects()->update(kObject51, kEntityMmeBoutarel, kObjectLocation1, kCursorNormal, kCursorNormal);
+
+		if (params->param2) {
+			if (getInventory()->hasItem(kItemPassengerList)) {
+				setCallback(5);
+				setup_playSound(rnd(2) ? "CAT1510" : getSound()->wrongDoorCath());
+			} else {
+				setCallback(6);
+				setup_playSound(getSound()->wrongDoorCath());
+			}
+		} else {
+			++params->param3;
+
+			setCallback(savepoint.action == kActionKnock ? 2 : 1);
+			setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
+		}
+		break;
+
+	case kActionDefault:
+		getObjects()->update(kObjectCompartmentD, kEntityMmeBoutarel, kObjectLocation1, kCursorHandKnock, kCursorHand);
+		getObjects()->update(kObject51, kEntityMmeBoutarel, kObjectLocation1, kCursorHandKnock, kCursorHand);
+		break;
+
+	case kActionDrawScene:
+		if (params->param1 || params->param2)	{
+			getObjects()->update(kObjectCompartmentD, kEntityMmeBoutarel, kObjectLocation1, kCursorHandKnock, kCursorHand);
+			getObjects()->update(kObject51, kEntityMmeBoutarel, kObjectLocation1, kCursorHandKnock, kCursorHand);
+			params->param1 = 0;
+			params->param2 = 0;
+		}
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+		case 2:
+			setCallback(params->param3 > 1 ? 3 : 4);
+			setup_playSound(params->param3 > 1 ? "MME1038C" : "MME1038");
+			break;
+
+		case 3:
+		case 4:
+			getObjects()->update(kObjectCompartmentD, kEntityMmeBoutarel, kObjectLocation1, kCursorTalk, kCursorNormal);
+			getObjects()->update(kObject51, kEntityMmeBoutarel, kObjectLocation1, kCursorTalk, kCursorNormal);
+			params->param2 = 1;
+			break;
+
+		case 5:
+		case 6:
+			params->param1 = 1;
+			params->param2 = 0;
+			break;
+
+		case 7:
+			getSavePoints()->push(kEntityMmeBoutarel, kEntityCoudert, kAction123199584);
+			break;
+
+		case 8:
+			getSavePoints()->push(kEntityMmeBoutarel, kEntityCoudert, kAction88652208);
+			break;
+		}
+		break;
+
+	case kAction122865568:
+		setCallback(8);
+		setup_playSound("Mme1151A");
+		break;
+
+	case kAction221683008:
+		setCallback(7);
+		setup_playSound("Mme1038");
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/entities/tatiana.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/tatiana.cpp	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/entities/tatiana.cpp	2010-10-21 23:39:48 UTC (rev 53681)
@@ -607,7 +607,103 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(22, Tatiana, function22)
-	error("Tatiana: callback function 22 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		if (params->param1 == kTimeInvalid || getState()->time <= kTime1179000)
+			goto label_update;
+
+		UPDATE_PARAM_PROC_TIME(kTime1233000, (!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0)
+label_update:
+			if (!getEvent(kEventTatianaAskMatchSpeakRussian)
+			 && !getEvent(kEventTatianaAskMatch)
+			 && getInventory()->hasItem(kItemMatchBox)
+			 && getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
+				getObjects()->update(kObject25, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward);
+				getObjects()->update(kObjectTrainTimeTable, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward);
+			}
+		UPDATE_PARAM_PROC_END
+
+		params->param1 = kTimeInvalid;
+
+		getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
+		getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
+		getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 70);
+		getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 71);
+
+		if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
+			getSound()->excuseMe(kEntityTatiana);
+
+			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
+				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
+		}
+
+		getData()->inventoryItem = kItemNone;
+
+		setup_function23();
+		break;
+
+	case kAction1:
+		getData()->inventoryItem = kItemNone;
+
+		setCallback(4);
+		setup_savegame(kSavegameTypeEvent, kEventTatianaGivePoem);
+		break;
+
+	case kActionOpenDoor:
+		setCallback(3);
+		setup_savegame(kSavegameTypeEvent, kEventTatianaAskMatchSpeakRussian);
+		break;
+
+	case kActionDefault:
+		getSavePoints()->push(kEntityTatiana, kEntityVassili, kAction122732000);
+
+		setCallback(1);
+		setup_function15();
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_updateEntity(kCarGreenSleeping, kPosition_540);
+			break;
+
+		case 2:
+			if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
+				getSound()->excuseMe(kEntityTatiana);
+
+				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
+					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
+			}
+
+			getEntities()->drawSequenceLeft(kEntityTatiana, "306B");
+			getEntities()->updatePositionEnter(kEntityTatiana, kCarGreenSleeping, 70);
+			getEntities()->updatePositionEnter(kEntityTatiana, kCarGreenSleeping, 71);
+			break;
+
+		case 3:
+			getAction()->playAnimation(getEvent(kEventAlexeiSalonVassili) ? kEventTatianaAskMatchSpeakRussian : kEventTatianaAskMatch);
+			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 62);
+			getData()->inventoryItem = kItemParchemin;
+
+			getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
+			getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
+			break;
+
+		case 4:
+			getAction()->playAnimation(kEventTatianaGivePoem);
+			getInventory()->removeItem(kItemParchemin);
+			getScenes()->processScene();
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/shared.h
===================================================================
--- scummvm/trunk/engines/lastexpress/shared.h	2010-10-21 23:38:35 UTC (rev 53680)
+++ scummvm/trunk/engines/lastexpress/shared.h	2010-10-21 23:39:48 UTC (rev 53681)
@@ -85,6 +85,7 @@
 	kTime1225800              = 1225800,
 	kTimeCityBarLeDuc         = 1228500,
 	kTimeExitBarLeDuc         = 1231200,
+	kTime1233000              = 1233000,
 	kTime1242000              = 1242000,
 	kTime1260000              = 1260000,
 	kTimeCityNancy            = 1303200,


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