Merge branch 'master' into Updates-holder
This commit is contained in:
@@ -230,8 +230,7 @@
|
||||
// owner.remove_status_effect(src)//At the moment, a user can enthrall themselves, toggle this back in if that should be removed.
|
||||
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed#
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear)
|
||||
var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain!
|
||||
mental_capacity = 500 - B.get_brain_damage()
|
||||
mental_capacity = 500 - M.getOrganLoss(ORGAN_SLOT_BRAIN)//It's their brain!
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H)//Prefs
|
||||
if(!H.canbearoused)
|
||||
@@ -334,7 +333,7 @@
|
||||
if(owner.client?.prefs.lewdchem && !customEcho)
|
||||
to_chat(owner, "<span class='love'><i>[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].</i></span>")
|
||||
if (4) //mindbroken
|
||||
if (mental_capacity >= 499 && (owner.getBrainLoss() <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra"))
|
||||
if (mental_capacity >= 499 && (owner.getOrganLoss(ORGAN_SLOT_BRAIN) <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra"))
|
||||
phase = 2
|
||||
mental_capacity = 500
|
||||
customTriggers = list()
|
||||
@@ -373,8 +372,8 @@
|
||||
M.hallucination = max(0, M.hallucination - 5)
|
||||
M.stuttering = max(0, M.stuttering - 5)
|
||||
M.jitteriness = max(0, M.jitteriness - 5)
|
||||
if(owner.getBrainLoss() >=20)
|
||||
owner.adjustBrainLoss(-0.2)
|
||||
if(owner.getOrganLoss(ORGAN_SLOT_BRAIN) >=20)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.2)
|
||||
if(withdrawal == TRUE)
|
||||
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
|
||||
@@ -395,7 +394,7 @@
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='notice'><i>You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].</i></span>")
|
||||
if(prob(5))
|
||||
owner.adjustBrainLoss(0.1)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1)
|
||||
to_chat(owner, "<i>[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon</i>") //denial
|
||||
if(36)
|
||||
var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]"
|
||||
@@ -403,11 +402,11 @@
|
||||
if(37 to 65)//barganing
|
||||
if(prob(10))
|
||||
to_chat(owner, "<i>They are coming back, right...?</i>")
|
||||
owner.adjustBrainLoss(0.5)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)
|
||||
if(prob(10))
|
||||
if(owner.client?.prefs.lewdchem)
|
||||
to_chat(owner, "<i>I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.</i>")
|
||||
owner.adjustBrainLoss(-1.5)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5)
|
||||
if(66)
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
|
||||
var/message = "[(owner.client?.prefs.lewdchem?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]"
|
||||
@@ -452,7 +451,7 @@
|
||||
to_chat(owner, "<span class='warning'><i>You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'><i>You are overwheled with withdrawl from [master].</i></span>")
|
||||
owner.adjustBrainLoss(1)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1)
|
||||
owner.stuttering += 35
|
||||
owner.jitteriness += 35
|
||||
if(prob(10))//2% chance
|
||||
@@ -468,14 +467,14 @@
|
||||
if(140 to INFINITY) //acceptance
|
||||
if(prob(15))
|
||||
deltaResist += 5
|
||||
owner.adjustBrainLoss(-1)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1)
|
||||
if(prob(20))
|
||||
if(owner.client?.prefs.lewdchem)
|
||||
to_chat(owner, "<i><span class='small green'>Maybe you'll be okay without your [enthrallGender].</i></span>")
|
||||
else
|
||||
to_chat(owner, "<i><span class='small green'>You feel your mental functions slowly begin to return.</i></span>")
|
||||
if(prob(5))
|
||||
owner.adjustBrainLoss(1)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1)
|
||||
M.hallucination += 30
|
||||
|
||||
withdrawalTick += 0.5//Enough to leave you with a major brain trauma, but not kill you.
|
||||
|
||||
@@ -1,410 +0,0 @@
|
||||
/*
|
||||
* Cryogenic refrigeration unit. Basically a despawner.
|
||||
* Stealing a lot of concepts/code from sleepers due to massive laziness.
|
||||
* The despawn tick will only fire if it's been more than time_till_despawned ticks
|
||||
* since time_entered, which is world.time when the occupant moves in.
|
||||
* ~ Zuhayr
|
||||
*/
|
||||
|
||||
|
||||
//Main cryopod console.
|
||||
|
||||
/obj/machinery/computer/cryopod
|
||||
name = "cryogenic oversight console"
|
||||
desc = "An interface between crew and the cryogenic storage oversight systems."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "cellconsole_1"
|
||||
circuit = /obj/item/circuitboard/cryopodcontrol
|
||||
density = FALSE
|
||||
interaction_flags_machine = INTERACT_MACHINE_OFFLINE
|
||||
req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with.
|
||||
var/mode = null
|
||||
|
||||
//Used for logging people entering cryosleep and important items they are carrying.
|
||||
var/list/frozen_crew = list()
|
||||
var/list/frozen_items = list()
|
||||
|
||||
var/storage_type = "crewmembers"
|
||||
var/storage_name = "Cryogenic Oversight Control"
|
||||
var/allow_items = TRUE
|
||||
|
||||
/obj/machinery/computer/cryopod/ui_interact(mob/user = usr)
|
||||
. = ..()
|
||||
|
||||
user.set_machine(src)
|
||||
add_fingerprint(user)
|
||||
|
||||
var/dat
|
||||
|
||||
dat += "<hr/><br/><b>[storage_name]</b><br/>"
|
||||
dat += "<i>Welcome, [user.real_name].</i><br/><br/><hr/>"
|
||||
dat += "<a href='?src=[REF(src)];log=1'>View storage log</a>.<br>"
|
||||
if(allow_items)
|
||||
dat += "<a href='?src=[REF(src)];view=1'>View objects</a>.<br>"
|
||||
dat += "<a href='?src=[REF(src)];item=1'>Recover object</a>.<br>"
|
||||
dat += "<a href='?src=[REF(src)];allitems=1'>Recover all objects</a>.<br>"
|
||||
|
||||
user << browse(dat, "window=cryopod_console")
|
||||
onclose(user, "cryopod_console")
|
||||
|
||||
/obj/machinery/computer/cryopod/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
var/mob/user = usr
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
if(href_list["log"])
|
||||
|
||||
var/dat = "<b>Recently stored [storage_type]</b><br/><hr/><br/>"
|
||||
for(var/person in frozen_crew)
|
||||
dat += "[person]<br/>"
|
||||
dat += "<hr/>"
|
||||
|
||||
user << browse(dat, "window=cryolog")
|
||||
|
||||
if(href_list["view"])
|
||||
if(!allow_items) return
|
||||
|
||||
var/dat = "<b>Recently stored objects</b><br/><hr/><br/>"
|
||||
for(var/obj/item/I in frozen_items)
|
||||
dat += "[I.name]<br/>"
|
||||
dat += "<hr/>"
|
||||
|
||||
user << browse(dat, "window=cryoitems")
|
||||
|
||||
else if(href_list["item"])
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>Access Denied.</span>")
|
||||
return
|
||||
if(!allow_items) return
|
||||
|
||||
if(frozen_items.len == 0)
|
||||
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
|
||||
if(!I)
|
||||
return
|
||||
|
||||
if(!(I in frozen_items))
|
||||
to_chat(user, "<span class='notice'>\The [I] is no longer in storage.</span>")
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>The console beeps happily as it disgorges \the [I].</span>")
|
||||
|
||||
I.forceMove(get_turf(src))
|
||||
frozen_items -= I
|
||||
|
||||
else if(href_list["allitems"])
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>Access Denied.</span>")
|
||||
return
|
||||
if(!allow_items) return
|
||||
|
||||
if(frozen_items.len == 0)
|
||||
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>The console beeps happily as it disgorges the desired objects.</span>")
|
||||
|
||||
for(var/obj/item/I in frozen_items)
|
||||
I.forceMove(get_turf(src))
|
||||
frozen_items -= I
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/item/circuitboard/cryopodcontrol
|
||||
name = "Circuit board (Cryogenic Oversight Console)"
|
||||
build_path = "/obj/machinery/computer/cryopod"
|
||||
|
||||
|
||||
//Cryopods themselves.
|
||||
/obj/machinery/cryopod
|
||||
name = "cryogenic freezer"
|
||||
desc = "Suited for Cyborgs and Humanoids, the pod is a safe place for personnel affected by the Space Sleep Disorder to get some rest."
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "cryopod-open"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
state_open = TRUE
|
||||
|
||||
var/on_store_message = "has entered long-term storage."
|
||||
var/on_store_name = "Cryogenic Oversight"
|
||||
|
||||
// 15 minutes-ish safe period before being despawned.
|
||||
var/time_till_despawn = 15 * 600 // This is reduced by 90% if a player manually enters cryo
|
||||
var/despawn_world_time = null // Used to keep track of the safe period.
|
||||
|
||||
var/obj/machinery/computer/cryopod/control_computer
|
||||
var/last_no_computer_message = 0
|
||||
|
||||
// These items are preserved when the process() despawn proc occurs.
|
||||
var/list/preserve_items = list(
|
||||
/obj/item/hand_tele,
|
||||
/obj/item/card/id/captains_spare,
|
||||
/obj/item/aicard,
|
||||
/obj/item/mmi,
|
||||
/obj/item/paicard,
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/areaeditor/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/clothing/suit/space,
|
||||
/obj/item/clothing/suit/armor,
|
||||
/obj/item/defibrillator/compact,
|
||||
/obj/item/reagent_containers/hypospray/CMO,
|
||||
/obj/item/clothing/accessory/medal/gold/captain,
|
||||
/obj/item/clothing/gloves/krav_maga,
|
||||
/obj/item/nullrod,
|
||||
/obj/item/tank/jetpack,
|
||||
/obj/item/documents,
|
||||
/obj/item/nuke_core_container
|
||||
)
|
||||
// These items will NOT be preserved
|
||||
var/list/do_not_preserve_items = list (
|
||||
/obj/item/mmi/posibrain,
|
||||
/obj/item/gun/energy/laser/mounted,
|
||||
/obj/item/gun/energy/e_gun/advtaser/mounted,
|
||||
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
|
||||
/obj/item/gun/energy/disabler/cyborg,
|
||||
/obj/item/gun/energy/e_gun/advtaser/cyborg,
|
||||
/obj/item/gun/energy/printer,
|
||||
/obj/item/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/gun/energy/laser/cyborg
|
||||
)
|
||||
|
||||
/obj/machinery/cryopod/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
find_control_computer(TRUE)
|
||||
|
||||
/obj/machinery/cryopod/proc/find_control_computer(urgent = FALSE)
|
||||
for(var/obj/machinery/computer/cryopod/C in get_area(src))
|
||||
control_computer = C
|
||||
if(C)
|
||||
return C
|
||||
|
||||
// Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged
|
||||
if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time)
|
||||
log_admin("Cryopod in [get_area(src)] could not find control computer!")
|
||||
message_admins("Cryopod in [get_area(src)] could not find control computer!")
|
||||
last_no_computer_message = world.time
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/cryopod/close_machine(mob/user)
|
||||
if(!control_computer)
|
||||
find_control_computer(TRUE)
|
||||
if((isnull(user) || istype(user)) && state_open && !panel_open)
|
||||
..(user)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant && mob_occupant.stat != DEAD)
|
||||
to_chat(occupant, "<span class='boldnotice'>You feel cool air surround you. You go numb as your senses turn inward.</span>")
|
||||
if(mob_occupant.client)//if they're logged in
|
||||
despawn_world_time = world.time + (time_till_despawn * 0.1)
|
||||
else
|
||||
despawn_world_time = world.time + time_till_despawn
|
||||
icon_state = "cryopod"
|
||||
|
||||
/obj/machinery/cryopod/open_machine()
|
||||
..()
|
||||
icon_state = "cryopod-open"
|
||||
density = TRUE
|
||||
name = initial(name)
|
||||
|
||||
/obj/machinery/cryopod/container_resist(mob/living/user)
|
||||
visible_message("<span class='notice'>[occupant] emerges from [src]!</span>",
|
||||
"<span class='notice'>You climb out of [src]!</span>")
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/cryopod/relaymove(mob/user)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/cryopod/process()
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant)
|
||||
// Eject dead people
|
||||
if(mob_occupant.stat == DEAD)
|
||||
open_machine()
|
||||
|
||||
if(!(world.time > despawn_world_time + 100))//+ 10 seconds
|
||||
return
|
||||
|
||||
if(!mob_occupant.client && mob_occupant.stat < 2) //Occupant is living and has no client.
|
||||
if(!control_computer)
|
||||
find_control_computer(urgent = TRUE)//better hope you found it this time
|
||||
|
||||
despawn_occupant()
|
||||
|
||||
// This function can not be undone; do not call this unless you are sure
|
||||
/obj/machinery/cryopod/proc/despawn_occupant()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
|
||||
//Update any existing objectives involving this mob.
|
||||
for(var/datum/objective/O in GLOB.objectives)
|
||||
// We don't want revs to get objectives that aren't for heads of staff. Letting
|
||||
// them win or lose based on cryo is silly so we remove the objective.
|
||||
if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind)
|
||||
qdel(O)
|
||||
else if(O.target && istype(O.target, /datum/mind))
|
||||
if(O.target == mob_occupant.mind)
|
||||
if(O.owner && O.owner.current)
|
||||
to_chat(O.owner.current, "<BR><span class='userdanger'>You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!</span>")
|
||||
O.target = null
|
||||
spawn(10) //This should ideally fire after the occupant is deleted.
|
||||
if(!O)
|
||||
return
|
||||
O.find_target()
|
||||
O.update_explanation_text()
|
||||
if(!(O.target))
|
||||
O.owner.objectives -= O
|
||||
qdel(O)
|
||||
|
||||
if(mob_occupant.mind && mob_occupant.mind.assigned_role)
|
||||
//Handle job slot/tater cleanup.
|
||||
var/job = mob_occupant.mind.assigned_role
|
||||
SSjob.FreeRole(job)
|
||||
if(mob_occupant.mind.objectives.len)
|
||||
mob_occupant.mind.objectives.Cut()
|
||||
mob_occupant.mind.special_role = null
|
||||
|
||||
// Delete them from datacore.
|
||||
|
||||
var/announce_rank = null
|
||||
for(var/datum/data/record/R in GLOB.data_core.medical)
|
||||
if((R.fields["name"] == mob_occupant.real_name))
|
||||
qdel(R)
|
||||
for(var/datum/data/record/T in GLOB.data_core.security)
|
||||
if((T.fields["name"] == mob_occupant.real_name))
|
||||
qdel(T)
|
||||
for(var/datum/data/record/G in GLOB.data_core.general)
|
||||
if((G.fields["name"] == mob_occupant.real_name))
|
||||
announce_rank = G.fields["rank"]
|
||||
qdel(G)
|
||||
|
||||
for(var/obj/machinery/computer/cloning/cloner in world)
|
||||
for(var/datum/data/record/R in cloner.records)
|
||||
if(R.fields["name"] == mob_occupant.real_name)
|
||||
cloner.records.Remove(R)
|
||||
|
||||
//Make an announcement and log the person entering storage.
|
||||
if(control_computer)
|
||||
control_computer.frozen_crew += "[mob_occupant.real_name]"
|
||||
|
||||
if(GLOB.announcement_systems.len)
|
||||
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
|
||||
announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, list())
|
||||
visible_message("<span class='notice'>\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.</span>")
|
||||
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer)))
|
||||
continue//means we already moved whatever this thing was in
|
||||
//I'm a professional, okay
|
||||
for(var/T in preserve_items)
|
||||
if(istype(W, T))
|
||||
if(control_computer && control_computer.allow_items)
|
||||
control_computer.frozen_items += W
|
||||
mob_occupant.transferItemToLoc(W, control_computer, TRUE)
|
||||
else
|
||||
mob_occupant.transferItemToLoc(W, loc, TRUE)
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
qdel(W)//because we moved all items to preserve away
|
||||
//and yes, this totally deletes their bodyparts one by one, I just couldn't bother
|
||||
|
||||
if(iscyborg(mob_occupant))
|
||||
var/mob/living/silicon/robot/R = occupant
|
||||
if(!istype(R)) return ..()
|
||||
|
||||
R.contents -= R.mmi
|
||||
qdel(R.mmi)
|
||||
|
||||
// Ghost and delete the mob.
|
||||
if(!mob_occupant.get_ghost(1))
|
||||
mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round
|
||||
|
||||
QDEL_NULL(occupant)
|
||||
open_machine()
|
||||
name = initial(name)
|
||||
|
||||
/obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user)
|
||||
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
to_chat(user, "<span class='boldnotice'>The cryo pod is already occupied!</span>")
|
||||
return
|
||||
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'>Dead people can not be put into cryo.</span>")
|
||||
return
|
||||
|
||||
if(target.client && user != target)
|
||||
if(iscyborg(target))
|
||||
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're online.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're conscious.</span>")
|
||||
return
|
||||
else if(target.client)
|
||||
if(alert(target,"Would you like to enter cryosleep?",,"Yes","No") == "No")
|
||||
return
|
||||
|
||||
var/generic_plsnoleave_message = " Please adminhelp before leaving the round, even if there are no administrators online!"
|
||||
|
||||
if(target == user && world.time - target.client.cryo_warned > 5 * 600)//if we haven't warned them in the last 5 minutes
|
||||
var/caught = FALSE
|
||||
if(target.mind.assigned_role in GLOB.command_positions)
|
||||
alert("<span class='userdanger'>You're a Head of Staff![generic_plsnoleave_message] Be sure to put your locker items back into your locker!</span>")
|
||||
caught = TRUE
|
||||
if(iscultist(target) || is_servant_of_ratvar(target))
|
||||
to_chat(target, "<span class='userdanger'>You're a Cultist![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(istype(SSticker.mode, /datum/antagonist/blob))
|
||||
if(target.mind in GLOB.overminds)
|
||||
alert("<span class='userdanger'>You're a Blob![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(is_devil(target))
|
||||
alert("<span class='userdanger'>You're a Devil![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(istype(SSticker.mode, /datum/antagonist/rev))
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/rev/head))
|
||||
alert("<span class='userdanger'>You're a Head Revolutionary![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
else if(target.mind.has_antag_datum(/datum/antagonist/rev))
|
||||
alert("<span class='userdanger'>You're a Revolutionary![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
|
||||
if(caught)
|
||||
target.client.cryo_warned = world.time
|
||||
return
|
||||
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
|
||||
if(target == user)
|
||||
visible_message("[user] starts climbing into the cryo pod.")
|
||||
else
|
||||
visible_message("[user] starts putting [target] into the cryo pod.")
|
||||
|
||||
if(occupant)
|
||||
to_chat(user, "<span class='boldnotice'>\The [src] is in use.</span>")
|
||||
return
|
||||
|
||||
close_machine(target)
|
||||
|
||||
to_chat(target, "<span class='boldnotice'>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</span>")
|
||||
name = "[name] ([occupant.name])"
|
||||
log_admin("<span class='notice'>[key_name(target)] entered a stasis pod.</span>")
|
||||
message_admins("[key_name_admin(target)] entered a stasis pod. (<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
add_fingerprint(target)
|
||||
|
||||
//Attacks/effects.
|
||||
/obj/machinery/cryopod/blob_act()
|
||||
return //Sorta gamey, but we don't really want these to be destroyed.
|
||||
@@ -38,6 +38,8 @@
|
||||
var/secondary_color = "#FFFFFF"
|
||||
var/tertiary_color = "#808080"
|
||||
|
||||
var/force_alternate_icon = FALSE
|
||||
|
||||
/obj/item/clothing/update_icon() // picks the colored overlays from the ICON file
|
||||
..()
|
||||
if(hasprimary) //Checks if the overlay is enabled
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
desc = "Oooh... right."
|
||||
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
|
||||
force_alternate_icon = TRUE
|
||||
item_state = ""
|
||||
can_adjust = FALSE //to prevent you from "wearing it casually"
|
||||
|
||||
@@ -23,7 +24,7 @@
|
||||
desc = "The uniform worn by command officers in the mid 2260s."
|
||||
icon_state = "trek_command"
|
||||
item_state = "trek_command"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/trek/engsec
|
||||
name = "Operations Uniform"
|
||||
@@ -94,6 +95,7 @@
|
||||
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
|
||||
icon_state = "trek_ds9_coat"
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
|
||||
force_alternate_icon = TRUE
|
||||
item_state = "trek_ds9_coat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -138,6 +140,7 @@
|
||||
desc = "A uniform jacket from the United Federation. Set phasers to awesome."
|
||||
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
|
||||
force_alternate_icon = TRUE
|
||||
icon_state = "fedcoat"
|
||||
item_state = "fedcoat"
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -204,6 +207,7 @@
|
||||
desc = "A modern uniform jacket from the United Federation."
|
||||
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
|
||||
force_alternate_icon = TRUE
|
||||
icon_state = "fedmodern"
|
||||
item_state = "fedmodern"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
@@ -236,6 +240,7 @@
|
||||
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
|
||||
icon_state = "fedcapofficer"
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
|
||||
force_alternate_icon = TRUE
|
||||
item_state = "fedcapofficer"
|
||||
|
||||
//Variants
|
||||
|
||||
@@ -18,9 +18,10 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
name = "combat jaws"
|
||||
desc = "The jaws of the law. Very sharp."
|
||||
icon_state = "jaws"
|
||||
force = 12
|
||||
force = 10 //Lowered to match secborg. No reason it should be more than a secborg's baton.
|
||||
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
|
||||
|
||||
|
||||
/obj/item/dogborg/jaws/small
|
||||
name = "puppy jaws"
|
||||
desc = "Rubberized teeth designed to protect accidental harm. Sharp enough for specialized tasks however."
|
||||
@@ -32,7 +33,6 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
|
||||
..()
|
||||
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
|
||||
log_combat(user, A, "bit")
|
||||
|
||||
/obj/item/dogborg/jaws/small/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
@@ -307,8 +307,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
/mob/living/silicon/robot
|
||||
var/leaping = 0
|
||||
var/pounce_cooldown = 0
|
||||
var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
|
||||
var/pounce_spoolup = 3
|
||||
var/pounce_cooldown_time = 20 //Buffed to counter balance changes
|
||||
var/pounce_spoolup = 1
|
||||
var/leap_at
|
||||
var/disabler
|
||||
var/laser
|
||||
@@ -338,7 +338,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
//It's also extremely buggy visually, so it's balance+bugfix
|
||||
return
|
||||
|
||||
if(cell.charge <= 500)
|
||||
if(cell.charge <= 750)
|
||||
to_chat(src,"<span class='danger'>Insufficent reserves for jump actuators!</span>")
|
||||
return
|
||||
|
||||
@@ -348,7 +348,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
pixel_y = 10
|
||||
update_icons()
|
||||
throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
|
||||
cell.use(500) //Doubled the energy consumption
|
||||
cell.use(750) //Less than a stunbaton since stunbatons hit everytime.
|
||||
weather_immunities -= "lava"
|
||||
|
||||
/mob/living/silicon/robot/throw_impact(atom/A)
|
||||
@@ -366,13 +366,13 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
blocked = 1
|
||||
if(!blocked)
|
||||
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
|
||||
L.Knockdown(iscarbon(L) ? 450 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
|
||||
L.Knockdown(iscarbon(L) ? 225 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
|
||||
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
|
||||
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
|
||||
step_towards(src,L)
|
||||
log_combat(src, L, "borg pounced")
|
||||
else
|
||||
Knockdown(45, 1, 1)
|
||||
Knockdown(15, 1, 1)
|
||||
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
spawn(pounce_cooldown_time) //3s by default
|
||||
@@ -380,7 +380,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='userdanger'>You smash into [A]!</span>")
|
||||
playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
|
||||
Knockdown(45, 1, 1)
|
||||
Knockdown(15, 1, 1)
|
||||
|
||||
if(leaping)
|
||||
leaping = 0
|
||||
|
||||
@@ -136,7 +136,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
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.
|
||||
DoNotSplit = TRUE
|
||||
metabolization_rate = 0.1//It has to be slow, so there's time for the effect.
|
||||
data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null)
|
||||
var/creatorID //ckey
|
||||
@@ -144,20 +143,19 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
var/creatorName
|
||||
var/mob/living/creator
|
||||
pH = 10
|
||||
OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human
|
||||
chemical_flags = REAGENT_ONMOBMERGE | REAGENT_DONOTSPLIT //Procs on_mob_add when merging into a human
|
||||
can_synth = FALSE
|
||||
|
||||
|
||||
/datum/reagent/fermi/enthrall/test
|
||||
name = "MKUltraTest"
|
||||
id = "enthrallTest"
|
||||
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, 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 makes you like Fermis a little too much. Unobtainable and due to be removed from the wiki."
|
||||
data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo")
|
||||
creatorID = "honkatonkbramblesnatch"//ckey
|
||||
creatorGender = "Mistress"
|
||||
creatorName = "Fermis Yakumo"
|
||||
purity = 1
|
||||
DoNotSplit = TRUE
|
||||
|
||||
/datum/reagent/fermi/enthrall/test/on_new()
|
||||
id = "enthrall"
|
||||
@@ -295,18 +293,18 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls mindbroken")
|
||||
|
||||
/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M)
|
||||
M.adjustBrainLoss(0.2)//should be ~30 in total
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2)//should be ~30 in total
|
||||
..()
|
||||
|
||||
//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system.
|
||||
/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes
|
||||
name = "MKUltra"
|
||||
name = "Gaseous MKUltra"
|
||||
id = "enthrallExplo"
|
||||
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of desire, inducing a chemial love for another. Also, how the HECC did you get this?"
|
||||
description = "A forbidden deep red gas that overwhelms a foreign body, causing the person they next lay their eyes on to become more interesting. Studies have shown that people are 66% more likely to make friends with this in the air. Produced when MKUltra explodes."
|
||||
color = "#2C051A" // rgb: , 0, 255
|
||||
metabolization_rate = 0.1
|
||||
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses."
|
||||
DoNotSplit = TRUE
|
||||
chemical_flags = REAGENT_DONOTSPLIT
|
||||
can_synth = FALSE
|
||||
var/mob/living/carbon/love
|
||||
|
||||
@@ -342,7 +340,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
M.Stun(10)
|
||||
M.emote("whimper")//does this exist?
|
||||
to_chat(M, "[(M.client?.prefs.lewdchem?"<span class='love'>":"<span class='warning'>")] You're overcome with a desire to see [love].</span>")
|
||||
M.adjustBrainLoss(0.5)//I found out why everyone was so damaged!
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged!
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M)
|
||||
|
||||
@@ -54,9 +54,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
var/pollStarted = FALSE
|
||||
var/location_created
|
||||
var/startHunger
|
||||
ImpureChem = "SDGFtox"
|
||||
InverseChemVal = 0.5
|
||||
InverseChem = "SDZF"
|
||||
impure_chem = "SDGFtox"
|
||||
inverse_chem_val = 0.5
|
||||
inverse_chem = "SDZF"
|
||||
can_synth = TRUE
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
//Damage the clone
|
||||
SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2
|
||||
SM.adjustCloneLoss(60, 0)
|
||||
SM.setBrainLoss(40)
|
||||
SM.setOrganLoss(ORGAN_SLOT_BRAIN, 40)
|
||||
SM.nutrition = startHunger/2
|
||||
|
||||
//Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger.
|
||||
@@ -249,7 +249,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
SM.adjustToxLoss(-(bodydamage/10), 0)
|
||||
SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/1.5
|
||||
SM.adjustCloneLoss((bodydamage/10), 0)
|
||||
SM.setBrainLoss((bodydamage/10))
|
||||
SM.setOrganLoss(ORGAN_SLOT_BRAIN, (bodydamage/10))
|
||||
SM.nutrition = 400
|
||||
if(bodydamage>200)
|
||||
SM.gain_trauma_type(BRAIN_TRAUMA_MILD)
|
||||
@@ -280,8 +280,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
|
||||
//Unobtainable, used in clone spawn.
|
||||
/datum/reagent/fermi/SDGFheal
|
||||
name = "synthetic-derived growth factor"
|
||||
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
|
||||
can_synth = FALSE
|
||||
|
||||
@@ -289,34 +290,35 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 10
|
||||
M.adjustCloneLoss(-2, 0)
|
||||
M.setBrainLoss(-1)
|
||||
M.setOrganLoss(ORGAN_SLOT_BRAIN, -1)
|
||||
M.nutrition += 10
|
||||
..()
|
||||
|
||||
//Unobtainable, used if SDGF is impure but not too impure
|
||||
/datum/reagent/fermi/SDGFtox
|
||||
name = "synthetic-derived growth factor"
|
||||
/datum/reagent/impure/SDGFtox
|
||||
name = "Synthetic-derived apoptosis factor"
|
||||
id = "SDGFtox"
|
||||
description = "A chem that makes a certain chemcat angry at you if you're reading this, how did you get this???"//i.e. tell me please, figure it's a good way to get pinged for bugfixes.
|
||||
description = "Impure synthetic-derived growth factor causes certain cells to undergo cell death, causing clone damage, and damaging blood cells."//i.e. tell me please, figure it's a good way to get pinged for bugfixes.
|
||||
metabolization_rate = 1
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
|
||||
/datum/reagent/impure/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
|
||||
M.blood_volume -= 10
|
||||
M.adjustCloneLoss(2, 0)
|
||||
..()
|
||||
|
||||
//Fail state of SDGF
|
||||
/datum/reagent/fermi/SDZF
|
||||
name = "synthetic-derived growth factor"
|
||||
/datum/reagent/impure/SDZF
|
||||
name = "synthetic-derived zombie factor"
|
||||
id = "SDZF"
|
||||
description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?"
|
||||
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
|
||||
var/startHunger
|
||||
can_synth = TRUE
|
||||
chemical_flags = REAGENT_SNEAKYNAME
|
||||
|
||||
/datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
|
||||
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
|
||||
switch(current_cycle)//Pretends to be normal
|
||||
if(20)
|
||||
to_chat(M, "<span class='notice'>You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.</span>")
|
||||
|
||||
@@ -28,7 +28,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
var/datum/mind/originalmind
|
||||
var/antiGenetics = 255
|
||||
var/sleepytime = 0
|
||||
InverseChemVal = 0.25
|
||||
inverse_chem_val = 0.25
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/action/chem/astral
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
taste_description = "a milky ice cream like flavour."
|
||||
overdose_threshold = 17
|
||||
metabolization_rate = 0.25
|
||||
ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth
|
||||
InverseChemVal = 0.35
|
||||
InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse
|
||||
impure_chem = "BEsmaller" //If you make an inpure chem, it stalls growth
|
||||
inverse_chem_val = 0.35
|
||||
inverse_chem = "BEsmaller" //At really impure vols, it just becomes 100% inverse
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M)
|
||||
@@ -140,7 +140,7 @@
|
||||
/datum/reagent/fermi/BEsmaller
|
||||
name = "Modesty milk"
|
||||
id = "BEsmaller"
|
||||
description = "A volatile collodial mixture derived from milk that encourages mammary reduction via a potent estrogen mix."
|
||||
description = "A volatile collodial mixture derived from milk that encourages mammary reduction via a potent estrogen mix. Produced by reacting impure Succubus milk."
|
||||
color = "#E60584" // rgb: 96, 0, 255
|
||||
taste_description = "a milky ice cream like flavour."
|
||||
metabolization_rate = 0.25
|
||||
@@ -211,9 +211,9 @@
|
||||
taste_description = "chinese dragon powder"
|
||||
overdose_threshold = 17 //ODing makes you male and removes female genitals
|
||||
metabolization_rate = 0.5
|
||||
ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth
|
||||
InverseChemVal = 0.35
|
||||
InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead.
|
||||
impure_chem = "PEsmaller" //If you make an inpure chem, it stalls growth
|
||||
inverse_chem_val = 0.35
|
||||
inverse_chem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead.
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M)
|
||||
@@ -311,7 +311,7 @@
|
||||
/datum/reagent/fermi/PEsmaller // Due to cozmo's request...!
|
||||
name = "Chastity draft"
|
||||
id = "PEsmaller"
|
||||
description = "A volatile collodial mixture derived from various masculine solutions that encourages a smaller gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace."
|
||||
description = "A volatile collodial mixture derived from various masculine solutions that encourages a smaller gentleman's package via a potent testosterone mix. Produced by reacting impure Incubus draft."
|
||||
color = "#888888" // This is greyish..?
|
||||
taste_description = "chinese dragon powder"
|
||||
metabolization_rate = 0.5
|
||||
|
||||
@@ -6,7 +6,10 @@
|
||||
id = "fermi"
|
||||
taste_description = "affection and love!"
|
||||
can_synth = FALSE
|
||||
SplitChem = TRUE
|
||||
//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)
|
||||
@@ -36,7 +39,7 @@
|
||||
taste_description = "like jerky, whiskey and an off aftertaste of a crypt."
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 25
|
||||
DoNotSplit = TRUE
|
||||
chemical_flags = REAGENT_DONOTSPLIT
|
||||
pH = 4
|
||||
can_synth = TRUE
|
||||
|
||||
@@ -81,9 +84,9 @@
|
||||
color = "#f9b9bc" // rgb: , 0, 255
|
||||
taste_description = "dewicious degenyewacy"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
InverseChemVal = 0
|
||||
inverse_chem_val = 0
|
||||
var/obj/item/organ/tongue/nT
|
||||
DoNotSplit = TRUE
|
||||
chemical_flags = REAGENT_DONOTSPLIT
|
||||
pH = 5
|
||||
var/obj/item/organ/tongue/T
|
||||
can_synth = TRUE
|
||||
@@ -170,9 +173,9 @@
|
||||
description = "A stablised EMP that is highly volatile, shocking small nano machines that will kill them off at a rapid rate in a patient's system."
|
||||
color = "#708f8f"
|
||||
overdose_threshold = 15
|
||||
ImpureChem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth
|
||||
InverseChemVal = 0.25
|
||||
InverseChem = "nanite_b_goneTox" //At really impure vols, it just becomes 100% inverse
|
||||
impure_chem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth
|
||||
inverse_chem_val = 0.25
|
||||
inverse_chem = "nanite_b_goneTox" //At really impure vols, it just becomes 100% inverse
|
||||
taste_description = "what can only be described as licking a battery."
|
||||
pH = 9
|
||||
can_synth = FALSE
|
||||
@@ -195,7 +198,7 @@
|
||||
//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'>The nanites short circuit within your system!</b></span>")
|
||||
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
|
||||
@@ -205,10 +208,11 @@
|
||||
O.emp_act(EMP_HEAVY)
|
||||
|
||||
/datum/reagent/fermi/nanite_b_goneTox
|
||||
name = "Naninte bain"
|
||||
name = "Electromagnetic crystals"
|
||||
id = "nanite_b_goneTox"
|
||||
description = "Poorly made, and shocks you!"
|
||||
metabolization_rate = 1
|
||||
description = "Causes items upon the patient to sometimes short out, as well as causing a shock in the patient, if the residual charge between the crystals builds up to sufficient quantities"
|
||||
metabolization_rate = 0.5
|
||||
chemical_flags = REAGENT_INVISIBLE
|
||||
|
||||
//Increases shock events.
|
||||
/datum/reagent/fermi/nanite_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
|
||||
@@ -246,8 +250,7 @@
|
||||
if((method==VAPOR) && (!C.wear_mask))
|
||||
if(prob(20))
|
||||
to_chat(C, "<span class='warning'>You can feel your lungs burning!</b></span>")
|
||||
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
L.adjustLungLoss(acidstr*2, C)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_LUNGS, acidstr*2)
|
||||
C.apply_damage(acidstr/5, BURN, target)
|
||||
C.acid_act(acidstr, volume)
|
||||
..()
|
||||
@@ -274,7 +277,7 @@
|
||||
name = "Fermis Test Reagent"
|
||||
id = "fermiTest"
|
||||
description = "You should be really careful with this...! Also, how did you get this?"
|
||||
addProc = TRUE
|
||||
chemical_flags = REAGENT_FORCEONNEW
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder)
|
||||
@@ -305,22 +308,6 @@
|
||||
playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1)
|
||||
holder.clear_reagents()
|
||||
|
||||
/datum/reagent/fermi/fermiTox
|
||||
name = "FermiTox"
|
||||
id = "fermiTox"
|
||||
description = "You should be really careful with this...! Also, how did you get this? You shouldn't have this!"
|
||||
data = "merge"
|
||||
color = "FFFFFF"
|
||||
can_synth = FALSE
|
||||
|
||||
//I'm concerned this is too weak, but I also don't want deathmixes.
|
||||
/datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method)
|
||||
if(C.dna && istype(C.dna.species, /datum/species/jelly))
|
||||
C.adjustToxLoss(-2)
|
||||
else
|
||||
C.adjustToxLoss(2)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/acidic_buffer
|
||||
name = "Acidic buffer"
|
||||
id = "acidic_buffer"
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
color = "#68e83a"
|
||||
pH = 8.6
|
||||
overdose_threshold = 35
|
||||
ImpureChem = "yamerol_tox"
|
||||
InverseChemVal = 0.4
|
||||
InverseChem = "yamerol_tox"
|
||||
impure_chem = "yamerol_tox"
|
||||
inverse_chem_val = 0.4
|
||||
inverse_chem = "yamerol_tox"
|
||||
can_synth = TRUE
|
||||
|
||||
/datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C)
|
||||
@@ -16,9 +16,9 @@
|
||||
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
|
||||
if(T)
|
||||
T.adjustTongueLoss(C, -2)//Fix the inputs me!
|
||||
T.applyOrganDamage(-2)
|
||||
if(L)
|
||||
L.adjustLungLoss(-5, C)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_LUNGS, -5)
|
||||
C.adjustOxyLoss(-2)
|
||||
else
|
||||
C.adjustOxyLoss(-10)
|
||||
@@ -65,31 +65,84 @@
|
||||
holder.remove_reagent(src.id, "10")
|
||||
|
||||
if(!C.getorganslot(ORGAN_SLOT_LUNGS))
|
||||
var/obj/item/organ/lungs/L = new()
|
||||
var/obj/item/organ/lungs/yamerol/L = new()
|
||||
L.Insert(C)
|
||||
to_chat(C, "<span class='notice'>You feel your lungs reform in your chest.</span>")
|
||||
to_chat(C, "<span class='notice'>You feel the yamerol merge in your chest.</span>")
|
||||
holder.remove_reagent(src.id, "10")
|
||||
|
||||
C.adjustOxyLoss(-3)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/yamerol_tox
|
||||
name = "Yamerol"
|
||||
/datum/reagent/impure/yamerol_tox
|
||||
name = "Yamer oh no"
|
||||
id = "yamerol_tox"
|
||||
description = "For when you've trouble speaking or breathing, just yell YAMEROL! A chem that helps soothe any congestion problems and at high concentrations restores damaged lungs and tongues!"
|
||||
description = "A dangerous, cloying toxin that stucks to a patient’s respiratory system, damaging their tongue, lungs and causing suffocation."
|
||||
taste_description = "a weird, syrupy flavour, yamero"
|
||||
color = "#68e83a"
|
||||
pH = 8.6
|
||||
|
||||
/datum/reagent/fermi/yamerol_tox/on_mob_life(mob/living/carbon/C)
|
||||
/datum/reagent/impure/yamerol_tox/on_mob_life(mob/living/carbon/C)
|
||||
var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
|
||||
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
|
||||
if(T)
|
||||
T.adjustTongueLoss(C, 1)
|
||||
T.applyOrganDamage(1)
|
||||
if(L)
|
||||
L.adjustLungLoss(4, C)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_LUNGS, 4)
|
||||
C.adjustOxyLoss(3)
|
||||
else
|
||||
C.adjustOxyLoss(10)
|
||||
..()
|
||||
|
||||
|
||||
/datum/reagent/synthtissue
|
||||
name = "Synthtissue"
|
||||
id = "synthtissue"
|
||||
description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties."
|
||||
pH = 7.6
|
||||
metabolization_rate = 0.1
|
||||
data = list("grown_volume" = 0, "injected_vol" = 0)
|
||||
|
||||
/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
|
||||
if(iscarbon(M))
|
||||
var/target = M.zone_selected
|
||||
if (M.stat == DEAD)
|
||||
show_message = 0
|
||||
if(method in list(PATCH, TOUCH))
|
||||
M.apply_damage(reac_volume*-1.5, BRUTE, target)
|
||||
M.apply_damage(reac_volume*-1.5, BURN, target)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='danger'>You feel your [target] heal! It stings like hell!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
if(method==INJECT)
|
||||
data["injected_vol"] = data["injected_vol"] + reac_volume
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C)
|
||||
if(!iscarbon(C))
|
||||
return ..()
|
||||
if(data["injected_vol"] > 14)
|
||||
if(data["grown_volume"] > 175) //I don't think this is even possible, but damn to I want to see if someone can (bare in mind it takes 2s to grow 0.05u)
|
||||
if(volume >= 14)
|
||||
if(C.regenerate_organs(only_one = TRUE))
|
||||
C.reagents.remove_reagent(id, 15)
|
||||
to_chat(C, "<span class='notice'>You feel something reform inside of you!</span>")
|
||||
|
||||
data["injected_vol"] -= metabolization_rate
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_merge(passed_data)
|
||||
if(!passed_data)
|
||||
return ..()
|
||||
if(passed_data["grown_volume"] > data["grown_volume"])
|
||||
data["grown_volume"] = passed_data["grown_volume"]
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_new(passed_data)
|
||||
if(!passed_data)
|
||||
return ..()
|
||||
if(passed_data["grown_volume"] > data["grown_volume"])
|
||||
data["grown_volume"] = passed_data["grown_volume"]
|
||||
..()
|
||||
|
||||
//NEEDS ON_MOB_DEAD()
|
||||
|
||||
@@ -2,11 +2,29 @@
|
||||
mix_sound = 'sound/effects/bubbles.ogg'
|
||||
|
||||
//Called for every reaction step
|
||||
/datum/chemical_reaction/proc/FermiCreate(holder)
|
||||
/datum/chemical_reaction/proc/FermiCreate(datum/reagents/holder, added_volume, added_purity)
|
||||
return
|
||||
|
||||
//Called when reaction STOP_PROCESSING
|
||||
/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder)
|
||||
/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder, var/atom/my_atom, reactVol)
|
||||
if(clear_conversion == REACTION_CLEAR_IMPURE | REACTION_CLEAR_INVERSE)
|
||||
for(var/id in results)
|
||||
var/datum/reagent/R = my_atom.reagents.has_reagent("[id]")
|
||||
if(R.purity == 1)
|
||||
continue
|
||||
|
||||
var/cached_volume = R.volume
|
||||
if(clear_conversion == REACTION_CLEAR_INVERSE && R.inverse_chem)
|
||||
if(R.inverse_chem_val > R.purity)
|
||||
my_atom.reagents.remove_reagent(R.id, cached_volume, FALSE)
|
||||
my_atom.reagents.add_reagent(R.inverse_chem, cached_volume, FALSE, other_purity = 1)
|
||||
|
||||
else if (clear_conversion == REACTION_CLEAR_IMPURE && R.impure_chem)
|
||||
var/impureVol = cached_volume * (1 - R.purity)
|
||||
my_atom.reagents.remove_reagent(R.id, (impureVol), FALSE)
|
||||
my_atom.reagents.add_reagent(R.impure_chem, impureVol, FALSE, other_purity = 1)
|
||||
R.cached_purity = R.purity
|
||||
R.purity = 1
|
||||
return
|
||||
|
||||
//Called when temperature is above a certain threshold, or if purity is too low.
|
||||
|
||||
@@ -138,16 +138,16 @@
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustBrainLoss(2)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2)
|
||||
..()
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustBrainLoss(3)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3)
|
||||
|
||||
..()
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustBrainLoss(4)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/sizeoxadone/overdose_process(mob/living/M)
|
||||
M.adjustBrainLoss(1)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1)
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
Reference in New Issue
Block a user