From 79e22d58e51dd01bf2e8b4a3cf00d8c53ac33a69 Mon Sep 17 00:00:00 2001 From: Datraen Date: Wed, 25 May 2016 03:40:16 -0400 Subject: [PATCH] Semi-final stage of Xenobio2 Initial Implementation Adds UIs to Core Extractor, Slime Replicator Adds Slimified Monkey Cubes as separate item type Adds Docility Toxin Replaces amutationtoxin references with docilitytoxin references Adds resistances to simple_mob damage handling, to allow for simple mobs to have resistances to different kinds of damage Moves a return to it's proper position to allow for hostile mobs to properly handle targets. --- code/modules/hydroponics/seed.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 16 +- .../Chemistry-Reagents-Toxins.dm | 70 ++-- code/modules/reagents/Chemistry-Recipes.dm | 330 +----------------- code/modules/xenobio2/_xeno_setup.dm | 24 +- .../xenobio2/machinery/core_extractor.dm | 65 +++- .../xenobio2/machinery/injector_computer.dm | 4 +- .../xenobio2/machinery/slime_replicator.dm | 54 ++- code/modules/xenobio2/mob/slime/slime life.dm | 4 +- .../modules/xenobio2/mob/slime/slime procs.dm | 9 +- code/modules/xenobio2/mob/slime/slime.dm | 6 + code/modules/xenobio2/mob/slime/slime_core.dm | 7 +- .../xenobio2/mob/slime/slime_monkey.dm | 65 ++++ code/modules/xenobio2/mob/xeno procs.dm | 17 +- code/modules/xenobio2/mob/xeno.dm | 3 +- icons/mob/slime2.dmi | Bin 4768 -> 6277 bytes nano/templates/xenobio_computer.tmpl | 45 ++- polaris.dme | 1 + 18 files changed, 288 insertions(+), 434 deletions(-) create mode 100644 code/modules/xenobio2/mob/slime/slime_monkey.dm diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 0974a705ced..6f4f82b8b8c 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -400,7 +400,7 @@ "potassium", "plasticide", "mutationtoxin", - "amutationtoxin", + "docilitytoxin", "inaprovaline", "space_drugs", "paroxetine", diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 69eb6de378e..4cf07f35f6a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -82,6 +82,15 @@ var/shuttletarget = null var/enroute = 0 + var/list/resistances = list( + HALLOSS = 0, + BRUTE = 1, + BURN = 1, + TOX = 1, + OXY = 0, + CLONE = 0 + ) + var/hostile = 0 /mob/living/simple_animal/New() @@ -222,7 +231,6 @@ if(!atmos_suitable) adjustBruteLoss(unsuitable_atoms_damage) - return 1 //Hostility if(!stat && !client && hostile) @@ -239,6 +247,8 @@ if(destroy_surroundings) DestroySurroundings() AttackTarget() + + return 1 /mob/living/simple_animal/proc/handle_supernatural() if(purge) @@ -331,9 +341,7 @@ return if(O.force > resistance) - var/damage = O.force - if (O.damtype == HALLOSS) - damage = 0 + var/damage = O.force * resistances[O.damtype] if(supernatural && istype(O,/obj/item/weapon/nullrod)) damage *= 2 purge = 3 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 0022026a673..bc0072511a3 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -474,42 +474,46 @@ color = "#13BC5E" /datum/reagent/slimetoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.name != "Promethean") - M << "Your flesh rapidly mutates!" - H.set_species("Promethean") - H.shapeshifter_set_colour("#05FF9B") - H.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_colour + if(M.isSynthetic()) + return + + var/mob/living/carbon/human/H = M + if(istype(H) && (H.species.flags & NO_SCAN)) + return + + if(M.dna) + if(prob(removed * 0.1)) + randmuti(M) + if(prob(98)) + randmutb(M) + else + randmutg(M) + domutcheck(M, null) + M.UpdateAppearance() + M.apply_effect(16 * removed, IRRADIATE, 0) /datum/reagent/aslimetoxin - name = "Advanced Mutation Toxin" - id = "amutationtoxin" - description = "An advanced corruptive toxin produced by slimes." + name = "Docility Toxin" + id = "docilitytoxin" + description = "A corruptive toxin produced by slimes." reagent_state = LIQUID - color = "#13BC5E" + color = "#FF69B4" /datum/reagent/aslimetoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // TODO: check if there's similar code anywhere else - if(M.transforming) + if(M.isSynthetic()) return - M << "Your flesh rapidly mutates!" - M.transforming = 1 - M.canmove = 0 - M.icon = null - M.overlays.Cut() - M.invisibility = 101 - for(var/obj/item/W in M) - if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - qdel(W) - continue - W.layer = initial(W.layer) - W.loc = M.loc - W.dropped(M) - var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) - new_mob.a_intent = "hurt" - new_mob.universal_speak = 1 - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - qdel(M) + + var/mob/living/carbon/human/H = M + if(istype(H) && (H.species.flags & NO_SCAN)) + return + + if(M.dna) + if(prob(removed * 0.1)) + randmuti(M) + if(prob(98)) + randmutb(M) + else + randmutg(M) + domutcheck(M, null) + M.UpdateAppearance() + M.apply_effect(6 * removed, IRRADIATE, 0) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 8146069f5c2..e9c3df50985 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -998,333 +998,25 @@ /datum/chemical_reaction/slime var/required = null +//Slimed monkeys /datum/chemical_reaction/slime/can_happen(var/datum/reagents/holder) if(holder.my_atom && istype(holder.my_atom, required)) - var/obj/item/slime_extract/T = holder.my_atom - if(T.Uses > 0) - return ..() + return ..() return 0 - -/datum/chemical_reaction/slime/on_reaction(var/datum/reagents/holder) - var/obj/item/slime_extract/T = holder.my_atom - T.Uses-- - if(T.Uses <= 0) - T.visible_message("\icon[T]\The [T]'s power is consumed in the reaction.") - T.name = "used slime extract" - T.desc = "This extract has been used up." - -//Grey -/datum/chemical_reaction/slime/spawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/grey - -/datum/chemical_reaction/slime/spawn/on_reaction(var/datum/reagents/holder) - holder.my_atom.visible_message("Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!") - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.loc = get_turf(holder.my_atom) - ..() - -/datum/chemical_reaction/slime/monkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required = /obj/item/slime_extract/grey - -/datum/chemical_reaction/slime/monkey/on_reaction(var/datum/reagents/holder) - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) - ..() - -//Green -/datum/chemical_reaction/slime/mutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/green - -//Metal -/datum/chemical_reaction/slime/metal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/metal - -/datum/chemical_reaction/slime/metal/on_reaction(var/datum/reagents/holder) - var/obj/item/stack/material/steel/M = new /obj/item/stack/material/steel - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/material/plasteel/P = new /obj/item/stack/material/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) - ..() - -//Gold - removed -/datum/chemical_reaction/slime/crit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/gold - mix_message = "The slime core fizzles disappointingly." - -//Silver -/datum/chemical_reaction/slime/bork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/silver - -/datum/chemical_reaction/slime/bork/on_reaction(var/datum/reagents/holder) - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M.eyecheck() <= 0) - flick("e_flash", M.flash) - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH, SOUTH, EAST, WEST)) - ..() - -//Blue -/datum/chemical_reaction/slime/frost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("phoron" = 1) - result_amount = 10 - required = /obj/item/slime_extract/blue - -//Dark Blue -/datum/chemical_reaction/slime/freeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/darkblue - mix_message = "The slime extract begins to vibrate violently!" - -/datum/chemical_reaction/slime/freeze/on_reaction(var/datum/reagents/holder) - ..() - sleep(50) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - M << "You feel a chill!" - -//Orange -/datum/chemical_reaction/slime/casp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 1) - result_amount = 10 - required = /obj/item/slime_extract/orange - -/datum/chemical_reaction/slime/fire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/orange - mix_message = "The slime extract begins to vibrate violently!" - -/datum/chemical_reaction/slime/fire/on_reaction(var/datum/reagents/holder) - ..() - sleep(50) - var/turf/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(0, location)) - target_tile.assume_gas("phoron", 25, 1400) - spawn (0) - target_tile.hotspot_expose(700, 400) - -//Yellow -/datum/chemical_reaction/slime/overload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required = /obj/item/slime_extract/yellow - -/datum/chemical_reaction/slime/overload/on_reaction(var/datum/reagents/holder, var/created_volume) - ..() - empulse(get_turf(holder.my_atom), 3, 7) - -/datum/chemical_reaction/slime/cell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/yellow - -/datum/chemical_reaction/slime/cell/on_reaction(var/datum/reagents/holder, var/created_volume) - var/obj/item/weapon/cell/slime/P = new /obj/item/weapon/cell/slime - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slime/glow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required = /obj/item/slime_extract/yellow - mix_message = "The contents of the slime core harden and begin to emit a warm, bright light." - -/datum/chemical_reaction/slime/glow/on_reaction(var/datum/reagents/holder, var/created_volume) - ..() - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) - -//Purple -/datum/chemical_reaction/slime/psteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/purple - -/datum/chemical_reaction/slime/psteroid/on_reaction(var/datum/reagents/holder, var/created_volume) - ..() - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slime/jam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 1) - result_amount = 10 - required = /obj/item/slime_extract/purple - -//Dark Purple -/datum/chemical_reaction/slime/plasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/darkpurple - -/datum/chemical_reaction/slime/plasma/on_reaction(var/datum/reagents/holder) - ..() - var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron - P.amount = 10 - P.loc = get_turf(holder.my_atom) - -//Red -/datum/chemical_reaction/slime/glycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("phoron" = 1) - result_amount = 8 - required = /obj/item/slime_extract/red - -/datum/chemical_reaction/slime/bloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required = /obj/item/slime_extract/red - -/datum/chemical_reaction/slime/bloodlust/on_reaction(var/datum/reagents/holder) - ..() - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - slime.visible_message("The [slime] is driven into a frenzy!") - -//Pink -/datum/chemical_reaction/slime/ppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/pink - -/datum/chemical_reaction/slime/ppotion/on_reaction(var/datum/reagents/holder) - ..() - var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion - P.loc = get_turf(holder.my_atom) - -//Black -/datum/chemical_reaction/slime/mutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/black - -//Oil -/datum/chemical_reaction/slime/explosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("phoron" = 1) - result_amount = 1 - required = /obj/item/slime_extract/oil - mix_message = "The slime extract begins to vibrate violently!" - -/datum/chemical_reaction/slime/explosion/on_reaction(var/datum/reagents/holder) - ..() - sleep(50) - explosion(get_turf(holder.my_atom), 1, 3, 6) - -//Light Pink -/datum/chemical_reaction/slime/potion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required = /obj/item/slime_extract/lightpink - required_reagents = list("phoron" = 1) - -/datum/chemical_reaction/slime/potion2/on_reaction(var/datum/reagents/holder) - ..() - var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 - P.loc = get_turf(holder.my_atom) - -//Adamantine + /datum/chemical_reaction/slime/golem - name = "Slime Golem" - id = "m_golem" + name = "Prometheans" + id = "m_promethean" result = null - required_reagents = list("phoron" = 1) + required_reagents = list("mutationtoxin" = 1) result_amount = 1 - required = /obj/item/slime_extract/adamantine + required = /obj/item/weapon/reagent_containers/food/snacks/monkeycube /datum/chemical_reaction/slime/golem/on_reaction(var/datum/reagents/holder) - ..() - var/obj/effect/golemrune/Z = new /obj/effect/golemrune - Z.loc = get_turf(holder.my_atom) - Z.announce_to_ghosts() - + var/location = get_turf(holder.my_atom) + new /obj/item/slime_cube(location) + qdel(holder.my_atom) + /* Food */ /datum/chemical_reaction/tofu diff --git a/code/modules/xenobio2/_xeno_setup.dm b/code/modules/xenobio2/_xeno_setup.dm index c958256777a..1e5d46175ed 100644 --- a/code/modules/xenobio2/_xeno_setup.dm +++ b/code/modules/xenobio2/_xeno_setup.dm @@ -52,8 +52,7 @@ var/global/list/xenoChemList = list("mutationtoxin", "psilocybin", "mindbreaker", "impedrezene", - "cryptobiolin", - "serotronium", + "cryptobiolin", "space_drugs", "chloralhydrate", "stoxin", @@ -76,12 +75,14 @@ var/global/list/xenoChemList = list("mutationtoxin", "alkysine", "imidazoline", "peridaxon", - "rezadone") + "rezadone", + "mutationtoxin", + "docilitytoxin") /datum/xeno/traits var/list/traits = list() var/list/chemlist = list() - var/obj/chems + var/list/chems = list() var/source = "unknown" /datum/xeno/traits/proc/set_trait(var/trait, var/newval) @@ -115,8 +116,6 @@ var/global/list/xenoChemList = list("mutationtoxin", set_trait(TRAIT_XENO_CANSPEAK, 1) set_trait(TRAIT_XENO_STRENGTH, 0) set_trait(TRAIT_XENO_STR_RANGE, 0) - chems = new() - chems.create_reagents(traits[TRAIT_XENO_CHEMVOL]) /datum/xeno/traits/proc/get_gene(var/genetype) @@ -167,10 +166,8 @@ var/global/list/xenoChemList = list("mutationtoxin", switch(genes.genetype) if(GENE_XENO_BIOCHEMISTRY) set_trait(TRAIT_XENO_CHEMVOL, genes.values["[TRAIT_XENO_CHEMVOL]"]) - chems.reagents.maximum_volume = genes.values["[TRAIT_XENO_CHEMVOL]"] - for(var/reagent in genes.chems.reagents) - var/amount = genes.chems.reagents[reagent] - chems.reagents.add_reagent(reagent, amount) + for(var/reagent in genes.chems) + chems[reagent] = genes[reagent] if(GENE_XENO_HEALTH) set_trait(TRAIT_XENO_HEALTH, genes.values["[TRAIT_XENO_HEALTH]"]) @@ -206,10 +203,7 @@ var/global/list/xenoChemList = list("mutationtoxin", /datum/xeno/genes var/genetype //Label for specifying what gene is used. var/list/values //What's going to be put into specific traits - var/obj/chems + var/list/chems -/datum/xeno/genes/New() - ..() - chems = new() - chems.create_reagents(20) + \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index d9219a7e614..a67169a2822 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -1,7 +1,7 @@ /* Here lives the slime core extractor This machine extracts slime cores at the cost of the slime itself. - To create more of these slimes, stick the slime core in the replicator. + To create more of these slimes, stick the slime core in the extractor. */ /obj/machinery/slime/extractor name = "Slime extractor" @@ -60,7 +60,7 @@ user << "The core extractor is full, empty it first!" return - if(in_use) + if(inuse) user << "The core extractor is locked and running, wait for it to finish." return @@ -81,11 +81,11 @@ /obj/machinery/slime/extractor/proc/update_light_color() if(src.occupant && !(inuse)) - set_light(4, 4, occupiedcolor) + set_light(1, 1, occupiedcolor) else if(src.occupant) - set_light(4, 4, operatingcolor) + set_light(1, 1, operatingcolor) else - set_light(4, 4, emptycolor) + set_light(1, 1, emptycolor) /obj/machinery/slime/extractor/proc/extract_cores() if(!src.occupant) @@ -102,11 +102,12 @@ C.traits = occupant.traitdat C.create_reagents(C.traits.traits[TRAIT_XENO_CHEMVOL]) - for(var/reagent in occupant.traitdat.chems.reagents) - var/amount = occupant.traitdat.chems.reagents[reagent] - C.reagents.add_reagent(reagent, amount) + for(var/reagent in occupant.traitdat.chems) + C.reagents.add_reagent(reagent, occupant.traitdat.chems[reagent]) C.color = C.traits.traits[TRAIT_XENO_COLOR] + if(occupant.traitdat.get_trait(TRAIT_XENO_BIOLUMESCENT)) + C.set_light(occupant.traitdat.get_trait(TRAIT_XENO_GLOW_STRENGTH),occupant.traitdat.get_trait(TRAIT_XENO_GLOW_RANGE), occupant.traitdat.get_trait(TRAIT_XENO_BIO_COLOR)) spawn(30) icon_state = "scanner_0old" @@ -115,13 +116,55 @@ eject_contents() update_light_color() -/obj/machinery/slime/extractor/proc/eject_contents() - for(var/obj/thing in (contents - component_parts - circuit)) - thing.forceMove(loc) +/obj/machinery/slime/extractor/proc/eject_slime() if(occupant) occupant.forceMove(loc) occupant = null + +/obj/machinery/slime/extractor/proc/eject_core() + for(var/obj/thing in (contents - component_parts - circuit)) + thing.forceMove(loc) + +/obj/machinery/slime/extractor/proc/eject_contents() + eject_core() + eject_slime() +//Here lies the UI +/obj/machinery/slime/extractor/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/obj/machinery/slime/extractor/interact(mob/user as mob) + var/dat = "" + if(!inuse) + dat = {" + Slime held:
+ [occupant]
+ "} + if (occupant && !(stat & (NOPOWER|BROKEN))) + dat += "Start the core extraction.
" + if(occupant) + dat += "Eject the slime
" + else + dat += "Please wait..." + var/datum/browser/popup = new(user, "Slime Extractor", "Slime Extractor", src) + popup.set_content(dat) + popup.open() + return + + +/obj/machinery/slime/extractor/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + switch(href_list["action"]) + if ("extract") + extract_cores() + if("eject") + eject_slime() + src.updateUsrDialog() + return + //Circuit board below, /obj/item/weapon/circuitboard/slimeextractor name = T_BOARD("Slime extractor") diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index 8881099ab01..d39f791cb7c 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -56,9 +56,11 @@ data["activity"] = active data["beaker"] = injector.beaker + if(injector.occupant) + data["occupied"] = 1 if(isxeno(injector.occupant)) var/mob/living/simple_animal/xeno/X = injector.occupant - data["instability"] = (X.mut_level / X.mut_max) + data["instability"] = (X.mut_level / X.mut_max) * 100 else data["instability"] = null diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index c191e856ed9..4939e1e92f0 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -39,21 +39,22 @@ return ..() if(core) - user << "The [src] is already filled!" + user << "[src] is already filled!" return if(panel_open) user << "Close the panel first!" core = G + user.drop_from_inventory(G) G.forceMove(src) update_light_color() /obj/machinery/slime/replicator/proc/update_light_color() if(src.core && !(inuse)) - set_light(4, 4, occupiedcolor) + set_light(1, 1, occupiedcolor) else if(src.core) - set_light(4, 4, operatingcolor) + set_light(1, 1, operatingcolor) else - set_light(4, 4, emptycolor) + set_light(1, 1, emptycolor) /obj/machinery/slime/replicator/proc/replicate_slime() if(!src.core) @@ -67,22 +68,63 @@ spawn(30) var/mob/living/simple_animal/xeno/slime/S = new(src) S.traitdat = core.traits + S.ProcessTraits() qdel(core) spawn(30) inuse = 0 - eject_contents() + eject_slime() icon_state = "restruct_0" update_light_color() + src.updateUsrDialog() -/obj/machinery/slime/replicator/proc/eject_contents() +/obj/machinery/slime/replicator/proc/eject_slime() for(var/mob/thing in contents) thing.forceMove(loc) + +/obj/machinery/slime/replicator/proc/eject_core() if(core) core.forceMove(loc) core = null + +/obj/machinery/slime/replicator/proc/eject_contents() + eject_slime() + eject_core() //Here lies the UI +/obj/machinery/slime/replicator/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) +/obj/machinery/slime/replicator/interact(mob/user as mob) + var/dat = "" + if(!inuse) + dat = {" + Slime core container holds:
+ [core]
+ "} + if (core && !(stat & (NOPOWER|BROKEN))) + dat += "Start the replication process
" + if(core) + dat += "Eject the core
" + else + dat += "Please wait..." + var/datum/browser/popup = new(user, "Slime Replicator", "Slime Replicator", src) + popup.set_content(dat) + popup.open() + return + + +/obj/machinery/slime/replicator/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + switch(href_list["action"]) + if ("replicate") + replicate_slime() + if("eject") + eject_core() + src.updateUsrDialog() + return //Circuit board below, /obj/item/weapon/circuitboard/slimereplicator diff --git a/code/modules/xenobio2/mob/slime/slime life.dm b/code/modules/xenobio2/mob/slime/slime life.dm index 9638931f3ce..4853454476f 100644 --- a/code/modules/xenobio2/mob/slime/slime life.dm +++ b/code/modules/xenobio2/mob/slime/slime life.dm @@ -50,6 +50,6 @@ Slime specific life events go here. icon_state = "slime adult dead" color = traitdat.traits[TRAIT_XENO_COLOR] - return 1 //Everything worked okay + return 0 //Everything worked okay - return 0 //xeno/Life() returned 0. \ No newline at end of file + return //xeno/Life() returned 0. \ No newline at end of file diff --git a/code/modules/xenobio2/mob/slime/slime procs.dm b/code/modules/xenobio2/mob/slime/slime procs.dm index 411c66df583..10d500c0156 100644 --- a/code/modules/xenobio2/mob/slime/slime procs.dm +++ b/code/modules/xenobio2/mob/slime/slime procs.dm @@ -18,14 +18,13 @@ Slime specific procs go here. traitdat.traits[TRAIT_XENO_HOSTILE] = 0 else traitdat.traits[TRAIT_XENO_HOSTILE] = prob(30) - traitdat.traits[TRAIT_XENO_GLOW_STRENGTH] = round(rand(1,6)) - traitdat.traits[TRAIT_XENO_GLOW_RANGE] = round(rand(1,6)) + traitdat.traits[TRAIT_XENO_GLOW_STRENGTH] = round(rand(1,3)) + traitdat.traits[TRAIT_XENO_GLOW_RANGE] = round(rand(1,3)) traitdat.traits[TRAIT_XENO_STRENGTH] = round(rand(4,9)) traitdat.traits[TRAIT_XENO_STR_RANGE] =round(rand(0,2)) traitdat.traits[TRAIT_XENO_CANLEARN] = prob(68) traitdat.traits[TRAIT_XENO_SPEED] = round(rand(-10,10)) - //RandomChemicals() /mob/living/simple_animal/xeno/slime/proc/GrowUp() @@ -101,7 +100,7 @@ Slime specific procs go here. return if(reagents.total_volume <= 0) return - /*if(reagents.has_reagent("docilitytoxin")) //Toxin that makes them docile? Good for quelling angry mobs. + if(reagents.has_reagent("docilitytoxin")) //Toxin that makes them docile? Good for quelling angry mobs. hostile = 0 - traitdat.traits[TRAIT_XENO_HOSTILE] = 0*/ + traitdat.traits[TRAIT_XENO_HOSTILE] = 0 ..() \ No newline at end of file diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm index 36655a59beb..65444f7aaa6 100644 --- a/code/modules/xenobio2/mob/slime/slime.dm +++ b/code/modules/xenobio2/mob/slime/slime.dm @@ -22,6 +22,9 @@ Slime definitions, Life and New live here. move_to_delay = 17 //Slimes shouldn't be able to go faster than humans. default_chems = list("slimejelly" = 5) attacktext = "absorbed some of" + response_help = "pats" + response_disarm = "tries to stop" + response_harm = "hits" var/emote_on = null @@ -80,6 +83,9 @@ Slime definitions, Life and New live here. for(var/datum/language/L in (typesof(/datum/language) - /datum/language)) languages += L speak += "[station_name()]?" + resistances[BURN] = 4 + resistances[BRUTE] = 0.2 + resistances[TOX] = 1.5 GenerateChild() return 1 \ No newline at end of file diff --git a/code/modules/xenobio2/mob/slime/slime_core.dm b/code/modules/xenobio2/mob/slime/slime_core.dm index 3e6fddf722e..fff19a231f5 100644 --- a/code/modules/xenobio2/mob/slime/slime_core.dm +++ b/code/modules/xenobio2/mob/slime/slime_core.dm @@ -8,10 +8,5 @@ Slime core lives here. icon_state = "slime extract" source = "Slime" product = "core" - -/obj/item/xenoproduct/slime/core/New() - ..() - color = traits.get_trait(TRAIT_XENO_COLOR) - if(traits.get_trait(TRAIT_XENO_BIOLUMESCENT)) - set_light(traits.get_trait(TRAIT_XENO_GLOW_STRENGTH),traits.get_trait(TRAIT_XENO_GLOW_RANGE),traits.get_trait(TRAIT_XENO_BIO_COLOR)) + \ No newline at end of file diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm new file mode 100644 index 00000000000..c88afd7651a --- /dev/null +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -0,0 +1,65 @@ +/* +Slime cube lives here. +*/ +/obj/item/slime_cube + name = "slimy monkey cube" + desc = "Wonder what might come out of this." + icon = 'icons/mob/slime2.dmi' + icon_state = "slime cube" + var/searching = 0 + +/obj/item/slime_cube/attack_self(mob/user as mob) + if(!searching) + user << "You stare at the slimy cube, watching as some activity occurs." + icon_state = "slime cube active" + searching = 1 + request_player() + spawn(600) reset_search() + +/obj/item/slime_cube/proc/request_player() + for(var/mob/observer/dead/O in player_list) + if(!O.MayRespawn()) + continue + if(O.client) + if(O.client.prefs.be_special & BE_ALIEN) + question(O.client) + +/obj/item/slime_cube/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a soul for a promethean. Would you like to play as one?", "Promethean request", "Yes", "No", "Never for this round") + if(response == "Yes") + response = alert(C, "Are you sure you want to play as a promethean?", "Promethean request", "Yes", "No") + if(!C || 2 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_ALIEN + +/obj/item/slime_cube/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + icon_state = "slime cube" + if(searching == 1) + searching = 0 + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("The activity in the cube dies down. Maybe it will spark another time.") + +/obj/item/slime_cube/proc/transfer_personality(var/mob/candidate) + announce_ghost_joinleave(candidate, 0, "They are a promethean now.") + src.searching = 2 + var/mob/living/carbon/human/S = new(get_turf(src)) + S. << "You are a promethean, brought into existence on [station_name()]." + S.mind.assigned_role = "Promethean" + S.set_species("Promethean") + S.shapeshifter_set_colour("#05FF9B") + var/newname = sanitize(input(S, "You are a Promethean. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) + if (newname) + S.real_name = newname + S.name = S.real_name + S.dna.real_name = newname + if(S.mind) S.mind.name = S.name + + for(var/mob/M in viewers(get_turf_or_move(loc))) + M.show_message("The monkey cube suddenly takes the shape of a man!") + qdel(src) + \ No newline at end of file diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm index 94469269170..35ba792c727 100644 --- a/code/modules/xenobio2/mob/xeno procs.dm +++ b/code/modules/xenobio2/mob/xeno procs.dm @@ -93,13 +93,7 @@ Procs for targeting for(var/i=0, i<6, i++) traitdat.traits[TRAIT_XENO_COLOR] += pick(hexNums) - traitdat.chems.reagents.clear_reagents() - for(var/R in default_chems) - traitdat.chems.reagents.add_reagent("[R]", default_chems[R]) - var/amount_of_chems = rand(1,6) - for(var/i = 0,i <= amount_of_chems, i++) - var/datum/reagent/R = pick(xenoChemList) - traitdat.chems.reagents.add_reagent(R, round(rand(1,10))) + RandomChemicals() //if(SPECIESMUT & mutable) //Placeholder, currently no xenos that have species mutations. RandomizeTraits() @@ -132,8 +126,9 @@ Procs for targeting if(prob(traitdat.get_trait(TRAIT_XENO_LEARNCHANCE)) && traitdat.get_trait(TRAIT_XENO_CANLEARN)) var/chosen = pick(speech_buffer) speak.Add(chosen) + /* Uncoment for logging of speech list. log_debug("Added [chosen] to speak list.") - log_debug("Speechlist cut.") + log_debug("Speechlist cut.") */ speech_buffer.Cut() // /mob/living/simple_animal/xeno/proc/BuildReagentLists() @@ -156,7 +151,7 @@ Procs for targeting ..() /mob/living/simple_animal/xeno/proc/RandomChemicals() - traitdat.chemlist.Cut() //Clear the amount first. + traitdat.chems.Cut() //Clear the amount first. var/num_chems = round(rand(1,4)) var/list/chemchoices = xenoChemList @@ -165,6 +160,6 @@ Procs for targeting var/chemtype = pick(chemchoices) chemchoices -= chemtype var/chemamount = rand(1,5) - traitdat.chemlist[chemtype] = chemamount + traitdat.chems[chemtype] = chemamount - traitdat.chemlist += default_chems + traitdat.chems += default_chems diff --git a/code/modules/xenobio2/mob/xeno.dm b/code/modules/xenobio2/mob/xeno.dm index be0191f71ad..7b1bf7dfac2 100644 --- a/code/modules/xenobio2/mob/xeno.dm +++ b/code/modules/xenobio2/mob/xeno.dm @@ -58,6 +58,7 @@ Also includes Life and New handle_reagents() if((mut_level >= mut_max) && !(mutable & NOMUT)) Mutate() + mut_level -= mut_max ProcessSpeechBuffer() @@ -87,7 +88,7 @@ Also includes Life and New temp_chem_holder.create_reagents(20) nutrition = 350 for(var/R in default_chems) - traitdat.chems.reagents.add_reagent("[R]", default_chems[R]) + traitdat.chems[R] = default_chems[R] traitdat.source = name diff --git a/icons/mob/slime2.dmi b/icons/mob/slime2.dmi index 50d7ca9443bcc76a34890830954b18a03de54a86..33ef237cba47742e6bbe9e607185ed15a5747ff3 100644 GIT binary patch literal 6277 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 literal 4768 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 NeeFB9K59OU_%~>2^soQ` diff --git a/nano/templates/xenobio_computer.tmpl b/nano/templates/xenobio_computer.tmpl index eaf9a8526df..9cf053cddd4 100644 --- a/nano/templates/xenobio_computer.tmpl +++ b/nano/templates/xenobio_computer.tmpl @@ -17,26 +17,33 @@ Used In File(s): \code\modules\xenobio2\machines\injector_computer.dm

Sensor Readings:

-
-
- Instability: + {{if data.occupied}} +
+
+ Instability: +
+
+ {{if data.instability}} + {{:data.instability}}% + {{else}} + ERRR% Please contact your local technician for assistance. + {{/if}} +
+
+ Occupant Health: +
+
+ {{if data.occupantHealth}} + {{:data.occupantHealth}}/{{:data.occupantHealthMax}} + {{else}} + ERRR% Please contact your local technician for assistance. + {{/if}} + {{else}} +
+
+ Injector is not occupied.
-
- {{if data.instability}} - {{:data.instability}}% - {{else}} - ERRR% Please contact your local technician for assistance. - {{/if}} -
-
- Occupant Health: -
-
- {{if data.occupantHealth}} - {{:data.occupantHealth}}/{{:data.occupantHealthMax}} - {{else}} - ERRR% Please contact your local technician for assistance. - {{/if}} + {{/if}}
diff --git a/polaris.dme b/polaris.dme index c7c2bea48b6..91a8c27b4d9 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1904,6 +1904,7 @@ #include "code\modules\xenobio2\mob\slime\slime procs.dm" #include "code\modules\xenobio2\mob\slime\slime.dm" #include "code\modules\xenobio2\mob\slime\slime_core.dm" +#include "code\modules\xenobio2\mob\slime\slime_monkey.dm" #include "code\modules\xenobio2\tools\slime_handling_tools.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm"