"
- if(!autolink)
- dat += {"
- Frequency: [frequency]
- Code: [code]
- Probe Generators
- "}
+ break
- if(magnets.len >= 1)
+ looping = 1
- dat += "Magnets confirmed: "
- var/i = 0
- for(var/obj/machinery/magnetic_module/M in magnets)
- i++
- dat += " < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] + "
+ // Prepare the radio signal
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 // radio transmission
+ signal.source = src
+ signal.frequency = frequency
+ signal.data["code"] = code
- dat += " Speed: - [speed] + "
- dat += "Path: {[path]} "
- dat += "Moving: [moving ? "Enabled":"Disabled"]"
+ if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
+ pathpos = 1
+
+ var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
+
+ if(!(nextmove in list("N","S","E","W","C","R")))
+ // N, S, E, W are directional
+ // C is center
+ // R is random (in magnetic field's bounds)
+ qdel(signal)
+ break // break the loop if the character located is invalid
+
+ signal.data["command"] = nextmove
- user << browse(dat, "window=magnet;size=400x500")
- onclose(user, "magnet")
-
- Topic(href, href_list)
- if(stat & (BROKEN|NOPOWER))
- return
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- if(href_list["radio-op"])
-
- // Prepare signal beforehand, because this is a radio operation
- var/datum/signal/signal = new
- signal.transmission_method = 1 // radio transmission
- signal.source = src
- signal.frequency = frequency
- signal.data["code"] = code
-
- // Apply any necessary commands
- switch(href_list["radio-op"])
- if("togglepower")
- signal.data["command"] = "toggle-power"
-
- if("minuselec")
- signal.data["command"] = "sub-elec"
- if("pluselec")
- signal.data["command"] = "add-elec"
-
- if("minusmag")
- signal.data["command"] = "sub-mag"
- if("plusmag")
- signal.data["command"] = "add-mag"
-
-
- // Broadcast the signal
+ pathpos++ // increase iterator
+ // Broadcast the signal
+ spawn()
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
- spawn(1)
- updateUsrDialog() // pretty sure this increases responsiveness
+ if(speed == 10)
+ sleep(1)
+ else
+ sleep(12-speed)
- if(href_list["operation"])
- switch(href_list["operation"])
- if("plusspeed")
- speed++
- if(speed > 10)
- speed = 10
- if("minusspeed")
- speed --
- if(speed <= 0)
- speed = 1
- if("setpath")
- var/newpath = sanitize(copytext(input(usr, "Please define a new path!",,path) as text|null,1,MAX_MESSAGE_LEN))
- if(newpath && newpath != "")
- moving = 0 // stop moving
- path = newpath
- pathpos = 1 // reset position
- filter_path() // renders rpath
-
- if("togglemoving")
- moving = !moving
- if(moving)
- spawn() MagnetMove()
+ looping = 0
- updateUsrDialog()
+/obj/machinery/magnetic_controller/proc/filter_path()
+ // Generates the rpath variable using the path string, think of this as "string2list"
+ // Doesn't use params2list() because of the akward way it stacks entities
+ rpath = list() // clear rpath
+ var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length
- proc/MagnetMove()
- if(looping) return
+ for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path
- while(moving && rpath.len >= 1)
+ var/nextchar = copytext(path, i, i+1) // find next character
- if(stat & (BROKEN|NOPOWER))
- break
+ if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
+ rpath += copytext(path, i, i+1) // else, add to list
- looping = 1
-
- // Prepare the radio signal
- var/datum/signal/signal = new
- signal.transmission_method = 1 // radio transmission
- signal.source = src
- signal.frequency = frequency
- signal.data["code"] = code
-
- if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
- pathpos = 1
-
- var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
-
- if(!(nextmove in list("N","S","E","W","C","R")))
- // N, S, E, W are directional
- // C is center
- // R is random (in magnetic field's bounds)
- qdel(signal)
- break // break the loop if the character located is invalid
-
- signal.data["command"] = nextmove
-
-
- pathpos++ // increase iterator
-
- // Broadcast the signal
- spawn()
- radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
-
- if(speed == 10)
- sleep(1)
- else
- sleep(12-speed)
-
- looping = 0
-
-
- proc/filter_path()
- // Generates the rpath variable using the path string, think of this as "string2list"
- // Doesn't use params2list() because of the akward way it stacks entities
- rpath = list() // clear rpath
- var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length
-
- for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path
-
- var/nextchar = copytext(path, i, i+1) // find next character
-
- if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
- rpath += copytext(path, i, i+1) // else, add to list
-
- // there doesn't HAVE to be separators but it makes paths syntatically visible
+ // there doesn't HAVE to be separators but it makes paths syntatically visible
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 37d1c3ae93c..dacb5f14f46 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -17,89 +17,89 @@
var/selfdestructing = 0
var/charges = 1
- attack_hand(var/mob/user as mob)
- usr.set_machine(src)
- var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]... Identity confirmed, "
- if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
- if(is_special_character(user))
- dat += "Operative record found. Greetings, Agent [user.name]. "
- else if(charges < 1)
- dat += "Connection severed. "
- else
- var/honorific = "Mr."
- if(user.gender == FEMALE)
- honorific = "Ms."
- dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]? "
- if(!selfdestructing)
- dat += "
\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\" "
- dat += temptext
- user << browse(dat, "window=syndbeacon")
- onclose(user, "syndbeacon")
+/obj/machinery/syndicate_beacon/attack_hand(var/mob/user as mob)
+ usr.set_machine(src)
+ var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]... Identity confirmed, "
+ if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
+ if(is_special_character(user))
+ dat += "Operative record found. Greetings, Agent [user.name]. "
+ else if(charges < 1)
+ dat += "Connection severed. "
+ else
+ var/honorific = "Mr."
+ if(user.gender == FEMALE)
+ honorific = "Ms."
+ dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]? "
+ if(!selfdestructing)
+ dat += "
\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\" "
+ dat += temptext
+ user << browse(dat, "window=syndbeacon")
+ onclose(user, "syndbeacon")
- Topic(href, href_list)
- if(..())
- return 1
- if(href_list["betraitor"])
- if(charges < 1)
+/obj/machinery/syndicate_beacon/Topic(href, href_list)
+ if(..())
+ return 1
+ if(href_list["betraitor"])
+ if(charges < 1)
+ src.updateUsrDialog()
+ return
+ var/mob/M = locate(href_list["traitormob"])
+ if(M.mind.special_role)
+ temptext = "We have no need for you at this time. Have a pleasant day. "
+ src.updateUsrDialog()
+ return
+ charges -= 1
+ switch(rand(1,2))
+ if(1)
+ temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind."
src.updateUsrDialog()
+ spawn(rand(50,200)) selfdestruct()
return
- var/mob/M = locate(href_list["traitormob"])
- if(M.mind.special_role)
- temptext = "We have no need for you at this time. Have a pleasant day. "
- src.updateUsrDialog()
- return
- charges -= 1
- switch(rand(1,2))
- if(1)
- temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind."
- src.updateUsrDialog()
- spawn(rand(50,200)) selfdestruct()
- return
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/N = M
- ticker.mode.equip_traitor(N)
- ticker.mode.traitors += N.mind
- N.mind.special_role = SPECIAL_ROLE_TRAITOR
- var/objective = "Free Objective"
- switch(rand(1,100))
- if(1 to 50)
- objective = "Steal [pick("a hand teleporter", "the Captain's antique laser gun", "a jetpack", "the Captain's ID", "the Captain's jumpsuit")]."
- if(51 to 60)
- objective = "Destroy 70% or more of the station's plasma tanks."
- if(61 to 70)
- objective = "Cut power to 80% or more of the station's tiles."
- if(71 to 80)
- objective = "Destroy the AI."
- if(81 to 90)
- objective = "Kill all monkeys aboard the station."
- else
- objective = "Make certain at least 80% of the station evacuates on the shuttle."
- var/datum/objective/custom_objective = new(objective)
- custom_objective.owner = N.mind
- N.mind.objectives += custom_objective
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/N = M
+ ticker.mode.equip_traitor(N)
+ ticker.mode.traitors += N.mind
+ N.mind.special_role = SPECIAL_ROLE_TRAITOR
+ var/objective = "Free Objective"
+ switch(rand(1,100))
+ if(1 to 50)
+ objective = "Steal [pick("a hand teleporter", "the Captain's antique laser gun", "a jetpack", "the Captain's ID", "the Captain's jumpsuit")]."
+ if(51 to 60)
+ objective = "Destroy 70% or more of the station's plasma tanks."
+ if(61 to 70)
+ objective = "Cut power to 80% or more of the station's tiles."
+ if(71 to 80)
+ objective = "Destroy the AI."
+ if(81 to 90)
+ objective = "Kill all monkeys aboard the station."
+ else
+ objective = "Make certain at least 80% of the station evacuates on the shuttle."
+ var/datum/objective/custom_objective = new(objective)
+ custom_objective.owner = N.mind
+ N.mind.objectives += custom_objective
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = N.mind
- N.mind.objectives += escape_objective
+ var/datum/objective/escape/escape_objective = new
+ escape_objective.owner = N.mind
+ N.mind.objectives += escape_objective
- to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!")
+ to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!")
- message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.")
+ message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.")
- var/obj_count = 1
- for(var/datum/objective/OBJ in M.mind.objectives)
- to_chat(M, "Objective #[obj_count]: [OBJ.explanation_text]")
- obj_count++
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in M.mind.objectives)
+ to_chat(M, "Objective #[obj_count]: [OBJ.explanation_text]")
+ obj_count++
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
- proc/selfdestruct()
- selfdestructing = 1
- spawn() explosion(src.loc, rand(3,8), rand(1,3), 1, 10)
+/obj/machinery/syndicate_beacon/proc/selfdestruct()
+ selfdestructing = 1
+ spawn() explosion(src.loc, rand(3,8), rand(1,3), 1, 10)
@@ -196,4 +196,4 @@
/obj/machinery/power/singularity_beacon/syndicate
icontype = "beaconsynd"
- icon_state = "beaconsynd0"
\ No newline at end of file
+ icon_state = "beaconsynd0"
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index 0a12b637a39..539e4565d66 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -75,10 +75,10 @@
freq_listening = list(AI_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ)
//Common and other radio frequencies for people to freely use
- New()
- for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
- freq_listening |= i
- ..()
+/obj/machinery/telecomms/receiver/preset_right/New()
+ for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
+ freq_listening |= i
+ ..()
/obj/machinery/telecomms/receiver/preset_cent
id = "CentComm Receiver"
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index a5a1bb95bc1..75b9fc6b1b8 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -33,9 +33,9 @@
/obj/item/mecha_parts/chassis/ripley
name = "Ripley Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/ripley_chassis(src)
+/obj/item/mecha_parts/chassis/ripley/New()
+ ..()
+ construct = new /datum/construction/mecha/ripley_chassis(src)
/obj/item/mecha_parts/part/ripley_torso
name="Ripley Torso"
@@ -68,9 +68,9 @@
/obj/item/mecha_parts/chassis/gygax
name = "Gygax Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/gygax_chassis(src)
+/obj/item/mecha_parts/chassis/gygax/New()
+ ..()
+ construct = new /datum/construction/mecha/gygax_chassis(src)
/obj/item/mecha_parts/part/gygax_torso
name="Gygax Torso"
@@ -117,9 +117,9 @@
/obj/item/mecha_parts/chassis/durand
name = "Durand Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/durand_chassis(src)
+/obj/item/mecha_parts/chassis/durand/New()
+ ..()
+ construct = new /datum/construction/mecha/durand_chassis(src)
/obj/item/mecha_parts/part/durand_torso
name="Durand Torso"
@@ -163,39 +163,18 @@
/obj/item/mecha_parts/chassis/firefighter
name = "Firefighter Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/firefighter_chassis(src)
-/*
-/obj/item/mecha_parts/part/firefighter_torso
- name="Ripley-on-Fire Torso"
- icon_state = "ripley_harness"
-
-/obj/item/mecha_parts/part/firefighter_left_arm
- name="Ripley-on-Fire Left Arm"
- icon_state = "ripley_l_arm"
-
-/obj/item/mecha_parts/part/firefighter_right_arm
- name="Ripley-on-Fire Right Arm"
- icon_state = "ripley_r_arm"
-
-/obj/item/mecha_parts/part/firefighter_left_leg
- name="Ripley-on-Fire Left Leg"
- icon_state = "ripley_l_leg"
-
-/obj/item/mecha_parts/part/firefighter_right_leg
- name="Ripley-on-Fire Right Leg"
- icon_state = "ripley_r_leg"
-*/
+/obj/item/mecha_parts/chassis/firefighter/New()
+ ..()
+ construct = new /datum/construction/mecha/firefighter_chassis(src)
////////// HONK
/obj/item/mecha_parts/chassis/honker
name = "H.O.N.K Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/honker_chassis(src)
+/obj/item/mecha_parts/chassis/honker/New()
+ ..()
+ construct = new /datum/construction/mecha/honker_chassis(src)
/obj/item/mecha_parts/part/honker_torso
name="H.O.N.K Torso"
@@ -275,9 +254,9 @@
/obj/item/mecha_parts/chassis/phazon
name = "Phazon Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/phazon_chassis(src)
+/obj/item/mecha_parts/chassis/phazon/New()
+ ..()
+ construct = new /datum/construction/mecha/phazon_chassis(src)
/obj/item/mecha_parts/part/phazon_torso
name="Phazon Torso"
@@ -319,9 +298,9 @@
/obj/item/mecha_parts/chassis/odysseus
name = "Odysseus Chassis"
- New()
- ..()
- construct = new /datum/construction/mecha/odysseus_chassis(src)
+/obj/item/mecha_parts/chassis/odysseus/New()
+ ..()
+ construct = new /datum/construction/mecha/odysseus_chassis(src)
/obj/item/mecha_parts/part/odysseus_head
name="Odysseus Head"
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 204fcfc67f2..d108311b99d 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -15,10 +15,10 @@
var/list/crowbar_salvage
var/salvage_num = 5
- New()
- ..()
- crowbar_salvage = new
- return
+/obj/effect/decal/mecha_wreckage/New()
+ ..()
+ crowbar_salvage = new
+ return
/obj/effect/decal/mecha_wreckage/ex_act(severity)
if(severity < 2)
@@ -86,20 +86,20 @@
name = "Gygax wreckage"
icon_state = "gygax-broken"
- New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
- /obj/item/mecha_parts/part/gygax_head,
- /obj/item/mecha_parts/part/gygax_left_arm,
- /obj/item/mecha_parts/part/gygax_right_arm,
- /obj/item/mecha_parts/part/gygax_left_leg,
- /obj/item/mecha_parts/part/gygax_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/gygax/New()
+ ..()
+ var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
+ /obj/item/mecha_parts/part/gygax_head,
+ /obj/item/mecha_parts/part/gygax_left_arm,
+ /obj/item/mecha_parts/part/gygax_right_arm,
+ /obj/item/mecha_parts/part/gygax_left_leg,
+ /obj/item/mecha_parts/part/gygax_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/effect/decal/mecha_wreckage/gygax/dark
name = "Dark Gygax wreckage"
@@ -126,38 +126,38 @@
name = "Ripley wreckage"
icon_state = "ripley-broken"
- New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/mecha_parts/part/ripley_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/ripley/New()
+ ..()
+ var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/effect/decal/mecha_wreckage/ripley/firefighter
name = "Firefighter wreckage"
icon_state = "firefighter-broken"
- New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/mecha_parts/part/ripley_right_leg,
- /obj/item/clothing/suit/fire)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/ripley/firefighter/New()
+ ..()
+ var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg,
+ /obj/item/clothing/suit/fire)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/effect/decal/mecha_wreckage/ripley/deathripley
name = "Death-Ripley wreckage"
@@ -167,42 +167,42 @@
name = "Honker wreckage"
icon_state = "honker-broken"
- New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/chassis/honker,
- /obj/item/mecha_parts/part/honker_torso,
- /obj/item/mecha_parts/part/honker_head,
- /obj/item/mecha_parts/part/honker_left_arm,
- /obj/item/mecha_parts/part/honker_right_arm,
- /obj/item/mecha_parts/part/honker_left_leg,
- /obj/item/mecha_parts/part/honker_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/honker/New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/chassis/honker,
+ /obj/item/mecha_parts/part/honker_torso,
+ /obj/item/mecha_parts/part/honker_head,
+ /obj/item/mecha_parts/part/honker_left_arm,
+ /obj/item/mecha_parts/part/honker_right_arm,
+ /obj/item/mecha_parts/part/honker_left_leg,
+ /obj/item/mecha_parts/part/honker_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/effect/decal/mecha_wreckage/durand
name = "Durand wreckage"
icon_state = "durand-broken"
- New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/part/durand_torso,
- /obj/item/mecha_parts/part/durand_head,
- /obj/item/mecha_parts/part/durand_left_arm,
- /obj/item/mecha_parts/part/durand_right_arm,
- /obj/item/mecha_parts/part/durand_left_leg,
- /obj/item/mecha_parts/part/durand_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/durand/New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/part/durand_torso,
+ /obj/item/mecha_parts/part/durand_head,
+ /obj/item/mecha_parts/part/durand_left_arm,
+ /obj/item/mecha_parts/part/durand_right_arm,
+ /obj/item/mecha_parts/part/durand_left_leg,
+ /obj/item/mecha_parts/part/durand_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/effect/decal/mecha_wreckage/durand/old
@@ -218,18 +218,18 @@
name = "Odysseus wreckage"
icon_state = "odysseus-broken"
- New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/part/odysseus_torso,
- /obj/item/mecha_parts/part/odysseus_head,
- /obj/item/mecha_parts/part/odysseus_left_arm,
- /obj/item/mecha_parts/part/odysseus_right_arm,
- /obj/item/mecha_parts/part/odysseus_left_leg,
- /obj/item/mecha_parts/part/odysseus_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/effect/decal/mecha_wreckage/odysseus/New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/part/odysseus_torso,
+ /obj/item/mecha_parts/part/odysseus_head,
+ /obj/item/mecha_parts/part/odysseus_left_arm,
+ /obj/item/mecha_parts/part/odysseus_right_arm,
+ /obj/item/mecha_parts/part/odysseus_left_leg,
+ /obj/item/mecha_parts/part/odysseus_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 3cffb3f7eaf..a5cd1b8b6b1 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -16,40 +16,40 @@
var/list/gibamounts = list()
var/list/gibdirections = list() //of lists
- New(location, datum/dna/MobDNA)
- ..()
+/obj/effect/gibspawner/New(location, datum/dna/MobDNA)
+ ..()
- if(istype(loc,/turf)) //basically if a badmin spawns it
- Gib(loc, MobDNA)
+ if(istype(loc,/turf)) //basically if a badmin spawns it
+ Gib(loc, MobDNA)
- proc/Gib(atom/location, datum/dna/MobDNA = null)
- if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
- to_chat(world, "Gib list length mismatch!")
- return
+/obj/effect/gibspawner/proc/Gib(atom/location, datum/dna/MobDNA = null)
+ if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
+ to_chat(world, "Gib list length mismatch!")
+ return
- var/obj/effect/decal/cleanable/blood/gibs/gib = null
+ var/obj/effect/decal/cleanable/blood/gibs/gib = null
- if(sparks)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, location)
- s.start()
+ if(sparks)
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(2, 1, location)
+ s.start()
- for(var/i = 1, i<= gibtypes.len, i++)
- if(gibamounts[i])
- for(var/j = 1, j<= gibamounts[i], j++)
- var/gibType = gibtypes[i]
- gib = new gibType(location)
+ for(var/i = 1, i<= gibtypes.len, i++)
+ if(gibamounts[i])
+ for(var/j = 1, j<= gibamounts[i], j++)
+ var/gibType = gibtypes[i]
+ gib = new gibType(location)
- gib.blood_DNA = list()
- if(MobDNA)
- gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
- else if(istype(src, /obj/effect/gibspawner/xeno))
- gib.blood_DNA["UNKNOWN DNA"] = "X*"
- else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
- gib.blood_DNA["Non-human DNA"] = "A+"
- var/list/directions = gibdirections[i]
- if(directions.len)
- gib.streak(directions)
+ gib.blood_DNA = list()
+ if(MobDNA)
+ gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
+ else if(istype(src, /obj/effect/gibspawner/xeno))
+ gib.blood_DNA["UNKNOWN DNA"] = "X*"
+ else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
+ gib.blood_DNA["Non-human DNA"] = "A+"
+ var/list/directions = gibdirections[i]
+ if(directions.len)
+ gib.streak(directions)
- qdel(src)
+ qdel(src)
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 5446ba348e6..b75df275659 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -1,36 +1,35 @@
-/obj/effect/gibspawner
- generic
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
- gibamounts = list(2,2,1)
+/obj/effect/gibspawner/generic
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
+ gibamounts = list(2,2,1)
- New()
- gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
- ..()
+/obj/effect/gibspawner/generic/New()
+ gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
+ ..()
- human
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
- gibamounts = list(1,1,1,1,1,1,1)
+/obj/effect/gibspawner/human
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
+ gibamounts = list(1,1,1,1,1,1,1)
- New()
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
- gibamounts[6] = pick(0,1,2)
- ..()
+/obj/effect/gibspawner/human/New()
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
+ gibamounts[6] = pick(0,1,2)
+ ..()
- xeno
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
- gibamounts = list(1,1,1,1,1,1,1)
+/obj/effect/gibspawner/xeno
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
+ gibamounts = list(1,1,1,1,1,1,1)
- New()
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
- gibamounts[6] = pick(0,1,2)
- ..()
+/obj/effect/gibspawner/xeno/New()
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
+ gibamounts[6] = pick(0,1,2)
+ ..()
- robot
- sparks = 1
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
- gibamounts = list(1,1,1,1,1,1)
+/obj/effect/gibspawner/robot
+ sparks = 1
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
+ gibamounts = list(1,1,1,1,1,1)
- New()
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
- gibamounts[6] = pick(0,1,2)
- ..()
\ No newline at end of file
+/obj/effect/gibspawner/robot/New()
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
+ gibamounts[6] = pick(0,1,2)
+ ..()
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index cf698f439f5..286bd315b61 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -17,15 +17,16 @@
name = "body bags"
desc = "This box contains body bags."
icon_state = "bodybags"
- New()
- ..()
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
- new /obj/item/bodybag(src)
+
+/obj/item/storage/box/bodybags/New()
+ ..()
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
+ new /obj/item/bodybag(src)
/obj/structure/closet/body_bag
@@ -40,47 +41,47 @@
density = 0
- attackby(W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if(user.get_active_hand() != W)
- return
- if(!in_range(src, user) && src.loc != user)
- return
- t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
- if(t)
- src.name = "body bag - "
- src.name += t
- src.overlays += image(src.icon, "bodybag_label")
- else
- src.name = "body bag"
- //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
+/obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/pen))
+ var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ if(user.get_active_hand() != W)
return
- else if(istype(W, /obj/item/wirecutters))
- to_chat(user, "You cut the tag off the bodybag")
+ if(!in_range(src, user) && src.loc != user)
+ return
+ t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
+ if(t)
+ src.name = "body bag - "
+ src.name += t
+ src.overlays += image(src.icon, "bodybag_label")
+ else
src.name = "body bag"
- src.overlays.Cut()
- return
+ //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
+ return
+ else if(istype(W, /obj/item/wirecutters))
+ to_chat(user, "You cut the tag off the bodybag")
+ src.name = "body bag"
+ src.overlays.Cut()
+ return
- close()
- if(..())
- density = 0
- return 1
- return 0
+/obj/structure/closet/body_bag/close()
+ if(..())
+ density = 0
+ return 1
+ return 0
- MouseDrop(over_object, src_location, over_location)
- ..()
- if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
- if(!ishuman(usr)) return
- if(opened) return 0
- if(contents.len) return 0
- visible_message("[usr] folds up the [src.name]")
- new item_path(get_turf(src))
- spawn(0)
- qdel(src)
- return
+/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
+ ..()
+ if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
+ if(!ishuman(usr)) return
+ if(opened) return 0
+ if(contents.len) return 0
+ visible_message("[usr] folds up the [src.name]")
+ new item_path(get_turf(src))
+ spawn(0)
+ qdel(src)
+ return
/obj/structure/closet/body_bag/relaymove(mob/user as mob)
if(user.stat)
@@ -89,4 +90,4 @@
// Make it possible to escape from bodybags in morgues and crematoriums
if(loc && (isturf(loc) || istype(loc, /obj/structure/morgue) || istype(loc, /obj/structure/crematorium)))
if(!open())
- to_chat(user, "It won't budge!")
\ No newline at end of file
+ to_chat(user, "It won't budge!")
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 19e26f06bf5..59cf53451cd 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -46,9 +46,10 @@
return
/obj/item/radio/beacon/bacon //Probably a better way of doing this, I'm lazy.
- proc/digest_delay()
+
+/obj/item/radio/beacon/bacon/proc/digest_delay()
spawn(600)
- qdel(src)
+ qdel(src)
// SINGULO BEACON SPAWNER
/obj/item/radio/beacon/syndicate
@@ -82,4 +83,4 @@
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 2a4a5a3fab1..a91410c28fe 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -159,21 +159,21 @@
var/b2y1 = 0
var/b2y2 = 0
- New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0)
- if(!Target) return
+/datum/bullethole/New(obj/item/target/Target, pixel_x = 0, pixel_y = 0)
+ if(!Target) return
- // Randomize the first box
- b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
- b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
- b1y = pixel_y
- if(prob(35))
- b1y += rand(-4,4)
+ // Randomize the first box
+ b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
+ b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
+ b1y = pixel_y
+ if(prob(35))
+ b1y += rand(-4,4)
- // Randomize the second box
- b2x = pixel_x
- if(prob(35))
- b2x += rand(-4,4)
- b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
- b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
+ // Randomize the second box
+ b2x = pixel_x
+ if(prob(35))
+ b2x += rand(-4,4)
+ b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
+ b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
- Target.bulletholes.Add(src)
+ Target.bulletholes.Add(src)
diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm
index 264753dc695..a4599a2e79f 100644
--- a/code/game/objects/items/weapons/caution.dm
+++ b/code/game/objects/items/weapons/caution.dm
@@ -10,53 +10,52 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
- proximity_sign
- var/timing = 0
- var/armed = 0
- var/timepassed = 0
+/obj/item/caution/proximity_sign
+ var/timing = 0
+ var/armed = 0
+ var/timepassed = 0
- attack_self(mob/user as mob)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.mind.assigned_role != "Janitor")
- return
- if(armed)
- armed = 0
- to_chat(user, "You disarm \the [src].")
- return
- timing = !timing
- if(timing)
- processing_objects.Add(src)
- else
- armed = 0
- timepassed = 0
- to_chat(H, "You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]")
+/obj/item/caution/proximity_sign/attack_self(mob/user as mob)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.mind.assigned_role != "Janitor")
+ return
+ if(armed)
+ armed = 0
+ to_chat(user, "You disarm \the [src].")
+ return
+ timing = !timing
+ if(timing)
+ processing_objects.Add(src)
+ else
+ armed = 0
+ timepassed = 0
+ to_chat(H, "You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]")
- process()
- if(!timing)
- processing_objects.Remove(src)
- timepassed++
- if(timepassed >= 15 && !armed)
- armed = 1
- timing = 0
+/obj/item/caution/proximity_sign/process()
+ if(!timing)
+ processing_objects.Remove(src)
+ timepassed++
+ if(timepassed >= 15 && !armed)
+ armed = 1
+ timing = 0
- HasProximity(atom/movable/AM as mob|obj)
- if(armed)
- if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
- var/mob/living/carbon/C = AM
- if(C.m_intent != MOVE_INTENT_WALK)
- src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
- explosion(src.loc,-1,0,2)
- if(ishuman(C))
- dead_legs(C)
- if(src)
- qdel(src)
-
- proc/dead_legs(mob/living/carbon/human/H as mob)
- var/obj/item/organ/external/l = H.get_organ("l_leg")
- var/obj/item/organ/external/r = H.get_organ("r_leg")
- if(l)
- l.droplimb(0, DROPLIMB_SHARP)
- if(r)
- r.droplimb(0, DROPLIMB_SHARP)
+/obj/item/caution/proximity_sign/HasProximity(atom/movable/AM as mob|obj)
+ if(armed)
+ if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
+ var/mob/living/carbon/C = AM
+ if(C.m_intent != MOVE_INTENT_WALK)
+ src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
+ explosion(src.loc,-1,0,2)
+ if(ishuman(C))
+ dead_legs(C)
+ if(src)
+ qdel(src)
+/obj/item/caution/proximity_sign/proc/dead_legs(mob/living/carbon/human/H as mob)
+ var/obj/item/organ/external/l = H.get_organ("l_leg")
+ var/obj/item/organ/external/r = H.get_organ("r_leg")
+ if(l)
+ l.droplimb(0, DROPLIMB_SHARP)
+ if(r)
+ r.droplimb(0, DROPLIMB_SHARP)
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 3a7e203101d..681db222d0b 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -159,9 +159,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = HULKBLOCK
- ..()
+
+/obj/item/dnainjector/hulkmut/New()
+ block = HULKBLOCK
+ ..()
/obj/item/dnainjector/antihulk
name = "DNA-Injector (Anti-Hulk)"
@@ -169,9 +170,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = HULKBLOCK
- ..()
+
+/obj/item/dnainjector/antihulk/New()
+ block = HULKBLOCK
+ ..()
/obj/item/dnainjector/xraymut
name = "DNA-Injector (Xray)"
@@ -179,9 +181,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 8
- New()
- block = XRAYBLOCK
- ..()
+
+/obj/item/dnainjector/xraymut/New()
+ block = XRAYBLOCK
+ ..()
/obj/item/dnainjector/antixray
name = "DNA-Injector (Anti-Xray)"
@@ -189,10 +192,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 8
- New()
- block = XRAYBLOCK
- ..()
+/obj/item/dnainjector/antixray/New()
+ block = XRAYBLOCK
+ ..()
/obj/item/dnainjector/firemut
name = "DNA-Injector (Fire)"
@@ -200,9 +203,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 10
- New()
- block = FIREBLOCK
- ..()
+
+/obj/item/dnainjector/firemut/New()
+ block = FIREBLOCK
+ ..()
/obj/item/dnainjector/antifire
name = "DNA-Injector (Anti-Fire)"
@@ -210,9 +214,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 10
- New()
- block = FIREBLOCK
- ..()
+
+/obj/item/dnainjector/antifire/New()
+ block = FIREBLOCK
+ ..()
/obj/item/dnainjector/telemut
name = "DNA-Injector (Tele.)"
@@ -220,9 +225,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 12
- New()
- block = TELEBLOCK
- ..()
+
+/obj/item/dnainjector/telemut/New()
+ block = TELEBLOCK
+ ..()
/obj/item/dnainjector/telemut/darkbundle
name = "DNA injector"
@@ -235,9 +241,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 12
- New()
- block = TELEBLOCK
- ..()
+
+/obj/item/dnainjector/antitele/New()
+ block = TELEBLOCK
+ ..()
/obj/item/dnainjector/nobreath
name = "DNA-Injector (Breathless)"
@@ -245,9 +252,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = BREATHLESSBLOCK
- ..()
+
+/obj/item/dnainjector/nobreath/New()
+ block = BREATHLESSBLOCK
+ ..()
/obj/item/dnainjector/antinobreath
name = "DNA-Injector (Anti-Breathless)"
@@ -255,9 +263,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = BREATHLESSBLOCK
- ..()
+
+/obj/item/dnainjector/antinobreath/New()
+ block = BREATHLESSBLOCK
+ ..()
/obj/item/dnainjector/remoteview
name = "DNA-Injector (Remote View)"
@@ -265,9 +274,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = REMOTEVIEWBLOCK
- ..()
+
+/obj/item/dnainjector/remoteview/New()
+ block = REMOTEVIEWBLOCK
+ ..()
/obj/item/dnainjector/antiremoteview
name = "DNA-Injector (Anti-Remote View)"
@@ -275,9 +285,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = REMOTEVIEWBLOCK
- ..()
+
+/obj/item/dnainjector/antiremoteview/New()
+ block = REMOTEVIEWBLOCK
+ ..()
/obj/item/dnainjector/regenerate
name = "DNA-Injector (Regeneration)"
@@ -285,9 +296,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = REGENERATEBLOCK
- ..()
+
+/obj/item/dnainjector/regenerate/New()
+ block = REGENERATEBLOCK
+ ..()
/obj/item/dnainjector/antiregenerate
name = "DNA-Injector (Anti-Regeneration)"
@@ -295,9 +307,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = REGENERATEBLOCK
- ..()
+
+/obj/item/dnainjector/antiregenerate/New()
+ block = REGENERATEBLOCK
+ ..()
/obj/item/dnainjector/runfast
name = "DNA-Injector (Increase Run)"
@@ -305,9 +318,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = INCREASERUNBLOCK
- ..()
+
+/obj/item/dnainjector/runfast/New()
+ block = INCREASERUNBLOCK
+ ..()
/obj/item/dnainjector/antirunfast
name = "DNA-Injector (Anti-Increase Run)"
@@ -315,9 +329,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = INCREASERUNBLOCK
- ..()
+
+/obj/item/dnainjector/antirunfast/New()
+ block = INCREASERUNBLOCK
+ ..()
/obj/item/dnainjector/morph
name = "DNA-Injector (Morph)"
@@ -325,9 +340,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = MORPHBLOCK
- ..()
+
+/obj/item/dnainjector/morph/New()
+ block = MORPHBLOCK
+ ..()
/obj/item/dnainjector/antimorph
name = "DNA-Injector (Anti-Morph)"
@@ -335,9 +351,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = MORPHBLOCK
- ..()
+
+/obj/item/dnainjector/antimorph/New()
+ block = MORPHBLOCK
+ ..()
/obj/item/dnainjector/noprints
name = "DNA-Injector (No Prints)"
@@ -345,9 +362,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = NOPRINTSBLOCK
- ..()
+
+/obj/item/dnainjector/noprints/New()
+ block = NOPRINTSBLOCK
+ ..()
/obj/item/dnainjector/antinoprints
name = "DNA-Injector (Anti-No Prints)"
@@ -355,9 +373,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = NOPRINTSBLOCK
- ..()
+
+/obj/item/dnainjector/antinoprints/New()
+ block = NOPRINTSBLOCK
+ ..()
/obj/item/dnainjector/insulation
name = "DNA-Injector (Shock Immunity)"
@@ -365,9 +384,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = SHOCKIMMUNITYBLOCK
- ..()
+
+/obj/item/dnainjector/insulation/New()
+ block = SHOCKIMMUNITYBLOCK
+ ..()
/obj/item/dnainjector/antiinsulation
name = "DNA-Injector (Anti-Shock Immunity)"
@@ -375,9 +395,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = SHOCKIMMUNITYBLOCK
- ..()
+
+/obj/item/dnainjector/antiinsulation/New()
+ block = SHOCKIMMUNITYBLOCK
+ ..()
/obj/item/dnainjector/midgit
name = "DNA-Injector (Small Size)"
@@ -385,9 +406,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = SMALLSIZEBLOCK
- ..()
+
+/obj/item/dnainjector/midgit/New()
+ block = SMALLSIZEBLOCK
+ ..()
/obj/item/dnainjector/antimidgit
name = "DNA-Injector (Anti-Small Size)"
@@ -395,9 +417,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = SMALLSIZEBLOCK
- ..()
+
+/obj/item/dnainjector/antimidgit/New()
+ block = SMALLSIZEBLOCK
+ ..()
/////////////////////////////////////
/obj/item/dnainjector/antiglasses
@@ -406,9 +429,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 1
- New()
- block = GLASSESBLOCK
- ..()
+
+/obj/item/dnainjector/antiglasses/New()
+ block = GLASSESBLOCK
+ ..()
/obj/item/dnainjector/glassesmut
name = "DNA-Injector (Glasses)"
@@ -416,9 +440,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 1
- New()
- block = GLASSESBLOCK
- ..()
+
+/obj/item/dnainjector/glassesmut/New()
+ block = GLASSESBLOCK
+ ..()
/obj/item/dnainjector/epimut
name = "DNA-Injector (Epi.)"
@@ -426,9 +451,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 3
- New()
- block = EPILEPSYBLOCK
- ..()
+
+/obj/item/dnainjector/epimut/New()
+ block = EPILEPSYBLOCK
+ ..()
/obj/item/dnainjector/antiepi
name = "DNA-Injector (Anti-Epi.)"
@@ -436,9 +462,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 3
- New()
- block = EPILEPSYBLOCK
- ..()
+
+/obj/item/dnainjector/antiepi/New()
+ block = EPILEPSYBLOCK
+ ..()
/obj/item/dnainjector/anticough
name = "DNA-Injector (Anti-Cough)"
@@ -446,9 +473,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 5
- New()
- block = COUGHBLOCK
- ..()
+
+/obj/item/dnainjector/anticough/New()
+ block = COUGHBLOCK
+ ..()
/obj/item/dnainjector/coughmut
name = "DNA-Injector (Cough)"
@@ -456,9 +484,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 5
- New()
- block = COUGHBLOCK
- ..()
+
+/obj/item/dnainjector/coughmut/New()
+ block = COUGHBLOCK
+ ..()
/obj/item/dnainjector/clumsymut
name = "DNA-Injector (Clumsy)"
@@ -466,9 +495,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 6
- New()
- block = CLUMSYBLOCK
- ..()
+
+/obj/item/dnainjector/clumsymut/New()
+ block = CLUMSYBLOCK
+ ..()
/obj/item/dnainjector/anticlumsy
name = "DNA-Injector (Anti-Clumy)"
@@ -476,9 +506,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 6
- New()
- block = CLUMSYBLOCK
- ..()
+
+/obj/item/dnainjector/anticlumsy/New()
+ block = CLUMSYBLOCK
+ ..()
/obj/item/dnainjector/antitour
name = "DNA-Injector (Anti-Tour.)"
@@ -486,9 +517,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 7
- New()
- block = TWITCHBLOCK
- ..()
+
+/obj/item/dnainjector/antitour/New()
+ block = TWITCHBLOCK
+ ..()
/obj/item/dnainjector/tourmut
name = "DNA-Injector (Tour.)"
@@ -496,9 +528,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 7
- New()
- block = TWITCHBLOCK
- ..()
+
+/obj/item/dnainjector/tourmut/New()
+ block = TWITCHBLOCK
+ ..()
/obj/item/dnainjector/stuttmut
name = "DNA-Injector (Stutt.)"
@@ -506,9 +539,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 9
- New()
- block = NERVOUSBLOCK
- ..()
+
+/obj/item/dnainjector/stuttmut/New()
+ block = NERVOUSBLOCK
+ ..()
/obj/item/dnainjector/antistutt
@@ -517,9 +551,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 9
- New()
- block = NERVOUSBLOCK
- ..()
+
+/obj/item/dnainjector/antistutt/New()
+ block = NERVOUSBLOCK
+ ..()
/obj/item/dnainjector/blindmut
name = "DNA-Injector (Blind)"
@@ -527,9 +562,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 11
- New()
- block = BLINDBLOCK
- ..()
+
+/obj/item/dnainjector/blindmut/New()
+ block = BLINDBLOCK
+ ..()
/obj/item/dnainjector/antiblind
name = "DNA-Injector (Anti-Blind)"
@@ -537,9 +573,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 11
- New()
- block = BLINDBLOCK
- ..()
+
+/obj/item/dnainjector/antiblind/New()
+ block = BLINDBLOCK
+ ..()
/obj/item/dnainjector/telemut
name = "DNA-Injector (Tele.)"
@@ -547,9 +584,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 12
- New()
- block = TELEBLOCK
- ..()
+
+/obj/item/dnainjector/telemut/New()
+ block = TELEBLOCK
+ ..()
/obj/item/dnainjector/antitele
name = "DNA-Injector (Anti-Tele.)"
@@ -557,9 +595,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 12
- New()
- block = TELEBLOCK
- ..()
+
+/obj/item/dnainjector/antitele/New()
+ block = TELEBLOCK
+ ..()
/obj/item/dnainjector/deafmut
name = "DNA-Injector (Deaf)"
@@ -567,9 +606,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 13
- New()
- block = DEAFBLOCK
- ..()
+
+/obj/item/dnainjector/deafmut/New()
+ block = DEAFBLOCK
+ ..()
/obj/item/dnainjector/antideaf
name = "DNA-Injector (Anti-Deaf)"
@@ -577,9 +617,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 13
- New()
- block = DEAFBLOCK
- ..()
+
+/obj/item/dnainjector/antideaf/New()
+ block = DEAFBLOCK
+ ..()
/obj/item/dnainjector/hallucination
name = "DNA-Injector (Halluctination)"
@@ -587,9 +628,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 2
- New()
- block = HALLUCINATIONBLOCK
- ..()
+
+/obj/item/dnainjector/hallucination/New()
+ block = HALLUCINATIONBLOCK
+ ..()
/obj/item/dnainjector/antihallucination
name = "DNA-Injector (Anti-Hallucination)"
@@ -597,9 +639,10 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 2
- New()
- block = HALLUCINATIONBLOCK
- ..()
+
+/obj/item/dnainjector/antihallucination/New()
+ block = HALLUCINATIONBLOCK
+ ..()
/obj/item/dnainjector/h2m
name = "DNA-Injector (Human > Monkey)"
@@ -607,9 +650,10 @@
datatype = DNA2_BUF_SE
value = 0xFFF
//block = 14
- New()
- block = MONKEYBLOCK
- ..()
+
+/obj/item/dnainjector/h2m/New()
+ block = MONKEYBLOCK
+ ..()
/obj/item/dnainjector/m2h
name = "DNA-Injector (Monkey > Human)"
@@ -617,6 +661,7 @@
datatype = DNA2_BUF_SE
value = 0x001
//block = 14
- New()
- block = MONKEYBLOCK
- ..()
+
+/obj/item/dnainjector/m2h/New()
+ block = MONKEYBLOCK
+ ..()
diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm
index fc13fa69f79..bbad0eb9157 100644
--- a/code/game/objects/items/weapons/dnascrambler.dm
+++ b/code/game/objects/items/weapons/dnascrambler.dm
@@ -6,52 +6,52 @@
icon_state = "lepopen"
var/used = null
+/obj/item/dnascrambler/update_icon()
+ if(used)
+ icon_state = "lepopen0"
+ else
+ icon_state = "lepopen"
+
+/obj/item/dnascrambler/attack(mob/M as mob, mob/user as mob)
+ if(!M || !user)
+ return
+
+ if(!ishuman(M) || !ishuman(user))
+ return
+
+ if(used)
+ return
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(NO_DNA in H.dna.species.species_traits)
+ to_chat(user, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.")
+ return
+
+ if(M == user)
+ user.visible_message("[user] injects [user.p_them()]self with [src]!")
+ injected(user, user)
+ else
+ user.visible_message("[user] is trying to inject [M] with [src]!")
+ if(do_mob(user,M,30))
+ user.visible_message("[user] injects [M] with [src].")
+ injected(M, user)
+ else
+ to_chat(user, "You failed to inject [M].")
+
+/obj/item/dnascrambler/proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
+ if(istype(target))
+ var/mob/living/carbon/human/H = target
+ scramble(1, H, 100)
+ H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
+ H.sync_organ_dna(assimilate = 1)
+ H.update_body(0)
+ H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
+ H.reset_markings() //...Or markings.
+ H.dna.ResetUIFrom(H)
+ target.update_icons()
+
+ add_attack_logs(user, target, "injected with [src]")
+ used = 1
update_icon()
- if(used)
- icon_state = "lepopen0"
- else
- icon_state = "lepopen"
-
- attack(mob/M as mob, mob/user as mob)
- if(!M || !user)
- return
-
- if(!ishuman(M) || !ishuman(user))
- return
-
- if(used)
- return
-
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(NO_DNA in H.dna.species.species_traits)
- to_chat(user, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.")
- return
-
- if(M == user)
- user.visible_message("[user] injects [user.p_them()]self with [src]!")
- injected(user, user)
- else
- user.visible_message("[user] is trying to inject [M] with [src]!")
- if(do_mob(user,M,30))
- user.visible_message("[user] injects [M] with [src].")
- injected(M, user)
- else
- to_chat(user, "You failed to inject [M].")
-
- proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
- if(istype(target))
- var/mob/living/carbon/human/H = target
- scramble(1, H, 100)
- H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
- H.sync_organ_dna(assimilate = 1)
- H.update_body(0)
- H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
- H.reset_markings() //...Or markings.
- H.dna.ResetUIFrom(H)
- target.update_icons()
-
- add_attack_logs(user, target, "injected with [src]")
- used = 1
- update_icon()
- name = "used " + name
+ name = "used " + name
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 9e836fecc87..3de4fc4cf8d 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -432,18 +432,18 @@
desc = "Used for emergency sealing of air breaches."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+/obj/item/grenade/chem_grenade/metalfoam/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("aluminum", 30)
- B2.reagents.add_reagent("fluorosurfactant", 10)
- B2.reagents.add_reagent("sacid", 10)
+ B1.reagents.add_reagent("aluminum", 30)
+ B2.reagents.add_reagent("fluorosurfactant", 10)
+ B2.reagents.add_reagent("sacid", 10)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/incendiary
@@ -451,19 +451,19 @@
desc = "Used for clearing rooms of living things."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+/obj/item/grenade/chem_grenade/incendiary/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("plasma", 25)
- B2.reagents.add_reagent("sacid", 25)
+ B1.reagents.add_reagent("phosphorus", 25)
+ B2.reagents.add_reagent("plasma", 25)
+ B2.reagents.add_reagent("sacid", 25)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/antiweed
@@ -471,20 +471,20 @@
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+/obj/item/grenade/chem_grenade/antiweed/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("atrazine", 30)
- B1.reagents.add_reagent("potassium", 20)
- B2.reagents.add_reagent("phosphorus", 20)
- B2.reagents.add_reagent("sugar", 20)
- B2.reagents.add_reagent("atrazine", 10)
+ B1.reagents.add_reagent("atrazine", 30)
+ B1.reagents.add_reagent("potassium", 20)
+ B2.reagents.add_reagent("phosphorus", 20)
+ B2.reagents.add_reagent("sugar", 20)
+ B2.reagents.add_reagent("atrazine", 10)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/cleaner
@@ -492,18 +492,18 @@
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+/obj/item/grenade/chem_grenade/cleaner/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("fluorosurfactant", 40)
- B2.reagents.add_reagent("cleaner", 10)
- B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
+ B1.reagents.add_reagent("fluorosurfactant", 40)
+ B2.reagents.add_reagent("cleaner", 10)
+ B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/teargas
@@ -511,19 +511,19 @@
desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+/obj/item/grenade/chem_grenade/teargas/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("condensedcapsaicin", 25)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
+ B1.reagents.add_reagent("condensedcapsaicin", 25)
+ B1.reagents.add_reagent("potassium", 25)
+ B2.reagents.add_reagent("phosphorus", 25)
+ B2.reagents.add_reagent("sugar", 25)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/facid
name = "acid grenade"
@@ -550,19 +550,19 @@
desc = "Contains sarin gas; extremely deadly and fast acting; use with extreme caution."
stage = READY
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+/obj/item/grenade/chem_grenade/saringas/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("sarin", 25)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
+ B1.reagents.add_reagent("sarin", 25)
+ B1.reagents.add_reagent("potassium", 25)
+ B2.reagents.add_reagent("phosphorus", 25)
+ B2.reagents.add_reagent("sugar", 25)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
#undef EMPTY
#undef WIRED
diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm
index 18dbf93ae45..bce9861fb72 100644
--- a/code/game/objects/items/weapons/grenades/clowngrenade.dm
+++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm
@@ -10,44 +10,34 @@
var/path = 0
var/affected_area = 2
- prime()
- ..()
- playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3)
- /*
- for(var/turf/simulated/floor/T in view(affected_area, src.loc))
- if(prob(75))
- banana(T)
- */
- var/i = 0
- var/number = 0
- for(var/direction in alldirs)
- for(i = 0; i < 2; i++)
- number++
- var/obj/item/grown/bananapeel/traitorpeel/peel = new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
- /* var/direction = pick(alldirs)
- var/spaces = pick(1;150, 2)
- var/a = 0
- for(a = 0; a < spaces; a++)
- step(peel,direction)*/
- var/a = 1
- if(number & 2)
- for(a = 1; a <= 2; a++)
- step(peel,direction)
- else
+/obj/item/grenade/clown_grenade/prime()
+ ..()
+ playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3)
+ /*
+ for(var/turf/simulated/floor/T in view(affected_area, src.loc))
+ if(prob(75))
+ banana(T)
+ */
+ var/i = 0
+ var/number = 0
+ for(var/direction in alldirs)
+ for(i = 0; i < 2; i++)
+ number++
+ var/obj/item/grown/bananapeel/traitorpeel/peel = new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
+ /* var/direction = pick(alldirs)
+ var/spaces = pick(1;150, 2)
+ var/a = 0
+ for(a = 0; a < spaces; a++)
+ step(peel,direction)*/
+ var/a = 1
+ if(number & 2)
+ for(a = 1; a <= 2; a++)
step(peel,direction)
- new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
- qdel(src)
- return
-/*
- proc/banana(turf/T as turf)
- if(!T || !istype(T))
- return
- if(locate(/obj/structure/grille) in T)
- return
- if(locate(/obj/structure/window) in T)
- return
- new /obj/item/grown/bananapeel/traitorpeel(T)
-*/
+ else
+ step(peel,direction)
+ new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
+ qdel(src)
+ return
/obj/item/grown/bananapeel/traitorpeel
trip_stun = 0
diff --git a/code/game/objects/items/weapons/grenades/custom_grenades.dm b/code/game/objects/items/weapons/grenades/custom_grenades.dm
index 133cc906850..b5598bc86be 100644
--- a/code/game/objects/items/weapons/grenades/custom_grenades.dm
+++ b/code/game/objects/items/weapons/grenades/custom_grenades.dm
@@ -3,17 +3,17 @@
desc = "From the makers of BLAM! brand foaming space cleaner, this bomb guarantees steady work for any janitor."
stage = 2
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/list/muck = list("blood","carbon","flour","radium")
- var/filth = pick(muck - "radium") // not usually radioactive
+/obj/item/grenade/chem_grenade/dirt/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/list/muck = list("blood","carbon","flour","radium")
+ var/filth = pick(muck - "radium") // not usually radioactive
- B1.reagents.add_reagent(filth,25)
- if(prob(25))
- B1.reagents.add_reagent(pick(muck - filth,25)) // but sometimes...
+ B1.reagents.add_reagent(filth,25)
+ if(prob(25))
+ B1.reagents.add_reagent(pick(muck - filth,25)) // but sometimes...
- beakers += B1
+ beakers += B1
/obj/item/grenade/chem_grenade/meat
@@ -22,18 +22,18 @@
stage = 2
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+/obj/item/grenade/chem_grenade/meat/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("blood",60)
- if(prob(5))
- B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess
- B2.reagents.add_reagent("cryoxadone",30)
+ B1.reagents.add_reagent("blood",60)
+ if(prob(5))
+ B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess
+ B2.reagents.add_reagent("cryoxadone",30)
- beakers += B1
- beakers += B2
+ beakers += B1
+ beakers += B2
/obj/item/grenade/chem_grenade/holywater
payload_name = "holy water"
@@ -41,11 +41,11 @@
stage = 2
det_time = 30
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B = new(src)
- B.reagents.add_reagent("holywater",100)
- beakers += B
+/obj/item/grenade/chem_grenade/holywater/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B = new(src)
+ B.reagents.add_reagent("holywater",100)
+ beakers += B
/obj/item/grenade/chem_grenade/hellwater
payload_name = "hell water"
@@ -53,15 +53,15 @@
stage = 2
det_time = 30
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("hell_water",80)
- B1.reagents.add_reagent("sugar",20)
- B2.reagents.add_reagent("hell_water", 60)
- B2.reagents.add_reagent("potassium", 20)
- B2.reagents.add_reagent("phosphorus", 20)
+/obj/item/grenade/chem_grenade/hellwater/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+ B1.reagents.add_reagent("hell_water",80)
+ B1.reagents.add_reagent("sugar",20)
+ B2.reagents.add_reagent("hell_water", 60)
+ B2.reagents.add_reagent("potassium", 20)
+ B2.reagents.add_reagent("phosphorus", 20)
/obj/item/grenade/chem_grenade/drugs
@@ -69,40 +69,40 @@
desc = "How does it work?"
stage = 2
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+/obj/item/grenade/chem_grenade/drugs/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("space_drugs", 25)
- B1.reagents.add_reagent("lsd", 25)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
+ B1.reagents.add_reagent("space_drugs", 25)
+ B1.reagents.add_reagent("lsd", 25)
+ B1.reagents.add_reagent("potassium", 25)
+ B2.reagents.add_reagent("phosphorus", 25)
+ B2.reagents.add_reagent("sugar", 25)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
/obj/item/grenade/chem_grenade/ethanol
payload_name = "ethanol"
desc = "Ach, that hits the spot."
stage = 2
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+/obj/item/grenade/chem_grenade/ethanol/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("ethanol", 75)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
- B2.reagents.add_reagent("ethanol", 25)
+ B1.reagents.add_reagent("ethanol", 75)
+ B1.reagents.add_reagent("potassium", 25)
+ B2.reagents.add_reagent("phosphorus", 25)
+ B2.reagents.add_reagent("sugar", 25)
+ B2.reagents.add_reagent("ethanol", 25)
- beakers += B1
- beakers += B2
- update_icon()
+ beakers += B1
+ beakers += B2
+ update_icon()
// -------------------------------------
// Grenades using new grenade assemblies
@@ -208,107 +208,67 @@
payload_name = "EMP"
stage = 2
- New()
- ..()
- var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("uranium",50)
- B2.reagents.add_reagent("iron",50)
- beakers += B1
- beakers += B2
+/obj/item/grenade/chem_grenade/emp/New()
+ ..()
+ var/obj/item/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+ B1.reagents.add_reagent("uranium",50)
+ B2.reagents.add_reagent("iron",50)
+ beakers += B1
+ beakers += B2
// Assembly Variants
-/obj/item/grenade/chem_grenade/emp/remote
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/signaler)
+/obj/item/grenade/chem_grenade/emp/remote/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/signaler)
-/obj/item/grenade/chem_grenade/emp/prox
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
+/obj/item/grenade/chem_grenade/emp/prox/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
-/obj/item/grenade/chem_grenade/emp/mine
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/mousetrap)
-
-// --------------------------------------
-// Dangerous slime core grenades
-// --------------------------------------
-/*
-/obj/item/grenade/chem_grenade/large/bluespace
- payload_name = "bluespace slime"
- desc = "A standard grenade casing containing weaponized slime extract."
- stage = 2
-
- New()
- ..()
- var/obj/item/slime_extract/bluespace/B1 = new(src)
- B1.Uses = rand(1,3)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B2.reagents.add_reagent("plasma",5 * B1.Uses)
- beakers += B1
- beakers += B2
-
-/obj/item/grenade/chem_grenade/large/bluespace/prox
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
-
-/obj/item/grenade/chem_grenade/large/bluespace/mine
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/mousetrap)
-
-/obj/item/grenade/chem_grenade/large/bluespace/remote
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/signaler)
-*/
+/obj/item/grenade/chem_grenade/emp/mine/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/mousetrap)
/obj/item/grenade/chem_grenade/large/monster
payload_name = "gold slime"
desc = "A standard grenade containing weaponized slime extract."
stage = 2
- New()
- ..()
- var/obj/item/slime_extract/gold/B1 = new(src)
- B1.Uses = rand(1,3)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B2.reagents.add_reagent("plasma",5 * B1.Uses)
- beakers += B1
- beakers += B2
+/obj/item/grenade/chem_grenade/large/monster/New()
+ ..()
+ var/obj/item/slime_extract/gold/B1 = new(src)
+ B1.Uses = rand(1,3)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+ B2.reagents.add_reagent("plasma",5 * B1.Uses)
+ beakers += B1
+ beakers += B2
-/obj/item/grenade/chem_grenade/large/monster/prox
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
+/obj/item/grenade/chem_grenade/large/monster/prox/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/prox_sensor)
-/obj/item/grenade/chem_grenade/large/monster/mine
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/mousetrap)
+/obj/item/grenade/chem_grenade/large/monster/mine/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/mousetrap)
-/obj/item/grenade/chem_grenade/large/monster/remote
- New()
- ..()
- CreateDefaultTrigger(/obj/item/assembly/signaler)
+/obj/item/grenade/chem_grenade/large/monster/remote/New()
+ ..()
+ CreateDefaultTrigger(/obj/item/assembly/signaler)
/obj/item/grenade/chem_grenade/large/feast
payload_name = "silver slime"
desc = "A standard grenade containing weaponized slime extract."
stage = 2
- New()
- ..()
- var/obj/item/slime_extract/silver/B1 = new(src)
- B1.Uses = rand(1,3)
- var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
- B2.reagents.add_reagent("plasma",5 * B1.Uses)
- beakers += B1
- beakers += B2
+/obj/item/grenade/chem_grenade/large/feast/New()
+ ..()
+ var/obj/item/slime_extract/silver/B1 = new(src)
+ B1.Uses = rand(1,3)
+ var/obj/item/reagent_containers/glass/beaker/B2 = new(src)
+ B2.reagents.add_reagent("plasma",5 * B1.Uses)
+ beakers += B1
+ beakers += B2
// --------------------------------------
// Syndie Kits
@@ -316,25 +276,30 @@
/obj/item/storage/box/syndie_kit/remotegrenade
name = "Remote Grenade Kit"
- New()
- ..()
- new /obj/item/grenade/chem_grenade/explosion/remote(src)
- new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
- new /obj/item/assembly/signaler(src)
- return
+
+/obj/item/storage/box/syndie_kit/remotegrenade/New()
+ ..()
+ new /obj/item/grenade/chem_grenade/explosion/remote(src)
+ new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
+ new /obj/item/assembly/signaler(src)
+ return
+
/obj/item/storage/box/syndie_kit/remoteemp
name = "Remote EMP Kit"
- New()
- ..()
- new /obj/item/grenade/chem_grenade/emp/remote(src)
- new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
- new /obj/item/assembly/signaler(src)
- return
+
+/obj/item/storage/box/syndie_kit/remoteemp/New()
+ ..()
+ new /obj/item/grenade/chem_grenade/emp/remote(src)
+ new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
+ new /obj/item/assembly/signaler(src)
+ return
+
/obj/item/storage/box/syndie_kit/remotelube
name = "Remote Lube Kit"
- New()
- ..()
- new /obj/item/grenade/chem_grenade/lube(src)
- new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
- new /obj/item/assembly/signaler(src)
- return
\ No newline at end of file
+
+/obj/item/storage/box/syndie_kit/remotelube/New()
+ ..()
+ new /obj/item/grenade/chem_grenade/lube(src)
+ new /obj/item/multitool(src) // used to adjust the chemgrenade's signaller
+ new /obj/item/assembly/signaler(src)
+ return
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index c4ccb3e83dc..6b9c4d815f4 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -8,31 +8,31 @@
slot_flags = SLOT_BELT
var/datum/effect_system/smoke_spread/bad/smoke
- New()
- ..()
- src.smoke = new /datum/effect_system/smoke_spread/bad
- src.smoke.attach(src)
+/obj/item/grenade/smokebomb/New()
+ ..()
+ src.smoke = new /datum/effect_system/smoke_spread/bad
+ src.smoke.attach(src)
- Destroy()
- QDEL_NULL(smoke)
- return ..()
+/obj/item/grenade/smokebomb/Destroy()
+ QDEL_NULL(smoke)
+ return ..()
- prime()
- playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- src.smoke.set_up(10, 0, usr.loc)
- spawn(0)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
+/obj/item/grenade/smokebomb/prime()
+ playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
+ src.smoke.set_up(10, 0, usr.loc)
+ spawn(0)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
- for(var/obj/structure/blob/B in view(8,src))
- var/damage = round(30/(get_dist(B,src)+1))
- B.health -= damage
- B.update_icon()
- sleep(80)
- qdel(src)
- return
+ for(var/obj/structure/blob/B in view(8,src))
+ var/damage = round(30/(get_dist(B,src)+1))
+ B.health -= damage
+ B.update_icon()
+ sleep(80)
+ qdel(src)
+ return
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index ac8c7d04a95..c6ece450f5e 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -24,8 +24,7 @@
icon_on = "zippoon"
icon_off = "zippo"
-/obj/item/lighter/random
- New()
+/obj/item/lighter/random/New()
var/color = pick("r","c","y","g")
icon_on = "lighter-[color]-on"
icon_off = "lighter-[color]"
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index f8cc628dc01..a38f6e11873 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -89,25 +89,25 @@
icon_state = "lightning"
desc = "test lightning"
- New()
+/obj/item/lightning/New()
icon = midicon
icon_state = "1"
- afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
- var/angle = get_angle(A, user)
-// to_chat(world, angle)
- angle = round(angle) + 45
- if(angle > 180)
- angle -= 180
- else
- angle += 180
+/obj/item/lightning/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
+ var/angle = get_angle(A, user)
+ //to_chat(world, angle)
+ angle = round(angle) + 45
+ if(angle > 180)
+ angle -= 180
+ else
+ angle += 180
- if(!angle)
- angle = 1
-// to_chat(world, "adjusted [angle]")
- icon_state = "[angle]"
-// to_chat(world, "[angle] [(get_dist(user, A) - 1)]")
- user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
+ if(!angle)
+ angle = 1
+ //to_chat(world, "adjusted [angle]")
+ icon_state = "[angle]"
+ //to_chat(world, "[angle] [(get_dist(user, A) - 1)]")
+ user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
/obj/item/newton
name = "newton cradle"
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 85a0e679bb6..5395f2e8395 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -167,10 +167,9 @@
desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch"
icon_state = "nt_deluxe"
-/obj/item/storage/backpack/satchel/withwallet
- New()
- ..()
- new /obj/item/storage/wallet/random( src )
+/obj/item/storage/backpack/satchel/withwallet/New()
+ ..()
+ new /obj/item/storage/wallet/random(src)
/obj/item/storage/backpack/satchel_norm
name = "satchel"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 3e7f2f6f8c9..da97f330c1f 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -207,122 +207,122 @@
w_class = WEIGHT_CLASS_NORMAL
allow_quick_empty = 1 // this function is superceded
- New()
- ..()
- //verbs -= /obj/item/storage/verb/quick_empty
- //verbs += /obj/item/storage/bag/sheetsnatcher/quick_empty
+/obj/item/storage/bag/sheetsnatcher/New()
+ ..()
+ //verbs -= /obj/item/storage/verb/quick_empty
+ //verbs += /obj/item/storage/bag/sheetsnatcher/quick_empty
- can_be_inserted(obj/item/W as obj, stop_messages = 0)
- if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood))
- if(!stop_messages)
- to_chat(usr, "The snatcher does not accept [W].")
- return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
- var/current = 0
- for(var/obj/item/stack/sheet/S in contents)
- current += S.amount
- if(capacity == current)//If it's full, you're done
- if(!stop_messages)
- to_chat(usr, "The snatcher is full.")
- return 0
- return 1
+/obj/item/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W as obj, stop_messages = 0)
+ if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood))
+ if(!stop_messages)
+ to_chat(usr, "The snatcher does not accept [W].")
+ return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
+ var/current = 0
+ for(var/obj/item/stack/sheet/S in contents)
+ current += S.amount
+ if(capacity == current)//If it's full, you're done
+ if(!stop_messages)
+ to_chat(usr, "The snatcher is full.")
+ return 0
+ return 1
// Modified handle_item_insertion. Would prefer not to, but...
- handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
- var/obj/item/stack/sheet/S = W
- if(!istype(S)) return 0
+/obj/item/storage/bag/sheetsnatcher/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
+ var/obj/item/stack/sheet/S = W
+ if(!istype(S)) return 0
- var/amount
- var/inserted = 0
- var/current = 0
- for(var/obj/item/stack/sheet/S2 in contents)
- current += S2.amount
- if(capacity < current + S.amount)//If the stack will fill it up
- amount = capacity - current
+ var/amount
+ var/inserted = 0
+ var/current = 0
+ for(var/obj/item/stack/sheet/S2 in contents)
+ current += S2.amount
+ if(capacity < current + S.amount)//If the stack will fill it up
+ amount = capacity - current
+ else
+ amount = S.amount
+
+ for(var/obj/item/stack/sheet/sheet in contents)
+ if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
+ sheet.amount += amount // they should only be removed through procs in this file, which split them up.
+ S.amount -= amount
+ inserted = 1
+ break
+
+ if(!inserted || !S.amount)
+ usr.unEquip(S)
+ usr.update_icons() //update our overlays
+ if(usr.client && usr.s_active != src)
+ usr.client.screen -= S
+ S.dropped(usr)
+ if(!S.amount)
+ qdel(S)
else
- amount = S.amount
+ S.loc = src
- for(var/obj/item/stack/sheet/sheet in contents)
- if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
- sheet.amount += amount // they should only be removed through procs in this file, which split them up.
- S.amount -= amount
- inserted = 1
- break
-
- if(!inserted || !S.amount)
- usr.unEquip(S)
- usr.update_icons() //update our overlays
- if(usr.client && usr.s_active != src)
- usr.client.screen -= S
- S.dropped(usr)
- if(!S.amount)
- qdel(S)
- else
- S.loc = src
-
- orient2hud(usr)
- if(usr.s_active)
- usr.s_active.show_to(usr)
- update_icon()
- return 1
+ orient2hud(usr)
+ if(usr.s_active)
+ usr.s_active.show_to(usr)
+ update_icon()
+ return 1
// Sets up numbered display to show the stack size of each stored mineral
// NOTE: numbered display is turned off currently because it's broken
- orient2hud(mob/user as mob)
- var/adjusted_contents = contents.len
+/obj/item/storage/bag/sheetsnatcher/orient2hud(mob/user as mob)
+ var/adjusted_contents = contents.len
- //Numbered contents display
- var/list/datum/numbered_display/numbered_contents
- if(display_contents_with_number)
- numbered_contents = list()
- adjusted_contents = 0
- for(var/obj/item/stack/sheet/I in contents)
- adjusted_contents++
- var/datum/numbered_display/D = new/datum/numbered_display(I)
- D.number = I.amount
- numbered_contents.Add( D )
+ //Numbered contents display
+ var/list/datum/numbered_display/numbered_contents
+ if(display_contents_with_number)
+ numbered_contents = list()
+ adjusted_contents = 0
+ for(var/obj/item/stack/sheet/I in contents)
+ adjusted_contents++
+ var/datum/numbered_display/D = new/datum/numbered_display(I)
+ D.number = I.amount
+ numbered_contents.Add( D )
- var/row_num = 0
- var/col_count = min(7,storage_slots) -1
- if(adjusted_contents > 7)
- row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
- src.standard_orient_objs(row_num, col_count, numbered_contents)
- return
+ var/row_num = 0
+ var/col_count = min(7,storage_slots) -1
+ if(adjusted_contents > 7)
+ row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
+ src.standard_orient_objs(row_num, col_count, numbered_contents)
+ return
// Modified quick_empty verb drops appropriate sized stacks
- quick_empty()
- var/location = get_turf(src)
- for(var/obj/item/stack/sheet/S in contents)
- while(S.amount)
- var/obj/item/stack/sheet/N = new S.type(location)
- var/stacksize = min(S.amount,N.max_amount)
- N.amount = stacksize
- S.amount -= stacksize
- if(!S.amount)
- qdel(S) // todo: there's probably something missing here
- orient2hud(usr)
- if(usr.s_active)
- usr.s_active.show_to(usr)
- update_icon()
+/obj/item/storage/bag/sheetsnatcher/quick_empty()
+ var/location = get_turf(src)
+ for(var/obj/item/stack/sheet/S in contents)
+ while(S.amount)
+ var/obj/item/stack/sheet/N = new S.type(location)
+ var/stacksize = min(S.amount,N.max_amount)
+ N.amount = stacksize
+ S.amount -= stacksize
+ if(!S.amount)
+ qdel(S) // todo: there's probably something missing here
+ orient2hud(usr)
+ if(usr.s_active)
+ usr.s_active.show_to(usr)
+ update_icon()
// Instead of removing
- remove_from_storage(obj/item/W as obj, atom/new_location)
- var/obj/item/stack/sheet/S = W
- if(!istype(S)) return 0
+/obj/item/storage/bag/sheetsnatcher/remove_from_storage(obj/item/W as obj, atom/new_location)
+ var/obj/item/stack/sheet/S = W
+ if(!istype(S)) return 0
- //I would prefer to drop a new stack, but the item/attack_hand code
- // that calls this can't recieve a different object than you clicked on.
- //Therefore, make a new stack internally that has the remainder.
- // -Sayu
+ //I would prefer to drop a new stack, but the item/attack_hand code
+ // that calls this can't recieve a different object than you clicked on.
+ //Therefore, make a new stack internally that has the remainder.
+ // -Sayu
- if(S.amount > S.max_amount)
- var/obj/item/stack/sheet/temp = new S.type(src)
- temp.amount = S.amount - S.max_amount
- S.amount = S.max_amount
+ if(S.amount > S.max_amount)
+ var/obj/item/stack/sheet/temp = new S.type(src)
+ temp.amount = S.amount - S.max_amount
+ S.amount = S.max_amount
- return ..(S,new_location)
+ return ..(S,new_location)
// -----------------------------
// Sheet Snatcher (Cyborg)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 5ba58e2f313..67f32dbfd58 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -631,21 +631,21 @@
max_combined_w_class = 280
can_hold = list()
- New()
- ..()
- new /obj/item/crowbar(src)
- new /obj/item/screwdriver(src)
- new /obj/item/weldingtool/hugetank(src)
- new /obj/item/wirecutters(src)
- new /obj/item/wrench(src)
- new /obj/item/multitool(src)
- new /obj/item/stack/cable_coil(src)
+/obj/item/storage/belt/bluespace/admin/New()
+ ..()
+ new /obj/item/crowbar(src)
+ new /obj/item/screwdriver(src)
+ new /obj/item/weldingtool/hugetank(src)
+ new /obj/item/wirecutters(src)
+ new /obj/item/wrench(src)
+ new /obj/item/multitool(src)
+ new /obj/item/stack/cable_coil(src)
- new /obj/item/restraints/handcuffs(src)
- new /obj/item/dnainjector/xraymut(src)
- new /obj/item/dnainjector/firemut(src)
- new /obj/item/dnainjector/telemut(src)
- new /obj/item/dnainjector/hulkmut(src)
+ new /obj/item/restraints/handcuffs(src)
+ new /obj/item/dnainjector/xraymut(src)
+ new /obj/item/dnainjector/firemut(src)
+ new /obj/item/dnainjector/telemut(src)
+ new /obj/item/dnainjector/hulkmut(src)
// new /obj/item/spellbook(src) // for smoke effects, door openings, etc
// new /obj/item/magic/spellbook(src)
@@ -660,15 +660,15 @@
max_combined_w_class = 280
can_hold = list()
- New()
- ..()
- new /obj/item/crowbar(src)
- new /obj/item/screwdriver(src)
- new /obj/item/weldingtool/hugetank(src)
- new /obj/item/wirecutters(src)
- new /obj/item/wrench(src)
- new /obj/item/multitool(src)
- new /obj/item/stack/cable_coil(src)
+/obj/item/storage/belt/bluespace/sandbox/New()
+ ..()
+ new /obj/item/crowbar(src)
+ new /obj/item/screwdriver(src)
+ new /obj/item/weldingtool/hugetank(src)
+ new /obj/item/wirecutters(src)
+ new /obj/item/wrench(src)
+ new /obj/item/multitool(src)
+ new /obj/item/stack/cable_coil(src)
- new /obj/item/analyzer(src)
- new /obj/item/healthanalyzer(src)
+ new /obj/item/analyzer(src)
+ new /obj/item/healthanalyzer(src)
diff --git a/code/modules/atmos_automation/console.dm b/code/modules/atmos_automation/console.dm
index e486898d18d..f4c3873717c 100644
--- a/code/modules/atmos_automation/console.dm
+++ b/code/modules/atmos_automation/console.dm
@@ -13,216 +13,216 @@
var/list/datum/automation/automations = list()
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
+/obj/machinery/computer/general_air_control/atmos_automation/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
- var/id_tag = signal.data["tag"]
- if(!id_tag)
- return
+ var/id_tag = signal.data["tag"]
+ if(!id_tag)
+ return
- sensor_information[id_tag] = signal.data
+ sensor_information[id_tag] = signal.data
- process()
- if(on)
- for(var/datum/automation/A in automations)
- A.process()
+/obj/machinery/computer/general_air_control/atmos_automation/process()
+ if(on)
+ for(var/datum/automation/A in automations)
+ A.process()
- update_icon()
+/obj/machinery/computer/general_air_control/atmos_automation/update_icon()
+ icon_state = initial(icon_state)
+ // Broken
+ if(stat & BROKEN)
+ icon_state += "b"
+
+ // Powered
+ else if(stat & NOPOWER)
icon_state = initial(icon_state)
- // Broken
- if(stat & BROKEN)
- icon_state += "b"
+ icon_state += "0"
+ else if(on)
+ icon_state += "_active"
- // Powered
- else if(stat & NOPOWER)
- icon_state = initial(icon_state)
- icon_state += "0"
- else if(on)
- icon_state += "_active"
+/obj/machinery/computer/general_air_control/atmos_automation/proc/request_device_refresh(device)
+ send_signal(list("tag"=device, "status"))
- proc/request_device_refresh(var/device)
- send_signal(list("tag"=device, "status"))
+/obj/machinery/computer/general_air_control/atmos_automation/proc/send_signal(list/data, filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data=data
+ signal.data["sigtype"]="command"
+ signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this
+ radio_connection.post_signal(src, signal, range = 8, filter = filter)
- proc/send_signal(var/list/data, var/filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data=data
- signal.data["sigtype"]="command"
- signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this
- radio_connection.post_signal(src, signal, range = 8, filter = filter)
+/obj/machinery/computer/general_air_control/atmos_automation/proc/selectValidChildFor(datum/automation/parent, mob/user, list/valid_returntypes)
+ var/list/choices=list()
+ for(var/childtype in automation_types)
+ var/datum/automation/A = new childtype(src)
+ if(A.returntype == null)
+ continue
+ if(!(A.returntype in valid_returntypes))
+ continue
+ choices[A.name]=A
+ if(choices.len==0)
+ testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
+ return 0
+ var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
+ if(!label)
+ return 0
+ return choices[label]
- proc/selectValidChildFor(var/datum/automation/parent, var/mob/user, var/list/valid_returntypes)
- var/list/choices=list()
- for(var/childtype in automation_types)
- var/datum/automation/A = new childtype(src)
- if(A.returntype == null)
- continue
- if(!(A.returntype in valid_returntypes))
- continue
- choices[A.name]=A
- if(choices.len==0)
- testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
- return 0
- var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
- if(!label)
- return 0
- return choices[label]
+/obj/machinery/computer/general_air_control/atmos_automation/return_text()
+ var/out=..()
- return_text()
- var/out=..()
+ if(on)
+ out += "RUNNING"
+ else
+ out += "STOPPED"
- if(on)
- out += "RUNNING"
- else
- out += "STOPPED"
+ out += {"
+
Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!
Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.
Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.
+
+
+ "}
+
+ M << browse(dat, "window=paiRecruit;size=580x580;")
+
+/datum/paiController/proc/findPAI(var/obj/item/paicard/p, var/mob/user)
+ requestRecruits(p, user)
+ var/list/available = list()
+ for(var/datum/paiCandidate/c in paiController.pai_candidates)
+ if(c.ready)
+ var/found = 0
+ for(var/mob/o in respawnable_list)
+ if(o.key == c.key)
+ found = 1
+ if(found)
+ available.Add(c)
+ var/dat = ""
+
+ dat += {"
+
+
+
+
- "}
+
+
+ pAI Availability List
+ "}
+ dat += "
Displaying available AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.
"
+ for(var/datum/paiCandidate/c in available)
dat += {"
-
- pAI Personality Configuration
-
Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!
Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.
Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.
+
"}
- M << browse(dat, "window=paiRecruit;size=580x580;")
+ dat += {"
+
+
+ "}
- proc/findPAI(var/obj/item/paicard/p, var/mob/user)
- requestRecruits(p, user)
- var/list/available = list()
- for(var/datum/paiCandidate/c in paiController.pai_candidates)
- if(c.ready)
- var/found = 0
- for(var/mob/o in respawnable_list)
- if(o.key == c.key)
- found = 1
- if(found)
- available.Add(c)
- var/dat = ""
+ user << browse(dat, "window=findPai")
- dat += {"
-
-
-
-
-
-
- pAI Availability List
- "}
- dat += "
Displaying available AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.
"
+/datum/paiController/proc/requestRecruits(var/obj/item/paicard/P, mob/user)
+ for(var/mob/dead/observer/O in player_list)
+ if(O.client && (ROLE_PAI in O.client.prefs.be_special))
+ if(player_old_enough_antag(O.client,ROLE_PAI))
+ if(check_recruit(O))
+ to_chat(O, "A pAI card activated by [user.real_name] is looking for personalities. (Teleport | Sign Up)")
+ //question(O.client)
- for(var/datum/paiCandidate/c in available)
- dat += {"
-
-
- "}
-
- dat += {"
-
-
- "}
-
- user << browse(dat, "window=findPai")
-
- proc/requestRecruits(var/obj/item/paicard/P, mob/user)
- for(var/mob/dead/observer/O in player_list)
- if(O.client && (ROLE_PAI in O.client.prefs.be_special))
- if(player_old_enough_antag(O.client,ROLE_PAI))
- if(check_recruit(O))
- to_chat(O, "A pAI card activated by [user.real_name] is looking for personalities. (Teleport | Sign Up)")
- //question(O.client)
-
- proc/check_recruit(var/mob/dead/observer/O)
- if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
- return 0
- if(!player_old_enough_antag(O.client,ROLE_PAI))
- return 0
- if(cannotPossess(O))
- return 0
- if(!(O in respawnable_list))
- return 0
- if(O.client)
- return 1
+/datum/paiController/proc/check_recruit(var/mob/dead/observer/O)
+ if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
return 0
+ if(!player_old_enough_antag(O.client,ROLE_PAI))
+ return 0
+ if(cannotPossess(O))
+ return 0
+ if(!(O in respawnable_list))
+ return 0
+ if(O.client)
+ return 1
+ return 0
- proc/question(var/client/C)
- spawn(0)
- if(!C) return
- asked.Add(C.key)
- asked[C.key] = world.time
- var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
- if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
- if(response == "Yes")
- recruitWindow(C.mob)
- else if(response == "Never for this round")
- var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
- if(warning == "Yes")
- asked[C.key] = INFINITY
- else
- question(C)
+/datum/paiController/proc/question(var/client/C)
+ spawn(0)
+ if(!C) return
+ asked.Add(C.key)
+ asked[C.key] = world.time
+ var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
+ if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
+ if(response == "Yes")
+ recruitWindow(C.mob)
+ else if(response == "Never for this round")
+ var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
+ if(warning == "Yes")
+ asked[C.key] = INFINITY
+ else
+ question(C)
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index f4db32b8081..9c130780d81 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -6,7 +6,7 @@
act = copytext(act, 1, t1)
//Emote Cooldown System (it's so simple!)
- // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ //proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
act = lowertext(act)
switch(act)
@@ -174,4 +174,4 @@
"You announce you are operating in low power mode.")
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
else
- to_chat(src, "You can only use this emote when you're out of charge.")
\ No newline at end of file
+ to_chat(src, "You can only use this emote when you're out of charge.")
diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm
index 70e27937745..2ea085464a7 100644
--- a/code/modules/mob/living/simple_animal/bot/emote.dm
+++ b/code/modules/mob/living/simple_animal/bot/emote.dm
@@ -9,7 +9,7 @@
act = copytext(act,1,length(act))
//Emote Cooldown System (it's so simple!)
- // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ //proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
act = lowertext(act)
switch(act)
@@ -69,4 +69,4 @@
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
m_type = 2
- ..(act, m_type, message)
\ No newline at end of file
+ ..(act, m_type, message)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 78e7ad47f57..8593de82ba5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -511,154 +511,152 @@
var/tomail = 0 //changes if contains wrapped package
var/hasmob = 0 //If it contains a mob
- Destroy()
- QDEL_NULL(gas)
- active = 0
- return ..()
+/obj/structure/disposalholder/Destroy()
+ QDEL_NULL(gas)
+ active = 0
+ return ..()
// initialize a holder from the contents of a disposal unit
- proc/init(var/obj/machinery/disposal/D)
- gas = D.air_contents// transfer gas resv. into holder object
+/obj/structure/disposalholder/proc/init(var/obj/machinery/disposal/D)
+ gas = D.air_contents// transfer gas resv. into holder object
- //Check for any living mobs trigger hasmob.
- //hasmob effects whether the package goes to cargo or its tagged destination.
- for(var/mob/living/M in D)
- if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
- hasmob = 1
+ //Check for any living mobs trigger hasmob.
+ //hasmob effects whether the package goes to cargo or its tagged destination.
+ for(var/mob/living/M in D)
+ if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
+ hasmob = 1
- //Checks 1 contents level deep. This means that players can be sent through disposals...
- //...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
- for(var/obj/O in D)
- if(O.contents)
- for(var/mob/living/M in O.contents)
- if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
- hasmob = 1
+ //Checks 1 contents level deep. This means that players can be sent through disposals...
+ //...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
+ for(var/obj/O in D)
+ if(O.contents)
+ for(var/mob/living/M in O.contents)
+ if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone))
+ hasmob = 1
- // now everything inside the disposal gets put into the holder
- // note AM since can contain mobs or objs
- for(var/atom/movable/AM in D)
- AM.loc = src
- if(istype(AM, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = AM
- if(FAT in H.mutations) // is a human and fat?
- has_fat_guy = 1 // set flag on holder
- if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
- var/obj/structure/bigDelivery/T = AM
- destinationTag = T.sortTag
- if(istype(AM, /obj/item/smallDelivery) && !hasmob)
- var/obj/item/smallDelivery/T = AM
- destinationTag = T.sortTag
- //Drones can mail themselves through maint.
- if(istype(AM, /mob/living/silicon/robot/drone))
- var/mob/living/silicon/robot/drone/drone = AM
- destinationTag = drone.mail_destination
- if(istype(AM, /obj/item/shippingPackage) && !hasmob)
- var/obj/item/shippingPackage/sp = AM
- if(sp.sealed) //only sealed packages get delivered to their intended destination
- destinationTag = sp.sortTag
+ // now everything inside the disposal gets put into the holder
+ // note AM since can contain mobs or objs
+ for(var/atom/movable/AM in D)
+ AM.loc = src
+ if(istype(AM, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = AM
+ if(FAT in H.mutations) // is a human and fat?
+ has_fat_guy = 1 // set flag on holder
+ if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
+ var/obj/structure/bigDelivery/T = AM
+ destinationTag = T.sortTag
+ if(istype(AM, /obj/item/smallDelivery) && !hasmob)
+ var/obj/item/smallDelivery/T = AM
+ destinationTag = T.sortTag
+ //Drones can mail themselves through maint.
+ if(istype(AM, /mob/living/silicon/robot/drone))
+ var/mob/living/silicon/robot/drone/drone = AM
+ destinationTag = drone.mail_destination
+ if(istype(AM, /obj/item/shippingPackage) && !hasmob)
+ var/obj/item/shippingPackage/sp = AM
+ if(sp.sealed) //only sealed packages get delivered to their intended destination
+ destinationTag = sp.sortTag
// start the movement process
// argument is the disposal unit the holder started in
- proc/start(var/obj/machinery/disposal/D)
- if(!D.trunk)
- D.expel(src) // no trunk connected, so expel immediately
- return
-
- loc = D.trunk
- active = 1
- dir = DOWN
- spawn(1)
- move() // spawn off the movement process
-
+/obj/structure/disposalholder/proc/start(var/obj/machinery/disposal/D)
+ if(!D.trunk)
+ D.expel(src) // no trunk connected, so expel immediately
return
+ loc = D.trunk
+ active = 1
+ dir = DOWN
+ spawn(1)
+ move() // spawn off the movement process
+
+ return
+
// movement process, persists while holder is moving through pipes
- proc/move()
- var/obj/structure/disposalpipe/last
- while(active)
- /* if(hasmob && prob(3))
- for(var/mob/living/H in src)
- if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system,
- H.take_overall_damage(20, 0, TRUE, "Blunt Trauma") */ //horribly maim any living creature jumping down disposals. c'est la vie
+/obj/structure/disposalholder/proc/move()
+ var/obj/structure/disposalpipe/last
+ while(active)
+ /* if(hasmob && prob(3))
+ for(var/mob/living/H in src)
+ if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system,
+ H.take_overall_damage(20, 0, "Blunt Trauma") */ //horribly maim any living creature jumping down disposals. c'est la vie
- if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy
- active = 0
- // find the fat guys
- for(var/mob/living/carbon/human/H in src)
+ if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy
+ active = 0
+ // find the fat guys
+ for(var/mob/living/carbon/human/H in src)
- break
- sleep(1) // was 1
- var/obj/structure/disposalpipe/curr = loc
- last = curr
- curr = curr.transfer(src)
- if(!curr)
- last.expel(src, loc, dir)
+ break
+ sleep(1) // was 1
+ var/obj/structure/disposalpipe/curr = loc
+ last = curr
+ curr = curr.transfer(src)
+ if(!curr)
+ last.expel(src, loc, dir)
- //
- if(!(count--))
- active = 0
- return
+ //
+ if(!(count--))
+ active = 0
+ return
// find the turf which should contain the next pipe
- proc/nextloc()
- return get_step(loc,dir)
+/obj/structure/disposalholder/proc/nextloc()
+ return get_step(loc,dir)
// find a matching pipe on a turf
- proc/findpipe(var/turf/T)
-
- if(!T)
- return null
-
- var/fdir = turn(dir, 180) // flip the movement direction
- for(var/obj/structure/disposalpipe/P in T)
- if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir
- return P
- // if no matching pipe, return null
+/obj/structure/disposalholder/proc/findpipe(var/turf/T)
+ if(!T)
return null
+ var/fdir = turn(dir, 180) // flip the movement direction
+ for(var/obj/structure/disposalpipe/P in T)
+ if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir
+ return P
+ // if no matching pipe, return null
+ return null
+
// merge two holder objects
// used when a a holder meets a stuck holder
- proc/merge(var/obj/structure/disposalholder/other)
- for(var/atom/movable/AM in other)
- AM.loc = src // move everything in other holder to this one
- if(ismob(AM))
- var/mob/M = AM
- if(M.client) // if a client mob, update eye to follow this holder
- M.client.eye = src
+/obj/structure/disposalholder/proc/merge(var/obj/structure/disposalholder/other)
+ for(var/atom/movable/AM in other)
+ AM.loc = src // move everything in other holder to this one
+ if(ismob(AM))
+ var/mob/M = AM
+ if(M.client) // if a client mob, update eye to follow this holder
+ M.client.eye = src
- if(other.has_fat_guy)
- has_fat_guy = 1
- qdel(other)
+ if(other.has_fat_guy)
+ has_fat_guy = 1
+ qdel(other)
// called when player tries to move while in a pipe
- relaymove(mob/user as mob)
+/obj/structure/disposalholder/relaymove(mob/user as mob)
+ if(!istype(user,/mob/living))
+ return
- if(!istype(user,/mob/living))
- return
+ var/mob/living/U = user
- var/mob/living/U = user
+ if(U.stat || U.last_special <= world.time)
+ return
- if(U.stat || U.last_special <= world.time)
- return
+ U.last_special = world.time+100
- U.last_special = world.time+100
+ if(src.loc)
+ for(var/mob/M in hearers(src.loc.loc))
+ to_chat(M, "CLONG, clong!")
- if(src.loc)
- for(var/mob/M in hearers(src.loc.loc))
- to_chat(M, "CLONG, clong!")
-
- playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
+ playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
// called to vent all gas in holder to a location
- proc/vent_gas(var/atom/location)
- if(location)
- location.assume_air(gas) // vent all gas to turf
- air_update_turf()
- return
+/obj/structure/disposalholder/proc/vent_gas(var/atom/location)
+ if(location)
+ location.assume_air(gas) // vent all gas to turf
+ air_update_turf()
+ return
// Disposal pipes
@@ -1000,44 +998,44 @@
var/negdir = 0
var/sortdir = 0
- proc/updatedesc()
- desc = "An underfloor disposal pipe with a package sorting mechanism."
- if(sortType>0)
- var/tag = uppertext(TAGGERLOCATIONS[sortType])
- desc += "\nIt's tagged with [tag]"
+/obj/structure/disposalpipe/sortjunction/proc/updatedesc()
+ desc = "An underfloor disposal pipe with a package sorting mechanism."
+ if(sortType>0)
+ var/tag = uppertext(TAGGERLOCATIONS[sortType])
+ desc += "\nIt's tagged with [tag]"
- proc/updatedir()
- posdir = dir
- negdir = turn(posdir, 180)
+/obj/structure/disposalpipe/sortjunction/proc/updatedir()
+ posdir = dir
+ negdir = turn(posdir, 180)
- if(icon_state == "pipe-j1s")
- sortdir = turn(posdir, -90)
- else
- icon_state = "pipe-j2s"
- sortdir = turn(posdir, 90)
+ if(icon_state == "pipe-j1s")
+ sortdir = turn(posdir, -90)
+ else
+ icon_state = "pipe-j2s"
+ sortdir = turn(posdir, 90)
- dpdir = sortdir | posdir | negdir
+ dpdir = sortdir | posdir | negdir
- New()
- ..()
- updatedir()
- updatedesc()
- update()
+/obj/structure/disposalpipe/sortjunction/New()
+ ..()
+ updatedir()
+ updatedesc()
+ update()
+ return
+
+/obj/structure/disposalpipe/sortjunction/attackby(var/obj/item/I, var/mob/user, params)
+ if(..())
return
- attackby(var/obj/item/I, var/mob/user, params)
- if(..())
- return
+ if(istype(I, /obj/item/destTagger))
+ var/obj/item/destTagger/O = I
- if(istype(I, /obj/item/destTagger))
- var/obj/item/destTagger/O = I
-
- if(O.currTag > 0)// Tag set
- sortType = O.currTag
- playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
- var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
- to_chat(user, "Changed filter to [tag]")
- updatedesc()
+ if(O.currTag > 0)// Tag set
+ sortType = O.currTag
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
+ var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
+ to_chat(user, "Changed filter to [tag]")
+ updatedesc()
// next direction to move
@@ -1045,61 +1043,59 @@
// if coming in from posdir, then flip around and go back to posdir
// if coming in from sortdir, go to posdir
- nextdir(var/fromdir, var/sortTag)
- //var/flipdir = turn(fromdir, 180)
- if(fromdir != sortdir) // probably came from the negdir
+/obj/structure/disposalpipe/sortjunction/nextdir(var/fromdir, var/sortTag)
+ //var/flipdir = turn(fromdir, 180)
+ if(fromdir != sortdir) // probably came from the negdir
- if(src.sortType == sortTag) //if destination matches filtered type...
- return sortdir // exit through sortdirection
- else
- return posdir
- else // came from sortdir
- // so go with the flow to positive direction
+ if(src.sortType == sortTag) //if destination matches filtered type...
+ return sortdir // exit through sortdirection
+ else
return posdir
+ else // came from sortdir
+ // so go with the flow to positive direction
+ return posdir
- transfer(var/obj/structure/disposalholder/H)
- var/nextdir = nextdir(H.dir, H.destinationTag)
- H.dir = nextdir
- var/turf/T = H.nextloc()
- var/obj/structure/disposalpipe/P = H.findpipe(T)
+/obj/structure/disposalpipe/sortjunction/transfer(var/obj/structure/disposalholder/H)
+ var/nextdir = nextdir(H.dir, H.destinationTag)
+ H.dir = nextdir
+ var/turf/T = H.nextloc()
+ var/obj/structure/disposalpipe/P = H.findpipe(T)
- if(P)
- // find other holder in next loc, if inactive merge it with current
- var/obj/structure/disposalholder/H2 = locate() in P
- if(H2 && !H2.active)
- H.merge(H2)
+ if(P)
+ // find other holder in next loc, if inactive merge it with current
+ var/obj/structure/disposalholder/H2 = locate() in P
+ if(H2 && !H2.active)
+ H.merge(H2)
+ H.loc = P
+ else // if wasn't a pipe, then set loc to turf
+ H.loc = T
+ return null
- H.loc = P
- else // if wasn't a pipe, then set loc to turf
- H.loc = T
- return null
-
- return P
+ return P
//a three-way junction that sorts objects destined for the mail office mail table (tomail = 1)
/obj/structure/disposalpipe/wrapsortjunction
-
desc = "An underfloor disposal pipe which sorts wrapped and unwrapped objects."
icon_state = "pipe-j1s"
var/posdir = 0
var/negdir = 0
var/sortdir = 0
- New()
- ..()
- posdir = dir
- if(icon_state == "pipe-j1s")
- sortdir = turn(posdir, -90)
- negdir = turn(posdir, 180)
- else
- icon_state = "pipe-j2s"
- sortdir = turn(posdir, 90)
- negdir = turn(posdir, 180)
- dpdir = sortdir | posdir | negdir
+/obj/structure/disposalpipe/wrapsortjunction/New()
+ ..()
+ posdir = dir
+ if(icon_state == "pipe-j1s")
+ sortdir = turn(posdir, -90)
+ negdir = turn(posdir, 180)
+ else
+ icon_state = "pipe-j2s"
+ sortdir = turn(posdir, 90)
+ negdir = turn(posdir, 180)
+ dpdir = sortdir | posdir | negdir
- update()
- return
+ update()
+ return
// next direction to move
@@ -1107,40 +1103,34 @@
// if coming in from posdir, then flip around and go back to posdir
// if coming in from sortdir, go to posdir
- nextdir(var/fromdir, var/istomail)
- //var/flipdir = turn(fromdir, 180)
- if(fromdir != sortdir) // probably came from the negdir
-
- if(istomail) //if destination matches filtered type...
- return sortdir // exit through sortdirection
- else
- return posdir
- else // came from sortdir
- // so go with the flow to positive direction
+/obj/structure/disposalpipe/wrapsortjunction/nextdir(var/fromdir, var/istomail)
+ //var/flipdir = turn(fromdir, 180)
+ if(fromdir != sortdir) // probably came from the negdir
+ if(istomail) //if destination matches filtered type...
+ return sortdir // exit through sortdirection
+ else
return posdir
+ else // came from sortdir
+ return posdir // so go with the flow to positive direction
- transfer(var/obj/structure/disposalholder/H)
- var/nextdir = nextdir(H.dir, H.tomail)
- H.dir = nextdir
- var/turf/T = H.nextloc()
- var/obj/structure/disposalpipe/P = H.findpipe(T)
-
- if(P)
- // find other holder in next loc, if inactive merge it with current
- var/obj/structure/disposalholder/H2 = locate() in P
- if(H2 && !H2.active)
- H.merge(H2)
-
- H.loc = P
- else // if wasn't a pipe, then set loc to turf
- H.loc = T
- return null
-
- return P
-
+/obj/structure/disposalpipe/wrapsortjunction/transfer(var/obj/structure/disposalholder/H)
+ var/nextdir = nextdir(H.dir, H.tomail)
+ H.dir = nextdir
+ var/turf/T = H.nextloc()
+ var/obj/structure/disposalpipe/P = H.findpipe(T)
+ if(P)
+ // find other holder in next loc, if inactive merge it with current
+ var/obj/structure/disposalholder/H2 = locate() in P
+ if(H2 && !H2.active)
+ H.merge(H2)
+ H.loc = P
+ else // if wasn't a pipe, then set loc to turf
+ H.loc = T
+ return null
+ return P
//a trunk joining to a disposal bin or outlet on the same turf
/obj/structure/disposalpipe/trunk
@@ -1203,18 +1193,6 @@
/obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user, params)
//Disposal bins or chutes
- /*
- These shouldn't be required
- var/obj/machinery/disposal/D = locate() in src.loc
- if(D && D.anchored)
- return
-
- //Disposal outlet
- var/obj/structure/disposaloutlet/O = locate() in src.loc
- if(O && O.anchored)
- return
- */
-
//Disposal constructors
var/obj/structure/disposalconstruct/C = locate() in src.loc
if(C && C.anchored)
@@ -1275,18 +1253,13 @@
// i.e. will be treated as an empty turf
desc = "A broken piece of disposal pipe."
- New()
- ..()
- update()
- return
+/obj/structure/disposalpipe/broken/New()
+ ..()
+ update()
+ return
- // called when welded
- // for broken pipe, remove and turn into scrap
-
- welded()
-// var/obj/item/scrap/S = new(src.loc)
-// S.set_components(200,0,0)
- qdel(src)
+/obj/structure/disposalpipe/broken/welded()
+ qdel(src)
// the disposal outlet machine
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 1b1b5c0ffa9..a98e8e60adc 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -223,31 +223,31 @@
flags = CONDUCT
slot_flags = SLOT_BELT
- proc/openwindow(mob/user as mob)
- var/dat = "
TagMaster 2.2
"
+/obj/item/destTagger/proc/openwindow(mob/user as mob)
+ var/dat = "
TagMaster 2.2
"
- dat += "
"
- for(var/i = 1, i <= TAGGERLOCATIONS.len, i++)
- dat += "
Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]"
+ dat += "
Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]"
- user << browse(dat, "window=destTagScreen;size=450x350")
- onclose(user, "destTagScreen")
+ user << browse(dat, "window=destTagScreen;size=450x350")
+ onclose(user, "destTagScreen")
- attack_self(mob/user as mob)
- openwindow(user)
- return
+/obj/item/destTagger/attack_self(mob/user as mob)
+ openwindow(user)
+ return
- Topic(href, href_list)
- src.add_fingerprint(usr)
- if(href_list["nextTag"])
- var/n = text2num(href_list["nextTag"])
- src.currTag = n
- openwindow(usr)
+/obj/item/destTagger/Topic(href, href_list)
+ src.add_fingerprint(usr)
+ if(href_list["nextTag"])
+ var/n = text2num(href_list["nextTag"])
+ src.currTag = n
+ openwindow(usr)
/obj/machinery/disposal/deliveryChute
name = "Delivery chute"
From 65c246c1c941f93880550b1f3efdd085649780a2 Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Fri, 14 Sep 2018 21:41:15 +0800
Subject: [PATCH 02/37] TG container_type refactor
---
code/__DEFINES/flags.dm | 2 -
code/__DEFINES/reagents.dm | 12 +++
code/game/atoms.dm | 54 +++++++------
code/game/machinery/cryo.dm | 2 +-
code/game/objects/items/devices/scanners.dm | 3 +-
.../objects/items/weapons/extinguisher.dm | 8 +-
.../items/weapons/implants/implant_chem.dm | 2 +-
code/game/objects/items/weapons/paint.dm | 2 +-
.../objects/items/weapons/tanks/watertank.dm | 3 +-
code/game/objects/structures/janicart.dm | 2 +-
code/game/objects/structures/mop_bucket.dm | 2 +-
code/game/objects/structures/watercloset.dm | 4 +-
code/modules/crafting/craft.dm | 2 +-
.../detective_work/footprints_and_rag.dm | 3 +-
code/modules/fish/fishtank.dm | 81 +++++++++----------
.../food_and_drinks/drinks/bottler/bottler.dm | 2 +-
code/modules/food_and_drinks/drinks/drinks.dm | 79 +++++++++---------
.../modules/food_and_drinks/food/condiment.dm | 6 +-
.../kitchen_machinery/kitchen_machine.dm | 6 +-
code/modules/hydroponics/hydroitemdefines.dm | 4 +-
code/modules/hydroponics/hydroponics.dm | 4 +-
code/modules/mob/living/carbon/carbon.dm | 2 +-
code/modules/mob/living/living.dm | 8 +-
code/modules/paperwork/pen.dm | 2 +-
.../projectiles/ammunition/ammo_casings.dm | 2 +-
code/modules/projectiles/guns/dartgun.dm | 6 +-
.../projectiles/guns/energy/special.dm | 3 +-
code/modules/reagents/chemistry/holder.dm | 15 ++++
.../reagents/chemistry/machinery/pandemic.dm | 10 +--
.../chemistry/machinery/reagentgrinder.dm | 2 +-
code/modules/reagents/chemistry/readme.dm | 8 --
code/modules/reagents/reagent_containers.dm | 8 --
.../reagents/reagent_containers/bottle.dm | 2 +-
.../reagent_containers/glass_containers.dm | 18 ++---
.../reagents/reagent_containers/hypospray.dm | 2 +-
.../reagents/reagent_containers/spray.dm | 3 +-
.../reagents/reagent_containers/syringes.dm | 11 +--
code/modules/reagents/reagent_dispenser.dm | 16 ++--
code/modules/research/circuitprinter.dm | 2 +-
code/modules/research/protolathe.dm | 2 +-
.../research/xenobiology/xenobiology.dm | 1 +
41 files changed, 205 insertions(+), 201 deletions(-)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 6c34d3144b0..ae6943d553a 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -17,8 +17,6 @@
#define HEADBANGPROTECT 4096
-#define OPENCONTAINER 4096 // is an open container for chemistry purposes
-
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index 0d20a3edb74..cf76a42e926 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -4,3 +4,15 @@
#define REAGENT_OVERDOSE_EFFECT 1
#define REAGENT_OVERDOSE_FLAGS 2
+// container_type defines
+#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes.
+#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes.
+
+#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container.
+#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container.
+
+#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off.
+#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible.
+
+// Is an open container for all intents and purposes.
+#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 47f28d0ae5b..fd1cb0e32c1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -16,6 +16,7 @@
var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays
///Chemistry.
+ var/container_type = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
@@ -23,9 +24,6 @@
//HUD images that this atom can provide.
var/list/hud_possible
-
- //var/chem_is_open_container = 0
- // replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
@@ -198,22 +196,21 @@
/atom/proc/Bumped(AM as mob|obj)
return
-// Convenience proc to see if a container is open for chemistry handling
-// returns true if open
-// false if closed
+// Convenience procs to see if a container is open for chemistry handling
/atom/proc/is_open_container()
- return flags & OPENCONTAINER
+ return is_refillable() && is_drainable()
-/*//Convenience proc to see whether a container can be accessed in a certain way.
+/atom/proc/is_injectable(allowmobs = TRUE)
+ return reagents && (container_type & (INJECTABLE | REFILLABLE))
- proc/can_subract_container()
- return flags & EXTRACT_CONTAINER
-
- proc/can_add_container()
- return flags & INSERT_CONTAINER
-*/
+/atom/proc/is_drawable(allowmobs = TRUE)
+ return reagents && (container_type & (DRAWABLE | DRAINABLE))
+/atom/proc/is_refillable()
+ return reagents && (container_type & REFILLABLE)
+/atom/proc/is_drainable()
+ return reagents && (container_type & DRAINABLE)
/atom/proc/CheckExit()
return 1
@@ -279,17 +276,24 @@
if(desc)
to_chat(user, desc)
- if(reagents && is_open_container()) //is_open_container() isn't really the right proc for this, but w/e
- to_chat(user, "It contains:")
- if(reagents.reagent_list.len)
- if(user.can_see_reagents()) //Show each individual reagent
- for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name]")
- else //Otherwise, just show the total volume
- if(reagents && reagents.reagent_list.len)
- to_chat(user, "[reagents.total_volume] units of various reagents.")
- else
- to_chat(user, "Nothing.")
+ if(reagents)
+ if(container_type & TRANSPARENT)
+ to_chat(user, "It contains:")
+ if(reagents.reagent_list.len)
+ if(user.can_see_reagents()) //Show each individual reagent
+ for(var/I in reagents.reagent_list)
+ var/datum/reagent/R = I
+ to_chat(user, "[R.volume] units of [R.name]")
+ else //Otherwise, just show the total volume
+ if(reagents && reagents.reagent_list.len)
+ to_chat(user, "[reagents.total_volume] units of various reagents.")
+ else
+ to_chat(user, "Nothing.")
+ else if(container_type & AMOUNT_VISIBLE)
+ if(reagents.total_volume)
+ to_chat(user, "It has [reagents.total_volume] unit\s left.")
+ else
+ to_chat(user, "It's empty.")
SendSignal(COMSIG_PARENT_EXAMINE, user)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 90ce57e880f..62bb8f75873 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -280,7 +280,7 @@
return
B.forceMove(src)
beaker = B
- add_attack_logs(user, null, "Added [B] containing [B.reagentlist()] to a cryo cell at [COORD(src)]")
+ add_attack_logs(user, null, "Added [B] containing [B.reagents.log_list()] to a cryo cell at [COORD(src)]")
user.visible_message("[user] adds \a [B] to [src]!", "You add \a [B] to [src]!")
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 2f1a280f83f..aece125c657 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -439,7 +439,8 @@ REAGENT SCANNER
icon_state = "spectrometer"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT | OPENCONTAINER
+ flags = CONDUCT
+ container_type = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index fb4829dd13f..d32d98f3a27 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -11,6 +11,7 @@
throw_speed = 2
throw_range = 7
force = 10
+ container_type = AMOUNT_VISIBLE
materials = list(MAT_METAL=90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
@@ -36,11 +37,8 @@
sprite_name = "miniFE"
/obj/item/extinguisher/examine(mob/user)
- if(..(user, 0))
- to_chat(usr, "[bicon(src)] [src.name] contains:")
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name]")
+ . = ..()
+ to_chat(user, "The safety is [safety ? "on" : "off"].")
/obj/item/extinguisher/New()
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm
index b2f79f7e5c9..5f0fea79da9 100644
--- a/code/game/objects/items/weapons/implants/implant_chem.dm
+++ b/code/game/objects/items/weapons/implants/implant_chem.dm
@@ -3,7 +3,7 @@
desc = "Injects things."
icon_state = "reagents"
origin_tech = "materials=3;biotech=4"
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
/obj/item/implant/chem/get_data()
var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 7c8883ca7e8..dc466f479d0 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -13,7 +13,7 @@
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10,20,30,50,70)
volume = 70
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity)
if(!proximity)
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 364fd49847b..96dd853be09 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -116,7 +116,8 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
- flags = NODROP | OPENCONTAINER | NOBLUDGEON
+ flags = NODROP | NOBLUDGEON
+ container_type = OPENCONTAINER
var/obj/item/watertank/tank
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index b19c5a56e99..bba1dc18de6 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -7,7 +7,7 @@
icon_state = "cart"
anchored = 0
density = 1
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
//copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/storage/bag/trash/mybag = null
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index aa9f21a9cce..f01cc8c41ca 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "mopbucket"
density = 1
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
/obj/structure/mopbucket/New()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 751ade6081f..e657e9f8538 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -115,8 +115,8 @@
if(!open)
return
var/obj/item/reagent_containers/RG = I
- if(RG.is_open_container())
- if(RG.reagents.total_volume >= RG.volume)
+ if(RG.is_refillable())
+ if(RG.reagents.holder_full())
to_chat(user, "[RG] is full.")
else
RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 37fa041af77..ea5e4a652aa 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -69,7 +69,7 @@
else
if(istype(I, /obj/item/reagent_containers))
var/obj/item/reagent_containers/RC = I
- if(RC.flags & OPENCONTAINER)
+ if(RC.container_type & OPENCONTAINER)
for(var/datum/reagent/A in RC.reagents.reagent_list)
.[A.type] += A.volume
.[I.type] += 1
diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm
index dda9490b82a..31f9e66255b 100644
--- a/code/modules/detective_work/footprints_and_rag.dm
+++ b/code/modules/detective_work/footprints_and_rag.dm
@@ -19,7 +19,8 @@
possible_transfer_amounts = list(5)
volume = 5
can_be_placed_into = null
- flags = OPENCONTAINER | NOBLUDGEON
+ flags = NOBLUDGEON
+ container_type = OPENCONTAINER
var/wipespeed = 30
/obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 412c5407ddc..524395a0ac0 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -584,51 +584,46 @@
else
return ..()
//Open reagent containers add and remove water
- else if(O.is_open_container())
- if(istype(O, /obj/item/reagent_containers/glass))
- if(lid_switch)
- to_chat(user, "Open the lid on [src] first!")
- return
- var/obj/item/reagent_containers/glass/C = O
- //Containers with any reagents will get dumped in
- if(C.reagents.total_volume)
- var/water_value = 0
- water_value += C.reagents.get_reagent_amount("water") //Water is full value
- water_value += C.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense?
- water_value += C.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value
- water_value += C.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value
- water_value += C.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo
- water_value += C.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value
- var/message = ""
- if(!water_value) //The container has no water value, clear everything in it
- message = "The filtration process removes everything, leaving the water level unchanged."
- C.reagents.clear_reagents()
- else
- if(water_level == water_capacity)
- to_chat(user, "[src] is already full!")
- else
- message = "The filtration process purifies the water, raising the water level."
-
- if((water_level + water_value) == water_capacity)
- message += " You filled [src] to the brim!"
- if((water_level + water_value) > water_capacity)
- message += " You overfilled [src] and some water runs down the side, wasted."
- C.reagents.clear_reagents()
- adjust_water_level(water_value)
- user.visible_message("[user.name] pours the contents of [C.name] into [src].", "[message]")
- //Empty containers will scoop out water, filling the container as much as possible from the water_level
+ else if(O.is_drainable())
+ //Containers with any reagents will get dumped in
+ if(O.reagents.total_volume)
+ var/water_value = 0
+ water_value += O.reagents.get_reagent_amount("water") //Water is full value
+ water_value += O.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense?
+ water_value += O.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value
+ water_value += O.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value
+ water_value += O.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo
+ water_value += O.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value
+ var/message = ""
+ if(!water_value) //The container has no water value, clear everything in it
+ message = "The filtration process removes everything, leaving the water level unchanged."
+ O.reagents.clear_reagents()
else
- if(!water_level)
- to_chat(user, "[src] is empty!")
+ if(water_level == water_capacity)
+ to_chat(user, "[src] is already full!")
else
- if(water_level >= C.volume) //Enough to fill the container completely
- C.reagents.add_reagent("fishwater", C.volume)
- adjust_water_level(-C.volume)
- user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [C.name] from [src].")
- else //Fill the container as much as possible with the water_level
- C.reagents.add_reagent("fishwater", water_level)
- adjust_water_level(-water_level)
- user.visible_message("[user.name] scoops out some water from [src].", "You fill [C.name] with the last of the water in [src].")
+ message = "The filtration process purifies the water, raising the water level."
+
+ if((water_level + water_value) == water_capacity)
+ message += " You filled [src] to the brim!"
+ if((water_level + water_value) > water_capacity)
+ message += " You overfilled [src] and some water runs down the side, wasted."
+ O.reagents.clear_reagents()
+ adjust_water_level(water_value)
+ user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]")
+ //Empty containers will scoop out water, filling the container as much as possible from the water_level
+ else if(O.is_refillable())
+ if(!water_level)
+ to_chat(user, "[src] is empty!")
+ else
+ if(water_level >= O.reagents.maximum_volume) //Enough to fill the container completely
+ O.reagents.add_reagent("fishwater", O.reagents.maximum_volume)
+ adjust_water_level(-O.reagents.maximum_volume)
+ user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].")
+ else //Fill the container as much as possible with the water_level
+ O.reagents.add_reagent("fishwater", water_level)
+ adjust_water_level(-water_level)
+ user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].")
//Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
else if(iswrench(O))
if(!water_level)
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index 6086f2798a7..4cf5c58bd06 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -235,7 +235,7 @@
//empties aren't sealed, so let's open it quietly
drink_container = new drink_container()
drink_container.canopened = 1
- drink_container.flags |= OPENCONTAINER
+ drink_container.container_type |= OPENCONTAINER
drink_container.forceMove(loc)
containers[con_type]--
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index e64b74f1635..19997df2805 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -6,7 +6,7 @@
desc = "yummy"
icon = 'icons/obj/drinks.dmi'
icon_state = null
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
consume_sound = 'sound/items/drink.ogg'
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
@@ -26,7 +26,11 @@
/obj/item/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
to_chat(user, " None of [src] left, oh no!")
- return 0
+ return FALSE
+
+ if(!is_drainable())
+ to_chat(user, " You need to open [src] first!")
+ return FALSE
if(istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
@@ -36,14 +40,13 @@
borg.cell.use(30)
var/refill = reagents.get_master_reagent_id()
if(refill in drinks) // Only synthesize drinks
- spawn(600)
- reagents.add_reagent(refill, bitesize)
- return 1
- return 0
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, bitesize), 600)
+ return TRUE
+ return FALSE
/obj/item/reagent_containers/food/drinks/MouseDrop(atom/over_object) //CHUG! CHUG! CHUG!
var/mob/living/carbon/chugger = over_object
- if (!(flags & OPENCONTAINER))
+ if (!(container_type & DRAINABLE))
to_chat(chugger, "You need to open [src] first!")
return
if(istype(chugger) && loc == chugger && src == chugger.get_active_hand() && reagents.total_volume)
@@ -56,39 +59,18 @@
break
/obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity)
- if(!proximity) return
+ if(!proximity)
+ return
- // Moved from the can code; not necessary since closed cans aren't open containers now, but, eh.
- if(istype(target, /obj/item/reagent_containers/food/drinks/cans))
- var/obj/item/reagent_containers/food/drinks/cans/cantarget = target
- if(cantarget.canopened == 0)
- to_chat(user, "You need to open the drink you want to pour into!")
- return
-
- if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
-
- if(!target.reagents.total_volume)
- to_chat(user, " [target] is empty.")
- return
-
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, " [src] is full.")
- return
-
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
- to_chat(user, " You fill [src] with [trans] units of the contents of [target].")
-
- else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
+ if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
to_chat(user, " [src] is empty.")
- return
+ return FALSE
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ if(target.reagents.holder_full())
to_chat(user, " [target] is full.")
- return
-
-
-
+ return FALSE
+
var/datum/reagent/refill
var/datum/reagent/refillName
if(isrobot(user))
@@ -103,18 +85,30 @@
var/mob/living/silicon/robot/bro = user
var/chargeAmount = max(30,4*trans)
bro.cell.use(chargeAmount)
- to_chat(user, "Now synthesizing [trans] units of [refillName]...")
+ to_chat(user, "Now synthesizing [trans] units of [refillName]...")
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, trans), 300)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/__to_chat, user, "Cyborg [src] refilled."), 300)
+ else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
+ if(!is_refillable())
+ to_chat(user, "[src]'s tab isn't open!")
+ return FALSE
+ if(!target.reagents.total_volume)
+ to_chat(user, "[target] is empty.")
+ return FALSE
- spawn(300)
- reagents.add_reagent(refill, trans)
- to_chat(user, "Cyborg [src] refilled.")
+ if(reagents.holder_full())
+ to_chat(user, "[src] is full.")
+ return FALSE
- return
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+ to_chat(user, "You fill [src] with [trans] units of the contents of [target].")
+
+ return FALSE
/obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
- return
+ return FALSE
if(is_hot(I))
if(reagents)
reagents.chem_temp += 15
@@ -151,7 +145,8 @@
materials = list(MAT_METAL=100)
possible_transfer_amounts = list()
volume = 5
- flags = CONDUCT | OPENCONTAINER
+ flags = CONDUCT
+ container_type = OPENCONTAINER
/obj/item/reagent_containers/food/drinks/trophy/gold_cup
name = "gold cup"
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index b0c0d24efaa..60642cab847 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -10,7 +10,7 @@
desc = "Just your average condiment container."
icon = 'icons/obj/food/containers.dmi'
icon_state = "emptycondiment"
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50)
volume = 50
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites.
@@ -47,7 +47,7 @@
if(!reagents || !reagents.total_volume)
return // The condiment might be empty after the delay.
user.visible_message("[user] feeds [M] from [src].")
- add_attack_logs(user, M, "Fed [src] containing [reagentlist()]")
+ add_attack_logs(user, M, "Fed [src] containing [reagents.log_list()]")
var/fraction = min(10/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
@@ -75,7 +75,7 @@
to_chat(user, "You fill [src] with [trans] units of the contents of [target].")
//Something like a glass or a food item. Player probably wants to transfer TO it.
- else if(target.is_open_container() || istype(target, /obj/item/reagent_containers/food/snacks))
+ else if(target.is_drainable() || istype(target, /obj/item/reagent_containers/food/snacks))
if(!reagents.total_volume)
to_chat(user, "[src] is empty!")
return
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 9de98749e42..d97d5742b06 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -8,7 +8,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
@@ -93,7 +93,7 @@
icon_state = off_icon
broken = 0 // Fix it!
dirty = 0 // just to be sure
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
else
to_chat(user, "It's broken!")
return 1
@@ -105,7 +105,7 @@
dirty = 0 // It's clean!
broken = 0 // just to be sure
icon_state = off_icon
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
else //Otherwise bad luck!!
to_chat(user, "It's dirty!")
return 1
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 6b2da2c29ae..a3453585817 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -21,7 +21,7 @@
icon_state = "weedspray"
item_state = "plantbgone"
volume = 100
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
@@ -43,7 +43,7 @@
icon_state = "pestspray"
item_state = "plantbgone"
volume = 100
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index b5bea1fc6b3..92f91ddf51a 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -763,8 +763,8 @@
else if(transfer_amount) // Droppers, cans, beakers, what have you.
visi_msg="[user] uses [reagent_source] on [target]"
irrigate = 1
- // Beakers, bottles, buckets, etc. Can't use is_open_container though.
- if(istype(reagent_source, /obj/item/reagent_containers/glass/))
+ // Beakers, bottles, buckets, etc.
+ if(reagent_source.is_drainable())
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index c5557028896..ea2d66745f0 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1019,7 +1019,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
/mob/living/carbon/proc/forceFedAttackLog(var/obj/item/reagent_containers/food/toEat, mob/user)
- add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagentlist(toEat)]", ATKLOG_FEW)
+ add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagents.log_list(toEat)]", ATKLOG_FEW)
if(!iscarbon(user))
LAssailant = null
else
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fdd91bf1cd9..591c62ff862 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -329,7 +329,13 @@
/mob/living/proc/can_inject()
- return 1
+ return TRUE
+
+/mob/living/is_injectable(allowmobs = TRUE)
+ return (allowmobs && reagents && can_inject())
+
+/mob/living/is_drawable(allowmobs = TRUE)
+ return (allowmobs && reagents && can_inject())
/mob/living/proc/get_organ_target()
var/mob/shooter = src
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 4e3aaefd1eb..83897e5cbd3 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -123,7 +123,7 @@
* Sleepypens
*/
/obj/item/pen/sleepy
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
origin_tech = "engineering=4;syndicate=2"
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index f3c5db5da22..43112467f33 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -242,11 +242,11 @@
name = "shotgun dart"
desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
icon_state = "cshell"
+ container_type = OPENCONTAINER
projectile_type = /obj/item/projectile/bullet/dart
/obj/item/ammo_casing/shotgun/dart/New()
..()
- flags |= OPENCONTAINER
create_reagents(30)
/obj/item/ammo_casing/shotgun/dart/attackby()
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 5c78613fbdf..7b39bfa3be8 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -29,7 +29,7 @@
var/obj/item/dart_cartridge/cartridge = null //Container of darts.
var/max_beakers = 3
var/dart_reagent_amount = 15
- var/container_type = /obj/item/reagent_containers/glass/beaker
+ var/containers_type = /obj/item/reagent_containers/glass/beaker
var/list/starting_chems = null
/obj/item/gun/dartgun/update_icon()
@@ -49,7 +49,7 @@
..()
if(starting_chems)
for(var/chem in starting_chems)
- var/obj/B = new container_type(src)
+ var/obj/B = new containers_type(src)
B.reagents.add_reagent(chem, 50)
beakers += B
cartridge = new /obj/item/dart_cartridge(src)
@@ -87,7 +87,7 @@
update_icon()
return
if(istype(I, /obj/item/reagent_containers/glass))
- if(!istype(I, container_type))
+ if(!istype(I, containers_type))
to_chat(user, "[I] doesn't seem to fit into [src].")
return
if(beakers.len >= max_beakers)
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index f0816022b64..fa010a69e49 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -143,7 +143,8 @@
fire_sound = 'sound/weapons/laser.ogg'
usesound = 'sound/items/Welder.ogg'
toolspeed = 1
- flags = CONDUCT | OPENCONTAINER
+ container_type = OPENCONTAINER
+ flags = CONDUCT
attack_verb = list("attacked", "slashed", "cut", "sliced")
force = 12
sharp = 1
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index dacd44a5035..e54c9689be2 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -678,6 +678,16 @@ var/const/INGEST = 2
stuff += A.id
return english_list(stuff)
+/datum/reagents/proc/log_list()
+ if(!length(reagent_list))
+ return "no reagents"
+ var/list/data = list()
+ for(var/r in reagent_list) //no reagents will be left behind
+ var/datum/reagent/R = r
+ data += "[R.id] ([round(R.volume, 0.1)]u)"
+ //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
+ return english_list(data)
+
//two helper functions to preserve data across reactions (needed for xenoarch)
/datum/reagents/proc/get_data(reagent_id)
for(var/datum/reagent/D in reagent_list)
@@ -739,6 +749,11 @@ var/const/INGEST = 2
break
return result
+/datum/reagents/proc/holder_full()
+ if(total_volume >= maximum_volume)
+ return TRUE
+ return FALSE
+
/datum/reagents/Destroy()
. = ..()
processing_objects -= src
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index aa1f8aaf385..3a5b753217f 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -30,7 +30,6 @@
if(BL.data && BL.data["viruses"])
var/list/viruses = BL.data["viruses"]
return viruses[index]
- return null
/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index)
if(beaker && beaker.reagents)
@@ -40,13 +39,11 @@
if(BL.data && BL.data["resistances"])
var/list/resistances = BL.data["resistances"]
return resistances[index]
- return null
/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index)
var/datum/disease/D = GetVirusByIndex(index)
if(D)
return D.GetDiseaseID()
- return null
/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime)
wait = 1
@@ -175,7 +172,6 @@
return
add_fingerprint(usr)
- return
//Prints a nice virus release form. Props to Urbanliner for the layout
/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user)
@@ -319,12 +315,12 @@
popup.set_content(dat)
popup.open(0)
onclose(user, "pandemic")
- return
/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER))
- if(stat & (NOPOWER|BROKEN)) return
+ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
+ if(stat & (NOPOWER|BROKEN))
+ return
if(beaker)
to_chat(user, "A beaker is already loaded into the machine!")
return
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 5948d29e4cd..9ea55dd5af7 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -112,7 +112,7 @@
if(default_unfasten_wrench(user, I))
return
- if (istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER) )
+ if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) )
if (!beaker)
if(!user.drop_item())
return 1
diff --git a/code/modules/reagents/chemistry/readme.dm b/code/modules/reagents/chemistry/readme.dm
index 1fe946a10d1..6c76d0a3a0f 100644
--- a/code/modules/reagents/chemistry/readme.dm
+++ b/code/modules/reagents/chemistry/readme.dm
@@ -238,12 +238,4 @@ About the Tools:
It simply tells us how much to transfer when
'pouring' our reagents into something else.
- atom/proc/is_open_container()
- Checks atom/var/flags & OPENCONTAINER.
- If this returns 1 , you can use syringes, beakers etc
- to manipulate the contents of this object.
- If it's 0, you'll need to write your own custom reagent
- transfer code since you will not be able to use the standard
- tools to manipulate it.
-
*/
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index e3e0daee333..258bf98468d 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -61,14 +61,6 @@
/obj/item/reagent_containers/afterattack(obj/target, mob/user , flag)
return
-/obj/item/reagent_containers/proc/reagentlist() //Return reagents in a reagent_container, default to source
- var/data
- if(reagents && reagents.reagent_list && reagents.reagent_list.len) //find a reagent list if there is and check if it has entries
- for(var/datum/reagent/R in reagents.reagent_list) //no reagents will be left behind
- data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
- return data
- else return "No reagents"
-
/obj/item/reagent_containers/wash(mob/user, atom/source)
if(is_open_container())
if(reagents.total_volume >= volume)
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 22332bd4103..337b78882cf 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -9,7 +9,7 @@
item_state = "atoxinbottle"
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30)
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
volume = 30
/obj/item/reagent_containers/glass/bottle/on_reagent_change()
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index d20ef6f82ee..69030fafa74 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -11,7 +11,7 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50)
volume = 50
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
var/label_text = ""
// the fucking asshole who designed this can go die in a fire - Iamgoofball
@@ -59,10 +59,10 @@
..()
if(is_open_container())
to_chat(usr, "You put the lid on [src].")
- flags ^= OPENCONTAINER
+ container_type ^= REFILLABLE | DRAINABLE
else
to_chat(usr, "You take the lid off [src].")
- flags |= OPENCONTAINER
+ container_type |= REFILLABLE | DRAINABLE
update_icon()
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
@@ -262,7 +262,7 @@
volume = 100
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100)
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/beaker/vial
name = "vial"
@@ -272,7 +272,7 @@
volume = 25
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
can_assembly = 0
/obj/item/reagent_containers/glass/beaker/drugs
@@ -282,7 +282,7 @@
amount_per_transfer_from_this = 2
possible_transfer_amounts = 2
volume = 10
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
can_assembly = 0
/obj/item/reagent_containers/glass/beaker/noreact
@@ -293,7 +293,7 @@
volume = 50
amount_per_transfer_from_this = 10
origin_tech = "materials=2;engineering=3;plasmatech=3"
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/beaker/noreact/New()
..()
@@ -307,7 +307,7 @@
volume = 300
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100,300)
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
origin_tech = "bluespace=5;materials=4;plasmatech=4"
/obj/item/reagent_containers/glass/beaker/cryoxadone
@@ -337,7 +337,7 @@
volume = 120
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_HEAD
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index ced02f2e48f..042b12e3122 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -11,7 +11,7 @@
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
slot_flags = SLOT_BELT
var/ignore_flags = FALSE
var/emagged = FALSE
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 02ab4408acb..7c0823c2497 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -4,7 +4,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "cleaner"
item_state = "cleaner"
- flags = OPENCONTAINER | NOBLUDGEON
+ flags = NOBLUDGEON
+ container_type = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 38478abd0e7..654dff53b5e 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -16,6 +16,7 @@
volume = 15
w_class = WEIGHT_CLASS_TINY
sharp = 1
+ container_type = TRANSPARENT
var/busy = 0
var/mode = SYRINGE_DRAW
var/projectile_type = /obj/item/projectile/bullet/dart/syringe
@@ -78,7 +79,7 @@
switch(mode)
if(SYRINGE_DRAW)
- if(reagents.total_volume >= reagents.maximum_volume)
+ if(reagents.holder_full())
to_chat(user, "The syringe is full.")
return
@@ -91,7 +92,7 @@
if(!do_mob(user, target))
busy = 0
return
- if(reagents.total_volume >= reagents.maximum_volume)
+ if(reagents.holder_full())
return
busy = 0
if(L.transfer_blood_to(src, drawn_amount))
@@ -104,14 +105,14 @@
to_chat(user, "[target] is empty!")
return
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract))
+ if(!target.is_drawable())
to_chat(user, "You cannot directly remove reagents from [target]!")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
to_chat(user, "You fill [src] with [trans] units of the solution.")
- if(reagents.total_volume >= reagents.maximum_volume)
+ if(reagents.holder_full())
mode=!mode
update_icon()
@@ -120,7 +121,7 @@
to_chat(user, "[src] is empty.")
return
- if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes))
+ if(!L && !target.is_injectable())
to_chat(user, "You cannot directly fill [target]!")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index bcbcad6bc98..a90dd80ac59 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -6,28 +6,22 @@
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
+ container_type = DRAINABLE | AMOUNT_VISIBLE
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation
-/obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params)
- return
+/obj/structure/reagent_dispensers/attackby(obj/item/I, mob/user, params)
+ . = ..()
+ if(I.is_refillable())
+ return FALSE //so we can refill them via their afterattack.
/obj/structure/reagent_dispensers/New()
create_reagents(tank_volume)
reagents.add_reagent(reagent_id, tank_volume)
..()
-/obj/structure/reagent_dispensers/examine(mob/user)
- if(!..(user, 2))
- return
- if(reagents.total_volume)
- to_chat(user, "It has [reagents.total_volume] units left.")
- else
- to_chat(user, "It's empty.")
-
-
/obj/structure/reagent_dispensers/proc/boom()
visible_message("[src] ruptures!")
chem_splash(loc, 5, list(reagents))
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index ce728a4fde3..57a0eaef7da 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -8,7 +8,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
name = "Circuit Imprinter"
desc = "Manufactures circuit boards for the construction of machines."
icon_state = "circuit_imprinter"
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
var/efficiency_coeff
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 0fa843cb8ae..a441dff00b3 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -11,7 +11,7 @@ Note: Must be placed west/left of and R&D console to function.
name = "Protolathe"
desc = "Converts raw materials into useful objects."
icon_state = "protolathe"
- flags = OPENCONTAINER
+ container_type = OPENCONTAINER
var/efficiency_coeff
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 56ef19b7c1a..9ad049c604b 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -8,6 +8,7 @@
icon_state = "grey slime extract"
force = 1
w_class = WEIGHT_CLASS_TINY
+ container_type = INJECTABLE | DRAWABLE
throwforce = 0
throw_speed = 3
throw_range = 6
From a71377108a900f537dc77ab48003d2c74ef5e8bd Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Sat, 13 Oct 2018 21:11:18 +0800
Subject: [PATCH 03/37] Improve revenant code a bit
---
.../gamemodes/miniantags/revenant/revenant.dm | 34 +++++++++++--------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index d75a1bd6d52..ce1f5fc980b 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -121,9 +121,20 @@
remove_from_all_data_huds()
spawn(5)
- if(src.mind)
- src.mind.wipe_memory()
- src << 'sound/effects/ghost.ogg'
+ if(mind)
+ giveObjectivesandGoals()
+ if(!giveSpells())
+ message_admins("Revenant was created but has no mind. Trying again in ten seconds.")
+ addtimer(CALLBACK(src, .proc/tryGiveinTen), 100)
+
+/mob/living/simple_animal/revenant/proc/tryGiveinTen()
+ if(!giveSpells())
+ message_admins("Revenant still has no mind. Deleting...")
+ qdel(src)
+ else
+ giveObjectivesandGoals()
+
+/mob/living/simple_animal/revenant/proc/giveObjectivesandGoals()
to_chat(src, " ")
to_chat(src, "You are a revenant.")
to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.")
@@ -132,22 +143,15 @@
to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.")
to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.")
to_chat(src, "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.")
-
var/datum/objective/revenant/objective = new
- objective.owner = src.mind
- src.mind.objectives += objective
+ objective.owner = mind
+ mind.objectives += objective
to_chat(src, "Objective #1: [objective.explanation_text]")
var/datum/objective/revenantFluff/objective2 = new
- objective2.owner = src.mind
- src.mind.objectives += objective2
+ objective2.owner = mind
+ mind.objectives += objective2
to_chat(src, "Objective #2: [objective2.explanation_text]")
- ticker.mode.traitors |= src.mind //Necessary for announcing
- if(!src.giveSpells())
- message_admins("Revenant was created but has no mind. Trying again in five seconds.")
- spawn(50)
- if(!src.giveSpells())
- message_admins("Revenant still has no mind. Deleting...")
- qdel(src)
+ ticker.mode.traitors |= mind //Necessary for announcing
/mob/living/simple_animal/revenant/proc/giveSpells()
if(src.mind)
From 747684927ada8e635c16a6e1c6f7cae5cdff5a34 Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Sat, 13 Oct 2018 22:12:37 +0800
Subject: [PATCH 04/37] Formatting fixes & spanning fish tank
---
code/game/atoms.dm | 8 +--
.../objects/items/weapons/extinguisher.dm | 2 +-
code/modules/fish/fishtank.dm | 64 +++++++++----------
3 files changed, 37 insertions(+), 37 deletions(-)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index fd1cb0e32c1..77f3a59a12b 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -278,17 +278,17 @@
if(reagents)
if(container_type & TRANSPARENT)
- to_chat(user, "It contains:")
+ to_chat(user, "It contains:")
if(reagents.reagent_list.len)
if(user.can_see_reagents()) //Show each individual reagent
for(var/I in reagents.reagent_list)
var/datum/reagent/R = I
- to_chat(user, "[R.volume] units of [R.name]")
+ to_chat(user, "[R.volume] units of [R.name]")
else //Otherwise, just show the total volume
if(reagents && reagents.reagent_list.len)
- to_chat(user, "[reagents.total_volume] units of various reagents.")
+ to_chat(user, "[reagents.total_volume] units of various reagents.")
else
- to_chat(user, "Nothing.")
+ to_chat(user, "Nothing. ")
else if(container_type & AMOUNT_VISIBLE)
if(reagents.total_volume)
to_chat(user, "It has [reagents.total_volume] unit\s left.")
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index d32d98f3a27..3d893c86371 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -38,7 +38,7 @@
/obj/item/extinguisher/examine(mob/user)
. = ..()
- to_chat(user, "The safety is [safety ? "on" : "off"].")
+ to_chat(user, "The safety is [safety ? "on" : "off"].")
/obj/item/extinguisher/New()
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 524395a0ac0..63d07ad3d27 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -474,7 +474,7 @@
//Finally, report the full examine_message constructed from the above reports
- to_chat(user, "[examine_message]")
+ to_chat(user, "[examine_message]")
return examine_message
//////////////////////////////
@@ -485,39 +485,39 @@
if(istype(M, /mob/living/simple_animal/pet/cat))
if(M.a_intent == INTENT_HELP) //Cats can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
- M.visible_message("[M.name] stares at into [src] while sitting perfectly still.", "The lid is closed, so you stare into [src] intently.")
+ M.visible_message("[M.name] stares at into [src] while sitting perfectly still.", "The lid is closed, so you stare into [src] intently.")
else
if(fish_count) //Tank must actually have fish to try catching one
- M.visible_message("[M.name] leaps up onto [src] and attempts to fish through the opening!", "You jump up onto [src] and begin fishing through the opening!")
+ M.visible_message("[M.name] leaps up onto [src] and attempts to fish through the opening!", "You jump up onto [src] and begin fishing through the opening!")
if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
- M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
+ M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
else //No water or didn't slip, get that fish!
- M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
kill_fish() //Kill a random fish
M.health = M.maxHealth //Eating fish heals the predator
else
- to_chat(M, "There are no fish in [src]!")
+ to_chat(M, "There are no fish in [src]!")
else
return ..()
else if(istype(M, /mob/living/simple_animal/hostile/bear))
if(M.a_intent == INTENT_HELP) //Bears can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
- M.visible_message("[M.name] scrapes it's claws along [src]'s lid.", "The lid is closed, so you scrape your claws against [src]'s lid.")
+ M.visible_message("[M.name] scrapes it's claws along [src]'s lid.", "The lid is closed, so you scrape your claws against [src]'s lid.")
else
if(fish_count) //Tank must actually have fish to try catching one
- M.visible_message("[M.name] reaches into [src] and attempts to fish through the opening!", "You reach into [src] and begin fishing through the opening!")
+ M.visible_message("[M.name] reaches into [src] and attempts to fish through the opening!", "You reach into [src] and begin fishing through the opening!")
if(water_level && prob(5)) //Bears are good at catching fish, only a 5% chance to fail
- M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!")
+ M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!")
else //No water or didn't slip, get that fish!
- M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
kill_fish() //Kill a random fish
M.health = M.maxHealth //Eating fish heals the predator
else
- to_chat(M, "There are no fish in [src]!")
+ to_chat(M, "There are no fish in [src]!")
else
return ..()
else
@@ -532,8 +532,8 @@
"You hear a banging sound.")
else
playsound(loc, 'sound/effects/glassknock.ogg', 80, 1)
- user.visible_message("[user.name] taps on the [name].", \
- "You tap on the [name].", \
+ user.visible_message("[user.name] taps on the [name].", \
+ "You tap on the [name].", \
"You hear a knocking sound.")
/obj/machinery/fishtank/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
@@ -573,14 +573,14 @@
if(W.isOn())
if(obj_integrity < max_integrity)
playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You repair some of the cracks on [src].")
+ to_chat(user, "You repair some of the cracks on [src].")
obj_integrity = min(obj_integrity + 20, max_integrity)
check_health()
else
- to_chat(user, "There is no damage to fix!")
+ to_chat(user, "There is no damage to fix!")
else
if(obj_integrity < max_integrity)
- to_chat(user, "[W] must be on to repair this damage.")
+ to_chat(user, "[W] must be on to repair this damage.")
else
return ..()
//Open reagent containers add and remove water
@@ -600,7 +600,7 @@
O.reagents.clear_reagents()
else
if(water_level == water_capacity)
- to_chat(user, "[src] is already full!")
+ to_chat(user, "[src] is already full!")
else
message = "The filtration process purifies the water, raising the water level."
@@ -610,20 +610,20 @@
message += " You overfilled [src] and some water runs down the side, wasted."
O.reagents.clear_reagents()
adjust_water_level(water_value)
- user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]")
+ user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]")
//Empty containers will scoop out water, filling the container as much as possible from the water_level
else if(O.is_refillable())
if(!water_level)
- to_chat(user, "[src] is empty!")
+ to_chat(user, "[src] is empty!")
else
if(water_level >= O.reagents.maximum_volume) //Enough to fill the container completely
O.reagents.add_reagent("fishwater", O.reagents.maximum_volume)
adjust_water_level(-O.reagents.maximum_volume)
- user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].")
+ user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].")
else //Fill the container as much as possible with the water_level
O.reagents.add_reagent("fishwater", water_level)
adjust_water_level(-water_level)
- user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].")
+ user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].")
//Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
else if(iswrench(O))
if(!water_level)
@@ -632,17 +632,17 @@
if(do_after(user, 50 * O.toolspeed, target = src))
deconstruct(TRUE)
else
- to_chat(user, "[src] must be empty before you disassemble it!")
+ to_chat(user, "[src] must be empty before you disassemble it!")
//Fish eggs
else if(istype(O, /obj/item/fish_eggs))
var/obj/item/fish_eggs/egg = O
//Don't add eggs if there is no water (they kinda need that to live)
if(!water_level)
- to_chat(user, "[src] has no water; [egg.name] won't hatch without water!")
+ to_chat(user, "[src] has no water; [egg.name] won't hatch without water!")
else
//Don't add eggs if the tank already has the max number of fish
if(fish_count >= max_fish)
- to_chat(user, "[src] can't hold any more fish.")
+ to_chat(user, "[src] can't hold any more fish.")
else
add_fish(egg.fish_type)
qdel(egg)
@@ -652,30 +652,30 @@
if(water_level)
if(food_level < 10)
if(fish_count == 0)
- user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
+ user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
else
- user.visible_message("[user.name] feeds the fish in [src]. The fish look excited!", "You feed the fish in [src]. They look excited!")
+ user.visible_message("[user.name] feeds the fish in [src]. The fish look excited!", "You feed the fish in [src]. They look excited!")
adjust_food_level(10)
else
- to_chat(user, "[src] already has plenty of food in it. You decide to not add more.")
+ to_chat(user, "[src] already has plenty of food in it. You decide to not add more.")
else
- to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.")
+ to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.")
//Fish egg scoop
else if(istype(O, /obj/item/egg_scoop))
if(egg_count)
- user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].")
+ user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].")
harvest_eggs(user)
else
- user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.")
+ user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.")
//Fish net
else if(istype(O, /obj/item/fish_net))
harvest_fish(user)
//Tank brush
else if(istype(O, /obj/item/tank_brush))
if(filth_level == 0)
- to_chat(user, "[src] is already spotless!")
+ to_chat(user, "[src] is already spotless!")
else
adjust_filth_level(-filth_level)
- user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.")
+ user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.")
else
return ..()
\ No newline at end of file
From 2607eac734a66c1a6566c0b8e012dfd6656cde17 Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Sat, 13 Oct 2018 22:33:32 +0800
Subject: [PATCH 05/37] Fixes missing sound
---
code/game/gamemodes/miniantags/revenant/revenant.dm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index ce1f5fc980b..21d35be839b 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -125,9 +125,9 @@
giveObjectivesandGoals()
if(!giveSpells())
message_admins("Revenant was created but has no mind. Trying again in ten seconds.")
- addtimer(CALLBACK(src, .proc/tryGiveinTen), 100)
+ addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 100)
-/mob/living/simple_animal/revenant/proc/tryGiveinTen()
+/mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete()
if(!giveSpells())
message_admins("Revenant still has no mind. Deleting...")
qdel(src)
@@ -135,6 +135,8 @@
giveObjectivesandGoals()
/mob/living/simple_animal/revenant/proc/giveObjectivesandGoals()
+ mind.wipe_memory()
+ SEND_SOUND(src, 'sound/effects/ghost.ogg')
to_chat(src, " ")
to_chat(src, "You are a revenant.")
to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.")
From 6e70f1eed313a1c7b4fae5359573f360750394ad Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Mon, 15 Oct 2018 18:35:11 +0800
Subject: [PATCH 06/37] SECONDS
---
code/game/gamemodes/miniantags/revenant/revenant.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 21d35be839b..1969aaaaab9 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -125,7 +125,7 @@
giveObjectivesandGoals()
if(!giveSpells())
message_admins("Revenant was created but has no mind. Trying again in ten seconds.")
- addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 100)
+ addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 10 SECONDS)
/mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete()
if(!giveSpells())
From 6d6c6bba9d5fe0bdeae2be265af140b836943b37 Mon Sep 17 00:00:00 2001
From: joep van der velden
Date: Wed, 17 Oct 2018 20:18:55 +0200
Subject: [PATCH 07/37] Viromancy!
---
code/datums/uplink_item.dm | 10 ++++++++++
.../modules/reagents/reagent_containers/dropper.dm | 14 +++++++++++++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 82af6fef4d9..0b76f203784 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -220,6 +220,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 5
job = list("Chief Medical Officer", "Medical Doctor", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist")
+//Virology
+
+/datum/uplink_item/jobspecific/rad_laser
+ name = "Viral Injector"
+ desc = "A modified hypospray disguised as a functional pipette. The pipette can infect victims with viruses upon injection."
+ reference = "RL"
+ item = /obj/item/reagent_containers/dropper/precision/viral_injector
+ cost = 3
+ job = list("Virologist")
+
/datum/uplink_item/dangerous/cat_grenade
name = "Feral Cat Delivery Grenade"
desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 6198313bf88..46c1375e605 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -108,4 +108,16 @@
icon_state = "pipette"
amount_per_transfer_from_this = 1
possible_transfer_amounts = list(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
- volume = 1
\ No newline at end of file
+ volume = 1
+
+//Syndicate item. Virus transmitting mini hypospray
+/obj/item/reagent_containers/dropper/precision/viral_injector
+
+/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone)
+ if(M.can_inject(user, 1))
+ to_chat(user, "You stab [M] with the [src].")
+ add_attack_logs(user, M, "Stabbed with Viral Injector")
+
+ if(reagents.total_volume && M.reagents)
+ reagents.reaction(M, INGEST, reagents.total_volume)
+ reagents.trans_to(M, 1)
From 4041e13afcb1b09107637cc2db01d7e091b47966 Mon Sep 17 00:00:00 2001
From: farie82
Date: Wed, 17 Oct 2018 22:41:11 +0200
Subject: [PATCH 08/37] Update uplink_item.dm
---
code/datums/uplink_item.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 0b76f203784..51e22f36e1f 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -222,10 +222,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
//Virology
-/datum/uplink_item/jobspecific/rad_laser
+/datum/uplink_item/jobspecific/viral_injector
name = "Viral Injector"
desc = "A modified hypospray disguised as a functional pipette. The pipette can infect victims with viruses upon injection."
- reference = "RL"
+ reference = "VI"
item = /obj/item/reagent_containers/dropper/precision/viral_injector
cost = 3
job = list("Virologist")
From 4869767d57da5060da94bbef3a0b62ec7b82a324 Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Thu, 18 Oct 2018 10:45:07 +0800
Subject: [PATCH 09/37] Revvie fixes
---
.../gamemodes/miniantags/revenant/revenant.dm | 52 ++++++++++++-------
1 file changed, 32 insertions(+), 20 deletions(-)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 1969aaaaab9..16b39ab9911 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -120,19 +120,33 @@
updateallghostimages()
remove_from_all_data_huds()
- spawn(5)
- if(mind)
- giveObjectivesandGoals()
- if(!giveSpells())
- message_admins("Revenant was created but has no mind. Trying again in ten seconds.")
- addtimer(CALLBACK(src, .proc/giveSpellsObjectivesordelete), 10 SECONDS)
-
-/mob/living/simple_animal/revenant/proc/giveSpellsObjectivesordelete()
- if(!giveSpells())
- message_admins("Revenant still has no mind. Deleting...")
- qdel(src)
- else
+ addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 10 seconds to put in a ghost (Or wait 10 seconds before giving it objectives)
+
+
+/mob/living/simple_animal/revenant/proc/firstSetupAttempt()
+ if(mind)
giveObjectivesandGoals()
+ giveSpells()
+ else
+ message_admins("Revenant was created but has no mind. Put a ghost inside, or a poll will be made in one minute.")
+ addtimer(CALLBACK(src, .proc/setupOrDelete), 1 MINUTES)
+
+/mob/living/simple_animal/revenant/proc/setupOrDelete()
+ if(mind)
+ giveObjectivesandGoals()
+ giveSpells()
+ else
+ var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [real_name]?", poll_time = 15 SECONDS)
+ var/mob/dead/observer/theghost = null
+ if(candidates.len)
+ theghost = pick(candidates)
+ message_admins("[key_name_admin(theghost)] has taken control of a revenant created without a mind")
+ key = theghost.key
+ giveObjectivesandGoals()
+ giveSpells()
+ else
+ message_admins("No ghost was willing to take control of a mindless revenant. Deleting...")
+ qdel(src)
/mob/living/simple_animal/revenant/proc/giveObjectivesandGoals()
mind.wipe_memory()
@@ -156,14 +170,12 @@
ticker.mode.traitors |= mind //Necessary for announcing
/mob/living/simple_animal/revenant/proc/giveSpells()
- if(src.mind)
- src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
- src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null))
- src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
- src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
- src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null))
- return 1
- return 0
+ mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
+ mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null))
+ mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
+ mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
+ mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null))
+ return TRUE
/mob/living/simple_animal/revenant/dust()
From ede44776892ee9a0d675be39da189e77d01e214a Mon Sep 17 00:00:00 2001
From: joep van der velden
Date: Thu, 18 Oct 2018 23:18:18 +0200
Subject: [PATCH 10/37] Added logging
---
.../reagents/reagent_containers/dropper.dm | 29 ++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 46c1375e605..222475dac74 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -116,8 +116,29 @@
/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone)
if(M.can_inject(user, 1))
to_chat(user, "You stab [M] with the [src].")
- add_attack_logs(user, M, "Stabbed with Viral Injector")
-
if(reagents.total_volume && M.reagents)
- reagents.reaction(M, INGEST, reagents.total_volume)
- reagents.trans_to(M, 1)
+ var/list/injected = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ injected += R.name
+ var/datum/reagent/blood/B = R
+
+ if(B && B.data["viruses"])
+ var/virList = list()
+ for(var/dis in B.data["viruses"])
+ var/datum/disease/D = dis
+ var/virusData = D.name
+ var/english_symptoms = list()
+ var/datum/disease/advance/A = D
+ if(A)
+ for(var/datum/symptom/S in A.symptoms)
+ english_symptoms += S.name
+ virusData += " ([english_list(english_symptoms)])"
+ virList += virusData
+ var/str = english_list(virList)
+ add_attack_logs(user, M, "Infected with [str].")
+
+ reagents.reaction(M, INGEST, reagents.total_volume)
+ reagents.trans_to(M, 1)
+
+ var/contained = english_list(injected)
+ add_attack_logs(user, M, "Injected with [src] containing ([contained])")
From 927fd6febc381b8337c0ca0de9195624664d2d3f Mon Sep 17 00:00:00 2001
From: farie82
Date: Fri, 19 Oct 2018 08:24:57 +0200
Subject: [PATCH 11/37] Damn web IDE adding enters and shizle
---
code/datums/uplink_item.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 9ec6dbe90fb..a2ea8d3a23a 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -231,7 +231,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
job = list("Virologist")
/datum/uplink_item/jobspecific/cat_grenade
-
name = "Feral Cat Delivery Grenade"
desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
item = /obj/item/grenade/spawnergrenade/feral_cats
From bbff7546d0ec570f40cbb450369a07005a17685b Mon Sep 17 00:00:00 2001
From: joep van der velden
Date: Sat, 20 Oct 2018 18:58:42 +0200
Subject: [PATCH 12/37] Fixed the weirdness
---
code/modules/reagents/reagent_containers/dropper.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 222475dac74..19fb197c077 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -122,7 +122,7 @@
injected += R.name
var/datum/reagent/blood/B = R
- if(B && B.data["viruses"])
+ if(istype(B) && B.data["viruses"])
var/virList = list()
for(var/dis in B.data["viruses"])
var/datum/disease/D = dis
From a3b7b3c8c04aef337b2d94fcaa76c42860a6e146 Mon Sep 17 00:00:00 2001
From: Purpose
Date: Sat, 20 Oct 2018 21:59:00 +0100
Subject: [PATCH 13/37] this does nothing
---
code/controllers/subsystem/atoms.dm | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index 54adebf5125..a0b2d49d958 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -11,7 +11,6 @@ SUBSYSTEM_DEF(atoms)
var/old_initialized
var/list/late_loaders
- var/list/created_atoms
var/list/BadInitializeCalls = list()
@@ -39,13 +38,11 @@ SUBSYSTEM_DEF(atoms)
var/count
var/list/mapload_arg = list(TRUE)
if(atoms)
- created_atoms = list()
count = atoms.len
for(var/I in atoms)
var/atom/A = I
if(A && !A.initialized)
- if(InitAtom(I, mapload_arg))
- atoms -= I
+ InitAtom(I, mapload_arg)
CHECK_TICK
else
count = 0
@@ -78,10 +75,6 @@ SUBSYSTEM_DEF(atoms)
log_debug(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s")
late_loaders.Cut()
- if(atoms)
- . = created_atoms + atoms
- created_atoms = null
-
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
var/the_type = A.type
if(QDELING(A))
From 9c47fbd00f3834dcbd7996683bf33f81fc1d5a8b Mon Sep 17 00:00:00 2001
From: ParadiseSS13-Bot
Date: Sun, 21 Oct 2018 00:03:49 +0000
Subject: [PATCH 14/37] Automatic changelog compile, [ci skip]
---
html/changelog.html | 32 +++++++++++++++++++++++
html/changelogs/.all_changelog.yml | 18 +++++++++++++
html/changelogs/AutoChangeLog-pr-9562.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9719.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9839.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9842.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9895.yml | 5 ----
html/changelogs/AutoChangeLog-pr-9913.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9914.yml | 4 ---
html/changelogs/AutoChangeLog-pr-9920.yml | 4 ---
10 files changed, 50 insertions(+), 33 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-9562.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9719.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9839.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9842.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9895.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9913.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9914.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9920.yml
diff --git a/html/changelog.html b/html/changelog.html
index 38a71165fc0..a031279a516 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,38 @@
-->
+
21 October 2018
+
Alonefromhell updated:
+
+
Fixed some formatting issues in post_equip.
+
+
Desolate updated:
+
+
Refactors some reagent lists into global list
+
+
Farie82 updated:
+
+
Cyborgs can now refill welding tools and fire extinguishers using the recharging station
+
+
Purpose updated:
+
+
Moves Icon Smoothing to a Subsystem.
+
+
Triiodine updated:
+
+
Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette.
+
TG & BS12 sec-hardsuits in all dmis
+
+
Warior4356 updated:
+
+
Final UI update was missed in Safe Refactor PR
+
+
variableundefined updated:
+
+
Improves the List free slots admin verb to show useful information.
+
Cyborg hypospray's attack log message should no longer be reversed.
+
+
20 October 2018
Birdtalon updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 614b31a3e41..9ed825ec06e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -7601,3 +7601,21 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: It is no longer possible to duplicate uvents.
variableundefined:
- tweak: Plating's icon is back to the old one once again.
+2018-10-21:
+ Alonefromhell:
+ - spellcheck: Fixed some formatting issues in post_equip.
+ Desolate:
+ - tweak: Refactors some reagent lists into global list
+ Farie82:
+ - tweak: Cyborgs can now refill welding tools and fire extinguishers using the recharging
+ station
+ Purpose:
+ - tweak: Moves Icon Smoothing to a Subsystem.
+ Triiodine:
+ - tweak: Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette.
+ - rscdel: TG & BS12 sec-hardsuits in all dmis
+ Warior4356:
+ - bugfix: Final UI update was missed in Safe Refactor PR
+ variableundefined:
+ - tweak: Improves the List free slots admin verb to show useful information.
+ - bugfix: Cyborg hypospray's attack log message should no longer be reversed.
diff --git a/html/changelogs/AutoChangeLog-pr-9562.yml b/html/changelogs/AutoChangeLog-pr-9562.yml
deleted file mode 100644
index 033e5c7b202..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9562.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Desolate"
-delete-after: True
-changes:
- - tweak: "Refactors some reagent lists into global list"
diff --git a/html/changelogs/AutoChangeLog-pr-9719.yml b/html/changelogs/AutoChangeLog-pr-9719.yml
deleted file mode 100644
index b18f8874b49..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9719.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Purpose"
-delete-after: True
-changes:
- - tweak: "Moves Icon Smoothing to a Subsystem."
diff --git a/html/changelogs/AutoChangeLog-pr-9839.yml b/html/changelogs/AutoChangeLog-pr-9839.yml
deleted file mode 100644
index 40a0ca087a9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9839.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "variableundefined"
-delete-after: True
-changes:
- - bugfix: "Cyborg hypospray's attack log message should no longer be reversed."
diff --git a/html/changelogs/AutoChangeLog-pr-9842.yml b/html/changelogs/AutoChangeLog-pr-9842.yml
deleted file mode 100644
index d1c2b499e6e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9842.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "variableundefined"
-delete-after: True
-changes:
- - tweak: "Improves the List free slots admin verb to show useful information."
diff --git a/html/changelogs/AutoChangeLog-pr-9895.yml b/html/changelogs/AutoChangeLog-pr-9895.yml
deleted file mode 100644
index 19ad1fe31bf..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9895.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Triiodine"
-delete-after: True
-changes:
- - tweak: "Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette."
- - rscdel: "TG & BS12 sec-hardsuits in all dmis"
diff --git a/html/changelogs/AutoChangeLog-pr-9913.yml b/html/changelogs/AutoChangeLog-pr-9913.yml
deleted file mode 100644
index 70bbf5ca3df..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9913.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Farie82"
-delete-after: True
-changes:
- - tweak: "Cyborgs can now refill welding tools and fire extinguishers using the recharging station"
diff --git a/html/changelogs/AutoChangeLog-pr-9914.yml b/html/changelogs/AutoChangeLog-pr-9914.yml
deleted file mode 100644
index 2f3a7f7ba9e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9914.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Warior4356"
-delete-after: True
-changes:
- - bugfix: "Final UI update was missed in Safe Refactor PR"
diff --git a/html/changelogs/AutoChangeLog-pr-9920.yml b/html/changelogs/AutoChangeLog-pr-9920.yml
deleted file mode 100644
index 26e1d62557a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-9920.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Alonefromhell"
-delete-after: True
-changes:
- - spellcheck: "Fixed some formatting issues in post_equip."
From df6bee335b5fad0168ac405d39521b085e5817ae Mon Sep 17 00:00:00 2001
From: Squirgenheimer
Date: Sat, 20 Oct 2018 21:07:37 -0400
Subject: [PATCH 15/37] Various guardian_bomb fixes -they will now respect
opacity and direction of the atom they are disguised as -they will no longer
be triggered by objs and will instead trigger on the mob correctly -automatic
disarming now uses timer ss so no more deletion of the contained obj after
already being triggered -replaces loc assignments with forceMove
---
.../miniantags/guardian/types/bomb.dm | 22 +++++++++++--------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
index 0503806b196..0484ade1142 100644
--- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
@@ -37,32 +37,36 @@
/obj/item/guardian_bomb/proc/disguise(var/obj/A)
A.forceMove(src)
stored_obj = A
+ opacity = A.opacity
anchored = A.anchored
density = A.density
appearance = A.appearance
- spawn(600)
- if(src)
- stored_obj.loc = get_turf(loc)
- if(spawner)
- to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.")
- qdel(src)
+ dir = A.dir
+ addtimer(CALLBACK(src, .proc/disable), 600)
+
+/obj/item/guardian_bomb/proc/disable()
+ stored_obj.forceMove(get_turf(src))
+ to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.")
+ qdel(src)
/obj/item/guardian_bomb/proc/detonate(var/mob/living/user)
+ if(!istype(user))
+ return
to_chat(user, "The [src] was boobytrapped!")
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(user == G.summoner)
to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.")
- stored_obj.loc = get_turf(loc)
+ stored_obj.forceMove(get_turf(loc))
qdel(src)
return
to_chat(spawner, "Success! Your trap on [src] caught [user]!")
- stored_obj.loc = get_turf(loc)
+ stored_obj.forceMove(get_turf(loc))
playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1)
user.ex_act(2)
qdel(src)
-/obj/item/guardian_bomb/attackby(mob/living/user)
+/obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user)
detonate(user)
return
From 3bd73279e73ecb8d52890504d7af8ca18b8bef2d Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Sun, 21 Oct 2018 09:10:50 +0800
Subject: [PATCH 16/37] No more bitshift
---
code/__DEFINES/reagents.dm | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index cf76a42e926..e2dd3ee3ac7 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -5,14 +5,14 @@
#define REAGENT_OVERDOSE_EFFECT 1
#define REAGENT_OVERDOSE_FLAGS 2
// container_type defines
-#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes.
-#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes.
+#define INJECTABLE 1 // Makes it possible to add reagents through droppers and syringes.
+#define DRAWABLE 2 // Makes it possible to remove reagents through syringes.
-#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container.
-#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container.
+#define REFILLABLE 4 // Makes it possible to add reagents through any reagent container.
+#define DRAINABLE 8 // Makes it possible to remove reagents through any reagent container.
-#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off.
-#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible.
+#define TRANSPARENT 16 // Used on containers which you want to be able to see the reagents off.
+#define AMOUNT_VISIBLE 32 // For non-transparent containers that still have the general amount of reagents in them visible.
// Is an open container for all intents and purposes.
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
From 491633048740d9b16f44350bfb45c1980bdb430f Mon Sep 17 00:00:00 2001
From: tigercat2000
Date: Sat, 20 Oct 2018 18:22:09 -0700
Subject: [PATCH 17/37] Making the jump to 512 time bois
---
.travis.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 1ee02d4bbee..e25b3495f45 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,8 +18,8 @@ addons:
env:
global:
- - BYOND_MAJOR="511"
- - BYOND_MINOR="1385"
+ - BYOND_MAJOR="512"
+ - BYOND_MINOR="1454"
- BYOND_MACRO_COUNT=4
matrix:
- DM_MAPFILE="cyberiad"
From 4bbe0a3f223c32113dce00933f1a6aa8a5d44f11 Mon Sep 17 00:00:00 2001
From: Squirgenheimer
Date: Sat, 20 Oct 2018 21:22:50 -0400
Subject: [PATCH 18/37] removes trailing returns
---
code/game/gamemodes/miniantags/guardian/types/bomb.dm | 2 --
1 file changed, 2 deletions(-)
diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
index 0484ade1142..f8c3898ed9c 100644
--- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
@@ -68,11 +68,9 @@
/obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user)
detonate(user)
- return
/obj/item/guardian_bomb/pickup(mob/living/user)
detonate(user)
- return
/obj/item/guardian_bomb/examine(mob/user)
stored_obj.examine(user)
From 242d832b2ef525f428dcdb8d26e71ee4fcc15462 Mon Sep 17 00:00:00 2001
From: ParadiseSS13-Bot
Date: Sat, 20 Oct 2018 21:34:59 -0400
Subject: [PATCH 19/37] Automatic changelog generation for PR #9538 [ci skip]
---
html/changelogs/AutoChangeLog-pr-9538.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-9538.yml
diff --git a/html/changelogs/AutoChangeLog-pr-9538.yml b/html/changelogs/AutoChangeLog-pr-9538.yml
new file mode 100644
index 00000000000..ea466004eee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9538.yml
@@ -0,0 +1,4 @@
+author: "variableundefined"
+delete-after: True
+changes:
+ - tweak: "How containers work is now standardized in the back-end. There might be unexpected or odd bugs with containers and reagent transfer, please report them."
From 5d4ada3ff209447dbef8b3ede08f5e20b3e02fa1 Mon Sep 17 00:00:00 2001
From: Squirgenheimer
Date: Sat, 20 Oct 2018 21:38:33 -0400
Subject: [PATCH 20/37] adds another sanity check
---
code/game/gamemodes/miniantags/guardian/types/bomb.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
index f8c3898ed9c..23f922687a2 100644
--- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm
@@ -46,7 +46,8 @@
/obj/item/guardian_bomb/proc/disable()
stored_obj.forceMove(get_turf(src))
- to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.")
+ if(spawner)
+ to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.")
qdel(src)
/obj/item/guardian_bomb/proc/detonate(var/mob/living/user)
From 2771c17a0c69ba09b811e12d57ef8b636713fd4d Mon Sep 17 00:00:00 2001
From: variableundefined <40092670+variableundefined@users.noreply.github.com>
Date: Sun, 21 Oct 2018 09:45:41 +0800
Subject: [PATCH 21/37] Fixes inconsistent comment and no name on revenant
prompt
---
code/game/gamemodes/miniantags/revenant/revenant.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 16b39ab9911..b85a908c6a2 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -120,7 +120,7 @@
updateallghostimages()
remove_from_all_data_huds()
- addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 10 seconds to put in a ghost (Or wait 10 seconds before giving it objectives)
+ addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 15 seconds to put in a ghost (Or wait 15 seconds before giving it objectives)
/mob/living/simple_animal/revenant/proc/firstSetupAttempt()
@@ -136,7 +136,7 @@
giveObjectivesandGoals()
giveSpells()
else
- var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [real_name]?", poll_time = 15 SECONDS)
+ var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a revenant?", poll_time = 15 SECONDS)
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
From 91ee86afac4dbf90d1a66db988c4727086bbd830 Mon Sep 17 00:00:00 2001
From: ParadiseSS13-Bot
Date: Sat, 20 Oct 2018 21:51:18 -0400
Subject: [PATCH 22/37] Automatic changelog generation for PR #9924 [ci skip]
---
html/changelogs/AutoChangeLog-pr-9924.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-9924.yml
diff --git a/html/changelogs/AutoChangeLog-pr-9924.yml b/html/changelogs/AutoChangeLog-pr-9924.yml
new file mode 100644
index 00000000000..19250259388
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9924.yml
@@ -0,0 +1,4 @@
+author: "Squirgenheimer"
+delete-after: True
+changes:
+ - bugfix: "Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs"
From c387fafabe0cbd0e682a5d74469d1e9c769c9c34 Mon Sep 17 00:00:00 2001
From: ParadiseSS13-Bot
Date: Sat, 20 Oct 2018 22:44:21 -0400
Subject: [PATCH 23/37] Automatic changelog generation for PR #9837 [ci skip]
---
html/changelogs/AutoChangeLog-pr-9837.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-9837.yml
diff --git a/html/changelogs/AutoChangeLog-pr-9837.yml b/html/changelogs/AutoChangeLog-pr-9837.yml
new file mode 100644
index 00000000000..2925eaa4cbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9837.yml
@@ -0,0 +1,4 @@
+author: "variableundefined"
+delete-after: True
+changes:
+ - tweak: "Minor refactor of revenant code."
From ffbb77b3bf1b02bcbb324fc8128b22eb41353132 Mon Sep 17 00:00:00 2001
From: ParadiseSS13-Bot
Date: Sun, 21 Oct 2018 03:15:46 +0000
Subject: [PATCH 24/37] Automatic changelog compile, [ci skip]
---
html/changelog.html | 6 ++++++
html/changelogs/.all_changelog.yml | 6 ++++++
html/changelogs/AutoChangeLog-pr-9538.yml | 4 ----
html/changelogs/AutoChangeLog-pr-9837.yml | 4 ----
html/changelogs/AutoChangeLog-pr-9924.yml | 4 ----
5 files changed, 12 insertions(+), 12 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-9538.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9837.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-9924.yml
diff --git a/html/changelog.html b/html/changelog.html
index a031279a516..2f30b3a61c2 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -73,6 +73,10 @@
Moves Icon Smoothing to a Subsystem.
+
Squirgenheimer updated:
+
+
Explosive holoparasite booby traps will now behave better, such as correctly triggering on mobs
+
Triiodine updated:
Skrell & Tajaran sechardsuit to paracode palette, from Bay12 palette.
@@ -86,6 +90,8 @@
Improves the List free slots admin verb to show useful information.
Cyborg hypospray's attack log message should no longer be reversed.
+
How containers work is now standardized in the back-end. There might be unexpected or odd bugs with containers and reagent transfer, please report them.