From add934e0aa72bb5b7a836945bad27b48dfb73204 Mon Sep 17 00:00:00 2001 From: coiax Date: Fri, 8 Jul 2016 01:48:29 +0100 Subject: [PATCH] "vines", "plants" faction gives immunity to kuzdu (#18540) * "vines", "plants" faction gives immunity to kuzdu Adding "vines" and "plants" to podpeople's factions only makes them immune to the snare of the venus human trap. Now added some checks to spacevine.dm which checks for vine immunity, and a check in mob/living.dm (apparently). Podpeople (and venus human traps) are now no longer damaged, poisoned or obstructed by space vines. Explosive vines still damage them, because there's an actual explosion. * Some grammar fixes for venus human traps * Fixes compile error * Pod people are now vine immune, completely --- code/game/turfs/simulated/floor.dm | 7 +- code/modules/events/spacevine.dm | 70 +++++++++++++------ code/modules/mob/living/carbon/human/human.dm | 2 + .../mob/living/carbon/human/species_types.dm | 11 ++- code/modules/mob/living/living.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 19 +++-- 6 files changed, 79 insertions(+), 34 deletions(-) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 535b943a060..1fb959a7fc6 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -48,7 +48,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if(builtin_tile) qdel(builtin_tile) builtin_tile = null - return ..() + . = ..() /turf/open/floor/ex_act(severity, target) var/shielded = is_shielded() @@ -58,8 +58,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if(target == src) src.ChangeTurf(src.baseturf) if(target != null) - ex_act(3) - return + severity = 3 switch(severity) if(1) @@ -186,4 +185,4 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," /turf/open/floor/initialize() ..() - MakeDirty() \ No newline at end of file + MakeDirty() diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index d6bf374fd6f..624feef72f2 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -109,23 +109,36 @@ /turf/open/floor/vines/ChangeTurf(turf/open/floor/T) for(var/obj/effect/spacevine/SV in src) qdel(SV) - ..() + . = ..() UpdateAffectingLights() +/datum/spacevine_mutation/space_covering + var/static/list/coverable_turfs + +/datum/spacevine_mutation/space_covering/New() + . = ..() + if(!coverable_turfs) + coverable_turfs = typecacheof(list( + /turf/open/space + )) + coverable_turfs -= typecacheof(list( + /turf/open/space/transit + )) + /datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder) - if(istype(holder.loc, /turf/open/space)) - var/turf/open/spaceturf = holder.loc - spaceturf.ChangeTurf(/turf/open/floor/vines) + process_mutation(holder) /datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder) - if(istype(holder.loc, /turf/open/space)) - var/turf/open/spaceturf = holder.loc - spaceturf.ChangeTurf(/turf/open/floor/vines) + var/turf/T = get_turf(holder) + if(is_type_in_typecache(T, coverable_turfs)) + var/currtype = T.type + T.ChangeTurf(/turf/open/floor/vines) + T.baseturf = currtype /datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder) - if(istype(holder.loc, /turf/open/floor/vines)) - var/turf/open/spaceturf = holder.loc - spaceturf.ChangeTurf(/turf/open/space) + var/turf/T = get_turf(holder) + if(istype(T, /turf/open/floor/vines)) + T.ChangeTurf(T.baseturf) /datum/spacevine_mutation/bluespace name = "bluespace" @@ -155,12 +168,13 @@ /datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser) if(issilicon(crosser)) return - if(prob(severity) && istype(crosser)) + if(prob(severity) && istype(crosser) && !isvineimmune(crosser)) crosser << "You accidently touch the vine and feel a strange sensation." crosser.adjustToxLoss(5) /datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater) - eater.adjustToxLoss(5) + if(!isvineimmune(eater)) + eater.adjustToxLoss(5) /datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!! name = "explosive" @@ -173,8 +187,7 @@ qdel(src) else . = 1 - spawn(5) - qdel(src) + QDEL_IN(src, 5) /datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I) explosion(holder.loc, 0, 0, severity, 0, 0) @@ -210,10 +223,10 @@ quality = NEGATIVE /datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target) - target.ex_act(severity, src) + target.ex_act(severity, src) // vine immunity handled at /mob/ex_act /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled) - buckled.ex_act(severity) + buckled.ex_act(severity, src) /datum/spacevine_mutation/transparency name = "transparent" @@ -291,13 +304,13 @@ quality = NEGATIVE /datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser) - if(prob(severity) && istype(crosser)) + if(prob(severity) && istype(crosser) && !isvineimmune(holder)) var/mob/living/M = crosser M.adjustBruteLoss(5) M << "You cut yourself on the thorny vines." /datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(prob(severity) && istype(hitter)) + if(prob(severity) && istype(hitter) && !isvineimmune(holder)) var/mob/living/M = hitter M.adjustBruteLoss(5) M << "You cut yourself on the thorny vines." @@ -497,7 +510,7 @@ /obj/effect/spacevine_controller/process() if(!vines) - qdel(src) //space vines exterminated. Remove the controller + qdel(src) //space vines exterminated. Remove the controller return if(!growth_queue) qdel(src) //Sanity check @@ -509,7 +522,7 @@ var/i = 0 var/list/obj/effect/spacevine/queue_end = list() - for( var/obj/effect/spacevine/SV in growth_queue ) + for(var/obj/effect/spacevine/SV in growth_queue) if(qdeleted(SV)) continue i++ @@ -546,12 +559,12 @@ if(!has_buckled_mobs() && prob(25)) for(var/mob/living/V in src.loc) entangle(V) - if(buckled_mobs.len) + if(buckled_mobs && buckled_mobs.len) break //only capture one mob at a time /obj/effect/spacevine/proc/entangle(mob/living/V) - if(!V) + if(!V || isvineimmune(V)) return for(var/datum/spacevine_mutation/SM in mutations) SM.on_buckle(src, V) @@ -585,3 +598,16 @@ override += SM.process_temperature(src, temp, volume) if(!override) qdel(src) + +/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0) + if(isvineimmune(mover)) + . = TRUE + else + . = ..() + +/proc/isvineimmune(atom/A) + . = FALSE + if(isliving(A)) + var/mob/living/M = A + if(("vines" in M.faction) || ("plants" in M.faction)) + . = TRUE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a8068b92f49..f11a76d0fc9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -120,6 +120,8 @@ var/b_loss = null var/f_loss = null var/bomb_armor = getarmor(null, "bomb") + if(istype(ex_target, /datum/spacevine_mutation) && isvineimmune(src)) + return switch (severity) if (1) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ac36d4c28cc..d19b8589db8 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -104,6 +104,15 @@ heatmod = 1.5 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant +/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + C.faction |= "plants" + C.faction |= "vines" + +/datum/species/pod/on_species_loss(mob/living/carbon/C) + . = ..() + C.faction -= "plants" + C.faction -= "vines" /datum/species/pod/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD) @@ -146,8 +155,6 @@ H.show_message("The radiation beam singes you!") if(/obj/item/projectile/energy/florayield) H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) - return - /* SHADOWPEOPLE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f6a9200c49b..dc93198a8a1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -225,7 +225,9 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/InCritical() return (src.health < 0 && src.health > -95 && stat == UNCONSCIOUS) -/mob/living/ex_act(severity, target) +/mob/living/ex_act(severity, origin) + if(istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) + return ..() flash_eyes() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bce40f6b5a2..53187f4e7ec 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -423,16 +423,25 @@ /mob/living/simple_animal/ex_act(severity, target) ..() + var/bomb_armor = getarmor(null, "bomb") switch (severity) if (1) - gib() - return - + if(prob(bomb_armor)) + adjustBruteLoss(500) + else + gib() + return if (2) - adjustBruteLoss(60) + var/bloss = 60 + if(prob(bomb_armor)) + bloss = bloss / 1.5 + adjustBruteLoss(bloss) if(3) - adjustBruteLoss(30) + var/bloss = 30 + if(prob(bomb_armor)) + bloss = bloss / 1.5 + adjustBruteLoss(bloss) /mob/living/simple_animal/proc/CanAttack(atom/the_target) if(see_invisible < the_target.invisibility)