From c58223606bce9368f6622ba352ab879748fdd66d Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Fri, 9 Aug 2013 18:11:43 +0100
Subject: [PATCH] [Change] faction_modPlayer() now affects allies and enemies.
 [Remove] Alliance references.

---
 src/faction.c | 64 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 47 insertions(+), 17 deletions(-)

diff --git a/src/faction.c b/src/faction.c
index cb8fa83..f3b0412 100644
--- a/src/faction.c
+++ b/src/faction.c
@@ -5,6 +5,7 @@
 #include "log.h"
 #include "pack.h"
 #include "xml.h"
+#include "rng.h"
 #include "faction.h"
 
 #define XML_FACTION_ID    "Factions" /* XML section id. */
@@ -34,6 +35,7 @@ static int faction_nstack = 0;
 
 /* Static. */
 static int faction_isFaction(int f);
+static void faction_sanitizePlayer(Faction* faction);
 static Faction* faction_parse(xmlNodePtr parent);
 static void faction_parseSocial(xmlNodePtr parent);
 /* Extern. */
@@ -66,27 +68,54 @@ char* faction_longname(int f) {
   return faction_stack[f].name;
 }
 
+/* Sanitize player faction standing. */
+static void faction_sanitizePlayer(Faction* faction) {
+  if(faction->player > 100)
+    faction->player = 100;
+  else if(faction->player < -100)
+    faction->player = -100;
+}
+
 /* Modify the player's standing with a faction. */
 void faction_modPlayer(int f, int mod) {
-  if(faction_isFaction(f)) {
-    faction_stack[f].player += mod;
+  int i;
+  Faction* faction, *ally, *enemy;
+
+  if(faction_isFaction(f)) {
+    faction = &faction_stack[f];
+
+    /* Faction in question gets direct increment. */
+    faction->player += mod;
+    faction_sanitizePlayer(faction);
+
+    /* Now mod allies to a lesser degree. */
+    for(i = 0; i < faction->nallies; i++) {
+      ally = &faction_stack[faction->allies[i]];
+
+      ally->player += RNG(0, mod/2);
+      faction_sanitizePlayer(ally);
+    }
+
+    /* Now mod enemies. */
+    for(i = 0; i < faction->nenemies; i++) {
+      enemy = &faction_stack[faction->enemies[i]];
+
+      enemy->player -= RNG(0, mod/2);
+      faction_sanitizePlayer(enemy);
+    }
 
-    /* Sanitize. */
-    if(faction_stack[f].player > 100)
-      faction_stack[f].player = 100;
-    else if(faction_stack[f].player < -100)
-      faction_stack[f].player = -100;
   } else {
-    DEBUG("%d is an invalid faction/alliance", f);
+    DEBUG("%d is an invalid faction.", f);
     return;
   }
 }
 
+/* Get the player's standing with a faction. */
 int faction_getPlayer(int f) {
   if(faction_isFaction(f)) {
     return faction_stack[f].player;
   } else {
-    DEBUG("%d is an invalid faction/alliance", f);
+    DEBUG("%d is an invalid faction.", f);
     return -1000;
   }
 }
@@ -133,7 +162,7 @@ int areEnemies(int a, int b) {
         return 1;
       else return 0;
     } else {
-      DEBUG("areEnemies: %d is an invalid faction/alliance", b);
+      DEBUG("areEnemies: %d is an invalid faction.", b);
       return 0;
     }
   }
@@ -143,7 +172,7 @@ int areEnemies(int a, int b) {
         return 1;
       else return 0;
     } else {
-      DEBUG("areEnemies: %d is an invalid faction/alliance", a);
+      DEBUG("areEnemies: %d is an invalid faction.", a);
       return 0;
     }
   }
@@ -152,7 +181,7 @@ int areEnemies(int a, int b) {
   if(faction_isFaction(a)) fa = &faction_stack[a];
   else {
     /* a isn't valid. */
-    DEBUG("areEnemies: %d is an invalid faction/alliance", a);
+    DEBUG("areEnemies: %d is an invalid faction.", a);
     return 0;
   }
 
@@ -160,7 +189,7 @@ int areEnemies(int a, int b) {
   if(faction_isFaction(b)) fb = &faction_stack[b];
   else {
     /* b isn't valid. */
-    DEBUG("areEnemies: %d is an invalid faction/alliance", b);
+    DEBUG("areEnemies: %d is an invalid faction.", b);
     return 0;
   }
 
@@ -187,7 +216,7 @@ int areAllies(int a, int b) {
       if(faction_stack[b].player > PLAYER_ALLY) return 1;
       else return 0;
     } else {
-      DEBUG("%d is an invalid faction/alliance", b);
+      DEBUG("%d is an invalid faction.", b);
       return 0;
     }
   }
@@ -196,7 +225,7 @@ int areAllies(int a, int b) {
       if(faction_stack[a].player > PLAYER_ALLY) return 1;
       else return 0;
     } else {
-      DEBUG("%d is an invalid faction/alliance", a);
+      DEBUG("%d is an invalid faction.", a);
       return 0;
     }
   }
@@ -209,7 +238,7 @@ int areAllies(int a, int b) {
   if(faction_isFaction(a)) fa = &faction_stack[a];
   else {
     /* b isn't valid. */
-    DEBUG("%d is an invalid faction/alliance", a);
+    DEBUG("%d is an invalid faction.", a);
     return 0;
   }
 
@@ -217,7 +246,7 @@ int areAllies(int a, int b) {
   if(faction_isFaction(b)) fb = &faction_stack[b];
   else {
     /* b isn't valid. */
-    DEBUG("%d is an invalid faction/alliance", b);
+    DEBUG("%d is an invalid faction.", b);
     return 0;
   }
 
@@ -271,6 +300,7 @@ static Faction* faction_parse(xmlNodePtr parent) {
   return tmp;
 }
 
+/* Parse the social tidbits: Allies and enemies. */
 static void faction_parseSocial(xmlNodePtr parent) {
   xmlNodePtr node, cur;
   char* buf;