From e4f6a24da33dbf7055f243f226fa1ae4e299c58a Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Thu, 24 Mar 2016 14:38:21 -0400 Subject: [PATCH] Guardians no longer damage other guardians that share a summoner. --- .../living/simple_animal/guardian/guardian.dm | 28 +++++++++++++++---- .../simple_animal/guardian/types/charger.dm | 2 ++ .../simple_animal/guardian/types/explosive.dm | 6 ++-- .../simple_animal/guardian/types/fire.dm | 4 +-- .../simple_animal/guardian/types/lightning.dm | 2 ++ 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index fd218fad8d0..dbd83697a80 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -60,11 +60,11 @@ var/global/list/parasites = list() //all currently existing/living guardians summoner.dust() ghostize() qdel(src) - else + /*else src << "Your summoner has died!" visible_message("The [src] dies along with its user!") ghostize() - qdel(src) + qdel(src)*/ snapback() /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range @@ -232,6 +232,22 @@ var/global/list/parasites = list() //all currently existing/living guardians src << "You deactivate your light." SetLuminosity(0) +////////parasite tracking/finding procs + +/mob/living/proc/hasparasites() //returns a list of guardians the mob is a summoner for + . = 0 //return nothing by default + var/list/guardians = list() + for(var/P in parasites) + var/mob/living/simple_animal/hostile/guardian/G = P + if(G.summoner == src) + guardians |= G + return guardians + +/mob/living/simple_animal/hostile/guardian/proc/hasmatchingsummoner(mob/living/simple_animal/hostile/guardian/G) //returns 1 if the summoner matches the target's summoner + if(istype(G) && G.summoner == summoner) + return 1 + else + return 0 ////////Creation @@ -249,12 +265,12 @@ var/global/list/parasites = list() //all currently existing/living guardians var/ling_failure = "The deck refuses to respond to a souless creature such as you." var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Protector", "Charger", "Assassin") var/random = TRUE + var/allowmultiple = 0 /obj/item/weapon/guardiancreator/attack_self(mob/living/user) - for(var/mob/living/simple_animal/hostile/guardian/G in living_mob_list) - if (G.summoner == user) - user << "You already have a [mob_name]!" - return + if(user.hasparasites() && !allowmultiple) + user << "You already have a [mob_name]!" + return if(user.mind && user.mind.changeling) user << "[ling_failure]" return diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 90a38b46b19..9c9846e8450 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -52,6 +52,8 @@ if(isliving(A) && A != summoner) var/mob/living/L = A var/blocked = 0 + if(hasmatchingsummoner(A)) //if the summoner matches don't hurt them + blocked = 1 if(ishuman(A)) var/mob/living/carbon/human/H = A if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 0dfb1de9657..b0a08836acd 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -18,6 +18,8 @@ PoolOrNew(/obj/effect/overlay/temp/guardian/phase/out, get_turf(M)) do_teleport(M, M, 10) for(var/mob/living/L in range(1, M)) + if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them + continue if(L != src && L != summoner) L.apply_damage(15, BRUTE) PoolOrNew(/obj/effect/overlay/temp/explosion, get_turf(M)) @@ -42,7 +44,7 @@ name = "bomb" desc = "You shouldn't be seeing this!" var/obj/stored_obj - var/mob/living/spawner + var/mob/living/simple_animal/hostile/guardian/spawner /obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) @@ -66,7 +68,7 @@ qdel(src) /obj/item/weapon/guardian_bomb/Bump(atom/A) - if(isliving(A)) + if(isliving(A) && !spawner.hasmatchingsummoner(A)) detonate(A) else ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index 62223bcd38d..3d988c86582 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -20,7 +20,7 @@ /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() if(..()) - if(ishuman(target)) + if(ishuman(target) && target != summoner) spawn(0) new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) @@ -39,6 +39,6 @@ /mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj) if(istype(AM, /mob/living/)) var/mob/living/M = AM - if(AM != summoner && M.fire_stacks < 7) + if(!hasmatchingsummoner(M) && M != summoner && M.fire_stacks < 7) M.fire_stacks = 7 M.IgniteMob() diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index 2c279e85054..73ebb6eccf8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -88,6 +88,8 @@ var/turf/T = turf for(var/mob/living/L in T) if(L.stat != DEAD && L != src && L != summoner) + if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them + continue if(successfulshocks > 4) if(iscarbon(L)) var/mob/living/carbon/C = L