[Scummvm-git-logs] scummvm master -> d7a286303074e101540c01ba07b866d7c6eba0c1

neuromancer noreply at scummvm.org
Wed Oct 9 10:46:56 UTC 2024


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0c4cc3d871 FREESCAPE: more precise implementation of nested if/else/endif handling
6ae98fd3d6 FREESCAPE: adjusted interaction distance for castle
d7a2863030 FREESCAPE: avoid crash in dungeon level of castle


Commit: 0c4cc3d8711a5a2d84949cd4d997566276e32e32
    https://github.com/scummvm/scummvm/commit/0c4cc3d8711a5a2d84949cd4d997566276e32e32
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-09T12:48:24+02:00

Commit Message:
FREESCAPE: more precise implementation of nested if/else/endif handling

Changed paths:
    engines/freescape/freescape.h
    engines/freescape/language/instruction.cpp
    engines/freescape/language/instruction.h
    engines/freescape/objects/group.cpp


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 6fe681bf4c4..9b4692a19f5 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -107,6 +107,7 @@ enum {
 	kFreescapeDebugParser = 1 << 1,
 	kFreescapeDebugCode = 1 << 2,
 	kFreescapeDebugMedia = 1 << 4,
+	kFreescapeDebugGroup = 1 << 5,
 };
 
 enum GameStateControl {
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index dd533f987e7..86dfd9edba0 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -85,7 +85,7 @@ void FCLInstruction::setBranches(FCLInstructionVector *thenBranch, FCLInstructio
 	_elseInstructions = elseBranch;
 }
 
-Token::Type FCLInstruction::getType() {
+Token::Type FCLInstruction::getType() const {
 	return _type;
 }
 
@@ -146,15 +146,35 @@ void FreescapeEngine::executeLocalGlobalConditions(bool shot, bool collided, boo
 bool FreescapeEngine::executeCode(FCLInstructionVector &code, bool shot, bool collided, bool timer, bool activated) {
 	int ip = 0;
 	bool skip = false;
-	bool elseFound = false;
+	int skipDepth = 0;
+	int conditionalDepth = 0;
 	bool executed = false;
 	int codeSize = code.size();
 	assert(codeSize > 0);
 	while (ip <= codeSize - 1) {
 		FCLInstruction &instruction = code[ip];
-		debugC(1, kFreescapeDebugCode, "Executing ip: %d with type %d in code with size: %d", ip, instruction.getType(), codeSize);
+		debugC(1, kFreescapeDebugCode, "Executing ip: %d with type %d in code with size: %d. Skip flag is: %d", ip, instruction.getType(), codeSize, skip);
+
+		if (instruction.isConditional()) {
+			conditionalDepth++;
+			debugC(1, kFreescapeDebugCode, "Conditional depth increased to: %d", conditionalDepth);
+		} else if (instruction.getType() == Token::ENDIF) {
+			conditionalDepth--;
+			debugC(1, kFreescapeDebugCode, "Conditional depth decreased to: %d", conditionalDepth);
+		}
 
-		if (skip && instruction.getType() != Token::ELSE && instruction.getType() != Token::ENDIF) {
+		if (skip) {
+			if (instruction.getType() == Token::ELSE) {
+				debugC(1, kFreescapeDebugCode, "Else found, skip depth: %d, conditional depth: %d", skipDepth, conditionalDepth);
+				if (skipDepth == conditionalDepth - 1) {
+					skip = false;
+				}
+			} else if (instruction.getType() == Token::ENDIF) {
+				debugC(1, kFreescapeDebugCode, "Endif found, skip depth: %d, conditional depth: %d", skipDepth, conditionalDepth);
+				if (skipDepth == conditionalDepth) {
+					skip = false;
+				}
+			}
 			debugC(1, kFreescapeDebugCode, "Instruction skipped!");
 			ip++;
 			continue;
@@ -180,27 +200,27 @@ bool FreescapeEngine::executeCode(FCLInstructionVector &code, bool shot, bool co
 
 		case Token::VARNOTEQ:
 			if (executeEndIfNotEqual(instruction)) {
-				if (isCastle())
+				if (isCastle()) {
 					skip = true;
-				else
+					skipDepth = conditionalDepth - 1;
+				} else
 					ip = codeSize;
 			}
 			break;
 		case Token::IFGTEQ:
 			skip = !checkIfGreaterOrEqual(instruction);
+			if (skip)
+				skipDepth = conditionalDepth - 1;
 			break;
 
 		case Token::ELSE:
-			if (elseFound && skip)
-				break;
-
-			elseFound = true;
 			skip = !skip;
+			if (skip)
+				skipDepth = conditionalDepth - 1;
 			break;
 
 		case Token::ENDIF:
 			skip = false;
-			elseFound = false;
 			break;
 
 		case Token::SWAPJET:
@@ -269,17 +289,19 @@ bool FreescapeEngine::executeCode(FCLInstructionVector &code, bool shot, bool co
 			break;
 		case Token::BITNOTEQ:
 			if (executeEndIfBitNotEqual(instruction)) {
-				if (isCastle())
+				if (isCastle()) {
 					skip = true;
-				else
+					skipDepth = conditionalDepth - 1;
+				} else
 					ip = codeSize;
 			}
 			break;
 		case Token::INVISQ:
 			if (executeEndIfVisibilityIsEqual(instruction)) {
-				if (isCastle())
+				if (isCastle()) {
 					skip = true;
-				else
+					skipDepth = conditionalDepth - 1;
+				} else
 					ip = codeSize;
 			}
 			break;
diff --git a/engines/freescape/language/instruction.h b/engines/freescape/language/instruction.h
index e5e01ea2887..eb8ee9bd231 100644
--- a/engines/freescape/language/instruction.h
+++ b/engines/freescape/language/instruction.h
@@ -41,7 +41,15 @@ public:
 	void setAdditional(int32 additional);
 	void setDestination(int32 destination);
 
-	Token::Type getType();
+	Token::Type getType() const;
+
+	bool isConditional() const {
+		Token::Type type = getType();
+		return 	type == Token::Type::BITNOTEQ || type == Token::Type::VARNOTEQ || \
+				type == Token::Type::IFGTEQ || type == Token::Type::IFGLEQ || \
+				type == Token::Type::VAREQ || _type == Token::Type::INVISQ;
+	}
+
 	void setBranches(FCLInstructionVector *thenBranch, FCLInstructionVector *elseBranch);
 
 	FCLInstruction duplicate();
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 8467b02ceae..3533ce0771e 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -106,9 +106,9 @@ void Group::assemble(int index) {
 	offset = 32 * offset / _scale;*/
 	position = 32 * position / _scale;
 
-	debugC(1, kFreescapeDebugCode, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
+	debugC(1, kFreescapeDebugGroup, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
 	gobj->offsetOrigin(position + offset);
-	debugC(1, kFreescapeDebugCode, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
+	debugC(1, kFreescapeDebugGroup, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
 }
 
 void Group::run() {
@@ -116,14 +116,14 @@ void Group::run() {
 		return;
 
 	int opcode = _operations[_step]->opcode;
-	debugC(1, kFreescapeDebugCode, "Executing opcode 0x%x at step %d", opcode, _step);
+	debugC(1, kFreescapeDebugGroup, "Executing opcode 0x%x at step %d", opcode, _step);
 	if (opcode == 0x80 || opcode == 0xff) {
-		debugC(1, kFreescapeDebugCode, "Executing group rewind");
+		debugC(1, kFreescapeDebugGroup, "Executing group rewind");
 		_active = true;
 		_step = -1;
 		//reset();
 	} else if (opcode == 0x01) {
-		debugC(1, kFreescapeDebugCode, "Executing group condition %s", _operations[_step]->conditionSource.c_str());
+		debugC(1, kFreescapeDebugGroup, "Executing group condition %s", _operations[_step]->conditionSource.c_str());
 		g_freescape->executeCode(_operations[_step]->condition, false, true, false, false);
 	} else if (opcode == 0x10) {
 		uint32 groupSize = _objects.size();
@@ -132,7 +132,7 @@ void Group::run() {
 		_active = false;
 		_step++;
 	} else if (opcode == 0x0) {
-		debugC(1, kFreescapeDebugCode, "Executing group assemble");
+		debugC(1, kFreescapeDebugGroup, "Executing group assemble");
 		uint32 groupSize = _objects.size();
 		for (uint32 i = 0; i < groupSize ; i++)
 			assemble(i);
@@ -184,7 +184,7 @@ void Group::step() {
 	if (!_active)
 		return;
 
-	debugC(1, kFreescapeDebugCode, "Stepping group %d", _objectID);
+	debugC(1, kFreescapeDebugGroup, "Stepping group %d", _objectID);
 	if (_step < int(_operations.size() - 1))
 		_step++;
 	else {


Commit: 6ae98fd3d6e3fab8a1b473d117c26d520cd33e4d
    https://github.com/scummvm/scummvm/commit/6ae98fd3d6e3fab8a1b473d117c26d520cd33e4d
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-09T12:48:24+02:00

Commit Message:
FREESCAPE: adjusted interaction distance for castle

Changed paths:
    engines/freescape/movement.cpp


diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 16d724314ac..506e5ca327c 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -172,7 +172,7 @@ void FreescapeEngine::activate() {
 
 	Math::Vector3d direction = directionToVector(_pitch - yoffset, _yaw - xoffset, false);
 	Math::Ray ray(_position, direction);
-	Object *interacted = _currentArea->checkCollisionRay(ray, 8192);
+	Object *interacted = _currentArea->checkCollisionRay(ray, 1250.0 / _currentArea->getScale());
 	if (interacted) {
 		GeometricObject *gobj = (GeometricObject *)interacted;
 		debugC(1, kFreescapeDebugMove, "Interact with object %d with flags %x", gobj->getObjectID(), gobj->getObjectFlags());


Commit: d7a286303074e101540c01ba07b866d7c6eba0c1
    https://github.com/scummvm/scummvm/commit/d7a286303074e101540c01ba07b866d7c6eba0c1
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-09T12:48:24+02:00

Commit Message:
FREESCAPE: avoid crash in dungeon level of castle

Changed paths:
    engines/freescape/language/instruction.cpp


diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 86dfd9edba0..32f98462d13 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -496,7 +496,7 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
 		else if (_gameStateVars[variable] < 0)
 			_gameStateVars[variable] = 0;
 
-		if (increment < 0)
+		if (increment < 0 && !isCastle())
 			flashScreen(_renderMode == Common::kRenderCGA ? 1 :_currentArea->_underFireBackgroundColor);
 
 		debugC(1, kFreescapeDebugCode, "Shield incremented by %d up to %d", increment, _gameStateVars[variable]);




More information about the Scummvm-git-logs mailing list