[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.88,1.89 actor.h,1.46,1.47 actordata.cpp,1.15,1.16 actordata.h,1.13,1.14 events.cpp,1.45,1.46 ihnm_introproc.cpp,1.38,1.39 interface.cpp,1.61,1.62 interface.h,1.29,1.30 objectdata.cpp,1.3,1.4 objectdata.h,1.3,1.4 objectmap.cpp,1.33,1.34 objectmap.h,1.16,1.17 resnames.h,1.19,1.20 saga.cpp,1.90,1.91 saga.h,1.74,1.75 scene.cpp,1.80,1.81 scene.h,1.39,1.40 script.cpp,1.46,1.47 script.h,1.51,1.52 sdebug.cpp,1.25,1.26 sfuncs.cpp,1.76,1.77 sthread.cpp,1.58,1.59 xref.txt,1.17,1.18

Andrew Kurushin h00ligan at users.sourceforge.net
Sat Jan 15 12:14:01 CET 2005


Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3981

Modified Files:
	actor.cpp actor.h actordata.cpp actordata.h events.cpp 
	ihnm_introproc.cpp interface.cpp interface.h objectdata.cpp 
	objectdata.h objectmap.cpp objectmap.h resnames.h saga.cpp 
	saga.h scene.cpp scene.h script.cpp script.h sdebug.cpp 
	sfuncs.cpp sthread.cpp xref.txt 
Log Message:
some work in progress on verb stuff:
- many structers and fields renamed to proper names
- added missing functions

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -d -r1.88 -r1.89
--- actor.cpp	13 Jan 2005 07:47:04 -0000	1.88
+++ actor.cpp	15 Jan 2005 20:12:46 -0000	1.89
@@ -135,7 +135,8 @@
 	size_t stringsLength;
 	ActorData *actor;
 	debug(9, "Actor::Actor()");
-
+	
+	_actors = NULL;
 	if (_vm->getGameType() == GType_IHNM) {
 		warning("Actors aren't implemented for IHNM yet");
 		return;
@@ -180,32 +181,37 @@
 	_vm->loadStrings(_actorsStrings, stringsPointer, stringsLength);
 	RSC_FreeResource(stringsPointer);
 
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];
-		actor->actorId = actorIndexToId(i);
-		actor->index = i;
-		debug(9, "init actorId=%d index=%d", actor->actorId, actor->index);
-		actor->nameIndex = ActorTable[i].nameIndex;
-		actor->spriteListResourceId = ActorTable[i].spriteListResourceId;
-		actor->frameListResourceId = ActorTable[i].frameListResourceId;
-		actor->speechColor = ActorTable[i].speechColor;
-		actor->sceneNumber = ActorTable[i].sceneIndex;
-		actor->flags = ActorTable[i].flags;
-		actor->currentAction = ActorTable[i].currentAction;
-		actor->facingDirection = ActorTable[i].facingDirection;
-		actor->actionDirection = ActorTable[i].actionDirection;
-		actor->frameNumber = 0;
-		actor->targetObject = ID_NOTHING;
-		actor->actorFlags = 0;
+	if (_vm->getGameType() == GType_ITE) {
+		_actorsCount = ITE_ACTORCOUNT;
+		_actors = (ActorData **)malloc(_actorsCount * sizeof(ActorData *));
+		for (i = 0; i < _actorsCount; i++) {
+			actor = _actors[i] = new ActorData();
+			actor->actorId = actorIndexToId(i);
+			actor->index = i;
+			debug(9, "init actorId=%d index=%d", actor->actorId, actor->index);
+			actor->nameIndex = ITE_ActorTable[i].nameIndex;
+			actor->scriptEntrypointNumber = ITE_ActorTable[i].scriptEntrypointNumber;
+			actor->spriteListResourceId = ITE_ActorTable[i].spriteListResourceId;
+			actor->frameListResourceId = ITE_ActorTable[i].frameListResourceId;
+			actor->speechColor = ITE_ActorTable[i].speechColor;
+			actor->sceneNumber = ITE_ActorTable[i].sceneIndex;
+			actor->flags = ITE_ActorTable[i].flags;
+			actor->currentAction = ITE_ActorTable[i].currentAction;
+			actor->facingDirection = ITE_ActorTable[i].facingDirection;
+			actor->actionDirection = ITE_ActorTable[i].actionDirection;
+			actor->frameNumber = 0;
+			actor->targetObject = ID_NOTHING;
+			actor->actorFlags = 0;
 
-		actor->location.x = ActorTable[i].x;
-		actor->location.y = ActorTable[i].y;
-		actor->location.z = ActorTable[i].z;
+			actor->location.x = ITE_ActorTable[i].x;
+			actor->location.y = ITE_ActorTable[i].y;
+			actor->location.z = ITE_ActorTable[i].z;
 
-		actor->disabled = !loadActorResources(actor);
-		if (actor->disabled) {
-			warning("Disabling actorId=%d index=%d", actor->actorId, actor->index);
-		} 
+			actor->disabled = !loadActorResources(actor);
+			if (actor->disabled) {
+				warning("Disabling actorId=%d index=%d", actor->actorId, actor->index);
+			} 
+		}
 	}
 }
 
@@ -225,11 +231,11 @@
 	free(_pathCell);
 	_actorsStrings.freeMem();
 	//release resources
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];
-		free(actor->frames);
-		actor->spriteList.freeMem();
+	for (i = 0; i < _actorsCount; i++) {
+		actor = _actors[i];
+		delete actor;
 	}
+	free(_actors);
 }
 
 bool Actor::loadActorResources(ActorData *actor) {
@@ -304,7 +310,7 @@
 	return true;
 }
 
-void Actor::realLocation(ActorLocation &location, uint16 objectId, uint16 walkFlags) {
+void Actor::realLocation(Location &location, uint16 objectId, uint16 walkFlags) {
 	int angle;
 	int distance;
 	ActorData *actor;
@@ -332,9 +338,9 @@
 	}
 }
 
-void Actor::actorFaceTowardsPoint(uint16 actorId, const ActorLocation &toLocation) {
+void Actor::actorFaceTowardsPoint(uint16 actorId, const Location &toLocation) {
 	ActorData *actor;
-	ActorLocation delta;
+	Location delta;
 
 	actor = getActor(actorId);
 
@@ -382,7 +388,7 @@
 		return _protagonist;
 	}
 
-	actor = &_actors[actorIdToIndex(actorId)];
+	actor = _actors[actorIdToIndex(actorId)];
 
 	if (actor->disabled)
 		warning("Actor::getActor disabled actorId 0x%X", actorId);
@@ -390,7 +396,7 @@
 	return actor;
 }
 
-bool Actor::validFollowerLocation(const ActorLocation &location) {
+bool Actor::validFollowerLocation(const Location &location) {
 	Point point;	
 	location.toScreenPointXY(point);
 	
@@ -406,8 +412,8 @@
 	int i, j;
 	int followerDirection;
 	ActorData *actor;
-	ActorLocation tempLocation;
-	ActorLocation possibleLocation;
+	Location tempLocation;
+	Location possibleLocation;
 	Point delta;
 	
 	if (_vm->getGameType() == GType_IHNM) {
@@ -418,8 +424,8 @@
 	_activeSpeech.stringsCount = 0;
 	_protagonist = NULL;
 
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];		
+	for (i = 0; i < _actorsCount; i++) {
+		actor = _actors[i];		
 		if (actor->flags & (kProtagonist | kFollower)) {
 			actor->sceneNumber = _vm->_scene->currentSceneNumber();
 			if (actor->flags & kProtagonist) {
@@ -452,8 +458,8 @@
 	followerDirection = _protagonist->facingDirection + 3;
 	calcActorScreenPosition(_protagonist);
 
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];		
+	for (i = 0; i < _actorsCount; i++) {
+		actor = _actors[i];		
 		if (actor->flags & (kFollower)) {
 			actor->facingDirection = actor->actionDirection = _protagonist->facingDirection;
 			actor->currentAction = kActionWait;
@@ -630,11 +636,11 @@
 	ActorFrameRange *frameRange;
 	int state;
 	int speed;
-	ActorLocation delta;
-	ActorLocation addDelta;
+	Location delta;
+	Location addDelta;
 
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];
+	for (i = 0; i < _actorsCount; i++) {
+		actor = _actors[i];
 		if (actor->disabled) continue;
 		if (actor->sceneNumber != _vm->_scene->currentSceneNumber()) continue;
 		
@@ -876,7 +882,7 @@
 	// FIXME: HACK. This should be turned into cycle event.
 	_lastTickMsec += msec;
 
-	if (_lastTickMsec > ticksToMSec(5)) { // fixme
+	if (_lastTickMsec > ticksToMSec(2)) { // fixme
 		_lastTickMsec = 0;
 		//process actions
 		handleActions(msec, false);
@@ -922,8 +928,8 @@
 	ActorData *actor;
 
 	_drawOrderList.clear();
-	for (i = 0; i < ACTORCOUNT; i++) {
-		actor = &_actors[i];
+	for (i = 0; i < _actorsCount; i++) {
+		actor = _actors[i];
 		if (actor->disabled) continue;
 		if (actor->sceneNumber != _vm->_scene->currentSceneNumber()) continue;
 
@@ -1009,9 +1015,9 @@
 }
 
 bool Actor::followProtagonist(ActorData *actor) {
-	ActorLocation protagonistLocation;
-	ActorLocation newLocation;
-	ActorLocation delta;
+	Location protagonistLocation;
+	Location newLocation;
+	Location delta;
 	int protagonistBGMaskType;
 	Point prefer1;
 	Point prefer2;
@@ -1132,7 +1138,7 @@
 	return walkMore;
 }
 
-bool Actor::actorWalkTo(uint16 actorId, const ActorLocation &toLocation) {
+bool Actor::actorWalkTo(uint16 actorId, const Location &toLocation) {
 	ActorData *actor;
 	ActorData *anotherActor;
 	int	i;
@@ -1207,8 +1213,8 @@
 				
 				_barrierCount = 0;
 
-				for (i = 0; (i < ACTORCOUNT) && (_barrierCount < ACTOR_BARRIERS_MAX); i++) {
-					anotherActor = &_actors[i];
+				for (i = 0; (i < _actorsCount) && (_barrierCount < ACTOR_BARRIERS_MAX); i++) {
+					anotherActor = _actors[i];
 					if (anotherActor->disabled) continue;
 					if (anotherActor->sceneNumber != _vm->_scene->currentSceneNumber()) continue;
 					if (anotherActor == actor ) continue;
@@ -1298,8 +1304,8 @@
 			return false;
 		} else {
 			if (actor->flags & kProtagonist) {
-				_actors[1].actorFlags &= ~kActorNoFollow;
-				_actors[2].actorFlags &= ~kActorNoFollow;
+				_actors[1]->actorFlags &= ~kActorNoFollow; // TODO: mark all actors with kFollower flag, not only 1 and 2
+				_actors[2]->actorFlags &= ~kActorNoFollow;
 			}			
 			actor->currentAction = (actor->walkStepsCount >= ACTOR_MAX_STEPS_COUNT) ? kActionWalkToLink : kActionWalkToPoint;
 			actor->walkFrameSequence = kFrameWalk;
@@ -1903,7 +1909,7 @@
 
 void Actor::cmdActorWalkTo(int argc, const char **argv) {
 	uint16 actorId = (uint16) atoi(argv[1]);
-	ActorLocation location;
+	Location location;
 	Point movePoint;
 
 	movePoint.x = atoi(argv[2]);

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- actor.h	13 Jan 2005 07:47:04 -0000	1.46
+++ actor.h	15 Jan 2005 20:12:46 -0000	1.47
@@ -134,22 +134,22 @@
 	ActorFrameRange directions[ACTOR_DIRECTIONS_COUNT];
 };
 
-struct ActorLocation {
-	int x;					// Actor's logical coordinates
+struct Location {
+	int x;					// logical coordinates
 	int y;					// 
 	int z;					// 
-	ActorLocation() {
+	Location() {
 		x = y = z = 0;
 	}
-	int distance(const ActorLocation &location) const {
+	int distance(const Location &location) const {
 		return MAX(ABS(x - location.x), ABS(y - location.y));
 	}
-	void delta(const ActorLocation &location, ActorLocation &result) const {
+	void delta(const Location &location, Location &result) const {
 		result.x = x - location.x;
 		result.y = y - location.y;
 		result.z = z - location.z;
 	}
-	void add(const ActorLocation &location) {
+	void add(const Location &location) {
 		x += location.x;
 		y += location.y;
 		z += location.z;
@@ -176,10 +176,10 @@
 	int nameIndex;				// Actor's index in actor name string list
 	byte speechColor;			// Actor dialogue color
 	uint16 flags;				// Actor initial flags
-	
+	int scriptEntrypointNumber;		// Actor script entrypoint number
 
 	int sceneNumber;			// scene of actor
-	ActorLocation location;		// Actor's logical coordinates
+	Location location;		// Actor's logical coordinates
 
 	Point screenPosition;		// Actor's screen coordinates
 	int screenDepth;			//
@@ -211,8 +211,8 @@
 	int walkStepIndex;
 	Point *walkStepsPoints;
 
-	ActorLocation finalTarget;
-	ActorLocation partialTarget;
+	Location finalTarget;
+	Location partialTarget;
 	int walkFrameSequence;
 	
 	void cycleWrap(int cycleLimit) {
@@ -235,7 +235,9 @@
 		memset(&spriteList, 0, sizeof(spriteList));
 	}
 	~ActorData() {
+		free(frames);
 		free(walkStepsPoints);
+		spriteList.freeMem();
 	}
 };
 
@@ -271,7 +273,7 @@
 
 	void cmdActorWalkTo(int argc, const char **argv);
 
-	bool validActorId(uint16 id) { return (id == 1) || ((id >= 0x2000) && (id < (0x2000 | ACTORCOUNT))); }
+	bool validActorId(uint16 id) { return (id == 1) || ((id >= 0x2000) && (id < (0x2000 | _actorsCount))); }
 	int actorIdToIndex(uint16 id) { return (id == 1 ) ? 0 : (id & ~0x2000); }
 	uint16 actorIndexToId(int index) { return (index == 0 ) ? 1 : (index | 0x2000); }
 
@@ -281,13 +283,14 @@
 
 	void drawPathTest();
 
+	uint16 testHit(const Point& mousePointer){ return ID_NOTHING;}; //TODO: do it
 	const char * getActorName(uint16 actorId);
 	bool actorEndWalk(uint16 actorId, bool recurse);
-	bool actorWalkTo(uint16 actorId, const ActorLocation &toLocation);
+	bool actorWalkTo(uint16 actorId, const Location &toLocation);
 	ActorData *getActor(uint16 actorId);
 	ActorFrameRange *getActorFrameRange(uint16 actorId, int frameType);
-	void realLocation(ActorLocation &location, uint16 objectId, uint16 walkFlags);
-	void actorFaceTowardsPoint(uint16 actorId, const ActorLocation &toLocation);
+	void realLocation(Location &location, uint16 objectId, uint16 walkFlags);
+	void actorFaceTowardsPoint(uint16 actorId, const Location &toLocation);
 	void actorFaceTowardsObject(uint16 actorId, uint16 objectId);
 
 //	speech 
@@ -337,13 +340,14 @@
 	void removeNodes();
 	void nodeToPath();
 	void removePathPoints();
-	bool validFollowerLocation(const ActorLocation &location);
+	bool validFollowerLocation(const Location &location);
 	
 	int _lastTickMsec;
 	SagaEngine *_vm;
 	RSCFILE_CONTEXT *_actorContext;
 	ActorOrderList _drawOrderList;
-	ActorData _actors[ACTORCOUNT];
+	int _actorsCount;
+	ActorData **_actors;
 	SpeechData _activeSpeech;
 	StringsTable _actorsStrings;
 

Index: actordata.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actordata.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- actordata.cpp	9 Jan 2005 16:43:57 -0000	1.15
+++ actordata.cpp	15 Jan 2005 20:12:47 -0000	1.16
@@ -27,7 +27,7 @@
 
 namespace Saga {
 
-ActorTableData ActorTable[ACTORCOUNT] = {
+ActorTableData ITE_ActorTable[ITE_ACTORCOUNT] = {
 	// Original used so called permanent actors for first three and that was designed by 
 	// EXTENDED object flag. They contained frames in more than one resource. We use 
 	// different technique here see "Apppending to sprite list" in loadActorResources()

Index: actordata.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actordata.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- actordata.h	1 Jan 2005 16:18:36 -0000	1.13
+++ actordata.h	15 Jan 2005 20:12:47 -0000	1.14
@@ -49,16 +49,16 @@
 	int16 z;
 	int32 spriteListResourceId;
 	int32 frameListResourceId;
-	byte scriptResourceId;
+	byte scriptEntrypointNumber;
 	byte speechColor;
 	byte currentAction;
 	byte facingDirection;
 	byte actionDirection;
 };
 
-#define ACTORCOUNT 181
+#define ITE_ACTORCOUNT 181
 
-extern ActorTableData ActorTable[ACTORCOUNT];
+extern ActorTableData ITE_ActorTable[ITE_ACTORCOUNT];
 
 } // End of namespace Saga
 

Index: events.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/events.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- events.cpp	7 Jan 2005 22:18:52 -0000	1.45
+++ events.cpp	15 Jan 2005 20:12:47 -0000	1.46
@@ -258,7 +258,7 @@
 
 int Events::handleOneShot(EVENT *event) {
 	SURFACE *back_buf;
-	SCRIPT_THREAD *sthread;
+	ScriptThread *sthread;
 	Rect rect;
 
 	static SCENE_BGINFO bginfo;
@@ -397,7 +397,7 @@
 		case EVENT_EXEC_NONBLOCKING:
 			debug(0, "Starting start script #%d", event->param);
 		
-			sthread = _vm->_script->SThreadCreate();
+			sthread = _vm->_script->createThread();
 			if (sthread == NULL) {
 				_vm->_console->DebugPrintf("Thread creation failed.\n");
 				break;
@@ -408,10 +408,10 @@
 			sthread->threadVars[kVarWithObject] = TO_LE_16(event->param4);
 			sthread->threadVars[kVarActor] = TO_LE_16(event->param5);
 
-			_vm->_script->SThreadExecute(sthread, event->param);
+			_vm->_script->executeThread(sthread, event->param);
 
 			if (event->op == EVENT_EXEC_BLOCKING)
-				_vm->_script->SThreadCompleteThread();
+				_vm->_script->completeThread();
 
 			break;
 		case EVENT_THREAD_WAKE:

Index: ihnm_introproc.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/ihnm_introproc.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- ihnm_introproc.cpp	9 Jan 2005 23:41:21 -0000	1.38
+++ ihnm_introproc.cpp	15 Jan 2005 20:12:47 -0000	1.39
@@ -41,7 +41,7 @@
 	{31, SAGA_ANIM_1, 0, 0}
 };
 
-SCENE_DESC IHNM_IntroMovie1Desc = {
+SceneDescription IHNM_IntroMovie1Desc = {
 	0, 0, 0, 0, 0, 0, 0, 0,
 	IHNM_IntroMovie1RL,
 	ARRAYSIZE(IHNM_IntroMovie1RL)
@@ -52,7 +52,7 @@
 	{33, SAGA_ANIM_1, 0, 0}
 };
 
-SCENE_DESC IHNM_IntroMovie2Desc = {
+SceneDescription IHNM_IntroMovie2Desc = {
 	0, 0, 0, 0, 0, 0, 0, 0,
 	IHNM_IntroMovie2RL,
 	ARRAYSIZE(IHNM_IntroMovie2RL)
@@ -63,7 +63,7 @@
 	{35, SAGA_ANIM_1, 0, 0}
 };
 
-SCENE_DESC IHNM_IntroMovie3Desc = {
+SceneDescription IHNM_IntroMovie3Desc = {
 	0, 0, 0, 0, 0, 0, 0, 0,
 	IHNM_IntroMovie3RL,
 	ARRAYSIZE(IHNM_IntroMovie3RL)
@@ -74,7 +74,7 @@
 	{1226, SAGA_ANIM_1, 0, 0}
 };
 
-SCENE_DESC IHNM_IntroMovie4Desc = {
+SceneDescription IHNM_IntroMovie4Desc = {
 	0, 0, 0, 0, 0, 0, 0, 0,
 	IHNM_IntroMovie4RL,
 	ARRAYSIZE(IHNM_IntroMovie4RL)

Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- interface.cpp	13 Jan 2005 22:42:49 -0000	1.61
+++ interface.cpp	15 Jan 2005 20:12:47 -0000	1.62
@@ -67,7 +67,7 @@
 		return;
 	}
 
-	_iThread = _vm->_script->SThreadCreate();
+	_iThread = _vm->_script->createThread();
 	if (_iThread == NULL) {
 		error("Interface::Interface(): Error creating script thread for game interface module");
 	}
@@ -347,7 +347,7 @@
 	return SUCCESS;
 }
 
-int Interface::update(const Point& imousePointer, int updateFlag) {
+int Interface::update(const Point& mousePoint, int updateFlag) {
 	SURFACE *backBuffer;
 
 
@@ -358,31 +358,33 @@
 	backBuffer = _vm->_gfx->getBackBuffer();
 
 
-	if (_panelMode == kPanelMain) { // FIXME: HACK
-		// Update playfield space ( only if cursor is inside )
-		if (imousePointer.y < _vm->getSceneHeight()) {
-			// Mouse is in playfield space
-			if (updateFlag == UPDATE_MOUSEMOVE) {
-				handlePlayfieldUpdate(backBuffer, imousePointer);
+	if (_panelMode == kPanelMain) {
+		if (updateFlag == UPDATE_MOUSEMOVE) {
+	
+			if (mousePoint.y < _vm->getSceneHeight()) {
+				//handlePlayfieldUpdate(backBuffer, imousePointer);
+				_vm->_script->whichObject(mousePoint);
 			} else {
-				if (updateFlag == UPDATE_MOUSECLICK) {
-					handlePlayfieldClick(backBuffer, imousePointer);
+				if (_lastMousePoint.y < _vm->getSceneHeight()) {
+					_vm->_script->setNonPlayfieldVerb();
 				}
+				handleCommandUpdate(backBuffer, mousePoint);
 			}
+
 		} else {
-			// Update command space
-			if (updateFlag == UPDATE_MOUSEMOVE) {
-				handleCommandUpdate(backBuffer, imousePointer);
-			} else {
-				if (updateFlag == UPDATE_MOUSECLICK) {
-					handleCommandClick(backBuffer, imousePointer);
+
+			if (updateFlag == UPDATE_MOUSECLICK) {
+				if (mousePoint.y < _vm->getSceneHeight()) {
+					handlePlayfieldClick(backBuffer, mousePoint);
+				} else {
+					handleCommandClick(backBuffer, mousePoint);
 				}
 			}
 		}
 	}
 
 	drawStatusBar(backBuffer);
-
+	_lastMousePoint = mousePoint;
 	return SUCCESS;
 }
 
@@ -415,21 +417,21 @@
 	return SUCCESS;
 }
 
-void Interface::handleCommandClick(SURFACE *ds, const Point& imousePointer) {
+void Interface::handleCommandClick(SURFACE *ds, const Point& mousePoint) {
 
 	PanelButton *panelButton;
 
-	panelButton = verbHitTest(imousePointer);
+	panelButton = verbHitTest(mousePoint);
 	if (panelButton) {
 		_vm->_script->setVerb(panelButton->id);
 		return;
 	}
 }
 
-void Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePointer) {
+void Interface::handleCommandUpdate(SURFACE *ds, const Point& mousePoint) {
 	PanelButton *panelButton;
 
-	panelButton = verbHitTest(imousePointer);
+	panelButton = verbHitTest(mousePoint);
 	if (_mainPanel.currentButton != panelButton) {
 		if (_mainPanel.currentButton) {
 			drawVerb(_mainPanel.currentButton->id, 0);
@@ -458,7 +460,7 @@
 	uint16 object_flags = 0;
 
 //	int script_num;
-	ActorLocation location;
+	Location location;
 
 	objectNum = _vm->_scene->_objectMap->hitTest(imousePt);
 
@@ -529,7 +531,7 @@
 	*/
 }
 
-PanelButton *Interface::verbHitTest(const Point& imousePointer) {
+PanelButton *Interface::verbHitTest(const Point& mousePoint) {
 	PanelButton *panelButton;
 	Rect rect;
 	int i;
@@ -540,7 +542,7 @@
 			rect.right = rect.left + panelButton->width;
 			rect.top = _mainPanel.y + panelButton->yOffset;
 			rect.bottom = rect.top + panelButton->height;
-			if (rect.contains(imousePointer))
+			if (rect.contains(mousePoint))
 				return panelButton;
 		}
 	}
@@ -643,6 +645,7 @@
 	return FAILURE;
 }
 
+
 void Interface::drawVerb(int verb, int state) {
 	SURFACE *backBuffer;
 	PanelButton * panelButton;

Index: interface.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- interface.h	13 Jan 2005 22:42:49 -0000	1.29
+++ interface.h	15 Jan 2005 20:12:47 -0000	1.30
@@ -96,19 +96,18 @@
 
 	int activate();
 	int deactivate();
+	bool isActive() { return _active; }
 	int setMode(int mode, bool force = false);
 	int getMode(void) const { return _panelMode; }
 	void rememberMode();
 	void restoreMode();
-	void lockMode() { _lockedMode = _panelMode; }
-	void unlockMode() { _panelMode = _lockedMode; }
 	bool isInMainMode() { return _inMainMode; }
 	int setStatusText(const char *new_txt);
 	int loadScenePortraits(int resourceId);
 	int setLeftPortrait(int portrait);
 	int setRightPortrait(int portrait);
 	int draw();
-	int update(const Point& imousePointer, int updateFlag);
+	int update(const Point& mousePoint, int updateFlag);
 	int drawStatusBar(SURFACE *ds);
 	void drawVerb(int verb, int state);
 
@@ -120,12 +119,15 @@
 	
 private:
 	int inventoryTest(const Point& imousePt, int *ibutton);
-	PanelButton *verbHitTest(const Point& imousePointer);
-	void handleCommandUpdate(SURFACE *ds, const Point& imousePointer);
-	void handleCommandClick(SURFACE *ds, const Point& imousePointer);
+	PanelButton *verbHitTest(const Point& mousePoint);
+	void handleCommandUpdate(SURFACE *ds, const Point& mousePoint);
+	void handleCommandClick(SURFACE *ds, const Point& mousePoint);
 	int handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt);
 	int handlePlayfieldClick(SURFACE *ds, const Point& imousePt);
 	
+	void lockMode() { _lockedMode = _panelMode; }
+	void unlockMode() { _panelMode = _lockedMode; }
+
 	void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor);
 public:
 	void converseClear(void);
@@ -152,7 +154,7 @@
 	InterfacePanel _conversePanel;
 	SpriteList _defPortraits;
 	SpriteList _scenePortraits;
-	SCRIPT_THREAD *_iThread;
+	ScriptThread *_iThread;
 	PanelButton *_verbTypeToPanelButton[kVerbTypesMax];
 
 	bool _active;
@@ -164,6 +166,8 @@
 	int _leftPortrait;
 	int _rightPortrait;
 	
+	Point _lastMousePoint;
+
 	uint16 *_inventory;
 	int _inventorySize;
 	byte _inventoryCount;

Index: objectdata.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/objectdata.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- objectdata.cpp	1 Jan 2005 16:18:36 -0000	1.3
+++ objectdata.cpp	15 Jan 2005 20:12:47 -0000	1.4
@@ -27,10 +27,6 @@
 
 namespace Saga {
 
-enum {
-	kObjUseWith = 0x01,
-	kObjNotFlat = 0x02
-};
 
 OBJECTTABLE ObjectTable[OBJECTCOUNT] = {
 	{  8,  49, 1256,  760,  0,  9,  5, kObjNotFlat }, // Magic Hat

Index: objectdata.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/objectdata.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- objectdata.h	1 Jan 2005 16:18:36 -0000	1.3
+++ objectdata.h	15 Jan 2005 20:12:48 -0000	1.4
@@ -28,12 +28,17 @@
 
 namespace Saga {
 
+enum {
+	kObjUseWith = 0x01,
+	kObjNotFlat = 0x02
+};
+
 struct OBJECTTABLE {
 	byte nameIndex;
 	int32 sceneIndex;
 	int16 x, y, z;
 	int32 spritelistRn;
-	byte scriptRn;
+	byte scriptEntrypointNumber;
 	uint16 interactBits;
 };
 

Index: objectmap.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/objectmap.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- objectmap.cpp	2 Jan 2005 14:52:01 -0000	1.33
+++ objectmap.cpp	15 Jan 2005 20:12:48 -0000	1.34
@@ -43,7 +43,7 @@
 
 	_flags = readStream->readByte();
 	_clickAreasCount = readStream->readByte();
-	_defaultVerb = readStream->readByte();
+	_rightButtonVerb = readStream->readByte();
 	readStream->readByte(); // pad
 	_nameNumber = readStream->readUint16();
 	_scriptNumber = readStream->readUint16();

Index: objectmap.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/objectmap.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- objectmap.h	1 Jan 2005 16:18:36 -0000	1.16
+++ objectmap.h	15 Jan 2005 20:12:48 -0000	1.17
@@ -49,13 +49,16 @@
 	int getEntranceNumber() const {
 		return _scriptNumber;
 	}
+	int getRightButtonVerb() const {
+		return _rightButtonVerb;
+	}
 
 	void draw(SURFACE *ds, int color);	
 	bool hitTest(const Point &testPoint);
 private:
 	int _flags;				// HitZoneFlags
 	int _clickAreasCount;
-	int _defaultVerb;
+	int _rightButtonVerb;
 	int _nameNumber;
 	int _scriptNumber;
 

Index: resnames.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/resnames.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- resnames.h	9 Jan 2005 21:07:19 -0000	1.19
+++ resnames.h	15 Jan 2005 20:12:48 -0000	1.20
@@ -115,6 +115,11 @@
 //TODO: fill it
 #define RID_SCENE1_VOICE_138 186
 
+#define RID_BOAR_VOICE_000 239
+#define RID_BOAR_VOICE_002 241
+#define RID_BOAR_VOICE_005 244
+#define RID_BOAR_VOICE_006 245
+#define RID_BOAR_VOICE_007 246
 
 // MUSIC
 #define MUSIC_1 9

Index: saga.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.cpp,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -d -r1.90 -r1.91
--- saga.cpp	14 Jan 2005 11:22:45 -0000	1.90
+++ saga.cpp	15 Jan 2005 20:12:48 -0000	1.91
@@ -357,6 +357,27 @@
 	return NULL;
 }
 
+int SagaEngine::getObjectScriptEntrypointNumber(uint16 objectId) {
+	ActorData *actor;
+	switch (objectIdType(objectId)) {
+		case kGameObjectActor: 
+			actor = _vm->_actor->getActor(objectId);
+			return actor->scriptEntrypointNumber;
+			break;
+	}
+	//todo: object name & etc
+	return 0;
+}
+
+int SagaEngine::getObjectFlags(uint16 objectId) {
+	ActorData *actor;
+	if (objectIdType(objectId) == kGameObjectActor) {
+			actor = _vm->_actor->getActor(objectId);
+			return actor->flags;
+	}
+	return 0;
+}
+
 const char *SagaEngine::getTextString(int textStringId) {
 	const char *string;
 	int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
@@ -368,4 +389,30 @@
 	return string;
 }
 
+void SagaEngine::getExcuseInfo(int verb, const char *&textString, int &soundResourceId) {
+	textString = NULL; // TODO: i18n it !
+	switch (verb) {
+		case kVerbPickUp:
+			textString = "I can't pick that up.";
+			soundResourceId = RID_BOAR_VOICE_007;
+			break;
+		case kVerbLookAt:	
+			textString = "I see nothing special about it."; 
+			soundResourceId = RID_BOAR_VOICE_006;
+			break;
+		case kVerbOpen:		
+			textString = "There's no place to open it.";
+			soundResourceId = RID_BOAR_VOICE_000;
+			break;
+		case kVerbClose:	
+			textString = "There's no opening to close."; 
+			soundResourceId = RID_BOAR_VOICE_002;
+			break;
+		case kVerbUse:		
+			textString = "I don't know how to do that."; 
+			soundResourceId = RID_BOAR_VOICE_005;
+			break;
+	}
+}
+
 } // End of namespace Saga

Index: saga.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.h,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -d -r1.74 -r1.75
--- saga.h	14 Jan 2005 01:17:34 -0000	1.74
+++ saga.h	15 Jan 2005 20:12:48 -0000	1.75
@@ -433,8 +433,10 @@
 						byte **output_buf, size_t *output_buf_len, int *w, int *h);
 	const byte *getImagePal(const byte *image_data, size_t image_size);
 	void loadStrings(StringsTable &stringsTable, const byte *stringsPointer, size_t stringsLength);
-	const char *getObjectName(uint16 objectId);
 
+	const char *getObjectName(uint16 objectId);
+	int getObjectScriptEntrypointNumber(uint16 objectId);
+	int getObjectFlags(uint16 objectId);
 public:
 	TEXTLIST *textCreateList();
 	void textDestroyList(TEXTLIST *textlist);
@@ -491,6 +493,7 @@
 	const GameDisplayInfo & getDisplayInfo() { return _gameDisplayInfo; }
 	
 	const char *getTextString(int textStringId);
+	void getExcuseInfo(int verb, const char *&textString, int &soundResourceId);
 private:
 	int loadGame(int gameNumber);
 };

Index: scene.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/scene.cpp,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -d -r1.80 -r1.81
--- scene.cpp	11 Jan 2005 21:10:20 -0000	1.80
+++ scene.cpp	15 Jan 2005 20:12:48 -0000	1.81
@@ -191,7 +191,7 @@
 	scene_qdat = queueIterator.operator->();
 	assert(scene_qdat != NULL);
 
-	loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->scene_desc, scene_qdat->fadeType);
+	loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->sceneDescription, scene_qdat->fadeType);
 
 	return SUCCESS;
 }
@@ -230,7 +230,7 @@
 	scene_qdat = queueIterator.operator->();
 	assert(scene_qdat != NULL);
 
-	loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->scene_desc, scene_qdat->fadeType);
+	loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->sceneDescription, scene_qdat->fadeType);
 
 	return SUCCESS;
 }
@@ -277,7 +277,7 @@
 		_sceneQueue.erase(_sceneQueue.begin(), queueIterator);
 
 		endScene();
-		loadScene(skip_qdat->scene_n, skip_qdat->load_flag, skip_qdat->scene_proc, skip_qdat->scene_desc, skip_qdat->fadeType);
+		loadScene(skip_qdat->scene_n, skip_qdat->load_flag, skip_qdat->scene_proc, skip_qdat->sceneDescription, skip_qdat->fadeType);
 	}
 	// Search for a scene to skip to
 
@@ -504,7 +504,7 @@
 	return _sceneLUT[scene_num];
 }
 
-int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SCENE_DESC *scene_desc_param, int fadeType) {
+int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneDescription *scene_desc_param, int fadeType) {
 	SCENE_INFO scene_info;
 	uint32 res_number = 0;
 	int result;
@@ -580,8 +580,8 @@
 	}
 
 	// Load scene script data
-	if (_desc.scriptNum > 0) {
-		if (_vm->_script->loadScript(_desc.scriptNum) != SUCCESS) {
+	if (_desc.scriptModuleNumber > 0) {
+		if (_vm->_script->loadScript(_desc.scriptModuleNumber) != SUCCESS) {
 			warning("Scene::loadScene(): Error loading scene script");
 			return FAILURE;
 		}
@@ -635,12 +635,12 @@
 		q_event = _vm->_events->chain(q_event, &event);
 
 		// Start the scene pre script, but stay with black palette
-		if (_desc.startScriptNum > 0) {
+		if (_desc.startScriptEntrypointNumber > 0) {
 			event.type = ONESHOT_EVENT;
 			event.code = SCRIPT_EVENT;
 			event.op = EVENT_EXEC_BLOCKING;
 			event.time = 0;
-			event.param = _desc.startScriptNum;
+			event.param = _desc.startScriptEntrypointNumber;
 			event.param2 = 0;		// Action
 			event.param3 = _sceneNumber;	// Object
 			event.param4 = 0;		// With Object - TODO: should be 'entrance'
@@ -695,9 +695,9 @@
 	_desc.resListRN = readS.readSint16();
 	_desc.endSlope = readS.readSint16();
 	_desc.beginSlope = readS.readSint16();
-	_desc.scriptNum = readS.readUint16();
-	_desc.sceneScriptNum = readS.readUint16();
-	_desc.startScriptNum = readS.readUint16();
+	_desc.scriptModuleNumber = readS.readUint16();
+	_desc.sceneScriptEntrypointNumber = readS.readUint16();
+	_desc.startScriptEntrypointNumber = readS.readUint16();
 	_desc.musicRN = readS.readSint16();
 
 	RSC_FreeResource(scene_desc_data);
@@ -930,7 +930,7 @@
 
 	_sceneProc(SCENE_END, &scene_info, this);
 
-	if (_desc.scriptNum > 0) {
+	if (_desc.scriptModuleNumber > 0) {
 		_vm->_script->freeScript();
 	}
 
@@ -1002,9 +1002,9 @@
 	_vm->_console->DebugPrintf(fmt, "Resource list R#:", _desc.resListRN);
 	_vm->_console->DebugPrintf(fmt, "End slope:", _desc.endSlope);
 	_vm->_console->DebugPrintf(fmt, "Begin slope:", _desc.beginSlope);
-	_vm->_console->DebugPrintf(fmt, "Script resource:", _desc.scriptNum);
-	_vm->_console->DebugPrintf(fmt, "Scene script:", _desc.sceneScriptNum);
-	_vm->_console->DebugPrintf(fmt, "Start script:", _desc.startScriptNum);
+	_vm->_console->DebugPrintf(fmt, "scriptModuleNumber:", _desc.scriptModuleNumber);
+	_vm->_console->DebugPrintf(fmt, "sceneScriptEntrypointNumber:", _desc.sceneScriptEntrypointNumber);
+	_vm->_console->DebugPrintf(fmt, "startScriptEntrypointNumber:", _desc.startScriptEntrypointNumber);
 	_vm->_console->DebugPrintf(fmt, "Music R#", _desc.musicRN);
 }
 
@@ -1084,12 +1084,12 @@
 		_vm->_events->chain(q_event, &event);
 
 		// Start the scene main script
-		if (_desc.sceneScriptNum > 0) {
+		if (_desc.sceneScriptEntrypointNumber > 0) {
 			event.type = ONESHOT_EVENT;
 			event.code = SCRIPT_EVENT;
 			event.op = EVENT_EXEC_NONBLOCKING;
 			event.time = 0;
-			event.param = _desc.sceneScriptNum;
+			event.param = _desc.sceneScriptEntrypointNumber;
 			event.param2 = 0;		// Action
 			event.param3 = _sceneNumber;	// Object
 			event.param4 = 0;		// With Object - TODO: should be 'entrance'

Index: scene.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/scene.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- scene.h	14 Jan 2005 11:05:12 -0000	1.39
+++ scene.h	15 Jan 2005 20:12:48 -0000	1.40
@@ -99,14 +99,14 @@
 
 #define SAGA_SCENE_DESC_LEN 16
 
-struct SCENE_DESC {
+struct SceneDescription {
 	int16 flags;
 	int16 resListRN;
 	int16 endSlope;
 	int16 beginSlope;
-	uint16 scriptNum;
-	uint16 sceneScriptNum;
-	uint16 startScriptNum;
+	uint16 scriptModuleNumber;
+	uint16 sceneScriptEntrypointNumber;
+	uint16 startScriptEntrypointNumber;
 	int16 musicRN;
 	SCENE_RESLIST *resList;
 	size_t resListCnt;
@@ -139,7 +139,7 @@
 
 struct SCENE_QUEUE {
 	uint32 scene_n;
-	SCENE_DESC *scene_desc;
+	SceneDescription* sceneDescription;
 	int load_flag;
 	SCENE_PROC *scene_proc;
 	int scene_skiptarget;
@@ -203,7 +203,8 @@
 	int endScene();
 	int queueScene(SCENE_QUEUE *scene_queue);
 	int draw(SURFACE *);
-	int getFlags() { return _desc.flags; }
+	int getFlags() const { return _desc.flags; }
+	int getScriptModuleNumber() const { return _desc.scriptModuleNumber; }
 	bool isInDemo() { return !_inGame; }
 	
 	void getBGMaskInfo(int &width, int &height, byte *&buffer, size_t &bufferLength);
@@ -232,8 +233,7 @@
 	int currentSceneNumber() { return _sceneNumber; }
 
  private:
-	int loadScene(int scene, int load_flag, SCENE_PROC scene_proc, SCENE_DESC *, 
-				  int fadeIn);
+	int loadScene(int scene, int load_flag, SCENE_PROC scene_proc, SceneDescription *, int fadeIn);
 	int loadSceneDescriptor(uint32 res_number);
 	int loadSceneResourceList(uint32 res_number);
 	int processSceneResources();
@@ -253,7 +253,7 @@
 	int _sceneResNum;
 	bool _inGame;
 	bool _loadDesc;
-	SCENE_DESC _desc;
+	SceneDescription _desc;
 	int _resListEntries;
 	SCENE_RESLIST *_resList;
 	int _animEntries;

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- script.cpp	13 Jan 2005 22:42:49 -0000	1.46
+++ script.cpp	15 Jan 2005 20:12:48 -0000	1.47
@@ -31,6 +31,12 @@
 #include "saga/script.h"
 #include "saga/stream.h"
 #include "saga/interface.h"
+#include "saga/actordata.h"
+#include "saga/scene.h"
+#include "saga/events.h"
+#include "saga/actor.h"
+#include "saga/objectdata.h"
+#include "saga/objectmap.h"
 
 namespace Saga {
 
@@ -61,6 +67,7 @@
 	_stickyVerb = kVerbWalkTo;
 	_leftButtonVerb = kVerbNone;
 	_rightButtonVerb = kVerbNone;
+	_pointerObject = 0;
 
 	_dataBuf[0].data = _dataBuf[1].data = (ScriptDataWord *)calloc(SCRIPT_DATABUF_LEN, sizeof(ScriptDataWord));;
 	_dataBuf[0].length = _dataBuf[1].length = SCRIPT_DATABUF_LEN;
@@ -256,7 +263,7 @@
 }
 
 // Loads a script; including script bytecode and dialogue list 
-int Script::loadScript(int script_num) {
+int Script::loadScript(int scriptModuleNumber) {
 	ScriptData *script_data;
 	byte *bytecode_p;
 	size_t bytecode_len;
@@ -270,8 +277,8 @@
 	int result;
 
 	// Validate script number
-	if ((script_num < 0) || (script_num > _scriptLUTMax)) {
-		warning("Script::loadScript(): Invalid script number");
+	if ((scriptModuleNumber < 0) || (scriptModuleNumber > _scriptLUTMax)) {
+		warning("Script::loadScript(): Invalid script module number");
 		return FAILURE;
 	}
 
@@ -279,7 +286,7 @@
 	freeScript();
 
 	// Initialize script data structure
-	debug(0, "Loading script data for script #%d", script_num);
+	debug(0, "Loading script data for script module #%d", scriptModuleNumber);
 
 	script_data = (ScriptData *)malloc(sizeof(*script_data));
 	if (script_data == NULL) {
@@ -293,7 +300,7 @@
 	script_data->voice = NULL;
 
 	// Load script bytecode
-	scriptl_rn = _scriptLUT[script_num].script_rn;
+	scriptl_rn = _scriptLUT[scriptModuleNumber].script_rn;
 
 	result = RSC_LoadResource(_scriptContext, scriptl_rn, &bytecode_p, &bytecode_len);
 	if (result != SUCCESS) {
@@ -309,7 +316,7 @@
 	}
 
 	// Load script strings list
-	stringsResourceId = _scriptLUT[script_num].diag_list_rn;
+	stringsResourceId = _scriptLUT[scriptModuleNumber].diag_list_rn;
 
 	// Load strings list resource
 	result = RSC_LoadResource(_scriptContext, stringsResourceId, &stringsPointer, &stringsLength);
@@ -323,7 +330,7 @@
 
 	// Load voice resource lookup table
 	if (_voiceLUTPresent) {
-		voicelut_rn = _scriptLUT[script_num].voice_lut_rn;
+		voicelut_rn = _scriptLUT[scriptModuleNumber].voice_lut_rn;
 
 		// Load voice LUT resource
 		result = RSC_LoadResource(_scriptContext, voicelut_rn, &voicelut_p, &voicelut_len);
@@ -492,7 +499,7 @@
 	return voice_lut;
 }
 
-void Script::scriptError(SCRIPT_THREAD *thread, const char *format, ...) {
+void Script::scriptError(ScriptThread *thread, const char *format, ...) {
 	char buf[STRINGBUFLEN];
 	va_list	argptr;
 
@@ -501,8 +508,8 @@
 	va_end (argptr);
 
 	thread->flags |= kTFlagAborted;
-	debug(0, "Script::scriptError %X: %s", thread->i_offset, buf);
-	_vm->_console->DebugPrintf("Script::scriptError %X: %s", thread->i_offset, buf);	
+	debug(0, "Script::scriptError %X: %s", thread->instructionOffset, buf);
+	_vm->_console->DebugPrintf("Script::scriptError %X: %s", thread->instructionOffset, buf);	
 }
 
 void Script::scriptInfo() {
@@ -536,7 +543,7 @@
 
 	if (_dbg_thread == NULL) {
 		_vm->_console->DebugPrintf("Creating debug thread...\n");
-		_dbg_thread = SThreadCreate();
+		_dbg_thread = createThread();
 		if (_dbg_thread == NULL) {
 			_vm->_console->DebugPrintf("Thread creation failed.\n");
 			return;
@@ -548,7 +555,7 @@
 		return;
 	}
 
-	SThreadExecute(_dbg_thread, ep_num);
+	executeThread(_dbg_thread, ep_num);
 }
 
 // verb
@@ -641,6 +648,198 @@
 }
 
 void Script::doVerb() {
+	int scriptEntrypointNumber = 0;
+	int scriptModuleNumber = 0;
+	int objectType;
+	EVENT event;
+	const char *excuseText;
+	int excuseSampleResourceId;
+
+	objectType = objectIdType(_pendingObject[0]);
+
+	if (_pendingVerb == kVerbGive) {
+		scriptEntrypointNumber = _vm->getObjectScriptEntrypointNumber(_pendingObject[1]);
+		if (_vm->getObjectFlags(_pendingObject[1]) & (kFollower|kProtagonist|kExtended)) {
+			scriptModuleNumber = 0;
+		} else {
+			scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
+		}
+	} else {
+		if (_pendingVerb == kVerbUse) {
+			if ((objectIdType(_pendingObject[1]) > kGameObjectNone) && (objectType < objectIdType(_pendingObject[1]))) {
+				SWAP(_pendingObject[0], _pendingObject[1]);
+				objectType = objectIdType(_pendingObject[0]);
+			}
+		}
+
+		if (objectType == kGameObjectHitZone) {
+			scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
+			//TODO: check HitZone Exit
+		} else {
+			if (objectType & (kGameObjectActor | kGameObjectObject)) {
+				scriptEntrypointNumber = _vm->getObjectScriptEntrypointNumber(_pendingObject[0]);
+
+				if ((objectType == kGameObjectActor) && !(_vm->getObjectFlags(_pendingObject[0]) & (kFollower|kProtagonist|kExtended))) {
+					scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
+				} else {
+					scriptModuleNumber = 0;
+				}
+			}
+		}
+	}
+
+	if (scriptEntrypointNumber > 0) {
+		if (scriptModuleNumber != _vm->_scene->getScriptModuleNumber()) {
+			warning("scriptModuleNumber != _vm->_scene->getScriptModuleNumber()");
+		}
+		
+		event.type = ONESHOT_EVENT;
+		event.code = SCRIPT_EVENT;
+		event.op = EVENT_EXEC_NONBLOCKING;
+		event.time = 0;
+		event.param = scriptEntrypointNumber;
+		event.param2 = _pendingVerb;		// Action
+		event.param3 = _pendingObject[0];	// Object
+		event.param4 = _pendingObject[1];	// With Object
+		event.param5 = (objectType == kGameObjectActor) ? _pendingObject[0] : ID_PROTAG;		// Actor
+
+		_vm->_events->queue(&event);
+
+	} else {
+		_vm->getExcuseInfo(_pendingVerb, excuseText, excuseSampleResourceId);
+		if (excuseText) 
+			_vm->_actor->actorSpeech(ID_PROTAG, &excuseText, 1, excuseSampleResourceId, 0);			
+	}
+
+	if ((_currentVerb == kVerbWalkTo) || (_currentVerb == kVerbLookAt)) {
+		_stickyVerb = _currentVerb;
+	}
+
+	_pendingVerb = kVerbNone;
+	_currentObject[0] = _currentObject[1] = ID_NOTHING;
+	setLeftButtonVerb(_stickyVerb);
+
+	setPointerVerb();
+}
+
+void Script::setPointerVerb() {
+	Point mousePoint;
+	mousePoint = _vm->getMousePos();
+	if (_vm->_interface->isActive()) {
+		_pointerObject = ID_PROTAG;
+		whichObject(mousePoint);
+	}
+}
+
+void Script::whichObject(const Point& mousePointer) {
+	uint16 objectId;
+	int16 objectFlags;
+	int newRightButtonVerb;
+	uint16 newObjectId;
+	ActorData *actor;
+	Location pickLocation;
+	int hitZoneId;
+	HitZone * hitZone;
+
+	objectId = ID_NOTHING;
+	objectFlags = 0;
+	_leftButtonVerb = _currentVerb;
+	newRightButtonVerb = kVerbNone;
+
+	if (_vm->_actor->_protagonist->currentAction == kActionWalkDir) {
+	} else {
+		newObjectId = _vm->_actor->testHit(mousePointer);
+
+		if (newObjectId != ID_NOTHING) {
+			if (objectIdType(newObjectId) == kGameObjectObject) {
+				objectId = newObjectId;
+				objectFlags = 0;
+				newRightButtonVerb = kVerbLookAt;
+
+				if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) {
+					objectId = ID_NOTHING;
+					newObjectId = ID_NOTHING;
+				}
+			} else {
+				actor = _vm->_actor->getActor(newObjectId);
+				objectId = newObjectId;
+				objectFlags = kObjUseWith;
+				newRightButtonVerb = kVerbTalkTo;
+				
+				if ((_currentVerb == kVerbPickUp) ||
+					(_currentVerb == kVerbOpen) ||
+					(_currentVerb == kVerbClose) ||
+					((_currentVerb == kVerbGive) && !_firstObjectSet) ||
+					((_currentVerb == kVerbUse) && !(actor->flags & kFollower))) {
+					objectId = ID_NOTHING;
+					newObjectId = ID_NOTHING;
+				}
+			}
+		}
+
+		if (newObjectId == ID_NOTHING) {
+/*			struct HitZone	far *newZone = NULL;
+			UWORD		zone;*/
+			
+
+			if (_vm->_scene->getFlags() & kSceneFlagISO) {
+				//todo: it
+			} else {
+				pickLocation.x = mousePointer.x;
+				pickLocation.y = mousePointer.y;
+				pickLocation.z = 0;
+			}
+			
+			hitZoneId = _vm->_scene->_objectMap->hitTest(mousePointer);
+		
+			if ((hitZoneId != -1) && 0) { //TODO: do it
+				//hitZone = _vm->_scene->_objectMap->getZone(hitZoneId);
+				//objectId = hitZone->objectId;
+				objectFlags = 0;
+				newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
+
+				if (newRightButtonVerb == kVerbWalkOnly) {
+					if (_firstObjectSet) {
+						objectId = ID_NOTHING;
+					} else {
+						newRightButtonVerb = _leftButtonVerb = kVerbWalkTo;
+					}
+				} else {
+					if (_firstObjectSet) {
+						objectId = ID_NOTHING;
+					} else {
+						newRightButtonVerb = _leftButtonVerb = kVerbLookAt;
+					}
+				}
+
+				if (newRightButtonVerb >= kVerbOptions) {
+					newRightButtonVerb = kVerbNone;
+				}
+
+				if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
+					objectId = ID_NOTHING;
+					newObjectId = ID_NOTHING;
+				}
+
+				if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) {
+					objectFlags = kObjUseWith;
+				}					
+			}
+		}
+	}
+
+	if (objectId != _pointerObject) {
+		_pointerObject = objectId;
+		_currentObject[_firstObjectSet ? 1 : 0] = objectId;
+		_currentObjectFlags[_firstObjectSet ? 1 : 0] = objectFlags;
+		if (_pendingVerb == kVerbNone) {
+			showVerb();
+		}
+	}
+
+	if (newRightButtonVerb != _rightButtonVerb) {
+		setRightButtonVerb(newRightButtonVerb);
+	}
 }
 
 // console wrappers

Index: script.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- script.h	13 Jan 2005 22:42:49 -0000	1.51
+++ script.h	15 Jan 2005 20:12:48 -0000	1.52
@@ -127,15 +127,15 @@
 	kWalkFace = (1<<5)
 };
 
-struct SCRIPT_THREAD {
+struct ScriptThread {
 	int flags;				// ThreadFlags
 	int waitType;			// ThreadWaitTypes
 	void *threadObj;		// which object we're handling
 
 	uint sleepTime;
-	int ep_num; // Entrypoint number
-	unsigned long ep_offset; // Entrypoint offset
-	unsigned long i_offset; // Instruction offset
+	int entrypointNumber; // Entrypoint number
+	unsigned long entrypointOffset; // Entrypoint offset
+	unsigned long instructionOffset; // Instruction offset
 
 	// The scripts are allowed to access the stack like any other memory
 	// area. It's therefore probably quite important that our stacks work
@@ -183,10 +183,12 @@
 		sleepTime = aSleepTime;
 	}
 
-	SCRIPT_THREAD() { memset(this, 0, sizeof(*this)); }
+	ScriptThread() {
+		memset(this, 0, sizeof(*this)); 
+	}
 };
 
-typedef SortedList<SCRIPT_THREAD> ScriptThreadList;
+typedef SortedList<ScriptThread> ScriptThreadList;
 
 struct PROC_TBLENTRY {
 	size_t name_offset;
@@ -224,7 +226,7 @@
 	int length;
 };
 
-#define SCRIPTFUNC_PARAMS SCRIPT_THREAD *thread, int nArgs
+#define SCRIPTFUNC_PARAMS ScriptThread *thread, int nArgs
 
 class Script {
 public:
@@ -251,11 +253,19 @@
 	void doVerb();
 	void showVerb();
 	void setVerb(int verb);
-	void setLeftButtonVerb(int verb);
-	void setRightButtonVerb(int verb);
 	int getCurrentVerb() const { return _currentVerb; }
+	void setPointerVerb();
+	void whichObject(const Point& mousePointer);
+	
+	void setLeftButtonVerb(int verb);
 	int getLeftButtonVerb() const { return _leftButtonVerb; }
+	void setRightButtonVerb(int verb);
 	int getRightButtonVerb() const { return _rightButtonVerb; }
+	void setNonPlayfieldVerb() {
+		setRightButtonVerb(kVerbNone);
+		_pointerObject = ID_NOTHING;
+		_currentObject[_firstObjectSet ? 1 : 0] = ID_NOTHING;
+	}
 
 	void scriptInfo();
 	void scriptExec(int argc, const char **argv);
@@ -276,13 +286,15 @@
 	bool _firstObjectSet;
 	bool _secondObjectNeeded;
 	uint16 _currentObject[2];
+	int16 _currentObjectFlags[2];
 	uint16 _pendingObject[2];
 	int _currentVerb;
 	int _stickyVerb;
 	int _leftButtonVerb;
 	int _rightButtonVerb;
 	int _pendingVerb;
-	
+
+	uint16 _pointerObject;	
 
 public:
 	bool _skipSpeeches;
@@ -290,27 +302,27 @@
 
 	int _dbg_singlestep;
 	int _dbg_dostep;
-	SCRIPT_THREAD *_dbg_thread;
+	ScriptThread *_dbg_thread;
 	TEXTLIST_ENTRY *_dbg_txtentry;
 
 public:
-	SCRIPT_THREAD *SThreadCreate();
-	int SThreadExecute(SCRIPT_THREAD *thread, int ep_num);
+	ScriptThread *createThread();
+	int executeThread(ScriptThread *thread, int entrypointNumber);
 	int executeThreads(uint msec);
 	int SThreadDebugStep();
-	void SThreadCompleteThread(void);
+	void completeThread(void);
 
 	void wakeUpActorThread(int waitType, void *threadObj);
 	void wakeUpThreads(int waitType);
 	void wakeUpThreadsDelayed(int waitType, int sleepTime);
 
 private:
-	void setFramePtr(SCRIPT_THREAD *thread, int newPtr);
-	unsigned char *SThreadGetReadPtr(SCRIPT_THREAD *thread);
+	void setFramePtr(ScriptThread *thread, int newPtr);
+	unsigned char *SThreadGetReadPtr(ScriptThread *thread);
 	unsigned long SThreadGetReadOffset(const byte *read_p);
-	size_t SThreadGetReadLen(SCRIPT_THREAD *thread);
-	void runThread(SCRIPT_THREAD *thread, int instr_limit);
-	int SThreadSetEntrypoint(SCRIPT_THREAD *thread, int ep_num);
+	size_t SThreadGetReadLen(ScriptThread *thread);
+	void runThread(ScriptThread *thread, int instr_limit);
+	void setThreadEntrypoint(ScriptThread *thread, int entrypointNumber);
 
 private:
 	typedef int (Script::*ScriptFunctionType)(SCRIPTFUNC_PARAMS);
@@ -322,8 +334,8 @@
 	const ScriptFunctionDescription *_scriptFunctionsList;
 
 	void setupScriptFuncList(void);
-	void scriptError(SCRIPT_THREAD *thread, const char *format, ...);
-	int SDebugPrintInstr(SCRIPT_THREAD *thread);
+	void scriptError(ScriptThread *thread, const char *format, ...);
+	int SDebugPrintInstr(ScriptThread *thread);
 
 	int SF_putString(SCRIPTFUNC_PARAMS);
 	int sfWait(SCRIPTFUNC_PARAMS);

Index: sdebug.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sdebug.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- sdebug.cpp	3 Jan 2005 21:17:32 -0000	1.25
+++ sdebug.cpp	15 Jan 2005 20:12:48 -0000	1.26
@@ -37,7 +37,7 @@
 #define SD_DISPLAY_LEN 128
 #define SD_ADDTXT(x) strncat(disp_buf, x, SD_DISPLAY_LEN);
 
-int Script::SDebugPrintInstr(SCRIPT_THREAD *thread) {
+int Script::SDebugPrintInstr(ScriptThread *thread) {
 	TEXTLIST_ENTRY tl_e;
 	char tmp_buf[80] = { 0 };
 	static char disp_buf[SD_DISPLAY_LEN] = { 0 };
@@ -66,11 +66,11 @@
 	tl_e.display = 1;
 
 	MemoryReadStream readS(currentScript()->bytecode->bytecode_p 
-							 + thread->i_offset, 
+							 + thread->instructionOffset, 
 							 currentScript()->bytecode->bytecode_len 
-							 - thread->i_offset);
+							 - thread->instructionOffset);
 	in_char = readS.readByte();
-	sprintf(tmp_buf, "%04lX | %02X | ", thread->i_offset, in_char);
+	sprintf(tmp_buf, "%04lX | %02X | ", thread->instructionOffset, in_char);
 	strncat(disp_buf, tmp_buf, SD_DISPLAY_LEN);
 
 	switch (in_char) {

Index: sfuncs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sfuncs.cpp,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -d -r1.76 -r1.77
--- sfuncs.cpp	11 Jan 2005 21:10:36 -0000	1.76
+++ sfuncs.cpp	15 Jan 2005 20:12:48 -0000	1.77
@@ -209,7 +209,7 @@
 // Param3: actor y
 int Script::sfScriptWalkTo(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
-	ActorLocation actorLocation;
+	Location actorLocation;
 	ActorData *actor;
 
 	actorId = getSWord(thread->pop());
@@ -566,7 +566,7 @@
 // Param3: actor y
 int Script::sfScriptWalkToAsync(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
-	ActorLocation actorLocation;
+	Location actorLocation;
 	ActorData *actor;
 
 	actorId = getSWord(thread->pop());
@@ -619,7 +619,7 @@
 // Param3: actor pos y
 int Script::scriptMoveTo(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
-	ActorLocation actorLocation;
+	Location actorLocation;
 	ActorData *actor;
 
 	actorId = getSWord(thread->pop());
@@ -688,7 +688,7 @@
 	uint16 actorId2;
 	ActorData *actor1;
 	ActorData *actor2;
-	ActorLocation location;
+	Location location;
 
 	actorId1 = getSWord(thread->pop());
 	actorId2 = getSWord(thread->pop());
@@ -751,7 +751,7 @@
 // Param4: actor walk flag
 int Script::sfScriptWalk(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
-	ActorLocation actorLocation;
+	Location actorLocation;
 	ActorData *actor;
 	uint16 walkFlags;
 
@@ -917,7 +917,7 @@
 // Param6: actor frame number
 int Script::sfPlaceActor(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
-	ActorLocation actorLocation;
+	Location actorLocation;
 	int actorDirection;
 	int frameType;
 	int frameOffset;

Index: sthread.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sthread.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- sthread.cpp	14 Jan 2005 10:10:23 -0000	1.58
+++ sthread.cpp	15 Jan 2005 20:12:49 -0000	1.59
@@ -37,34 +37,34 @@
 
 namespace Saga {
 
-void Script::setFramePtr(SCRIPT_THREAD *thread, int newPtr) {
+void Script::setFramePtr(ScriptThread *thread, int newPtr) {
 	thread->framePtr = newPtr;
 	dataBuffer(3)->length = ARRAYSIZE(thread->stackBuf) - thread->framePtr;
 	dataBuffer(3)->data = (ScriptDataWord *) &(thread->stackBuf[newPtr]);
 }
 
-SCRIPT_THREAD *Script::SThreadCreate() {
-	SCRIPT_THREAD *new_thread;
+ScriptThread *Script::createThread() {
+	ScriptThread *newThread;
 
 	if (!isInitialized()) {
 		return NULL;
 	}
 
-	new_thread = _threadList.pushFront().operator->();
+	newThread = _threadList.pushFront().operator->();
 
-	new_thread->stackPtr = ARRAYSIZE(new_thread->stackBuf) - 1;
-	setFramePtr(new_thread, new_thread->stackPtr);
+	newThread->stackPtr = ARRAYSIZE(newThread->stackBuf) - 1;
+	setFramePtr(newThread, newThread->stackPtr);
 
-	new_thread->flags = kTFlagWaiting;
-	new_thread->waitType = kWaitTypePause;
+	newThread->flags = kTFlagWaiting;
+	newThread->waitType = kWaitTypePause;
 
-	dataBuffer(4)->length = ARRAYSIZE(new_thread->threadVars);
-	dataBuffer(4)->data = new_thread->threadVars;
-	return new_thread;
+	dataBuffer(4)->length = ARRAYSIZE(newThread->threadVars);
+	dataBuffer(4)->data = newThread->threadVars;
+	return newThread;
 }
 
 void Script::wakeUpActorThread(int waitType, void *threadObj) {
-	SCRIPT_THREAD *thread;
+	ScriptThread *thread;
 	ScriptThreadList::iterator threadIterator;
 
 	for (threadIterator = _threadList.begin(); threadIterator != _threadList.end(); ++threadIterator) {
@@ -76,7 +76,7 @@
 }
 
 void Script::wakeUpThreads(int waitType) {
-	SCRIPT_THREAD *thread;
+	ScriptThread *thread;
 	ScriptThreadList::iterator threadIterator;
 	
 	for (threadIterator = _threadList.begin(); threadIterator != _threadList.end(); ++threadIterator) {
@@ -88,7 +88,7 @@
 }
 
 void Script::wakeUpThreadsDelayed(int waitType, int sleepTime) {
-	SCRIPT_THREAD *thread;
+	ScriptThread *thread;
 	ScriptThreadList::iterator threadIterator;
 
 	for (threadIterator = _threadList.begin(); threadIterator != _threadList.end(); ++threadIterator) {
@@ -101,7 +101,7 @@
 }
 
 int Script::executeThreads(uint msec) {
-	SCRIPT_THREAD *thread;
+	ScriptThread *thread;
 	ScriptThreadList::iterator threadIterator;
 
 	if (!isInitialized()) {
@@ -114,8 +114,8 @@
 		thread = threadIterator.operator->();
 
 		if (thread->flags & (kTFlagFinished | kTFlagAborted)) {
-			//if (thread->flags & kTFlagFinished) // FIXME. Missing function
-
+			if (thread->flags & kTFlagFinished)
+				setPointerVerb();
 			
 			threadIterator = _threadList.erase(threadIterator);
 			continue;
@@ -152,12 +152,12 @@
 	return SUCCESS;
 }
 
-void Script::SThreadCompleteThread(void) {
+void Script::completeThread(void) {
 	for (int i = 0; i < 40 &&  !_threadList.isEmpty() ; i++)
 		executeThreads(0);
 }
 
-int Script::SThreadSetEntrypoint(SCRIPT_THREAD *thread, int ep_num) {
+void Script::setThreadEntrypoint(ScriptThread *thread, int entrypointNumber) {
 	SCRIPT_BYTECODE *bytecode;
 	int max_entrypoint;
 
@@ -166,26 +166,24 @@
 	bytecode = currentScript()->bytecode;
 	max_entrypoint = bytecode->n_entrypoints;
 
-	if ((ep_num < 0) || (ep_num >= max_entrypoint)) {
-		return FAILURE;
+	if ((entrypointNumber < 0) || (entrypointNumber >= max_entrypoint)) {
+		error("Script::setThreadEntrypoint wrong entrypointNumber");
 	}
 
-	thread->ep_num = ep_num;
-	thread->ep_offset = bytecode->entrypoints[ep_num].offset;
-
-	return SUCCESS;
+	thread->entrypointNumber = entrypointNumber;
+	thread->entrypointOffset = bytecode->entrypoints[entrypointNumber].offset;
 }
 
-int Script::SThreadExecute(SCRIPT_THREAD *thread, int ep_num) {
+int Script::executeThread(ScriptThread *thread, int entrypointNumber) {
 	assert(isInitialized());
 
 	if ((currentScript() == NULL) || (!currentScript()->loaded)) {
 		return FAILURE;
 	}
 
-	SThreadSetEntrypoint(thread, ep_num);
+	setThreadEntrypoint(thread, entrypointNumber);
 
-	thread->i_offset = thread->ep_offset;
+	thread->instructionOffset = thread->entrypointOffset;
 	thread->flags = kTFlagNone;
 
 	return SUCCESS;
@@ -193,16 +191,16 @@
 
 
 
-unsigned char *Script::SThreadGetReadPtr(SCRIPT_THREAD *thread) {
-	return currentScript()->bytecode->bytecode_p + thread->i_offset;
+unsigned char *Script::SThreadGetReadPtr(ScriptThread *thread) {
+	return currentScript()->bytecode->bytecode_p + thread->instructionOffset;
 }
 
 unsigned long Script::SThreadGetReadOffset(const byte *read_p) {
 	return (unsigned long)(read_p - (unsigned char *)currentScript()->bytecode->bytecode_p);
 }
 
-size_t Script::SThreadGetReadLen(SCRIPT_THREAD *thread) {
-	return currentScript()->bytecode->bytecode_len - thread->i_offset;
+size_t Script::SThreadGetReadLen(ScriptThread *thread) {
+	return currentScript()->bytecode->bytecode_len - thread->instructionOffset;
 }
 
 
@@ -216,7 +214,7 @@
 	return SUCCESS;
 }
 
-void Script::runThread(SCRIPT_THREAD *thread, int instr_limit) {
+void Script::runThread(ScriptThread *thread, int instr_limit) {
 	int instr_count;
 	uint32 saved_offset;
 	ScriptDataWord param1;
@@ -251,23 +249,23 @@
 	dataBuffer(2)->length = currentScript()->bytecode->bytecode_len / sizeof(ScriptDataWord);
 	dataBuffer(2)->data = (ScriptDataWord *) currentScript()->bytecode->bytecode_p;
 
-	scriptS.seek(thread->i_offset);
+	scriptS.seek(thread->instructionOffset);
 
 	for (instr_count = 0; instr_count < instr_limit; instr_count++) {
 		if (thread->flags & (kTFlagAsleep))
 			break;
 
-		saved_offset = thread->i_offset;
+		saved_offset = thread->instructionOffset;
 		operandChar = scriptS.readByte();
 //		debug print (opCode name etc) should be placed here
 //		SDebugPrintInstr(thread)
 
-//		debug(2, "Executing thread offset: %lu (%x) stack: %d", thread->i_offset, operandChar, thread->stackSize());
+//		debug(2, "Executing thread offset: %lu (%x) stack: %d", thread->instructionOffset, operandChar, thread->stackSize());
 		switch (operandChar) {
 		case 0x01: // nextblock
 			// Some sort of "jump to the start of the next memory
 			// page" instruction, I think.
-			thread->i_offset = 1024 * ((thread->i_offset / 1024) + 1);
+			thread->instructionOffset = 1024 * ((thread->instructionOffset / 1024) + 1);
 			break;
 
 // STACK INSTRUCTIONS
@@ -356,7 +354,7 @@
 				// counter as a pointer here. But I don't think
 				// we will have to do that.
 				thread->push(data);
-				thread->i_offset = (unsigned long)param1;
+				thread->instructionOffset = (unsigned long)param1;
 			}
 			break;
 		case opCcall:		// Call function
@@ -377,7 +375,7 @@
 				scriptFunction = _scriptFunctionsList[functionNumber].scriptFunction;
 				scriptFunctionReturnValue = (this->*scriptFunction)(thread, argumentsCount);
 				if (scriptFunctionReturnValue != SUCCESS) {
-					_vm->_console->DebugPrintf(S_WARN_PREFIX "%X: Script function %d failed.\n", thread->i_offset, scriptFunctionReturnValue);
+					_vm->_console->DebugPrintf(S_WARN_PREFIX "%X: Script function %d failed.\n", thread->instructionOffset, scriptFunctionReturnValue);
 				}
 
 				if (functionNumber == 16) { // SF_gotoScene
@@ -408,7 +406,7 @@
 				thread->flags |= kTFlagFinished;
 				return;
 			} else {
-				thread->i_offset = thread->pop();
+				thread->instructionOffset = thread->pop();
 				/* int n_args = */ thread->pop();
 				if (operandChar == opReturn)
 					thread->push(scriptRetVal);
@@ -420,14 +418,14 @@
 			// (JMP): Unconditional jump
 		case 0x1D:
 			param1 = scriptS.readUint16LE();
-			thread->i_offset = (unsigned long)param1;
+			thread->instructionOffset = (unsigned long)param1;
 			break;
 			// (JNZP): Jump if nonzero + POP
 		case 0x1E:
 			param1 = scriptS.readUint16LE();
 			data = thread->pop();
 			if (data) {
-				thread->i_offset = (unsigned long)param1;
+				thread->instructionOffset = (unsigned long)param1;
 			}
 			break;
 			// (JZP): Jump if zero + POP
@@ -435,7 +433,7 @@
 			param1 = scriptS.readUint16LE();
 			data = thread->pop();
 			if (!data) {
-				thread->i_offset = (unsigned long)param1;
+				thread->instructionOffset = (unsigned long)param1;
 			}
 			break;
 			// (JNZ): Jump if nonzero
@@ -443,7 +441,7 @@
 			param1 = scriptS.readUint16LE();
 			data = thread->stackTop();
 			if (data) {
-				thread->i_offset = (unsigned long)param1;
+				thread->instructionOffset = (unsigned long)param1;
 			}
 			break;
 			// (JZ): Jump if zero
@@ -451,7 +449,7 @@
 			param1 = scriptS.readUint16LE();
 			data = thread->stackTop();
 			if (!data) {
-				thread->i_offset = (unsigned long)param1;
+				thread->instructionOffset = (unsigned long)param1;
 			}
 			break;
 			// (SWCH): Switch
@@ -470,7 +468,7 @@
 					switch_jmp = scriptS.readUint16LE();
 					// Found the specified case
 					if (data == (ScriptDataWord) switch_num) {
-						thread->i_offset = switch_jmp;
+						thread->instructionOffset = switch_jmp;
 						case_found = 1;
 						break;
 					}
@@ -479,7 +477,7 @@
 				// Jump to default case
 				if (!case_found) {
 					default_jmp = scriptS.readUint16LE();
-					thread->i_offset = default_jmp;
+					thread->instructionOffset = default_jmp;
 				}
 			}
 			break;
@@ -497,7 +495,7 @@
 					uint16 offset = scriptS.readUint16LE();
 
 					if (branch_probability > probability) {
-						thread->i_offset = offset;
+						thread->instructionOffset = offset;
 						break;
 					}
 
@@ -770,7 +768,7 @@
 
 				if (!(speechFlags & kSpeakAsync)) {
 					thread->wait(kWaitTypeSpeech);
-					thread->i_offset = scriptS.pos();
+					thread->instructionOffset = scriptS.pos();
 					return;
 				}
 			}
@@ -803,7 +801,7 @@
 			scriptS.readUint16LE();
 			scriptS.readUint16LE();
 			iparam1 = (long)scriptS.readByte();
-			thread->i_offset += iparam1;
+			thread->instructionOffset += iparam1;
 			break;
 
 // End instruction list
@@ -814,14 +812,14 @@
 		}
 
 		// Set instruction offset only if a previous instruction didn't branch
-		if (saved_offset == thread->i_offset) {
-			thread->i_offset = scriptS.pos();
+		if (saved_offset == thread->instructionOffset) {
+			thread->instructionOffset = scriptS.pos();
 		} else {
-			if (thread->i_offset >= scriptS.size()) {
+			if (thread->instructionOffset >= scriptS.size()) {
 				scriptError(thread, "Out of range script execution");
 				return;
 			} else {
-				scriptS.seek(thread->i_offset);
+				scriptS.seek(thread->instructionOffset);
 			}
 		}
 

Index: xref.txt
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/xref.txt,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- xref.txt	4 Jan 2005 17:15:53 -0000	1.17
+++ xref.txt	15 Jan 2005 20:12:49 -0000	1.18
@@ -60,9 +60,9 @@
  resInfo->loadList         _desc.resListRN
  resInfo->horizon          _desc.endSlope
  resInfo->nearFigureLimit  _desc.beginSlope
- resInfo->scriptModule     _desc.scriptNum
- resInfo->entryScript      _desc.sceneScriptNum
- resInfo->preScript        _desc.startScriptNum
+ resInfo->scriptModule     _desc.scriptModuleNumber
+ resInfo->entryScript      _desc.sceneScriptEntrypointNumber
+ resInfo->preScript        _desc.startScriptEntrypointNumber
  resInfo->backgroundMusic  _desc.musicRN
  thisScene->ID             currentSceneNumber()
 





More information about the Scummvm-git-logs mailing list