[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