diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 0974a705ce..6f4f82b8b8 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 69eb6de378..4cf07f35f6 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 0022026a67..bc0072511a 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 8146069f5c..e9c3df5098 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 c958256777..1e5d46175e 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 d9219a7e61..a67169a282 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 8881099ab0..d39f791cb7 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 c191e856ed..4939e1e92f 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 9638931f3c..4853454476 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 411c66df58..10d500c015 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 36655a59be..65444f7aaa 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 3e6fddf722..fff19a231f 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 0000000000..c88afd7651 --- /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 9446926917..35ba792c72 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 be0191f71a..7b1bf7dfac 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 50d7ca9443..33ef237cba 100644 Binary files a/icons/mob/slime2.dmi and b/icons/mob/slime2.dmi differ diff --git a/nano/templates/xenobio_computer.tmpl b/nano/templates/xenobio_computer.tmpl index eaf9a8526d..9cf053cddd 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 c7c2bea48b..91a8c27b4d 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"