[Scummvm-git-logs] scummvm master -> d8e7fa3a6351495efdfce1d55f32300c6de2f549
neuromancer
noreply at scummvm.org
Fri Oct 11 13:31:58 UTC 2024
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
7b09ad622c FREESCAPE: added missing instruction
1be5b6f030 FREESCAPE: reset groups after the game state is restored
8e44ee53a3 FREESCAPE: tweaks in runCollisionConditions
4892a80ede FREESCAPE: use correct variable number for castle shield
d8e7fa3a63 FREESCAPE: added missing entrance in castle for dos
Commit: 7b09ad622c6c89cb75af7d5ccc676e73821ec91a
https://github.com/scummvm/scummvm/commit/7b09ad622c6c89cb75af7d5ccc676e73821ec91a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-11T15:33:20+02:00
Commit Message:
FREESCAPE: added missing instruction
Changed paths:
engines/freescape/freescape.h
engines/freescape/language/8bitDetokeniser.cpp
engines/freescape/language/instruction.cpp
engines/freescape/language/instruction.h
engines/freescape/language/token.h
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 9b4692a19f5..1621dfc7430 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -394,6 +394,7 @@ public:
// Instructions
bool checkConditional(FCLInstruction &instruction, bool shot, bool collided, bool timer, bool activated);
bool checkIfGreaterOrEqual(FCLInstruction &instruction);
+ bool checkIfLessOrEqual(FCLInstruction &instruction);
void executeExecute(FCLInstruction &instruction);
void executeIncrementVariable(FCLInstruction &instruction);
void executeDecrementVariable(FCLInstruction &instruction);
diff --git a/engines/freescape/language/8bitDetokeniser.cpp b/engines/freescape/language/8bitDetokeniser.cpp
index 3112b7f5939..78fe3f858f3 100644
--- a/engines/freescape/language/8bitDetokeniser.cpp
+++ b/engines/freescape/language/8bitDetokeniser.cpp
@@ -434,7 +434,7 @@ Common::String detokenise8bitCondition(Common::Array<uint16> &tokenisedCondition
case 47:
detokenisedStream += "IFLTE (v";
- currentInstruction = FCLInstruction(Token::IFGTEQ);
+ currentInstruction = FCLInstruction(Token::IFLTEQ);
break;
case 48:
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 32f98462d13..1899d503a78 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -213,6 +213,13 @@ bool FreescapeEngine::executeCode(FCLInstructionVector &code, bool shot, bool co
skipDepth = conditionalDepth - 1;
break;
+ case Token::IFLTEQ:
+ skip = !checkIfLessOrEqual(instruction);
+ if (skip)
+ skipDepth = conditionalDepth - 1;
+ break;
+
+
case Token::ELSE:
skip = !skip;
if (skip)
@@ -467,6 +474,13 @@ bool FreescapeEngine::checkIfGreaterOrEqual(FCLInstruction &instruction) {
return (_gameStateVars[variable] >= value);
}
+bool FreescapeEngine::checkIfLessOrEqual(FCLInstruction &instruction) {
+ uint16 variable = instruction._source;
+ uint16 value = instruction._destination;
+ debugC(1, kFreescapeDebugCode, "Check if variable %d is less than equal to %d!", variable, value);
+ return (_gameStateVars[variable] <= value);
+}
+
bool FreescapeEngine::executeEndIfNotEqual(FCLInstruction &instruction) {
uint16 variable = instruction._source;
diff --git a/engines/freescape/language/instruction.h b/engines/freescape/language/instruction.h
index eb8ee9bd231..c7f6835cba4 100644
--- a/engines/freescape/language/instruction.h
+++ b/engines/freescape/language/instruction.h
@@ -46,7 +46,7 @@ public:
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::IFGTEQ || type == Token::Type::IFLTEQ || \
type == Token::Type::VAREQ || _type == Token::Type::INVISQ;
}
diff --git a/engines/freescape/language/token.h b/engines/freescape/language/token.h
index 4a1f63f6c87..942802dd346 100644
--- a/engines/freescape/language/token.h
+++ b/engines/freescape/language/token.h
@@ -79,7 +79,7 @@ public:
UPDATEI,
VAREQ,
IFGTEQ,
- IFGLEQ,
+ IFLTEQ,
VISQ,
VIS,
WAIT,
Commit: 1be5b6f0304309b55d26fd421df63cd6d3019235
https://github.com/scummvm/scummvm/commit/1be5b6f0304309b55d26fd421df63cd6d3019235
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-11T15:33:20+02:00
Commit Message:
FREESCAPE: reset groups after the game state is restored
Changed paths:
engines/freescape/area.cpp
engines/freescape/area.h
engines/freescape/games/castle/castle.cpp
engines/freescape/movement.cpp
engines/freescape/objects/group.cpp
diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index 49c0e8a9fd5..eb82798d292 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -192,8 +192,20 @@ void Area::unremapColor(int index) {
_colorRemaps.clear(index);
}
+void Area::resetAreaGroups() {
+ debugC(1, kFreescapeDebugMove, "Resetting groups from area: %s", _name.c_str());
+ if (_objectsByID) {
+ for (auto &it : *_objectsByID) {
+ Object *obj = it._value;
+
+ if (obj->getType() == ObjectType::kGroupType)
+ ((Group *)obj)->reset();
+ }
+ }
+}
+
void Area::resetArea() {
- debugC(1, kFreescapeDebugMove, "Resetting area name: %s", _name.c_str());
+ debugC(1, kFreescapeDebugMove, "Resetting objects from area: %s", _name.c_str());
_colorRemaps.clear();
if (_objectsByID) {
for (auto &it : *_objectsByID) {
diff --git a/engines/freescape/area.h b/engines/freescape/area.h
index 0c128aa6805..b1148f76db8 100644
--- a/engines/freescape/area.h
+++ b/engines/freescape/area.h
@@ -67,6 +67,7 @@ public:
void addStructure(Area *global);
void removeObject(int16 id);
void resetArea();
+ void resetAreaGroups();
bool isOutside();
bool hasActiveGroups();
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 1c722eb32f0..2fb449d48cc 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -1224,6 +1224,10 @@ Common::Error CastleEngine::loadGameStreamExtended(Common::SeekableReadStream *s
if (_useRockTravel) // Enable cheat
setGameBit(k8bitGameBitTravelRock);
+
+ for (auto &it : _areaMap) {
+ it._value->resetAreaGroups();
+ }
return Common::kNoError;
}
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 506e5ca327c..b6f60198953 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -447,7 +447,9 @@ bool FreescapeEngine::runCollisionConditions(Math::Vector3d const lastPosition,
Math::Vector3d direction = newPosition - lastPosition;
direction.normalize();
int rayLenght = 45;
- if (_currentArea->getScale() >= 5)
+ if (_currentArea->getScale() == 16)
+ rayLenght = 200;
+ else if (_currentArea->getScale() >= 5)
rayLenght = MAX(5, 45 / (2 * _currentArea->getScale()));
for (int i = 0; i <= 2; i++) {
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 3533ce0771e..b94670ed65c 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -158,7 +158,7 @@ void Group::run() {
}
void Group::reset() {
- /*uint32 groupSize = _objects.size();
+ uint32 groupSize = _objects.size();
for (uint32 i = 0; i < groupSize ; i++) {
GeometricObject *gobj = (GeometricObject *)_objects[i];
if (GeometricObject::isPolygon(_objects[i]->getType())) {
@@ -166,7 +166,7 @@ void Group::reset() {
gobj->restoreOrdinates();
//gobj->makeInvisible();
}
- }*/
+ }
}
void Group::draw(Renderer *gfx, float offset) {
Commit: 8e44ee53a39cf7f7c6427f29eadc6daa8bd1ee06
https://github.com/scummvm/scummvm/commit/8e44ee53a39cf7f7c6427f29eadc6daa8bd1ee06
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-11T15:33:20+02:00
Commit Message:
FREESCAPE: tweaks in runCollisionConditions
Changed paths:
engines/freescape/movement.cpp
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index b6f60198953..cee3c57e2c7 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -448,11 +448,11 @@ bool FreescapeEngine::runCollisionConditions(Math::Vector3d const lastPosition,
direction.normalize();
int rayLenght = 45;
if (_currentArea->getScale() == 16)
- rayLenght = 200;
+ rayLenght = 20;
else if (_currentArea->getScale() >= 5)
rayLenght = MAX(5, 45 / (2 * _currentArea->getScale()));
- for (int i = 0; i <= 2; i++) {
+ for (int i = 0; i <= 4; i++) {
Math::Vector3d rayPosition = lastPosition;
rayPosition.y() = rayPosition.y() - _playerHeight * (i / 4.0);
ray = Math::Ray(rayPosition, direction);
@@ -461,7 +461,7 @@ bool FreescapeEngine::runCollisionConditions(Math::Vector3d const lastPosition,
gobj = (GeometricObject *)collided;
debugC(1, kFreescapeDebugMove, "Collided with object id %d of size %f %f %f", gobj->getObjectID(), gobj->getSize().x(), gobj->getSize().y(), gobj->getSize().z());
executed |= executeObjectConditions(gobj, false, true, false);
- break;
+ //break;
}
}
Commit: 4892a80edeedc2b54db36c17495f551aca839b2f
https://github.com/scummvm/scummvm/commit/4892a80edeedc2b54db36c17495f551aca839b2f
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-11T15:33:20+02:00
Commit Message:
FREESCAPE: use correct variable number for castle shield
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/language/8bitDetokeniser.cpp
engines/freescape/language/8bitDetokeniser.h
engines/freescape/language/instruction.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 397ddd2089a..bd209dcdb3f 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -212,6 +212,9 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
ConfMan.setInt("gamepad_controller_directional_input", 1 /* kDirectionalInputDpad */, gameDomain);
#endif
+ if (isCastle())
+ k8bitVariableShield = 29;
+
g_freescape = this;
}
diff --git a/engines/freescape/language/8bitDetokeniser.cpp b/engines/freescape/language/8bitDetokeniser.cpp
index 78fe3f858f3..19f512d48c7 100644
--- a/engines/freescape/language/8bitDetokeniser.cpp
+++ b/engines/freescape/language/8bitDetokeniser.cpp
@@ -29,7 +29,7 @@
namespace Freescape {
-uint8 k8bitMaxVariable = 64;
+uint8 k8bitVariableShield = 63;
Common::String detokenise8bitCondition(Common::Array<uint16> &tokenisedCondition, FCLInstructionVector &instructions, bool isAmigaAtari) {
Common::String detokenisedStream;
diff --git a/engines/freescape/language/8bitDetokeniser.h b/engines/freescape/language/8bitDetokeniser.h
index 0b758760635..f69e6527ac9 100644
--- a/engines/freescape/language/8bitDetokeniser.h
+++ b/engines/freescape/language/8bitDetokeniser.h
@@ -28,13 +28,13 @@ namespace Freescape {
enum {
k8bitGameBitTravelRock = 30,
- k8bitVariableShield = 63,
k8bitVariableEnergy = 62,
k8bitVariableScore = 61,
k8bitVariableShieldDrillerTank = 60,
k8bitVariableEnergyDrillerTank = 59,
k8bitVariableShieldDrillerJet = 58,
- k8bitVariableEnergyDrillerJet = 57
+ k8bitVariableEnergyDrillerJet = 57,
+ k8bitMaxVariable = 64
};
enum {
@@ -44,7 +44,7 @@ enum {
kConditionalActivated = 1 << 3,
};
-extern uint8 k8bitMaxVariable;
+extern uint8 k8bitVariableShield;
Common::String detokenise8bitCondition(Common::Array<uint16> &tokenisedCondition, FCLInstructionVector &instructions, bool enableActivated);
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 1899d503a78..3eb37de8076 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -493,18 +493,15 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
int32 variable = instruction._source;
int32 increment = instruction._destination;
_gameStateVars[variable] = _gameStateVars[variable] + increment;
- switch (variable) {
- case k8bitVariableScore:
+ if (variable == k8bitVariableScore) {
debugC(1, kFreescapeDebugCode, "Score incremented by %d up to %d", increment, _gameStateVars[variable]);
- break;
- case k8bitVariableEnergy:
+ } else if (variable == k8bitVariableEnergy) {
if (_gameStateVars[variable] > _maxEnergy)
_gameStateVars[variable] = _maxEnergy;
else if (_gameStateVars[variable] < 0)
_gameStateVars[variable] = 0;
debugC(1, kFreescapeDebugCode, "Energy incremented by %d up to %d", increment, _gameStateVars[variable]);
- break;
- case k8bitVariableShield:
+ } else if (variable == k8bitVariableShield) {
if (_gameStateVars[variable] > _maxShield)
_gameStateVars[variable] = _maxShield;
else if (_gameStateVars[variable] < 0)
@@ -514,10 +511,8 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
flashScreen(_renderMode == Common::kRenderCGA ? 1 :_currentArea->_underFireBackgroundColor);
debugC(1, kFreescapeDebugCode, "Shield incremented by %d up to %d", increment, _gameStateVars[variable]);
- break;
- default:
+ } else {
debugC(1, kFreescapeDebugCode, "Variable %d by %d incremented up to %d!", variable, increment, _gameStateVars[variable]);
- break;
}
}
Commit: d8e7fa3a6351495efdfce1d55f32300c6de2f549
https://github.com/scummvm/scummvm/commit/d8e7fa3a6351495efdfce1d55f32300c6de2f549
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-10-11T15:33:20+02:00
Commit Message:
FREESCAPE: added missing entrance in castle for dos
Changed paths:
engines/freescape/games/castle/castle.cpp
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 2fb449d48cc..fed27371786 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -677,6 +677,7 @@ void CastleEngine::loadAssets() {
it._value->addStructure(_areaMap[255]);
it._value->addObjectFromArea(229, _areaMap[255]);
it._value->addObjectFromArea(242, _areaMap[255]);
+ it._value->addObjectFromArea(139, _areaMap[255]);
}
_areaMap[1]->addFloor();
More information about the Scummvm-git-logs
mailing list