[Scummvm-cvs-logs] CVS: scummvm/scumm intern.h,2.528,2.529 script_c64.cpp,2.24,2.25 scumm.cpp,1.591,1.592 verbs.cpp,1.142,1.143

kirben kirben at users.sourceforge.net
Sun Oct 2 14:42:02 CEST 2005


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

Modified Files:
	intern.h script_c64.cpp scumm.cpp verbs.cpp 
Log Message:

Basic verb display for C64 maniac.


Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.528
retrieving revision 2.529
diff -u -d -r2.528 -r2.529
--- intern.h	24 Sep 2005 14:28:00 -0000	2.528
+++ intern.h	2 Oct 2005 13:21:49 -0000	2.529
@@ -395,9 +395,13 @@
 
 	const OpcodeEntryC64 *_opcodesC64;
 
+	int _currentAction;
+	int _currentMode;
 public:
 	ScummEngine_c64(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex);
 
+	virtual void scummInit();
+
 protected:
 	virtual void setupRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);
 
@@ -408,7 +412,7 @@
 	virtual void setupScummVars();
 	virtual void decodeParseString();
 
-	virtual void redrawVerbs();
+	void initC64Verbs();
 	virtual void checkExecVerbs();
 
 	virtual int getVarOrDirectWord(byte mask);
@@ -433,6 +437,7 @@
 	void o_lockActor();
 	void o_loadActor();
 	void o_loadRoom();
+	void o_loadRoomWithEgo();
 	void o_lockScript();
 	void o_loadScript();
 	void o_lockRoom();

Index: script_c64.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_c64.cpp,v
retrieving revision 2.24
retrieving revision 2.25
diff -u -d -r2.24 -r2.25
--- script_c64.cpp	24 Sep 2005 14:28:00 -0000	2.24
+++ script_c64.cpp	2 Oct 2005 13:21:49 -0000	2.25
@@ -322,7 +322,7 @@
 		OPCODE(o_stopCurrentScript),
 		/* E4 */
 		OPCODE(o_unknown3),
-		OPCODE(o2_loadRoomWithEgo),
+		OPCODE(o_loadRoomWithEgo),
 		OPCODE(o_stopCurrentScript),
 		OPCODE(o5_getActorFacing),
 		/* E8 */
@@ -533,6 +533,37 @@
 	ensureResourceLoaded(rtRoom, resid);
 }
 
+void ScummEngine_c64::o_loadRoomWithEgo() {
+	Actor *a;
+	int obj, room, x, y, dir;
+
+	obj = fetchScriptByte();
+	room = fetchScriptByte();
+
+	a = derefActor(VAR(VAR_EGO), "o_loadRoomWithEgo");
+
+	a->putActor(0, 0, room);
+	_egoPositioned = false;
+
+	startScene(a->_room, a, obj);
+
+	getObjectXYPos(obj, x, y, dir);
+	a->putActor(x, y, _currentRoom);
+	a->setDirection(dir + 180);
+
+	camera._dest.x = camera._cur.x = a->_pos.x;
+	setCameraAt(a->_pos.x, a->_pos.y);
+	setCameraFollows(a);
+
+	_fullRedraw = true;
+
+	resetSentence();
+
+	if (x >= 0 && y >= 0) {
+		a->startWalkActor(x, y, -1);
+	}
+}
+
 void ScummEngine_c64::o_lockRoom() {
 	int resid = fetchScriptByte();
 	res.lock(rtRoom, resid);
@@ -547,17 +578,25 @@
 
 void ScummEngine_c64::o_cursorCommand() {
 	// TODO
+	int state = 0;
 
-	byte state = fetchScriptByte();
-	debug(0, "o_cursorCommand(%d)", state);
-
-	if (state >= 1) {
-		_userPut = 1;
-		_cursor.state = 1;
-	} else {
-		_userPut = 0;
-		_cursor.state = 0;
+	_currentMode = fetchScriptByte();
+	switch (_currentMode) {
+	case 0:
+		state = 15;
+		break;
+	case 1:
+		state = 31;
+		break;
+	case 2:
+		break;
+	case 3:
+		state = 247;
+		break;
 	}
+
+	setUserState(state);
+	debug(0, "o_cursorCommand(%d)", _currentMode);
 }
 
 void ScummEngine_c64::o_lights() {
@@ -624,32 +663,27 @@
 }
 
 void ScummEngine_c64::o_setActorBitVar() {
-	byte var = fetchScriptByte();
-	byte a = getVarOrDirectByte(PARAM_1);
-
-	int bit_var = var + a;
-	int bit_offset = bit_var & 0x0f;
-	bit_var >>= 4;
+	byte flag = getVarOrDirectByte(PARAM_1);
+	byte mask = getVarOrDirectByte(PARAM_2);
+	byte mod = getVarOrDirectByte(PARAM_3);
 
-	//if (getVarOrDirectByte(PARAM_2))
-	//	_scummVars[bit_var] |= (1 << bit_offset);
+	//if (mod)
+	//	_miscFlags[flag] |= mask;
 	//else
-	//	_scummVars[bit_var] &= ~(1 << bit_offset);
-	warning("STUB: o_setActorBitVar(%d, %d, %d)", a, bit_var, bit_offset);
+	//	_miscFlags[flag] &= ~mash;
+
+	warning("STUB: o_setActorBitVar(%d, %d, %d)", flag, mask, mod);
 }
 
 void ScummEngine_c64::o_getActorBitVar() {
 	getResultPos();
-	byte var = fetchScriptByte();
-	byte a = getVarOrDirectByte(PARAM_1);
+	byte flag = getVarOrDirectByte(PARAM_1);
+	byte mask = getVarOrDirectByte(PARAM_2);
 
-	int bit_var = var + a;
-	int bit_offset = bit_var & 0x0f;
-	bit_var >>= 4;
+	//setResult((_miscFlags[flag] & mask) ? 1 : 0);
 
-	//setResult((_scummVars[bit_var] & (1 << bit_offset)) ? 1 : 0);
 	setResult(0);
-	warning("STUB: o_getActorBitVar(%d, %d, %d)", a, bit_var, bit_offset);
+	warning("STUB: o_getActorBitVar(%d, %d)", flag, mask);
 }
 
 void ScummEngine_c64::o_print_c64() {

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.591
retrieving revision 1.592
diff -u -d -r1.591 -r1.592
--- scumm.cpp	1 Oct 2005 21:13:38 -0000	1.591
+++ scumm.cpp	2 Oct 2005 13:21:49 -0000	1.592
@@ -1426,6 +1426,9 @@
 
 ScummEngine_c64::ScummEngine_c64(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex)
 	: ScummEngine_v2(detector, syst, gs, md5sum, substResFileNameIndex) {
+
+	_currentAction = 0;
+	_currentMode = 0;
 }
 
 ScummEngine_v6::ScummEngine_v6(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex)
@@ -1924,6 +1927,11 @@
 	_lastSaveTime = _system->getMillis();
 }
 
+void ScummEngine_c64::scummInit() {
+	ScummEngine::scummInit();
+	initC64Verbs();
+}
+
 void ScummEngine_v2::scummInit() {
 	ScummEngine::scummInit();
 

Index: verbs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/verbs.cpp,v
retrieving revision 1.142
retrieving revision 1.143
diff -u -d -r1.142 -r1.143
--- verbs.cpp	24 Sep 2005 10:15:17 -0000	1.142
+++ verbs.cpp	2 Oct 2005 13:21:49 -0000	1.143
@@ -37,6 +37,58 @@
 	kSentenceLine = 6
 };
 
+struct VerbSettings {
+	int id;
+	int x_pos;
+	int y_pos;
+	const char *name;
+};
+
+static const VerbSettings C64VerbTable[] =
+{
+	{ 1,  8, 0, "Open"},
+	{ 2,  8, 1, "Close"},
+	{ 3,  0, 2, "Give"},
+	{ 4, 32, 0, "Turn On"},
+	{ 5, 32, 1, "Turn Off"},
+	{ 6, 32, 2, "Fix"},
+	{ 7, 24, 0, "New Kid"},
+	{ 8, 24, 1, "Unlock"},
+	{ 9,  0, 0, "Push"},
+	{10,  0, 1, "Pull"},
+	{11, 24, 2, "Use"},
+	{12,  8, 2, "Read"},
+	{13, 15, 0, "Walk To"},
+	{14, 15, 1, "Pick Up"},
+	{15, 15, 2, "What Is"}
+};
+
+void ScummEngine_c64::initC64Verbs() {
+	VirtScreen *virt = &virtscr[kVerbVirtScreen];
+	VerbSlot *vs;
+	int i;
+
+	for (i = 1; i < 16; i++) {
+		vs = &_verbs[i];
+		vs->verbid = C64VerbTable[i - 1].id;
+		vs->color = 5;
+		vs->hicolor = 7;
+		vs->dimcolor = 11;
+		vs->type = kTextVerbType;
+		vs->charset_nr = _string[0]._default.charset;
+		vs->curmode = 1;
+		vs->saveid = 0;
+		vs->key = 0;
+		vs->center = 0;
+		vs->imgindex = 0;
+
+		vs->curRect.left = C64VerbTable[i - 1].x_pos * 8;
+		vs->curRect.top = C64VerbTable[i - 1].y_pos * 8 + virt->topline + 8;
+
+		loadPtrToResource(rtVerb, i, (const byte*)C64VerbTable[i - 1].name);
+	}
+}
+
 void ScummEngine_v2::initV2MouseOver() {
 	int i;
 	int arrow_color, color, hi_color;
@@ -351,10 +403,6 @@
 	_verbMouseOver = verb;
 }
 
-void ScummEngine_c64::redrawVerbs() {
-	// TODO
-}
-
 void ScummEngine::handleMouseOver(bool updateInventory) {
 	if (_completeScreenRedraw) {
 		verbMouseOver(0);
@@ -445,21 +493,45 @@
 }
 
 void ScummEngine_c64::checkExecVerbs() {
+	Actor *a;
+	VirtScreen *zone = findVirtScreen(_mouse.y);
+
 	if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
 		return;
 
-	if (_platform == Common::kPlatformC64 && _gameId == GID_MANIAC) {
+	if (zone->number == kVerbVirtScreen && _mouse.y <= zone->topline + 8) {
 		// TODO
+	} else if (_version <= 2 && zone->number == kVerbVirtScreen && _mouse.y > zone->topline + 32) {
+		// Click into V2 inventory
+		checkV2Inventory(_mouse.x, _mouse.y);
+	} else {
+		int over = findVerbAtPos(_mouse.x, _mouse.y);
+		if (over) {
+			_currentAction = _verbs[over].verbid;
+			return;
+		}
+
+		// HACK: Reset value
+		VAR(VAR_EGO) = 3;
 
 		int object = findObject(_mouse.x, _mouse.y);
 		if (object) {
 			_activeObject = object;
-			runObjectScript(object, 15, false, false, NULL);
+			if (_currentMode == 3) {
+				int x, y, dir;
+				a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
+				getObjectXYPos(object, x, y, dir);
+				a->startWalkActor(x, y, dir);
+			}
+
+			int tmp = (_currentMode == 3) ? _currentAction : 15;
+			runObjectScript(object, tmp, false, false, NULL);
 		} else {
-			Actor *a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
-			int y = _mouse.y;
-			int x = _mouse.x;
-			a->startWalkActor(x, y, -1);
+			_activeObject = 0;
+			if (zone->number == kMainVirtScreen) {
+				a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
+				a->startWalkActor(_mouse.x, _mouse.y, -1);
+			}
 		}
 	}
 }





More information about the Scummvm-git-logs mailing list