diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 47579ec43ed..84eb483b295 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -231,7 +231,7 @@ var/list/gamemode_cache = list() // 15, 45, 70 minutes respectively var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - var/static/aliens_allowed = 0 + var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. var/static/ninjas_allowed = 0 var/static/abandon_allowed = 1 var/static/ooc_allowed = 1 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c3598f27a27..2bf6285d8f3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -86,17 +86,17 @@ var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) if(src.locked || src.welded) - visible_message("\The [user] begins digging into \the [src] internals!") + visible_message("\The [user] begins tearing into \the [src] internals!") src.do_animate("deny") - if(do_after(user,5 SECONDS,src)) - visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!") + if(do_after(user,15 SECONDS,src)) + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) src.locked = 0 src.welded = 0 update_icon() open(1) - src.emag_act() + src.set_broken() //These aren't emags, these be CLAWS else if(src.density) visible_message("\The [user] begins forcing \the [src] open!") if(do_after(user, 5 SECONDS,src)) diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 55720870930..445d6ce467b 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -4,7 +4,6 @@ * Resin * Weeds * Acid - * Egg */ /* @@ -204,6 +203,7 @@ layer = ABOVE_TURF_LAYER+0.01 light_range = NODERANGE light_on = TRUE + light_color = "#673972" var/node_range = NODERANGE var/set_color = "#321D37" @@ -422,129 +422,4 @@ visible_message("[src.target] begins to crumble under the acid!") spawn(rand(150, 200)) tick() -/* - * Egg - */ -/var/const //for the status var - BURST = 0 - BURSTING = 1 - GROWING = 2 - GROWN = 3 - - MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger - MAX_GROWTH_TIME = 3000 - -/obj/effect/alien/egg - desc = "It looks like a weird egg" - name = "egg" -// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not. - icon_state = "egg" - density = FALSE - anchored = TRUE - - var/health = 100 - var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive - -/obj/effect/alien/egg/New() -/* - if(config.aliens_allowed) - ..() - spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) - Grow() - else - qdel(src) -*/ -/obj/effect/alien/egg/attack_hand(user as mob) - - var/mob/living/carbon/M = user - if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) - return attack_hand(user) - - switch(status) - if(BURST) - to_chat(user, "You clear the hatched egg.") - qdel(src) - return -/* if(GROWING) - to_chat(user, "The child is not developed yet.") - return - if(GROWN) - to_chat(user, "You retrieve the child.") - Burst(0) - return - -/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit. - return locate(/obj/item/clothing/mask/facehugger) in contents - -/obj/effect/alien/egg/proc/Grow() - icon_state = "egg" -// status = GROWN - status = BURST -// new /obj/item/clothing/mask/facehugger(src) - return -*/ -/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining - if(status == GROWN || status == GROWING) -// var/obj/item/clothing/mask/facehugger/child = GetFacehugger() - icon_state = "egg_hatched" -/* flick("egg_opening", src) - status = BURSTING - spawn(15) - status = BURST - child.loc = get_turf(src) - - if(kill && istype(child)) - child.Die() - else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Attach(M) - break -*/ -/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - -/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) - visible_message("[user] [attack_verb] the [src]!") - user.do_attack_animation(src) - health -= damage - healthcheck() - return - -/obj/effect/alien/egg/take_damage(var/damage) - health -= damage - healthcheck() - return - - -/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) - if(health <= 0) - return - if(LAZYLEN(W.attack_verb)) - src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(src, 'sound/items/Welder.ogg', 100, 1) - - src.health -= damage - src.healthcheck() - - -/obj/effect/alien/egg/proc/healthcheck() - if(health <= 0) - Burst() - -/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500 + T0C) - health -= 5 - healthcheck() \ No newline at end of file +//Xenomorph Effect egg removed, replaced with Structure Egg. \ No newline at end of file diff --git a/code/game/objects/structures/alien/alien egg.dm b/code/game/objects/structures/alien/alien egg.dm new file mode 100644 index 00000000000..90319e8a838 --- /dev/null +++ b/code/game/objects/structures/alien/alien egg.dm @@ -0,0 +1,96 @@ +#define MAX_PROGRESS 100 + +/obj/structure/alien/egg //Gurg Addition, working alien egg structure. + desc = "It looks like a weird egg." + name = "egg" + icon_state = "egg_growing" + density = 0 + anchored = 1 + var/progress = 0 + +/obj/structure/alien/egg/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/structure/alien/egg/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/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/observer/dead/O in observer_mob_list) + if(O.client) + to_chat(O, "An alien is ready to hatch at [get_area(src.loc)]! (spawn)") + STOP_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/alien/egg/update_icon() + if(progress == -1) + icon_state = "egg_hatched" + else if(progress < MAX_PROGRESS) + icon_state = "egg_growing" + else + icon_state = "egg" + +/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user) + if(progress == -1) //Egg has been hatched. + return + + if(progress < MAX_PROGRESS) + to_chat(user, "\The [src] has not yet matured.") + return + + if(!user.MayRespawn(1)) + return + + // Check for bans properly. + if(jobban_isbanned(user, "Xenomorph")) + to_chat(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. + to_chat(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 + 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 MAX_PROGRESS diff --git a/code/game/objects/structures/alien/alien.dm b/code/game/objects/structures/alien/alien.dm new file mode 100644 index 00000000000..31a609e5a52 --- /dev/null +++ b/code/game/objects/structures/alien/alien.dm @@ -0,0 +1,62 @@ +/obj/structure/alien //Gurg Addition, framework for alien eggs. + name = "alien thing" + desc = "There's something alien about this." + icon = 'icons/mob/alien.dmi' + layer = ABOVE_JUNK_LAYER + var/health = 50 + +/obj/structure/alien/proc/healthcheck() + if(health <=0) + set_density(0) + qdel(src) + return + +/obj/structure/alien/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/structure/alien/ex_act(severity) + switch(severity) + if(1.0) + health-=50 + if(2.0) + health-=50 + if(3.0) + if (prob(50)) + health-=50 + else + health-=25 + healthcheck() + return + +/obj/structure/alien/hitby(AM as mob|obj) + ..() + visible_message("\The [src] was hit by \the [AM].") + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else + tforce = AM:throwforce + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + health = max(0, health - tforce) + healthcheck() + ..() + return + +/obj/structure/alien/attack_generic() + attack_hand(usr) + +/obj/structure/alien/attackby(var/obj/item/weapon/W, var/mob/user) + health = max(0, health - W.force) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + healthcheck() + ..() + return + +/obj/structure/alien/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 132be558597..128fbf36907 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -43,10 +43,6 @@ /mob/living/carbon/alien/u_equip(obj/item/W as obj) return -/mob/living/carbon/alien/Stat() - ..() - stat(null, "Progress: [amount_grown]/[max_grown]") - /mob/living/carbon/alien/restrained() return 0 diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index 1fd40b43112..6a8d0864f41 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -1,3 +1,8 @@ +/mob/living/carbon/alien/diona/Stat() //Specified where progression is at, doesn't work right for some things in carbon/alien + . = ..() + if(. && statpanel("Status")) + stat("Growth", "[round(amount_grown)]/[max_grown]") + /mob/living/carbon/alien/diona/confirm_evolution() if(!is_alien_whitelisted(src, GLOB.all_species[SPECIES_DIONA])) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index e39f66c479f..06bbc810056 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -5,9 +5,10 @@ speak_emote = list("hisses") icon_state = "larva" language = "Hivemind" - maxHealth = 25 - health = 25 + maxHealth = 50 + health = 50 faction = "xeno" + max_grown = 325 //Increase larva growth time due to not needing hosts. /mob/living/carbon/alien/larva/Initialize() . = ..() diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index 159daae1efc..6bff3e8a84b 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -1,3 +1,8 @@ +/mob/living/carbon/alien/larva/Stat() //Specified where progression stats come from, because for some reason it doesn't work right in carbon/alien + . = ..() + if(. && statpanel("Status")) + stat("Growth", "[round(amount_grown)]/[max_grown]") + /mob/living/carbon/alien/larva/confirm_evolution() to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste.") diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 43bcdde4996..64e5145b97f 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -28,7 +28,7 @@ var/rads = radiation/25 radiation -= rads - adjust_nutrition(rads) + //adjust_nutrition(rads) //Commented out to prevent alien obesity. heal_overall_damage(rads,rads) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 3b382012064..5e2aaafb8e5 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -64,11 +64,11 @@ /datum/unarmed_attack/claws/strong/xeno attack_verb = list("slashed", "gouged", "stabbed") - damage = 10 + damage = 15 /datum/unarmed_attack/claws/strong/xeno/queen attack_verb = list("slashed", "gouged", "stabbed", "gored") - damage = 15 + damage = 20 /datum/unarmed_attack/bite/strong attack_name = "strong bite" @@ -77,7 +77,7 @@ shredding = 1 /datum/unarmed_attack/bite/strong/xeno - damage = 10 + damage = 15 /datum/unarmed_attack/slime_glomp attack_name = "glomp" 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 deleted file mode 100644 index 88efb6d3551..00000000000 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm +++ /dev/null @@ -1,161 +0,0 @@ -// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability -// It functions almost identically (see code/datums/diseases/alien_embryo.dm) - -/* -/obj/item/alien_embryo //Commented out as reference for future reproduction methods, or addition later. - name = "alien embryo" - desc = "All slimy and yuck." - icon = 'icons/mob/alien.dmi' - icon_state = "larva0_dead" - var/mob/living/affected_mob - var/stage = 0 - -/obj/item/alien_embryo/New() - if(istype(loc, /mob/living)) - affected_mob = loc - START_PROCESSING(SSobj, src) - spawn(0) - AddInfectionImages(affected_mob) - else - qdel(src) - -/obj/item/alien_embryo/Destroy() - if(affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - spawn(0) - RemoveInfectionImages(affected_mob) - ..() - -/obj/item/alien_embryo/process() - if(!affected_mob) return - if(loc != affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - STOP_PROCESSING(SSobj, src) - spawn(0) - RemoveInfectionImages(affected_mob) - affected_mob = null - return - - if(stage < 5 && prob(3)) - stage++ - spawn(0) - RefreshInfectionImage(affected_mob) - - switch(stage) - if(2, 3) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) - to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(4) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(2)) - to_chat(affected_mob, " Your muscles ache.") - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(2)) - to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) - affected_mob.adjustToxLoss(1) - affected_mob.updatehealth() - if(5) - to_chat(affected_mob, "You feel something tearing its way out of your stomach...") - affected_mob.adjustToxLoss(10) - affected_mob.updatehealth() - if(prob(50)) - AttemptGrow() - -/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - 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(affected_mob.client) - picked = affected_mob.key - else - stage = 4 // Let's try again later. - return - - if(affected_mob.lying) - affected_mob.add_overlay("burst_lie") - else - affected_mob.add_overlay("burst_stand") - spawn(6) - var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc) - new_xeno.key = picked - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention - if(gib_on_success) - affected_mob.gib() - qdel(src) - -/*---------------------------------------- -Proc: RefreshInfectionImage() -Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens. -----------------------------------------*/ -/obj/item/alien_embryo/proc/RefreshInfectionImage() - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/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")) - qdel(I) - for(var/mob/living/L in mob_list) - if(iscorgi(L) || iscarbon(L)) - if(L.status_flags & XENO_HOST) - var/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/alien_embryo/proc/AddInfectionImages(var/mob/living/C) - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - if(C.status_flags & XENO_HOST) - var/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/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C) - - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/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")) - qdel(I) -*/ 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 deleted file mode 100644 index 4bfffdfa474..00000000000 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ /dev/null @@ -1,221 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -//TODO: Make these simple_mobs -/* //Commented out as reference for future reproduction methods, or addition later if needed. - Mech -var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone -var/const/MAX_IMPREGNATION_TIME = 150 - -var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle -var/const/MAX_ACTIVE_TIME = 400 - -/obj/item/clothing/mask/facehugger - name = "alien" - desc = "It has some sort of a tube at the end of its tail." - 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 - body_parts_covered = FACE|EYES - throw_range = 5 - - var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case - var/sterile = 0 - var/strength = 5 - var/attached = 0 - -/obj/item/clothing/mask/facehugger/attack_hand(user as mob) - - if((stat == CONSCIOUS && !sterile)) - if(Attach(user)) - return - - ..() - -/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob) - ..() - user.drop_from_inventory(src) - Attach(M) - -/obj/item/clothing/mask/facehugger/New() - if(config.aliens_allowed) - ..() - else - qdel(src) - -/obj/item/clothing/mask/facehugger/examine(mob/user) - ..(user) - switch(stat) - if(DEAD,UNCONSCIOUS) - to_chat(user, "[src] is not moving.") - if(CONSCIOUS) - to_chat(user, "[src] seems to be active.") - if (sterile) - to_chat(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.do_attack_animation(src) - Die() - return - -/obj/item/clothing/mask/facehugger/bullet_act() - Die() - return - -/obj/item/clothing/mask/facehugger/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C+80) - Die() - return - -/obj/item/clothing/mask/facehugger/equipped(mob/M) - ..() - Attach(M) - -/obj/item/clothing/mask/facehugger/Crossed(atom/target) - HasProximity(target) - return - -/obj/item/clothing/mask/facehugger/on_found(mob/finder as mob) - if(stat == CONSCIOUS) - HasProximity(finder) - return 1 - return - -/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj) - if(CanHug(AM)) - Attach(AM) - -/obj/item/clothing/mask/facehugger/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/facehugger/throw_impact(atom/hit_atom) - ..() - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]" - 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) - - if((!iscorgi(M) && !iscarbon(M))) - return - - if(attached) - return - - var/mob/living/carbon/C = M - if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs) - return - - - attached++ - spawn(MAX_IMPREGNATION_TIME) - attached = 0 - - 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(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(" [src] tears [W] off of [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 - - GoIdle() //so it doesn't jump the people that tear it off - - spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME)) - Impregnate(L) - - return - -/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob) - if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something - return - - if(!sterile) - new /obj/item/alien_embryo(target) - target.status_flags |= XENO_HOST - - target.visible_message(" [src] falls limp after violating [target]'s face!") - - Die() - icon_state = "[initial(icon_state)]_impregnated" - - else - target.visible_message(" [src] violates [target]'s face!") - return - -/obj/item/clothing/mask/facehugger/proc/GoActive() - if(stat == DEAD || stat == CONSCIOUS) - return - - stat = CONSCIOUS - icon_state = "[initial(icon_state)]" - - return - -/obj/item/clothing/mask/facehugger/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/facehugger/proc/Die() - if(stat == DEAD) - return - -/* RemoveActiveIndicators() */ - - icon_state = "[initial(icon_state)]_dead" - stat = DEAD - - src.visible_message("[src] curls up into a ball!") - - return - -/proc/CanHug(var/mob/M) - - if(iscorgi(M)) - return 1 - - if(!iscarbon(M)) - return 0 - - var/mob/living/carbon/C = M - if(istype(C) && locate(/obj/item/organ/internal/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 -*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 8e8d70b4ee6..27e1df5b5a0 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -79,7 +79,7 @@ // Queen verbs. /mob/living/carbon/human/proc/lay_egg() - set name = "Lay Egg (75)" + set name = "Lay Egg (200)" set desc = "Lay an egg to produce huggers to impregnate prey with." set category = "Abilities" @@ -88,13 +88,13 @@ verbs -= /mob/living/carbon/human/proc/lay_egg return - if(locate(/obj/effect/alien/egg) in get_turf(src)) + if(locate(/obj/structure/alien/egg) in get_turf(src)) to_chat(src, "There's already an egg here.") return - if(check_alien_ability(75,1,O_EGG)) + if(check_alien_ability(200,1,O_EGG)) visible_message("[src] has laid an egg!") - new /obj/effect/alien/egg(loc) + new /obj/structure/alien/egg(loc) return @@ -144,7 +144,7 @@ P.firer = src P.old_style_target(A) P.fire() - playsound(src, 'sound/weapons/pierce.ogg', 25, 0) + playsound(src, 'sound/weapons/alien_spitacid.ogg', 25, 0) /mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N set name = "Corrosive Acid (200)" @@ -329,7 +329,7 @@ /mob/living/carbon/human/proc/gut() set category = "Abilities" - set name = "Gut" + set name = "Slaughter" set desc = "While grabbing someone aggressively, rip their guts out or tear them apart." if(last_special > world.time) @@ -345,7 +345,7 @@ return if(G.state < GRAB_AGGRESSIVE) - to_chat(src, "You must have an aggressive grab to gut your prey!") + to_chat(src, "You must have an aggressive grab to slaughter your prey!") return last_special = world.time + 50 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 425a72185ca..ac85b0314a6 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 @@ -14,8 +14,8 @@ siemens_coefficient = 0 gluttonous = 2 - brute_mod = 0.5 // Hardened carapace. - burn_mod = 2 // Weak to fire. + brute_mod = 0.6 // Hardened carapace. + burn_mod = 1.75 // Weak to fire. warning_low_pressure = 50 hazard_low_pressure = -1 @@ -33,18 +33,19 @@ flesh_color = "#282846" gibbed_anim = "gibbed-a" dusted_anim = "dust-a" - death_message = "lets out a waning guttural screech, green blood bubbling from its maw." + death_message = "lets out a guttural screech, green blood bubbling from its maw." death_sound = 'sound/voice/hiss6.ogg' speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') - speech_chance = 100 + speech_chance = 75 virus_immune = 1 breath_type = null poison_type = null - vision_flags = SEE_SELF|SEE_MOBS + vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS + darksight = 10 has_organ = list( O_HEART = /obj/item/organ/internal/heart, @@ -83,7 +84,7 @@ return SPECIES_XENO /datum/species/xenos/get_random_name() - return "alien [caste_name] ([alien_number])" + return "xenomorph [caste_name] ([alien_number])" /datum/species/xenos/can_understand(var/mob/other) if(istype(other, /mob/living/carbon/alien/larva)) @@ -101,7 +102,7 @@ H.mind.special_role = "Alien" alien_number++ //Keep track of how many aliens we've had so far. - H.real_name = "alien [caste_name] ([alien_number])" + H.real_name = "xenomorph [caste_name] ([alien_number])" H.name = H.real_name ..() @@ -154,15 +155,6 @@ return 1 return 0 -/* -/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) - H.AddInfectionImages() - ..() - -/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H) - H.RemoveInfectionImages() - ..() -*/ /datum/species/xenos/drone name = SPECIES_XENO_DRONE @@ -208,7 +200,7 @@ name = SPECIES_XENO_HUNTER weeds_plasma_rate = 5 caste_name = "hunter" - slowdown = -2 + slowdown = -1 total_health = 150 tail = "xenos_hunter_tail" @@ -269,11 +261,11 @@ /datum/species/xenos/queen name = SPECIES_XENO_QUEEN - total_health = 250 + total_health = 300 weeds_heal_rate = 5 weeds_plasma_rate = 20 caste_name = "queen" - slowdown = 4 + slowdown = 3 tail = "xenos_queen_tail" rarity_value = 10 @@ -312,10 +304,10 @@ ..() // Make sure only one official queen exists at any point. if(!alien_queen_exists(1,H)) - H.real_name = "alien queen ([alien_number])" + H.real_name = "xenomorph queen ([alien_number])" H.name = H.real_name else - H.real_name = "alien princess ([alien_number])" + H.real_name = "xenomorph princess ([alien_number])" H.name = H.real_name /datum/hud_data/alien @@ -334,8 +326,6 @@ has_internals = 0 gear = list( - "o_clothing" = list("loc" = ui_belt, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "dir" = SOUTH), - "head" = list("loc" = ui_id, "name" = "Hat", "slot" = slot_head, "state" = "hair"), "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), - ) + ) //Removed hat and outer slots, it caused too many problems that required admin intervention. diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index eae90e04766..6c73c18430a 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -27,30 +27,4 @@ faction = "xeno" ..(new_loc, SPECIES_XENO_QUEEN) -// I feel like we should generalize/condense down all the various icon-rendering antag procs. -/*---------------------------------------- -Proc: AddInfectionImages() -Des: Gives the client of the alien an image on each infected mob. -----------------------------------------*/ -/* -/mob/living/carbon/human/proc/AddInfectionImages() - if (client) - for (var/mob/living/C in mob_list) - if(C.status_flags & XENO_HOST) - var/obj/item/alien_embryo/A = locate() in C - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]") - client.images += I - return -*/ -/*---------------------------------------- -Proc: RemoveInfectionImages() -Des: Removes all infected images from the alien. -----------------------------------------*/ -/* -/mob/living/carbon/human/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - return -*/ +//Removed AddInfectionImages, no longer required. diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 80fa2227c40..3136f10199b 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -144,17 +144,21 @@ agony = 10 check_armour = "bio" armor_penetration = 25 // It's acid + hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg' + hitsound = 'sound/weapons/effects/alien_spit_wall.ogg' combustion = FALSE /obj/item/projectile/energy/neurotoxin name = "neurotoxic spit" icon_state = "neurotoxin" - damage = 5 + damage = 0 damage_type = BIOACID agony = 80 check_armour = "bio" armor_penetration = 25 // It's acid-based + hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg' + hitsound = 'sound/weapons/effects/alien_spit_wall.ogg' combustion = FALSE diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index effdecd863a..e5f49cc922f 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,48 +14,8 @@ return 0 return affected && affected.open == (affected.encased ? 3 : 2) +//Removed unused Embryo Surgery, derelict and broken. -////////////////////////////////////////////////////////////////// -// ALIEN EMBRYO SURGERY // -////////////////////////////////////////////////////////////////// // Here for future reference incase it's needed. See: Alien_embryo.dm and Alien_facehugger.dm -/* -/datum/surgery_step/internal/remove_embryo - allowed_tools = list( - /obj/item/weapon/surgical/hemostat = 100, \ - /obj/item/weapon/material/kitchen/utensil/fork = 20 - ) - - allowed_procs = list(IS_WIRECUTTER = 75) - blood_level = 2 - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/embryo = 0 - for(var/obj/item/alien_embryo/A in target) - embryo = 1 - break - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && embryo && affected.open == 3 && target_zone == BP_TORSO - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]." - var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]." - user.visible_message(msg, self_msg) - target.custom_pain("Something hurts horribly in your chest!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] rips the larva out of [target]'s ribcage!", - "You rip the larva out of [target]'s ribcage!") - - for(var/obj/item/alien_embryo/A in target) - A.loc = A.loc.loc -*/ ////////////////////////////////////////////////////////////////// // CHEST INTERNAL ORGAN SURGERY // ////////////////////////////////////////////////////////////////// diff --git a/maps/submaps/pois_vr/debris_field/derelict.dmm b/maps/submaps/pois_vr/debris_field/derelict.dmm index c1dcd090225..cbc325c351f 100644 --- a/maps/submaps/pois_vr/debris_field/derelict.dmm +++ b/maps/submaps/pois_vr/debris_field/derelict.dmm @@ -870,7 +870,6 @@ /turf/simulated/floor/tiled/dark, /area/submap/debrisfield/derelict/interior) "cF" = ( -/obj/effect/alien/egg, /obj/effect/alien/weeds, /turf/simulated/floor/tiled/dark, /area/submap/debrisfield/derelict/interior) diff --git a/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm b/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm index ed2b127f4fd..5042974f3c9 100644 --- a/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm +++ b/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm @@ -66,7 +66,6 @@ /area/submap/debrisfield/misc_debris) "W" = ( /obj/effect/alien/weeds, -/obj/effect/alien/egg, /turf/simulated/floor/airless, /area/submap/debrisfield/misc_debris) "X" = ( diff --git a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm index 20924e23eb0..ea129ae20d9 100644 --- a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm +++ b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm @@ -2,7 +2,7 @@ "ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) "ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"ae" = (/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ae" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) "ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) @@ -11,7 +11,7 @@ "ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) "am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"an" = (/obj/structure/window/phoronreinforced,/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"an" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) diff --git a/maps/submaps/surface_submaps/mountains/vault4.dmm b/maps/submaps/surface_submaps/mountains/vault4.dmm index 78ac6842d57..83843d7f687 100644 --- a/maps/submaps/surface_submaps/mountains/vault4.dmm +++ b/maps/submaps/surface_submaps/mountains/vault4.dmm @@ -7,7 +7,7 @@ "g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"j" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"j" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) (1,1,1) = {" aaaaaaaaa diff --git a/maps/submaps/surface_submaps/mountains/vault5.dmm b/maps/submaps/surface_submaps/mountains/vault5.dmm index 9de959c715e..24110c815e3 100644 --- a/maps/submaps/surface_submaps/mountains/vault5.dmm +++ b/maps/submaps/surface_submaps/mountains/vault5.dmm @@ -6,7 +6,7 @@ "f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"i" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"i" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) diff --git a/sound/machines/door/airlock_tear_apart.ogg b/sound/machines/door/airlock_tear_apart.ogg new file mode 100644 index 00000000000..aba517475f1 Binary files /dev/null and b/sound/machines/door/airlock_tear_apart.ogg differ diff --git a/sound/weapons/alien_spitacid.ogg b/sound/weapons/alien_spitacid.ogg new file mode 100644 index 00000000000..db630d0e8cc Binary files /dev/null and b/sound/weapons/alien_spitacid.ogg differ diff --git a/sound/weapons/effects/alien_spit_wall.ogg b/sound/weapons/effects/alien_spit_wall.ogg new file mode 100644 index 00000000000..3d4fc90d273 Binary files /dev/null and b/sound/weapons/effects/alien_spit_wall.ogg differ diff --git a/vorestation.dme b/vorestation.dme index 3a4afbeff49..bdbcb1504ea 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1485,6 +1485,8 @@ #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" #include "code\game\objects\structures\window_vr.dm" +#include "code\game\objects\structures\alien\alien egg.dm" +#include "code\game\objects\structures\alien\alien.dm" #include "code\game\objects\structures\crates_lockers\__closets.dm" #include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" #include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm"