aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/bladerunner/actor.cpp38
-rw-r--r--engines/bladerunner/actor.h4
-rw-r--r--engines/bladerunner/actor_clues.cpp4
-rw-r--r--engines/bladerunner/actor_clues.h2
4 files changed, 43 insertions, 5 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index 998791d88a..538037f461 100644
--- a/engines/bladerunner/actor.cpp
+++ b/engines/bladerunner/actor.cpp
@@ -96,6 +96,8 @@ void Actor::setup(int actorId) {
_retiredHeight = 0;
_scale = 1.0f;
+ _timer4RemainDefault = 60000;
+
_movementTrackWalkingToWaypointId = -1;
_movementTrackDelayOnNextWaypoint = -1;
@@ -119,9 +121,6 @@ void Actor::setup(int actorId) {
_movementTrackNextAngle = -1;
_movementTrackNextRunning = false;
- // Timer for exchanging clues
- _timersLeft[4] = 60000;
-
_animationMode = -1;
_screenRectangle = Common::Rect(-1, -1, -1, -1);
@@ -225,6 +224,8 @@ void Actor::timerUpdate(int timerId) {
break;
case 4:
// Exchange clues between actors
+ acquireCluesByRelations();
+ _timersLeft[4] = _timer4RemainDefault;
break;
case 5:
// Actor animation frame timer
@@ -885,6 +886,21 @@ void Actor::setFriendlinessToOther(int otherActorId, int friendliness) {
_friendlinessToOther[otherActorId] = friendliness;
}
+bool Actor::checkFriendlinessAndHonesty(int otherActorId) {
+ int honestyDiff = 2 * _friendlinessToOther[otherActorId] - _honesty;
+ int friendlinessRange;
+
+ if (honestyDiff > 30) {
+ friendlinessRange = 100;
+ } else if (honestyDiff >= 0 && honestyDiff <= 30) {
+ friendlinessRange = 50;
+ } else {
+ friendlinessRange = 0;
+ }
+
+ return _vm->_rnd.getRandomNumberRng(1, 100) <= friendlinessRange;
+}
+
void Actor::setHonesty(int honesty) {
_honesty = honesty;
}
@@ -1119,6 +1135,18 @@ void Actor::copyClues(int actorId) {
}
}
+void Actor::acquireCluesByRelations() {
+ if (_setId >= 0 && _setId != kSetFreeSlotG && _setId != _vm->_actors[0]->_setId) {
+ for (int i = 0; i < _vm->_gameInfo->getActorCount(); i++) {
+ if (i != _id && _vm->_actors[i]->_setId == _setId && i && _id
+ && checkFriendlinessAndHonesty(i)
+ && _vm->_actors[0]->checkFriendlinessAndHonesty(_id)) {
+ _clues->acquireCluesByRelations(_id, i);
+ }
+ }
+ }
+}
+
int Actor::soundVolume() const {
float dist = distanceFromView(_vm->_view);
return 35.0f * CLIP(1.0f - (dist / 1200.0f), 0.0f, 1.0f);
@@ -1227,7 +1255,7 @@ void Actor::save(SaveFileWriteStream &f) {
f.writeVector3(_position);
f.writeInt(_facing);
f.writeInt(_targetFacing);
- f.writeInt(0); // TODO: _timer4RemainDefault
+ f.writeInt(_timer4RemainDefault);
f.writeInt(_honesty);
f.writeInt(_intelligence);
@@ -1303,7 +1331,7 @@ void Actor::load(SaveFileReadStream &f) {
_position = f.readVector3();
_facing = f.readInt();
_targetFacing = f.readInt();
- f.skip(4); // TODO: _timer4RemainDefault
+ _timer4RemainDefault = f.readInt();
_honesty = f.readInt();
_intelligence = f.readInt();
diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h
index 7498d2bf51..6540c0593a 100644
--- a/engines/bladerunner/actor.h
+++ b/engines/bladerunner/actor.h
@@ -70,6 +70,8 @@ private:
int _targetFacing;
int _walkboxId;
+ int _timer4RemainDefault;
+
// Flags
bool _isTarget;
bool _isInvisible;
@@ -200,6 +202,7 @@ public:
int getFriendlinessToOther(int otherActorId) const { return _friendlinessToOther[otherActorId]; }
void setFriendlinessToOther(int otherActorId, int friendliness);
void modifyFriendlinessToOther(int otherActorId, signed int change);
+ bool checkFriendlinessAndHonesty(int otherActorId);
int getHonesty() const { return _honesty; }
void setHonesty(int honesty);
@@ -243,6 +246,7 @@ public:
void loseClue(int clueId);
bool hasClue(int clueId) const;
void copyClues(int actorId);
+ void acquireCluesByRelations();
int soundVolume() const;
int soundBalance() const;
diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
index 0c25ffc19f..3665f4de09 100644
--- a/engines/bladerunner/actor_clues.cpp
+++ b/engines/bladerunner/actor_clues.cpp
@@ -88,6 +88,10 @@ bool ActorClues::isAcquired(int clueId) const {
#endif
}
+void ActorClues::acquireCluesByRelations(int actorId, int otherActorId) {
+ warning("TODO: acquireCluesByRelations");
+}
+
int ActorClues::getFromActorId(int clueId) const {
int clueIndex = findClueIndex(clueId);
if (clueIndex == -1) {
diff --git a/engines/bladerunner/actor_clues.h b/engines/bladerunner/actor_clues.h
index 79181cc20c..8bf9011937 100644
--- a/engines/bladerunner/actor_clues.h
+++ b/engines/bladerunner/actor_clues.h
@@ -60,6 +60,8 @@ public:
void lose(int clueId);
bool isAcquired(int clueId) const;
+ void acquireCluesByRelations(int actorId, int otherActorId);
+
int getFromActorId(int clueId) const;
bool isFlag2(int clueId) const;