From 71b68003f94a5c63472ef53199333c51caf91413 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Thu, 23 May 2013 16:17:53 +0100
Subject: [PATCH] [Change] Missions increase/lower faction standing. Fixed bug
 with factions.

---
 dat/missions/cargo.lua       | 15 +++++++++++++++
 dat/missions/emp_cargo00.lua |  1 +
 dat/missions/emp_scout00.lua |  1 +
 dat/missions/es_cargo.lua    |  5 +++++
 src/faction.c                | 11 +++++++++++
 src/faction.h                |  1 +
 src/misn_lua.c               | 30 ++++++++++++++++++++++++++++++
 src/weapon.c                 |  3 ++-
 8 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua
index a76d7c5..7840c6b 100644
--- a/dat/missions/cargo.lua
+++ b/dat/missions/cargo.lua
@@ -47,13 +47,16 @@ function create()
   i = rnd.int(6)
   if i < 4 then -- Cargo delivery.
     misn_type = "Cargo"
+    misn.faction = rnd.int(2)
     i = rnd.int(3)
     misn.setTitle(string.format(title[i+1], planet))
   elseif i < 6 then-- Rush delivery.
     misn_type = "Rush"
+    misn.faction = rnd.int(5)
     misn.setTitle(string.format(title[11], planet))
   else -- People delivery :P
     misn_type = "People"
+    misn.faction = rnd.int(1)
     carg_mass = 0
     i = rnd.int(5)
     if i < 2 then
@@ -132,6 +135,18 @@ function land()
     if player.rmCargo(carg_id) then
       player.pay( reward )
       tk.msg(finish_title, string.format( finish_msg, carg_type))
+
+      -- Modify the faction standing.
+      if player.getFaction("Merchant") < 70 then
+        player.modFaction("Merchant", misn_faction)
+      end
+      if player.getFaction("Independent") < 30 then
+        player.modFaction("Independent", misn_faction/2)
+      end
+      if player.getFaction("Empire") < 10 then
+        player.modFaction("Empire", misn_faction/3)
+      end
+
       misn.finish(true)
     else
       tk.msg(miss_title, string.format( miss_msg, carg_mass, carg_type))
diff --git a/dat/missions/emp_cargo00.lua b/dat/missions/emp_cargo00.lua
index 226acd1..c889b24 100644
--- a/dat/missions/emp_cargo00.lua
+++ b/dat/missions/emp_cargo00.lua
@@ -49,6 +49,7 @@ function land()
       -- More flavour text.
       tk.msg(title[3], string.format(text[4], dest))
       var.push("es_cargo", true)
+      player.modFaction("Empire", 3)
       misn.finish(true)
     end
   end
diff --git a/dat/missions/emp_scout00.lua b/dat/missions/emp_scout00.lua
index 07d55e1..37e0035 100644
--- a/dat/missions/emp_scout00.lua
+++ b/dat/missions/emp_scout00.lua
@@ -73,6 +73,7 @@ function land()
 
   if misn_stage == 1 and  planet == misn_base then
     tk.msg(title[3], string.format(text[3],misn_target))
+    player.modFaction("Empire", 5)
     misn.finish(true)
   end
 end
diff --git a/dat/missions/es_cargo.lua b/dat/missions/es_cargo.lua
index 3154d58..07b5952 100644
--- a/dat/missions/es_cargo.lua
+++ b/dat/missions/es_cargo.lua
@@ -99,6 +99,11 @@ function land()
         var.push("es_misn", 1)
       end
 
+      -- Increase faction.
+      if player.getFaction("Empire") < 50 then
+        player.modFaction("Empire", rnd.int(5))
+      end
+
       misn.finish(true)
     else
       tk.msg(miss_title, string.format( miss_msg, carg_mass, carg_type))
diff --git a/src/faction.c b/src/faction.c
index c7bcaba..060f1ec 100644
--- a/src/faction.c
+++ b/src/faction.c
@@ -103,6 +103,17 @@ void faction_modPlayer(int f, int mod) {
   }
 }
 
+int faction_getPlayer(int f) {
+  if(faction_isFaction(f)) {
+    if(faction_isFaction(f)) {
+      return faction_stack[f].player;
+    }
+  } else {
+    DEBUG("%d is an invalid faction/alliance", f);
+    return -1000;
+  }
+}
+
 // Return 1 if Faction a and b are enemies.
 int areEnemies(int a, int b) {
   Faction* fa, *fb;
diff --git a/src/faction.h b/src/faction.h
index dc5b695..0a6f817 100644
--- a/src/faction.h
+++ b/src/faction.h
@@ -9,6 +9,7 @@ char* faction_name(int f);
 
 // Player stuff.
 void faction_modPlayer(int f, int mod);
+int faction_getPlayer(int f);
 
 // Works with only factions.
 int areEnemies(int a, int b);
diff --git a/src/misn_lua.c b/src/misn_lua.c
index 503625e..4add485 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -128,6 +128,8 @@ static int player_addCargo(lua_State* L);
 static int player_rmCargo(lua_State* L);
 static int player_pay(lua_State* L);
 static int player_msg(lua_State* L);
+static int player_modFaction(lua_State* L);
+static int player_getFaction(lua_State* L);
 static const luaL_reg player_methods[] = {
   { "name",         player_getname    },
   { "ship",         player_shipname   },
@@ -136,6 +138,8 @@ static const luaL_reg player_methods[] = {
   { "rmCargo",      player_rmCargo    },
   { "pay",          player_pay        },
   { "msg",          player_msg        },
+  { "modFaction",   player_modFaction },
+  { "getFaction",   player_getFaction },
   { 0, 0 }
 };
 
@@ -768,6 +772,32 @@ static int player_msg(lua_State* L) {
   return 0;
 }
 
+static int player_modFaction(lua_State* L) {
+  MIN_ARGS(2);
+  int f, mod;
+
+  if(lua_isstring(L, -2)) f = faction_get(lua_tostring(L, -2));
+  else MISN_INVALID_PARAMETER();
+
+  if(lua_isnumber(L, -1)) mod = (int)lua_tonumber(L, -1);
+  else MISN_INVALID_PARAMETER();
+
+  faction_modPlayer(f, mod);
+
+  return 0;
+}
+
+static int player_getFaction(lua_State* L) {
+  MIN_ARGS(1);
+  int f;
+
+  if(lua_isstring(L, -1)) f = faction_get(lua_tostring(L, -1));
+  else MISN_INVALID_PARAMETER();
+  lua_pushnumber(L, faction_getPlayer(f));
+
+  return 1;
+}
+
 // -- RND. --
 static int rnd_int(lua_State* L) {
   int o;
diff --git a/src/weapon.c b/src/weapon.c
index ca2b07c..b2a7c28 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -322,7 +322,8 @@ static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer) {
   // Someone should let the ai know it's been attacked.
   if(!pilot_isPlayer(p)) {
     if((player_target == p->id) || (RNG(0,2) == 0)) {
-      if(pilot_isFlag(p, PILOT_HOSTILE) || (RNG(0, 2) == 0))
+      if((w->parent == PLAYER_ID) &&
+          (!pilot_isFlag(p, PILOT_HOSTILE) || (RNG(0, 2) == 0)))
         faction_modPlayer(p->faction, -1); // Slowly lower faction.
       ai_attacked(p, w->parent);
     }