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

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


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

Log Message:
-----------
LASTEXPRESS: Implement remaining AI logic functions for August

Modified Paths:
--------------
    scummvm/trunk/engines/lastexpress/entities/august.cpp
    scummvm/trunk/engines/lastexpress/shared.h

Modified: scummvm/trunk/engines/lastexpress/entities/august.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/entities/august.cpp	2010-10-21 23:40:14 UTC (rev 53682)
+++ scummvm/trunk/engines/lastexpress/entities/august.cpp	2010-10-21 23:40:47 UTC (rev 53683)
@@ -331,7 +331,95 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION_II(19, August, function19, bool, bool)
-	error("August: callback function 19 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 kAction1:
+		getData()->inventoryItem = kItemNone;
+		getSound()->playSound(kEntityPlayer, "CAT1002");
+		getSound()->playSound(kEntityAugust, "AUG3101", SoundManager::kFlagInvalid, 15);
+		break;
+
+	case kActionDefault:
+		getData()->inventoryItem = kItemNone;
+
+		switch (getProgress().chapter) {
+		default:
+			break;
+
+		case kChapter1:
+			strcpy((char *)&parameters->seq1, "626");
+			break;
+
+		case kChapter2:
+		case kChapter3:
+			if (getData()->clothes != kClothes2) {
+				strcpy((char *)&parameters->seq1, "666");
+				break;
+			}
+			// Fallback to next action
+
+		case kChapter4:
+		case kChapter5:
+			strcpy((char *)&parameters->seq1, "696");
+			break;
+		}
+
+		getSavePoints()->push(kEntityAugust, kEntityMertens, kAction303343617);
+
+		strcpy((char *)&parameters->seq2, (char *)&parameters->seq1);
+		strcat((char *)&parameters->seq2, "Pc");
+
+		getEntities()->drawSequenceLeft(kEntityAugust, (char *)&parameters->seq2);
+		getEntities()->enterCompartment(kEntityAugust, kObjectCompartment3, true);
+
+		setCallback(1);
+		setup_playSound("AUG2096");
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			strcpy((char *)&parameters->seq2, (char *)&parameters->seq1);
+			strcat((char *)&parameters->seq2, "Qc");
+
+			getEntities()->drawSequenceLeft(kEntityAugust, (char *)&parameters->seq2);
+			if (parameters->param2)
+				getData()->inventoryItem = kItem147;
+			break;
+
+		case 2:
+			strcpy((char *)&parameters->seq2, (char *)&parameters->seq1);
+			strcat((char *)&parameters->seq2, parameters->param1 ? "Fc" : "Dc");
+
+			setCallback(3);
+			setup_enterExitCompartment((char *)&parameters->seq2, kObjectCompartment3);
+			break;
+
+		case 3:
+			getEntities()->exitCompartment(kEntityAugust, kObjectCompartment3, true);
+			getData()->location = kLocationInsideCompartment;
+			getEntities()->clearSequences(kEntityAugust);
+
+			CALLBACK_ACTION();
+			break;
+		}
+		break;
+
+	case kAction69239528:
+		getData()->inventoryItem = kItemNone;
+
+		setCallback(2);
+		setup_updateFromTime(75);
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -423,7 +511,240 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION_I(21, August, function21, TimeValue)
-	error("August: callback function 21 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		if (!params->param4 && params->param1 < getState()->time && !params->param7) {
+			params->param7 = 1;
+
+			getObjects()->update(kObjectCompartment3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
+
+			CALLBACK_ACTION();
+			break;
+		}
+
+		if (params->param2) {
+			UPDATE_PARAM_GOTO(params->param8, getState()->timeTicks, 75, label_continue);
+
+			params->param2 = 0;
+			params->param3 = 1;
+
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorNormal, (getProgress().eventMetAugust || getProgress().jacket != kJacketGreen) ? kCursorNormal : kCursorHand);
+		}
+
+		params->param8 = 0;
+
+label_continue:
+		if (getProgress().chapter != kChapter1)
+			break;
+
+		if (params->param6) {
+			UPDATE_PARAM_PROC(CURRENT_PARAMS(1, 1), getState()->time, 6300)
+				params->param6 = 0;
+				CURRENT_PARAMS(1, 1) = 0;
+			UPDATE_PARAM_PROC_END
+		}
+
+		if (!params->param4
+		 && !getProgress().eventMetAugust
+		 && !params->param6
+		 && (params->param1 - 4500) > getState()->time
+		 && !getProgress().field_14) {
+			getProgress().field_14 = 2;
+			getData()->location = kLocationOutsideCompartment;
+			getData()->entityPosition = kPosition_8200;
+
+			setCallback(1);
+			setup_function20(false);
+		}
+		break;
+
+	case kActionOpenDoor:
+		if (getProgress().chapter == kChapter1 && !getProgress().eventMetAugust && getProgress().jacket == kJacketGreen) {
+			getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
+			getData()->location = kLocationInsideCompartment;
+
+			setCallback(6);
+			setup_savegame(kSavegameTypeEvent, kEventMeetAugustHisCompartment);
+			break;
+		}
+		// Fallback to next case
+
+	case kActionKnock:
+		getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorNormal, kCursorNormal);
+
+		if (params->param2) {
+			if (getInventory()->hasItem(kItemPassengerList)) {
+				setCallback(12);
+				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : (rnd(2) ? "CAT1502" : "CAT1502A"));
+			} else {
+				setCallback(13);
+				setup_playSound(getSound()->wrongDoorCath());
+			}
+		} else {
+			setCallback(savepoint.action == kActionKnock ? 7 : 8);
+			setup_playSound(savepoint.action == kActionKnock ?  "LIB012" : "LIB013");
+		}
+		break;
+
+	case kActionDefault:
+		getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorHandKnock, kCursorHand);
+		break;
+
+	case kActionDrawScene:
+		if (params->param2 || params->param3) {
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+			params->param2 = 0;
+			params->param3 = 0;
+			params->param5 = 0;
+		}
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_updateEntity(kCarGreenSleeping, kPosition_8200);
+			break;
+
+		case 2:
+			setCallback(3);
+			setup_function23((TimeValue)(params->param1 - 2700));
+			break;
+
+		case 3:
+			setCallback(4);
+			setup_updateEntity(kCarGreenSleeping, kPosition_6470);
+			break;
+
+		case 4:
+			setCallback(5);
+			setup_function19(false, false);
+			break;
+
+		case 5:
+			if (getProgress().field_14 == 2)
+				getProgress().field_14 = 0;
+
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+			params->param2 = 0;
+			params->param3 = 0;
+			params->param5 = 0;
+			params->param6 = 0;
+			CURRENT_PARAMS(1, 1) = 0;
+			break;
+
+		case 6:
+			getAction()->playAnimation(getObjects()->get(kObjectCompartment3).location2 == kObjectLocation1 ? kEventMeetAugustHisCompartmentBed : kEventMeetAugustHisCompartment);
+			getProgress().eventMetAugust = true;
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorNormal, kCursorNormal);
+
+			params->param2 = 0;
+			params->param3 = 1;
+
+			getScenes()->loadSceneFromObject(kObjectCompartment3, true);
+			break;
+
+		case 7:
+		case 8:
+			++params->param5;
+
+			switch(params->param5) {
+			default:
+				// Fall to next case
+				break;
+
+			case 1:
+				setCallback(9);
+				setup_playSound(rnd(2) ? "AUG1128A" : "AUG1128B");
+				return;
+
+			case 2:
+				setCallback(10);
+				setup_playSound(getProgress().eventMetAugust ? "AUG1128E" : "AUG1128G");
+				return;
+
+			case 3:
+				setCallback(11);
+				setup_playSound(getProgress().eventMetAugust ? "AUG1128F" : "AUG1128H");
+				return;
+			}
+			// Fallback to next case
+
+		case 9:
+		case 10:
+		case 11:
+		case 12:
+		case 13:
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorTalk, (getProgress().eventMetAugust || getProgress().jacket != kJacketGreen) ? kCursorNormal : kCursorHand);
+
+			if (getCallback() == 12 || getCallback() == 13) {
+				params->param2 = 0;
+				params->param3 = 1;
+			} else {
+				params->param2= 1;
+			}
+			break;
+
+		case 14:
+			setCallback(15);
+			setup_updateFromTime(75);
+			break;
+
+		case 15:
+			setCallback(16);
+			setup_playSound("AUG1128I");
+			break;
+
+		case 16:
+			getSavePoints()->push(kEntityAugust, kEntityMertens, kAction100906246);
+			break;
+
+		case 17:
+			getData()->location = kLocationOutsideCompartment;
+			getSavePoints()->push(kEntityAugust, kEntityMertens, kAction156567128);
+			getEntities()->drawSequenceLeft(kEntityAugust, "626Lc");
+			getEntities()->enterCompartment(kEntityAugust, kObjectCompartment3, true);
+			break;
+
+		case 18:
+			getEntities()->exitCompartment(kEntityAugust, kObjectCompartment3, true);
+			getData()->location = kLocationInsideCompartment;  // BUG: in the original, this is set to 6470
+			getEntities()->clearSequences(kEntityAugust);
+			getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorHandKnock, kCursorHand);
+
+			params->param4 = 0;
+			break;
+		}
+		break;
+
+	case kAction124697504:
+		getSound()->playSound(kEntityAugust, "CON1023A");
+
+		setCallback(18);
+		setup_enterExitCompartment("626Mc", kObjectCompartment3);
+		break;
+
+	case kAction192849856:
+		setCallback(17);
+		setup_enterExitCompartment("626Kc", kObjectCompartment3);
+		break;
+
+	case kAction221617184:
+		params->param4 = 1;
+		getSavePoints()->push(kEntityAugust, kEntityMertens, kAction102675536);
+
+		setCallback(14);
+		setup_playSound("CON1023");
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1160,7 +1481,111 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(30, August, restaurant)
-	error("August: callback function 30 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		UPDATE_PARAM(params->param3, getState()->timeTicks, 75);
+
+		getData()->inventoryItem = kItemInvalid;
+		break;
+
+	case kAction1:
+		params->param1 = 1;
+		getData()->inventoryItem = kItemNone;
+		getScenes()->loadSceneFromPosition(kCarRestaurant, 62);
+		getEntities()->updatePositionEnter(kEntityAugust, kCarRestaurant, 61);
+		getEntities()->updatePositionEnter(kEntityAugust, kCarRestaurant, 64);
+		break;
+
+	case kActionEndSound:
+		if (params->param1) {
+			getData()->inventoryItem = kItemNone;
+			getEntities()->updatePositionExit(kEntityAugust, kCarRestaurant, 61);
+			getEntities()->updatePositionExit(kEntityAugust, kCarRestaurant, 64);
+
+			setCallback(4);
+			setup_savegame(kSavegameTypeEvent, kEventAugustPresentAnna);
+			break;
+		}
+
+		if (params->param2) {
+			params->param2 = 0;
+			if (getProgress().eventMetAugust)
+				getData()->inventoryItem = kItemNone;
+
+			getSound()->playSound(kEntityAugust, "Aug1003A");
+		} else {
+			getData()->inventoryItem = kItemNone;
+			getSavePoints()->push(kEntityAugust, kEntityAnna, kAction201437056);
+
+			setCallback(8);
+			setup_draw("010P");
+		}
+		break;
+
+	case kActionDefault:
+		getSavePoints()->push(kEntityAugust, kEntityBoutarel, kAction135854206);
+
+		setCallback(1);
+		setup_updateFromTime(450);
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_callbackActionRestaurantOrSalon();
+			break;
+
+		case 2:
+			getSavePoints()->push(kEntityAugust, kEntityAnna, kAction259136835);
+			getData()->location = kLocationOutsideCompartment;
+
+			setCallback(3);
+			setup_callSavepoint("010N", kEntityTables3, kActionDrawTablesWithChairs, "010K");
+			break;
+
+		case 3:
+			getSavePoints()->push(kEntityAugust, kEntityServers0, kAction292758554);
+			getSavePoints()->push(kEntityAugust, kEntityAnna, kAction122358304);
+			getEntities()->drawSequenceLeft(kEntityAugust, "001K");
+			getSound()->playSound(kEntityAugust, "AUG1003");
+
+			if (getEntities()->isInRestaurant(kEntityPlayer))
+				getProgress().field_60 = 1;
+
+			params->param2 = 1;
+			break;
+
+		case 4:
+
+			break;
+
+		case 5:
+		case 7:
+		case 9:
+			getSavePoints()->push(kEntityAugust, kEntityBoutarel, kAction134466544);
+
+			setup_function31();
+			break;
+
+		case 6:
+		case 8:
+			getEntities()->drawSequenceRight(kEntityAugust, "803DS");
+			if (getEntities()->isInRestaurant(kEntityPlayer))
+				getEntities()->updateFrame(kEntityAugust);
+
+			setCallback(getCallback() + 1);
+			setup_callbackActionOnDirection();
+			break;
+		}
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1205,7 +1630,114 @@
 
 //////////////////////////////////////////////////////////////////////////
 IMPLEMENT_FUNCTION(32, August, function32)
-	error("August: callback function 32 not implemented!");
+	switch (savepoint.action) {
+	default:
+		break;
+
+	case kActionNone:
+		UPDATE_PARAM_PROC_TIME(kTime1179000, (!getEntities()->isInSalon(kEntityAnna) || getEntities()->isInSalon(kEntityPlayer)), params->param6, 0);
+			getSavePoints()->push(kEntityAugust, kEntityAnna, kAction123712592);
+		UPDATE_PARAM_PROC_END
+
+		if (params->param1 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
+			if (!params->param4) {
+				params->param4 = getState()->time + 1800;
+				params->param5 = getState()->time + 9000;
+			}
+
+			if (params->param7 != kTimeInvalid && params->param4 < getState()->time) {
+				UPDATE_PARAM_PROC_TIME(params->param5, getEntities()->isInSalon(kEntityPlayer), params->param7, 0);
+					getData()->location = kLocationOutsideCompartment;
+
+					setCallback(5);
+					setup_updatePosition("109D", kCarRestaurant, 56);
+					break;
+				UPDATE_PARAM_PROC_END
+			}
+		}
+
+		if (params->param3) {
+			UPDATE_PARAM(params->param8, getState()->timeTicks, 90);
+
+			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
+		} else {
+			params->param8 = 0;
+		}
+		break;
+
+	case kActionDefault:
+		setCallback(1);
+		setup_function20(false);
+		break;
+
+	case kActionDrawScene:
+		if (params->param2) {
+			if (getEntities()->isPlayerPosition(kCarRestaurant, 57)) {
+				getScenes()->loadSceneFromPosition(kCarRestaurant, 50);
+				params->param3 = true;
+			} else if (!getEntities()->isPlayerPosition(kCarRestaurant, 50)) {
+				params->param3 = false;
+			}
+		} else {
+			params->param3 = getEntities()->isPlayerPosition(kCarRestaurant, 56) && params->param1;
+		}
+		break;
+
+	case kActionCallback:
+		switch (getCallback()) {
+		default:
+			break;
+
+		case 1:
+			setCallback(2);
+			setup_updateEntity(kCarRestaurant, kPosition_850);
+			break;
+
+		case 2:
+			setCallback(3);
+			setup_callbackActionRestaurantOrSalon();
+			break;
+
+		case 3:
+			getData()->entityPosition = kPosition_1540;
+			getData()->location = kLocationOutsideCompartment;
+
+			setCallback(4);
+			setup_updatePosition("105A", kCarRestaurant, 57);
+			break;
+
+		case 4:
+			getData()->location = kLocationInsideCompartment;
+			getEntities()->drawSequenceLeft(kEntityAugust, "105B");
+			params->param2 = 1;
+			break;
+
+		case 5:
+			setCallback(6);
+			setup_updateEntity(kCarGreenSleeping, kPosition_6470);
+			break;
+
+		case 6:
+			setCallback(7);
+			setup_function19(false, false);
+			break;
+
+		case 7:
+			setup_function33();
+			break;
+		}
+		break;
+
+	case kAction122358304:
+		params->param2 = 0;
+		getEntities()->drawSequenceLeft(kEntityAugust, "BLANK");
+		break;
+
+	case kAction159332865:
+		getEntities()->drawSequenceLeft(kEntityAugust, "106E");
+		params->param1 = 1;
+		break;
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1411,7 +1943,7 @@
 
 		case 3:
 		case 5:
-			setCallback(getCallback() == 3 ? 4 : 6);
+			setCallback(getCallback() + 1);
 			setup_updateEntity(kCarRestaurant, kPosition_850);
 			break;
 

Modified: scummvm/trunk/engines/lastexpress/shared.h
===================================================================
--- scummvm/trunk/engines/lastexpress/shared.h	2010-10-21 23:40:14 UTC (rev 53682)
+++ scummvm/trunk/engines/lastexpress/shared.h	2010-10-21 23:40:47 UTC (rev 53683)
@@ -738,7 +738,9 @@
 	kPortraitYellow    = 36,
 
 	kItemInvalid       = 128,
+
 	kItem146           = 146,
+	kItem147           = 147,
 
 	// Toggles
 	kItemToggleHigh    = 0x7F,


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