diff options
| author | Scott Percival | 2020-01-09 19:23:43 +0800 | 
|---|---|---|
| committer | Scott Percival | 2020-01-09 19:23:43 +0800 | 
| commit | f26aff27088c0100cb61b906e808e3b9aa0d8210 (patch) | |
| tree | 8f759cb71410ab6a3cc0a91a1eb6bc9e80f3c21c | |
| parent | fe9b3fea556ad03941049f61c6c2232cb09a420b (diff) | |
| download | scummvm-rg350-f26aff27088c0100cb61b906e808e3b9aa0d8210.tar.gz scummvm-rg350-f26aff27088c0100cb61b906e808e3b9aa0d8210.tar.bz2 scummvm-rg350-f26aff27088c0100cb61b906e808e3b9aa0d8210.zip | |
DIRECTOR: LINGO: Allow cb_v4theentitypush and cb_v4theentityassign to cast to INT
| -rw-r--r-- | engines/director/lingo/lingo-bytecode.cpp | 170 | ||||
| -rw-r--r-- | engines/director/lingo/lingo.cpp | 6 | 
2 files changed, 87 insertions, 89 deletions
| diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp index da5da4481d..5a71233c01 100644 --- a/engines/director/lingo/lingo-bytecode.cpp +++ b/engines/director/lingo/lingo-bytecode.cpp @@ -85,7 +85,7 @@ static LingoV4Bytecode lingoV4[] = {  };  static LingoV4TheEntity lingoV4TheEntity[] = { -	{ 0x00, 0x00, kTheFloatPrecision, kTheNOField, false, kTEANOArgs }, +	{ 0x00, 0x00, kTheFloatPrecision, kTheNOField, true, kTEANOArgs },  	{ 0x00, 0x01, kTheMouseDownScript, kTheNOField, true, kTEANOArgs },  	{ 0x00, 0x02, kTheMouseUpScript, kTheNOField, true, kTEANOArgs },  	{ 0x00, 0x03, kTheKeyDownScript, kTheNOField, true, kTEANOArgs }, @@ -252,56 +252,52 @@ void LC::cb_v4theentitypush() {  	int bank = g_lingo->readInt();  	Datum firstArg = g_lingo->pop(); +	firstArg.toInt();  	Datum result;  	result.u.s = NULL;  	result.type = VOID; -	if (firstArg.type == INT) { -		int key = (bank << 8) + firstArg.u.i; -		if (g_lingo->_lingoV4TheEntity.contains(key)) { -			debugC(3, kDebugLingoExec, "cb_v4theentitypush: mapping 0x%02x, 0x%02x", bank, firstArg.u.i); -			int entity = g_lingo->_lingoV4TheEntity[key]->entity; -			int field = g_lingo->_lingoV4TheEntity[key]->field; -			switch (g_lingo->_lingoV4TheEntity[key]->type) { -			case kTEANOArgs: -				{ -					Datum id; -					id.u.s = NULL; -					id.type = VOID; -					debugC(3, kDebugLingoExec, "cb_v4theentitypush: calling getTheEntity(0x%02x, NULL, 0x%02x)", entity, field); -					result = g_lingo->getTheEntity(entity, id, field); -				} -				break; -			case kTEAItemId: -				{ -					Datum id = g_lingo->pop(); -					debugC(3, kDebugLingoExec, "cb_v4theentitypush: calling getTheEntity(0x%02x, id, 0x%02x)", entity, field); -					result = g_lingo->getTheEntity(entity, id, field); -				} -				break; -			case kTEAString: -				{ -					/*Datum stringArg = */g_lingo->pop(); -					warning("cb_v4theentitypush: STUB: kTEAString"); -				} -				break; -			case kTEAMenuIdItemId: -				{ -					/*Datum menuId = */g_lingo->pop(); -					/*Datum itemId = */g_lingo->pop(); -					warning("cb_v4theentitypush: STUB: kTEAMenuIdItemId"); -				} -				break; -			default: -				warning("cb_v4theentitypush: unknown call type %d", g_lingo->_lingoV4TheEntity[key]->type); -				break; +	int key = (bank << 8) + firstArg.u.i; +	if (g_lingo->_lingoV4TheEntity.contains(key)) { +		debugC(3, kDebugLingoExec, "cb_v4theentitypush: mapping 0x%02x, 0x%02x", bank, firstArg.u.i); +		int entity = g_lingo->_lingoV4TheEntity[key]->entity; +		int field = g_lingo->_lingoV4TheEntity[key]->field; +		switch (g_lingo->_lingoV4TheEntity[key]->type) { +		case kTEANOArgs: +			{ +				Datum id; +				id.u.s = NULL; +				id.type = VOID; +				debugC(3, kDebugLingoExec, "cb_v4theentitypush: calling getTheEntity(0x%02x, NULL, 0x%02x)", entity, field); +				result = g_lingo->getTheEntity(entity, id, field);  			} -		} else { -			warning("cb_v4theentitypush: unhandled mapping 0x%02x 0x%02x", bank, firstArg.u.i); +			break; +		case kTEAItemId: +			{ +				Datum id = g_lingo->pop(); +				debugC(3, kDebugLingoExec, "cb_v4theentitypush: calling getTheEntity(0x%02x, id, 0x%02x)", entity, field); +				result = g_lingo->getTheEntity(entity, id, field); +			} +			break; +		case kTEAString: +			{ +				/*Datum stringArg = */g_lingo->pop(); +				warning("cb_v4theentitypush: STUB: kTEAString"); +			} +			break; +		case kTEAMenuIdItemId: +			{ +				/*Datum menuId = */g_lingo->pop(); +				/*Datum itemId = */g_lingo->pop(); +				warning("cb_v4theentitypush: STUB: kTEAMenuIdItemId"); +			} +			break; +		default: +			warning("cb_v4theentitypush: unknown call type %d", g_lingo->_lingoV4TheEntity[key]->type); +			break;  		} -  	} else { -		warning("cb_v4theentitypush: first arg should be of type INT, not %s", firstArg.type2str()); +		warning("cb_v4theentitypush: unhandled mapping 0x%02x 0x%02x", bank, firstArg.u.i);  	}  	g_lingo->push(result); @@ -342,61 +338,57 @@ void LC::cb_v4theentityassign() {  	int bank = g_lingo->readInt();  	Datum firstArg = g_lingo->pop(); +	firstArg.toInt();  	Datum value = g_lingo->pop();  	Datum result;  	result.u.s = NULL;  	result.type = VOID; -	if (firstArg.type == INT) { -		int key = (bank << 8) + firstArg.u.i; -		if (g_lingo->_lingoV4TheEntity.contains(key)) { -			debugC(3, kDebugLingoExec, "cb_v4theentityassign: mapping 0x%02x, 0x%02x", bank, firstArg.u.i); -			if (g_lingo->_lingoV4TheEntity[key]->writable) { -				int entity = g_lingo->_lingoV4TheEntity[key]->entity; -				int field = g_lingo->_lingoV4TheEntity[key]->field; -				switch (g_lingo->_lingoV4TheEntity[key]->type) { -				case kTEANOArgs: -					{ -						Datum id; -						id.u.s = NULL; -						id.type = VOID; -						debugC(3, kDebugLingoExec, "cb_v4theentityassign: calling setTheEntity(0x%02x, NULL, 0x%02x, value)", entity, field); -						g_lingo->setTheEntity(entity, id, field, value); -					} -					break; -				case kTEAItemId: -					{ -						Datum id = g_lingo->pop(); -						debugC(3, kDebugLingoExec, "cb_v4theentityassign: calling setTheEntity(0x%02x, id, 0x%02x, value)", entity, field); -						g_lingo->setTheEntity(entity, id, field, value); -					} -					break; -				case kTEAString: -					{ -						/*Datum stringArg = */g_lingo->pop(); -						warning("cb_v4theentityassign: STUB: kTEAString"); -					} -					break; -				case kTEAMenuIdItemId: -					{ -						/*Datum menuId = */g_lingo->pop(); -						/*Datum itemId = */g_lingo->pop(); -						warning("cb_v4theentityassign: STUB: kTEAMenuIdItemId"); -					} -					break; -				default: -					warning("cb_v4theentityassign: unknown call type %d", g_lingo->_lingoV4TheEntity[key]->type); -					break; +	int key = (bank << 8) + firstArg.u.i; +	if (g_lingo->_lingoV4TheEntity.contains(key)) { +		debugC(3, kDebugLingoExec, "cb_v4theentityassign: mapping 0x%02x, 0x%02x", bank, firstArg.u.i); +		if (g_lingo->_lingoV4TheEntity[key]->writable) { +			int entity = g_lingo->_lingoV4TheEntity[key]->entity; +			int field = g_lingo->_lingoV4TheEntity[key]->field; +			switch (g_lingo->_lingoV4TheEntity[key]->type) { +			case kTEANOArgs: +				{ +					Datum id; +					id.u.s = NULL; +					id.type = VOID; +					debugC(3, kDebugLingoExec, "cb_v4theentityassign: calling setTheEntity(0x%02x, NULL, 0x%02x, value)", entity, field); +					g_lingo->setTheEntity(entity, id, field, value);  				} -			} else { -				warning("cb_v4theentityassign: non-writable mapping 0x%02x 0x%02x", bank, firstArg.u.i); +				break; +			case kTEAItemId: +				{ +					Datum id = g_lingo->pop(); +					debugC(3, kDebugLingoExec, "cb_v4theentityassign: calling setTheEntity(0x%02x, id, 0x%02x, value)", entity, field); +					g_lingo->setTheEntity(entity, id, field, value); +				} +				break; +			case kTEAString: +				{ +					/*Datum stringArg = */g_lingo->pop(); +					warning("cb_v4theentityassign: STUB: kTEAString"); +				} +				break; +			case kTEAMenuIdItemId: +				{ +					/*Datum menuId = */g_lingo->pop(); +					/*Datum itemId = */g_lingo->pop(); +					warning("cb_v4theentityassign: STUB: kTEAMenuIdItemId"); +				} +				break; +			default: +				warning("cb_v4theentityassign: unknown call type %d", g_lingo->_lingoV4TheEntity[key]->type); +				break;  			}  		} else { -			warning("cb_v4theentityassign: unhandled mapping 0x%02x 0x%02x", bank, firstArg.u.i); +			warning("cb_v4theentityassign: non-writable mapping 0x%02x 0x%02x", bank, firstArg.u.i);  		} -  	} else { -		warning("cb_v4theentityassign: first arg should be of type INT, not %s", firstArg.type2str()); +		warning("cb_v4theentityassign: unhandled mapping 0x%02x 0x%02x", bank, firstArg.u.i);  	}  } diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index 36a0c6368d..8935614242 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -305,6 +305,9 @@ int Datum::toInt() {  	case STRING:  		u.i = atoi(u.s->c_str());  		break; +	case VOID: +		u.i = 0; +		break;  	case INT:  		// no-op  		break; @@ -328,6 +331,9 @@ double Datum::toFloat() {  	case STRING:  		u.f = atof(u.s->c_str());  		break; +	case VOID: +		u.f = 0.0; +		break;  	case INT:  		u.f = (double)u.i;  		break; | 
