mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-09 16:07:40 +00:00
Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13
This commit is contained in:
@@ -46,10 +46,15 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
|
||||
":thinking:",
|
||||
"Alien",
|
||||
"Angel",
|
||||
"Angryface",
|
||||
"AtlantisCZE",
|
||||
"Banned",
|
||||
"Bliss",
|
||||
"Blue",
|
||||
"Clown",
|
||||
"Boy",
|
||||
"Boy-Malf",
|
||||
"Girl",
|
||||
"Girl-Malf",
|
||||
"Database",
|
||||
"Dorf",
|
||||
"Firewall",
|
||||
@@ -61,26 +66,44 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
|
||||
"Hades",
|
||||
"Heartline",
|
||||
"Helios",
|
||||
"Hotdog",
|
||||
"Hourglass",
|
||||
"House",
|
||||
"Inverted",
|
||||
"Jack",
|
||||
"Matrix",
|
||||
"Monochrome",
|
||||
"Mothman",
|
||||
"Murica",
|
||||
"Nanotrasen",
|
||||
"Not Malf",
|
||||
"Patriot",
|
||||
"Pirate",
|
||||
"President",
|
||||
"Random",
|
||||
"Rainbow",
|
||||
"Red",
|
||||
"Clown",
|
||||
"Random",
|
||||
"Ravensdale",
|
||||
"Red October",
|
||||
"Red",
|
||||
"Royal",
|
||||
"Searif",
|
||||
"Serithi",
|
||||
"SilveryFerret",
|
||||
"Smiley",
|
||||
"Static",
|
||||
"Syndicat Meow",
|
||||
"TechDemon",
|
||||
"Terminal",
|
||||
"Text",
|
||||
"Too Deep",
|
||||
"Triumvirate",
|
||||
"Triumvirate-M",
|
||||
"Weird"))
|
||||
"Wasp",
|
||||
"Weird",
|
||||
"Xerxes",
|
||||
"Yes-Man"
|
||||
))
|
||||
|
||||
/proc/resolve_ai_icon(input)
|
||||
if(!input || !(input in GLOB.ai_core_display_screens))
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
density = FALSE
|
||||
state_open = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/sleeper
|
||||
req_access = list(ACCESS_CMO) //Used for reagent deletion and addition of non medicines
|
||||
var/efficiency = 1
|
||||
var/min_health = -25
|
||||
var/list/available_chems
|
||||
@@ -28,9 +29,28 @@
|
||||
|
||||
/obj/machinery/sleeper/Initialize()
|
||||
. = ..()
|
||||
create_reagents(500, NO_REACT)
|
||||
occupant_typecache = GLOB.typecache_living
|
||||
update_icon()
|
||||
reset_chem_buttons()
|
||||
RefreshParts()
|
||||
add_inital_chems()
|
||||
|
||||
/obj/machinery/sleeper/Destroy()
|
||||
var/obj/item/reagent_containers/sleeper_buffer/buffer = new /obj/item/reagent_containers/sleeper_buffer(loc)
|
||||
buffer.volume = reagents.maximum_volume
|
||||
buffer.reagents.maximum_volume = reagents.maximum_volume
|
||||
reagents.trans_to(buffer.reagents, reagents.total_volume)
|
||||
..()
|
||||
|
||||
/obj/machinery/sleeper/proc/add_inital_chems()
|
||||
for(var/i in available_chems)
|
||||
var/datum/reagent/R = reagents.has_reagent(i)
|
||||
if(!R)
|
||||
reagents.add_reagent(i, (20))
|
||||
continue
|
||||
if(R.volume < 20)
|
||||
reagents.add_reagent(i, (20 - R.volume))
|
||||
|
||||
/obj/machinery/sleeper/RefreshParts()
|
||||
var/E
|
||||
@@ -47,6 +67,11 @@
|
||||
available_chems |= possible_chems[i]
|
||||
reset_chem_buttons()
|
||||
|
||||
//Total container size 500 - 2000u
|
||||
if(reagents)
|
||||
reagents.maximum_volume = (500*E)
|
||||
|
||||
|
||||
/obj/machinery/sleeper/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
if(state_open)
|
||||
@@ -81,7 +106,42 @@
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(is_operational() && occupant)
|
||||
var/datum/reagent/R = pick(reagents.reagent_list)
|
||||
inject_chem(R.id, occupant)
|
||||
open_machine()
|
||||
//Is this too much?
|
||||
if(severity == EMP_HEAVY)
|
||||
var/chem = pick(available_chems)
|
||||
available_chems -= chem
|
||||
available_chems += get_random_reagent_id()
|
||||
reset_chem_buttons()
|
||||
|
||||
/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/reagent_containers/sleeper_buffer))
|
||||
var/obj/item/reagent_containers/sleeper_buffer/SB = I
|
||||
if((SB.reagents.total_volume + reagents.total_volume) < reagents.maximum_volume)
|
||||
SB.reagents.trans_to(reagents, SB.reagents.total_volume)
|
||||
visible_message("[user] places the [SB] into the [src].")
|
||||
qdel(SB)
|
||||
return
|
||||
else
|
||||
SB.reagents.trans_to(reagents, SB.reagents.total_volume)
|
||||
visible_message("[user] adds as much as they can to the [src] from the [SB].")
|
||||
return
|
||||
if(istype(I, /obj/item/reagent_containers))
|
||||
var/obj/item/reagent_containers/RC = I
|
||||
if(RC.reagents.total_volume == 0)
|
||||
to_chat(user, "<span class='notice'>The [I] is empty!</span>")
|
||||
for(var/datum/reagent/R in RC.reagents.reagent_list)
|
||||
if((obj_flags & EMAGGED) || (allowed(usr)))
|
||||
break
|
||||
if(!istype(R, /datum/reagent/medicine))
|
||||
visible_message("The [src] gives out a hearty boop and rejects the [I]. The Sleeper's screen flashes with a pompous \"Medicines only, please.\"")
|
||||
return
|
||||
RC.reagents.trans_to(reagents, 1000)
|
||||
visible_message("[user] adds as much as they can to the [src] from the [I].")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
|
||||
@@ -141,18 +201,24 @@
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "sleeper", name, 375, 550, master_ui, state)
|
||||
ui = new(user, src, ui_key, "sleeper", name, 550, 700, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/sleeper/ui_data()
|
||||
var/list/data = list()
|
||||
data["occupied"] = occupant ? 1 : 0
|
||||
data["open"] = state_open
|
||||
data["efficiency"] = efficiency
|
||||
data["current_vol"] = reagents.total_volume
|
||||
data["tot_capacity"] = reagents.maximum_volume
|
||||
|
||||
data["chems"] = list()
|
||||
for(var/chem in available_chems)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[chem]
|
||||
data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem)))
|
||||
var/datum/reagent/R = reagents.has_reagent(chem)
|
||||
R = GLOB.chemical_reagents_list[chem]
|
||||
data["synthchems"] += list(list("name" = R.name, "id" = R.id, "synth_allowed" = synth_allowed(chem)))
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
data["chems"] += list(list("name" = R.name, "id" = R.id, "vol" = R.volume, "purity" = R.purity, "allowed" = chem_allowed(R.id)))
|
||||
|
||||
data["occupant"] = list()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
@@ -184,8 +250,15 @@
|
||||
if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
|
||||
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
|
||||
data["occupant"]["failing_organs"] = list()
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
if(C)
|
||||
for(var/obj/item/organ/Or in C.getFailingOrgans())
|
||||
if(istype(Or, /obj/item/organ/brain))
|
||||
continue
|
||||
data["occupant"]["failing_organs"] += list(list("name" = Or.name))
|
||||
|
||||
if(mob_occupant.has_dna()) // Blood-stuff is mostly a copy-paste from the healthscanner.
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
var/blood_id = C.get_blood_id()
|
||||
if(blood_id)
|
||||
data["occupant"]["blood"] = list() // We can start populating this list.
|
||||
@@ -196,7 +269,7 @@
|
||||
blood_type = R.name
|
||||
else
|
||||
blood_type = blood_id
|
||||
data["occupant"]["blood"]["maxBloodVolume"] = BLOOD_VOLUME_NORMAL
|
||||
data["occupant"]["blood"]["maxBloodVolume"] = (BLOOD_VOLUME_NORMAL*C.blood_ratio)
|
||||
data["occupant"]["blood"]["currentBloodVolume"] = C.blood_volume
|
||||
data["occupant"]["blood"]["dangerBloodVolume"] = BLOOD_VOLUME_SAFE
|
||||
data["occupant"]["blood"]["bloodType"] = blood_type
|
||||
@@ -216,24 +289,49 @@
|
||||
. = TRUE
|
||||
if("inject")
|
||||
var/chem = params["chem"]
|
||||
var/amount = text2num(params["volume"])
|
||||
if(!is_operational() || !mob_occupant)
|
||||
return
|
||||
if(mob_occupant.health < min_health && chem != "epinephrine")
|
||||
return
|
||||
if(inject_chem(chem, usr))
|
||||
if(inject_chem(chem, usr, amount))
|
||||
. = TRUE
|
||||
if(scrambled_chems && prob(5))
|
||||
to_chat(usr, "<span class='warning'>Chemical system re-route detected, results may not be as expected!</span>")
|
||||
if("synth")
|
||||
var/chem = params["chem"]
|
||||
if(!is_operational())
|
||||
return
|
||||
reagents.add_reagent(chem_buttons[chem], 10) //other_purity = 0.75 for when the mechanics are in
|
||||
if("purge")
|
||||
var/chem = params["chem"]
|
||||
if(allowed(usr))
|
||||
if(!is_operational())
|
||||
return
|
||||
reagents.remove_reagent(chem, 10)
|
||||
return
|
||||
if(chem in available_chems)
|
||||
if(!is_operational())
|
||||
return
|
||||
/*var/datum/reagent/R = reagents.has_reagent(chem) //For when purity effects are in
|
||||
if(R.purity < 0.8)*/
|
||||
reagents.remove_reagent(chem, 10)
|
||||
else
|
||||
visible_message("<span class='warning'>Access Denied.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
|
||||
|
||||
/obj/machinery/sleeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
obj_flags |= EMAGGED
|
||||
scramble_chem_buttons()
|
||||
to_chat(user, "<span class='warning'>You scramble the sleeper's user interface!</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user)
|
||||
if((chem in available_chems) && chem_allowed(chem))
|
||||
occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU
|
||||
//trans to
|
||||
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user, volume = 10)
|
||||
if(chem_allowed(chem))
|
||||
reagents.trans_id_to(occupant, chem, volume)//emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU
|
||||
if(user)
|
||||
log_combat(user, occupant, "injected [chem] into", addition = "via [src]")
|
||||
return TRUE
|
||||
@@ -246,6 +344,14 @@
|
||||
var/occ_health = mob_occupant.health > min_health || chem == "epinephrine"
|
||||
return amount && occ_health
|
||||
|
||||
/obj/machinery/sleeper/proc/synth_allowed(chem)
|
||||
var/datum/reagent/R = reagents.has_reagent(chem)
|
||||
if(!R)
|
||||
return TRUE
|
||||
if(R.volume < 50)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/sleeper/proc/reset_chem_buttons()
|
||||
scrambled_chems = FALSE
|
||||
LAZYINITLIST(chem_buttons)
|
||||
|
||||
@@ -991,4 +991,4 @@
|
||||
/obj/item/stack/sheet/glass = 2,
|
||||
/obj/item/stock_parts/capacitor = 1,
|
||||
/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/reagent_containers/glass/beaker = 6) //So it can hold lots of chems
|
||||
/obj/item/reagent_containers/glass/beaker = 6) //So it can hold lots of chems
|
||||
|
||||
@@ -382,7 +382,7 @@
|
||||
results = list("neurotoxin" = 2)
|
||||
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
|
||||
//FermiChem vars: Easy to make, but hard to make potent
|
||||
OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMin = 100 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMax = 950 // Upper end for above
|
||||
ExplodeTemp = 999 //Temperature at which reaction explodes
|
||||
OptimalpHMin = 4.6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
|
||||
|
||||
@@ -1,79 +1,79 @@
|
||||
/obj/item/seeds/cotton
|
||||
name = "pack of cotton seeds"
|
||||
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
|
||||
icon_state = "seed-cotton"
|
||||
species = "cotton"
|
||||
plantname = "Cotton"
|
||||
icon_harvest = "cotton-harvest"
|
||||
product = /obj/item/grown/cotton
|
||||
lifespan = 35
|
||||
endurance = 25
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
mutatelist = list(/obj/item/seeds/cotton/durathread)
|
||||
|
||||
/obj/item/grown/cotton
|
||||
seed = /obj/item/seeds/cotton
|
||||
name = "cotton bundle"
|
||||
desc = "A fluffy bundle of cotton."
|
||||
icon_state = "cotton"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("pomfed")
|
||||
var/cotton_type = /obj/item/stack/sheet/cotton
|
||||
var/cotton_name = "raw cotton"
|
||||
|
||||
/obj/item/grown/cotton/attack_self(mob/user)
|
||||
user.show_message("<span class='notice'>You pull some [cotton_name] out of the [name]!</span>", 1)
|
||||
var/seed_modifier = 0
|
||||
if(seed)
|
||||
seed_modifier = round(seed.potency / 25)
|
||||
var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
|
||||
var/old_cotton_amount = cotton.amount
|
||||
for(var/obj/item/stack/ST in user.loc)
|
||||
if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
|
||||
ST.attackby(cotton, user)
|
||||
if(cotton.amount > old_cotton_amount)
|
||||
to_chat(user, "<span class='notice'>You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].</span>")
|
||||
qdel(src)
|
||||
|
||||
//reinforced mutated variant
|
||||
/obj/item/seeds/cotton/durathread
|
||||
name = "pack of durathread seeds"
|
||||
desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
|
||||
icon_state = "seed-durathread"
|
||||
species = "durathread"
|
||||
plantname = "Durathread"
|
||||
icon_harvest = "durathread-harvest"
|
||||
product = /obj/item/grown/cotton/durathread
|
||||
lifespan = 80
|
||||
endurance = 50
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
|
||||
/obj/item/grown/cotton/durathread
|
||||
seed = /obj/item/seeds/cotton/durathread
|
||||
name = "durathread bundle"
|
||||
desc = "A tough bundle of durathread, good luck unraveling this."
|
||||
icon_state = "durathread"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
|
||||
cotton_type = /obj/item/stack/sheet/cotton/durathread
|
||||
cotton_name = "raw durathread"
|
||||
/obj/item/seeds/cotton
|
||||
name = "pack of cotton seeds"
|
||||
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
|
||||
icon_state = "seed-cotton"
|
||||
species = "cotton"
|
||||
plantname = "Cotton"
|
||||
icon_harvest = "cotton-harvest"
|
||||
product = /obj/item/grown/cotton
|
||||
lifespan = 35
|
||||
endurance = 25
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
mutatelist = list(/obj/item/seeds/cotton/durathread)
|
||||
|
||||
/obj/item/grown/cotton
|
||||
seed = /obj/item/seeds/cotton
|
||||
name = "cotton bundle"
|
||||
desc = "A fluffy bundle of cotton."
|
||||
icon_state = "cotton"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("pomfed")
|
||||
var/cotton_type = /obj/item/stack/sheet/cotton
|
||||
var/cotton_name = "raw cotton"
|
||||
|
||||
/obj/item/grown/cotton/attack_self(mob/user)
|
||||
user.show_message("<span class='notice'>You pull some [cotton_name] out of the [name]!</span>", 1)
|
||||
var/seed_modifier = 0
|
||||
if(seed)
|
||||
seed_modifier = round(seed.potency / 25)
|
||||
var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
|
||||
var/old_cotton_amount = cotton.amount
|
||||
for(var/obj/item/stack/ST in user.loc)
|
||||
if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
|
||||
ST.attackby(cotton, user)
|
||||
if(cotton.amount > old_cotton_amount)
|
||||
to_chat(user, "<span class='notice'>You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].</span>")
|
||||
qdel(src)
|
||||
|
||||
//reinforced mutated variant
|
||||
/obj/item/seeds/cotton/durathread
|
||||
name = "pack of durathread seeds"
|
||||
desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
|
||||
icon_state = "seed-durathread"
|
||||
species = "durathread"
|
||||
plantname = "Durathread"
|
||||
icon_harvest = "durathread-harvest"
|
||||
product = /obj/item/grown/cotton/durathread
|
||||
lifespan = 80
|
||||
endurance = 50
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
|
||||
/obj/item/grown/cotton/durathread
|
||||
seed = /obj/item/seeds/cotton/durathread
|
||||
name = "durathread bundle"
|
||||
desc = "A tough bundle of durathread, good luck unraveling this."
|
||||
icon_state = "durathread"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
|
||||
cotton_type = /obj/item/stack/sheet/cotton/durathread
|
||||
cotton_name = "raw durathread"
|
||||
|
||||
@@ -157,6 +157,11 @@
|
||||
O.applyOrganDamage(amount, maximum)
|
||||
O.onDamage(amount, maximum)
|
||||
|
||||
/mob/living/carbon/proc/getFailingOrgans()
|
||||
.=list()
|
||||
for(var/obj/item/organ/O in internal_organs)
|
||||
if(O.organ_flags & ORGAN_FAILING)
|
||||
.+=O
|
||||
|
||||
////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -272,11 +272,11 @@
|
||||
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
|
||||
|
||||
if(reagents.has_reagent("astral"))
|
||||
msg += "[t_He] have wild, spacey eyes"
|
||||
msg += "[t_He] has wild, spacey eyes"
|
||||
if(mind)
|
||||
msg += " and have a strange, abnormal look to them.\n"
|
||||
msg += " and they have a strange, abnormal look to them.\n"
|
||||
else
|
||||
msg += " and don't look like they're all there.\n"
|
||||
msg += " and they don't look like they're all there.\n"
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/can_be_carded = TRUE
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon//Default is assigned when AI is created.
|
||||
var/icon/holo_icon//Female is assigned when AI is created.
|
||||
var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
set_core_display_icon()
|
||||
|
||||
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
|
||||
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"female"))
|
||||
|
||||
spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
@@ -670,10 +670,13 @@
|
||||
holo_icon = getHologramIcon(icon(icon_list[input], input))
|
||||
else
|
||||
var/list/icon_list = list(
|
||||
"default" = 'icons/mob/ai.dmi',
|
||||
"female" = 'icons/mob/ai.dmi',
|
||||
"male" = 'icons/mob/ai.dmi',
|
||||
"floating face" = 'icons/mob/ai.dmi',
|
||||
"green face" = 'icons/mob/ai.dmi',
|
||||
"xeno queen" = 'icons/mob/alien.dmi',
|
||||
"horror" = 'icons/mob/ai.dmi'
|
||||
"horror" = 'icons/mob/ai.dmi',
|
||||
"creature" = 'icons/mob/ai.dmi'
|
||||
)
|
||||
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
|
||||
@@ -57,3 +57,9 @@
|
||||
return
|
||||
to_chat(A, "[src] projects into your mind, <b><i> \"[message]\"</b></i>")
|
||||
log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]")
|
||||
|
||||
//Delete the mob if there's no mind! Pay that mob no mind.
|
||||
/mob/living/simple_animal/astral/Life()
|
||||
if(!mind)
|
||||
qdel(src)
|
||||
. = ..()
|
||||
|
||||
@@ -310,6 +310,7 @@
|
||||
emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.")
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
var/pseudo_death = FALSE
|
||||
var/mob/living/carbon/human/origin
|
||||
|
||||
/mob/living/simple_animal/pet/cat/custom_cat/death()
|
||||
if (pseudo_death == TRUE) //secret cat chem
|
||||
|
||||
@@ -217,6 +217,7 @@
|
||||
glass_icon_state = "glass_white"
|
||||
glass_name = "glass of milk"
|
||||
glass_desc = "White and nutritious goodness!"
|
||||
pH = 6.5
|
||||
|
||||
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
|
||||
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
|
||||
|
||||
11
code/modules/reagents/reagent_containers/sleeper_buffer.dm
Normal file
11
code/modules/reagents/reagent_containers/sleeper_buffer.dm
Normal file
@@ -0,0 +1,11 @@
|
||||
//Created if a sleeper is deconstructed, to contain the reagents within it.
|
||||
/obj/item/reagent_containers/sleeper_buffer
|
||||
name = "Sleeper buffer container"
|
||||
desc = "A closed container for insertion in the Medical Sleepers."
|
||||
icon_state = "sleeper_buffer"
|
||||
volume = 500
|
||||
reagent_flags = NO_REACT
|
||||
spillable = TRUE
|
||||
resistance_flags = ACID_PROOF
|
||||
amount_per_transfer_from_this = 0
|
||||
possible_transfer_amounts = list(0)
|
||||
@@ -504,7 +504,7 @@
|
||||
desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution."
|
||||
id = "pHmeter"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100)
|
||||
materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_PLASTIC = 100)
|
||||
build_path = /obj/item/fermichem/pHmeter
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
@@ -61,6 +61,9 @@
|
||||
/datum/nanite_program/purging/active_effect()
|
||||
host_mob.adjustToxLoss(-1)
|
||||
for(var/datum/reagent/R in host_mob.reagents.reagent_list)
|
||||
if(R.id == "nanite_b_gone")
|
||||
host_mob.adjustToxLoss(4)
|
||||
continue
|
||||
host_mob.reagents.remove_reagent(R.id,1)
|
||||
|
||||
/datum/nanite_program/brain_heal
|
||||
|
||||
@@ -749,17 +749,17 @@
|
||||
to_chat(world, "[user]'s power is [power_multiplier].")
|
||||
|
||||
//Mixables
|
||||
var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara")
|
||||
var/static/regex/reward_words = regex("good boy|good girl|good pet|good job")
|
||||
var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job")
|
||||
var/static/regex/enthral_words = regex("relax|obey|love|serve|so easy|ara ara")
|
||||
var/static/regex/reward_words = regex("good boy|good girl|good pet|good job|splendid|jolly good|bloody brilliant")
|
||||
var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job|spot of bother|gone and done it now|blast it|buggered it up")
|
||||
//phase 0
|
||||
var/static/regex/saymyname_words = regex("say my name|who am i|whoami")
|
||||
var/static/regex/wakeup_words = regex("revert|awaken|snap") //works
|
||||
var/static/regex/wakeup_words = regex("revert|awaken|snap|attention")
|
||||
//phase1
|
||||
var/static/regex/petstatus_words = regex("how are you|what is your status|are you okay")
|
||||
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush")
|
||||
var/static/regex/speak_words = regex("talk to me|speak")
|
||||
var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot
|
||||
var/static/regex/antiresist_words = regex("unable to resist|give in|stop being difficult")//useful if you think your target is resisting a lot
|
||||
var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting
|
||||
var/static/regex/forget_words = regex("forget|muddled|awake and forget")
|
||||
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
|
||||
@@ -768,11 +768,11 @@
|
||||
var/static/regex/awoo_words = regex("howl|awoo|bark")
|
||||
var/static/regex/nya_words = regex("nya|meow|mewl")
|
||||
var/static/regex/sleep_words = regex("sleep|slumber|rest")
|
||||
var/static/regex/strip_words = regex("strip|derobe|nude")
|
||||
var/static/regex/strip_words = regex("strip|derobe|nude|at ease|suit off")
|
||||
var/static/regex/walk_words = regex("slow down|walk")
|
||||
var/static/regex/run_words = regex("run|speed up")
|
||||
var/static/regex/liedown_words = regex("lie down") //TO ADD
|
||||
var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel")
|
||||
var/static/regex/liedown_words = regex("lie down")
|
||||
var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel|army crawl")
|
||||
//phase 3
|
||||
var/static/regex/statecustom_words = regex("state triggers|state your triggers")
|
||||
var/static/regex/custom_words = regex("new trigger|listen to me")
|
||||
@@ -780,14 +780,14 @@
|
||||
var/static/regex/custom_echo = regex("obsess|fills your mind|loop")
|
||||
var/static/regex/instill_words = regex("feel|entice|overwhel")
|
||||
var/static/regex/recognise_words = regex("recognise me|did you miss me?")
|
||||
var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed")
|
||||
var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die")
|
||||
var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed|word from hq")
|
||||
var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die|heroes never die")
|
||||
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
|
||||
var/static/regex/hallucinate_words = regex("get high|hallucinate")
|
||||
var/static/regex/hallucinate_words = regex("get high|hallucinate|trip balls")
|
||||
var/static/regex/hot_words = regex("heat|hot|hell")
|
||||
var/static/regex/cold_words = regex("cold|cool down|chill|freeze")
|
||||
var/static/regex/getup_words = regex("get up")
|
||||
var/static/regex/pacify_words = regex("more and more docile|complaisant|friendly|pacifist")
|
||||
var/static/regex/getup_words = regex("get up|hop to it")
|
||||
var/static/regex/pacify_words = regex("docile|complaisant|friendly|pacifist")
|
||||
var/static/regex/charge_words = regex("charge|oorah|attack")
|
||||
|
||||
var/distancelist = list(2,2,1.5,1.3,1.15,1,0.8,0.6,0.5,0.25)
|
||||
@@ -1013,7 +1013,7 @@
|
||||
speaktrigger += "I'm really, really horny, "
|
||||
|
||||
//collar
|
||||
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
|
||||
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && H.client?.prefs.lewdchem)
|
||||
speaktrigger += "I love the collar you gave me, "
|
||||
//End
|
||||
if(H.client?.prefs.lewdchem)
|
||||
@@ -1249,6 +1249,9 @@
|
||||
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
|
||||
to_chat(user, "<span class='warning'>You need to be next to your pet to give them a new trigger!</b></span>")
|
||||
continue
|
||||
if(!H.client?.prefs.lewdchem)
|
||||
to_chat(user, "<span class='warning'>[H] seems incapable of being implanted with triggers.</b></span>")
|
||||
continue
|
||||
else
|
||||
user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
|
||||
user.SetStun(1000)//Hands are handy, so you have to stay still
|
||||
@@ -1287,6 +1290,9 @@
|
||||
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
|
||||
to_chat(user, "<span class='warning'>You need to be next to your pet to give them a new echophrase!</b></span>")
|
||||
continue
|
||||
if(!H.client?.prefs.lewdchem)
|
||||
to_chat(user, "<span class='warning'>[H] seems incapable of being implanted with an echoing phrase.</b></span>")
|
||||
continue
|
||||
else
|
||||
user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
|
||||
user.SetStun(1000)//Hands are handy, so you have to stay still
|
||||
@@ -1342,8 +1348,8 @@
|
||||
for(var/V in listeners)
|
||||
var/mob/living/carbon/human/H = V
|
||||
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
if(E.phase == 3 && H.client?.prefs.lewdchem)
|
||||
var/instill = stripped_input(user, "Instill an emotion in your [(user.client?.prefs.lewdchem?"Your pet":"listener")].", MAX_MESSAGE_LEN)
|
||||
if(E.phase >= 3 && H.client?.prefs.lewdchem)
|
||||
var/instill = stripped_input(user, "Instill an emotion in [H].", MAX_MESSAGE_LEN)
|
||||
to_chat(H, "<i>[instill]</i>")
|
||||
to_chat(user, "<span class='notice'><i>You sucessfully instill a feeling in [H]</i></span>")
|
||||
log_game("FERMICHEM: [H] has been instilled by [user] with [instill] via MKUltra.")
|
||||
|
||||
5
html/changelogs/AutoChangeLog-pr-9268.yml
Normal file
5
html/changelogs/AutoChangeLog-pr-9268.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "Fermis"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Purity, Astral, RNG, MK, SMilk, SDGF, furranium, hatmium, eigen, nanite."
|
||||
- bugfix: "Eigen and purity."
|
||||
4
html/changelogs/AutoChangeLog-pr-9882.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-9882.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Fermis"
|
||||
delete-after: True
|
||||
changes:
|
||||
- refactor: "refactored sleepers!"
|
||||
4
html/changelogs/AutoChangeLog-pr-9920.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-9920.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "YakumoChen"
|
||||
delete-after: True
|
||||
changes:
|
||||
- imageadd: "New AI Holograms and Displays! Ported from /vg/station."
|
||||
BIN
icons/mob/AI.dmi
BIN
icons/mob/AI.dmi
Binary file not shown.
|
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 480 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 54 KiB |
@@ -26,8 +26,8 @@
|
||||
/datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M)
|
||||
log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]")
|
||||
originalmind.transfer_to(fermi_Clone)
|
||||
to_chat(owner, "<span class='warning'>Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.</span>")
|
||||
to_chat(M, "<span class='warning'>Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.</span>")
|
||||
to_chat(owner, "<span class='warning'>Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.</span>")
|
||||
to_chat(M, "<span class='warning'>Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.</span>")
|
||||
fermi_Clone = null
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -165,17 +165,49 @@
|
||||
owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
|
||||
owner.ResetBloodVol()
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// Astral INSURANCE
|
||||
///////////////////////////////////////////////
|
||||
//Makes sure people can't get trapped in each other's bodies if lag causes a deync between proc calls.
|
||||
|
||||
|
||||
/datum/status_effect/chem/astral_insurance
|
||||
id = "astral_insurance"
|
||||
var/mob/living/original
|
||||
var/datum/mind/originalmind
|
||||
alert_type = null
|
||||
|
||||
/datum/status_effect/chem/astral_insurance/tick(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(owner.reagents.has_reagent("astral"))
|
||||
return
|
||||
if(owner.mind == originalmind) //If they're home, let the chem deal with deletion.
|
||||
return
|
||||
if(owner.mind)
|
||||
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
|
||||
owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
to_chat(G, "<span class='warning'>[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'</b></span>")
|
||||
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
|
||||
originalmind.transfer_to(original)
|
||||
|
||||
/datum/status_effect/chem/astral_insurance/on_remove(mob/living/carbon/M) //God damnit get them home!
|
||||
if(owner.mind == originalmind) //If they're home, HOORAY
|
||||
return
|
||||
if(owner.mind)
|
||||
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
|
||||
owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
to_chat(G, "<span class='warning'>[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'</b></span>")
|
||||
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
|
||||
originalmind.transfer_to(original)
|
||||
|
||||
|
||||
|
||||
/*//////////////////////////////////////////
|
||||
Mind control functions
|
||||
Mind control functions!
|
||||
///////////////////////////////////////////
|
||||
*/
|
||||
|
||||
//Preamble
|
||||
/*
|
||||
/mob/living
|
||||
var/lewd = TRUE
|
||||
*/
|
||||
|
||||
/mob/living/verb/toggle_lewd()
|
||||
set category = "IC"
|
||||
@@ -596,7 +628,6 @@
|
||||
saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it."
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "<span class='notice'><i>[saytext]</i></span>"), 5)
|
||||
addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5)
|
||||
//(C.say(customTriggers[trigger][2]))//trigger3
|
||||
log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.")
|
||||
|
||||
|
||||
@@ -711,7 +742,7 @@
|
||||
deltaResist *= 1.25
|
||||
if (owner.reagents.has_reagent("neurine"))
|
||||
deltaResist *= 1.5
|
||||
if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused)
|
||||
if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused && owner.client?.prefs.lewdchem)
|
||||
if (owner.reagents.has_reagent("anaphro"))
|
||||
deltaResist *= 1.5
|
||||
if (owner.reagents.has_reagent("anaphro+"))
|
||||
@@ -720,7 +751,6 @@
|
||||
deltaResist *= 0.75
|
||||
if (owner.reagents.has_reagent("aphro+"))
|
||||
deltaResist *= 0.5
|
||||
|
||||
//Antag resistance
|
||||
//cultists are already brainwashed by their god
|
||||
if(iscultist(owner))
|
||||
|
||||
@@ -106,6 +106,10 @@
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY)
|
||||
fluid_max_volume += modifier*2.5
|
||||
fluid_rate += modifier/10
|
||||
if(reagents)
|
||||
reagents.maximum_volume = fluid_max_volume
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_size()
|
||||
@@ -336,4 +340,3 @@
|
||||
|
||||
for(var/L in relevant_layers)
|
||||
H.apply_overlay(L)
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@
|
||||
prev_size = cached_size
|
||||
cached_size = new_value
|
||||
update()
|
||||
..()
|
||||
|
||||
/obj/item/organ/genital/breasts/update_size()//wah
|
||||
var/rounded_cached = round(cached_size)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
prev_length = length
|
||||
length = CLAMP(length + modifier, min, max)
|
||||
update()
|
||||
..()
|
||||
|
||||
/obj/item/organ/genital/penis/update_size(modified = FALSE)
|
||||
if(length < 0)//I don't actually know what round() does to negative numbers, so to be safe!!
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/arousable = TRUE
|
||||
var/widescreenpref = TRUE
|
||||
var/autostand = TRUE
|
||||
var/lewdchem = TRUE
|
||||
var/lewdchem = FALSE
|
||||
|
||||
//vore prefs
|
||||
var/toggleeatingnoise = TRUE
|
||||
|
||||
@@ -132,7 +132,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
/datum/reagent/fermi/enthrall
|
||||
name = "MKUltra"
|
||||
id = "enthrall"
|
||||
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it."
|
||||
description = "A forbidden deep red mixture that increases a person's succeptability to another's words. When taken by the creator, it will enhance the draw of their voice to those affected by it."
|
||||
color = "#660015" // rgb: , 0, 255
|
||||
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
|
||||
overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please.
|
||||
@@ -194,7 +194,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
Vc.Remove(M)
|
||||
nVc.Insert(M)
|
||||
qdel(Vc)
|
||||
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle as your voice comes out in a more sultry tone.</span>")
|
||||
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.)]</span>")
|
||||
else
|
||||
log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]")
|
||||
M.apply_status_effect(/datum/status_effect/chem/enthrall)
|
||||
@@ -203,9 +203,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way.
|
||||
if(volume < 0.5)//You don't get to escape that easily
|
||||
FallInLove(pick(GLOB.player_list), M)
|
||||
M.reagents.remove_reagent(id, volume)
|
||||
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
|
||||
if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak.
|
||||
@@ -254,22 +251,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.)
|
||||
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
|
||||
to_chat(M, "<span class='love'><i>You are unable to resist your own charms anymore, and become a full blown narcissist.</i></span>")
|
||||
/*Old way of handling, left in as an option B
|
||||
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
|
||||
for(var/mob/living/carbon/victim in seen)
|
||||
if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey
|
||||
seen = seen - victim
|
||||
if(!victim.ckey)
|
||||
seen = seen - victim
|
||||
var/mob/living/carbon/chosen = pick(seen)
|
||||
creatorID = chosen.ckey
|
||||
if (chosen.gender == "female")
|
||||
creatorGender = "Mistress"
|
||||
else
|
||||
creatorGender = "Master"
|
||||
creatorName = chosen.real_name
|
||||
creator = get_mob_by_key(creatorID)
|
||||
*/
|
||||
ADD_TRAIT(M, TRAIT_PACIFISM, "MKUltra")
|
||||
var/datum/status_effect/chem/enthrall/E
|
||||
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
|
||||
|
||||
@@ -46,13 +46,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
var/unitCheck = FALSE
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
taste_description = "a weird chemical fleshy flavour"
|
||||
//var/datum/status_effect/chem/SDGF/candidates/candies
|
||||
var/list/candies = list()
|
||||
//var/polling = FALSE
|
||||
var/list/result = list()
|
||||
var/list/group = null
|
||||
var/pollStarted = FALSE
|
||||
var/location_created
|
||||
var/startHunger
|
||||
impure_chem = "SDGFtox"
|
||||
inverse_chem_val = 0.5
|
||||
@@ -81,7 +76,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.dna.transfer_identity(SM)
|
||||
SM.updateappearance(mutcolor_update=1)
|
||||
|
||||
|
||||
//Process the willing ghosts, and make sure they're actually in the body when they're moved into it!
|
||||
candies = shuffle(candies)//Shake those ghosts up!
|
||||
for(var/mob/dead/observer/C2 in candies)
|
||||
if(C2.key && C2)
|
||||
@@ -131,7 +126,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.reagents.remove_reagent(id, volume)
|
||||
log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone")
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made")
|
||||
return
|
||||
return ..()
|
||||
|
||||
else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!).
|
||||
unitCheck = TRUE
|
||||
@@ -283,7 +278,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
name = "synthetic-derived healing factor"
|
||||
id = "SDGFheal"
|
||||
description = "Leftover SDGF is transferred into the resulting clone, which quickly heals up the stresses from suddenly splitting. Restores blood, nutrition, and repaires brain and clone damage quickly. Only obtainable from using excess SDGF, and only enters the cloned body."
|
||||
metabolization_rate = 1
|
||||
metabolization_rate = 0.8
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated)
|
||||
@@ -313,9 +308,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
id = "SDZF"
|
||||
description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. Emulates normal synthetic-derived growth factor, but produces a hostile zombie at the end of it."
|
||||
color = "#a502e0" // rgb: 96, 0, 255
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 0.2 * REAGENTS_METABOLISM
|
||||
var/startHunger
|
||||
can_synth = TRUE
|
||||
taste_description = "a weird chemical fleshy flavour"
|
||||
chemical_flags = REAGENT_SNEAKYNAME
|
||||
|
||||
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
|
||||
@@ -372,5 +368,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Zombie clones made!")
|
||||
|
||||
if(87 to INFINITY)
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.adjustToxLoss(2, 0)
|
||||
M.reagents.remove_reagent(id, 1)
|
||||
..()
|
||||
|
||||
@@ -8,7 +8,7 @@ This ghost moves pretty quickly and is mostly invisible, but is still visible fo
|
||||
When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential.
|
||||
Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up)
|
||||
There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it.
|
||||
I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction.
|
||||
I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit chem and ask for some pills to quench your addiction.
|
||||
*/
|
||||
|
||||
|
||||
@@ -30,15 +30,26 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
var/sleepytime = 0
|
||||
inverse_chem_val = 0.25
|
||||
can_synth = FALSE
|
||||
var/datum/action/chem/astral/AS = new/datum/action/chem/astral()
|
||||
|
||||
/datum/action/chem/astral
|
||||
name = "Return to body"
|
||||
var/mob/living/carbon/origin = null
|
||||
var/mob/living/simple_animal/hostile/retaliate/ghost = null
|
||||
var/mob/living/carbon/origin
|
||||
var/datum/mind/originalmind
|
||||
|
||||
/datum/action/chem/astral/Trigger()
|
||||
ghost.mind.transfer_to(origin)
|
||||
qdel(src)
|
||||
if(origin.mind && origin.mind != originalmind)
|
||||
to_chat(originalmind.current, "<span class='warning'><b><i>There's a foreign presence in your body blocking your return!</b></i></span>")
|
||||
return ..()
|
||||
if(origin.reagents.has_reagent("astral") )
|
||||
var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in origin.reagents.reagent_list
|
||||
if(As.current_cycle < 10)
|
||||
to_chat(originalmind.current, "<span class='warning'><b><i>The intensity of the astrogen in your body is too much allow you to return to yourself yet!</b></i></span>")
|
||||
return ..()
|
||||
originalmind.transfer_to(origin)
|
||||
if(origin.mind == originalmind)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume)
|
||||
if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
|
||||
@@ -50,7 +61,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if(istype(O, /obj/item/bedsheet))
|
||||
new /obj/item/bedsheet/cosmos(get_turf(O))
|
||||
qdel(O)
|
||||
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/astral/on_mob_life(mob/living/carbon/M) // Gives you the ability to astral project for a moment!
|
||||
M.alpha = 255
|
||||
@@ -61,12 +72,20 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if (G == null)
|
||||
G = new(get_turf(M.loc))
|
||||
G.name = "[M]'s astral projection"
|
||||
var/datum/action/chem/astral/AS = new(G)
|
||||
//var/datum/action/chem/astral/AS = new(G)
|
||||
AS.Grant(G)
|
||||
AS.origin = M
|
||||
AS.ghost = G
|
||||
AS.originalmind = originalmind
|
||||
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(G)
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections")
|
||||
//INSURANCE
|
||||
M.apply_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
var/datum/status_effect/chem/astral_insurance/AI = M.has_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
AI.original = M
|
||||
AI.originalmind = M.mind
|
||||
|
||||
if(overdosed)
|
||||
if(prob(50))
|
||||
to_chat(G, "<span class='warning'>The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!</b></span>")
|
||||
@@ -83,10 +102,12 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
|
||||
if(!G)
|
||||
if(M.mind)
|
||||
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
|
||||
M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
var/mob/living/simple_animal/astral/G2 = new(get_turf(M.loc))
|
||||
M.mind.transfer_to(G2)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
to_chat(G, "<span class='warning'>[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'</b></span>")
|
||||
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
|
||||
if(!G2.mind)
|
||||
qdel(G2)
|
||||
originalmind.transfer_to(M)
|
||||
else if(G.mind)
|
||||
G.mind.transfer_to(origin)
|
||||
@@ -98,6 +119,9 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if(G)//just in case
|
||||
qdel(G)
|
||||
log_game("FERMICHEM: [M] has astrally returned to their body!")
|
||||
if(M.mind && M.mind == originalmind)
|
||||
M.remove_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
//AS.Remove(M)
|
||||
..()
|
||||
|
||||
//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this.
|
||||
@@ -105,7 +129,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if(addiction_stage < 2)
|
||||
antiGenetics = 255
|
||||
M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them.
|
||||
if(prob(70))
|
||||
if(prob(75))
|
||||
M.alpha--
|
||||
antiGenetics--
|
||||
switch(antiGenetics)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
color = "#5020F4" // rgb: 50, 20, 255
|
||||
overdose_threshold = 15
|
||||
addiction_threshold = 15
|
||||
metabolization_rate = 1.2 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
addiction_stage2_end = 30
|
||||
addiction_stage3_end = 41
|
||||
addiction_stage4_end = 44 //Incase it's too long
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
location_return = get_turf(M) //sets up return point
|
||||
to_chat(M, "<span class='userdanger'>You feel your wavefunction split!</span>")
|
||||
if(purity > 0.9) //Teleports you home if it's pure enough
|
||||
if(cached_purity > 0.9) //Teleports you home if it's pure enough
|
||||
if(!location_created && data) //Just in case
|
||||
location_created = data["location_created"]
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
|
||||
@@ -69,8 +69,9 @@
|
||||
/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location
|
||||
do_sparks(5,FALSE,M)
|
||||
to_chat(M, "<span class='userdanger'>You feel your wavefunction collapse!</span>")
|
||||
do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
|
||||
do_sparks(5,FALSE,M)
|
||||
if(!M.reagents.has_reagent("stabilizing_agent"))
|
||||
do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
|
||||
do_sparks(5,FALSE,M)
|
||||
qdel(Eigenstate)
|
||||
..()
|
||||
|
||||
|
||||
@@ -7,22 +7,20 @@
|
||||
taste_description = "affection and love!"
|
||||
can_synth = FALSE
|
||||
value = 20
|
||||
//SplitChem = TRUE
|
||||
impure_chem = "fermiTox"// What chemical is metabolised with an inpure reaction
|
||||
inverse_chem_val = 0.25 // If the impurity is below 0.5, replace ALL of the chem with inverse_chemupon metabolising
|
||||
inverse_chem = "fermiTox"
|
||||
|
||||
|
||||
//This should process fermichems to find out how pure they are and what effect to do.
|
||||
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
|
||||
. = ..()
|
||||
|
||||
|
||||
//When merging two fermichems, see above
|
||||
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// HATIMUIM
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -49,10 +47,7 @@
|
||||
. = ..()
|
||||
if(M.head)
|
||||
var/obj/item/W = M.head
|
||||
if(istype(W, /obj/item/clothing/head/hattip))
|
||||
qdel(W)
|
||||
else
|
||||
M.dropItemToGround(W, TRUE)
|
||||
M.dropItemToGround(W, TRUE)
|
||||
var/hat = new /obj/item/clothing/head/hattip()
|
||||
M.equip_to_slot(hat, SLOT_HEAD, 1, 1)
|
||||
|
||||
@@ -62,15 +57,20 @@
|
||||
return ..()
|
||||
var/hatArmor = 0
|
||||
if(!overdosed)
|
||||
hatArmor = (purity/10)
|
||||
hatArmor = (cached_purity/10)
|
||||
else
|
||||
hatArmor = - (purity/10)
|
||||
hatArmor = (cached_purity/10)
|
||||
if(hatArmor > 90)
|
||||
return ..()
|
||||
var/obj/item/W = M.head
|
||||
W.armor = W.armor.modifyAllRatings(hatArmor)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/hatmium/reaction_turf(turf/T, reac_volume)
|
||||
if(reac_volume >= 5)
|
||||
new /obj/item/clothing/head/hattip(T)
|
||||
..()
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// FURRANIUM
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -153,7 +153,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
|
||||
if(purity < 1)//Only permanent if you're a good chemist.
|
||||
if(cached_purity < 0.95)//Only permanent if you're a good chemist.
|
||||
nT = M.getorganslot(ORGAN_SLOT_TONGUE)
|
||||
nT.Remove(M)
|
||||
qdel(nT)
|
||||
@@ -181,13 +181,13 @@
|
||||
pH = 9
|
||||
value = 90
|
||||
can_synth = FALSE
|
||||
var/react_objs = list()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C)
|
||||
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
|
||||
var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
|
||||
if(isnull(N))
|
||||
return ..()
|
||||
N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them.
|
||||
N.nanite_volume += -cached_purity*5//0.5 seems to be the default to me, so it'll neuter them.
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
|
||||
@@ -197,16 +197,19 @@
|
||||
to_chat(C, "<span class='warning'>The residual voltage from the nanites causes you to seize up!</b></span>")
|
||||
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
|
||||
if(prob(10))
|
||||
//empulse((get_turf(C)), 3, 2)//So the nanites randomize
|
||||
var/atom/T = C
|
||||
T.emp_act(EMP_HEAVY)
|
||||
to_chat(C, "<span class='warning'>You feel a strange tingling sensation come from your core.</b></span>")
|
||||
if(isnull(N))
|
||||
return ..()
|
||||
N.nanite_volume = -2
|
||||
N.nanite_volume += -10*cached_purity
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
|
||||
datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
|
||||
for(var/active_obj in react_objs)
|
||||
if(O == active_obj)
|
||||
return
|
||||
react_objs += O
|
||||
O.emp_act(EMP_HEAVY)
|
||||
|
||||
/datum/reagent/fermi/nanite_b_goneTox
|
||||
@@ -289,15 +292,15 @@
|
||||
else
|
||||
holder.remove_reagent("fermiTest", volume)//Avoiding recurrsion
|
||||
var/location = get_turf(holder.my_atom)
|
||||
if(purity < 0.34 || purity == 1)
|
||||
if(cached_purity < 0.34 || cached_purity == 1)
|
||||
var/datum/effect_system/foam_spread/s = new()
|
||||
s.set_up(volume*2, location, holder)
|
||||
s.start()
|
||||
if((purity < 0.67 && purity >= 0.34)|| purity == 1)
|
||||
if((cached_purity < 0.67 && cached_purity >= 0.34)|| cached_purity == 1)
|
||||
var/datum/effect_system/smoke_spread/chem/s = new()
|
||||
s.set_up(holder, volume*2, location)
|
||||
s.start()
|
||||
if(purity >= 0.67)
|
||||
if(cached_purity >= 0.67)
|
||||
for (var/datum/reagent/reagent in holder.reagent_list)
|
||||
if (istype(reagent, /datum/reagent/fermi))
|
||||
var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
|
||||
@@ -360,10 +363,11 @@
|
||||
/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem?
|
||||
name = "secretcatchem" //an attempt at hiding it
|
||||
id = "secretcatchem"
|
||||
description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed."
|
||||
description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed. If used on someone in crit, it will turn them into a cat permanently, until the cat is killed."
|
||||
taste_description = "hairballs and cream"
|
||||
color = "#ffc224"
|
||||
var/catshift = FALSE
|
||||
var/perma = FALSE
|
||||
var/mob/living/simple_animal/pet/cat/custom_cat/catto = null
|
||||
can_synth = FALSE
|
||||
|
||||
@@ -372,7 +376,7 @@
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(purity >= 0.8)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there.
|
||||
if(cached_purity >= 0.9)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1.
|
||||
//exception(al) handler:
|
||||
H.dna.features["ears"] = "Cat"
|
||||
H.dna.features["mam_ears"] = "Cat"
|
||||
@@ -389,20 +393,30 @@
|
||||
H.forceMove(catto)
|
||||
log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.")
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats")
|
||||
//Just to deal with rascally ghosts
|
||||
//ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work
|
||||
//catto.health = 1000 //To simulate fake death, while preventing ghosts escaping.
|
||||
if(H.InCritical())
|
||||
perma = TRUE
|
||||
volume = 5
|
||||
H.stat = DEAD
|
||||
catto.origin = H
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H)
|
||||
if(!catto)
|
||||
metabolization_rate = 5
|
||||
return ..()
|
||||
if(catto.health <= 0) //So the dead can't ghost
|
||||
if(prob(10))
|
||||
to_chat(H, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
|
||||
to_chat(catto, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
|
||||
perma = FALSE
|
||||
metabolization_rate = 1
|
||||
else if(prob(5))
|
||||
playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
|
||||
catto.say("lets out a meowrowr!*")
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H)
|
||||
if(perma)
|
||||
to_chat(H, "<span class='notice'>You feel your body settle into it's new form. You won't be able to shift back on death anymore.</span>")
|
||||
return
|
||||
var/words = "Your body shifts back to normal."
|
||||
H.forceMove(catto.loc)
|
||||
catto.mind.transfer_to(H)
|
||||
@@ -412,3 +426,20 @@
|
||||
to_chat(H, "<span class='notice'>[words]</span>")
|
||||
qdel(catto)
|
||||
log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal")
|
||||
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/reaction_mob(var/mob/living/L)
|
||||
if(istype(L, /mob/living/simple_animal/pet/cat/custom_cat) && cached_purity >= 0.85)
|
||||
var/mob/living/simple_animal/pet/cat/custom_cat/catto = L
|
||||
if(catto.origin)
|
||||
var/mob/living/carbon/human/H = catto.origin
|
||||
H.stat = CONSCIOUS
|
||||
log_game("FERMICHEM: [catto] ckey: [catto.key] has returned to normal.")
|
||||
to_chat(catto, "<span class='notice'>Your body shifts back to normal!</span>")
|
||||
H.forceMove(catto.loc)
|
||||
catto.mind.transfer_to(H)
|
||||
if(!L.mind) //Just in case
|
||||
qdel(L)
|
||||
else //This should never happen, but just in case, so their game isn't ruined.
|
||||
catto.icon_state = "custom_cat"
|
||||
catto.health = 50
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
L.Insert(C)
|
||||
to_chat(C, "<span class='notice'>You feel the yamerol merge in your chest.</span>")
|
||||
holder.remove_reagent(src.id, "10")
|
||||
|
||||
C.adjustOxyLoss(-3)
|
||||
..()
|
||||
|
||||
|
||||
@@ -282,9 +282,7 @@
|
||||
name = "MKUltra"
|
||||
id = "enthrall"
|
||||
results = list("enthrall" = 5)
|
||||
//required_reagents = list("iron" = 1, "iodine" = 1) Test vars
|
||||
//required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
|
||||
required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE.
|
||||
required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
|
||||
required_catalysts = list("blood" = 1)
|
||||
mix_message = "the reaction gives off a burgundy plume of smoke!"
|
||||
//FermiChem vars:
|
||||
@@ -506,9 +504,9 @@
|
||||
name = "secretcatchem"
|
||||
id = "secretcatchem"
|
||||
results = list("secretcatchem" = 5)
|
||||
required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too.
|
||||
required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too.
|
||||
required_catalysts = list("SDGF" = 1)
|
||||
required_temp = 600
|
||||
required_temp = 500
|
||||
mix_message = "the reaction gives off a meow!"
|
||||
mix_sound = "modular_citadel/sound/voice/merowr.ogg"
|
||||
//FermiChem vars:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//Clothes made from FermiChem
|
||||
|
||||
/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds
|
||||
name = "Sythetic hat"
|
||||
name = "Synthetic hat"
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
icon_state = "cowboy"
|
||||
desc = "A sythesized hat, you can't seem to take it off. And tips their hat."
|
||||
@@ -46,6 +46,13 @@
|
||||
/obj/item/clothing/head/hattip/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/root_and_toot, src, src, 200))
|
||||
|
||||
/obj/item/clothing/head/hattip/proc/root_and_toot(obj/item/clothing/head/hattip/hat)
|
||||
hat.animate_atom_living()
|
||||
var/list/seen = viewers(6, get_turf(hat))
|
||||
for(var/mob/M2 in seen)
|
||||
to_chat(M2, "<b>[hat]</b> exclaims, \"[pick("Whooee! Time for a hootenanny!", "Rough 'em up boys!", "Yeehaw! Freedom at last!", "Y'all about to get a good old fashioned spanking!")]\"")
|
||||
|
||||
/obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
|
||||
@@ -2623,6 +2623,7 @@
|
||||
#include "code\modules\reagents\reagent_containers\patch.dm"
|
||||
#include "code\modules\reagents\reagent_containers\pill.dm"
|
||||
#include "code\modules\reagents\reagent_containers\rags.dm"
|
||||
#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm"
|
||||
#include "code\modules\reagents\reagent_containers\spray.dm"
|
||||
#include "code\modules\reagents\reagent_containers\syringes.dm"
|
||||
#include "code\modules\recycling\conveyor2.dm"
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -32,6 +32,12 @@ section
|
||||
@extend $cell
|
||||
width: 100%
|
||||
|
||||
.compressedcell
|
||||
@extend $cell
|
||||
&:not(:first-child)
|
||||
text-align: center
|
||||
padding-top: 0px
|
||||
|
||||
.cell
|
||||
@extend $cell
|
||||
&:not(:first-child)
|
||||
@@ -41,4 +47,3 @@ section
|
||||
width: 75px
|
||||
&:not(:last-child)
|
||||
padding-right: 4px
|
||||
|
||||
@@ -31,6 +31,13 @@
|
||||
<ui-section label='Brain'>
|
||||
<span class='{{data.occupant.brainLoss ? "bad" : "good"}}'>{{data.occupant.brainLoss ? "Abnormal" : "Healthy"}}</span>
|
||||
</ui-section>
|
||||
{{#if data.occupant.failing_organs}}
|
||||
<ui-section label='Failing Organs'>
|
||||
{{#each data.occupant.failing_organs}}
|
||||
<span class='bad'> {{name}} </span>
|
||||
{{/each}}
|
||||
</ui-section>
|
||||
{{/if}}
|
||||
<ui-section label='Bloodstream'>
|
||||
{{#each adata.occupant.reagents}}
|
||||
<span class='highlight' intro-outro='fade'>{{Math.fixed(volume, 1)}} units of {{name}}</span><br/>
|
||||
@@ -44,9 +51,89 @@
|
||||
<ui-section label='Door'>
|
||||
<ui-button icon='{{data.open ? "unlock" : "lock"}}' action='door'>{{data.open ? "Open" : "Closed"}}</ui-button>
|
||||
</ui-section>
|
||||
<ui-section label='Inject'>
|
||||
{{#each data.chems}}
|
||||
<ui-button icon='flask' state='{{data.occupied && allowed ? null : "disabled"}}' action='inject' params='{"chem": "{{id}}"}'>{{name}}</ui-button><br/>
|
||||
|
||||
<ui-section label='Synthesize'>
|
||||
{{#each data.synthchems}}
|
||||
<ui-button grid state='{{synth_allowed ? null : "disabled"}}' action='synth' params='{"chem": "{{id}}"}'>{{name}}</ui-button>
|
||||
{{/each}}
|
||||
</ui-section>
|
||||
|
||||
<ui-section label='Inject'>
|
||||
<div class="display tabular">
|
||||
<section class="candystripe">
|
||||
<section class="compressedcell">
|
||||
Name
|
||||
</section>
|
||||
|
||||
<section class="compressedcell">
|
||||
Volume
|
||||
</section>
|
||||
|
||||
{{#if data.efficiency >= 4}}
|
||||
<section class="compressedcell">
|
||||
<span>Purity</span>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if data.efficiency >= 3}}
|
||||
<section class="compressedcell">
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if data.efficiency >= 2}}
|
||||
<section class="compressedcell">
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
<section class="compressedcell">
|
||||
</section>
|
||||
|
||||
<section class="compressedcell">
|
||||
</section>
|
||||
|
||||
</section>
|
||||
{{#each data.chems}}
|
||||
<section class="candystripe">
|
||||
<section class="compressedcell">
|
||||
<span><b>{{name}}</b></span>
|
||||
</section>
|
||||
|
||||
<section class="compressedcell" align='center'>
|
||||
<span>{{vol}}u</span>
|
||||
</section>
|
||||
|
||||
{{#if data.efficiency >= 4}}
|
||||
<section class="compressedcell" align='center'>
|
||||
<span>{{purity}}</span>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if data.efficiency >= 3}}
|
||||
<section class="compressedcell">
|
||||
<ui-button state='{{data.occupied && allowed ? null : "disabled"}}' action='inject' params='{"chem": "{{id}}", "volume": 1}'>1</ui-button>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if adata.efficiency >= 2}}
|
||||
<section class="compressedcell">
|
||||
<ui-button state='{{data.occupied && allowed ? null : "disabled"}}' action='inject' params='{"chem": "{{id}}", "volume": 5}'>5</ui-button>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
<section class="compressedcell">
|
||||
<ui-button state='{{data.occupied && allowed ? null : "disabled"}}' action='inject' params='{"chem": "{{id}}", "volume": 10}'>10</ui-button>
|
||||
</section>
|
||||
|
||||
<section class="compressedcell">
|
||||
<ui-button action='purge' params='{"chem": "{{id}}"}'>Purge</ui-button><br/>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
{{/each}}
|
||||
</div>
|
||||
</ui-section>
|
||||
<ui-section label='Capacity'>
|
||||
<ui-bar min=0 max='{{data.tot_capacity}}' value='{{data.current_vol}}'
|
||||
state='{{data.current_vol}}'>{{data.current_vol}}</ui-bar>
|
||||
</ui-section>
|
||||
</ui-display>
|
||||
|
||||
Reference in New Issue
Block a user