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