aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/bladerunner/actor_clues.cpp86
-rw-r--r--engines/bladerunner/actor_clues.h15
2 files changed, 95 insertions, 6 deletions
diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
index 16b9002765..028832b6d1 100644
--- a/engines/bladerunner/actor_clues.cpp
+++ b/engines/bladerunner/actor_clues.cpp
@@ -97,8 +97,92 @@ int ActorClues::getWeight(int clueId) const {
return _clues[clueIndex].weight;
}
+int ActorClues::getModifier(int actorId, int otherActorId, int clueId) {
+ warning("STUB: getModifier(%d, %d, %d)", actorId, otherActorId, clueId);
+
+ return 0;
+}
+
+static int cluesCompare(const void *p1, const void *p2) {
+ const ActorClues::CluesUS *clue1 = (const ActorClues::CluesUS *)p1;
+ const ActorClues::CluesUS *clue2 = (const ActorClues::CluesUS *)p2;
+
+ if (clue1->modifier > clue2->modifier)
+ return -1;
+
+ return (clue1->modifier < clue2->modifier);
+}
+
void ActorClues::acquireCluesByRelations(int actorId, int otherActorId) {
- warning("TODO: acquireCluesByRelations");
+ CluesUS clues1[kClueCount], clues2[kClueCount];
+
+ int count1 = findAcquirableCluesFromActor(actorId, otherActorId, clues1, kClueCount);
+ int count2 = findAcquirableCluesFromActor(otherActorId, actorId, clues2, kClueCount);
+
+ if (count1 || count2) {
+ for (int i = 0; i < count1; i++) {
+ clues1[i].modifier = getModifier(actorId, otherActorId, clues1[i].clueId);
+ }
+ qsort(clues1, count1, sizeof(CluesUS), cluesCompare);
+
+ for (int i = 0; i < count2; i++) {
+ clues2[i].modifier = getModifier(otherActorId, actorId, clues2[i].clueId);
+ }
+ qsort(clues2, count2, sizeof(CluesUS), cluesCompare);
+
+ Actor *actor = _vm->_actors[actorId];
+ Actor *otherActor = _vm->_actors[otherActorId];
+
+ int avgParameters = (otherActor->getHonesty() + otherActor->getIntelligence() + actor->getFriendlinessToOther(otherActorId)) / 3;
+ int clue1count = avgParameters * count1 / 100;
+
+ if (avgParameters >= 50 && !clue1count && count1 == 1) {
+ clue1count = 1;
+ }
+
+ avgParameters = (actor->getHonesty() + actor->getIntelligence() + otherActor->getFriendlinessToOther(actorId)) / 3;
+ int clue2count = avgParameters * count2 / 100;
+
+ if (avgParameters >= 50 && !clue2count && count2 == 1) {
+ clue2count = 1;
+ }
+
+ for (int i = 0; i < clue2count; i++) {
+ bool flag = false;
+ if (otherActor->_clues->isFlag2(clues2[i].clueId)) {
+ avgParameters = (2 * otherActor->getFriendlinessToOther(actorId) + otherActor->getHonesty()) / 3;
+
+ if (avgParameters > 70) {
+ avgParameters = 100;
+ } else if (avgParameters < 30) {
+ avgParameters = 0;
+ }
+ if (_vm->_rnd.getRandomNumberRng(1, 100) <= avgParameters) {
+ flag = true;
+ }
+ }
+
+ actor->_clues->acquire(clues2[i].clueId, flag, otherActorId);
+ }
+
+ for (int i = 0; i < clue1count; i++) {
+ bool flag = false;
+ if (actor->_clues->isFlag2(clues1[i].clueId)) {
+ avgParameters = (2 * actor->getFriendlinessToOther(otherActorId) + actor->getHonesty()) / 3;
+
+ if (avgParameters > 70) {
+ avgParameters = 100;
+ } else if (avgParameters < 30) {
+ avgParameters = 0;
+ }
+ if (_vm->_rnd.getRandomNumberRng(1, 100) <= avgParameters) {
+ flag = true;
+ }
+ }
+
+ otherActor->_clues->acquire(clues1[i].clueId, flag, actorId);
+ }
+ }
}
int ActorClues::findAcquirableCluesFromActor(int actorId, int targetActorId, CluesUS *list, int size) {
diff --git a/engines/bladerunner/actor_clues.h b/engines/bladerunner/actor_clues.h
index aa8693f71b..76690329d3 100644
--- a/engines/bladerunner/actor_clues.h
+++ b/engines/bladerunner/actor_clues.h
@@ -32,6 +32,8 @@ class SaveFileReadStream;
class SaveFileWriteStream;
class ActorClues {
+ static const int kClueCount = 288;
+
struct Clue {
int clueId;
int weight;
@@ -45,11 +47,6 @@ class ActorClues {
byte flags;
};
- struct CluesUS {
- int clueId;
- int modifier;
- };
-
BladeRunnerEngine *_vm;
int _count;
@@ -57,6 +54,12 @@ class ActorClues {
Common::Array<Clue> _clues;
public:
+ struct CluesUS {
+ int clueId;
+ int modifier;
+ };
+
+public:
ActorClues(BladeRunnerEngine *_vm, int cluesType);
void add(int actorId, int clueId, int unknown, bool acquired, bool unknownFlag, int fromActorId);
@@ -66,6 +69,8 @@ public:
bool isAcquired(int clueId) const;
int getWeight(int clueId) const;
+ int getModifier(int actorId, int otherActorId, int clueId);
+
void acquireCluesByRelations(int actorId, int otherActorId);
int findAcquirableCluesFromActor(int actorId, int targetActorId, CluesUS *list, int size);