From dc22e8fed387ba93ca042cccc68b3601e440b70f Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 4 Jun 2015 12:13:29 +0200 Subject: [PATCH] Giant spider nurses now have a chance of injecting their victims with spider eggs. Spider nurses now have poison_per_bite chance (currently 10%) to inject a random non-robotic external limb with spider eggs. These eggs will eventually hatch a number of spiderlings that will slowly grow inside their host, causing minor tox damage over time. If the organ is removed from the host, the host dies, or the spiderling has matured sufficiently it will crawl out into freedom. Medical scanners will register eggs and spiderlings as foreign bodies. --- code/game/objects/effects/spiders.dm | 72 +++++++++++++------ .../simple_animal/hostile/giant_spider.dm | 15 +++- 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 141eabc61f..ea420e56b9 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -78,18 +78,28 @@ New() pixel_x = rand(3,-3) pixel_y = rand(3,-3) - processing_objects.Add(src) - + processing_objects |= src + /obj/effect/spider/eggcluster/Destroy() - processing_objects.Remove(src) + processing_objects -= src + if(istype(loc, /obj/item/organ/external)) + var/obj/item/organ/external/O = loc + O.implants -= src + ..() /obj/effect/spider/eggcluster/process() amount_grown += rand(0,2) if(amount_grown >= 100) var/num = rand(6,24) + var/obj/item/organ/external/O = null + if(istype(loc, /obj/item/organ/external)) + O = loc + for(var/i=0, i\The [src] skitters[pick(" away"," around","")].") + else if(prob(5)) + //vent crawl! + for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) + if(!v.welded) + entry_vent = v + walk_to(src, entry_vent, 5) + break - else if(prob(25)) - var/list/nearby = oview(5, src) - if(nearby.len) - var/target_atom = pick(nearby) - walk_to(src, target_atom, 5) - if(prob(25)) - src.visible_message("\blue \the [src] skitters[pick(" away"," around","")].") - else if(prob(5)) - //vent crawl! - for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) - if(!v.welded) - entry_vent = v - walk_to(src, entry_vent, 5) - break - - if(prob(1)) - src.visible_message("\blue \the [src] chitters.") - if(isturf(loc) && amount_grown > 0) - amount_grown += rand(0,2) if(amount_grown >= 100) var/spawn_type = pick(typesof(/mob/living/simple_animal/hostile/giant_spider)) var/mob/spiderspawn = new spawn_type(src.loc) spiderspawn.color = color spiderspawn.set_light(light_range, light_power, light_color) qdel(src) + else if(isorgan(loc)) + if(!amount_grown) amount_grown = 1 + var/obj/item/organ/external/O = loc + if(!O.owner || O.owner.stat == DEAD || amount_grown > 80) + O.implants -= src + src.loc = O.owner ? O.owner.loc : O.loc + src.visible_message("\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!") + if(O.owner) + O.owner.apply_damage(1, BRUTE, O.limb_name) + else if(prob(1)) + O.owner.apply_damage(1, TOX, O.limb_name) + if(world.time > last_itch + 30 SECONDS) + last_itch = world.time + O.owner << "Your [O.name] itches..." + else if(prob(1)) + src.visible_message("\The [src] skitters.") + + if(amount_grown) + amount_grown += rand(0,2) /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" @@ -214,7 +240,7 @@ icon_state = pick("cocoon1","cocoon2","cocoon3") /obj/effect/spider/cocoon/Destroy() - src.visible_message("\red \the [src] splits open.") + src.visible_message("\The [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 4d7a8f7e3a..40247c7584 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -64,15 +64,24 @@ move_to_delay = 4 /mob/living/simple_animal/hostile/giant_spider/AttackingTarget() - ..() - if(isliving(target_mob)) - var/mob/living/L = target_mob + var/target = ..() + if(isliving(target)) + var/mob/living/L = target if(L.reagents) L.reagents.add_reagent("toxin", poison_per_bite) if(prob(poison_per_bite)) L << "\red You feel a tiny prick." L.reagents.add_reagent(poison_type, 5) +/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget() + var/target = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(prob(poison_per_bite)) + var/obj/item/organ/external/O = pick(H.organs) + if(!(O.status & ORGAN_ROBOT)) + O.implants += new/obj/effect/spider/eggcluster(O) + /mob/living/simple_animal/hostile/giant_spider/Life() ..() if(!stat)