diff --git a/aurorastation.dme b/aurorastation.dme index 64638cb3df6..5d5eb15abbc 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1544,7 +1544,6 @@ #include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" #include "code\modules\mob\living\carbon\alien\larva\larva.dm" #include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" #include "code\modules\mob\living\carbon\alien\larva\progression.dm" #include "code\modules\mob\living\carbon\brain\brain.dm" #include "code\modules\mob\living\carbon\brain\brain_item.dm" @@ -1598,6 +1597,8 @@ #include "code\modules\mob\living\carbon\human\species\station\station.dm" #include "code\modules\mob\living\carbon\human\species\station\tajaran_subspecies.dm" #include "code\modules\mob\living\carbon\human\species\station\vaurca_subspecies.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" diff --git a/code/game/objects/structures/alien/egg.dm b/code/game/objects/structures/alien/egg.dm index af2a9018749..be0ec7b9f0c 100644 --- a/code/game/objects/structures/alien/egg.dm +++ b/code/game/objects/structures/alien/egg.dm @@ -1,11 +1,18 @@ +#define BURST 0 +#define BURSTING 1 +#define GROWING 2 +#define GROWN 3 + #define MAX_PROGRESS 100 + /obj/structure/alien/egg desc = "It looks like a weird egg." name = "egg" icon_state = "egg_growing" density = 0 anchored = 1 + var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive var/progress = 0 /obj/structure/alien/egg/Initialize() @@ -16,82 +23,74 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/structure/alien/egg/CanUseTopic(var/mob/user) - return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE - -/obj/structure/alien/egg/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["spawn"]) - attack_ghost(usr) - /obj/structure/alien/egg/process() progress++ if(progress >= MAX_PROGRESS) - for(var/mob/M in dead_mob_list) - if(istype(M,/mob/dead) && M.client && M.client.prefs && (MODE_XENOMORPH in M.client.prefs.be_special_role)) - M << "[ghost_follow_link(src, M)] An alien is ready to hatch! (spawn)" + Grow() STOP_PROCESSING(SSprocessing, src) update_icon() -/obj/structure/alien/egg/update_icon() - if(progress == -1) +/obj/structure/alien/egg/attack_hand(user as mob) + var/mob/living/carbon/M = user + if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)) + return + + switch(status) + if(BURST) + user << "You clear the hatched egg." + qdel(src) + return + if(GROWING) + user << "The child is not developed yet." + return + if(GROWN) + user << "You retrieve the child." + Burst(0) + return + +/obj/structure/alien/egg/proc/GetFacehugger() + return locate(/obj/item/clothing/mask/facehugger) in contents + +/obj/structure/alien/egg/proc/Grow() + icon_state = "egg" + status = GROWN + new /obj/item/clothing/mask/facehugger(src) + return + +/obj/structure/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining + if(status == GROWN || status == GROWING) icon_state = "egg_hatched" - else if(progress < MAX_PROGRESS) - icon_state = "egg_growing" + flick("egg_opening", src) + status = BURSTING + addtimer(CALLBACK(src, .proc/givefacehugger, kill), 15) + +/obj/structure/alien/egg/proc/givefacehugger(var/kill = 1) + var/obj/item/clothing/mask/facehugger/child = GetFacehugger() + status = BURST + child.loc = get_turf(src) + + if(kill && istype(child)) + child.Die() else - icon_state = "egg" + for(var/mob/M in range(1,src)) + if(CanHug(M)) + child.Attach(M) + break -/obj/structure/alien/egg/attack_ghost(var/mob/dead/observer/user) - if(progress == -1) //Egg has been hatched. - return +/obj/structure/alien/egg/HasProximity(atom/movable/AM as mob|obj) + if(status == GROWN) + if(!CanHug(AM)) + return - if(progress < MAX_PROGRESS) - user << "\The [src] has not yet matured." - return + var/mob/living/carbon/C = AM + if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST) + return - if(!user.MayRespawn(1)) - return + Burst(0) - // Check for bans properly. - if(jobban_isbanned(user, "Xenomorph")) - user << "You are banned from playing a Xenomorph." - return - - var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") - - if(!src || confirm != "Yes") - return - - if(!user || !user.ckey) - return - - if(progress == -1) //Egg has been hatched. - user << "Too slow..." - return - - flick("egg_opening",src) - progress = -1 // No harvesting pls. - sleep(5) - - if(!src || !user) - visible_message("\The [src] writhes with internal motion, but nothing comes out.") - progress = MAX_PROGRESS // Someone else can have a go. - return // What a pain. - - // Create the mob, transfer over key. - var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) - larva.ckey = user.ckey - xenomorphs.add_antagonist(larva.mind, 1) - spawn(-1) - if(user) qdel(user) // Remove the keyless ghost if it exists. - - visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") - - // Turn us into a hatched egg. - name = "hatched alien egg" - desc += " This one has hatched." - update_icon() +#undef BURST +#undef BURSTING +#undef GROWING +#undef GROWN #undef MAX_PROGRESS diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 94019494d02..446e1f9d8ca 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -63,7 +63,8 @@ if (src.destroyed) return else - usr << "You kick the lab cage." + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user << "You kick the lab cage." for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) O << "[user] kicks the lab cage." @@ -74,187 +75,9 @@ /obj/structure/lamarr/proc/Break() if(occupied) - new /obj/item/clothing/mask/lamarr(src.loc) + new /obj/item/clothing/mask/facehugger/lamarr(src.loc) occupied = 0 update_icon() return -var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle -var/const/MAX_ACTIVE_TIME = 400 -/obj/item/clothing/mask/lamarr - name = "Lamarr" - desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite? - gender = FEMALE - icon = 'icons/mob/alien.dmi' - icon_state = "facehugger" - item_state = "facehugger" - w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4 - flags = PROXMOVE - body_parts_covered = FACE|EYES - throw_range = 5 - - var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case - var/strength = 5 - var/attached = 0 - var/sterile = 1 - -/obj/item/clothing/mask/lamarr/attack_hand(user as mob) - - if((stat == CONSCIOUS)) - if(Attach(user)) - return - - ..() - -/obj/item/clothing/mask/lamarr/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) - . = ..() - user.drop_from_inventory(src) - if(hit_zone == "head") - Attach(target) - - -/obj/item/clothing/mask/lamarr/examine(mob/user) - ..(user) - switch(stat) - if(DEAD,UNCONSCIOUS) - user << "[src] is not moving." - if(CONSCIOUS) - user << "[src] seems to be active." - if (sterile) - user << "It looks like the proboscis has been removed." - return - -/obj/item/clothing/mask/lamarr/attackby(obj/item/I, mob/user) - if(I.force) - user.do_attack_animation(src) - Die() - return - -/obj/item/clothing/mask/lamarr/bullet_act() - Die() - return - -/obj/item/clothing/mask/lamarr/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C+80) - Die() - return - -/obj/item/clothing/mask/lamarr/equipped(mob/M) - ..() - Attach(M) - -/obj/item/clothing/mask/lamarr/Crossed(atom/target) - HasProximity(target) - return - -/obj/item/clothing/mask/lamarr/on_found(mob/finder as mob) - if(stat == CONSCIOUS) - HasProximity(finder) - return 1 - return - -/obj/item/clothing/mask/lamarr/HasProximity(atom/movable/AM as mob|obj) - if(CanHug(AM)) - Attach(AM) - -/obj/item/clothing/mask/lamarr/throw_at(atom/target, range, speed) - ..() - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]_thrown" - spawn(15) - if(icon_state == "[initial(icon_state)]_thrown") - icon_state = "[initial(icon_state)]" - -/obj/item/clothing/mask/lamarr/proc/Attach(M as mob) - - if((!iscarbon(M))) - return - - if(attached) - return - - var/mob/living/L = M //just so I don't need to use : - - if(loc == L) return - if(stat != CONSCIOUS) return - if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage - - L.visible_message("[src] leaps at [L]'s face!") - - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.head && H.head.flags & AIRTIGHT) - H.visible_message("\The [src] smashes against [H]'s [H.head]!") - Die() - return - - - if(iscarbon(M)) - var/mob/living/carbon/target = L - - if(target.wear_mask) - if(prob(20)) return - var/obj/item/clothing/W = target.wear_mask - if(!W.canremove) return - target.drop_from_inventory(W) - - target.visible_message("\The [src] tears [W] off of [target]'s face!") - - target.equip_to_slot(src, slot_wear_mask) - target.contents += src // Monkey sanity check - Snapshot - - GoIdle() //so it doesn't jump the people that tear it off - - return - -/obj/item/clothing/mask/lamarr/proc/GoActive() - if(stat == DEAD || stat == CONSCIOUS) - return - - stat = CONSCIOUS - icon_state = "[initial(icon_state)]" - - return - -/obj/item/clothing/mask/lamarr/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME) - if(stat == DEAD || stat == UNCONSCIOUS) - return - -/* RemoveActiveIndicators() */ - - stat = UNCONSCIOUS - icon_state = "[initial(icon_state)]_inactive" - - spawn(rand(min_time,max_time)) - GoActive() - return - -/obj/item/clothing/mask/lamarr/proc/Die() - if(stat == DEAD) - return - -/* RemoveActiveIndicators() */ - - icon_state = "[initial(icon_state)]_dead" - stat = DEAD - - src.visible_message("\The [src] curls up into a ball!") - - return - -/proc/CanHug(var/mob/M) - - if(!iscarbon(M)) - return 0 - - var/mob/living/carbon/C = M - if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs) - return 0 - - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL)) - return 0 - return 1 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 5ca32e24d0e..79fb5e45376 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,5 +1,3 @@ -#define MIN_LARVA_BLOOD_DRINK 0.5 - //Larvae regenerate health and nutrition from plasma and alien weeds. /mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment) @@ -13,22 +11,3 @@ adjustFireLoss(-1) adjustToxLoss(-1) adjustOxyLoss(-1) - -// Maybe not the -best- place but it's semiappropriate and fitting. -// Drink the blood of your host! -/mob/living/carbon/alien/larva/handle_chemicals_in_body() - if(!loc) - return - if(!istype(loc, /obj/item/weapon/holder)) - return - var/mob/living/carbon/human/M = loc.loc //ergh, replace with a flag sometime - if(!istype(M)) - return - if(M.vessel.total_volume > 0) - M.vessel.trans_to(src,min(M.vessel.total_volume,MIN_LARVA_BLOOD_DRINK)) - update_progression() - else - src << "This host is depleted of blood..." - leave_host() - -#undef MIN_LARVA_BLOOD_DRINK diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm new file mode 100644 index 00000000000..fb03d42ba63 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm @@ -0,0 +1,154 @@ +/obj/item/organ/xenos/alien_embryo + name = "alien embryo" + desc = "All slimy and yuck." + icon = 'icons/mob/alien.dmi' + icon_state = "larva0_dead" + parent_organ = "chest" + organ_tag = "alien embryo" + origin_tech = list(TECH_BIO = 5) + var/stage = 0 + + +/obj/item/organ/xenos/alien_embryo/Destroy() + if(owner) + owner.status_flags &= ~(XENO_HOST) + RemoveInfectionImages(owner) + return ..() + + +/obj/item/organ/xenos/alien_embryo/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) + ..(target, affected) + if(owner && ishuman(owner)) + START_PROCESSING(SSprocessing, src) + AddInfectionImages(owner) + +/obj/item/organ/xenos/alien_embryo/removed(var/mob/living/user) + if(owner) + owner.status_flags &= ~(XENO_HOST) + RemoveInfectionImages(owner) + ..(user) + + +/obj/item/organ/xenos/alien_embryo/process() + + ..() + + if(!owner) + return + + if(stage < 5 && prob(3)) + stage++ + RefreshInfectionImage(owner) + + switch(stage) + if(2, 3) + if(prob(1)) + owner.emote("sneeze") + if(prob(1)) + owner.emote("cough") + if(prob(1)) + owner << "Your throat feels sore." + if(prob(1)) + owner << "Mucous runs down the back of your throat." + if(4) + if(prob(1)) + owner.emote("sneeze") + if(prob(1)) + owner.emote("cough") + if(prob(2)) + owner << "Your muscles ache." + if(prob(20)) + owner.take_organ_damage(1) + if(prob(2)) + owner << "Your stomach hurts." + if(prob(20)) + owner.adjustToxLoss(1) + owner.updatehealth() + if(5) + owner << "You feel something tearing its way out of your stomach!" + owner.adjustToxLoss(10) + owner.updatehealth() + if(prob(50)) + AttemptGrow() + +/obj/item/organ/xenos/alien_embryo/proc/AttemptGrow() + var/list/candidates = get_alien_candidates() + var/picked = null + + // To stop clientless larva, we will check that our host has a client + // if we find no ghosts to become the alien. If the host has a client + // he will become the alien but if he doesn't then we will set the stage + // to 2, so we don't do a process heavy check everytime. + + if(candidates.len) + picked = pick(candidates) + else if(owner.client) + picked = owner.key + else + stage = 4 // Let's try again later. + return + + var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc) + new_xeno.key = picked + new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention + owner.apply_damage(500, BRUTE, "chest") + STOP_PROCESSING(SSprocessing, src) + qdel(src) + +/*---------------------------------------- +Proc: RefreshInfectionImage() +Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens. +----------------------------------------*/ +/obj/item/organ/xenos/alien_embryo/proc/RefreshInfectionImage() + + for(var/mob/living/carbon/alien in player_list) + + if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) + continue + + if(alien.client) + for(var/image/I in alien.client.images) + if(dd_hasprefix_case(I.icon_state, "infected")) + alien.client.images -= I + for(var/mob/living/L in mob_list) + if(iscarbon(L)) + if(L.status_flags & XENO_HOST) + var/image/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]") + alien.client.images += I + +/*---------------------------------------- +Proc: AddInfectionImages(C) +Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C. +----------------------------------------*/ +/obj/item/organ/xenos/alien_embryo/proc/AddInfectionImages(var/mob/living/C) + if(C) + + for(var/mob/living/carbon/alien in player_list) + + if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) + continue + + if(alien.client) + if(C.status_flags & XENO_HOST) + var/image/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]") + alien.client.images += I + +/*---------------------------------------- +Proc: RemoveInfectionImage(C) +Des: Removes the alien infection image from all aliens in the world located in passed mob (C). +----------------------------------------*/ + +/obj/item/organ/xenos/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C) + + if(C) + + for(var/mob/living/carbon/alien in player_list) + + if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) + continue + + if(alien.client) + for(var/image/I in alien.client.images) + if(I.loc == C) + if(dd_hasprefix_case(I.icon_state, "infected")) + alien.client.images -= I \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index d9f38982a67..4a756ddcbd7 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -35,28 +35,30 @@ var/const/MAX_ACTIVE_TIME = 400 /obj/item/clothing/mask/facehugger/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) . = ..() user.drop_from_inventory(src) - if(hit_zone == "head") - Attach(target) + Attach(target) -/obj/item/clothing/mask/facehugger/Initialize() - if(config.aliens_allowed) - . = ..() - else - . = INITIALIZE_HINT_QDEL + +/obj/item/clothing/mask/facehugger/attack(mob/living/target, mob/living/user, var/target_zone) + if(target && user && ishuman(target) && ishuman(user) && !user.stat) + user.drop_from_inventory(src) + Attach(target) + return + ..() /obj/item/clothing/mask/facehugger/examine(mob/user) ..(user) switch(stat) if(DEAD,UNCONSCIOUS) - user << "[src] is not moving." + user << "\The [src] is not moving." if(CONSCIOUS) - user << "[src] seems to be active." + user << "\The [src] seems to be active." if (sterile) user << "It looks like the proboscis has been removed." return /obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user) if(I.force) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) Die() return @@ -103,18 +105,26 @@ var/const/MAX_ACTIVE_TIME = 400 throwing = 0 GoIdle(30,100) //stunned for a few seconds - allows throwing them to be useful for positioning but not as an offensive action (unless you're setting up a trap) -/obj/item/clothing/mask/facehugger/proc/Attach(M as mob) +/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M as mob) - if((!iscorgi(M) && !iscarbon(M))) + if((!iscarbon(M))) return if(attached) return - var/mob/living/carbon/C = M - if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs) + if(M.isSynthetic()) return + var/mob/living/carbon/human/C = M + if(istype(C) && locate(/obj/item/organ/xenos/alien_embryo) in C.internal_organs) + return + + if(locate(/obj/item/organ/xenos/hivenode) in C.internal_organs) + return + + if(!C.check_has_mouth()) + return attached++ spawn(MAX_IMPREGNATION_TIME) @@ -126,13 +136,13 @@ var/const/MAX_ACTIVE_TIME = 400 if(stat != CONSCIOUS) return if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage - L.visible_message("[src] leaps at [L]'s face!") + L.visible_message("\The [src] leaps at \the [L]'s face!") if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.head && H.head.flags & HEADCOVERSMOUTH) - H.visible_message("[src] smashes against [H]'s [H.head]!") + if(H.head && H.head.body_parts_covered & FACE) + H.visible_message("\The [src] smashes against the [H]'s \the [H.head]!") Die() return @@ -146,18 +156,12 @@ var/const/MAX_ACTIVE_TIME = 400 if(!W.canremove) return target.drop_from_inventory(W) - target.visible_message("[src] tears [W] off of [target]'s face!") + target.visible_message("\The [src] tears \the [W] off of \the [target]'s face!") target.equip_to_slot(src, slot_wear_mask) target.contents += src // Monkey sanity check - Snapshot if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings - else if (iscorgi(M)) - var/mob/living/simple_animal/corgi/corgi = M - src.loc = corgi - corgi.facehugger = src - corgi.wear_mask = src - //C.regenerate_icons() GoIdle() //so it doesn't jump the people that tear it off @@ -166,26 +170,24 @@ var/const/MAX_ACTIVE_TIME = 400 return -/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob) +/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/carbon/human/target as mob) if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something return if(!sterile) //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance - new /obj/item/alien_embryo(target) + var/obj/item/organ/affecting = target.get_organ("chest") + var/obj/item/organ/xenos/alien_embryo/kid = new(affecting) + kid.replaced(target,affecting) target.status_flags |= XENO_HOST - target.visible_message("[src] falls limp after violating [target]'s face!") + target.visible_message("\The [src] falls limp after violating \the [target]'s face!") Die() icon_state = "[initial(icon_state)]_impregnated" - if(iscorgi(target)) - var/mob/living/simple_animal/corgi/C = target - src.loc = get_turf(C) - C.facehugger = null else - target.visible_message("[src] violates [target]'s face!") + target.visible_message("\The [src] violates \the [target]'s face!") return /obj/item/clothing/mask/facehugger/proc/GoActive() @@ -219,10 +221,17 @@ var/const/MAX_ACTIVE_TIME = 400 icon_state = "[initial(icon_state)]_dead" stat = DEAD - src.visible_message("[src] curls up into a ball!") + src.visible_message("\The [src] curls up into a ball!") return + +/obj/item/clothing/mask/facehugger/lamarr + name = "Lamarr" + desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite? + gender = FEMALE + sterile = 1 + /proc/CanHug(var/mob/M) if(iscorgi(M)) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 74756de6a8c..f02bd634ec2 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -310,8 +310,8 @@ /mob/living/carbon/human/proc/transfer_plasma, /mob/living/carbon/human/proc/corrosive_acid, /mob/living/carbon/human/proc/neurotoxin, + /mob/living/carbon/human/proc/gut, /mob/living/carbon/human/proc/resin, - /mob/living/carbon/human/proc/xeno_infest, /mob/living/carbon/human/proc/darkness_eyes ) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index d1bf8d2465b..dd9d74b2105 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -403,3 +403,4 @@ // can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) // return ..() && target.op_stage.ribcage == 2 + diff --git a/html/changelogs/alberyk-ayylmao.yml b/html/changelogs/alberyk-ayylmao.yml new file mode 100644 index 00000000000..eccf5cb0057 --- /dev/null +++ b/html/changelogs/alberyk-ayylmao.yml @@ -0,0 +1,4 @@ +author: Alberyk +delete-after: True +changes: + - rscadd: "Re-added facehuggers to xenomorphs, bringing back all the infection circle."