[Scummvm-cvs-logs] CVS: scummvm/saga game.cpp,1.53,1.54 input.cpp,1.33,1.34 interface.cpp,1.60,1.61 interface.h,1.28,1.29 saga.cpp,1.87,1.88 saga.h,1.72,1.73 script.cpp,1.45,1.46 script.h,1.50,1.51

Andrew Kurushin h00ligan at users.sourceforge.net
Thu Jan 13 14:44:19 CET 2005


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

Modified Files:
	game.cpp input.cpp interface.cpp interface.h saga.cpp saga.h 
	script.cpp script.h 
Log Message:
- introduced SagaEngine::getTextString (for i18n it should route to corresponding string array)
- first step in verb implementation: proper button draw, keyboard respond 'w','l' &etc
- added comments and some fields to GameDisplayInfo

Index: game.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/game.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- game.cpp	11 Jan 2005 21:10:19 -0000	1.53
+++ game.cpp	13 Jan 2005 22:42:48 -0000	1.54
@@ -41,31 +41,46 @@
 static int detectGame(const FSList &fslist, bool mode = false);
 
 // ITE section
+static PanelButton ITE_MainPanelButtons[] = {
+	{kPanelButtonVerb, 52, 4, 57, 10, kVerbWalkTo, 'w', 0, 1},
+	{kPanelButtonVerb, 52, 15, 57, 10, kVerbLookAt, 'l', 2, 3},
+	{kPanelButtonVerb, 52, 26, 57, 10, kVerbPickUp, 'p', 4, 5}, 
+	{kPanelButtonVerb, 52, 37, 57, 10, kVerbTalkTo, 't', 0, 1},
+	{kPanelButtonVerb, 110, 4, 56, 10, kVerbOpen, 'o', 6, 7},
+	{kPanelButtonVerb, 110, 15, 56, 10, kVerbClose, 'c', 8, 9},
+	{kPanelButtonVerb, 110, 26, 56, 10, kVerbUse, 'u', 10, 11},
+	{kPanelButtonVerb, 110, 37, 56, 10, kVerbGive, 'g', 12, 13},
+	{kPanelButtonArrow, 306, 6, 8, 5, 0, 'U', 0, 0},
+	{kPanelButtonArrow, 306, 41, 8, 5, 1, 'D', 0, 0}
+};
+
 static GameDisplayInfo ITE_DisplayInfo = {
-	320, 200,
+	320, 200,		// logical width&height
 	
-	35,
-	137,
+	35,				// scene path y offset
+	137,			// scene height
 
-	137,
-	320,
-	12,
-	2,
-	186,
-	15,
+	137,			// status y
+	320,			// status width
+	12,				// status height
+	2,				// status text y offset
+	186,			// status text color
+	15,				// status BG color
 
-	147,
-	15,
-	96,
+	147,			// verb text color
+	15,				// verb text shadow color
+	96,				// verb text active color
 	
-	5, 4,
-	274, 4,
+	5, 4,			// left portrait x, y offset
+	274, 4,			// right portrait x, y offset
 
-	181, 155,
-	2, 4,
-	29, 20,
-	1, 0,
-	3, 1
+	181, 155,		// inventory x, y
+	2, 4,			// inventory rows, columns 
+	29, 20,			// inventory icon width, height
+	1, 0,			// inventory icon x, y offset
+	3, 1,			// inventory x, y icon spacing
+	ARRAYSIZE(ITE_MainPanelButtons),
+	ITE_MainPanelButtons
 };
 
 static GameResourceDescription ITE_Resources = {
@@ -177,6 +192,10 @@
 
 // IHNM section
 
+static PanelButton IHNM_MainPanelButtons[] = {
+	{kPanelButtonVerb, 0, 0, 0, 0, kVerbWalkTo, ' ', 0, 0}, //TODO
+};
+
 static GameDisplayInfo IHNM_DisplayInfo = {
 	640, 480,
 	
@@ -201,7 +220,9 @@
 	0, 0,
 	0, 0,
 	0, 0,
-	0, 0
+	0, 0,
+	ARRAYSIZE(IHNM_MainPanelButtons),
+	IHNM_MainPanelButtons
 };
 
 static GameResourceDescription IHNM_Resources = {
@@ -688,11 +709,6 @@
 
 		test_file.close();
 
-		if (_vm->_interface->registerLang() != SUCCESS) {
-			warning("Error registering interface language cvars");
-			return FAILURE;
-		}
-
 		if (_vm->_scene->ITEIntroRegisterLang() != SUCCESS) {
 			warning("Error registering intro sequence language cvars");
 			return FAILURE;

Index: input.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/input.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- input.cpp	11 Jan 2005 21:10:19 -0000	1.33
+++ input.cpp	13 Jan 2005 22:42:49 -0000	1.34
@@ -82,20 +82,8 @@
 			case 'p':
 				_render->toggleFlag(RF_RENDERPAUSE);
 				break;
-			case 27: // Esc
-				// Skip to next scene skip target
-				switch (_interface->getMode()) {
-				case kPanelNull:
-					if (_scene->isInDemo())
-						_scene->skipScene();
-					else
-						_actor->abortAllSpeeches();
-					break;
-				default:
-					break;
-				}
-				break;
 			default:
+				_interface->processKeyCode(event.kbd.keycode);
 				break;
 			}
 			break;

Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- interface.cpp	11 Jan 2005 21:10:19 -0000	1.60
+++ interface.cpp	13 Jan 2005 22:42:49 -0000	1.61
@@ -39,67 +39,29 @@
 
 namespace Saga {
 
-static VERB_DATA I_VerbData[] = {
-	{I_VERB_WALKTO, "verb_walkto", "Walk to", kVerbWalkTo},
-	{I_VERB_LOOKAT, "verb_lookat", "Look at", kVerbLookAt},
-	{I_VERB_PICKUP, "verb_pickup", "Pick up", kVerbPickup},
-	{I_VERB_TALKTO, "verb_talkto", "Talk to", kVerbSpeakTo},
-	{I_VERB_OPEN, "verb_open", "Open", kVerbOpen},
-	{I_VERB_CLOSE, "verb_close", "Close", kVerbClose},
-	{I_VERB_USE, "verb_use", "Use", kVerbUse},
-	{I_VERB_GIVE, "verb_give", "Give", kVerbGive}
-};
-
-static InterfaceButton ITEMainPanel[] = {
-	{5, 4, 46, 47, "Portrait", 0, 0, BUTTON_NONE, 0}, //TODO: remove?
-	// "Walk To" and "Talk To" share button sprites
-	{52, 4, 109, 14, "Walk To", 1, 2, BUTTON_VERB, I_VERB_WALKTO},
-	{52, 15, 109, 25, "Look At", 3, 4, BUTTON_VERB, I_VERB_LOOKAT},
-	{52, 26, 109, 36, "Pick Up", 5, 6, BUTTON_VERB, I_VERB_PICKUP},
-	{52, 37, 109, 47, "Talk To", 1, 2, BUTTON_VERB, I_VERB_TALKTO},
-	{110, 4, 166, 14, "Open", 7, 8, BUTTON_VERB, I_VERB_OPEN},
-	{110, 15, 166, 25, "Close", 9, 10, BUTTON_VERB, I_VERB_CLOSE},
-	{110, 26, 166, 36, "Use", 11, 12, BUTTON_VERB, I_VERB_USE},
-	{110, 37, 166, 47, "Give", 13, 14, BUTTON_VERB, I_VERB_GIVE},
-
-	{181, 6, 206, 24, "Inv1", 0, 0, BUTTON_NONE, 0},
-	{213, 6, 240, 24, "Inv2", 0, 0, BUTTON_NONE, 0},
-	{245, 6, 272, 24, "Inv3", 0, 0, BUTTON_NONE, 0},
-	{277, 6, 304, 24, "Inv4", 0, 0, BUTTON_NONE, 0},
-	{181, 27, 208, 45, "Inv5", 0, 0, BUTTON_NONE, 0},
-	{213, 27, 240, 45, "Inv6", 0, 0, BUTTON_NONE, 0},
-	{245, 27, 272, 45, "Inv7", 0, 0, BUTTON_NONE, 0},
-	{277, 27, 304, 45, "Inv8", 0, 0, BUTTON_NONE, 0},
-	{306, 6, 314, 11, "InvUp", 0, 0, BUTTON_NONE, 0},
-	{306, 41, 314, 45, "InvDown", 0, 0, BUTTON_NONE, 0}
-};
-
-
-static InterfaceButton IHNMMainPanel[] = {
-	{5, 4, 46, 47, "Portrait", 0, 0, 0, 0}
+static int verbTypeToTextStringsIdLUT[kVerbTypesMax] = {
+	-1,
+	kTextPickUp,
+	kTextLookAt,
+	kTextWalkTo,
+	kTextTalkTo,
+	kTextOpen,
+	kTextClose,
+	kTextGive,
+	kTextUse,
+	-1,
+	-1,
+	-1,
+	-1,
+	-1,
+	-1
 };
 
-int Interface::registerLang(void) {
-#if 0
-	size_t i;
-
-	for (i = 0; i < ARRAYSIZE(I_VerbData); i++) {
-		if (CVAR_Register_S(I_VerbData[i].verb_str,
-			I_VerbData[i].verb_cvar,
-			NULL, CVAR_CFG, VERB_STRLIMIT) != SUCCESS) {
-
-			return FAILURE;
-		}
-
-		assert(CVAR_Find(I_VerbData[i].verb_cvar) != NULL);
-	}
-#endif
-
-	return SUCCESS;
-}
-
 Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
+	byte *resource;
+	size_t resourceLength;
 	int result;
+	int i;
 
 	if (_initialized) {
 		return;
@@ -107,71 +69,65 @@
 
 	_iThread = _vm->_script->SThreadCreate();
 	if (_iThread == NULL) {
-		warning("Interface::Interface(): Error creating script thread for game interface module");
-		return;
+		error("Interface::Interface(): Error creating script thread for game interface module");
 	}
 
 	// Load interface module resource file context
 	_interfaceContext = _vm->getFileContext(GAME_RESOURCEFILE, 0);
 	if (_interfaceContext == NULL) {
-		return;
+		error("Interface::Interface(): unable to load resource");
 	}
+	
+	_mainPanel.buttons = _vm->getDisplayInfo().mainPanelButtons;
+	_mainPanel.buttonsCount = _vm->getDisplayInfo().mainPanelButtonsCount;
 
-	// Initialize interface data by game type
-	if (_vm->getGameType() == GType_ITE) {
-		// Load Inherit the Earth interface desc
-		_mainPanel.buttons = ITEMainPanel;
-		_mainPanel.nbuttons = ARRAYSIZE(ITEMainPanel);
-
-	} else if (_vm->getGameType() == GType_IHNM) {
-		// Load I Have No Mouth interface desc
-		_mainPanel.buttons = IHNMMainPanel;
-		_mainPanel.nbuttons = ARRAYSIZE(IHNMMainPanel);
-	} else {
-		return;
+	for (i = 0; i < kVerbTypesMax; i++) {
+		_verbTypeToPanelButton[i] = NULL;
+	}
+	
+	for (i = 0; i < _mainPanel.buttonsCount; i++) {
+		if (_mainPanel.buttons[i].type == kPanelButtonVerb) {
+			_verbTypeToPanelButton[_mainPanel.buttons[i].id] = &_mainPanel.buttons[i];
+		}
 	}
 
-	// Load command panel resource
-	result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->command_panel_rn, &_mainPanel.res, &_mainPanel.res_len);
-	if (result != SUCCESS) {
-		return;
+	result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->mainPanelResourceId, &resource, &resourceLength);
+	if ((result != SUCCESS) || (resourceLength == 0)) {
+		error("Interface::Interface(): unable to load mainPanel resource");
 	}
+	_vm->decodeBGImage(resource, resourceLength, &_mainPanel.image,
+		&_mainPanel.imageLength, &_mainPanel.imageWidth, &_mainPanel.imageHeight);
+	
+	RSC_FreeResource(resource);
 
-	// Load dialogue panel resource
-	result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->dialogue_panel_rn, &_conversePanel.res, &_conversePanel.res_len);
-	if (result != SUCCESS) {
-		return;
+	result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, &resource, &resourceLength);
+	if ((result != SUCCESS) || (resourceLength == 0)) {
+		error("Interface::Interface unable to load conversePanel resource");
 	}
+	_vm->decodeBGImage(resource, resourceLength, &_conversePanel.image,
+		&_conversePanel.imageLength, &_conversePanel.imageWidth, &_conversePanel.imageHeight);
+	RSC_FreeResource(resource);
 
-	if (_vm->_sprite->loadList(RID_ITE_COMMAND_BUTTONSPRITES, _mainPanel.sprites) != SUCCESS) {
-		error("Unable to load sprite list");
+	if (_vm->_sprite->loadList(RID_ITE_COMMAND_BUTTONSPRITES, _mainPanel.sprites) != SUCCESS) { //TODO: move constant to ResourceDescription
+		error("Interface::Interface(): Unable to load sprite list");
 	}
-	
-	
-	if (_vm->_sprite->loadList(RID_ITE_DEFAULT_PORTRAITS, _defPortraits) != SUCCESS) {
-		error("Unable to load sprite list");
+		
+	if (_vm->_sprite->loadList(RID_ITE_DEFAULT_PORTRAITS, _defPortraits) != SUCCESS) { //TODO: move constant to ResourceDescription
+		error("Interface::Interface(): Unable to load sprite list");
 	}
 
 
-	_vm->decodeBGImage(_mainPanel.res, _mainPanel.res_len, &_mainPanel.img,
-					&_mainPanel.img_len, &_mainPanel.img_w, &_mainPanel.img_h);
-
-	_vm->decodeBGImage(_conversePanel.res, _conversePanel.res_len,
-					&_conversePanel.img, &_conversePanel.img_len,
-					&_conversePanel.img_w, &_conversePanel.img_h);
-
-	_mainPanel.x = 0;
+	_mainPanel.x = 0;		//TODO: move constant to DisplayInfo
 	_mainPanel.y = 149;
+	_mainPanel.currentButton = NULL;
 
-	_conversePanel.x = 0;
+	_conversePanel.x = 0;	//TODO: move constant to DisplayInfo
 	_conversePanel.y = 149;
+	_conversePanel.currentButton = NULL;
 
-	_mainPanel.set_button = 1;
 	_leftPortrait = 0;
 	_rightPortrait = 0;
 
-	_activeVerb = I_VERB_WALKTO;
-
 	_active = false;
 	_panelMode = _lockedMode = kPanelNull;
 	_savedMode = -1;
@@ -183,7 +139,7 @@
 
 	_inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16));
 	if (_inventory == NULL) {
-		return;
+		error("Interface::Interface(): not enough memory");
 	}
 
 	_initialized = true;
@@ -259,12 +215,47 @@
 	}
 	else
 		_panelMode = newMode;
+	
+	if (_panelMode == kPanelMain) {
+		_mainPanel.currentButton = NULL;
+	} else {
+		if (_panelMode == kPanelConverse) {
+			_conversePanel.currentButton = NULL;
+		}
+	}
 
 	draw();
 
 	return SUCCESS;
 }
 
+bool Interface::processKeyCode(int keyCode) {
+	int i;
+	switch (_panelMode) {
+	case kPanelNull:
+		if (keyCode == 27) {// Esc
+			if (_vm->_scene->isInDemo()) {
+				_vm->_scene->skipScene();
+			} else {
+				_vm->_actor->abortAllSpeeches();
+			}
+			return true;
+		}
+		break;
+	case kPanelMain:
+		for (i = 0; i < kVerbTypesMax; i++) {
+			if (_verbTypeToPanelButton[i] != NULL) {
+				if (_verbTypeToPanelButton[i]->keyChar == keyCode) {
+					_vm->_script->setVerb(_verbTypeToPanelButton[i]->id);
+					return true;
+				}
+			}
+		}
+		break;
+	}
+	return false;
+}
+
 int Interface::setStatusText(const char *new_txt) {
 	assert(new_txt != NULL);
 
@@ -295,6 +286,7 @@
 
 int Interface::draw() {
 	SURFACE *backBuffer;
+	int i;
 
 	Point base;
 	Point leftPortraitPoint;
@@ -314,32 +306,37 @@
 		base.y = _mainPanel.y;
 
 		origin.x = 0;
-		origin.y = _vm->getDisplayHeight() - _mainPanel.img_h;
+		origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
 
-		bufToSurface(backBuffer, _mainPanel.img, _mainPanel.img_w, _mainPanel.img_h, NULL, &origin);
-		
+		bufToSurface(backBuffer, _mainPanel.image, _mainPanel.imageWidth, _mainPanel.imageHeight, NULL, &origin);
+		//here we will draw verbs
+		for (i = 0; i < kVerbTypesMax; i++) {
+			if (_verbTypeToPanelButton[i] != NULL) {
+				drawPanelButtonText(backBuffer, &_mainPanel, _verbTypeToPanelButton[i], _vm->getDisplayInfo().verbTextColor, _vm->getDisplayInfo().verbTextShadowColor);
+			}
+		}
 	} else {
 		base.x = _conversePanel.x;
 		base.y = _conversePanel.y;
 
 		origin.x = 0;
-		origin.y = _vm->getDisplayHeight() - _mainPanel.img_h;
+		origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
 
-		bufToSurface(backBuffer, _conversePanel.img, _conversePanel.img_w,
-						_conversePanel.img_h, NULL, &origin);
+		bufToSurface(backBuffer, _conversePanel.image, _conversePanel.imageWidth,
+						_conversePanel.imageHeight, NULL, &origin);
 	}
 
 	if (_panelMode == kPanelMain || _panelMode == kPanelConverse ||
 		_lockedMode == kPanelMain || _lockedMode == kPanelConverse) {
-			leftPortraitPoint.x = base.x + _vm->getDisplayInfo().leftPortraitX;
-			leftPortraitPoint.y = base.y + _vm->getDisplayInfo().leftPortraitY;
+			leftPortraitPoint.x = base.x + _vm->getDisplayInfo().leftPortraitXOffset;
+			leftPortraitPoint.y = base.y + _vm->getDisplayInfo().leftPortraitYOffset;
 			_vm->_sprite->draw(backBuffer, _defPortraits, _leftPortrait, leftPortraitPoint, 256);
 		}
 		
 
-	if (!_inMainMode && _vm->getDisplayInfo().rightPortraitX >= 0) {
-		rightPortraitPoint.x = base.x + _vm->getDisplayInfo().rightPortraitX;
-		rightPortraitPoint.y = base.y + _vm->getDisplayInfo().rightPortraitY;
+	if (!_inMainMode && _vm->getDisplayInfo().rightPortraitXOffset >= 0) {
+		rightPortraitPoint.x = base.x + _vm->getDisplayInfo().rightPortraitXOffset;
+		rightPortraitPoint.y = base.y + _vm->getDisplayInfo().rightPortraitYOffset;
 
 		_vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
 	}
@@ -350,40 +347,41 @@
 	return SUCCESS;
 }
 
-int Interface::update(const Point& imousePt, int update_flag) {
-	SURFACE *back_buf;
+int Interface::update(const Point& imousePointer, int updateFlag) {
+	SURFACE *backBuffer;
 
-	int imouse_x, imouse_y;
 
 	if (_vm->_scene->isInDemo() || _panelMode == kPanelFade)
 		return SUCCESS;
 
-	imouse_x = imousePt.x;
-	imouse_y = imousePt.y;
-
-	back_buf = _vm->_gfx->getBackBuffer();
+	
+	backBuffer = _vm->_gfx->getBackBuffer();
 
 
 	if (_panelMode == kPanelMain) { // FIXME: HACK
 		// Update playfield space ( only if cursor is inside )
-		if (imouse_y < _vm->getSceneHeight()) {
+		if (imousePointer.y < _vm->getSceneHeight()) {
 			// Mouse is in playfield space
-			if (update_flag == UPDATE_MOUSEMOVE) {
-				handlePlayfieldUpdate(back_buf, imousePt);
-			} else if (update_flag == UPDATE_MOUSECLICK) {
-				handlePlayfieldClick(back_buf, imousePt);
+			if (updateFlag == UPDATE_MOUSEMOVE) {
+				handlePlayfieldUpdate(backBuffer, imousePointer);
+			} else {
+				if (updateFlag == UPDATE_MOUSECLICK) {
+					handlePlayfieldClick(backBuffer, imousePointer);
+				}
+			}
+		} else {
+			// Update command space
+			if (updateFlag == UPDATE_MOUSEMOVE) {
+				handleCommandUpdate(backBuffer, imousePointer);
+			} else {
+				if (updateFlag == UPDATE_MOUSECLICK) {
+					handleCommandClick(backBuffer, imousePointer);
+				}
 			}
-		}
-
-		// Update command space
-		if (update_flag == UPDATE_MOUSEMOVE) {
-			handleCommandUpdate(back_buf, imousePt);
-		} else if (update_flag == UPDATE_MOUSECLICK) {
-			handleCommandClick(back_buf, imousePt);
 		}
 	}
 
-	drawStatusBar(back_buf);
+	drawStatusBar(backBuffer);
 
 	return SUCCESS;
 }
@@ -417,112 +415,40 @@
 	return SUCCESS;
 }
 
-int Interface::handleCommandClick(SURFACE *ds, const Point& imousePt) {
-	int hit_button;
-	int ibutton_num;
-
-	int x_base;
-	int y_base;
-
-	Point button;
+void Interface::handleCommandClick(SURFACE *ds, const Point& imousePointer) {
 
-	int old_set_button;
-	int set_button;
+	PanelButton *panelButton;
 
-	hit_button = hitTest(imousePt, &ibutton_num);
-	if (hit_button != SUCCESS) {
-		// Clicking somewhere other than a button doesn't do anything
-		return SUCCESS;
+	panelButton = verbHitTest(imousePointer);
+	if (panelButton) {
+		_vm->_script->setVerb(panelButton->id);
+		return;
 	}
+}
 
-	x_base = _mainPanel.x;
-	y_base = _mainPanel.y;
-
-	if (_mainPanel.buttons[ibutton_num].flags & BUTTON_SET) {
-		old_set_button = _mainPanel.set_button;
-		set_button = ibutton_num;
-		_mainPanel.set_button = set_button;
-
-		if (_mainPanel.buttons[set_button].flags & BUTTON_VERB) {
-			_activeVerb = _mainPanel.buttons[ibutton_num].data;
-		}
-
-		if (_mainPanel.buttons[set_button].flags & BUTTON_BITMAP) {
-			button.x = x_base + _mainPanel.buttons[set_button].x1;
-			button.y = y_base + _mainPanel.buttons[set_button].y1;
+void Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePointer) {
+	PanelButton *panelButton;
 
-			_vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[set_button].
-						active_sprite - 1, button, 256);
+	panelButton = verbHitTest(imousePointer);
+	if (_mainPanel.currentButton != panelButton) {
+		if (_mainPanel.currentButton) {
+			drawVerb(_mainPanel.currentButton->id, 0);
 		}
-
-		if (_mainPanel.buttons[old_set_button].flags & BUTTON_BITMAP) {
-			button.x = x_base + _mainPanel.buttons[old_set_button].x1;
-			button.y = y_base + _mainPanel.buttons[old_set_button].y1;
-
-			_vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[old_set_button].
-						inactive_sprite - 1, button, 256);
+		if (panelButton) {
+			drawVerb(panelButton->id, 1);			
 		}
 	}
-
-	return SUCCESS;
-}
-
-int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) {
-	int hit_button;
-	int ibutton_num;
-
-//	int button_w = 0;
-
-/*	int verb_idx = 0;
-	int string_w = 0;
-	int color;
-	int i;*/
-
-	hit_button = inventoryTest(imousePt, &ibutton_num);
+	_mainPanel.currentButton = panelButton;
+	if (panelButton) {
+		return;
+	}
+/*	hit_button = inventoryTest(imousePointer, &ibutton_num);
 
 	if (hit_button == SUCCESS) {
 		// Hovering over an inventory object
 		return SUCCESS;
-	}
-
-/*	hit_button = hitTest(imousePt, &ibutton_num);
-
-	if (hit_button == SUCCESS) {
-		// Hovering over a command panel button
-		setStatusText(I_VerbData[_activeVerb].verb_str);
-	}
-
-	for (i = 0; i < _mainPanel.nbuttons; i++) {
-		if (!(_mainPanel.buttons[i].flags & BUTTON_LABEL)) {
-			continue;
-		}
-
-		button_w = _mainPanel.buttons[i].x2 - _mainPanel.buttons[i].x1;
-
-		verb_idx = _mainPanel.buttons[i].data;
-
-		string_w = _vm->_font->getStringWidth(SMALL_FONT_ID, I_VerbData[verb_idx].verb_str, 0, 0);
-
-		if (i == hit_button) {
-			color = _iDesc.cmd_txt_hilitecol;
-		} else {
-			color = _iDesc.cmd_txt_col;
-		}
-
-		button.x = _mainPanel.x + _mainPanel.buttons[i].x1;
-		button.y = _mainPanel.y + _mainPanel.buttons[i].y1;
-
-		_vm->_font->draw(SMALL_FONT_ID, ds, I_VerbData[verb_idx].verb_str, 0,
-				button.x + ((button_w / 2) - (string_w / 2)), button.y + 1,
-				color, _iDesc.cmd_txt_shadowcol, FONT_SHADOW);
+	}*/
 
-		if ((i == _mainPanel.set_button) && (_mainPanel.buttons[i].flags & BUTTON_BITMAP)) {
-			_vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[i].active_sprite - 1,
-						button, 256);
-		}
-	}
-*/
-	return SUCCESS;
 }
 
 int Interface::handlePlayfieldClick(SURFACE *ds, const Point& imousePt) {
@@ -531,7 +457,7 @@
 	int objectNum;
 	uint16 object_flags = 0;
 
-	int script_num;
+//	int script_num;
 	ActorLocation location;
 
 	objectNum = _vm->_scene->_objectMap->hitTest(imousePt);
@@ -547,7 +473,7 @@
 	object_flags = _vm->_scene->_objectMap->getFlags(objectNum);
 
 	if (object_flags & kHitZoneExit) { // FIXME. This is wrong
-		if ((script_num = _vm->_scene->_objectMap->getEPNum(objectNum)) != -1) {
+/*		if ((script_num = _vm->_scene->_objectMap->getEPNum(objectNum)) != -1) {
 			// Set active verb in script module
 			_vm->_script->putWord(4, 4, I_VerbData[_activeVerb].s_verb);
 
@@ -555,7 +481,7 @@
 			if (script_num != 0) {
 				_vm->_script->SThreadExecute(_iThread, script_num);
 			}
-		}
+		}*/
 	} else {
 		// Not a normal scene object - walk to it as if it weren't there
 		location.fromScreenPoint(imousePt);
@@ -603,31 +529,23 @@
 	*/
 }
 
-int Interface::hitTest(const Point& imousePt, int *ibutton) {
-	InterfaceButton *buttons;
-
-	int nbuttons;
-	int xbase;
-	int ybase;
-
+PanelButton *Interface::verbHitTest(const Point& imousePointer) {
+	PanelButton *panelButton;
+	Rect rect;
 	int i;
-
-	buttons = _mainPanel.buttons;
-	nbuttons = _mainPanel.nbuttons;
-
-	xbase = _mainPanel.x;
-	ybase = _mainPanel.y;
-
-	for (i = 0; i < nbuttons; i++) {
-		if ((imousePt.x >= (xbase + buttons[i].x1)) && (imousePt.x < (xbase + buttons[i].x2)) &&
-			(imousePt.y >= (ybase + buttons[i].y1)) && (imousePt.y < (ybase + buttons[i].y2))) {
-			*ibutton = i;
-			return SUCCESS;
+	for (i = 0; i < kVerbTypesMax; i++) {
+		panelButton = _verbTypeToPanelButton[i];
+		if (panelButton != NULL) {
+			rect.left = _mainPanel.x + panelButton->xOffset;
+			rect.right = rect.left + panelButton->width;
+			rect.top = _mainPanel.y + panelButton->yOffset;
+			rect.bottom = rect.top + panelButton->height;
+			if (rect.contains(imousePointer))
+				return panelButton;
 		}
 	}
 
-	*ibutton = -1;
-	return FAILURE;
+	return NULL;
 }
 
 void Interface::addToInventory(int sprite) {
@@ -670,8 +588,8 @@
 	int row = 0;
 	int col = 0;
 
-	int x = _vm->getDisplayInfo().inventoryX + _vm->getDisplayInfo().inventoryIconX;
-	int y = _vm->getDisplayInfo().inventoryY + _vm->getDisplayInfo().inventoryIconY;
+	int x = _vm->getDisplayInfo().inventoryX + _vm->getDisplayInfo().inventoryIconXOffset;
+	int y = _vm->getDisplayInfo().inventoryY + _vm->getDisplayInfo().inventoryIconYOffset;
 	int width = _vm->getDisplayInfo().inventoryIconWidth + _vm->getDisplayInfo().inventoryXSpacing;
 	int height = _vm->getDisplayInfo().inventoryIconHeight + _vm->getDisplayInfo().inventoryYSpacing;
 	Point drawPoint;
@@ -726,6 +644,71 @@
 }
 
 void Interface::drawVerb(int verb, int state) {
+	SURFACE *backBuffer;
+	PanelButton * panelButton;
+	PanelButton * rightButtonVerbPanelButton;
+	PanelButton * currentVerbPanelButton;
+	int textColor;
+	int spriteNumber;
+	Point point;
+
+	backBuffer = _vm->_gfx->getBackBuffer();
+
+	panelButton = getPanelButtonByVerbType(verb);
+	rightButtonVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getRightButtonVerb());
+	currentVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getCurrentVerb());
+
+	if (panelButton == NULL) {
+		warning("panelButton == NULL");
+		return;
+	}
+	if (state == 2) {
+		state = (_mainPanel.currentButton == panelButton) ? 1 : 0;
+	}
+
+	if (state) {
+		textColor = _vm->getDisplayInfo().verbTextActiveColor;
+	} else {
+		if (panelButton == rightButtonVerbPanelButton) {
+			textColor = _vm->getDisplayInfo().verbTextActiveColor;
+		} else {
+			textColor = _vm->getDisplayInfo().verbTextColor;
+		}
+	}
+
+	if (panelButton == currentVerbPanelButton) {
+		spriteNumber = panelButton->downSpriteNumber;
+	} else {
+		spriteNumber = panelButton->upSpriteNumber;
+	}
+	point.x = _mainPanel.x + panelButton->xOffset;
+	point.y = _mainPanel.y + panelButton->yOffset;
+
+	_vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
+
+	drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
+}
+
+void Interface::drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor) {
+	const char *text;
+	int textWidth;
+	Point point;
+	int textId;
+	
+	textId = verbTypeToTextStringsIdLUT[panelButton->id];
+	
+	if (textId == -1)
+		error("textId == -1");
+
+	text = _vm->getTextString(textId);
+
+	
+	textWidth = _vm->_font->getStringWidth(SMALL_FONT_ID, text, 0, 0);
+
+	point.x = panel->x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2);
+	point.y = panel->y + panelButton->yOffset + 1;
+
+	_vm->_font->draw(SMALL_FONT_ID, ds, text, 0, point.x , point.y, textColor, textShadowColor, (textShadowColor != 0) ? FONT_SHADOW : 0);
 }
 
 // Converse stuff

Index: interface.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- interface.h	11 Jan 2005 21:10:20 -0000	1.28
+++ interface.h	13 Jan 2005 22:42:49 -0000	1.29
@@ -48,7 +48,7 @@
 #define CONVERSE_TEXT_HEIGHT	10
 #define CONVERSE_TEXT_LINES     4
 
-enum PANEL_MODES {
+enum PanelModes {
 	kPanelNull,
 	kPanelMain,
 	kPanelOption,
@@ -64,58 +64,21 @@
 	kPanelFade
 };
 
-enum BUTTON_FLAGS {
-	BUTTON_NONE = 0x0,
-	BUTTON_LABEL = 0x01,
-	BUTTON_BITMAP = 0x02,
-	BUTTON_SET = 0x04,
-	BUTTON_VERB = BUTTON_LABEL | BUTTON_BITMAP | BUTTON_SET
-};
-
-struct InterfaceButton {
-	int x1;
-	int y1;
-	int x2;
-	int y2;
-	const char *label;
-	int inactive_sprite;
-	int active_sprite;
-	int flags;
-	int data;
-};
-
 struct InterfacePanel {
-	byte *res;
-	size_t res_len;
 	int x;
 	int y;
-	byte *img;
-	size_t img_len;
-	int img_w;
-	int img_h;
-	int set_button;//TODO: remove
-	int nbuttons;
-	InterfaceButton *buttons;
+	byte *image;
+	size_t imageLength;
+	int imageWidth;
+	int imageHeight;
+	
+	PanelButton *currentButton;
+	int buttonsCount;
+	PanelButton *buttons;
 	SpriteList sprites;
 };
 
-enum INTERFACE_VERBS {
-	I_VERB_WALKTO,
-	I_VERB_LOOKAT,
-	I_VERB_PICKUP,
-	I_VERB_TALKTO,
-	I_VERB_OPEN,
-	I_VERB_CLOSE,
-	I_VERB_USE,
-	I_VERB_GIVE
-};
 
-struct VERB_DATA {
-	int i_verb;
-	const char *verb_cvar;
-	char verb_str[VERB_STRLIMIT];
-	int s_verb;
-};
 
 struct Converse {
 	char *text;
@@ -131,11 +94,10 @@
 	Interface(SagaEngine *vm);
 	~Interface(void);
 
-	int registerLang();
 	int activate();
 	int deactivate();
 	int setMode(int mode, bool force = false);
-	int getMode(void) { return _panelMode; }
+	int getMode(void) const { return _panelMode; }
 	void rememberMode();
 	void restoreMode();
 	void lockMode() { _lockedMode = _panelMode; }
@@ -146,22 +108,25 @@
 	int setLeftPortrait(int portrait);
 	int setRightPortrait(int portrait);
 	int draw();
+	int update(const Point& imousePointer, int updateFlag);
 	int drawStatusBar(SURFACE *ds);
-	int update(const Point& imousePt, int update_flag);
+	void drawVerb(int verb, int state);
 
+	bool processKeyCode(int keyCode);
+	
 	void addToInventory(int sprite);
 	void removeFromInventory(int sprite);
 	void drawInventory();
-	int inventoryTest(const Point& imousePt, int *ibutton);
-
+	
 private:
-	int hitTest(const Point& imousePt, int *ibutton);
-	int handleCommandUpdate(SURFACE *ds, const Point& imousePt);
-	int handleCommandClick(SURFACE *ds, const Point& imousePt);
+	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);
 	int handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt);
 	int handlePlayfieldClick(SURFACE *ds, const Point& imousePt);
-	void drawVerb(int verb, int state);
-
+	
+	void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor);
 public:
 	void converseClear(void);
 	bool converseAddText(const char *text, int replyId, byte replyFlags, int replyBit);
@@ -172,28 +137,33 @@
 
 private:
 	void converseDisplayTextLine(int textcolor, bool btnUp, bool rebuild);
-
-
+	PanelButton *getPanelButtonByVerbType(int verb) {
+		if ((verb < 0) || (verb >= kVerbTypesMax)) {
+			error("Interface::getPanelButtonByVerbType wrong verb");
+		}
+		return _verbTypeToPanelButton[verb];
+	}
 private:
 	SagaEngine *_vm;
 
 	bool _initialized;
-	bool _active;
 	RSCFILE_CONTEXT *_interfaceContext;
+	InterfacePanel _mainPanel;
+	InterfacePanel _conversePanel;
+	SpriteList _defPortraits;
+	SpriteList _scenePortraits;
+	SCRIPT_THREAD *_iThread;
+	PanelButton *_verbTypeToPanelButton[kVerbTypesMax];
+
+	bool _active;
 	int _panelMode;
 	int _savedMode;
 	int _lockedMode;
 	bool _inMainMode;
-	InterfacePanel _mainPanel;
-	InterfacePanel _conversePanel;
 	char _statusText[STATUS_TEXT_LEN];
 	int _leftPortrait;
 	int _rightPortrait;
-	SpriteList _defPortraits;
-	SpriteList _scenePortraits;
-	int _activeVerb;
-	SCRIPT_THREAD *_iThread;
-
+	
 	uint16 *_inventory;
 	int _inventorySize;
 	byte _inventoryCount;

Index: saga.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.cpp,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- saga.cpp	11 Jan 2005 21:10:20 -0000	1.87
+++ saga.cpp	13 Jan 2005 22:42:49 -0000	1.88
@@ -60,6 +60,48 @@
 	{0, 0, 0}
 };
 
+static const char *englishTextStrings[] = {
+	"Walk to",
+	"Look At",
+	"Pick Up",
+	"Talk to",
+	"Open",
+	"Close",
+	"Use",
+	"Give",
+	"Options",
+	"Test",
+	"Demo",
+	"Help",
+	"Quit Game",
+	"Fast",
+	"Slow",
+	"On",
+	"Off",
+	"Continue Playing",
+	"Load",
+	"Save",
+	"Game Options",
+	"Reading Speed",
+	"Music",
+	"Sound",
+	"Cancel",
+	"Quit",
+	"OK",
+	"Mid",
+	"Click",
+	"10%",
+	"20%",
+	"30%",
+	"40%",
+	"50%",
+	"60%",
+	"70%",
+	"80%",
+	"90%",
+	"Max"
+};
+
 GameList Engine_SAGA_gameList() {
 	GameList games;
 	const GameSettings *g = saga_games;
@@ -333,4 +375,9 @@
 	return NULL;
 }
 
+const char *SagaEngine::getTextString(int textStringId) {
+
+	return englishTextStrings[textStringId]; //TODO: i18n
+}
+
 } // End of namespace Saga

Index: saga.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.h,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- saga.h	13 Jan 2005 18:00:47 -0000	1.72
+++ saga.h	13 Jan 2005 22:42:49 -0000	1.73
@@ -99,7 +99,7 @@
 	kGameObjectStepZone = 4
 };
 
-enum scriptTimings {
+enum ScriptTimings {
 	kScriptTimeTicksPerSecond = (728L/10L),
 	kRepeatSpeed = 40,   // 25 frames/sec
 	kNormalFadeDuration = 320, // 64 steps, 5 msec each
@@ -131,6 +131,52 @@
 	kHitZoneTerminus = (1 << 3)
 };
 
+enum PanelButtonType {
+	kPanelButtonVerb = 0,
+	kPanelButtonArrow = 1
+};
+
+enum TextStringIds {
+	kTextWalkTo,
+	kTextLookAt,
+	kTextPickUp,
+	kTextTalkTo,
+	kTextOpen,
+	kTextClose,
+	kTextUse,
+	kTextGive,
+	kTextOptions,
+	kTextTest,
+	kTextDemo,
+	kTextHelp,
+	kTextQuitGame,
+	kTextFast,
+	kTextSlow,
+	kTextOn,
+	kTextOff,
+	kTextContinuePlaying,
+	kTextLoad,
+	kTextSave,
+	kTextGameOptions,
+	kTextReadingSpeed,
+	kTextMusic,
+	kTextSound,
+	kTextCancel,
+	kTextQuit,
+	kTextOK,
+	kTextMid,
+	kTextClick,
+	kText10Percent,
+	kText20Percent,
+	kText30Percent,
+	kText40Percent,
+	kText50Percent,
+	kText60Percent,
+	kText70Percent,
+	kText80Percent,
+	kText90Percent,
+	kTextMax
+};
 
 struct IMAGE_HEADER {
 	int width;
@@ -236,8 +282,8 @@
 struct GameResourceDescription {
 	uint32 scene_lut_rn;
 	uint32 script_lut_rn;
-	uint32 command_panel_rn;
-	uint32 dialogue_panel_rn;
+	uint32 mainPanelResourceId;
+	uint32 conversePanelResourceId;
 };
 
 struct GameFileDescription {
@@ -245,6 +291,18 @@
 	uint16 fileType;
 };
 
+struct PanelButton {
+	PanelButtonType type;
+	int xOffset;
+	int yOffset;
+	int width;
+	int height;
+	int id;
+	int keyChar;
+	int upSpriteNumber;
+	int downSpriteNumber;
+};
+
 struct GameDisplayInfo {
 	int logicalWidth;
 	int logicalHeight;
@@ -263,10 +321,10 @@
 	int verbTextShadowColor;
 	int verbTextActiveColor;
 
-	int leftPortraitX;
-	int leftPortraitY;
-	int rightPortraitX;
-	int rightPortraitY;
+	int leftPortraitXOffset;
+	int leftPortraitYOffset;
+	int rightPortraitXOffset;
+	int rightPortraitYOffset;
 
 	int inventoryX;
 	int inventoryY;
@@ -274,12 +332,15 @@
 	int inventoryColumns;
 	int inventoryIconWidth;
 	int inventoryIconHeight;
-	int inventoryIconX;
-	int inventoryIconY;
+	int inventoryIconXOffset;
+	int inventoryIconYOffset;
 	int inventoryXSpacing;
 	int inventoryYSpacing;
+	int mainPanelButtonsCount;
+	PanelButton *mainPanelButtons;
 };
 
+
 struct GameDescription {
 	const char *name;
 	SAGAGameType gameType;
@@ -433,6 +494,8 @@
 	int getDisplayHeight() const { return _gameDisplayInfo.logicalHeight;}
 	int getSceneHeight() const { return _gameDisplayInfo.sceneHeight; }
 	const GameDisplayInfo & getDisplayInfo() { return _gameDisplayInfo; }
+	
+	const char *getTextString(int textStringId);
 private:
 	int loadLanguage(void);
 	int loadGame(int gameNumber);

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- script.cpp	9 Jan 2005 23:41:22 -0000	1.45
+++ script.cpp	13 Jan 2005 22:42:49 -0000	1.46
@@ -613,6 +613,31 @@
 }
 
 void Script::setLeftButtonVerb(int verb) {
+	int		oldVerb = _currentVerb;
+
+	_currentVerb = _leftButtonVerb = verb;
+
+	if ((_currentVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
+			if (oldVerb > kVerbNone)
+				_vm->_interface->drawVerb(oldVerb, 2);
+
+			if (_currentVerb > kVerbNone)
+				_vm->_interface->drawVerb(_currentVerb, 2);
+	}
+}
+
+void Script::setRightButtonVerb(int verb) {
+	int		oldVerb = _currentVerb;
+
+	_rightButtonVerb = verb;
+
+	if ((_rightButtonVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
+		if (oldVerb > kVerbNone)
+			_vm->_interface->drawVerb(oldVerb, 2);
+
+		if (_rightButtonVerb > kVerbNone)
+			_vm->_interface->drawVerb(_rightButtonVerb, 2);
+	}
 }
 
 void Script::doVerb() {

Index: script.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.h,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- script.h	8 Jan 2005 21:06:06 -0000	1.50
+++ script.h	13 Jan 2005 22:42:49 -0000	1.51
@@ -54,10 +54,10 @@
 enum VerbTypes {
 //todo: LUT for drawing
 	kVerbNone = 0,
-	kVerbPickup = 1,
+	kVerbPickUp = 1,
 	kVerbLookAt = 2,
 	kVerbWalkTo = 3,
-	kVerbSpeakTo = 4,
+	kVerbTalkTo = 4,
 	kVerbOpen = 5,
 	kVerbClose = 6,
 	kVerbGive = 7,
@@ -67,7 +67,9 @@
 	kVerbLeave = 11,
 	kVerbBegin = 12,
 	kVerbWalkOnly = 13,
-	kVerbLookOnly = 14
+	kVerbLookOnly = 14,
+
+	kVerbTypesMax = kVerbLookOnly + 1
 };
 
 #define STHREAD_TIMESLICE 8
@@ -250,6 +252,10 @@
 	void showVerb();
 	void setVerb(int verb);
 	void setLeftButtonVerb(int verb);
+	void setRightButtonVerb(int verb);
+	int getCurrentVerb() const { return _currentVerb; }
+	int getLeftButtonVerb() const { return _leftButtonVerb; }
+	int getRightButtonVerb() const { return _rightButtonVerb; }
 
 	void scriptInfo();
 	void scriptExec(int argc, const char **argv);





More information about the Scummvm-git-logs mailing list