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;