[user] inputs an intense cheat code!",\
@@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
say("CODE ACTIVATED: EXTRA PRIZES.")
prizes *= 2
for(var/i in 1 to prizes)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
+ user.add_mood_event("arcade", /datum/mood_event/arcade)
if(prob(0.0001)) //1 in a million
new /obj/item/gun/energy/pulse/prize(src)
visible_message(span_notice("[src] dispenses.. woah, a gun! Way past cool."), span_notice("You hear a chime and a shot."))
@@ -555,7 +555,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
new /obj/effect/spawner/newbomb/plasma(loc, /obj/item/assembly/timer)
new /obj/item/clothing/head/collectable/petehat(loc)
message_admins("[ADMIN_LOOKUPFLW(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
+ usr.log_message("outbombed Cuban Pete and has been awarded a bomb.", LOG_GAME)
Reset()
obj_flags &= ~EMAGGED
xp_gained += 100
@@ -647,31 +647,39 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
icon_state = "arcade"
circuit = /obj/item/circuitboard/computer/arcade/amputation
+/obj/machinery/computer/arcade/amputation/attack_tk(mob/user)
+ return //that's a pretty damn big guillotine
+
/obj/machinery/computer/arcade/amputation/attack_hand(mob/user, list/modifiers)
. = ..()
if(!iscarbon(user))
return
- var/mob/living/carbon/c_user = user
- if(!c_user.get_bodypart(BODY_ZONE_L_ARM) && !c_user.get_bodypart(BODY_ZONE_R_ARM))
- return
- to_chat(c_user, span_warning("You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it..."))
- usr.played_game()
- if(do_after(c_user, 50, target = src))
- to_chat(c_user, span_userdanger("The guillotine drops on your arm, and the machine sucks it in!"))
- playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
- var/which_hand = BODY_ZONE_L_ARM
- if(!(c_user.active_hand_index % 2))
- which_hand = BODY_ZONE_R_ARM
- var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand)
+ to_chat(user, span_warning("You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it..."))
+ user.played_game()
+ var/obj/item/bodypart/chopchop = user.get_active_hand()
+ if(do_after(user, 5 SECONDS, target = src, extra_checks = CALLBACK(src, .proc/do_they_still_have_that_hand, user, chopchop)))
+ playsound(src, 'sound/weapons/slice.ogg', 25, TRUE, -1)
+ to_chat(user, span_userdanger("The guillotine drops on your arm, and the machine sucks it in!"))
chopchop.dismember()
qdel(chopchop)
user.mind?.adjust_experience(/datum/skill/gaming, 100)
user.won_game()
- playsound(loc, 'sound/arcade/win.ogg', 50, TRUE)
+ playsound(src, 'sound/arcade/win.ogg', 50, TRUE)
prizevend(user, rand(3,5))
+ return
+ else if(!do_they_still_have_that_hand(user, chopchop))
+ to_chat(user, span_warning("The guillotine drops, but your hand seems to be gone already!"))
+ playsound(src, 'sound/weapons/slice.ogg', 25, TRUE, -1)
else
- to_chat(c_user, span_notice("You (wisely) decide against putting your hand in the machine."))
- user.lost_game()
+ to_chat(user, span_notice("You (wisely) decide against putting your hand in the machine."))
+ user.lost_game()
+
+///Makes sure the user still has their starting hand.
+/obj/machinery/computer/arcade/amputation/proc/do_they_still_have_that_hand(mob/user, obj/item/bodypart/chopchop)
+ if(QDELETED(chopchop) || chopchop.owner != user) //No pulling your arm out of the machine!
+ return FALSE
+ return TRUE
+
/obj/machinery/computer/arcade/amputation/festive //dispenses wrapped gifts instead of arcade prizes, also known as the ancap christmas tree
name = "Mediborg's Festive Amputation Adventure"
diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm
index a457500470aca..ba0cc0a400c16 100644
--- a/code/game/machinery/computer/arcade/orion.dm
+++ b/code/game/machinery/computer/arcade/orion.dm
@@ -375,6 +375,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events())
to_chat(gamer, span_userdanger("You're never going to make it to Orion..."))
gamer.death()
obj_flags &= ~EMAGGED //removes the emagged status after you lose
+ gamer.log_message("lost a Realism Mode Orion Trail game, changing the machine back to normal.", LOG_GAME)
gameStatus = ORION_STATUS_START
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
@@ -481,7 +482,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events())
if(obj_flags & EMAGGED)
new /obj/item/orion_ship(loc)
message_admins("[ADMIN_LOOKUPFLW(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
- log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ usr.log_message("made it to Orion on an emagged machine and got an explosive toy ship.", LOG_GAME)
else
prizevend(user)
obj_flags &= ~EMAGGED
@@ -492,6 +493,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events())
if(obj_flags & EMAGGED)
return
to_chat(user, span_notice("You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode."))
+ user.log_message("emagged [src], activating Realism Mode.", LOG_GAME)
name = "The Orion Trail: Realism Edition"
desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
newgame()
diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm
index a374362775587..a21f3f6a241ab 100644
--- a/code/game/machinery/computer/arena.dm
+++ b/code/game/machinery/computer/arena.dm
@@ -311,7 +311,7 @@
var/arena_turfs = get_arena_turfs()
for(var/mob/living/L in GLOB.mob_living_list)
if(L.stat != DEAD && (get_turf(L) in arena_turfs))
- var/obj/item/reagent_containers/food/drinks/trophy/gold_cup/G = new(get_turf(L))
+ var/obj/item/reagent_containers/cup/glass/trophy/gold_cup/G = new(get_turf(L))
G.name = "[L.real_name]'s Trophy"
/obj/machinery/computer/arena/ui_interact(mob/user)
diff --git a/code/game/machinery/computer/atmos_computers/meters.dm b/code/game/machinery/computer/atmos_computers/meters.dm
index 59100c9478dfd..226335fcbcf83 100644
--- a/code/game/machinery/computer/atmos_computers/meters.dm
+++ b/code/game/machinery/computer/atmos_computers/meters.dm
@@ -5,7 +5,7 @@
var/frequency = FREQ_ATMOS_STORAGE
var/datum/radio_frequency/radio_connection
-/obj/machinery/meter/monitored/Initialize()
+/obj/machinery/meter/monitored/Initialize(mapload)
id_tag = chamber_id + "_sensor"
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
return ..()
@@ -31,7 +31,7 @@
. = ..()
if(!radio_connection)
return
-
+
var/datum/signal/signal = new(list(
"tag" = id_tag,
"device" = "AM",
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 91fbd13809124..4df69acceff5f 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -280,10 +280,10 @@
desc = "Damn, they better have the /tg/ channel on these things."
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment_blank"
- network = list("thunder")
+ network = list()
density = FALSE
circuit = null
- interaction_flags_atom = NONE // interact() is called by BigClick()
+ interaction_flags_atom = INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_NO_FINGERPRINT_INTERACT | INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND | INTERACT_MACHINE_REQUIRES_SIGHT
var/icon_state_off = "entertainment_blank"
var/icon_state_on = "entertainment"
@@ -297,18 +297,73 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai
/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick()
SIGNAL_HANDLER
+ if(!network.len)
+ balloon_alert(usr, "there's nothing on TV!")
+ return
+
INVOKE_ASYNC(src, /atom.proc/interact, usr)
-/obj/machinery/computer/security/telescreen/entertainment/proc/notify(on)
+///Sets the monitor's icon to the selected state, and says an announcement
+/obj/machinery/computer/security/telescreen/entertainment/proc/notify(on, announcement)
if(on && icon_state == icon_state_off)
- say(pick(
- "Feats of bravery live now at the thunderdome!",
- "Two enter, one leaves! Tune in now!",
- "Violence like you've never seen it before!",
- "Spears! Camera! Action! LIVE NOW!"))
icon_state = icon_state_on
else
icon_state = icon_state_off
+ if(announcement)
+ say(announcement)
+
+/// Adds a camera network ID to the entertainment monitor, and turns off the monitor if network list is empty
+/obj/machinery/computer/security/telescreen/entertainment/proc/update_shows(is_show_active, tv_show_id, announcement)
+ if(!network)
+ return
+
+ if(is_show_active)
+ network |= tv_show_id
+ else
+ network -= tv_show_id
+
+ notify(network.len, announcement)
+
+/// A button that adds a camera network to the entertainment monitors
+/obj/machinery/button/showtime
+ name = "thunderdome showtime button"
+ desc = "Use this button to allow entertainment monitors to broadcast the big game."
+ device_type = /obj/item/assembly/control/showtime
+ req_access = list()
+ id = "showtime_1"
+
+/obj/machinery/button/showtime/Initialize(mapload)
+ . = ..()
+ if(device)
+ var/obj/item/assembly/control/showtime/ours = device
+ ours.id = id
+
+/obj/item/assembly/control/showtime
+ name = "showtime controller"
+ desc = "A remote controller for entertainment monitors."
+ /// Stores if the show associated with this controller is active or not
+ var/is_show_active = FALSE
+ /// The camera network id this controller toggles
+ var/tv_network_id = "thunder"
+ /// The display TV show name
+ var/tv_show_name = "Thunderdome"
+ /// List of phrases the entertainment console may say when the show begins
+ var/list/tv_starters = list("Feats of bravery live now at the thunderdome!",
+ "Two enter, one leaves! Tune in now!",
+ "Violence like you've never seen it before!",
+ "Spears! Camera! Action! LIVE NOW!")
+ /// List of phrases the entertainment console may say when the show ends
+ var/list/tv_enders = list("Thank you for tuning in to the slaughter!",
+ "What a show! And we guarantee next one will be bigger!",
+ "Celebrate the results with Thundermerch!",
+ "This show was brought to you by Nanotrasen.")
+
+/obj/item/assembly/control/showtime/activate()
+ is_show_active = !is_show_active
+ say("The [tv_show_name] show has [is_show_active ? "begun" : "ended"]")
+ var/announcement = is_show_active ? pick(tv_starters) : pick(tv_enders)
+ for(var/obj/machinery/computer/security/telescreen/entertainment/tv in GLOB.machines)
+ tv.update_shows(is_show_active, tv_network_id, announcement)
/obj/machinery/computer/security/telescreen/rd
name = "\improper Research Director's telescreen"
diff --git a/code/game/machinery/computer/chef_orders/order_datum.dm b/code/game/machinery/computer/chef_orders/order_datum.dm
index 4205201840cfb..0379eecd68585 100644
--- a/code/game/machinery/computer/chef_orders/order_datum.dm
+++ b/code/game/machinery/computer/chef_orders/order_datum.dm
@@ -125,25 +125,25 @@
/datum/orderable_item/milk
name = "Milk"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/milk
+ item_instance = /obj/item/reagent_containers/condiment/milk
cost_per_order = 30
/datum/orderable_item/soymilk
name = "Soy Milk"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/soymilk
+ item_instance = /obj/item/reagent_containers/condiment/soymilk
cost_per_order = 30
/datum/orderable_item/cream
name = "Cream"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/drinks/bottle/cream
+ item_instance = /obj/item/reagent_containers/cup/glass/bottle/juice/cream
cost_per_order = 40
/datum/orderable_item/yoghurt
name = "Yoghurt"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/yoghurt
+ item_instance = /obj/item/reagent_containers/condiment/yoghurt
cost_per_order = 40
/datum/orderable_item/eggs
@@ -226,7 +226,7 @@
/datum/orderable_item/tiziran_cans
name = "Tiziran Canned Goods Pack"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/storage/box/tiziran_goods
+ item_instance = /obj/item/storage/box/tiziran_cans
cost_per_order = 120
/datum/orderable_item/tiziran_meats
@@ -252,71 +252,71 @@
/datum/orderable_item/flour
name = "Flour Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/flour
+ item_instance = /obj/item/reagent_containers/condiment/flour
cost_per_order = 30
/datum/orderable_item/sugar
name = "Sugar Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/sugar
+ item_instance = /obj/item/reagent_containers/condiment/sugar
cost_per_order = 30
/datum/orderable_item/rice
name = "Rice Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/rice
+ item_instance = /obj/item/reagent_containers/condiment/rice
cost_per_order = 30
/datum/orderable_item/cornmeal
name = "Cornmeal Box"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/cornmeal
+ item_instance = /obj/item/reagent_containers/condiment/cornmeal
cost_per_order = 30
/datum/orderable_item/enzyme
name = "Universal Enzyme"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/enzyme
+ item_instance = /obj/item/reagent_containers/condiment/enzyme
cost_per_order = 40
/datum/orderable_item/salt
name = "Salt Shaker"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/saltshaker
+ item_instance = /obj/item/reagent_containers/condiment/saltshaker
cost_per_order = 15
/datum/orderable_item/pepper
name = "Pepper Mill"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/peppermill
+ item_instance = /obj/item/reagent_containers/condiment/peppermill
cost_per_order = 15
/datum/orderable_item/soysauce
name = "Soy Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/soysauce
+ item_instance = /obj/item/reagent_containers/condiment/soysauce
cost_per_order = 15
/datum/orderable_item/bbqsauce
name = "BBQ Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/bbqsauce
+ item_instance = /obj/item/reagent_containers/condiment/bbqsauce
cost_per_order = 60
/datum/orderable_item/vinegar
name = "Vinegar"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/vinegar
+ item_instance = /obj/item/reagent_containers/condiment/vinegar
cost_per_order = 30
/datum/orderable_item/quality_oil
name = "Quality Oil"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/quality_oil
+ item_instance = /obj/item/reagent_containers/condiment/quality_oil
cost_per_order = 50 //Extra Virgin, just like you, the reader
/datum/orderable_item/peanut_butter
name = "Peanut Butter"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/peanut_butter
+ item_instance = /obj/item/reagent_containers/condiment/peanut_butter
cost_per_order = 30
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index f4d600e3caf22..94c3e3cdd6132 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -110,7 +110,7 @@
return authenticated
/obj/machinery/computer/communications/attackby(obj/I, mob/user, params)
- if(istype(I, /obj/item/card/id))
+ if(isidcard(I))
attack_hand(user)
else
return ..()
@@ -209,7 +209,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
// Only notify people if an actual change happened
- log_game("[key_name(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].")
+ usr.log_message("changed the security level to [params["newSecurityLevel"]] with [src].", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].")
deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type=DEADCHAT_ANNOUNCEMENT)
@@ -329,7 +329,7 @@
var/destination = params["destination"]
- log_game("[key_name(usr)] is about to send the following message to [destination]: [message]")
+ usr.log_message("is about to send the following message to [destination]: [message]", LOG_GAME)
to_chat(
GLOB.admins,
span_adminnotice( \
@@ -404,12 +404,12 @@
return
if (GLOB.emergency_access)
revoke_maint_all_access()
- log_game("[key_name(usr)] disabled emergency maintenance access.")
+ usr.log_message("disabled emergency maintenance access.", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.")
deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
else
make_maint_all_access()
- log_game("[key_name(usr)] enabled emergency maintenance access.")
+ usr.log_message("enabled emergency maintenance access.", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.")
deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
// Request codes for the Captain's Spare ID safe.
@@ -520,7 +520,7 @@
data["alertLevel"] = SSsecurity_level.get_current_level_as_text()
data["authorizeName"] = authorize_name
data["canLogOut"] = !issilicon(user)
- data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user)
+ data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac()
if(syndicate)
data["shuttleCanEvacOrFailReason"] = "You cannot summon the shuttle from this console!"
@@ -618,7 +618,7 @@
/obj/machinery/computer/communications/Topic(href, href_list)
if (href_list["reject_cross_comms_message"])
if (!usr.client?.holder)
- log_game("[key_name(usr)] tried to reject a cross-comms message without being an admin.")
+ usr.log_message("tried to reject a cross-comms message without being an admin.", LOG_ADMIN)
message_admins("[key_name(usr)] tried to reject a cross-comms message without being an admin.")
return
@@ -827,7 +827,7 @@
switch(picked_option)
if(HACK_PIRATE) // Triggers pirates, which the crew may be able to pay off to prevent
priority_announce(
- "Attention crew, it appears that someone on your station has made unexpected communication with a Syndicate ship in nearby space.",
+ "Attention crew: sector monitoring reports a massive jump-trace from an enemy vessel destined for your system. Prepare for imminent hostile contact.",
"[command_name()] High-Priority Update",
)
@@ -838,7 +838,7 @@
if(HACK_FUGITIVES) // Triggers fugitives, which can cause confusion / chaos as the crew decides which side help
priority_announce(
- "Attention crew, it appears that someone on your station has made unexpected communication with an unmarked ship in nearby space.",
+ "Attention crew: sector monitoring reports a jump-trace from an unidentified vessel destined for your system. Prepare for probable contact.",
"[command_name()] High-Priority Update",
)
@@ -849,7 +849,7 @@
if(HACK_THREAT) // Force an unfavorable situation on the crew
priority_announce(
- SSmapping.config.orbit_shift_replacement,
+ "Attention crew, the Nanotrasen Department of Intelligence has received intel suggesting increased enemy activity in your sector beyond that initially reported in today's threat advisory.",
"[command_name()] High-Priority Update",
)
@@ -862,7 +862,7 @@
dynamic.unfavorable_situation()
if(HACK_SLEEPER) // Trigger one or multiple sleeper agents with the crew (or for latejoining crew)
- var/datum/dynamic_ruleset/midround/sleeper_agent_type = /datum/dynamic_ruleset/midround/autotraitor
+ var/datum/dynamic_ruleset/midround/sleeper_agent_type = /datum/dynamic_ruleset/midround/from_living/autotraitor
var/datum/game_mode/dynamic/dynamic = SSticker.mode
var/max_number_of_sleepers = clamp(round(length(GLOB.alive_player_list) / 20), 1, 3)
var/num_agents_created = 0
@@ -878,7 +878,7 @@
else
// We spawned some sleeper agents, nice - give them a report to kickstart the paranoia
priority_announce(
- "Attention crew, it appears that someone on your station has hijacked your telecommunications, broadcasting a Syndicate radio signal to your fellow employees.",
+ "Attention crew, it appears that someone on your station has hijacked your telecommunications and broadcasted an unknown signal.",
"[command_name()] High-Priority Update",
)
diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm
index 32f60992ee8df..4023192c90c29 100644
--- a/code/game/machinery/computer/launchpad_control.dm
+++ b/code/game/machinery/computer/launchpad_control.dm
@@ -13,99 +13,46 @@
launchpads = list()
. = ..()
AddComponent(/datum/component/usb_port, list(
- /obj/item/circuit_component/bluespace_launchpad,
+ /obj/item/circuit_component/bluespace_launchpad/console,
))
-/obj/item/circuit_component/bluespace_launchpad
+/obj/item/circuit_component/bluespace_launchpad/console
display_name = "Bluespace Launchpad Console"
desc = "Teleports anything to and from any location on the station. Doesn't use actual GPS coordinates, but rather offsets from the launchpad itself. Can only go as far as the launchpad can go, which depends on its parts."
var/datum/port/input/launchpad_id
- var/datum/port/input/x_pos
- var/datum/port/input/y_pos
- var/datum/port/input/send_trigger
- var/datum/port/input/retrieve_trigger
-
- var/datum/port/output/sent
- var/datum/port/output/retrieved
- var/datum/port/output/on_fail
- var/datum/port/output/why_fail
var/obj/machinery/computer/launchpad/attached_console
-/obj/item/circuit_component/bluespace_launchpad/get_ui_notices()
- . = ..()
- var/current_launchpad = launchpad_id.value
- if(isnull(current_launchpad))
- return
-
- var/obj/machinery/launchpad/the_pad = attached_console.launchpads[current_launchpad]
- if(isnull(the_pad))
- return
-
- . += create_ui_notice("Minimum Range: [-the_pad.range]", "orange", "minus")
- . += create_ui_notice("Maximum Range: [the_pad.range]", "orange", "plus")
-
-/obj/item/circuit_component/bluespace_launchpad/populate_ports()
+/obj/item/circuit_component/bluespace_launchpad/console/populate_ports()
launchpad_id = add_input_port("Launchpad ID", PORT_TYPE_NUMBER, trigger = null, default = 1)
- x_pos = add_input_port("X offset", PORT_TYPE_NUMBER)
- y_pos = add_input_port("Y offset", PORT_TYPE_NUMBER)
- send_trigger = add_input_port("Send", PORT_TYPE_SIGNAL)
- retrieve_trigger = add_input_port("Retrieve", PORT_TYPE_SIGNAL)
-
- sent = add_output_port("Sent", PORT_TYPE_SIGNAL)
- retrieved = add_output_port("Retrieved", PORT_TYPE_SIGNAL)
- why_fail = add_output_port("Fail reason", PORT_TYPE_STRING)
- on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL)
+ ..()
-/obj/item/circuit_component/bluespace_launchpad/register_usb_parent(atom/movable/shell)
+/obj/item/circuit_component/bluespace_launchpad/console/register_usb_parent(atom/movable/shell)
. = ..()
if(istype(shell, /obj/machinery/computer/launchpad))
attached_console = shell
-/obj/item/circuit_component/bluespace_launchpad/unregister_usb_parent(atom/movable/shell)
+/obj/item/circuit_component/bluespace_launchpad/console/unregister_usb_parent(atom/movable/shell)
attached_console = null
return ..()
-/obj/item/circuit_component/bluespace_launchpad/input_received(datum/port/input/port)
+/obj/item/circuit_component/bluespace_launchpad/console/input_received(datum/port/input/port)
if(!attached_console || length(attached_console.launchpads) == 0)
why_fail.set_output("No launchpads connected!")
on_fail.set_output(COMPONENT_SIGNAL)
return
-
if(!launchpad_id.value)
return
- var/obj/machinery/launchpad/the_pad = KEYBYINDEX(attached_console.launchpads, launchpad_id.value)
- if(isnull(the_pad))
- why_fail.set_output("Invalid launchpad selected!")
- on_fail.set_output(COMPONENT_SIGNAL)
- return
-
- the_pad.set_offset(x_pos.value, y_pos.value)
-
- if(COMPONENT_TRIGGERED_BY(port, x_pos))
- x_pos.set_value(the_pad.x_offset)
- return
-
- if(COMPONENT_TRIGGERED_BY(port, y_pos))
- y_pos.set_value(the_pad.y_offset)
- return
+ attached_launchpad = KEYBYINDEX(attached_console.launchpads, launchpad_id.value)
- var/checks = attached_console.teleport_checks(the_pad)
- if(!isnull(checks))
- why_fail.set_output(checks)
+ if(isnull(attached_launchpad))
+ why_fail.set_output("Invalid launchpad selected!")
on_fail.set_output(COMPONENT_SIGNAL)
return
-
- if(COMPONENT_TRIGGERED_BY(send_trigger, port))
- INVOKE_ASYNC(the_pad, /obj/machinery/launchpad.proc/doteleport, null, TRUE, parent.get_creator())
- sent.set_output(COMPONENT_SIGNAL)
-
- if(COMPONENT_TRIGGERED_BY(retrieve_trigger, port))
- INVOKE_ASYNC(the_pad, /obj/machinery/launchpad.proc/doteleport, null, FALSE, parent.get_creator())
- retrieved.set_output(COMPONENT_SIGNAL)
+ ..()
/obj/machinery/computer/launchpad/attack_paw(mob/user, list/modifiers)
to_chat(user, span_warning("You are too primitive to use this computer!"))
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 399bae3a6341d..2776ecf6effd2 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -511,26 +511,27 @@
GLOB.data_core.medicalPrintCount++
playsound(loc, 'sound/items/poster_being_created.ogg', 100, TRUE)
sleep(30)
- var/obj/item/paper/P = new /obj/item/paper( loc )
- P.info = "Medical Record - (MR-[GLOB.data_core.medicalPrintCount])
"
+ var/obj/item/paper/printed_paper = new /obj/item/paper(loc)
+ var/final_paper_text = "Medical Record - (MR-[GLOB.data_core.medicalPrintCount])
"
if(active1 in GLOB.data_core.general)
- P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"])
- P.info += "\nSpecies: [active1.fields["species"]]
"
- P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
+ final_paper_text += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"])
+ final_paper_text += "\nSpecies: [active1.fields["species"]]
"
+ final_paper_text += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
else
- P.info += "General Record Lost!
"
+ final_paper_text += "General Record Lost!
"
if(active2 in GLOB.data_core.medical)
- P.info += text("
\nMedical Data
\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\nComments/Log
", active2.fields["blood_type"], active2.fields["b_dna"], active2.fields["mi_dis"], active2.fields["mi_dis_d"], active2.fields["ma_dis"], active2.fields["ma_dis_d"], active2.fields["alg"], active2.fields["alg_d"], active2.fields["cdi"], active2.fields["cdi_d"], active2.fields["notes"])
+ final_paper_text += text("
\nMedical Data
\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\nComments/Log
", active2.fields["blood_type"], active2.fields["b_dna"], active2.fields["mi_dis"], active2.fields["mi_dis_d"], active2.fields["ma_dis"], active2.fields["ma_dis_d"], active2.fields["alg"], active2.fields["alg_d"], active2.fields["cdi"], active2.fields["cdi_d"], active2.fields["notes"])
var/counter = 1
while(active2.fields[text("com_[]", counter)])
- P.info += text("[]
", active2.fields[text("com_[]", counter)])
+ final_paper_text += text("[]
", active2.fields[text("com_[]", counter)])
counter++
- P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, active1.fields["name"])
+ printed_paper.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, active1.fields["name"])
else
- P.info += "Medical Record Lost!
"
- P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, "Record Lost")
- P.info += ""
- P.update_appearance()
+ final_paper_text += "Medical Record Lost!
"
+ printed_paper.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, "Record Lost")
+ final_paper_text += ""
+ printed_paper.add_raw_text(final_paper_text)
+ printed_paper.update_appearance()
printing = null
add_fingerprint(usr)
diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
index d7128612dd7de..7199b5bdb1192 100644
--- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm
+++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
@@ -142,7 +142,8 @@
id_goal_not_set = TRUE
contained_id.goal = default_goal
say("[contained_id]'s ID card goal defaulting to [contained_id.goal] points.")
- log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.")
+ user.log_message("teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.", LOG_GAME)
+ prisoner.log_message("teleported to Labor Camp [COORD(beacon)] by [key_name(user)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.", LOG_GAME, log_globally = FALSE)
teleporter.handle_prisoner(contained_id, temporary_record)
playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
prisoner.forceMove(get_turf(beacon))
diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm
index 9b1c0e27a57e7..e1a444d590617 100644
--- a/code/game/machinery/computer/prisoner/management.dm
+++ b/code/game/machinery/computer/prisoner/management.dm
@@ -69,7 +69,7 @@
return
/obj/machinery/computer/prisoner/management/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/card/id))
+ if(isidcard(I))
if(screen)
id_insert(user)
else
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 99b21fd536c56..14bc3569161c2 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -549,49 +549,11 @@ What a mess.*/
if("Print Record")
if(!( printing ))
- printing = 1
- GLOB.data_core.securityPrintCount++
- playsound(loc, 'sound/items/poster_being_created.ogg', 100, TRUE)
+ printing = TRUE
+ playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE)
sleep(30)
- var/obj/item/paper/P = new /obj/item/paper( loc )
- P.info = "Security Record - (SR-[GLOB.data_core.securityPrintCount])
"
- if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))
- P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"])
- P.info += "\nSpecies: [active1.fields["species"]]
"
- P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
- else
- P.info += "General Record Lost!
"
- if((istype(active2, /datum/data/record) && GLOB.data_core.security.Find(active2)))
- P.info += text("
\nSecurity Data
\nCriminal Status: []", active2.fields["criminal"])
-
- P.info += "
\n
\nCrimes:
\n"
- P.info +={"
-
-Crime |
-Details |
-Author |
-Time Added |
-
"}
- for(var/datum/data/crime/c in active2.fields["crim"])
- P.info += "[c.crimeName] | "
- P.info += "[c.crimeDetails] | "
- P.info += "[c.author] | "
- P.info += "[c.time] | "
- P.info += "
"
- P.info += "
"
-
- P.info += text("
\nImportant Notes:
\n\t[]
\n
\nComments/Log
", active2.fields["notes"])
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- P.info += text("[]
", active2.fields[text("com_[]", counter)])
- counter++
- P.name = text("SR-[] '[]'", GLOB.data_core.securityPrintCount, active1.fields["name"])
- else
- P.info += "Security Record Lost!
"
- P.name = text("SR-[] '[]'", GLOB.data_core.securityPrintCount, "Record Lost")
- P.info += ""
- P.update_appearance()
- printing = null
+ print_security_record(active1, active2, loc)
+ printing = FALSE
if("Print Poster")
if(!( printing ))
var/wanted_name = tgui_input_text(usr, "Enter an alias for the criminal", "Print Wanted Poster", active1.fields["name"])
@@ -941,9 +903,11 @@ What a mess.*/
else
message_admins("Warning: possible href exploit by [key_name(usr)] - attempted to set change a crew member rank to an invalid path: [path]")
log_game("Warning: possible href exploit by [key_name(usr)] - attempted to set change a crew member rank to an invalid path: [path]")
+ usr.log_message("possibly trying to href exploit - attempted to set change a crew member rank to an invalid path: [path]", LOG_ADMIN, log_globally = FALSE)
else if(!isnull(text))
message_admins("Warning: possible href exploit by [key_name(usr)] - attempted to set change a crew member rank to an invalid value: [text]")
log_game("Warning: possible href exploit by [key_name(usr)] - attempted to set change a crew member rank to an invalid value: [text]")
+ usr.log_message("possibly trying to href exploit - attempted to set change a crew member rank to an invalid value: [text]", LOG_ADMIN, log_globally = FALSE)
if("Change Criminal Status")
if(active2)
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index a0bb4122023ef..5359aeb167091 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -10,7 +10,7 @@
/obj/machinery/computer/station_alert/Initialize(mapload)
alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z), title = name)
- RegisterSignal(alert_control.listener, list(COMSIG_ALARM_TRIGGERED, COMSIG_ALARM_CLEARED), .proc/update_alarm_display)
+ RegisterSignal(alert_control.listener, list(COMSIG_ALARM_LISTENER_TRIGGERED, COMSIG_ALARM_LISTENER_CLEARED), .proc/update_alarm_display)
return ..()
/obj/machinery/computer/station_alert/Destroy()
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 300fb564d8c8e..9cc3fb4181414 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -188,8 +188,7 @@
if(isnull(desc))
return
set_teleport_target(targets[desc])
- var/turf/target_turf = get_turf(targets[desc])
- log_game("[key_name(user)] has set the teleporter target to [targets[desc]] at [AREACOORD(target_turf)]")
+ user.log_message("set the teleporter target to [targets[desc]].]", LOG_GAME)
else
if (!length(targets))
to_chat(user, span_alert("No active connected stations located."))
@@ -202,7 +201,7 @@
if(!target_station || !target_station.teleporter_hub)
return
var/turf/target_station_turf = get_turf(target_station)
- log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(target_station_turf)]")
+ user.log_message("set the teleporter target to [target_station_turf].", LOG_GAME)
set_teleport_target(target_station.teleporter_hub)
lock_in_station(target_station)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 6fa7295d49efe..aa4027dea354c 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -277,7 +277,7 @@
if(isitem(P) && get_req_components_amt())
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0))
- if(istype(P, /obj/item/stack))
+ if(isstack(P))
var/obj/item/stack/S = P
var/used_amt = min(round(S.get_amount()), req_components[I])
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 6336d2afeaab2..153cf33d76674 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -41,7 +41,7 @@
. = ..()
if(locate(/obj/structure/barricade) in get_turf(mover))
return TRUE
- else if(istype(mover, /obj/projectile))
+ else if(isprojectile(mover))
if(!anchored)
return TRUE
var/obj/projectile/proj = mover
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index d93375c814826..729516ff0318c 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -11,8 +11,8 @@
pass_flags = PASSTABLE
var/static/list/collectable_items = list(/obj/item/trash/waffles,
/obj/item/trash/tray,
- /obj/item/reagent_containers/glass/bowl,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/cup/bowl,
+ /obj/item/reagent_containers/cup/glass/drinkingglass,
/obj/item/kitchen/fork,
/obj/item/shard,
/obj/item/broken_bottle)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 4988d9182b315..e691a0af0d243 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1018,7 +1018,7 @@
welded = !welded
user.visible_message(span_notice("[user] [welded? "welds shut":"unwelds"] [src]."), \
span_notice("You [welded ? "weld the airlock shut":"unweld the airlock"]."))
- log_game("[key_name(user)] [welded ? "welded":"unwelded"] airlock [src] with [tool] at [AREACOORD(src)]")
+ user.log_message("[welded ? "welded":"unwelded"] airlock [src] with [tool].", LOG_GAME)
update_appearance()
/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user)
@@ -1454,7 +1454,7 @@
return
else if(istype(note, /obj/item/paper))
var/obj/item/paper/pinned_paper = note
- if(pinned_paper.info && pinned_paper.show_written_words)
+ if(pinned_paper.get_total_length() && pinned_paper.show_written_words)
return "note_words_[frame_state]"
else
return "note_[frame_state]"
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 355aa4a3d6ac0..53c6849fe8b55 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -15,6 +15,8 @@
var/passed_cycle_id
/// A holder of the electronics, in case of them working as an integrated part
var/holder
+ /// Whether this airlock can have an integrated circuit inside of it or not
+ var/shell = FALSE
/obj/item/electronics/airlock/examine(mob/user)
. = ..()
@@ -47,6 +49,7 @@
data["unres_direction"] = unres_sides
data["passedName"] = passed_name
data["passedCycleId"] = passed_cycle_id
+ data["shell"] = shell
return data
/obj/item/electronics/airlock/ui_act(action, params)
@@ -72,6 +75,9 @@
else
accesses -= access
. = TRUE
+ if("set_shell")
+ shell = !!params["on"]
+ . = TRUE
if("direc_set")
var/unres_direction = text2num(params["unres_direction"])
unres_sides ^= unres_direction //XOR, toggles only the bit that was clicked
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index b37120a22900e..950396dc1a79f 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -518,7 +518,7 @@
/obj/machinery/door/airlock/cult/allowed(mob/living/L)
if(!density)
return TRUE
- if(friendly || IS_CULTIST(L) || istype(L, /mob/living/simple_animal/shade) || isconstruct(L))
+ if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L))
if(!stealthy)
new openingoverlaytype(loc)
return TRUE
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index d8466c87e776e..25c59cb943f0e 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -503,7 +503,7 @@
if(W.use_tool(src, user, DEFAULT_STEP_TIME, volume=50))
welded = !welded
user.visible_message(span_danger("[user] [welded?"welds":"unwelds"] [src]."), span_notice("You [welded ? "weld" : "unweld"] [src]."))
- log_game("[key_name(user)] [welded ? "welded":"unwelded"] firedoor [src] with [W] at [AREACOORD(src)]")
+ user.log_message("[welded ? "welded":"unwelded"] firedoor [src] with [W].", LOG_GAME)
update_appearance()
correct_state()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 111dbc88e8b47..26ebb3e730726 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -61,9 +61,6 @@
AddElement(/datum/element/connect_loc, loc_connections)
AddElement(/datum/element/atmos_sensitive, mapload)
-
-/obj/machinery/door/window/ComponentInitialize()
- . = ..()
AddComponent(/datum/component/ntnet_interface)
/obj/machinery/door/window/Destroy()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 31be707ea873a..2f9d776f6b65b 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -172,6 +172,7 @@
if(user)
user.visible_message(span_warning("Sparks fly out of [src]!"),
span_notice("You override [src], disabling the speaker."))
+ user.log_message("emagged [src].", LOG_ATTACK)
playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
set_status()
@@ -205,7 +206,7 @@
for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors)
firelock.activate(FIRELOCK_ALARM_TYPE_GENERIC)
if(user)
- log_game("[user] triggered a fire alarm at [COORD(src)]")
+ user.log_message("triggered a fire alarm.", LOG_GAME)
soundloop.start() //Manually pulled fire alarms will make the sound, rather than the doors.
SEND_SIGNAL(src, COMSIG_FIREALARM_ON_TRIGGER)
update_use_power(ACTIVE_POWER_USE)
@@ -225,7 +226,7 @@
for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors)
firelock.crack_open()
if(user)
- log_game("[user] reset a fire alarm at [COORD(src)]")
+ user.log_message("reset a fire alarm.", LOG_GAME)
soundloop.stop()
SEND_SIGNAL(src, COMSIG_FIREALARM_ON_RESET)
update_use_power(IDLE_POWER_USE)
@@ -420,7 +421,7 @@
for(var/obj/machinery/firealarm/fire_panel in my_area.firealarms)
fire_panel.update_icon()
to_chat(user, span_notice("You [ my_area.fire_detect ? "enable" : "disable" ] the local firelock thermal sensors!"))
- log_game("[user] has [ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src] at [COORD(src)]")
+ user.log_message("[ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src].", LOG_GAME)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 30fde7ea0eb8e..994aba11b0acb 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -118,7 +118,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26)
continue
if(L.flash_act(affect_silicon = 1))
- L.log_message("was AOE flashed by an automated portable flasher",LOG_ATTACK)
+ L.log_message("was AOE flashed by an automated portable flasher", LOG_ATTACK)
L.Paralyze(strength)
flashed = TRUE
@@ -168,7 +168,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26)
if (last_flash && world.time < last_flash + 150)
return
- if(istype(AM, /mob/living/carbon))
+ if(iscarbon(AM))
var/mob/living/carbon/M = AM
if (M.m_intent != MOVE_INTENT_WALK && anchored)
flash()
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index c56295feed43a..b38f0c81d7479 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -115,7 +115,7 @@
var/turf/T = get_step(src,adir)
if(!T)
continue
- if(istype(T, /turf/closed))
+ if(isclosedturf(T))
continue
target = T
break
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 0978fc8c3f7a6..96b671348497e 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -217,6 +217,22 @@ Possible to do for anyone motivated enough:
default_unfasten_wrench(user, tool)
return TOOL_ACT_TOOLTYPE_SUCCESS
+/obj/machinery/holopad/set_anchored(anchorvalue)
+ . = ..()
+ if(isnull(.) || anchorvalue)
+ return
+
+ if(outgoing_call)
+ outgoing_call.ConnectionFailure(src) //disconnect the call if we got unwrenched.
+
+ for(var/datum/holocall/holocall_to_disconnect as anything in holo_calls)
+ holocall_to_disconnect.ConnectionFailure(src)
+
+ if(replay_mode)
+ replay_stop()
+ if(record_mode)
+ record_stop()
+
/obj/machinery/holopad/attackby(obj/item/P, mob/user, params)
if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P))
return
@@ -565,6 +581,9 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(ringing)
icon_state = "[base_icon_state]_ringing"
return ..()
+ if(panel_open)
+ icon_state = "[base_icon_state]_open"
+ return ..()
icon_state = "[base_icon_state][(total_users || replay_mode) ? 1 : 0]"
return ..()
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index bdf6e1d1ea07a..d67ac57619851 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -149,7 +149,7 @@
victim = null
return
victim.cure_blind("hypnochair")
- REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair")
+ REMOVE_TRAIT(victim, TRAIT_DEAF, HYPNOCHAIR_TRAIT)
if(!(victim.get_eye_protection() > 0))
var/time_diff = world.time - start_time
switch(time_diff)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 0692c51c78832..711b1765e608e 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -27,8 +27,7 @@
///Typecache of containers we accept
var/static/list/drip_containers = typecacheof(list(
/obj/item/reagent_containers/blood,
- /obj/item/reagent_containers/food,
- /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/cup,
/obj/item/reagent_containers/chem_pack,
))
// If the blood draining tab should be greyed out
@@ -317,12 +316,9 @@
inject_only = TRUE
/obj/machinery/iv_drip/saline/Initialize(mapload)
- . = ..()
- reagent_container = new /obj/item/reagent_containers/glass/saline(src)
-
-/obj/machinery/iv_drip/saline/ComponentInitialize()
- . = ..()
AddElement(/datum/element/update_icon_blocker)
+ . = ..()
+ reagent_container = new /obj/item/reagent_containers/cup/saline(src)
/obj/machinery/iv_drip/saline/eject_beaker()
return
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 88871ed632f0f..2fe86a4dee265 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -47,6 +47,11 @@
update_indicator()
+ if(stationary)
+ AddComponent(/datum/component/usb_port, list(
+ /obj/item/circuit_component/bluespace_launchpad,
+ ))
+
/obj/machinery/launchpad/Destroy()
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.remove_atom_from_hud(src)
@@ -107,10 +112,16 @@
/obj/machinery/launchpad/proc/set_offset(x, y)
if(teleporting)
return
- if(!isnull(x))
+ if(!isnull(x) && !isnull(y))
+ x_offset = clamp(x, -range, range)
+ y_offset = clamp(y, -range, range)
+ log_message("changed the launchpad's x and y-offset parameters to X: [x] Y: [y].", LOG_GAME, log_globally = FALSE)
+ else if(!isnull(x))
x_offset = clamp(x, -range, range)
- if(!isnull(y))
+ log_message("changed the launchpad's x-offset parameter to X: [x].", LOG_GAME, log_globally = FALSE)
+ else if(!isnull(y))
y_offset = clamp(y, -range, range)
+ log_message("changed the launchpad's y-offset parameter to Y: [y].", LOG_GAME, log_globally = FALSE)
update_indicator()
/obj/effect/ebeam/launchpad/Initialize(mapload)
@@ -118,6 +129,16 @@
animate(src, alpha = 0, flags = ANIMATION_PARALLEL, time = BEAM_FADE_TIME)
+/obj/machinery/launchpad/proc/teleport_checks()
+ if(!isAvailable())
+ return "ERROR: Launchpad not operative. Make sure the launchpad is ready and powered."
+ if(teleporting)
+ return "ERROR: Launchpad busy."
+ var/turf/pad_turf = get_turf(src)
+ if(pad_turf && is_centcom_level(pad_turf.z))
+ return "ERROR: Launchpad not operative. Heavy area shielding makes teleporting impossible."
+ return null
+
/// Performs the teleport.
/// sending - TRUE/FALSE depending on if the launch pad is teleporting *to* or *from* the target.
/// alternate_log_name - An alternative name to use in logs, if `user` is not present..
@@ -242,7 +263,7 @@
/obj/machinery/launchpad/briefcase/Initialize(mapload, _briefcase)
. = ..()
if(!_briefcase)
- log_game("[src] has been spawned without a briefcase.")
+ stack_trace("[src] spawned without a briefcase.")
return INITIALIZE_HINT_QDEL
briefcase = _briefcase
@@ -370,8 +391,9 @@
if(QDELETED(pad))
to_chat(user, span_warning("ERROR: Launchpad not responding. Check launchpad integrity."))
return
- if(!pad.isAvailable())
- to_chat(user, span_warning("ERROR: Launchpad not operative. Make sure the launchpad is ready and powered."))
+ var/error_reason = pad.teleport_checks()
+ if(error_reason)
+ to_chat(user, span_warning(error_reason))
return
pad.doteleport(user, sending)
@@ -417,3 +439,78 @@
. = TRUE
#undef BEAM_FADE_TIME
+
+/obj/item/circuit_component/bluespace_launchpad
+ display_name = "Bluespace Launchpad"
+ desc = "Teleports anything to and from any location on the station. Doesn't use actual GPS coordinates, but rather offsets from the launchpad itself. Can only go as far as the launchpad can go, which depends on its parts."
+
+ var/datum/port/input/x_pos
+ var/datum/port/input/y_pos
+ var/datum/port/input/send_trigger
+ var/datum/port/input/retrieve_trigger
+
+ var/datum/port/output/sent
+ var/datum/port/output/retrieved
+ var/datum/port/output/on_fail
+ var/datum/port/output/why_fail
+
+ var/obj/machinery/launchpad/attached_launchpad
+
+/obj/item/circuit_component/bluespace_launchpad/get_ui_notices()
+ . = ..()
+
+ if(isnull(attached_launchpad))
+ return
+
+ . += create_ui_notice("Minimum Range: [-attached_launchpad.range]", "orange", "minus")
+ . += create_ui_notice("Maximum Range: [attached_launchpad.range]", "orange", "plus")
+
+/obj/item/circuit_component/bluespace_launchpad/populate_ports()
+ x_pos = add_input_port("X offset", PORT_TYPE_NUMBER)
+ y_pos = add_input_port("Y offset", PORT_TYPE_NUMBER)
+ send_trigger = add_input_port("Send", PORT_TYPE_SIGNAL)
+ retrieve_trigger = add_input_port("Retrieve", PORT_TYPE_SIGNAL)
+
+ sent = add_output_port("Sent", PORT_TYPE_SIGNAL)
+ retrieved = add_output_port("Retrieved", PORT_TYPE_SIGNAL)
+ why_fail = add_output_port("Fail reason", PORT_TYPE_STRING)
+ on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/bluespace_launchpad/register_usb_parent(atom/movable/shell)
+ . = ..()
+ if(istype(shell, /obj/machinery/launchpad))
+ attached_launchpad = shell
+
+/obj/item/circuit_component/bluespace_launchpad/unregister_usb_parent(atom/movable/shell)
+ attached_launchpad = null
+ return ..()
+
+/obj/item/circuit_component/bluespace_launchpad/input_received(datum/port/input/port)
+ if(!attached_launchpad)
+ why_fail.set_output("Not connected!")
+ on_fail.set_output(COMPONENT_SIGNAL)
+ return
+
+ attached_launchpad.set_offset(x_pos.value, y_pos.value)
+
+ if(COMPONENT_TRIGGERED_BY(port, x_pos))
+ x_pos.set_value(attached_launchpad.x_offset)
+ return
+
+ if(COMPONENT_TRIGGERED_BY(port, y_pos))
+ y_pos.set_value(attached_launchpad.y_offset)
+ return
+
+ var/checks = attached_launchpad.teleport_checks()
+ if(!isnull(checks))
+ why_fail.set_output(checks)
+ on_fail.set_output(COMPONENT_SIGNAL)
+ return
+
+ if(COMPONENT_TRIGGERED_BY(send_trigger, port))
+ INVOKE_ASYNC(attached_launchpad, /obj/machinery/launchpad.proc/doteleport, null, TRUE, parent.get_creator())
+ sent.set_output(COMPONENT_SIGNAL)
+
+ if(COMPONENT_TRIGGERED_BY(retrieve_trigger, port))
+ INVOKE_ASYNC(attached_launchpad, /obj/machinery/launchpad.proc/doteleport, null, FALSE, parent.get_creator())
+ retrieved.set_output(COMPONENT_SIGNAL)
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index 217f80878e329..b9872da122646 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -96,7 +96,7 @@
return data
/obj/machinery/limbgrower/on_deconstruction()
- for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
+ for(var/obj/item/reagent_containers/cup/our_beaker in component_parts)
reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume)
..()
@@ -233,7 +233,7 @@
/obj/machinery/limbgrower/RefreshParts()
. = ..()
reagents.maximum_volume = 0
- for(var/obj/item/reagent_containers/glass/our_beaker in component_parts)
+ for(var/obj/item/reagent_containers/cup/our_beaker in component_parts)
reagents.maximum_volume += our_beaker.volume
our_beaker.reagents.trans_to(src, our_beaker.reagents.total_volume)
production_coefficient = 1.25
@@ -269,7 +269,7 @@
. = ..()
for(var/id in SSresearch.techweb_designs)
var/datum/design/found_design = SSresearch.techweb_design_by_id(id)
- if((found_design.build_type & LIMBGROWER) && !("emagged" in found_design.category))
+ if((found_design.build_type & LIMBGROWER) && !(RND_CATEGORY_EMAGGED in found_design.category))
stored_research.add_design(found_design)
/// Emagging a limbgrower allows you to build synthetic armblades.
@@ -278,7 +278,7 @@
return
for(var/design_id in SSresearch.techweb_designs)
var/datum/design/found_design = SSresearch.techweb_design_by_id(design_id)
- if((found_design.build_type & LIMBGROWER) && ("emagged" in found_design.category))
+ if((found_design.build_type & LIMBGROWER) && (RND_CATEGORY_EMAGGED in found_design.category))
stored_research.add_design(found_design)
to_chat(user, span_warning("Safety overrides have been deactivated!"))
obj_flags |= EMAGGED
diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm
index 1650434c3013e..f4ceab57c3764 100644
--- a/code/game/machinery/medipen_refiller.dm
+++ b/code/game/machinery/medipen_refiller.dm
@@ -38,7 +38,7 @@
if(busy)
to_chat(user, span_danger("The machine is busy."))
return
- if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
+ if(is_reagent_container(I) && I.is_open_container())
var/obj/item/reagent_containers/RC = I
var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user)
if(units)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index e128ae5669b80..0d1b3a64c39d6 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -96,7 +96,7 @@
if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE)
return // prevent intraction when T-scanner revealed
- else if (istype(I, /obj/item/card/id) || istype(I, /obj/item/modular_computer/tablet))
+ else if (isidcard(I) || istype(I, /obj/item/modular_computer/tablet))
if(open)
if (src.allowed(user))
src.locked = !src.locked
diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm
index 2de86e1b5a527..ecc87c3ff78c3 100644
--- a/code/game/machinery/newscaster/newspaper.dm
+++ b/code/game/machinery/newscaster/newspaper.dm
@@ -25,7 +25,7 @@
user.visible_message(span_suicide("[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!"))
user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide")
var/mob/living/carbon/human/H = user
- var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc)
+ var/obj/W = new /obj/item/reagent_containers/cup/glass/bottle/whiskey(H.loc)
playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), TRUE)
W.reagents.trans_to(H, W.reagents.total_volume, transfered_by = user)
user.visible_message(span_suicide("[user] downs the contents of [W.name] in one gulp! Shoulda stuck to sudoku!"))
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 382458e7a79a1..c4a5ddae24a4a 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -724,7 +724,7 @@ DEFINE_BITFIELD(turret_flags, list(
faction = list(ROLE_SYNDICATE)
desc = "A ballistic machine gun auto-turret."
-/obj/machinery/porta_turret/syndicate/ComponentInitialize()
+/obj/machinery/porta_turret/syndicate/Initialize(mapload)
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
@@ -827,7 +827,7 @@ DEFINE_BITFIELD(turret_flags, list(
faction = list("neutral","silicon","turret")
mode = TURRET_LETHAL
-/obj/machinery/porta_turret/centcom_shuttle/ComponentInitialize()
+/obj/machinery/porta_turret/centcom_shuttle/Initialize(mapload)
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index c70fdbf490ad5..8d7148fa86294 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -54,7 +54,7 @@
else if(I.tool_behaviour == TOOL_CROWBAR && !anchored)
I.play_tool_sound(src, 75)
to_chat(user, span_notice("You dismantle the turret construction."))
- new /obj/item/stack/sheet/iron( loc, 5)
+ new /obj/item/stack/sheet/iron(loc, 5)
qdel(src)
return
@@ -85,12 +85,12 @@
return
else if(I.tool_behaviour == TOOL_WELDER)
- if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel
+ if(!I.tool_start_check(user, amount = 5)) //uses up 5 fuel
return
to_chat(user, span_notice("You start to remove the turret's interior metal armor..."))
- if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel
+ if(I.use_tool(src, user, 20, volume = 50, amount = 5)) //uses up 5 fuel
build_step = PTURRET_BOLTED
to_chat(user, span_notice("You remove the turret's interior metal armor."))
new /obj/item/stack/sheet/iron(drop_location(), 2)
@@ -106,7 +106,6 @@
to_chat(user, span_notice("You add [I] to the turret."))
build_step = PTURRET_GUN_EQUIPPED
return
-
else if(I.tool_behaviour == TOOL_WRENCH)
I.play_tool_sound(src, 100)
to_chat(user, span_notice("You remove the turret's metal armor bolts."))
@@ -149,11 +148,11 @@
if(PTURRET_START_EXTERNAL_ARMOUR)
if(I.tool_behaviour == TOOL_WELDER)
- if(!I.tool_start_check(user, amount=5))
+ if(!I.tool_start_check(user, amount = 5))
return
to_chat(user, span_notice("You begin to weld the turret's armor down..."))
- if(I.use_tool(src, user, 30, volume=50, amount=5))
+ if(I.use_tool(src, user, 30, volume = 50, amount = 5))
build_step = PTURRET_EXTERNAL_ARMOUR_ON
to_chat(user, span_notice("You weld the turret's armor down."))
@@ -168,6 +167,7 @@
turret.name = finish_name
turret.installation = installed_gun.type
turret.setup(installed_gun)
+ turret.locked = FALSE
qdel(src)
return
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index 97cef3170c155..94975193d644b 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -191,7 +191,7 @@
/obj/item/paper/guides/quantumpad
name = "Quantum Pad For Dummies"
- info = "Dummies Guide To Quantum Pads
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link.
2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link.
3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both."
+ default_raw_text = "Dummies Guide To Quantum Pads
Do you hate the concept of having to use your legs, let alone walk to places? Well, with the Quantum Pad (tm), never again will the fear of cardio keep you from going places!
How to set up your Quantum Pad(tm)
1.Unscrew the Quantum Pad(tm) you wish to link.
2. Use your multi-tool to cache the buffer of the Quantum Pad(tm) you wish to link.
3. Apply the multi-tool to the secondary Quantum Pad(tm) you wish to link to the first Quantum Pad(tm)
If you followed these instructions carefully, your Quantum Pad(tm) should now be properly linked together for near-instant movement across the station! Bear in mind that this is technically a one-way teleport, so you'll need to do the same process with the secondary pad to the first one if you wish to travel between both."
/obj/item/circuit_component/quantumpad
display_name = "Quantum Pad"
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 8d088dfd5d81a..2596e19df00d4 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -33,7 +33,11 @@
/datum/material/bluespace
)
AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER)
- AddComponent(/datum/component/butchering/recycler, 1, amount_produced,amount_produced/5)
+ AddComponent(/datum/component/butchering/recycler, \
+ speed = 0.1 SECONDS, \
+ effectiveness = amount_produced, \
+ bonus_modifier = amount_produced/5, \
+ )
. = ..()
return INITIALIZE_HINT_LATELOAD
@@ -125,7 +129,7 @@
for(var/i in to_eat)
var/atom/movable/AM = i
- if(istype(AM, /obj/item))
+ if(isitem(AM))
var/obj/item/bodypart/head/as_head = AM
var/obj/item/mmi/as_mmi = AM
if(istype(AM, /obj/item/organ/internal/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
@@ -221,6 +225,6 @@
/obj/item/paper/guides/recycler
name = "paper - 'garbage duty instructions'"
- info = "New Assignment
You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect said trash.
There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then, deliver these minerals to cargo or engineering. You are our last hope for a clean station. Do not screw this up!"
+ default_raw_text = "New Assignment
You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect said trash.
There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then, deliver these minerals to cargo or engineering. You are our last hope for a clean station. Do not screw this up!"
#undef SAFETY_COOLDOWN
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index 3ca95b8cfab7a..7c6482b90eff3 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -113,15 +113,23 @@
return
if(playing)
return ..()
- if(istype(W, /obj/item/card/id))
- playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE)
+ var/obj/item/card/id/player_card = W.GetID()
+ if(player_card)
+ if(isidcard(W))
+ playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE)
+ else
+ playsound(src, 'sound/machines/terminal_success.ogg', 50, TRUE)
if(machine_stat & MAINT || !on || locked)
to_chat(user, span_notice("The machine appears to be disabled."))
return FALSE
+ if(!player_card.registered_account)
+ say("You don't have a bank account!")
+ playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE)
+ return FALSE
+
if(my_card)
- var/obj/item/card/id/player_card = W
if(istype(player_card, /obj/item/card/id/departmental_budget)) // Are they using a department ID
say("You cannot gamble with the department budget!")
playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE)
@@ -170,18 +178,16 @@
addtimer(CALLBACK(src, .proc/play, user, player_card, chosen_bet_type, chosen_bet_amount, potential_payout), 4) //Animation first
return TRUE
else
- var/obj/item/card/id/new_card = W
- if(new_card.registered_account)
- var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", MAX_NAME_LEN)
- if(!msg)
- return
- name = msg
- desc = "Owned by [new_card.registered_account.account_holder], draws directly from [user.p_their()] account."
- my_card = new_card
- RegisterSignal(my_card, COMSIG_PARENT_QDELETING, .proc/on_my_card_deleted)
- to_chat(user, span_notice("You link the wheel to your account."))
- power_change()
+ var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", MAX_NAME_LEN)
+ if(!msg)
return
+ name = msg
+ desc = "Owned by [player_card.registered_account.account_holder], draws directly from [user.p_their()] account."
+ my_card = player_card
+ RegisterSignal(my_card, COMSIG_PARENT_QDELETING, .proc/on_my_card_deleted)
+ to_chat(user, span_notice("You link the wheel to your account."))
+ power_change()
+ return
return ..()
///deletes the my_card ref to prevent harddels
diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm
index 26d7da32cb453..7f1f0408db2db 100644
--- a/code/game/machinery/scan_gate.dm
+++ b/code/game/machinery/scan_gate.dm
@@ -164,7 +164,7 @@
beep = TRUE
if(SCANGATE_GUNS)
for(var/I in M.get_contents())
- if(istype(I, /obj/item/gun))
+ if(isgun(I))
beep = TRUE
break
if(SCANGATE_NUTRITION)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 13a6c897a1963..5dd6f101d74d6 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -433,13 +433,13 @@
span_notice("You turn off \the [src]."), \
span_hear("You hear heavy droning fade out."))
active = FALSE
- log_game("[src] was deactivated by [key_name(user)] at [AREACOORD(src)]")
+ user.log_message("deactivated [src].", LOG_GAME)
else
user.visible_message(span_notice("[user] turned \the [src] on."), \
span_notice("You turn on \the [src]."), \
span_hear("You hear heavy droning."))
active = ACTIVE_SETUPFIELDS
- log_game("[src] was activated by [key_name(user)] at [AREACOORD(src)]")
+ user.log_message("activated [src].", LOG_GAME)
add_fingerprint(user)
/obj/machinery/power/shieldwallgen/emag_act(mob/user)
@@ -519,5 +519,5 @@
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return prob(20)
else
- if(istype(mover, /obj/projectile))
+ if(isprojectile(mover))
return prob(10)
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index dc100b4b3a481..4381a9caced14 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -230,6 +230,7 @@
if(payload && !istype(payload, /obj/item/bombcore/training))
log_bomber(user, "has primed a", src, "for detonation (Payload: [payload.name])")
payload.adminlog = "The [name] that [key_name(user)] had primed detonated!"
+ user.log_message("primed the [src]. (Payload: [payload.name])", LOG_GAME, log_globally = FALSE)
///Bomb Subtypes///
@@ -442,12 +443,12 @@
var/list/reactants = list()
- for(var/obj/item/reagent_containers/glass/G in beakers)
+ for(var/obj/item/reagent_containers/cup/G in beakers)
reactants += G.reagents
for(var/obj/item/slime_extract/S in beakers)
if(S.Uses)
- for(var/obj/item/reagent_containers/glass/G in beakers)
+ for(var/obj/item/reagent_containers/cup/G in beakers)
G.reagents.trans_to(S, G.reagents.total_volume)
if(S && S.reagents && S.reagents.total_volume)
@@ -470,7 +471,7 @@
B.forceMove(drop_location())
beakers -= B
return
- else if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle))
+ else if(istype(I, /obj/item/reagent_containers/cup/beaker) || istype(I, /obj/item/reagent_containers/cup/bottle))
if(beakers.len < max_beakers)
if(!user.transferItemToLoc(I, src))
return
@@ -512,7 +513,7 @@
if(istype(G, /obj/item/grenade/chem_grenade/adv_release))
time_release += 50 // A typical bomb, using basic beakers, will explode over 2-4 seconds. Using two will make the reaction last for less time, but it will be more dangerous overall.
- for(var/obj/item/reagent_containers/glass/B in G)
+ for(var/obj/item/reagent_containers/cup/B in G)
if(beakers.len < max_beakers)
beakers += B
B.forceMove(src)
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index 9d153abfaf019..7110201aae43a 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -21,7 +21,7 @@
//Server linked to.
var/obj/machinery/telecomms/message_server/linkedServer = null
//Sparks effect - For emag
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
+ var/datum/effect_system/spark_spread/spark_system
//Messages - Saves me time if I want to change something.
var/noserver = "ALERT: No server detected."
var/incorrectkey = "ALERT: Incorrect decryption key!"
@@ -56,9 +56,9 @@
screen = MSG_MON_SCREEN_HACKED
spark_system.set_up(5, 0, src)
spark_system.start()
- var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
+ var/obj/item/paper/monitorkey/monitor_key_paper = new(loc, linkedServer)
// Will help make emagging the console not so easy to get away with.
- MK.info += "
£%@%(*$%&(£&?*(%&£/{}"
+ monitor_key_paper.add_raw_text("
£%@%(*$%&(£&?*(%&£/{}")
var/time = 100 * length(linkedServer.decryptkey)
addtimer(CALLBACK(src, .proc/UnmagConsole), time)
message = rebootmsg
@@ -67,6 +67,7 @@
/obj/machinery/computer/message_monitor/Initialize(mapload)
..()
+ spark_system = new
GLOB.telecomms_list += src
return INITIALIZE_HINT_LATELOAD
@@ -475,8 +476,9 @@
return INITIALIZE_HINT_LATELOAD
/obj/item/paper/monitorkey/proc/print(obj/machinery/telecomms/message_server/server)
- info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one."
+ add_raw_text("Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one.")
add_overlay("paper_words")
+ update_appearance()
/obj/item/paper/monitorkey/LateInitialize()
for (var/obj/machinery/telecomms/message_server/preset/server in GLOB.telecomms_list)
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index ed85ff13a8d80..8b19a4f70df3f 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -103,7 +103,7 @@
toggled = !toggled
update_power()
update_appearance()
- log_game("[key_name(operator)] toggled [toggled ? "On" : "Off"] [src] at [AREACOORD(src)].")
+ operator.log_message("toggled [toggled ? "On" : "Off"] [src].", LOG_GAME)
. = TRUE
if("id")
if(params["value"])
@@ -113,7 +113,7 @@
return
else
id = params["value"]
- log_game("[key_name(operator)] has changed the ID for [src] at [AREACOORD(src)] to [id].")
+ operator.log_message("has changed the ID for [src] to [id].", LOG_GAME)
. = TRUE
if("network")
if(params["value"])
@@ -126,7 +126,7 @@
remove_link(T)
network = params["value"]
links = list()
- log_game("[key_name(operator)] has changed the network for [src] at [AREACOORD(src)] to [network].")
+ operator.log_message("has changed the network for [src] to [network].", LOG_GAME)
. = TRUE
if("tempfreq")
if(params["value"])
@@ -138,11 +138,11 @@
else
if(!(tempfreq in freq_listening))
freq_listening.Add(tempfreq)
- log_game("[key_name(operator)] added frequency [tempfreq] for [src] at [AREACOORD(src)].")
+ operator.log_message("added frequency [tempfreq] for [src].", LOG_GAME)
. = TRUE
if("delete")
freq_listening.Remove(params["value"])
- log_game("[key_name(operator)] added removed frequency [params["value"]] for [src] at [AREACOORD(src)].")
+ operator.log_message("removed frequency [params["value"]] for [src].", LOG_GAME)
. = TRUE
if("unlink")
var/obj/machinery/telecomms/T = links[text2num(params["value"])]
@@ -177,7 +177,7 @@
LAZYADDASSOCLIST(new_connection.links_by_telecomms_type, telecomms_type, src)
if(user)
- log_game("[key_name(user)] linked [src] for [new_connection] at [AREACOORD(src)].")
+ user.log_message("linked [src] for [new_connection].", LOG_GAME)
return TRUE
///removes old_connection from src's links list AND vice versa. also updates links_by_telecomms_type
@@ -194,7 +194,7 @@
LAZYREMOVEASSOC(old_connection.links_by_telecomms_type, telecomms_type, src)
if(user)
- log_game("[key_name(user)] unlinked [src] and [old_connection] at [AREACOORD(src)].")
+ user.log_message("unlinked [src] and [old_connection].", LOG_GAME)
return TRUE
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 9765b36d3848b..d24939d5f0526 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -86,7 +86,7 @@
if(human.dna && human.dna.species.id != initial(species_to_transform.id))
to_chat(M, span_hear("You hear a buzzing in your ears."))
human.set_species(species_to_transform)
- log_game("[human] ([key_name(human)]) was turned into a [initial(species_to_transform.name)] through [src].")
+ human.log_message("was turned into a [initial(species_to_transform.name)] through [src].", LOG_GAME)
calibrated = FALSE
return
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index d856dd4fd16fc..6b3db65eded4b 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -53,8 +53,18 @@
countdown = new(src)
if(countdown_colour)
countdown.color = countdown_colour
+ if(immortal)
+ return
countdown.start()
+/obj/effect/anomaly/vv_edit_var(vname, vval)
+ . = ..()
+ if(vname == NAMEOF(src, immortal))
+ if(vval)
+ countdown.stop()
+ else
+ countdown.start()
+
/obj/effect/anomaly/process(delta_time)
anomalyEffect(delta_time)
if(death_time < world.time && !immortal)
@@ -360,7 +370,7 @@
var/policy = get_policy(ROLE_PYROCLASTIC_SLIME)
if (policy)
to_chat(S, policy)
- log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].")
+ S.log_message("was made into a slime by pyroclastic anomaly", LOG_GAME)
/////////////////////
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 16ba433d87f71..520db51c460e9 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -14,6 +14,14 @@
/obj/item/poster/Initialize(mapload, obj/structure/sign/poster/new_poster_structure)
. = ..()
+
+ var/static/list/hovering_item_typechecks = list(
+ /obj/item/shard = list(
+ SCREENTIP_CONTEXT_LMB = "Booby trap poster",
+ ),
+ )
+ AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
+
poster_structure = new_poster_structure
if(!new_poster_structure && poster_type)
poster_structure = new poster_type(src)
@@ -32,6 +40,20 @@
//If the poster structure is being deleted something has gone wrong, kill yourself off too
RegisterSignal(poster_structure, COMSIG_PARENT_QDELETING, .proc/react_to_deletion)
+/obj/item/poster/attackby(obj/item/I, mob/user, params)
+ if(!istype(I, /obj/item/shard))
+ return ..()
+
+ if (poster_structure.trap?.resolve())
+ to_chat(user, span_warning("This poster is already booby-trapped!"))
+ return
+
+ if(!user.transferItemToLoc(I, poster_structure))
+ return
+
+ poster_structure.trap = WEAKREF(I)
+ to_chat(user, span_notice("You conceal the [I.name] inside the rolled up poster."))
+
/obj/item/poster/Destroy()
poster_structure = null
. = ..()
@@ -68,9 +90,12 @@
var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here."
var/poster_item_icon_state = "rolled_poster"
var/poster_item_type = /obj/item/poster
+ ///A sharp shard of material can be hidden inside of a poster, attempts to embed when it is torn down.
+ var/datum/weakref/trap
/obj/structure/sign/poster/Initialize(mapload)
. = ..()
+ register_context()
if(random_basetype)
randomise(random_basetype)
if(!ruined)
@@ -80,6 +105,23 @@
AddElement(/datum/element/beauty, 300)
+/// Adds contextual screentips
+/obj/structure/sign/poster/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+ if (!held_item)
+ if (ruined)
+ return .
+ context[SCREENTIP_CONTEXT_LMB] = "Rip up poster"
+ return CONTEXTUAL_SCREENTIP_SET
+
+ if (held_item.tool_behaviour == TOOL_WIRECUTTER)
+ if (ruined)
+ context[SCREENTIP_CONTEXT_LMB] = "Clean up remnants"
+ return CONTEXTUAL_SCREENTIP_SET
+ context[SCREENTIP_CONTEXT_LMB] = "Take down poster"
+ return CONTEXTUAL_SCREENTIP_SET
+ return .
+
/obj/structure/sign/poster/proc/randomise(base_type)
var/list/poster_types = subtypesof(base_type)
var/list/approved_types = list()
@@ -98,7 +140,6 @@
poster_item_icon_state = initial(selected.poster_item_icon_state)
ruined = initial(selected.ruined)
-
/obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER)
I.play_tool_sound(src, 100)
@@ -115,8 +156,10 @@
return
if(ruined)
return
+
visible_message(span_notice("[user] rips [src] in a single, decisive motion!") )
playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE)
+ spring_trap(user)
var/obj/structure/sign/poster/ripped/R = new(loc)
R.pixel_y = pixel_y
@@ -124,6 +167,23 @@
R.add_fingerprint(user)
qdel(src)
+/obj/structure/sign/poster/proc/spring_trap(mob/user)
+ var/obj/item/shard/payload = trap?.resolve()
+ if (!payload)
+ return
+
+ to_chat(user, span_warning("There's something sharp behind this! What the hell?"))
+ if(!can_embed_trap(user) || !payload.tryEmbed(user.get_active_hand(), TRUE))
+ visible_message(span_notice("A [payload.name] falls from behind the poster.") )
+ payload.forceMove(user.drop_location())
+ else
+ SEND_SIGNAL(src, COMSIG_POSTER_TRAP_SUCCEED, user)
+
+/obj/structure/sign/poster/proc/can_embed_trap(mob/living/carbon/human/user)
+ if (!istype(user))
+ return FALSE
+ return (!user.gloves && !HAS_TRAIT(user, TRAIT_PIERCEIMMUNE))
+
/obj/structure/sign/poster/proc/roll_and_drop(loc)
pixel_x = 0
pixel_y = 0
@@ -169,12 +229,15 @@
return
if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there
- to_chat(user, span_notice("You place the poster!"))
+ D.on_placed_poster(user)
return
to_chat(user, span_notice("The poster falls down!"))
D.roll_and_drop(get_turf(user))
+/obj/structure/sign/poster/proc/on_placed_poster(mob/user)
+ to_chat(user, span_notice("You place the poster!"))
+
// Various possible posters follow
/obj/structure/sign/poster/ripped
diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm
index e5be8ffc0c01e..95509006a6f03 100644
--- a/code/game/objects/effects/countdown.dm
+++ b/code/game/objects/effects/countdown.dm
@@ -127,6 +127,8 @@
var/obj/effect/anomaly/A = attached_to
if(!istype(A))
return
+ else if(A.immortal) //we can't die, why are we still here? just to suffer?
+ stop()
else
var/time_left = max(0, (A.death_time - world.time) / 10)
return round(time_left)
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 6e8864acbdc04..b5f011771aebc 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -59,7 +59,7 @@
return TRUE
/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params)
- if((istype(W, /obj/item/reagent_containers/glass) && !istype(W, /obj/item/reagent_containers/glass/rag)) || istype(W, /obj/item/reagent_containers/food/drinks))
+ if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/reagent_containers/cup/rag)) || istype(W, /obj/item/reagent_containers/cup/glass))
if(src.reagents && W.reagents)
. = 1 //so the containers don't splash their content on the src while scooping.
if(!src.reagents.total_volume)
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 0c4f8332bf3f1..2a55360048f63 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -377,10 +377,10 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
var/mob/living/carbon/human/splashed_human = iter_atom
if(splashed_human.wear_suit)
splashed_human.wear_suit.add_blood_DNA(blood_dna_info)
- splashed_human.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh)
+ splashed_human.update_worn_oversuit() //updates mob overlays to show the new blood (no refresh)
if(splashed_human.w_uniform)
splashed_human.w_uniform.add_blood_DNA(blood_dna_info)
- splashed_human.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh)
+ splashed_human.update_worn_undersuit() //updates mob overlays to show the new blood (no refresh)
splatter_strength--
if(splatter_strength <= 0) // we used all the puff so we delete it.
qdel(src)
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index ce78137119437..6d2602b9a2fbb 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -283,39 +283,79 @@
var/bite_sound = 'sound/weapons/bite.ogg'
/obj/effect/decal/cleanable/ants/Initialize(mapload)
- reagent_amount = rand(3, 5)
+ if(mapload && reagent_amount > 2)
+ reagent_amount = rand((reagent_amount - 2), reagent_amount)
. = ..()
update_ant_damage()
+/obj/effect/decal/cleanable/ants/vv_edit_var(vname, vval)
+ . = ..()
+ if(vname == NAMEOF(src, bite_sound))
+ update_ant_damage()
+
/obj/effect/decal/cleanable/ants/handle_merge_decal(obj/effect/decal/cleanable/merger)
. = ..()
var/obj/effect/decal/cleanable/ants/ants = merger
ants.update_ant_damage()
-/obj/effect/decal/cleanable/ants/proc/update_ant_damage()
- var/ant_bite_damage = min(10, round((reagents.get_reagent_amount(/datum/reagent/ants) * 0.1),0.1)) // 100u ants = 10 max_damage
-
+/obj/effect/decal/cleanable/ants/proc/update_ant_damage(ant_min_damage, ant_max_damage)
+ if(!ant_max_damage)
+ ant_max_damage = min(10, round((reagents.get_reagent_amount(/datum/reagent/ants) * 0.1),0.1)) // 100u ants = 10 max_damage
+ if(!ant_min_damage)
+ ant_min_damage = 0.1
var/ant_flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN) /// Small amounts of ants won't be able to bite through shoes.
- if(ant_bite_damage > 1)
+ if(ant_max_damage > 1)
ant_flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN | CALTROP_BYPASS_SHOES)
- switch(ant_bite_damage)
+ var/datum/component/caltrop/caltrop_comp = GetComponent(/datum/component/caltrop)
+ if(caltrop_comp)
+ caltrop_comp.min_damage = ant_min_damage
+ caltrop_comp.max_damage = ant_max_damage
+ caltrop_comp.flags = ant_flags
+ caltrop_comp.soundfile = bite_sound
+ else
+ AddComponent(/datum/component/caltrop, min_damage = ant_min_damage, max_damage = ant_max_damage, flags = ant_flags, soundfile = bite_sound)
+
+ update_appearance(UPDATE_ICON)
+
+/obj/effect/decal/cleanable/ants/update_icon_state()
+ if(istype(src, /obj/effect/decal/cleanable/ants/fire)) //i fucking hate this but you're forced to call parent in update_icon_state()
+ return ..()
+
+ var/datum/component/caltrop/caltrop_comp = GetComponent(/datum/component/caltrop)
+ switch(caltrop_comp.max_damage)
if(0 to 1)
icon_state = initial(icon_state)
if(1.1 to 4)
icon_state = "[initial(icon_state)]_2"
if(4.1 to 7)
icon_state = "[initial(icon_state)]_3"
- if(7.1 to 10)
+ if(7.1 to INFINITY)
icon_state = "[initial(icon_state)]_4"
-
- AddComponent(/datum/component/caltrop, min_damage = 0.1, max_damage = ant_bite_damage, flags = ant_flags, soundfile = bite_sound)
- update_icon(UPDATE_OVERLAYS)
+ return ..()
/obj/effect/decal/cleanable/ants/update_overlays()
. = ..()
. += emissive_appearance(icon, "[icon_state]_light", alpha = src.alpha)
+/obj/effect/decal/cleanable/ants/fire_act(exposed_temperature, exposed_volume)
+ var/obj/effect/decal/cleanable/ants/fire/fire_ants = new(loc)
+ fire_ants.reagents.clear_reagents()
+ reagents.trans_to(fire_ants, fire_ants.reagents.maximum_volume)
+ qdel(src)
+
+/obj/effect/decal/cleanable/ants/fire
+ name = "space fire ants"
+ desc = "A small colony no longer. We are the fire nation."
+ icon_state = "fire_ants"
+ mergeable_decal = FALSE
+
+/obj/effect/decal/cleanable/ants/fire/update_ant_damage(ant_min_damage, ant_max_damage)
+ return ..(15, 25)
+
+/obj/effect/decal/cleanable/ants/fire/fire_act(exposed_temperature, exposed_volume)
+ return
+
/obj/effect/decal/cleanable/fuel_pool
name = "pool of fuel"
desc = "A pool of flammable fuel. Its probably wise to clean this off before something ignites it..."
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index b7fe891900b46..fd048e16f990d 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -104,6 +104,6 @@
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
beauty = -50
-/obj/effect/decal/cleanable/oil/slippery/ComponentInitialize()
+/obj/effect/decal/cleanable/oil/slippery/Initialize(mapload)
. = ..()
AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE))
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 309fc0913886f..68e446c9d425d 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -37,12 +37,9 @@
layer = TURF_DECAL_LAYER
/obj/effect/turf_decal/Initialize(mapload)
- ..()
- return INITIALIZE_HINT_QDEL
-
-/obj/effect/turf_decal/ComponentInitialize()
. = ..()
var/turf/T = loc
if(!istype(T)) //you know this will happen somehow
CRASH("Turf decal initialized in an object/nullspace")
T.AddElement(/datum/element/decal, icon, icon_state, dir, null, null, alpha, color, null, FALSE, null)
+ return INITIALIZE_HINT_QDEL
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index 4b5f72f018c5d..91f1f6f88b74d 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -1,18 +1,3 @@
-/obj/effect/temp_visual/point
- name = "pointer"
- icon = 'icons/hud/screen_gen.dmi'
- icon_state = "arrow"
- plane = POINT_PLANE
- duration = 25
-
-/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
- . = ..()
- var/atom/old_loc = loc
- abstract_move(get_turf(src))
- pixel_x = old_loc.pixel_x
- pixel_y = old_loc.pixel_y
- invisibility = set_invis
-
//Used by spraybottles.
/obj/effect/decal/chempuff
name = "chemicals"
diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm
index 6dfb6d664b9ba..21a8c73237b2c 100644
--- a/code/game/objects/effects/decals/turfdecal/markings.dm
+++ b/code/game/objects/effects/decals/turfdecal/markings.dm
@@ -329,7 +329,7 @@
/obj/effect/turf_decal/siding/wood
icon_state = "siding_wood_line"
- color = "#55391A"
+ color = "#5d341f"
/obj/effect/turf_decal/siding/wood/corner
icon_state = "siding_wood_corner"
diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
index fb08bfa4ab050..6d0f7b7c95a79 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
@@ -38,16 +38,13 @@
/obj/effect/particle_effect/fluid/foam/Initialize(mapload)
. = ..()
+ if(slippery_foam)
+ AddComponent(/datum/component/slippery, 100)
create_reagents(1000, REAGENT_HOLDER_INSTANT_REACT)
playsound(src, 'sound/effects/bubbles2.ogg', 80, TRUE, -3)
AddElement(/datum/element/atmos_sensitive, mapload)
SSfoam.start_processing(src)
-/obj/effect/particle_effect/fluid/foam/ComponentInitialize()
- . = ..()
- if(slippery_foam)
- AddComponent(/datum/component/slippery, 100)
-
/obj/effect/particle_effect/fluid/foam/Destroy()
SSfoam.stop_processing(src)
if (spread_bucket)
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index a7ef07e012b41..74279695a7309 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -480,7 +480,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
break
if(dense_object)
continue
- debris += new /obj/item/reagent_containers/food/drinks/bottle/beer/almost_empty(turf_to_spawn_on)
+ debris += new /obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty(turf_to_spawn_on)
///Spawns the mob with some drugginess/drunkeness, and some disgust.
/obj/effect/landmark/start/hangover/proc/make_hungover(mob/hangover_mob)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 1caa38d5da8c8..992ed0d142d68 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -112,7 +112,7 @@
var/turf/real_target = get_link_target_turf()
if(!istype(real_target))
return FALSE
- if(!force && (!ismecha(M) && !istype(M, /obj/projectile) && M.anchored && !allow_anchored))
+ if(!force && (!ismecha(M) && !isprojectile(M) && M.anchored && !allow_anchored))
return
var/no_effect = FALSE
if(last_effect == world.time)
@@ -120,7 +120,7 @@
else
last_effect = world.time
if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport))
- if(istype(M, /obj/projectile))
+ if(isprojectile(M))
var/obj/projectile/P = M
P.ignore_source_check = TRUE
return TRUE
diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm
index fc3b1bbd8cb0a..61c67e11a5cf7 100644
--- a/code/game/objects/effects/spawners/random/entertainment.dm
+++ b/code/game/objects/effects/spawners/random/entertainment.dm
@@ -42,7 +42,7 @@
/obj/effect/spawner/random/entertainment/money = 3,
/obj/item/dice/d6 = 3,
/obj/item/storage/box/syndie_kit/throwing_weapons = 1,
- /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1,
)
/obj/effect/spawner/random/entertainment/coin
@@ -109,7 +109,7 @@
name = "recreational drugs spawner"
icon_state = "pill"
loot = list(
- /obj/item/reagent_containers/food/drinks/bottle/hooch = 50,
+ /obj/item/reagent_containers/cup/glass/bottle/hooch = 50,
/obj/item/clothing/mask/cigarette/rollie/cannabis = 15,
/obj/item/reagent_containers/syringe = 15,
/obj/item/cigbutt/roach = 15,
diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm
index b6b94f7f97f15..cdab1d3115161 100644
--- a/code/game/objects/effects/spawners/random/food_or_drink.dm
+++ b/code/game/objects/effects/spawners/random/food_or_drink.dm
@@ -104,54 +104,54 @@
name = "good soda spawner"
icon_state = "can"
loot = list(
- /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 3,
- /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 3,
- /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 2,
- /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 2,
- /obj/item/reagent_containers/food/drinks/bottle/beer/light = 2,
- /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/cola = 1,
+ /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola = 3,
+ /obj/item/reagent_containers/cup/soda_cans/grey_bull = 3,
+ /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 2,
+ /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/beer/light = 2,
+ /obj/item/reagent_containers/cup/soda_cans/shamblers = 1,
+ /obj/item/reagent_containers/cup/soda_cans/pwr_game = 1,
+ /obj/item/reagent_containers/cup/soda_cans/dr_gibb = 1,
+ /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 1,
+ /obj/item/reagent_containers/cup/soda_cans/starkist = 1,
+ /obj/item/reagent_containers/cup/soda_cans/space_up = 1,
+ /obj/item/reagent_containers/cup/soda_cans/sol_dry = 1,
+ /obj/item/reagent_containers/cup/soda_cans/cola = 1,
)
/obj/effect/spawner/random/food_or_drink/booze
name = "booze spawner"
icon_state = "beer"
loot = list(
- /obj/item/reagent_containers/food/drinks/bottle/beer = 75,
- /obj/item/reagent_containers/food/drinks/bottle/ale = 25,
- /obj/item/reagent_containers/food/drinks/bottle/beer/light = 5,
- /obj/item/reagent_containers/food/drinks/bottle/maltliquor = 5,
- /obj/item/reagent_containers/food/drinks/bottle/whiskey = 5,
- /obj/item/reagent_containers/food/drinks/bottle/gin = 5,
- /obj/item/reagent_containers/food/drinks/bottle/vodka = 5,
- /obj/item/reagent_containers/food/drinks/bottle/tequila = 5,
- /obj/item/reagent_containers/food/drinks/bottle/rum = 5,
- /obj/item/reagent_containers/food/drinks/bottle/vermouth = 5,
- /obj/item/reagent_containers/food/drinks/bottle/cognac = 5,
- /obj/item/reagent_containers/food/drinks/bottle/wine = 5,
- /obj/item/reagent_containers/food/drinks/bottle/kahlua = 5,
- /obj/item/reagent_containers/food/drinks/bottle/amaretto = 5,
- /obj/item/reagent_containers/food/drinks/bottle/hcider = 5,
- /obj/item/reagent_containers/food/drinks/bottle/absinthe = 5,
- /obj/item/reagent_containers/food/drinks/bottle/sake = 5,
- /obj/item/reagent_containers/food/drinks/bottle/grappa = 5,
- /obj/item/reagent_containers/food/drinks/bottle/applejack = 5,
- /obj/item/reagent_containers/glass/bottle/ethanol = 2,
- /obj/item/reagent_containers/food/drinks/bottle/fernet = 2,
- /obj/item/reagent_containers/food/drinks/bottle/champagne = 2,
- /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium = 2,
- /obj/item/reagent_containers/food/drinks/bottle/goldschlager = 2,
- /obj/item/reagent_containers/food/drinks/bottle/patron = 1,
- /obj/item/reagent_containers/food/drinks/bottle/kong = 1,
- /obj/item/reagent_containers/food/drinks/bottle/lizardwine = 1,
- /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka = 1,
- /obj/item/reagent_containers/food/drinks/bottle/trappist = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/beer = 75,
+ /obj/item/reagent_containers/cup/glass/bottle/ale = 25,
+ /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/gin = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/vodka = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/tequila = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/rum = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/cognac = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/wine = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/hcider = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/sake = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/grappa = 5,
+ /obj/item/reagent_containers/cup/glass/bottle/applejack = 5,
+ /obj/item/reagent_containers/cup/bottle/ethanol = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/fernet = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/champagne = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2,
+ /obj/item/reagent_containers/cup/glass/bottle/patron = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/kong = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1,
+ /obj/item/reagent_containers/cup/glass/bottle/trappist = 1,
)
/obj/effect/spawner/random/food_or_drink/pizzaparty
@@ -190,7 +190,7 @@
/obj/item/food/peanuts = 5,
/obj/item/food/cnds = 5,
/obj/item/food/energybar = 5,
- /obj/item/reagent_containers/food/drinks/dry_ramen = 5,
+ /obj/item/reagent_containers/cup/glass/dry_ramen = 5,
/obj/item/food/cornchips/random = 5,
/obj/item/food/semki = 5,
/obj/item/food/peanuts/random = 3,
@@ -219,17 +219,17 @@
name = "condiment spawner"
icon_state = "condiment"
loot = list(
- /obj/item/reagent_containers/food/condiment/saltshaker = 3,
- /obj/item/reagent_containers/food/condiment/peppermill = 3,
- /obj/item/reagent_containers/food/condiment/pack/ketchup = 3,
- /obj/item/reagent_containers/food/condiment/pack/hotsauce = 3,
- /obj/item/reagent_containers/food/condiment/pack/astrotame = 3,
- /obj/item/reagent_containers/food/condiment/pack/bbqsauce = 3,
- /obj/item/reagent_containers/food/condiment/bbqsauce = 1,
- /obj/item/reagent_containers/food/condiment/soysauce = 1,
- /obj/item/reagent_containers/food/condiment/vinegar = 1,
- /obj/item/reagent_containers/food/condiment/peanut_butter = 1,
- /obj/item/reagent_containers/food/condiment/quality_oil = 1,
+ /obj/item/reagent_containers/condiment/saltshaker = 3,
+ /obj/item/reagent_containers/condiment/peppermill = 3,
+ /obj/item/reagent_containers/condiment/pack/ketchup = 3,
+ /obj/item/reagent_containers/condiment/pack/hotsauce = 3,
+ /obj/item/reagent_containers/condiment/pack/astrotame = 3,
+ /obj/item/reagent_containers/condiment/pack/bbqsauce = 3,
+ /obj/item/reagent_containers/condiment/bbqsauce = 1,
+ /obj/item/reagent_containers/condiment/soysauce = 1,
+ /obj/item/reagent_containers/condiment/vinegar = 1,
+ /obj/item/reagent_containers/condiment/peanut_butter = 1,
+ /obj/item/reagent_containers/condiment/quality_oil = 1,
)
/obj/effect/spawner/random/food_or_drink/cups
diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm
index 2458bd3c7ccd5..cf2d5eab6ecfb 100644
--- a/code/game/objects/effects/spawners/random/structure.dm
+++ b/code/game/objects/effects/spawners/random/structure.dm
@@ -101,6 +101,13 @@
/obj/structure/closet/crate/science = 1,
)
+/obj/effect/spawner/random/structure/crate_empty/Initialize(mapload)
+ var/obj/structure/closet/crate/peek_a_boo = ..()
+ if(istype(peek_a_boo))
+ peek_a_boo.opened = prob(50)
+
+ return INITIALIZE_HINT_QDEL
+
/obj/effect/spawner/random/structure/crate_loot
name = "lootcrate spawner"
icon_state = "crate"
@@ -127,6 +134,13 @@
/obj/structure/closet/acloset = 1,
)
+/obj/effect/spawner/random/structure/closet_empty/Initialize(mapload)
+ var/obj/structure/closet/peek_a_boo = ..()
+ if(istype(peek_a_boo))
+ peek_a_boo.opened = prob(50)
+
+ return INITIALIZE_HINT_QDEL
+
/obj/effect/spawner/random/structure/closet_maintenance
name = "maintenance closet spawner"
icon_state = "locker"
@@ -211,17 +225,17 @@
/obj/effect/spawner/random/structure/billboard/roadsigns //also pretty much only unifunctionally useful for gas stations
name = "\improper Gas Station billboard spawner"
loot = list(
- /obj/structure/billboard/roadsign/two = 25,
- /obj/structure/billboard/roadsign/twothousand = 25,
- /obj/structure/billboard/roadsign/twomillion = 25,
- /obj/structure/billboard/roadsign/error = 25,
+ /obj/structure/billboard/roadsign/two,
+ /obj/structure/billboard/roadsign/twothousand,
+ /obj/structure/billboard/roadsign/twomillion,
+ /obj/structure/billboard/roadsign/error,
)
/obj/effect/spawner/random/structure/steam_vent
name = "steam vent spawner"
loot = list(
- /obj/structure/steam_vent = 50,
- /obj/structure/steam_vent/fast = 50,
+ /obj/structure/steam_vent,
+ /obj/structure/steam_vent/fast,
)
/obj/effect/spawner/random/structure/musician/piano/random_piano
diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm
index bd94e40aea26e..ef23a1f3cf6b2 100644
--- a/code/game/objects/effects/spawners/random/trash.dm
+++ b/code/game/objects/effects/spawners/random/trash.dm
@@ -11,9 +11,9 @@
/obj/item/shard = 10,
/obj/effect/spawner/random/trash/cigbutt = 10,
/obj/effect/spawner/random/trash/botanical_waste = 5,
- /obj/item/reagent_containers/glass = 5,
+ /obj/item/reagent_containers/cup = 5,
/obj/item/broken_bottle = 5,
- /obj/item/reagent_containers/glass/bowl = 5,
+ /obj/item/reagent_containers/cup/bowl = 5,
/obj/item/light/tube/broken = 5,
/obj/item/light/bulb/broken = 5,
/obj/item/assembly/mousetrap/armed = 5,
@@ -22,7 +22,7 @@
/obj/item/trash/candle = 1,
/obj/item/popsicle_stick = 1,
/obj/item/reagent_containers/syringe = 1,
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /obj/item/reagent_containers/cup/glass/sillycup = 1,
/obj/item/shard/plasma = 1,
)
@@ -140,8 +140,8 @@
/obj/item/clothing/head/cone = 7,
/obj/item/clothing/suit/caution = 3,
/mob/living/simple_animal/hostile/retaliate/frog = 2,
- /obj/item/reagent_containers/glass/rag = 2,
- /obj/item/reagent_containers/glass/bucket = 2,
+ /obj/item/reagent_containers/cup/rag = 2,
+ /obj/item/reagent_containers/cup/bucket = 2,
/obj/effect/decal/cleanable/blood/old = 2,
/obj/structure/mopbucket = 2,
)
@@ -184,8 +184,8 @@
/obj/structure/mopbucket = 10,
/obj/item/mop = 5,
/obj/item/clothing/suit/caution = 3,
- /obj/item/reagent_containers/glass/bucket = 1,
- /obj/item/reagent_containers/glass/bucket/wooden = 1,
+ /obj/item/reagent_containers/cup/bucket = 1,
+ /obj/item/reagent_containers/cup/bucket/wooden = 1,
)
/obj/effect/spawner/random/trash/caution_sign
@@ -203,8 +203,8 @@
name = "bucket spawner"
icon_state = "caution"
loot = list(
- /obj/item/reagent_containers/glass/bucket,
- /obj/item/reagent_containers/glass/bucket/wooden,
+ /obj/item/reagent_containers/cup/bucket,
+ /obj/item/reagent_containers/cup/bucket/wooden,
)
/obj/effect/spawner/random/trash/soap
diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm
index 8ec5ec113c54e..a99fe21fde725 100644
--- a/code/game/objects/effects/spiderwebs.dm
+++ b/code/game/objects/effects/spiderwebs.dm
@@ -61,7 +61,7 @@
return
if(sealed)
return FALSE
- if(istype(mover, /mob/living/simple_animal/hostile/giant_spider))
+ if(isspider(mover))
return TRUE
else if(isliving(mover))
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/giant_spider))
@@ -69,7 +69,7 @@
if(prob(50))
to_chat(mover, span_danger("You get stuck in \the [src] for a moment."))
return FALSE
- else if(istype(mover, /obj/projectile))
+ else if(isprojectile(mover))
return prob(30)
/obj/structure/spider/stickyweb/sealed
@@ -97,7 +97,7 @@
if(prob(50))
to_chat(mover, span_danger("You get stuck in \the [src] for a moment."))
return FALSE
- else if(istype(mover, /obj/projectile))
+ else if(isprojectile(mover))
return prob(30)
/obj/structure/spider/spiderling
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index af09bf5d02a64..003d9f749a3c5 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -221,6 +221,9 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
if(species_exception)
species_exception = string_list(species_exception)
+ if(sharpness && force > 5) //give sharp objects butchering functionality, for consistency
+ AddComponent(/datum/component/butchering, speed = 8 SECONDS * toolspeed)
+
. = ..()
// Handle adding item associated actions
@@ -320,12 +323,6 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
if(B && B.loc == loc)
atom_destruction(MELEE)
-/obj/item/ComponentInitialize()
- . = ..()
-
- if(sharpness && force > 5) //give sharp objects butchering functionality, for consistency
- AddComponent(/datum/component/butchering, 80 * toolspeed)
-
/**Makes cool stuff happen when you suicide with an item
*
*Outputs a creative message and then return the damagetype done
@@ -784,7 +781,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
var/itempush = 1
if(w_class < 4)
itempush = 0 //too light to push anything
- if(istype(hit_atom, /mob/living)) //Living mobs handle hit sounds differently.
+ if(isliving(hit_atom)) //Living mobs handle hit sounds differently.
var/volume = get_volume_by_throwforce_and_or_w_class()
if (throwforce > 0)
if (mob_throw_hit_sound)
@@ -836,29 +833,29 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
var/mob/owner = loc
var/flags = slot_flags
if(flags & ITEM_SLOT_OCLOTHING)
- owner.update_inv_wear_suit()
+ owner.update_worn_oversuit()
if(flags & ITEM_SLOT_ICLOTHING)
- owner.update_inv_w_uniform()
+ owner.update_worn_undersuit()
if(flags & ITEM_SLOT_GLOVES)
- owner.update_inv_gloves()
+ owner.update_worn_gloves()
if(flags & ITEM_SLOT_EYES)
- owner.update_inv_glasses()
+ owner.update_worn_glasses()
if(flags & ITEM_SLOT_EARS)
owner.update_inv_ears()
if(flags & ITEM_SLOT_MASK)
- owner.update_inv_wear_mask()
+ owner.update_worn_mask()
if(flags & ITEM_SLOT_HEAD)
- owner.update_inv_head()
+ owner.update_worn_head()
if(flags & ITEM_SLOT_FEET)
- owner.update_inv_shoes()
+ owner.update_worn_shoes()
if(flags & ITEM_SLOT_ID)
- owner.update_inv_wear_id()
+ owner.update_worn_id()
if(flags & ITEM_SLOT_BELT)
- owner.update_inv_belt()
+ owner.update_worn_belt()
if(flags & ITEM_SLOT_BACK)
- owner.update_inv_back()
+ owner.update_worn_back()
if(flags & ITEM_SLOT_NECK)
- owner.update_inv_neck()
+ owner.update_worn_neck()
///Returns the temperature of src. If you want to know if an item is hot use this proc.
/obj/item/proc/get_temperature()
@@ -984,12 +981,12 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
/obj/item/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
. = ..()
- remove_filter("hover_outline") //get rid of the hover effect in case the mouse exit isn't called if someone drags and drops an item and somthing goes wrong
+ remove_filter(HOVER_OUTLINE_FILTER) //get rid of the hover effect in case the mouse exit isn't called if someone drags and drops an item and somthing goes wrong
/obj/item/MouseExited()
deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes
closeToolTip(usr)
- remove_filter("hover_outline")
+ remove_filter(HOVER_OUTLINE_FILTER)
/obj/item/proc/apply_outline(outline_color = null)
if(((get(src, /mob) != usr) && !loc?.atom_storage && !(item_flags & IN_STORAGE)) || QDELETED(src) || isobserver(usr)) //cancel if the item isn't in an inventory, is being deleted, or if the person hovering is a ghost (so that people spectating you don't randomly make your items glow)
@@ -1016,7 +1013,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
if(color)
outline_color = COLOR_WHITE //if the item is recolored then the outline will be too, let's make the outline white so it becomes the same color instead of some ugly mix of the theme and the tint
- add_filter("hover_outline", 1, list("type" = "outline", "size" = 1, "color" = outline_color))
+ add_filter(HOVER_OUTLINE_FILTER, 1, list("type" = "outline", "size" = 1, "color" = outline_color))
/// Called when a mob tries to use the item as a tool. Handles most checks.
/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
@@ -1108,7 +1105,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
var/hand_index = M.get_held_index_of_item(src)
if(hand_index)
M.held_items[hand_index] = null
- M.update_inv_hands()
+ M.update_held_items()
if(M.client)
M.client.screen -= src
layer = initial(layer)
@@ -1476,3 +1473,10 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
/obj/item/proc/mark_silver_slime_reaction()
SIGNAL_HANDLER
SEND_SIGNAL(src, COMSIG_FOOD_SILVER_SPAWNED)
+
+/**
+ * Returns null if this object cannot be used to interact with physical writing mediums such as paper.
+ * Returns a list of key attributes for this object interacting with paper otherwise.
+ */
+/obj/item/proc/get_writing_implement_details()
+ return null
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 01096cc2be7bd..deb5d5b34ba9b 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -107,7 +107,7 @@ RLD
matter += load
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
loaded = TRUE
- else if(istype(O, /obj/item/stack))
+ else if(isstack(O))
loaded = loadwithsheets(O, user)
if(loaded)
to_chat(user, span_notice("[src] now holds [matter]/[max_matter] matter-units."))
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index b61150993035a..c288927a6b84a 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -23,10 +23,9 @@
var/datum/radial_menu/persistent/wiring_gui_menu
var/mob/listeningTo
-
-/obj/item/rcl/ComponentInitialize()
+/obj/item/rcl/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
AddComponent(/datum/component/two_handed, wield_callback = CALLBACK(src, .proc/on_wield), unwield_callback = CALLBACK(src, .proc/on_unwield))
/// triggered on wield of two handed item
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index ff9d4db773b5b..564a86257a312 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -31,7 +31,7 @@ RSF
var/dispense_cost = 0
w_class = WEIGHT_CLASS_NORMAL
///An associated list of atoms and charge costs. This can contain a separate list, as long as it's associated item is an object
- var/list/cost_by_item = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 20,
+ var/list/cost_by_item = list(/obj/item/reagent_containers/cup/glass/drinkingglass = 20,
/obj/item/paper = 10,
/obj/item/storage/dice = 200,
/obj/item/pen = 50,
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 8c942d8d07d16..de5da8ba13fa1 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -226,7 +226,7 @@
* * target - The turf being painted to
*/
/obj/item/airlock_painter/decal/proc/paint_floor(turf/open/floor/target)
- target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, CLEAN_TYPE_PAINT, null)
+ target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, FALSE, null)
/**
* Return the final icon_state for the given decal options
@@ -376,14 +376,15 @@
desc = "An airlock painter, reprogramed to use a different style of paint in order to spray colors on floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design."
icon_state = "tile_sprayer"
stored_dir = 2
- stored_color = "#D4D4D4"
+ stored_color = "#D4D4D432"
stored_decal = "tile_corner"
spritesheet_type = /datum/asset/spritesheet/decals/tiles
supports_custom_color = TRUE
+ // Colors can have a an alpha component as RGBA, or just be RGB and use default alpha
color_list = list(
- list("White", "#D4D4D4"),
- list("Black", "#0e0f0f"),
- list("Bar Burgundy", "#791500"),
+ list("Neutral", "#D4D4D432"),
+ list("Dark", "#0e0f0f"),
+ list("Bar Burgundy", "#79150082"),
list("Sec Red", "#DE3A3A"),
list("Cargo Brown", "#A46106"),
list("Engi Yellow", "#EFB341"),
@@ -408,8 +409,11 @@
"trimline_box_fill",
)
- /// The alpha value to paint the tiles at. The decal mapping helper creates tile overlays at alpha 110.
- var/stored_alpha = 110
+ /// Regex to split alpha out.
+ var/static/regex/rgba_regex = new(@"(#[0-9a-fA-F]{6})([0-9a-fA-F]{2})")
+
+ /// Default alpha for /obj/effect/turf_decal/tile
+ var/default_alpha = 110
/obj/item/airlock_painter/decal/tile/paint_floor(turf/open/floor/target)
// Account for 8-sided decals.
@@ -419,7 +423,14 @@
source_decal = splicetext(stored_decal, -3, 0, "")
source_dir = turn(stored_dir, 45)
- target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', source_decal, source_dir, null, null, stored_alpha, stored_color, null, CLEAN_TYPE_PAINT, null)
+ var/decal_color = stored_color
+ var/decal_alpha = default_alpha
+ // Handle the RGBA case.
+ if(rgba_regex.Find(decal_color))
+ decal_color = rgba_regex.group[1]
+ decal_alpha = text2num(rgba_regex.group[2], 16)
+
+ target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', source_decal, source_dir, null, null, decal_alpha, decal_color, null, FALSE, null)
/datum/asset/spritesheet/decals/tiles
name = "floor_tile_decals"
@@ -433,13 +444,21 @@
source_decal = splicetext(decal, -3, 0, "")
source_dir = turn(dir, 45)
+ // Handle the RGBA case.
+ var/obj/item/airlock_painter/decal/tile/tile_type = painter_type
+ var/render_color = color
+ var/render_alpha = initial(tile_type.default_alpha)
+ if(tile_type.rgba_regex.Find(color))
+ render_color = tile_type.rgba_regex.group[1]
+ render_alpha = text2num(tile_type.rgba_regex.group[2], 16)
+
var/icon/colored_icon = icon('icons/turf/decals.dmi', source_decal, dir=source_dir)
- colored_icon.ChangeOpacity(110)
+ colored_icon.ChangeOpacity(render_alpha * 0.008)
if(color == "custom")
// Do a fun rainbow pattern to stand out while still being static.
colored_icon.Blend(icon('icons/effects/random_spawners.dmi', "rainbow"), ICON_MULTIPLY)
else
- colored_icon.Blend(color, ICON_MULTIPLY)
+ colored_icon.Blend(render_color, ICON_MULTIPLY)
colored_icon = blend_preview_floor(colored_icon)
Insert("[decal]_[dir]_[replacetext(color, "#", "")]", colored_icon)
diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm
index f42abf7a8365d..c2d37828d5e2c 100644
--- a/code/game/objects/items/binoculars.dm
+++ b/code/game/objects/items/binoculars.dm
@@ -12,7 +12,7 @@
var/zoom_out_amt = 5.5
var/zoom_amt = 10
-/obj/item/binoculars/ComponentInitialize()
+/obj/item/binoculars/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, wield_callback = CALLBACK(src, .proc/on_wield), unwield_callback = CALLBACK(src, .proc/on_unwield))
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 0426e92148eef..aedec6dc47321 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -200,7 +200,7 @@
rename_area(A, str)
to_chat(usr, span_notice("You rename the '[prevname]' to '[str]'."))
- log_game("[key_name(usr)] has renamed [prevname] to [str]")
+ usr.log_message("has renamed [prevname] to [str]", LOG_GAME)
A.update_areasize()
interact()
return TRUE
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index 0d0fa2a4fefa2..2eaa44d1b365d 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -15,7 +15,7 @@
if(iscarbon(loc))
Insert(loc)
-/obj/item/organ/internal/body_egg/Insert(mob/living/carbon/M, special = FALSE)
+/obj/item/organ/internal/body_egg/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
..()
ADD_TRAIT(owner, TRAIT_XENO_HOST, ORGAN_TRAIT)
ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, ORGAN_TRAIT)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index f020c0c5033bb..2d498e5aef058 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag_folded"
w_class = WEIGHT_CLASS_SMALL
+ ///Stored path we use for spawning a new body bag entity when unfolded.
var/unfoldedbag_path = /obj/structure/closet/body_bag
/obj/item/bodybag/attack_self(mob/user)
@@ -19,6 +20,11 @@
if(isopenturf(target))
deploy_bodybag(user, target)
+/**
+ * Creates a new body bag item when unfolded, at the provided location, replacing the body bag item.
+ * * mob/user: User opening the body bag.
+ * * atom/location: the place/entity/mob where the body bag is being deployed from.
+ */
/obj/item/bodybag/proc/deploy_bodybag(mob/user, atom/location)
var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location)
item_bag.open(user)
diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm
index 9a16bf7086374..3ca34b281d8d2 100644
--- a/code/game/objects/items/broom.dm
+++ b/code/game/objects/items/broom.dm
@@ -18,7 +18,7 @@
attack_verb_simple = list("sweep", "brush off", "bludgeon", "whack")
resistance_flags = FLAMMABLE
-/obj/item/pushbroom/ComponentInitialize()
+/obj/item/pushbroom/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, icon_wielded="[base_icon_state]1", wield_callback = CALLBACK(src, .proc/on_wield), unwield_callback = CALLBACK(src, .proc/on_unwield))
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 05d9e02963c64..cc3e5cdf6f51e 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -5,7 +5,7 @@
#define ID_ICON_BORDERS 1, 9, 32, 24
/// Fallback time if none of the config entries are set for USE_LOW_LIVING_HOUR_INTERN
-#define INTERN_THRESHOLD_FALLBACK_HOURS 15
+#define INTERN_THRESHOLD_FALLBACK_TIME (15 HOURS)
/// Max time interval between projecting holopays
#define HOLOPAY_PROJECTION_INTERVAL 7 SECONDS
@@ -935,10 +935,11 @@
if(!SSdbcore.Connect())
return
- var/intern_threshold = (CONFIG_GET(number/use_low_living_hour_intern_hours) * 60) || (CONFIG_GET(number/use_exp_restrictions_heads_hours) * 60) || INTERN_THRESHOLD_FALLBACK_HOURS * 60
- var/playtime = user.client.get_exp_living(pure_numeric = TRUE)
+ var/intern_threshold = (CONFIG_GET(number/use_low_living_hour_intern_hours) * (1 HOURS)) || (CONFIG_GET(number/use_exp_restrictions_heads_hours) * (1 HOURS)) || INTERN_THRESHOLD_FALLBACK_TIME
+ var/playtime = user.client.get_exp_living(pure_numeric = TRUE) //Pure numeric, so any values returned by this proc will be in minutes (via the DB).
- if((intern_threshold >= playtime) && (user.mind?.assigned_role.job_flags & JOB_CAN_BE_INTERN))
+ // The evaluation done here is done on the deciseconds level using the time defines.
+ if((intern_threshold >= (playtime MINUTES)) && (user.mind?.assigned_role.job_flags & JOB_CAN_BE_INTERN))
is_intern = TRUE
update_label()
return
@@ -1350,7 +1351,7 @@
if(!proximity)
return
- if(istype(target, /obj/item/card/id))
+ if(isidcard(target))
theft_target = WEAKREF(target)
ui_interact(user)
return
@@ -1361,7 +1362,7 @@
// If we're attacking a human, we want it to be covert. We're not ATTACKING them, we're trying
// to sneakily steal their accesses by swiping our agent ID card near them. As a result, we
// return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN to cancel any part of the following the attack chain.
- if(istype(target, /mob/living/carbon/human))
+ if(ishuman(target))
to_chat(user, "You covertly start to scan [target] with \the [src], hoping to pick up a wireless ID card signal...")
if(!do_mob(user, target, 2 SECONDS))
@@ -1382,7 +1383,7 @@
ui_interact(user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
- if(istype(target, /obj/item))
+ if(isitem(target))
var/obj/item/target_item = target
to_chat(user, "You covertly start to scan [target] with your [src], hoping to pick up a wireless ID card signal...")
@@ -1577,7 +1578,7 @@
update_icon()
forged = TRUE
to_chat(user, span_notice("You successfully forge the ID card."))
- log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".")
+ user.log_message("forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".", LOG_GAME)
if(!registered_account)
if(ishuman(user))
@@ -1594,7 +1595,7 @@
assignment = initial(assignment)
SSid_access.remove_trim_from_chameleon_card(src)
REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT)
- log_game("[key_name(user)] has reset \the [initial(name)] named \"[src]\" to default.")
+ user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME)
update_label()
update_icon()
forged = FALSE
@@ -1643,5 +1644,5 @@
desc = "A card used to identify members of the green team for CTF"
icon_state = "ctf_green"
-#undef INTERN_THRESHOLD_FALLBACK_HOURS
+#undef INTERN_THRESHOLD_FALLBACK_TIME
#undef ID_ICON_BORDERS
diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm
index cfea8758bf465..ca5ad8772d03e 100644
--- a/code/game/objects/items/chainsaw.dm
+++ b/code/game/objects/items/chainsaw.dm
@@ -24,9 +24,15 @@
toolspeed = 1.5 //Turn it on first you dork
var/on = FALSE
-/obj/item/chainsaw/ComponentInitialize()
+/obj/item/chainsaw/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE)
+ AddComponent(/datum/component/butchering, \
+ speed = 3 SECONDS, \
+ effectiveness = 100, \
+ bonus_modifier = 0, \
+ butcher_sound = 'sound/weapons/chainsawhit.ogg', \
+ disabled = TRUE, \
+ )
AddComponent(/datum/component/two_handed, require_twohands=TRUE)
/obj/item/chainsaw/suicide_act(mob/living/carbon/user)
@@ -57,7 +63,7 @@
toolspeed = on ? 0.5 : initial(toolspeed) //Turning it on halves the speed
if(src == user.get_active_held_item()) //update inhands
- user.update_inv_hands()
+ user.update_held_items()
update_action_buttons()
/obj/item/chainsaw/doomslayer
diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm
index c561a75c20c06..748a6c55593bd 100644
--- a/code/game/objects/items/charter.dm
+++ b/code/game/objects/items/charter.dm
@@ -48,8 +48,8 @@
if(!new_name)
return
- log_game("[key_name(user)] has proposed to name the station as \
- [new_name]")
+ user.log_message("has proposed to name the station as \
+ [new_name]", LOG_GAME)
if(standard_station_regex.Find(new_name))
to_chat(user, span_notice("Your name has been automatically approved."))
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 80946f6e0489d..80f1c9daee99b 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -87,7 +87,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(lit && M.ignite_mob())
message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(M)] on fire with [src] at [AREACOORD(user)]")
- log_game("[key_name(user)] set [key_name(M)] on fire with [src] at [AREACOORD(user)]")
+ user.log_message("set [key_name(M)] on fire with [src]", LOG_ATTACK)
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(!lit || !cig || user.combat_mode)
@@ -172,7 +172,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(starts_lit)
light()
AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), slot_flags) //90% to knock off when wearing a mask
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_MASK|ITEM_SLOT_HANDS)
icon_state = icon_off
inhand_icon_state = inhand_icon_off
@@ -203,7 +203,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
to_chat(user, span_warning("There is nothing to smoke!"))
-/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity)
+/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/cup/glass, mob/user, proximity)
. = ..()
if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead)
return
@@ -267,8 +267,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
//can't think of any other way to update the overlays :<
if(ismob(loc))
var/mob/M = loc
- M.update_inv_wear_mask()
- M.update_inv_hands()
+ M.update_worn_mask()
+ M.update_held_items()
/obj/item/clothing/mask/cigarette/extinguish()
if(!lit)
@@ -286,8 +286,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(ismob(loc))
var/mob/living/M = loc
to_chat(M, span_notice("Your [name] goes out."))
- M.update_inv_wear_mask()
- M.update_inv_hands()
+ M.update_worn_mask()
+ M.update_held_items()
/// Handles processing the reagents in the cigarette.
/obj/item/clothing/mask/cigarette/proc/handle_reagents()
@@ -609,7 +609,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
update_icon()
inhand_icon_state = icon_off
- user?.update_inv_wear_mask()
+ user?.update_worn_mask()
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/thing, mob/user, params)
@@ -799,7 +799,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
span_warning("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn [user.p_their()] finger in the process."),
span_warning("You burn yourself while lighting the lighter!")
)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "burnt_thumb", /datum/mood_event/burnt_thumb)
+ user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb)
/obj/item/lighter/attack(mob/living/carbon/M, mob/living/carbon/user)
diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm
index cdef67eb954fe..3238c5d1658a1 100644
--- a/code/game/objects/items/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/circuitboards/circuitboard.dm
@@ -19,6 +19,8 @@
var/build_path = null
///determines if the circuit board originated from a vendor off station or not.
var/onstation = TRUE
+ ///determines if the board requires specific levels of parts. (ie specifically a femto menipulator vs generic manipulator)
+ var/specific_parts = FALSE
/obj/item/circuitboard/Initialize(mapload)
if(name_extension)
@@ -116,10 +118,14 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
if(initial(stack_path.singular_name))
component_name = initial(stack_path.singular_name) //e.g. "glass sheet" vs. "glass"
- else if(ispath(component_path, /obj/item/stock_parts))
+ else if(ispath(component_path, /obj/item/stock_parts) && !specific_parts)
var/obj/item/stock_parts/stock_part = component_path
if(initial(stock_part.base_name))
component_name = initial(stock_part.base_name)
+ else if(ispath(component_path, /obj/item/stock_parts))
+ var/obj/item/stock_parts/stock_part = component_path
+ if(initial(stock_part.name))
+ component_name = initial(stock_part.name)
nice_list += list("[component_amount] [component_name]\s")
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index d2a2ec006fff4..934e055292f87 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -4,6 +4,7 @@
name = "Bluespace Artillery Generator"
greyscale_colors = CIRCUIT_COLOR_COMMAND
build_path = /obj/machinery/bsa/back //No freebies!
+ specific_parts = TRUE
req_components = list(
/obj/item/stock_parts/capacitor/quadratic = 5,
/obj/item/stack/cable_coil = 2)
@@ -12,6 +13,7 @@
name = "Bluespace Artillery Bore"
greyscale_colors = CIRCUIT_COLOR_COMMAND
build_path = /obj/machinery/bsa/front
+ specific_parts = TRUE
req_components = list(
/obj/item/stock_parts/manipulator/femto = 5,
/obj/item/stack/cable_coil = 2)
@@ -28,6 +30,7 @@
name = "DNA Vault"
greyscale_colors = CIRCUIT_COLOR_COMMAND
build_path = /obj/machinery/dna_vault //No freebies!
+ specific_parts = TRUE
req_components = list(
/obj/item/stock_parts/capacitor/super = 5,
/obj/item/stock_parts/manipulator/pico = 5,
@@ -370,7 +373,7 @@
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1,
- /obj/item/reagent_containers/glass/beaker = 2)
+ /obj/item/reagent_containers/cup/beaker = 2)
/obj/item/circuitboard/machine/circuit_imprinter/offstation
name = "Ancient Circuit Imprinter"
@@ -421,7 +424,7 @@
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 2,
- /obj/item/reagent_containers/glass/beaker = 2)
+ /obj/item/reagent_containers/cup/beaker = 2)
/obj/item/circuitboard/machine/protolathe/offstation
name = "Ancient Protolathe"
@@ -508,7 +511,7 @@
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 2,
- /obj/item/reagent_containers/glass/beaker = 2)
+ /obj/item/reagent_containers/cup/beaker = 2)
/obj/item/circuitboard/machine/techfab/department
name = "\improper Departmental Techfab"
@@ -616,6 +619,16 @@
/obj/item/stock_parts/micro_laser = 1
)
+/obj/item/circuitboard/machine/fax
+ name = "Fax Machine"
+ greyscale_colors = CIRCUIT_COLOR_GENERIC
+ build_path = /obj/machinery/fax
+ req_components = list(
+ /obj/item/stock_parts/subspace/crystal = 1,
+ /obj/item/stock_parts/scanning_module = 1,
+ /obj/item/stock_parts/micro_laser = 1,
+ /obj/item/stock_parts/manipulator = 1,)
+
//Medical
/obj/item/circuitboard/machine/chem_dispenser
@@ -687,7 +700,7 @@
build_path = /obj/machinery/chem_master
desc = "You can turn the \"mode selection\" dial using a screwdriver."
req_components = list(
- /obj/item/reagent_containers/glass/beaker = 2,
+ /obj/item/reagent_containers/cup/beaker = 2,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/sheet/glass = 1)
needs_anchored = FALSE
@@ -757,7 +770,7 @@
build_path = /obj/machinery/limbgrower
req_components = list(
/obj/item/stock_parts/manipulator = 1,
- /obj/item/reagent_containers/glass/beaker = 2,
+ /obj/item/reagent_containers/cup/beaker = 2,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/machine/limbgrower/fullupgrade
@@ -766,7 +779,7 @@
build_path = /obj/machinery/limbgrower
req_components = list(
/obj/item/stock_parts/manipulator/femto = 1,
- /obj/item/reagent_containers/glass/beaker/bluespace = 2,
+ /obj/item/reagent_containers/cup/beaker/bluespace = 2,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/machine/protolathe/department/medical
@@ -1349,3 +1362,15 @@
/obj/item/stack/sheet/plasteel = 5,
/obj/item/stock_parts/scanning_module = 4,
)
+
+/obj/item/circuitboard/machine/coffeemaker
+ name = "Coffeemaker (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SERVICE
+ build_path = /obj/machinery/coffeemaker
+ req_components = list(
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/reagent_containers/cup/beaker = 2,
+ /obj/item/stock_parts/water_recycler = 1,
+ /obj/item/stock_parts/capacitor = 1,
+ /obj/item/stock_parts/micro_laser = 1,
+ )
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index 5c93c5602bfc4..a41c27384fe5d 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -101,7 +101,7 @@
/obj/item/paper/fluff/stations/soap
name = "ancient janitorial poem"
desc = "An old paper that has passed many hands."
- info = "The legend of the omega soap
Essence of potato. Juice, not grind.
A lizard's tail, turned into wine.
powder of monkey, to help the workload.
Some Krokodil, because meth would explode.
Nitric acid and Baldium, for organic dissolving.
A cup filled with Hooch, for sinful absolving
Some Bluespace Dust, for removal of stains.
A syringe full of Pump-up, it's security's bane.
Add a can of Space Cola, because we've been paid.
Heat as hot as you can, let the soap be your blade.
Ten units of each reagent create a soap that could topple all others."
+ default_raw_text = "The legend of the omega soap
Essence of potato. Juice, not grind.
A lizard's tail, turned into wine.
powder of monkey, to help the workload.
Some Krokodil, because meth would explode.
Nitric acid and Baldium, for organic dissolving.
A cup filled with Hooch, for sinful absolving
Some Bluespace Dust, for removal of stains.
A syringe full of Pump-up, it's security's bane.
Add a can of Space Cola, because we've been paid.
Heat as hot as you can, let the soap be your blade.
Ten units of each reagent create a soap that could topple all others."
/obj/item/soap/suicide_act(mob/user)
@@ -190,7 +190,7 @@
if(user != M && ishuman(user))
var/mob/living/carbon/human/H = user
if (HAS_TRAIT(H, TRAIT_CLUMSY)) //only clowns can unlock its true powers
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk)
+ M.add_mood_event("honk", /datum/mood_event/honk)
return ..()
/obj/item/bikehorn/suicide_act(mob/user)
@@ -233,7 +233,7 @@
COOLDOWN_START(src, golden_horn_cooldown, 1 SECONDS)
//canned laughter
-/obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter
+/obj/item/reagent_containers/cup/soda_cans/canned_laughter
name = "Canned Laughter"
desc = "Just looking at this makes you want to giggle."
icon_state = "laughter"
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index acf4f8697994d..56f2db077f1d7 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -121,7 +121,7 @@
else
H.hairstyle = "Skinhead"
- H.update_hair(is_creating = TRUE)
+ H.update_body_parts()
playsound(loc, 'sound/items/welder2.ogg', 20, TRUE)
@@ -150,7 +150,7 @@
if(new_style && do_after(user, 60, target = H))
user.visible_message(span_notice("[user] successfully changes [H]'s facial hairstyle using [src]."), span_notice("You successfully change [H]'s facial hairstyle using [src]."))
H.facial_hairstyle = new_style
- H.update_hair(is_creating = TRUE)
+ H.update_body_parts()
return
else
return
@@ -201,7 +201,7 @@
if(new_style && do_after(user, 60, target = H))
user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src]."))
H.hairstyle = new_style
- H.update_hair(is_creating = TRUE)
+ H.update_body_parts()
return
else
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 817af31541dad..f6286b82a40ce 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -74,7 +74,7 @@
var/post_noise = FALSE
/obj/item/toy/crayon/proc/isValidSurface(surface)
- return istype(surface, /turf/open/floor)
+ return isfloorturf(surface)
/obj/item/toy/crayon/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!"))
@@ -440,6 +440,14 @@
else
..()
+/obj/item/toy/crayon/get_writing_implement_details()
+ return list(
+ interaction_mode = MODE_WRITING,
+ font = CRAYON_FONT,
+ color = paint_color,
+ use_bold = TRUE,
+ )
+
/obj/item/toy/crayon/red
name = "red crayon"
icon_state = "crayonred"
@@ -618,7 +626,7 @@
post_noise = FALSE
/obj/item/toy/crayon/spraycan/isValidSurface(surface)
- return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
+ return (isfloorturf(surface) || iswallturf(surface))
/obj/item/toy/crayon/spraycan/suicide_act(mob/user)
@@ -717,7 +725,7 @@
var/obj/item/target_item = target
var/mob/living/holder = target.loc
if(holder.is_holding(target_item))
- holder.update_inv_hands()
+ holder.update_held_items()
else
holder.update_clothing(target_item.slot_flags)
SEND_SIGNAL(target, COMSIG_OBJ_PAINTED, color_is_dark)
@@ -740,7 +748,7 @@
if(check_empty(user))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
- if(istype(target, /obj/item/bodypart) && actually_paints)
+ if(isbodypart(target) && actually_paints)
var/obj/item/bodypart/limb = target
if(!IS_ORGANIC_LIMB(limb))
var/list/skins = list()
@@ -827,7 +835,7 @@
volume_multiplier = 5
/obj/item/toy/crayon/spraycan/lubecan/isValidSurface(surface)
- return istype(surface, /turf/open/floor)
+ return isfloorturf(surface)
/obj/item/toy/crayon/spraycan/mimecan
name = "silent spraycan"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 3fb43247ce443..8651f21bf85a2 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -340,9 +340,9 @@
var/recharge_time = 6 SECONDS // Only applies to defibs that do not require a defibrilator. See: .proc/do_success
var/combat = FALSE //If it penetrates armor and gives additional functionality
-/obj/item/shockpaddles/ComponentInitialize()
+/obj/item/shockpaddles/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS|ITEM_SLOT_BACK)
AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12)
/obj/item/shockpaddles/Destroy()
@@ -636,7 +636,7 @@
H.emote("gasp")
H.set_timed_status_effect(200 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE)
SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life)
+ user.add_mood_event("saved_life", /datum/mood_event/saved_life)
log_combat(user, H, "revived", defib)
do_success()
return
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 343cabad61c71..0d73b7b8613da 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -136,7 +136,7 @@
/obj/effect/dummy/chameleon/attack_animal(mob/user, list/modifiers)
master.disrupt()
-/obj/effect/dummy/chameleon/attack_slime()
+/obj/effect/dummy/chameleon/attack_slime(mob/user, list/modifiers)
master.disrupt()
/obj/effect/dummy/chameleon/attack_alien(mob/user, list/modifiers)
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 76a7e2b839348..999b8d1dfd5fd 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -87,7 +87,7 @@
/obj/item/geiger_counter/dropped(mob/user, silent = FALSE)
. = ..()
- UnregisterSignal(user, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation)
+ UnregisterSignal(user, COMSIG_IN_RANGE_OF_IRRADIATION)
/obj/item/geiger_counter/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target)
SIGNAL_HANDLER
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
deleted file mode 100644
index b623dd5c63a9c..0000000000000
--- a/code/game/objects/items/devices/paicard.dm
+++ /dev/null
@@ -1,231 +0,0 @@
-/obj/item/paicard
- name = "personal AI device"
- icon = 'icons/obj/aicards.dmi'
- icon_state = "pai"
- inhand_icon_state = "electronic"
- worn_icon_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- w_class = WEIGHT_CLASS_SMALL
- slot_flags = ITEM_SLOT_BELT
- custom_premium_price = PAYCHECK_COMMAND * 1.25
- resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE
-
- /// Spam alert prevention
- var/alert_cooldown
- /// If the pAIcard is slotted in a PDA
- var/slotted = FALSE
- /// Any pAI personalities inserted
- var/mob/living/silicon/pai/pai
- ///what emotion icon we have. handled in /mob/living/silicon/pai/Topic()
- var/emotion_icon = "off"
-
-/obj/item/paicard/suicide_act(mob/living/user)
- user.visible_message(span_suicide("[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!"))
- return OXYLOSS
-
-/obj/item/paicard/Initialize(mapload)
- SSpai.pai_card_list += src
- . = ..()
- update_appearance()
-
-/obj/item/paicard/vv_edit_var(vname, vval)
- . = ..()
- if(vname == NAMEOF(src, emotion_icon))
- update_appearance()
-
-/obj/item/paicard/handle_atom_del(atom/A)
- if(A == pai) //double check /mob/living/silicon/pai/Destroy() if you change these.
- pai = null
- emotion_icon = initial(emotion_icon)
- update_appearance()
- return ..()
-
-/obj/item/paicard/update_overlays()
- . = ..()
- . += "pai-[emotion_icon]"
- if(pai?.hacking_cable)
- . += "[initial(icon_state)]-connector"
-
-/obj/item/paicard/Destroy()
- //Will stop people throwing friend pAIs into the singularity so they can respawn
- SSpai.pai_card_list -= src
- if(!QDELETED(pai))
- QDEL_NULL(pai)
- return ..()
-
-/obj/item/paicard/attack_self(mob/user)
- if (!in_range(src, user))
- return
- user.set_machine(src)
- ui_interact(user)
-
-/obj/item/paicard/ui_interact(mob/user, datum/tgui/ui)
- . = ..()
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "PaiCard")
- ui.open()
-
-/obj/item/paicard/ui_state(mob/user)
- return GLOB.paicard_state
-
-/obj/item/paicard/ui_data(mob/user)
- . = ..()
- var/list/data = list()
- data["candidates"] = list()
- if(!pai)
- data["candidates"] = pool_candidates()
- data["pai"] = null
- return data
- data["pai"] = list()
- data["pai"]["can_holo"] = pai.canholo
- data["pai"]["dna"] = pai.master_dna
- data["pai"]["emagged"] = pai.emagged
- data["pai"]["laws"] = pai.laws.supplied
- data["pai"]["master"] = pai.master
- data["pai"]["name"] = pai.name
- data["pai"]["transmit"] = pai.can_transmit
- data["pai"]["receive"] = pai.can_receive
- return data
-
-/obj/item/paicard/ui_act(action, list/params)
- . = ..()
- if(.)
- return FALSE
- switch(action)
- if("download")
- /// The individual candidate to download
- var/datum/pai_candidate/candidate
- for(var/datum/pai_candidate/checked_candidate as anything in SSpai.candidates)
- if(params["key"] == checked_candidate.key)
- candidate = checked_candidate
- break
- if(isnull(candidate))
- return FALSE
- if(pai)
- return FALSE
- if(SSpai.check_ready(candidate) != candidate)
- return FALSE
- /// The newly downloaded pAI personality
- var/mob/living/silicon/pai/new_pai = new(src)
- new_pai.name = candidate.name || pick(GLOB.ninja_names)
- new_pai.real_name = new_pai.name
- new_pai.key = candidate.key
- setPersonality(new_pai)
- SSpai.candidates -= candidate
- if("fix_speech")
- to_chat(pai, span_notice("Your owner has corrected your speech modulation!"))
- to_chat(usr, span_notice("You fix the pAI's speech modulator."))
- for(var/effect in typesof(/datum/status_effect/speech))
- pai.remove_status_effect(effect)
-
- if("request")
- if(!pai)
- SSpai.findPAI(src, usr)
- if("set_dna")
- if(pai.master_dna)
- return
- if(!iscarbon(usr))
- to_chat(usr, span_warning("You don't have any DNA, or your DNA is incompatible with this device!"))
- else
- var/mob/living/carbon/master = usr
- pai.master = master.real_name
- pai.master_dna = master.dna.unique_enzymes
- to_chat(pai, span_notice("You have been bound to a new master."))
- pai.emittersemicd = FALSE
- if("set_laws")
- var/newlaws = tgui_input_text(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1], MAX_MESSAGE_LEN, TRUE)
- if(newlaws && pai)
- pai.add_supplied_law(0,newlaws)
- if("toggle_holo")
- if(pai.canholo)
- to_chat(pai, span_warning("Your owner has disabled your holomatrix projectors!"))
- pai.canholo = FALSE
- to_chat(usr, span_notice("You disable your pAI's holomatrix!"))
- else
- to_chat(pai, span_notice("Your owner has enabled your holomatrix projectors!"))
- pai.canholo = TRUE
- to_chat(usr, span_notice("You enable your pAI's holomatrix!"))
- if("toggle_radio")
- var/transmitting = params["option"] == "transmit" //it can't be both so if we know it's not transmitting it must be receiving.
- var/transmit_holder = (transmitting ? WIRE_TX : WIRE_RX)
- if(transmitting)
- pai.can_transmit = !pai.can_transmit
- else //receiving
- pai.can_receive = !pai.can_receive
- pai.radio.wires.cut(transmit_holder)//wires.cut toggles cut and uncut states
- transmit_holder = (transmitting ? pai.can_transmit : pai.can_receive) //recycling can be fun!
- to_chat(usr, span_notice("You [transmit_holder ? "enable" : "disable"] your pAI's [transmitting ? "outgoing" : "incoming"] radio transmissions!"))
- to_chat(pai, span_notice("Your owner has [transmit_holder ? "enabled" : "disabled"] your [transmitting ? "outgoing" : "incoming"] radio transmissions!"))
- if("wipe_pai")
- var/confirm = tgui_alert(usr, "Are you certain you wish to delete the current personality? This action cannot be undone.", "Personality Wipe", list("Yes", "No"))
- if(confirm != "Yes")
- return
- if(!pai)
- return
- to_chat(pai, span_warning("You feel yourself slipping away from reality."))
- to_chat(pai, span_danger("Byte by byte you lose your sense of self."))
- to_chat(pai, span_userdanger("Your mental faculties leave you."))
- to_chat(pai, span_rose("oblivion... "))
- qdel(pai)
- return
-
-// WIRE_SIGNAL = 1
-// WIRE_RECEIVE = 2
-// WIRE_TRANSMIT = 4
-
-/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
- pai = personality
- emotion_icon = "null"
- update_appearance()
-
- playsound(loc, 'sound/effects/pai_boot.ogg', 50, TRUE, -1)
- audible_message("\The [src] plays a cheerful startup noise!")
-
-/obj/item/paicard/proc/alertUpdate()
- if(!COOLDOWN_FINISHED(src, alert_cooldown))
- return
- COOLDOWN_START(src, alert_cooldown, 5 SECONDS)
- add_alert()
- addtimer(CALLBACK(src, .proc/remove_alert), 5 SECONDS)
- playsound(src, 'sound/machines/ping.ogg', 30, TRUE)
- loc.visible_message(span_info("[src] flashes a message across its screen, \"Additional personalities available for download.\""), blind_message = span_notice("[src] vibrates with an alert."))
-
-/obj/item/paicard/proc/add_alert()
- add_overlay(
- list(mutable_appearance(icon, "[initial(icon_state)]-alert"),
- emissive_appearance(icon, "[initial(icon_state)]-alert", alpha = src.alpha)))
-
-/obj/item/paicard/proc/remove_alert()
- cut_overlays()
-
-/obj/item/paicard/emp_act(severity)
- . = ..()
- if (. & EMP_PROTECT_SELF)
- return
- if(pai && !pai.holoform)
- pai.emp_act(severity)
-
-/**
- * Gathers a list of candidates to display in the download candidate
- * window. If the candidate isn't marked ready, ie they have not
- * pressed submit, they will be skipped over.
- *
- * @return - An array of candidate objects.
- */
-/obj/item/paicard/proc/pool_candidates()
- /// Array of pAI candidates
- var/list/candidates = list()
- if(length(SSpai.candidates))
- for(var/datum/pai_candidate/checked_candidate as anything in SSpai.candidates)
- if(!checked_candidate.ready)
- continue
- /// The object containing the candidate data.
- var/list/candidate = list()
- candidate["comments"] = checked_candidate.comments
- candidate["description"] = checked_candidate.description
- candidate["key"] = checked_candidate.key
- candidate["name"] = checked_candidate.name
- candidates += list(candidate)
- return candidates
diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm
index a5b634fe61a93..519dd4c8f9e39 100644
--- a/code/game/objects/items/devices/portable_chem_mixer.dm
+++ b/code/game/objects/items/devices/portable_chem_mixer.dm
@@ -18,15 +18,15 @@
///If the UI has the pH meter shown
var/show_ph = TRUE
-/obj/item/storage/portable_chem_mixer/Initialize()
+/obj/item/storage/portable_chem_mixer/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 200
atom_storage.max_slots = 50
atom_storage.set_holdable(list(
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
- /obj/item/reagent_containers/food/drinks/waterbottle,
- /obj/item/reagent_containers/food/condiment,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
+ /obj/item/reagent_containers/cup/glass/waterbottle,
+ /obj/item/reagent_containers/condiment,
))
/obj/item/storage/portable_chem_mixer/Destroy()
@@ -38,7 +38,7 @@
return ..()
/obj/item/storage/portable_chem_mixer/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container() && atom_storage.locked)
+ if (is_reagent_container(I) && !(I.item_flags & ABSTRACT) && I.is_open_container() && atom_storage.locked)
var/obj/item/reagent_containers/B = I
. = TRUE //no afterattack
if(!user.transferItemToLoc(B, src))
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 905e7fdecaba6..869215ef5ed68 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -123,7 +123,7 @@
span_notice("You activate \the [src]."),
span_hear("You hear a click."))
message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(src)]")
- log_game("Power sink activated by [key_name(user)] at [AREACOORD(src)]")
+ user.log_message("activated a powersink", LOG_GAME)
set_mode(OPERATING)
if(OPERATING)
@@ -131,6 +131,7 @@
"[user] deactivates \the [src]!", \
span_notice("You deactivate \the [src]."),
span_hear("You hear a click."))
+ user.log_message("deactivated the powersink", LOG_GAME)
set_mode(CLAMPED_OFF)
/// Removes internal heat and shares it with the atmosphere.
diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm
index 146dedb0d15b9..707e07a0d5adf 100644
--- a/code/game/objects/items/devices/pressureplates.dm
+++ b/code/game/objects/items/devices/pressureplates.dm
@@ -59,7 +59,7 @@
sigdev.signal()
/obj/item/pressure_plate/attackby(obj/item/I, mob/living/L)
- if(istype(I, /obj/item/assembly/signaler) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
+ if(issignaler(I) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
sigdev = I
to_chat(L, span_notice("You attach [I] to [src]!"))
return ..()
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 7797a451d91ef..4b50ee9d8e0fc 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -2,7 +2,7 @@
name = "standard encryption key"
desc = "An encryption key for a radio headset."
icon = 'icons/obj/radio.dmi'
- icon_state = "cypherkey"
+ icon_state = "cypherkey_basic"
w_class = WEIGHT_CLASS_TINY
/// Can this radio key access the binary radio channel?
var/translate_binary = FALSE
@@ -13,6 +13,8 @@
/// What channels does this encryption key grant to the parent headset.
var/list/channels = list()
var/datum/language/translated_language
+ greyscale_config = /datum/greyscale_config/encryptionkey_basic
+ greyscale_colors = "#820a16#3758c4"
/obj/item/encryptionkey/Initialize(mapload)
. = ..()
@@ -33,116 +35,160 @@
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
- icon_state = "syn_cypherkey"
+ icon_state = "cypherkey_syndicate"
channels = list(RADIO_CHANNEL_SYNDICATE = 1)
syndie = TRUE
+ greyscale_config = /datum/greyscale_config/encryptionkey_syndicate
+ greyscale_colors = "#171717#990000"
/obj/item/encryptionkey/binary
name = "binary translator key"
- icon_state = "bin_cypherkey"
+ icon_state = "cypherkey_basic"
translate_binary = TRUE
translated_language = /datum/language/machine
+ greyscale_config = /datum/greyscale_config/encryptionkey_basic
+ greyscale_colors = "#24a157#3758c4"
/obj/item/encryptionkey/headset_sec
name = "security radio encryption key"
- icon_state = "sec_cypherkey"
+ icon_state = "cypherkey_security"
channels = list(RADIO_CHANNEL_SECURITY = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_security
+ greyscale_colors = "#820a16#280b1a"
/obj/item/encryptionkey/headset_eng
name = "engineering radio encryption key"
- icon_state = "eng_cypherkey"
+ icon_state = "cypherkey_engineering"
channels = list(RADIO_CHANNEL_ENGINEERING = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_engineering
+ greyscale_colors = "#f8d860#dca01b"
/obj/item/encryptionkey/headset_rob
name = "robotics radio encryption key"
- icon_state = "rob_cypherkey"
+ icon_state = "cypherkey_engineering"
channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_ENGINEERING = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_engineering
+ greyscale_colors = "#793a80#dca01b"
/obj/item/encryptionkey/headset_med
name = "medical radio encryption key"
- icon_state = "med_cypherkey"
+ icon_state = "cypherkey_medical"
channels = list(RADIO_CHANNEL_MEDICAL = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_medical
+ greyscale_colors = "#ebebeb#69abd1"
/obj/item/encryptionkey/headset_sci
name = "science radio encryption key"
- icon_state = "sci_cypherkey"
+ icon_state = "cypherkey_research"
channels = list(RADIO_CHANNEL_SCIENCE = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_research
+ greyscale_colors = "#793a80#bc4a9b"
/obj/item/encryptionkey/headset_medsci
name = "medical research radio encryption key"
- icon_state = "medsci_cypherkey"
+ icon_state = "cypherkey_medical"
channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_medical
+ greyscale_colors = "#ebebeb#9d1de8"
/obj/item/encryptionkey/headset_srvsec
name = "law and order radio encryption key"
- icon_state = "srvsec_cypherkey"
+ icon_state = "cypherkey_service"
channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_SECURITY = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_service
+ greyscale_colors = "#820a16#3bca5a"
/obj/item/encryptionkey/headset_srvmed
name = "psychology radio encryption key"
- icon_state = "srvmed_cypherkey"
+ icon_state = "cypherkey_service"
channels = list(RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SERVICE = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_service
+ greyscale_colors = "#ebebeb#3bca5a"
/obj/item/encryptionkey/headset_com
name = "command radio encryption key"
- icon_state = "com_cypherkey"
+ icon_state = "cypherkey_cube"
channels = list(RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cube
+ greyscale_colors = "#2b2793#67a552"
/obj/item/encryptionkey/heads/captain
name = "\proper the captain's encryption key"
- icon_state = "cap_cypherkey"
+ icon_state = "cypherkey_cube"
channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 0, RADIO_CHANNEL_SCIENCE = 0, RADIO_CHANNEL_MEDICAL = 0, RADIO_CHANNEL_SUPPLY = 0, RADIO_CHANNEL_SERVICE = 0)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cube
+ greyscale_colors = "#2b2793#dca01b"
/obj/item/encryptionkey/heads/rd
name = "\proper the research director's encryption key"
- icon_state = "rd_cypherkey"
+ icon_state = "cypherkey_research"
channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_research
+ greyscale_colors = "#bc4a9b#793a80"
/obj/item/encryptionkey/heads/hos
name = "\proper the head of security's encryption key"
- icon_state = "hos_cypherkey"
+ icon_state = "cypherkey_security"
channels = list(RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_security
+ greyscale_colors = "#280b1a#820a16"
/obj/item/encryptionkey/heads/ce
name = "\proper the chief engineer's encryption key"
- icon_state = "ce_cypherkey"
+ icon_state = "cypherkey_engineering"
channels = list(RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_engineering
+ greyscale_colors = "#dca01b#f8d860"
/obj/item/encryptionkey/heads/cmo
name = "\proper the chief medical officer's encryption key"
- icon_state = "cmo_cypherkey"
+ icon_state = "cypherkey_medical"
channels = list(RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_medical
+ greyscale_colors = "#ebebeb#2b2793"
/obj/item/encryptionkey/heads/hop
name = "\proper the head of personnel's encryption key"
- icon_state = "hop_cypherkey"
+ icon_state = "cypherkey_cube"
channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cube
+ greyscale_colors = "#2b2793#c2c1c9"
/obj/item/encryptionkey/heads/qm
name = "\proper the quartermaster's encryption key"
- icon_state = "cargo_cypherkey"
+ icon_state = "cypherkey_cargo"
channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_COMMAND = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cargo
+ greyscale_colors = "#49241a#dca01b"
/obj/item/encryptionkey/headset_cargo
name = "supply radio encryption key"
- icon_state = "cargo_cypherkey"
+ icon_state = "cypherkey_cargo"
channels = list(RADIO_CHANNEL_SUPPLY = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cargo
+ greyscale_colors = "#49241a#7b3f2e"
/obj/item/encryptionkey/headset_mining
name = "mining radio encryption key"
- icon_state = "cargo_cypherkey"
+ icon_state = "cypherkey_cargo"
channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SCIENCE = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_cargo
+ greyscale_colors = "#49241a#bc4a9b"
/obj/item/encryptionkey/headset_service
name = "service radio encryption key"
- icon_state = "srv_cypherkey"
+ icon_state = "cypherkey_service"
channels = list(RADIO_CHANNEL_SERVICE = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_service
+ greyscale_colors = "#3758c4#3bca5a"
/obj/item/encryptionkey/headset_cent
name = "\improper CentCom radio encryption key"
- icon_state = "cent_cypherkey"
+ icon_state = "cypherkey_centcom"
independent = TRUE
channels = list(RADIO_CHANNEL_CENTCOM = 1)
+ greyscale_config = /datum/greyscale_config/encryptionkey_centcom
+ greyscale_colors = "#24a157#dca01b"
/obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1)
@@ -155,27 +201,37 @@
desc = "An encryption key that automatically encodes moffic heard through the radio into common. The signal's a little fuzzy."
icon_state = "translation_cypherkey"
translated_language = /datum/language/moffic
+ greyscale_config = null
+ greyscale_colors = null
/obj/item/encryptionkey/tiziran
name = "\improper Tiziran translation key"
desc = "An encryption key that automatically encodes draconic heard through the radio into common. The signal's not quite to scale."
icon_state = "translation_cypherkey"
translated_language = /datum/language/draconic
+ greyscale_config = null
+ greyscale_colors = null
/obj/item/encryptionkey/plasmaman
name = "\improper Calcic translation key"
desc = "An encryption key that automatically encodes calcic heard through the radio into common. The signal lacks a bit of teeth."
icon_state = "translation_cypherkey"
translated_language = /datum/language/calcic
+ greyscale_config = null
+ greyscale_colors = null
/obj/item/encryptionkey/ethereal
name = "\improper Ethereal translation key"
desc = "An encryption key that automatically encodes ethereal heard through the radio into common. The signal's overpowering."
icon_state = "translation_cypherkey"
translated_language = /datum/language/voltaic
+ greyscale_config = null
+ greyscale_colors = null
/obj/item/encryptionkey/felinid
name = "\improper Felinid translation key"
desc = "An encryption key that automatically encodes nekomimetic heard through the radio into common. The signal's rather scratchy."
icon_state = "translation_cypherkey"
translated_language = /datum/language/nekomimetic
+ greyscale_config = null
+ greyscale_colors = null
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 05a6442825e65..36d7728831dd0 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -104,13 +104,17 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops
+/obj/item/radio/headset/syndicate/Initialize(mapload)
+ . = ..()
+ make_syndie()
+
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs."
icon_state = "syndie_headset"
inhand_icon_state = "syndie_headset"
-/obj/item/radio/headset/syndicate/alt/ComponentInitialize()
+/obj/item/radio/headset/syndicate/alt/Initialize(mapload)
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
@@ -118,11 +122,8 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "team leader headset"
command = TRUE
-/obj/item/radio/headset/syndicate/Initialize(mapload)
- . = ..()
- make_syndie()
-
/obj/item/radio/headset/binary
+
/obj/item/radio/headset/binary/Initialize(mapload)
. = ..()
qdel(keyslot)
@@ -141,7 +142,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
icon_state = "sec_headset_alt"
inhand_icon_state = "sec_headset_alt"
-/obj/item/radio/headset/headset_sec/alt/ComponentInitialize()
+/obj/item/radio/headset/headset_sec/alt/Initialize(mapload)
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
@@ -208,7 +209,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
icon_state = "com_headset_alt"
inhand_icon_state = "com_headset_alt"
-/obj/item/radio/headset/heads/captain/alt/ComponentInitialize()
+/obj/item/radio/headset/heads/captain/alt/Initialize(mapload)
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
@@ -230,7 +231,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
icon_state = "com_headset_alt"
inhand_icon_state = "com_headset_alt"
-/obj/item/radio/headset/heads/hos/alt/ComponentInitialize()
+/obj/item/radio/headset/heads/hos/alt/Initialize(mapload)
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
@@ -297,7 +298,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
inhand_icon_state = "cent_headset_alt"
keyslot = null
-/obj/item/radio/headset/headset_cent/alt/ComponentInitialize()
+/obj/item/radio/headset/headset_cent/alt/Initialize(mapload)
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index e5a6987d93365..765d9e487efcc 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -546,6 +546,6 @@
/obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
dog_fashion = /datum/dog_fashion/back
-/obj/item/radio/off/Initialize()
+/obj/item/radio/off/Initialize(mapload)
. = ..()
set_listening(FALSE)
diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm
index 5e923c21c633a..01262eca0057a 100644
--- a/code/game/objects/items/devices/scanners/gas_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm
@@ -194,7 +194,7 @@
/obj/item/analyzer/ranged
desc = "A hand-held long-range environmental scanner which reports current gas levels."
- name = "Long-range gas analyzer"
+ name = "long-range gas analyzer"
icon_state = "analyzerranged"
w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron = 100, /datum/material/glass = 20, /datum/material/gold = 300, /datum/material/bluespace=200)
@@ -202,6 +202,6 @@
/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
- if(!can_see(user, target, 7))
+ if(!can_see(user, target, 15))
return
- atmos_scan(user, target)
+ atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target)))
diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm
index 0fa659d49539d..58c9a2867836e 100644
--- a/code/game/objects/items/devices/spyglasses.dm
+++ b/code/game/objects/items/devices/spyglasses.dm
@@ -22,11 +22,11 @@
/obj/item/clothing/glasses/sunglasses/spy/equipped(mob/user, slot)
. = ..()
if(slot != ITEM_SLOT_EYES)
- user.client.close_popup("spypopup")
+ user.client?.close_popup("spypopup")
/obj/item/clothing/glasses/sunglasses/spy/dropped(mob/user)
. = ..()
- user.client.close_popup("spypopup")
+ user.client?.close_popup("spypopup")
/obj/item/clothing/glasses/sunglasses/spy/ui_action_click(mob/user)
show_to_user(user)
@@ -102,7 +102,7 @@
name = "Espionage For Dummies"
color = "#FFFF00"
desc = "An eye gougingly yellow pamphlet with a badly designed image of a detective on it. the subtext says \" The Latest way to violate privacy guidelines!\" "
- info = @{"
+ default_raw_text = @{"
Thank you for your purchase of the Nerd Co SpySpeks tm, this paper will be your quick-start guide to violating the privacy of your crewmates in three easy steps!
Step One: Nerd Co SpySpeks tm upon your face.
Step Two: Place the included "ProfitProtektor tm" camera assembly in a place of your choosing - make sure to make heavy use of it's inconspicous design!
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 5fce6a12f3e9d..97280d6c2c83f 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -247,7 +247,7 @@
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14 SECONDS)
sleep(1 SECONDS)
- say("Skipping [playsleepseconds] seconds of silence.")
+ say("Skipping [playsleepseconds/10] seconds of silence.")
playsleepseconds = 1 SECONDS
i++
@@ -283,9 +283,8 @@
set name = "Print Transcript"
set category = "Object"
- if(!mytape.storedinfo.len)
- return
- if(!can_use(usr))
+ var/list/transcribed_info = mytape.storedinfo
+ if(!length(transcribed_info))
return
if(!mytape)
return
@@ -294,23 +293,49 @@
return
if(recording || playing)
return
+ if(!can_use(usr))
+ return
+
+ var/transcribed_text = "Transcript:
"
+ var/page_count = 1
+
+ var/tape_name = mytape.name
+ var/initial_tape_name = initial(mytape.name)
+ var/paper_name = "paper- '[tape_name == initial_tape_name ? "Tape" : "[tape_name]"] Transcript'"
+
+ for(var/transcript_excerpt in transcribed_info)
+ var/excerpt_length = length(transcript_excerpt)
- say("Transcript printed.")
+ // Very unexpected. Better abort non-gracefully.
+ if(excerpt_length > MAX_PAPER_LENGTH)
+ say("Error: Data corruption detected. Cannot print.")
+ CRASH("Transcript entry has more than [MAX_PAPER_LENGTH] chars: [excerpt_length] chars")
+
+ // If we're going to overflow the paper's length, print the current transcribed text out first and reset to prevent us
+ // going over the paper char count.
+ if((length(transcribed_text) + excerpt_length) > MAX_PAPER_LENGTH)
+ var/obj/item/paper/transcript_paper = new /obj/item/paper(get_turf(src))
+ transcript_paper.add_raw_text(transcribed_text)
+ transcript_paper.name = "[paper_name] page [page_count]"
+ transcript_paper.update_appearance()
+ transcribed_text = ""
+ page_count++
+
+ transcribed_text += "[transcript_excerpt]
"
+
+ var/obj/item/paper/transcript_paper = new /obj/item/paper(get_turf(src))
+ transcript_paper.add_raw_text(transcribed_text)
+ transcript_paper.name = "[paper_name] page [page_count]"
+ transcript_paper.update_appearance()
+
+ say("Transcript printed, [page_count] pages.")
playsound(src, 'sound/items/taperecorder/taperecorder_print.ogg', 50, FALSE)
- var/obj/item/paper/P = new /obj/item/paper(get_turf(src))
- var/t1 = "Transcript:
"
- for(var/i in 1 to mytape.storedinfo.len)
- t1 += "[mytape.storedinfo[i]]
"
- P.info = t1
- var/tapename = mytape.name
- var/prototapename = initial(mytape.name)
- P.name = "paper- '[tapename == prototapename ? "Tape" : "[tapename]"] Transcript'"
- P.update_icon_state()
- usr.put_in_hands(P)
+
+ // Can't put the entire stack into their hands if there's multple pages, but hey we can at least put one page in.
+ usr.put_in_hands(transcript_paper)
canprint = FALSE
addtimer(VARSET_CALLBACK(src, canprint, TRUE), 30 SECONDS)
-
//empty tape recorders
/obj/item/taperecorder/empty
starting_tape_type = null
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index ffa3d112aa836..fe060bf87e043 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -35,6 +35,7 @@ effective or pretty fucking useless.
/obj/item/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(!user) return
+
if(times_used >= max_uses)
to_chat(user, span_danger("The mind batterer has been burnt out!"))
return
@@ -78,12 +79,15 @@ effective or pretty fucking useless.
/obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
if(!stealth || !irradiate)
..()
+
if(!irradiate)
return
+
var/mob/living/carbon/human/human_target = M
if(istype(human_target) && !used && SSradiation.wearing_rad_protected_clothing(human_target)) //intentionally not checking for TRAIT_RADIMMUNE here so that tatortot can still fuck up and waste their cooldown.
to_chat(user, span_warning("[M]'s clothing is fully protecting [M.p_them()] from irradiation!"))
return
+
if(!used)
log_combat(user, M, "irradiated", src)
var/cooldown = get_cooldown()
@@ -94,11 +98,13 @@ effective or pretty fucking useless.
to_chat(user, span_warning("Successfully irradiated [M]."))
addtimer(CALLBACK(src, .proc/radiation_aftereffect, M, intensity), (wavelength+(intensity*4))*5)
return
+
to_chat(user, span_warning("The radioactive microlaser is still recharging."))
/obj/item/healthanalyzer/rad_laser/proc/radiation_aftereffect(mob/living/M, passed_intensity)
if(QDELETED(M) || !ishuman(M) || HAS_TRAIT(M, TRAIT_RADIMMUNE))
return
+
if(passed_intensity >= 5)
M.apply_effect(round(passed_intensity/0.075), EFFECT_UNCONSCIOUS) //to save you some math, this is a round(intensity * (4/3)) second long knockout
@@ -140,45 +146,57 @@ effective or pretty fucking useless.
if("irradiate")
irradiate = !irradiate
. = TRUE
+
if("stealth")
stealth = !stealth
. = TRUE
+
if("scanmode")
scanmode = !scanmode
. = TRUE
+
if("radintensity")
var/target = params["target"]
var/adjust = text2num(params["adjust"])
if(target == "min")
target = 1
. = TRUE
+
else if(target == "max")
target = 20
. = TRUE
+
else if(adjust)
target = intensity + adjust
. = TRUE
+
else if(text2num(target) != null)
target = text2num(target)
. = TRUE
+
if(.)
target = round(target)
intensity = clamp(target, 1, 20)
+
if("radwavelength")
var/target = params["target"]
var/adjust = text2num(params["adjust"])
if(target == "min")
target = 0
. = TRUE
+
else if(target == "max")
target = 120
. = TRUE
+
else if(adjust)
target = wavelength + adjust
. = TRUE
+
else if(text2num(target) != null)
target = text2num(target)
. = TRUE
+
if(.)
target = round(target)
wavelength = clamp(target, 0, 120)
@@ -204,8 +222,10 @@ effective or pretty fucking useless.
if(user.get_item_by_slot(ITEM_SLOT_BELT) == src)
if(!on)
Activate(usr)
+
else
Deactivate()
+
return
/obj/item/shadowcloak/item_action_slot_check(slot, mob/user)
@@ -215,6 +235,7 @@ effective or pretty fucking useless.
/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user)
if(!user)
return
+
to_chat(user, span_notice("You activate [src]."))
src.user = user
START_PROCESSING(SSobj, src)
@@ -225,6 +246,7 @@ effective or pretty fucking useless.
STOP_PROCESSING(SSobj, src)
if(user)
user.alpha = initial(user.alpha)
+
on = FALSE
user = null
@@ -237,13 +259,17 @@ effective or pretty fucking useless.
if(user.get_item_by_slot(ITEM_SLOT_BELT) != src)
Deactivate()
return
+
var/turf/T = get_turf(src)
if(on)
var/lumcount = T.get_lumcount()
+
if(lumcount > 0.3)
charge = max(0, charge - 12.5 * delta_time)//Quick decrease in light
+
else
charge = min(max_charge, charge + 25 * delta_time) //Charge in the dark
+
animate(user,alpha = clamp(255 - charge,0,255),time = 10)
@@ -260,8 +286,10 @@ effective or pretty fucking useless.
active = !active
if(active)
GLOB.active_jammers |= src
+
else
GLOB.active_jammers -= src
+
update_appearance()
/obj/item/storage/toolbox/emergency/turret
@@ -276,16 +304,28 @@ effective or pretty fucking useless.
new /obj/item/wirecutters(src)
/obj/item/storage/toolbox/emergency/turret/attackby(obj/item/attacking_item, mob/living/user, params)
- if(attacking_item.tool_behaviour == TOOL_WRENCH && user.combat_mode && attacking_item.use_tool(src, user, 2 SECONDS, volume = 50))
- user.visible_message(span_danger("[user] bashes [src] with [attacking_item]!"), \
- span_danger("You bash [src] with [attacking_item]!"), null, COMBAT_MESSAGE_RANGE)
- playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1)
- var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc))
- set_faction(turret, user)
- turret.toolbox = src
- forceMove(turret)
+ if(!istype(attacking_item, /obj/item/wrench/combat))
+ return ..()
+
+ if(!user.combat_mode)
+ return
+
+ if(!attacking_item.toolspeed)
return
- return ..()
+
+ balloon_alert(user, "constructing...")
+ if(!attacking_item.use_tool(src, user, 2 SECONDS, volume = 20))
+ return
+
+ balloon_alert(user, "constructed!")
+ user.visible_message(span_danger("[user] bashes [src] with [attacking_item]!"), \
+ span_danger("You bash [src] with [attacking_item]!"), null, COMBAT_MESSAGE_RANGE)
+
+ playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1)
+ var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc))
+ set_faction(turret, user)
+ turret.toolbox = src
+ forceMove(turret)
/obj/item/storage/toolbox/emergency/turret/proc/set_faction(obj/machinery/porta_turret/turret, mob/user)
turret.faction = list("[REF(user)]")
@@ -321,29 +361,51 @@ effective or pretty fucking useless.
/obj/machinery/porta_turret/syndicate/toolbox/target(atom/movable/target)
if(!target)
return
+
if(shootAt(target))
setDir(get_dir(base, target))
+
return TRUE
/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, params)
- if(istype(attacking_item, /obj/item/wrench/combat))
- if(user.combat_mode && attacking_item.toolspeed && attacking_item.use_tool(src, user, 5 SECONDS, volume = 20))
- deconstruct(TRUE)
- attacking_item.play_tool_sound(src, 50)
- else if(!user.combat_mode)
- to_chat(user, span_notice("You start repairing [src]..."))
- while(atom_integrity != max_integrity && attacking_item.toolspeed && attacking_item.use_tool(src, user, 2 SECONDS, volume = 20))
- repair_damage(10)
+ if(!istype(attacking_item, /obj/item/wrench/combat))
+ return ..()
+
+ if(!attacking_item.toolspeed)
return
- return ..()
+
+ if(user.combat_mode)
+ balloon_alert(user, "deconstructing...")
+ if(!attacking_item.use_tool(src, user, 5 SECONDS, volume = 20))
+ return
+
+ deconstruct(TRUE)
+ attacking_item.play_tool_sound(src, 50)
+ balloon_alert(user, "deconstructed!")
+
+ else
+ if(atom_integrity == max_integrity)
+ balloon_alert(user, "already repaired!")
+ return
+
+ balloon_alert(user, "repairing...")
+ while(atom_integrity != max_integrity)
+ if(!attacking_item.use_tool(src, user, 2 SECONDS, volume = 20))
+ return
+
+ repair_damage(10)
+
+ balloon_alert(user, "repaired!")
/obj/machinery/porta_turret/syndicate/toolbox/deconstruct(disassembled)
if(disassembled)
var/atom/movable/old_toolbox = toolbox
toolbox = null
old_toolbox.forceMove(drop_location())
+
else
new /obj/effect/gibspawner/robot(drop_location())
+
return ..()
/obj/machinery/porta_turret/syndicate/toolbox/Destroy()
@@ -359,6 +421,7 @@ effective or pretty fucking useless.
/obj/machinery/porta_turret/syndicate/toolbox/ui_status(mob/user)
if(faction_check(user.faction, faction))
return ..()
+
return UI_CLOSE
/obj/projectile/bullet/toolbox_turret
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 8009ffa92cd38..edb7c6364c970 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -148,7 +148,7 @@
if(change_volume)
target_mix.volume += other_mix.volume
-
+
target_mix.merge(other_mix.remove_ratio(1))
return TRUE
@@ -175,7 +175,7 @@
var/attachment
var/attachment_signal_log
if(attached_device)
- if(istype(attached_device, /obj/item/assembly/signaler))
+ if(issignaler(attached_device))
var/obj/item/assembly/signaler/attached_signaller = attached_device
attachment = "[attached_signaller]"
attachment_signal_log = attached_signaller.last_receive_signal_log ? "The following log entry is the last one associated with the attached signaller
[attached_signaller.last_receive_signal_log]" : "There is no signal log entry."
@@ -199,6 +199,7 @@
GLOB.bombers += admin_bomb_message
message_admins(admin_bomb_message)
log_game("Bomb valve opened in [AREACOORD(bombturf)][attachment_message][bomber_message]")
+ bomber.log_message("opened bomb valve", LOG_GAME, log_globally = FALSE)
valve_open = merge_gases(target, change_volume)
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index 6e61c32c8addd..e663c1e500463 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -157,9 +157,9 @@
w_class = WEIGHT_CLASS_SMALL
sides = 100
-/obj/item/dice/d100/ComponentInitialize()
- . = ..()
+/obj/item/dice/d100/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
+ return ..()
/obj/item/dice/eightbd20
name = "strange d20"
@@ -168,9 +168,9 @@
sides = 20
special_faces = list("It is certain","It is decidedly so","Without a doubt","Yes, definitely","You may rely on it","As I see it, yes","Most likely","Outlook good","Yes","Signs point to yes","Reply hazy try again","Ask again later","Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful")
-/obj/item/dice/eightbd20/ComponentInitialize()
- . = ..()
+/obj/item/dice/eightbd20/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
+ return ..()
/obj/item/dice/fourdd6
name = "4d d6"
@@ -179,9 +179,9 @@
sides = 48
special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6")
-/obj/item/dice/fourdd6/ComponentInitialize()
- . = ..()
+/obj/item/dice/fourdd6/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
+ return ..()
/obj/item/dice/attack_self(mob/user)
diceroll(user)
diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm
index 64bf1f8a1915e..8a2f61b6aa774 100644
--- a/code/game/objects/items/dna_probe.dm
+++ b/code/game/objects/items/dna_probe.dm
@@ -97,7 +97,8 @@
if(!do_after(user, CARP_MIX_DNA_TIMER))
return
var/mob/living/simple_animal/hostile/space_dragon/new_dragon = user.change_mob_type(/mob/living/simple_animal/hostile/space_dragon, location = loc, delete_old_mob = TRUE)
- new_dragon.permanant_empower()
+ new_dragon.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5))
+ new_dragon.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert")
qdel(src)
diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm
index 134b1dc43abf0..d1ea8ea86f652 100644
--- a/code/game/objects/items/drug_items.dm
+++ b/code/game/objects/items/drug_items.dm
@@ -29,7 +29,7 @@
icon_state = pick("moon_rock1", "moon_rock2", "moon_rock3")
AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOONICORN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
-/obj/item/reagent_containers/glass/blastoff_ampoule
+/obj/item/reagent_containers/cup/blastoff_ampoule
name = "bLaSToFF ampoule" //stylized name
desc = "A small ampoule. The liquid inside appears to be boiling violently.\nYou suspect it contains bLasSToFF; the drug thought to be the cause of the infamous Luna nightclub mass casualty incident."
icon = 'icons/obj/drugs.dmi'
@@ -40,7 +40,7 @@
spillable = FALSE
list_reagents = list(/datum/reagent/drug/blastoff = 10)
-/obj/item/reagent_containers/glass/blastoff_ampoule/update_icon_state()
+/obj/item/reagent_containers/cup/blastoff_ampoule/update_icon_state()
. = ..()
if(!reagents.total_volume)
icon_state = "[base_icon_state]_empty"
@@ -49,7 +49,7 @@
else
icon_state = base_icon_state
-/obj/item/reagent_containers/glass/blastoff_ampoule/attack_self(mob/user)
+/obj/item/reagent_containers/cup/blastoff_ampoule/attack_self(mob/user)
if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY) || spillable)
return ..()
reagent_flags |= OPENCONTAINER
@@ -57,7 +57,7 @@
playsound(src, 'sound/items/ampoule_snap.ogg', 40)
update_appearance()
-/obj/item/reagent_containers/glass/blastoff_ampoule/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/reagent_containers/cup/blastoff_ampoule/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(.)
return
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index 91d84bf6f84ed..07e4e36ce27de 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -34,10 +34,16 @@
var/hacked = FALSE
var/list/possible_colors = list("red", "blue", "green", "purple")
-/obj/item/dualsaber/ComponentInitialize()
+/obj/item/dualsaber/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=two_hand_force, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg', \
- wield_callback = CALLBACK(src, .proc/on_wield), unwield_callback = CALLBACK(src, .proc/on_unwield))
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = two_hand_force, \
+ wieldsound = 'sound/weapons/saberon.ogg', \
+ unwieldsound = 'sound/weapons/saberoff.ogg', \
+ wield_callback = CALLBACK(src, .proc/on_wield), \
+ unwield_callback = CALLBACK(src, .proc/on_unwield), \
+ )
/// Triggered on wield of two handed item
/// Specific hulk checks due to reflection chance for balance issues and switches hitsounds.
diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm
index d1a5a8f00daed..1007d9971e015 100644
--- a/code/game/objects/items/dyekit.dm
+++ b/code/game/objects/items/dyekit.dm
@@ -47,4 +47,4 @@
human_target.grad_style[gradient_key] = new_grad_style
human_target.grad_color[gradient_key] = sanitize_hexcolor(new_grad_color)
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
- human_target.update_hair(is_creating = TRUE)
+ human_target.update_body_parts()
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index ae607c3ddc209..a42914a2c96fa 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -77,13 +77,10 @@
reagents.add_reagent(chem, max_water)
/obj/item/extinguisher/Initialize(mapload)
- . = ..()
- refill()
-
-/obj/item/extinguisher/ComponentInitialize()
. = ..()
if(tank_holder_icon_state)
AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state)
+ refill()
/obj/item/extinguisher/advanced
name = "advanced fire extinguisher"
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
index 38075a6a9b5c7..362efc741c3de 100644
--- a/code/game/objects/items/fireaxe.dm
+++ b/code/game/objects/items/fireaxe.dm
@@ -29,10 +29,13 @@
/obj/item/fireaxe/Initialize(mapload)
. = ..()
-
-/obj/item/fireaxe/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
+ AddComponent(/datum/component/butchering, \
+ speed = 10 SECONDS, \
+ effectiveness = 80, \
+ bonus_modifier = 0 , \
+ butcher_sound = hitsound, \
+ )
+ //axes are not known for being precision butchering tools
AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[base_icon_state]1")
/obj/item/fireaxe/update_icon_state()
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 730df0413be01..04f8e575d77c3 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -31,9 +31,9 @@
var/acti_sound = 'sound/items/welderactivate.ogg'
var/deac_sound = 'sound/items/welderdeactivate.ogg'
-/obj/item/flamethrower/ComponentInitialize()
+/obj/item/flamethrower/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
/obj/item/flamethrower/Destroy()
if(weldtool)
@@ -49,7 +49,7 @@
STOP_PROCESSING(SSobj, src)
return null
var/turf/location = loc
- if(istype(location, /mob/))
+ if(ismob(location))
var/mob/M = location
if(M.is_holding(src))
location = M.loc
@@ -256,7 +256,7 @@
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
owner.visible_message(span_danger("\The [attack_text] hits the fuel tank on [owner]'s [name], rupturing it! What a shot!"))
var/turf/target_turf = get_turf(owner)
- log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]")
+ owner.log_message("held a flamethrower tank detonated by a projectile ([hitby])", LOG_GAME)
igniter.ignite_turf(src,target_turf, release_amount = 100)
qdel(ptank)
return 1 //It hit the flamethrower, not them
diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm
index d0faabefd48ac..e3c8d148a98bb 100644
--- a/code/game/objects/items/food/bread.dm
+++ b/code/game/objects/items/food/bread.dm
@@ -291,7 +291,7 @@
foodtypes = GRAIN | DAIRY
w_class = WEIGHT_CLASS_SMALL
-/obj/item/food/butterdog/ComponentInitialize()
+/obj/item/food/butterdog/Initialize(mapload)
. = ..()
AddComponent(/datum/component/slippery, 8 SECONDS)
diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm
index ec03b0144f723..6fda4be7fb5b0 100644
--- a/code/game/objects/items/food/burgers.dm
+++ b/code/game/objects/items/food/burgers.dm
@@ -33,7 +33,7 @@
desc = "A bloody burger."
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("bun" = 2, "long pig" = 4)
- foodtypes = MEAT | GRAIN | GROSS
+ foodtypes = MEAT | GRAIN | GORE
venue_value = FOOD_PRICE_CHEAP
/obj/item/food/burger/human/CheckParts(list/parts_list)
@@ -49,7 +49,7 @@
name = "corgi burger"
desc = "You monster."
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
- foodtypes = GRAIN | MEAT | GROSS
+ foodtypes = GRAIN | MEAT | GORE
venue_value = FOOD_PRICE_EXOTIC
@@ -59,7 +59,7 @@
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
icon_state = "appendixburger"
tastes = list("bun" = 4, "grass" = 2)
- foodtypes = GRAIN | MEAT | GROSS
+ foodtypes = GRAIN | MEAT | GORE
venue_value = FOOD_PRICE_NORMAL
/obj/item/food/burger/fish
@@ -137,7 +137,7 @@
icon_state = "brainburger"
food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/nutriment/protein = 6)
tastes = list("bun" = 4, "brains" = 2)
- foodtypes = GRAIN | MEAT | GROSS
+ foodtypes = GRAIN | MEAT | GORE
venue_value = FOOD_PRICE_CHEAP
/obj/item/food/burger/ghost
@@ -316,7 +316,7 @@
desc = "Pretty much what you'd expect..."
icon_state = "ratburger"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
- foodtypes = GRAIN | MEAT | GROSS
+ foodtypes = GRAIN | MEAT | GORE
venue_value = FOOD_PRICE_CHEAP
/obj/item/food/burger/baseball
@@ -353,7 +353,7 @@
icon_state = "catburger"
food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("bun" = 4, "meat" = 2, "cat" = 2)
- foodtypes = GRAIN | MEAT | GROSS
+ foodtypes = GRAIN | MEAT | GORE
/obj/item/food/burger/crab
name = "crab burger"
diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm
index 02888d77c88f1..3990279dc9ee3 100644
--- a/code/game/objects/items/food/cake.dm
+++ b/code/game/objects/items/food/cake.dm
@@ -64,7 +64,7 @@
icon_state = "braincake"
food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+ foodtypes = GRAIN | DAIRY | MEAT | GORE | SUGAR
/obj/item/food/cake/brain/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/brain, 5, 3 SECONDS, table_required = TRUE)
@@ -75,7 +75,7 @@
icon_state = "braincakeslice"
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+ foodtypes = GRAIN | DAIRY | MEAT | GORE | SUGAR
/obj/item/food/cake/cheese
name = "cheese cake"
diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm
index 8b9f59bb12f88..3d747ea52c790 100644
--- a/code/game/objects/items/food/donuts.dm
+++ b/code/game/objects/items/food/donuts.dm
@@ -78,7 +78,7 @@
icon_state = "donut_meat"
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/ketchup = 3)
tastes = list("meat" = 1)
- foodtypes = JUNKFOOD | MEAT | GROSS | FRIED | BREAKFAST
+ foodtypes = JUNKFOOD | MEAT | GORE | FRIED | BREAKFAST
is_decorated = TRUE
/obj/item/food/donut/berry
diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm
index c2ac962be021d..25335709afb09 100644
--- a/code/game/objects/items/food/egg.dm
+++ b/code/game/objects/items/food/egg.dm
@@ -14,6 +14,7 @@
/obj/item/food/egg
name = "egg"
desc = "An egg!"
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "egg"
food_reagents = list(/datum/reagent/consumable/eggyolk = 2, /datum/reagent/consumable/eggwhite = 4)
microwaved_type = /obj/item/food/boiledegg
@@ -106,9 +107,6 @@
qdel(src)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-
-
-
/obj/item/food/egg/blue
icon_state = "egg-blue"
@@ -136,6 +134,7 @@
/obj/item/food/friedegg
name = "fried egg"
desc = "A fried egg. Would go well with a touch of salt and pepper."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "friedegg"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/eggyolk = 2 , /datum/reagent/consumable/nutriment/vitamin = 2)
bite_consumption = 1
@@ -147,6 +146,7 @@
/obj/item/food/rawegg
name = "raw egg"
desc = "Supposedly good for you, if you can stomach it. Better fried."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "rawegg"
food_reagents = list() //Recieves all reagents from its whole egg counterpart
bite_consumption = 1
@@ -161,6 +161,7 @@
/obj/item/food/boiledegg
name = "boiled egg"
desc = "A hard boiled egg."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "egg"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("egg" = 1)
@@ -173,6 +174,7 @@
/obj/item/food/eggsausage
name = "egg with sausage"
desc = "A good egg with a side of sausages."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "eggsausage"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nutriment = 4)
foodtypes = MEAT | FRIED | BREAKFAST
@@ -188,6 +190,7 @@
/obj/item/food/omelette //FUCK THIS
name = "omelette du fromage"
desc = "That's all you can say!"
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "omelette"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 3)
bite_consumption = 1
@@ -217,6 +220,7 @@
/obj/item/food/benedict
name = "eggs benedict"
desc = "There is only one egg on this, how rude."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "benedict"
food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment = 3)
w_class = WEIGHT_CLASS_SMALL
@@ -227,6 +231,7 @@
/obj/item/food/eggwrap
name = "egg wrap"
desc = "The precursor to Pigs in a Blanket."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "eggwrap"
food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("egg" = 1)
@@ -236,6 +241,7 @@
/obj/item/food/chawanmushi
name = "chawanmushi"
desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
+ icon = 'icons/obj/food/egg.dmi'
icon_state = "chawanmushi"
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("custard" = 1)
diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm
index 1550c12ce4290..6743d59f2bbf1 100644
--- a/code/game/objects/items/food/frozen.dm
+++ b/code/game/objects/items/food/frozen.dm
@@ -73,7 +73,7 @@
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "flavorless_sc"
w_class = WEIGHT_CLASS_SMALL
- trash_type = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
+ trash_type = /obj/item/reagent_containers/cup/glass/sillycup //We dont eat paper cups
food_reagents = list(/datum/reagent/water = 11) // We dont get food for water/juices
tastes = list("ice" = 1, "water" = 1)
foodtypes = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit
diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm
index ae5423b121fef..ed60b6600b9e3 100644
--- a/code/game/objects/items/food/lizard.dm
+++ b/code/game/objects/items/food/lizard.dm
@@ -33,7 +33,7 @@
icon_state = "raw_lizard_cheese"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/salt = 5)
tastes = list("meat" = 1, "salt" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/raw_headcheese/Initialize(mapload)
@@ -47,7 +47,7 @@
icon_state = "lizard_cheese"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/salt = 5)
tastes = list("cheese" = 1, "salt" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/headcheese/MakeProcessable()
@@ -60,7 +60,7 @@
icon_state = "lizard_cheese_slice"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/salt = 1)
tastes = list("cheese" = 1, "salt" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
w_class = WEIGHT_CLASS_TINY
/obj/item/food/shredded_lungs
@@ -70,7 +70,7 @@
icon_state = "lung_stirfry"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 2)
tastes = list("meat" = 1, "heat" = 1, "veggies" = 1)
- foodtypes = MEAT | VEGETABLES | GROSS
+ foodtypes = MEAT | VEGETABLES | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/tsatsikh
@@ -80,7 +80,7 @@
icon_state = "tsatsikh"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10)
tastes = list("assorted minced organs" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/liver_pate
@@ -151,7 +151,7 @@
icon_state = "brain_pate"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/liquidgibs = 2)
tastes = list("brains" = 2)
- foodtypes = MEAT | VEGETABLES | GROSS
+ foodtypes = MEAT | VEGETABLES | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/crispy_headcheese
@@ -161,7 +161,7 @@
icon_state = "crispy_headcheese"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 2)
tastes = list("cheese" = 1, "oil" = 1)
- foodtypes = MEAT | VEGETABLES | NUTS | GROSS
+ foodtypes = MEAT | VEGETABLES | NUTS | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/kebab/picoss_skewers
@@ -181,7 +181,7 @@
icon_state = "nectar_larvae"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/korta_nectar = 3, /datum/reagent/consumable/capsaicin = 1)
tastes = list("meat" = 1, "sweet" = 1, "heat" = 1)
- foodtypes = GROSS | MEAT | BUGS
+ foodtypes = GORE | MEAT | BUGS
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/mushroomy_stirfry
@@ -409,7 +409,7 @@
food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/nutriment/vitamin = 10)
tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1, "tomato" = 1, "meat" = 1)
slice_type = null
- foodtypes = VEGETABLES | MEAT | NUTS | GROSS
+ foodtypes = VEGETABLES | MEAT | NUTS | GORE
boxtag = "Imperial Victory Flatbread"
//Sandwiches/Toast Dishes
@@ -420,7 +420,7 @@
icon_state = "emperor_roll"
food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("bread" = 1, "cheese" = 1, "liver" = 1, "caviar" = 1)
- foodtypes = VEGETABLES | NUTS | MEAT | GROSS | SEAFOOD
+ foodtypes = VEGETABLES | NUTS | MEAT | GORE | SEAFOOD
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
@@ -461,7 +461,7 @@
icon_state = "black_broth"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/blood = 8, /datum/reagent/liquidgibs = 2)
tastes = list("vinegar" = 1, "metal" = 1)
- foodtypes = MEAT | VEGETABLES | GROSS
+ foodtypes = MEAT | VEGETABLES | GORE
/obj/item/food/soup/jellyfish
name = "jellyfish stew"
@@ -470,7 +470,7 @@
icon_state = "jellyfish_stew"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment = 6)
tastes = list("slime" = 1)
- foodtypes = MEAT | VEGETABLES | GROSS
+ foodtypes = MEAT | VEGETABLES | GORE
/obj/item/food/soup/rootbread_soup
name = "rootbread soup"
@@ -489,7 +489,7 @@
icon_state = "black_eggs"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("eggs" = 1, "greens" = 1, "blood" = 1)
- foodtypes = MEAT | BREAKFAST | GROSS
+ foodtypes = MEAT | BREAKFAST | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/patzikula
@@ -541,7 +541,7 @@
icon_state = "candied_mushrooms"
food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/caramel = 4)
tastes = list("savouriness" = 1, "sweetness" = 1)
- foodtypes = SUGAR | VEGETABLES | GROSS
+ foodtypes = SUGAR | VEGETABLES
//Misc Dishes
/obj/item/food/sauerkraut
@@ -581,7 +581,7 @@
icon_state = "canned_jellyfish"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/toxin/mindbreaker = 2, /datum/reagent/consumable/salt = 1)
tastes = list("slime" = 1, "burning" = 1, "salt" = 1)
- foodtypes = SEAFOOD | GROSS
+ foodtypes = SEAFOOD | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/desert_snails
@@ -591,7 +591,7 @@
icon_state = "canned_snails"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/salt = 2)
tastes = list("snails" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/larvae
@@ -601,5 +601,5 @@
icon_state = "canned_larvae"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/honey = 2)
tastes = list("sweet bugs" = 1)
- foodtypes = MEAT | GROSS | BUGS
+ foodtypes = MEAT | GORE | BUGS
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm
deleted file mode 100644
index 58fbcf2fd9bbe..0000000000000
--- a/code/game/objects/items/food/meat.dm
+++ /dev/null
@@ -1,1380 +0,0 @@
-//Not only meat, actually, but also snacks that are almost meat, such as fish meat or tofu
-
-
-////////////////////////////////////////////FISH////////////////////////////////////////////
-
-/obj/item/food/cubancarp
- name = "\improper Cuban carp"
- desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!"
- icon_state = "cubancarp"
- bite_consumption = 3
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1)
- foodtypes = SEAFOOD | FRIED
- w_class = WEIGHT_CLASS_SMALL
-
-
-/obj/item/food/fishmeat
- name = "fish fillet"
- desc = "A fillet of some fish meat."
- icon_state = "fishfillet"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
- bite_consumption = 6
- tastes = list("fish" = 1)
- foodtypes = SEAFOOD
- eatverbs = list("bite", "chew", "gnaw", "swallow", "chomp")
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/fishmeat/carp
- name = "carp fillet"
- desc = "A fillet of spess carp meat."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- /// Cytology category you can swab the meat for.
- var/cell_line = CELL_LINE_TABLE_CARP
-
-/obj/item/food/fishmeat/carp/Initialize(mapload)
- . = ..()
- if(cell_line)
- AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/fishmeat/carp/imitation
- name = "imitation carp fillet"
- desc = "Almost just like the real thing, kinda."
- cell_line = null
-
-/obj/item/food/fishmeat/moonfish
- name = "moonfish fillet"
- desc = "A fillet of moonfish."
- icon = 'icons/obj/food/lizard.dmi'
- icon_state = "moonfish_fillet"
-
-/obj/item/food/fishmeat/moonfish/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/grilled_moonfish, rand(40 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/fishmeat/gunner_jellyfish
- name = "filleted gunner jellyfish"
- desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic."
- icon = 'icons/obj/food/lizard.dmi'
- icon_state = "jellyfish_fillet"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/mindbreaker = 2)
-
-/obj/item/food/fishmeat/armorfish
- name = "cleaned armorfish"
- desc = "An armorfish with its guts and shell removed, ready for use in cooking."
- icon = 'icons/obj/food/lizard.dmi'
- icon_state = "armorfish_fillet"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3)
-
-/obj/item/food/fishmeat/donkfish
- name = "donkfillet"
- desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked."
- icon_state = "donkfillet"
- food_reagents = list(/datum/reagent/yuck = 3)
-
-/obj/item/food/fishfingers
- name = "fish fingers"
- desc = "A finger of fish."
- icon_state = "fishfingers"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- bite_consumption = 1
- tastes = list("fish" = 1, "breadcrumbs" = 1)
- foodtypes = SEAFOOD | FRIED
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_EXOTIC
-
-/obj/item/food/fishandchips
- name = "fish and chips"
- desc = "I do say so myself chap."
- icon_state = "fishandchips"
- food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("fish" = 1, "chips" = 1)
- foodtypes = SEAFOOD | VEGETABLES | FRIED
- venue_value = FOOD_PRICE_NORMAL
-
-/obj/item/food/fishfry
- name = "fish fry"
- desc = "All that and no bag of chips..."
- icon_state = "fishfry"
- food_reagents = list (/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3)
- tastes = list("fish" = 1, "pan seared vegtables" = 1)
- foodtypes = SEAFOOD | VEGETABLES | FRIED
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/fishtaco
- name = "fish taco"
- desc = "A taco with fish, cheese, and cabbage."
- icon_state = "fishtaco"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("taco" = 4, "fish" = 2, "cheese" = 2, "cabbage" = 1)
- foodtypes = SEAFOOD | DAIRY | GRAIN | VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/vegetariansushiroll
- name = "vegetarian sushi roll"
- desc = "A roll of simple vegetarian sushi with rice, carrots, and potatoes. Sliceable into pieces!"
- icon_state = "vegetariansushiroll"
- food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2)
- foodtypes = VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/vegetariansushiroll/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/vegetariansushislice, 4)
-
-/obj/item/food/vegetariansushislice
- name = "vegetarian sushi slice"
- desc = "A slice of simple vegetarian sushi with rice, carrots, and potatoes."
- icon_state = "vegetariansushislice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2)
- foodtypes = VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/spicyfiletsushiroll
- name = "spicy filet sushi roll"
- desc = "A roll of tasty, spicy sushi made with fish and vegetables. Sliceable into pieces!"
- icon_state = "spicyfiletroll"
- food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2)
- foodtypes = VEGETABLES | SEAFOOD
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/spicyfiletsushiroll/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spicyfiletsushislice, 4)
-
-/obj/item/food/spicyfiletsushislice
- name = "spicy filet sushi slice"
- desc = "A slice of tasty, spicy sushi made with fish and vegetables. Don't eat it too fast!."
- icon_state = "spicyfiletslice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2)
- foodtypes = VEGETABLES | SEAFOOD
- w_class = WEIGHT_CLASS_SMALL
-
-// empty sushi for custom sushi
-/obj/item/food/sushi/empty
- name = "sushi"
- foodtypes = NONE
- tastes = list()
- icon_state = "vegetariansushiroll"
- desc = "A roll of customized sushi."
-
-/obj/item/food/sushi/empty/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sushislice/empty, 4)
-
-/obj/item/food/sushislice/empty
- name = "sushi slice"
- foodtypes = NONE
- tastes = list()
- icon_state = "vegetariansushislice"
- desc = "A slice of customized sushi."
-
-/obj/item/food/nigiri_sushi
- name = "nigiri sushi"
- desc = "A simple nigiri of fish atop a packed rice ball with a seaweed wrapping and a side of soy sauce."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "nigiri_sushi"
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("boiled rice" = 4, "fish filet" = 2, "soy sauce" = 2)
- foodtypes = SEAFOOD | VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
-
-/obj/item/food/tofu
- name = "tofu"
- desc = "We all love tofu."
- icon_state = "tofu"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("tofu" = 1)
- foodtypes = VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/tofu/prison
- name = "soggy tofu"
- desc = "You refuse to eat this strange bean curd."
- tastes = list("sour, rotten water" = 1)
- foodtypes = GROSS
-
-/obj/item/food/spiderleg
- name = "spider leg"
- desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
- icon_state = "spiderleg"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/toxin = 2)
- tastes = list("cobwebs" = 1)
- foodtypes = MEAT | TOXIC
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/spiderleg/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/boiledspiderleg, rand(50 SECONDS, 60 SECONDS), TRUE, TRUE)
-
-/obj/item/food/cornedbeef
- name = "corned beef and cabbage"
- desc = "Now you can feel like a real tourist vacationing in Ireland."
- icon_state = "cornedbeef"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("meat" = 1, "cabbage" = 1)
- foodtypes = MEAT | VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/bearsteak
- name = "Filet migrawr"
- desc = "Because eating bear wasn't manly enough."
- icon_state = "bearsteak"
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 9, /datum/reagent/consumable/ethanol/manly_dorf = 5)
- tastes = list("meat" = 1, "salmon" = 1)
- foodtypes = MEAT | ALCOHOL
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_EXOTIC
-
-/obj/item/food/raw_meatball
- name = "raw meatball"
- desc = "A great meal all round. Not a cord of wood. Kinda raw"
- icon_state = "raw_meatball"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT | RAW
- w_class = WEIGHT_CLASS_SMALL
- var/meatball_type = /obj/item/food/meatball
- var/patty_type = /obj/item/food/raw_patty
-
-/obj/item/food/raw_meatball/MakeGrillable()
- AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE)
-
-/obj/item/food/raw_meatball/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE)
-
-/obj/item/food/raw_meatball/human
- name = "strange raw meatball"
- meatball_type = /obj/item/food/meatball/human
- patty_type = /obj/item/food/raw_patty/human
-
-/obj/item/food/raw_meatball/corgi
- name = "raw corgi meatball"
- meatball_type = /obj/item/food/meatball/corgi
- patty_type = /obj/item/food/raw_patty/corgi
-
-/obj/item/food/raw_meatball/xeno
- name = "raw xeno meatball"
- meatball_type = /obj/item/food/meatball/xeno
- patty_type = /obj/item/food/raw_patty/xeno
-
-/obj/item/food/raw_meatball/bear
- name = "raw bear meatball"
- meatball_type = /obj/item/food/meatball/bear
- patty_type = /obj/item/food/raw_patty/bear
-
-/obj/item/food/raw_meatball/chicken
- name = "raw chicken meatball"
- meatball_type = /obj/item/food/meatball/chicken
- patty_type = /obj/item/food/raw_patty/chicken
-
-/obj/item/food/meatball
- name = "meatball"
- desc = "A great meal all round. Not a cord of wood."
- icon_state = "meatball"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT
- food_flags = FOOD_FINGER_FOOD
- w_class = WEIGHT_CLASS_SMALL
- burns_on_grill = TRUE
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/meatball/human
- name = "strange meatball"
-
-/obj/item/food/meatball/corgi
- name = "corgi meatball"
-
-/obj/item/food/meatball/bear
- name = "bear meatball"
- tastes = list("meat" = 1, "salmon" = 1)
-
-/obj/item/food/meatball/xeno
- name = "xenomorph meatball"
- tastes = list("meat" = 1, "acid" = 1)
-
-/obj/item/food/meatball/chicken
- name = "chicken meatball"
- tastes = list("chicken" = 1)
- icon_state = "chicken_meatball"
-
-/obj/item/food/raw_patty
- name = "raw patty"
- desc = "I'm.....NOT REAAADDYY."
- icon_state = "raw_patty"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT | RAW
- w_class = WEIGHT_CLASS_SMALL
- var/patty_type = /obj/item/food/patty/plain
-
-/obj/item/food/raw_patty/MakeGrillable()
- AddComponent(/datum/component/grillable, patty_type, rand(30 SECONDS, 40 SECONDS), TRUE)
-
-/obj/item/food/raw_patty/human
- name = "strange raw patty"
- patty_type = /obj/item/food/patty/human
-
-/obj/item/food/raw_patty/corgi
- name = "raw corgi patty"
- patty_type = /obj/item/food/patty/corgi
-
-/obj/item/food/raw_patty/bear
- name = "raw bear patty"
- tastes = list("meat" = 1, "salmon" = 1)
- patty_type = /obj/item/food/patty/bear
-
-/obj/item/food/raw_patty/xeno
- name = "raw xenomorph patty"
- tastes = list("meat" = 1, "acid" = 1)
- patty_type = /obj/item/food/patty/xeno
-
-/obj/item/food/raw_patty/chicken
- name = "raw chicken patty"
- tastes = list("chicken" = 1)
- patty_type = /obj/item/food/patty/chicken
-
-/obj/item/food/patty
- name = "patty"
- desc = "The nanotrasen patty is the patty for you and me!"
- icon_state = "patty"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT
- w_class = WEIGHT_CLASS_SMALL
- burns_on_grill = TRUE
-
-///Exists purely for the crafting recipe (because itll take subtypes)
-/obj/item/food/patty/plain
-
-/obj/item/food/patty/human
- name = "strange patty"
-
-/obj/item/food/patty/corgi
- name = "corgi patty"
-
-/obj/item/food/patty/bear
- name = "bear patty"
- tastes = list("meat" = 1, "salmon" = 1)
-
-/obj/item/food/patty/xeno
- name = "xenomorph patty"
- tastes = list("meat" = 1, "acid" = 1)
-
-/obj/item/food/patty/chicken
- name = "chicken patty"
- tastes = list("chicken" = 1)
- icon_state = "chicken_patty"
-
-/obj/item/food/raw_sausage
- name = "raw sausage"
- desc = "A piece of mixed, long meat, but then raw"
- icon_state = "raw_sausage"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT | RAW
- eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp")
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/raw_sausage/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/sausage, rand(60 SECONDS, 75 SECONDS), TRUE)
-
-/obj/item/food/sausage
- name = "sausage"
- desc = "A piece of mixed, long meat."
- icon_state = "sausage"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT | BREAKFAST
- food_flags = FOOD_FINGER_FOOD
- eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp")
- w_class = WEIGHT_CLASS_SMALL
- burns_on_grill = TRUE
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/sausage/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE)
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/sausage/american
- name = "american sausage"
- desc = "Snip."
- icon_state = "american_sausage"
-
-/obj/item/food/sausage/american/MakeProcessable()
- return
-
-/obj/item/food/salami
- name = "salami"
- desc = "A slice of cured salami."
- icon_state = "salami"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
- tastes = list("meat" = 1, "smoke" = 1)
- foodtypes = MEAT
- food_flags = FOOD_FINGER_FOOD
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/rawkhinkali
- name = "raw khinkali"
- desc = "One hundred khinkalis? Do I look like a pig?"
- icon_state = "khinkali"
- food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
- tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
- foodtypes = MEAT
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/rawkhinkali/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/khinkali, rand(50 SECONDS, 60 SECONDS), TRUE)
-
-/obj/item/food/khinkali
- name = "khinkali"
- desc = "One hundred khinkalis? Do I look like a pig?"
- icon_state = "khinkali"
- food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
- bite_consumption = 3
- tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
- foodtypes = MEAT
- w_class = WEIGHT_CLASS_SMALL
- burns_on_grill = TRUE
-
-/obj/item/food/meatbun
- name = "meat bun"
- desc = "Has the potential to not be Dog."
- icon_state = "meatbun"
- food_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("bun" = 3, "meat" = 2)
- foodtypes = GRAIN | MEAT | VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/monkeycube
- name = "monkey cube"
- desc = "Just add water!"
- icon_state = "monkeycube"
- bite_consumption = 12
- food_reagents = list(/datum/reagent/monkey_powder = 30)
- tastes = list("the jungle" = 1, "bananas" = 1)
- foodtypes = MEAT | SUGAR
- food_flags = FOOD_FINGER_FOOD
- w_class = WEIGHT_CLASS_TINY
- var/faction
- var/spawned_mob = /mob/living/carbon/human/species/monkey
-
-/obj/item/food/monkeycube/proc/Expand()
- var/mob/spammer = get_mob_by_key(fingerprintslast)
- var/mob/living/bananas = new spawned_mob(drop_location(), TRUE, spammer)
- if(faction)
- bananas.faction = faction
- if (!QDELETED(bananas))
- visible_message(span_notice("[src] expands!"))
- bananas.log_message("Spawned via [src] at [AREACOORD(src)], Last attached mob: [key_name(spammer)].", LOG_ATTACK)
- else if (!spammer) // Visible message in case there are no fingerprints
- visible_message(span_notice("[src] fails to expand!"))
- qdel(src)
-
-/obj/item/food/monkeycube/suicide_act(mob/living/user)
- user.visible_message(span_suicide("[user] is putting [src] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!"))
- var/eating_success = do_after(user, 1 SECONDS, src)
- if(QDELETED(user)) //qdeletion: the nuclear option of self-harm
- return SHAME
- if(!eating_success || QDELETED(src)) //checks if src is gone or if they failed to wait for a second
- user.visible_message(span_suicide("[user] chickens out!"))
- return SHAME
- if(HAS_TRAIT(user, TRAIT_NOHUNGER)) //plasmamen don't have saliva/stomach acid
- user.visible_message(span_suicide("[user] realizes [user.p_their()] body won't activate [src]!")
- ,span_warning("Your body won't activate [src]..."))
- return SHAME
- playsound(user, 'sound/items/eatfood.ogg', rand(10, 50), TRUE)
- user.temporarilyRemoveItemFromInventory(src) //removes from hands, keeps in M
- addtimer(CALLBACK(src, .proc/finish_suicide, user), 15) //you've eaten it, you can run now
- return MANUAL_SUICIDE
-
-/obj/item/food/monkeycube/proc/finish_suicide(mob/living/user) ///internal proc called by a monkeycube's suicide_act using a timer and callback. takes as argument the mob/living who activated the suicide
- if(QDELETED(user) || QDELETED(src))
- return
- if(src.loc != user) //how the hell did you manage this
- to_chat(user, span_warning("Something happened to [src]..."))
- return
- Expand()
- user.visible_message(span_danger("[user]'s torso bursts open as a primate emerges!"))
- user.gib(null, TRUE, null, TRUE)
-
-/obj/item/food/monkeycube/syndicate
- faction = list("neutral", ROLE_SYNDICATE)
-
-/obj/item/food/monkeycube/gorilla
- name = "gorilla cube"
- desc = "A Waffle Co. brand gorilla cube. Now with extra molecules!"
- bite_consumption = 20
- food_reagents = list(/datum/reagent/monkey_powder = 30, /datum/reagent/medicine/strange_reagent = 5)
- tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1)
- spawned_mob = /mob/living/simple_animal/hostile/gorilla
-
-/obj/item/food/monkeycube/chicken
- name = "chicken cube"
- desc = "A new Nanotrasen classic, the chicken cube. Tastes like everything!"
- bite_consumption = 20
- food_reagents = list(/datum/reagent/consumable/eggyolk = 30, /datum/reagent/medicine/strange_reagent = 1)
- tastes = list("chicken" = 1, "the country" = 1, "chicken bouillon" = 1)
- spawned_mob = /mob/living/simple_animal/chicken
-
-/obj/item/food/monkeycube/bee
- name = "bee cube"
- desc = "We were sure it was a good idea. Just add water."
- bite_consumption = 20
- food_reagents = list(/datum/reagent/consumable/honey = 10, /datum/reagent/toxin = 5, /datum/reagent/medicine/strange_reagent = 1)
- tastes = list("buzzing" = 1, "honey" = 1, "regret" = 1)
- spawned_mob = /mob/living/simple_animal/hostile/bee
-
-/obj/item/food/stewedsoymeat
- name = "stewed soy meat"
- desc = "Even non-vegetarians will LOVE this!"
- icon_state = "stewedsoymeat"
- food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("soy" = 1, "vegetables" = 1)
- eatverbs = list("slurp", "sip", "inhale", "drink")
- foodtypes = VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/boiledspiderleg
- name = "boiled spider leg"
- desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
- icon_state = "spiderlegcooked"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("hot peppers" = 1, "cobwebs" = 1)
- foodtypes = MEAT
- w_class = WEIGHT_CLASS_SMALL
- burns_on_grill = TRUE
-
-/obj/item/food/spidereggsham
- name = "green eggs and ham"
- desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
- icon_state = "spidereggsham"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
- bite_consumption = 4
- tastes = list("meat" = 1, "the colour green" = 1)
- foodtypes = MEAT
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/sashimi
- name = "carp sashimi"
- desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself. You sure hope whoever made this is skilled."
- icon_state = "sashimi"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/capsaicin = 9, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("fish" = 1, "hot peppers" = 1)
- foodtypes = SEAFOOD
- w_class = WEIGHT_CLASS_TINY
- //total price of this dish is 20 and a small amount more for soy sauce, all of which are available at the orders console
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/sashimi/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/nugget
- name = "chicken nugget"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("\"chicken\"" = 1)
- foodtypes = MEAT
- food_flags = FOOD_FINGER_FOOD
- w_class = WEIGHT_CLASS_TINY
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/nugget/Initialize(mapload)
- . = ..()
- var/shape = pick("lump", "star", "lizard", "corgi")
- desc = "A 'chicken' nugget vaguely shaped like a [shape]."
- icon_state = "nugget_[shape]"
-
-/obj/item/food/pigblanket
- name = "pig in a blanket"
- desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it."
- icon_state = "pigblanket"
- food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("meat" = 1, "butter" = 1)
- foodtypes = MEAT | DAIRY | GRAIN
- w_class = WEIGHT_CLASS_TINY
-
-/obj/item/food/bbqribs
- name = "bbq ribs"
- desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
- icon_state = "ribs"
- w_class = WEIGHT_CLASS_NORMAL
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/bbqsauce = 10)
- tastes = list("meat" = 3, "smokey sauce" = 1)
- foodtypes = MEAT | SUGAR
-
-/obj/item/food/meatclown
- name = "meat clown"
- desc = "A delicious, round piece of meat clown. How horrifying."
- icon_state = "meatclown"
- food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/banana = 2)
- tastes = list("meat" = 5, "clowns" = 3, "sixteen teslas" = 1)
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/meatclown/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/slippery, 30)
-
-/obj/item/food/lasagna
- name = "Lasagna"
- desc = "A slice of lasagna. Perfect for a Monday afternoon."
- icon_state = "lasagna"
- food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/tomatojuice = 10)
- tastes = list("meat" = 3, "pasta" = 3, "tomato" = 2, "cheese" = 2)
- foodtypes = MEAT | DAIRY | GRAIN
- venue_value = FOOD_PRICE_NORMAL
-
-//////////////////////////////////////////// KEBABS AND OTHER SKEWERS ////////////////////////////////////////////
-
-/obj/item/food/kebab
- trash_type = /obj/item/stack/rods
- icon_state = "kebab"
- w_class = WEIGHT_CLASS_NORMAL
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 14)
- tastes = list("meat" = 3, "metal" = 1)
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/kebab/human
- name = "human-kebab"
- desc = "A human meat, on a stick."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 6)
- tastes = list("tender meat" = 3, "metal" = 1)
- foodtypes = MEAT | GROSS
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/kebab/monkey
- name = "meat-kebab"
- desc = "Delicious meat, on a stick."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("meat" = 3, "metal" = 1)
- foodtypes = MEAT
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/kebab/tofu
- name = "tofu-kebab"
- desc = "Vegan meat, on a stick."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15)
- tastes = list("tofu" = 3, "metal" = 1)
- foodtypes = VEGETABLES
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/kebab/tail
- name = "lizard-tail kebab"
- desc = "Severed lizard tail on a stick."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 30, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("meat" = 8, "metal" = 4, "scales" = 1)
- foodtypes = MEAT
-
-/obj/item/food/kebab/rat
- name = "rat-kebab"
- desc = "Not so delicious rat meat, on a stick."
- icon_state = "ratkebab"
- w_class = WEIGHT_CLASS_NORMAL
- trash_type = null
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("rat meat" = 1, "metal" = 1)
- foodtypes = MEAT | GROSS
- venue_value = FOOD_PRICE_CHEAP
-
-/obj/item/food/kebab/rat/double
- name = "double rat-kebab"
- icon_state = "doubleratkebab"
- tastes = list("rat meat" = 2, "metal" = 1)
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 20, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/iron = 2)
-
-/obj/item/food/kebab/fiesta
- name = "fiesta skewer"
- icon_state = "fiestaskewer"
- tastes = list("tex-mex" = 3, "cumin" = 2)
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/capsaicin = 3)
-
-/obj/item/food/meat
- custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4)
- w_class = WEIGHT_CLASS_SMALL
- var/subjectname = ""
- var/subjectjob = null
-
-/obj/item/food/meat/slab
- name = "meat"
- desc = "A slab of meat."
- icon_state = "meat"
- bite_consumption = 3
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil
- tastes = list("meat" = 1)
- foodtypes = MEAT | RAW
- ///Legacy code, handles the coloring of the overlay of the cutlets made from this.
- var/slab_color = "#FF0000"
-
-/obj/item/food/meat/slab/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/dryable, /obj/item/food/sosjerky/healthy)
-
-/obj/item/food/meat/slab/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
-
-/obj/item/food/meat/slab/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 3 SECONDS, table_required = TRUE)
-
-///////////////////////////////////// HUMAN MEATS //////////////////////////////////////////////////////
-
-/obj/item/food/meat/slab/human
- name = "meat"
- tastes = list("tender meat" = 1)
- foodtypes = MEAT | RAW | GROSS
- venue_value = FOOD_MEAT_HUMAN
-
-/obj/item/food/meat/slab/human/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
-
-/obj/item/food/meat/slab/human/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/human/mutant/slime
- icon_state = "slimemeat"
- desc = "Because jello wasn't offensive enough to vegans."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/slimejelly = 3)
- tastes = list("slime" = 1, "jelly" = 1)
- foodtypes = MEAT | RAW | TOXIC
- venue_value = FOOD_MEAT_MUTANT_RARE
-
-/obj/item/food/meat/slab/human/mutant/golem
- icon_state = "golemmeat"
- desc = "Edible rocks, welcome to the future."
- food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/iron = 3)
- tastes = list("rock" = 1)
- foodtypes = MEAT | RAW | GROSS
- venue_value = FOOD_MEAT_MUTANT_RARE
-
-/obj/item/food/meat/slab/human/mutant/golem/adamantine
- icon_state = "agolemmeat"
- desc = "From the slime pen to the rune to the kitchen, science."
- foodtypes = MEAT | RAW | GROSS
-
-/obj/item/food/meat/slab/human/mutant/lizard
- icon_state = "lizardmeat"
- desc = "Delicious dino damage."
- tastes = list("meat" = 4, "scales" = 1)
- foodtypes = MEAT | RAW
- venue_value = FOOD_MEAT_MUTANT
-
-/obj/item/food/meat/slab/human/mutant/lizard/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human/lizard, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/human/mutant/plant
- icon_state = "plantmeat"
- desc = "All the joys of healthy eating with all the fun of cannibalism."
- tastes = list("salad" = 1, "wood" = 1)
- foodtypes = VEGETABLES
- venue_value = FOOD_MEAT_MUTANT_RARE
-
-/obj/item/food/meat/slab/human/mutant/shadow
- icon_state = "shadowmeat"
- desc = "Ow, the edge."
- tastes = list("darkness" = 1, "meat" = 1)
- foodtypes = MEAT | RAW
- venue_value = FOOD_MEAT_MUTANT_RARE
-
-/obj/item/food/meat/slab/human/mutant/fly
- icon_state = "flymeat"
- desc = "Nothing says tasty like maggot filled radioactive mutant flesh."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/uranium = 3)
- tastes = list("maggots" = 1, "the inside of a reactor" = 1)
- foodtypes = MEAT | RAW | GROSS | BUGS
- venue_value = FOOD_MEAT_MUTANT
-
-/obj/item/food/meat/slab/human/mutant/moth
- icon_state = "mothmeat"
- desc = "Unpleasantly powdery and dry. Kind of pretty, though."
- tastes = list("dust" = 1, "powder" = 1, "meat" = 2)
- foodtypes = MEAT | RAW | BUGS
- venue_value = FOOD_MEAT_MUTANT
-
-/obj/item/food/meat/slab/human/mutant/skeleton
- name = "bone"
- icon_state = "skeletonmeat"
- desc = "There's a point where this needs to stop, and clearly we have passed it."
- tastes = list("bone" = 1)
- foodtypes = GROSS
- venue_value = FOOD_MEAT_MUTANT_RARE
-
-/obj/item/food/meat/slab/human/mutant/skeleton/MakeProcessable()
- return //skeletons dont have cutlets
-
-/obj/item/food/meat/slab/human/mutant/zombie
- name = "meat (rotten)"
- icon_state = "rottenmeat"
- desc = "Halfway to becoming fertilizer for your garden."
- tastes = list("brains" = 1, "meat" = 1)
- foodtypes = RAW | MEAT | TOXIC
-
-/obj/item/food/meat/slab/human/mutant/ethereal
- icon_state = "etherealmeat"
- desc = "So shiny you feel like ingesting it might make you shine too"
- food_reagents = list(/datum/reagent/consumable/liquidelectricity/enriched = 10)
- tastes = list("pure electricity" = 2, "meat" = 1)
- foodtypes = RAW | MEAT | TOXIC
- venue_value = FOOD_MEAT_MUTANT
-
-////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
-
-
-/obj/item/food/meat/slab/synthmeat
- name = "synthmeat"
- icon_state = "meat_old"
- desc = "A synthetic slab of meat."
- foodtypes = RAW | MEAT //hurr durr chemicals we're harmed in the production of this meat thus its non-vegan.
- venue_value = FOOD_PRICE_WORTHLESS
-
-/obj/item/food/meat/slab/synthmeat/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/synth, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/meatproduct
- name = "meat product"
- icon_state = "meatproduct"
- desc = "A slab of station reclaimed and chemically processed meat product."
- tastes = list("meat flavoring" = 2, "modified starches" = 2, "natural & artificial dyes" = 1, "butyric acid" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/meatproduct/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/meatproduct, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/monkey
- name = "monkey meat"
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/mouse
- name = "mouse meat"
- desc = "A slab of mouse meat. Best not eat it raw."
- foodtypes = RAW | MEAT | GROSS
-
-/obj/item/food/meat/slab/mouse/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/meat/slab/corgi
- name = "corgi meat"
- desc = "Tastes like... well you know..."
- tastes = list("meat" = 4, "a fondness for wearing hats" = 1)
- foodtypes = RAW | MEAT | GROSS
-
-/obj/item/food/meat/slab/corgi/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/meat/slab/pug
- name = "pug meat"
- desc = "Tastes like... well you know..."
- foodtypes = RAW | MEAT | GROSS
-
-/obj/item/food/meat/slab/pug/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/meat/slab/killertomato
- name = "killer tomato meat"
- desc = "A slice from a huge tomato."
- icon_state = "tomatomeat"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2)
- tastes = list("tomato" = 1)
- foodtypes = FRUIT
-
-/obj/item/food/meat/slab/killertomato/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/killertomato/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/bear
- name = "bear meat"
- desc = "A very manly slab of meat."
- icon_state = "bearmeat"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6)
- tastes = list("meat" = 1, "salmon" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/bear/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/bear/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/bear/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/meat/slab/xeno
- name = "xeno meat"
- desc = "A slab of meat."
- icon_state = "xenomeat"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
- bite_consumption = 4
- tastes = list("meat" = 1, "acid" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/xeno/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/xeno/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/spider
- name = "spider meat"
- desc = "A slab of spider meat. That is so Kafkaesque."
- icon_state = "spidermeat"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("cobwebs" = 1)
- foodtypes = RAW | MEAT | TOXIC
-
-/obj/item/food/meat/slab/spider/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/spider/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/slab/goliath
- name = "goliath meat"
- desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
- icon_state = "goliathmeat"
- tastes = list("meat" = 1)
- foodtypes = RAW | MEAT | TOXIC
-
-/obj/item/food/meat/slab/goliath/burn()
- visible_message(span_notice("[src] finishes cooking!"))
- new /obj/item/food/meat/steak/goliath(loc)
- qdel(src)
-
-/obj/item/food/meat/slab/meatwheat
- name = "meatwheat clump"
- desc = "This doesn't look like meat, but your standards aren't that high to begin with."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1)
- icon_state = "meatwheat_clump"
- bite_consumption = 4
- tastes = list("meat" = 1, "wheat" = 1)
- foodtypes = GRAIN
-
-/obj/item/food/meat/slab/gorilla
- name = "gorilla meat"
- desc = "Much meatier than monkey meat."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 5) //Plenty of fat!
-
-/obj/item/food/meat/rawbacon
- name = "raw piece of bacon"
- desc = "A raw piece of bacon."
- icon_state = "baconb"
- bite_consumption = 2
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/cooking_oil = 3)
- tastes = list("bacon" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/rawbacon/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/bacon, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/bacon
- name = "piece of bacon"
- desc = "A delicious piece of bacon."
- icon_state = "baconcookedb"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2)
- tastes = list("bacon" = 1)
- foodtypes = MEAT | BREAKFAST
- burns_on_grill = TRUE
-
-/obj/item/food/meat/slab/gondola
- name = "gondola meat"
- desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/gondola_mutation_toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
- tastes = list("meat" = 4, "tranquility" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/gondola/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/gondola/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
-
-
-/obj/item/food/meat/slab/penguin
- name = "penguin meat"
- icon_state = "birdmeat"
- desc = "A slab of penguin meat."
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/cooking_oil = 3)
- tastes = list("beef" = 1, "cod fish" = 1)
-
-/obj/item/food/meat/slab/penguin/MakeProcessable()
- . = ..()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/penguin/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
-
-/obj/item/food/meat/slab/rawcrab
- name = "raw crab meat"
- desc = "A pile of raw crab meat."
- icon_state = "crabmeatraw"
- bite_consumption = 3
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cooking_oil = 3)
- tastes = list("raw crab" = 1)
- foodtypes = RAW | MEAT
-
-/obj/item/food/meat/slab/rawcrab/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/crab, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
-
-/obj/item/food/meat/crab
- name = "crab meat"
- desc = "Some deliciously cooked crab meat."
- icon_state = "crabmeat"
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 2)
- tastes = list("crab" = 1)
- foodtypes = SEAFOOD
- burns_on_grill = TRUE
-
-/obj/item/food/meat/slab/chicken
- name = "chicken meat"
- icon_state = "birdmeat"
- desc = "A slab of raw chicken. Remember to wash your hands!"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) //low fat
- tastes = list("chicken" = 1)
-
-/obj/item/food/meat/slab/chicken/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/meat/slab/chicken/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken)
-
-/obj/item/food/meat/slab/chicken/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
-////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
-
-/obj/item/food/meat/steak
- name = "steak"
- desc = "A piece of hot spicy meat."
- icon_state = "meatsteak"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtypes = MEAT
- tastes = list("meat" = 1)
- burns_on_grill = TRUE
-
-/obj/item/food/meat/steak/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
-
-
-/obj/item/food/meat/steak/proc/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
- SIGNAL_HANDLER
- name = "[source_item.name] steak"
-
-/obj/item/food/meat/steak/plain
- foodtypes = MEAT
-
-/obj/item/food/meat/steak/plain/human
- tastes = list("tender meat" = 1)
- foodtypes = MEAT | GROSS
-
-///Make sure the steak has the correct name
-/obj/item/food/meat/steak/plain/human/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
- . = ..()
- if(istype(source_item, /obj/item/food/meat))
- var/obj/item/food/meat/origin_meat = source_item
- subjectname = origin_meat.subjectname
- subjectjob = origin_meat.subjectjob
- if(subjectname)
- name = "[origin_meat.subjectname] meatsteak"
- else if(subjectjob)
- name = "[origin_meat.subjectjob] meatsteak"
-
-
-/obj/item/food/meat/steak/killertomato
- name = "killer tomato steak"
- tastes = list("tomato" = 1)
- foodtypes = FRUIT
-
-/obj/item/food/meat/steak/bear
- name = "bear steak"
- tastes = list("meat" = 1, "salmon" = 1)
-
-/obj/item/food/meat/steak/xeno
- name = "xeno steak"
- tastes = list("meat" = 1, "acid" = 1)
-
-/obj/item/food/meat/steak/spider
- name = "spider steak"
- tastes = list("cobwebs" = 1)
-
-/obj/item/food/meat/steak/goliath
- name = "goliath steak"
- desc = "A delicious, lava cooked steak."
- resistance_flags = LAVA_PROOF | FIRE_PROOF
- icon_state = "goliathsteak"
- trash_type = null
- tastes = list("meat" = 1, "rock" = 1)
- foodtypes = MEAT
-
-/obj/item/food/meat/steak/gondola
- name = "gondola steak"
- tastes = list("meat" = 1, "tranquility" = 1)
-
-/obj/item/food/meat/steak/penguin
- name = "penguin steak"
- icon_state = "birdsteak"
- tastes = list("beef" = 1, "cod fish" = 1)
-
-/obj/item/food/meat/steak/chicken
- name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
- icon_state = "birdsteak"
- tastes = list("chicken" = 1)
-
-/obj/item/food/meat/steak/plain/human/lizard
- name = "lizard steak"
- icon_state = "birdsteak"
- tastes = list("juicy chicken" = 3, "scales" = 1)
- foodtypes = MEAT
-
-/obj/item/food/meat/steak/meatproduct
- name = "thermally processed meat product"
- icon_state = "meatproductsteak"
- tastes = list("enhanced char" = 2, "suspicious tenderness" = 2, "natural & artificial dyes" = 2, "emulsifying agents" = 1)
-
-/obj/item/food/meat/steak/plain/synth
- name = "synthsteak"
- desc = "A synthetic meat steak. It doesn't look quite right, now does it?"
- icon_state = "meatsteak_old"
- tastes = list("meat" = 4, "cryoxandone" = 1)
-
-//////////////////////////////// MEAT CUTLETS ///////////////////////////////////////////////////////
-
-//Raw cutlets
-
-/obj/item/food/meat/rawcutlet
- name = "raw cutlet"
- desc = "A raw meat cutlet."
- icon_state = "rawcutlet"
- bite_consumption = 2
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT | RAW
- var/meat_type = "meat"
-
-/obj/item/food/meat/rawcutlet/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/item, list/chosen_option, atom/original_atom)
- ..()
- if(!istype(original_atom, /obj/item/food/meat/slab))
- return
- var/obj/item/food/meat/slab/original_slab = original_atom
- var/mutable_appearance/filling = mutable_appearance(icon, "rawcutlet_coloration")
- filling.color = original_slab.slab_color
- add_overlay(filling)
- name = "raw [original_atom.name] cutlet"
- meat_type = original_atom.name
-
-/obj/item/food/meat/rawcutlet/plain
- foodtypes = MEAT
-
-/obj/item/food/meat/rawcutlet/plain
-
-/obj/item/food/meat/rawcutlet/plain/human
- tastes = list("tender meat" = 1)
- foodtypes = MEAT | RAW | GROSS
-
-/obj/item/food/meat/rawcutlet/plain/human/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain/human, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/plain/human/OnCreatedFromProcessing(mob/living/user, obj/item/item, list/chosen_option, atom/original_atom)
- . = ..()
- if(!istype(original_atom, /obj/item/food/meat))
- return
- var/obj/item/food/meat/origin_meat = original_atom
- subjectname = origin_meat.subjectname
- subjectjob = origin_meat.subjectjob
- if(subjectname)
- name = "raw [origin_meat.subjectname] cutlet"
- else if(subjectjob)
- name = "raw [origin_meat.subjectjob] cutlet"
-
-/obj/item/food/meat/rawcutlet/killertomato
- name = "raw killer tomato cutlet"
- tastes = list("tomato" = 1)
- foodtypes = FRUIT
-
-/obj/item/food/meat/rawcutlet/killertomato/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/killertomato, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/bear
- name = "raw bear cutlet"
- tastes = list("meat" = 1, "salmon" = 1)
-
-/obj/item/food/meat/rawcutlet/bear/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-/obj/item/food/meat/rawcutlet/bear/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/bear, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-/obj/item/food/meat/rawcutlet/xeno
- name = "raw xeno cutlet"
- tastes = list("meat" = 1, "acid" = 1)
-
-/obj/item/food/meat/rawcutlet/xeno/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/xeno, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/spider
- name = "raw spider cutlet"
- tastes = list("cobwebs" = 1)
-
-/obj/item/food/meat/rawcutlet/spider/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/spider, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-/obj/item/food/meat/rawcutlet/gondola
- name = "raw gondola cutlet"
- tastes = list("meat" = 1, "tranquility" = 1)
-
-/obj/item/food/meat/rawcutlet/gondola/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/gondola, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-/obj/item/food/meat/rawcutlet/penguin
- name = "raw penguin cutlet"
- tastes = list("beef" = 1, "cod fish" = 1)
-
-/obj/item/food/meat/rawcutlet/penguin/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/penguin, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/chicken
- name = "raw chicken cutlet"
- tastes = list("chicken" = 1)
-
-/obj/item/food/meat/rawcutlet/chicken/MakeGrillable()
- AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/chicken, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
-
-/obj/item/food/meat/rawcutlet/chicken/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
-
-//Cooked cutlets
-
-/obj/item/food/meat/cutlet
- name = "cutlet"
- desc = "A cooked meat cutlet."
- icon_state = "cutlet"
- bite_consumption = 2
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
- tastes = list("meat" = 1)
- foodtypes = MEAT
- burns_on_grill = TRUE
-
-/obj/item/food/meat/cutlet/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
-
-///This proc handles setting up the correct meat name for the cutlet, this should definitely be changed with the food rework.
-/obj/item/food/meat/cutlet/proc/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
- SIGNAL_HANDLER
- if(istype(source_item, /obj/item/food/meat/rawcutlet))
- var/obj/item/food/meat/rawcutlet/original_cutlet = source_item
- name = "[original_cutlet.meat_type] cutlet"
-
-/obj/item/food/meat/cutlet/plain
-
-/obj/item/food/meat/cutlet/plain/human
- tastes = list("tender meat" = 1)
- foodtypes = MEAT | GROSS
-
-/obj/item/food/meat/cutlet/plain/human/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
- . = ..()
- if(istype(source_item, /obj/item/food/meat))
- var/obj/item/food/meat/origin_meat = source_item
- if(subjectname)
- name = "[origin_meat.subjectname] [initial(name)]"
- else if(subjectjob)
- name = "[origin_meat.subjectjob] [initial(name)]"
-
-/obj/item/food/meat/cutlet/killertomato
- name = "killer tomato cutlet"
- tastes = list("tomato" = 1)
- foodtypes = FRUIT
-
-/obj/item/food/meat/cutlet/bear
- name = "bear cutlet"
- tastes = list("meat" = 1, "salmon" = 1)
-
-/obj/item/food/meat/cutlet/xeno
- name = "xeno cutlet"
- tastes = list("meat" = 1, "acid" = 1)
-
-/obj/item/food/meat/cutlet/spider
- name = "spider cutlet"
- tastes = list("cobwebs" = 1)
-
-/obj/item/food/meat/cutlet/gondola
- name = "gondola cutlet"
- tastes = list("meat" = 1, "tranquility" = 1)
-
-/obj/item/food/meat/cutlet/penguin
- name = "penguin cutlet"
- tastes = list("beef" = 1, "cod fish" = 1)
-
-/obj/item/food/meat/cutlet/chicken
- name = "chicken cutlet"
- tastes = list("chicken" = 1)
-
-/obj/item/food/fried_chicken
- name = "fried chicken"
- desc = "A juicy hunk of chicken meat, fried to perfection."
- icon_state = "fried_chicken1"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("chicken" = 3, "fried batter" = 1)
- foodtypes = MEAT | FRIED
- junkiness = 25
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/fried_chicken/Initialize(mapload)
- . = ..()
- if(prob(50))
- icon_state = "fried_chicken2"
-
-/obj/item/food/beef_stroganoff
- name = "beef stroganoff"
- desc = "A russian dish that consists of beef and sauce. Really popular in japan, or at least that's what my animes would allude to."
- icon_state = "beefstroganoff"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("beef" = 3, "sour cream" = 1, "salt" = 1, "pepper" = 1)
- foodtypes = MEAT | VEGETABLES | DAIRY
-
- w_class = WEIGHT_CLASS_SMALL
- //basic ingredients, but a lot of them. just covering costs here
- venue_value = FOOD_PRICE_NORMAL
-
-/obj/item/food/beef_wellington
- name = "beef wellington"
- desc = "A luxurious log of beef, covered in a fine mushroom duxelle and pancetta ham, then bound in puff pastry."
- icon_state = "beef_wellington"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 21, /datum/reagent/consumable/nutriment/vitamin = 6)
- tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1)
- foodtypes = MEAT | VEGETABLES | GRAIN
- w_class = WEIGHT_CLASS_NORMAL
- venue_value = FOOD_PRICE_EXOTIC
-
-/obj/item/food/beef_wellington/MakeProcessable()
- AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/beef_wellington_slice, 3, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/beef_wellington_slice
- name = "beef wellington slice"
- desc = "A slice of beef wellington, topped with a rich gravy. Simply delicious."
- icon_state = "beef_wellington_slice"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1)
- foodtypes = MEAT | VEGETABLES | GRAIN
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_NORMAL
-
-/obj/item/food/full_english
- name = "full english breakfast"
- desc = "A hearty plate with all the trimmings, representing the pinnacle of the breakfast art."
- icon_state = "full_english"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("sausage" = 1, "bacon" = 1, "egg" = 1, "tomato" = 1, "mushrooms" = 1, "bread" = 1, "beans" = 1)
- foodtypes = MEAT | VEGETABLES | GRAIN | BREAKFAST
- w_class = WEIGHT_CLASS_SMALL
- venue_value = FOOD_PRICE_EXOTIC
diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm
new file mode 100644
index 0000000000000..04accb0688d6f
--- /dev/null
+++ b/code/game/objects/items/food/meatdish.dm
@@ -0,0 +1,755 @@
+//Not only meat, actually, but also snacks that are almost meat, such as fish meat or tofu
+
+
+////////////////////////////////////////////FISH////////////////////////////////////////////
+
+/obj/item/food/cubancarp
+ name = "\improper Cuban carp"
+ desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "cubancarp"
+ bite_consumption = 3
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1)
+ foodtypes = SEAFOOD | FRIED
+ w_class = WEIGHT_CLASS_SMALL
+
+
+/obj/item/food/fishmeat
+ name = "fish fillet"
+ desc = "A fillet of some fish meat."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "fishfillet"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bite_consumption = 6
+ tastes = list("fish" = 1)
+ foodtypes = SEAFOOD
+ eatverbs = list("bite", "chew", "gnaw", "swallow", "chomp")
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/fishmeat/carp
+ name = "carp fillet"
+ desc = "A fillet of spess carp meat."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ /// Cytology category you can swab the meat for.
+ var/cell_line = CELL_LINE_TABLE_CARP
+
+/obj/item/food/fishmeat/carp/Initialize(mapload)
+ . = ..()
+ if(cell_line)
+ AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/fishmeat/carp/imitation
+ name = "imitation carp fillet"
+ desc = "Almost just like the real thing, kinda."
+ cell_line = null
+
+/obj/item/food/fishmeat/moonfish
+ name = "moonfish fillet"
+ desc = "A fillet of moonfish."
+ icon = 'icons/obj/food/lizard.dmi'
+ icon_state = "moonfish_fillet"
+
+/obj/item/food/fishmeat/moonfish/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/grilled_moonfish, rand(40 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/fishmeat/gunner_jellyfish
+ name = "filleted gunner jellyfish"
+ desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic."
+ icon = 'icons/obj/food/lizard.dmi'
+ icon_state = "jellyfish_fillet"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/mindbreaker = 2)
+
+/obj/item/food/fishmeat/armorfish
+ name = "cleaned armorfish"
+ desc = "An armorfish with its guts and shell removed, ready for use in cooking."
+ icon = 'icons/obj/food/lizard.dmi'
+ icon_state = "armorfish_fillet"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3)
+
+/obj/item/food/fishmeat/donkfish
+ name = "donkfillet"
+ desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked."
+ icon_state = "donkfillet"
+ food_reagents = list(/datum/reagent/yuck = 3)
+
+/obj/item/food/fishfingers
+ name = "fish fingers"
+ desc = "A finger of fish."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "fishfingers"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bite_consumption = 1
+ tastes = list("fish" = 1, "breadcrumbs" = 1)
+ foodtypes = SEAFOOD | FRIED
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_EXOTIC
+
+/obj/item/food/fishandchips
+ name = "fish and chips"
+ desc = "I do say so myself chap."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "fishandchips"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("fish" = 1, "chips" = 1)
+ foodtypes = SEAFOOD | VEGETABLES | FRIED
+ venue_value = FOOD_PRICE_NORMAL
+
+/obj/item/food/fishfry
+ name = "fish fry"
+ desc = "All that and no bag of chips..."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "fishfry"
+ food_reagents = list (/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3)
+ tastes = list("fish" = 1, "pan seared vegtables" = 1)
+ foodtypes = SEAFOOD | VEGETABLES | FRIED
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/fishtaco
+ name = "fish taco"
+ desc = "A taco with fish, cheese, and cabbage."
+ icon_state = "fishtaco"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("taco" = 4, "fish" = 2, "cheese" = 2, "cabbage" = 1)
+ foodtypes = SEAFOOD | DAIRY | GRAIN | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/vegetariansushiroll
+ name = "vegetarian sushi roll"
+ desc = "A roll of simple vegetarian sushi with rice, carrots, and potatoes. Sliceable into pieces!"
+ icon_state = "vegetariansushiroll"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2)
+ foodtypes = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/vegetariansushiroll/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/vegetariansushislice, 4)
+
+/obj/item/food/vegetariansushislice
+ name = "vegetarian sushi slice"
+ desc = "A slice of simple vegetarian sushi with rice, carrots, and potatoes."
+ icon_state = "vegetariansushislice"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2)
+ foodtypes = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/spicyfiletsushiroll
+ name = "spicy filet sushi roll"
+ desc = "A roll of tasty, spicy sushi made with fish and vegetables. Sliceable into pieces!"
+ icon_state = "spicyfiletroll"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2)
+ foodtypes = VEGETABLES | SEAFOOD
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/spicyfiletsushiroll/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spicyfiletsushislice, 4)
+
+/obj/item/food/spicyfiletsushislice
+ name = "spicy filet sushi slice"
+ desc = "A slice of tasty, spicy sushi made with fish and vegetables. Don't eat it too fast!."
+ icon_state = "spicyfiletslice"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2)
+ foodtypes = VEGETABLES | SEAFOOD
+ w_class = WEIGHT_CLASS_SMALL
+
+// empty sushi for custom sushi
+/obj/item/food/sushi/empty
+ name = "sushi"
+ foodtypes = NONE
+ tastes = list()
+ icon_state = "vegetariansushiroll"
+ desc = "A roll of customized sushi."
+
+/obj/item/food/sushi/empty/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sushislice/empty, 4)
+
+/obj/item/food/sushislice/empty
+ name = "sushi slice"
+ foodtypes = NONE
+ tastes = list()
+ icon_state = "vegetariansushislice"
+ desc = "A slice of customized sushi."
+
+/obj/item/food/nigiri_sushi
+ name = "nigiri sushi"
+ desc = "A simple nigiri of fish atop a packed rice ball with a seaweed wrapping and a side of soy sauce."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "nigiri_sushi"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("boiled rice" = 4, "fish filet" = 2, "soy sauce" = 2)
+ foodtypes = SEAFOOD | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/meat_poke
+ name = "meat poke"
+ desc = "Simple poke, rice on the bottom, vegetables and meat on top. Should be mixed before eating."
+ icon = 'icons/obj/food/soupsalad.dmi'
+ icon_state = "pokemeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("rice and meat" = 4, "lettuce" = 2, "soy sauce" = 2)
+ foodtypes = SEAFOOD | MEAT | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/fish_poke
+ name = "fish poke"
+ desc = "Simple poke, rice on the bottom, vegetables and fish on top. Should be mixed before eating."
+ icon = 'icons/obj/food/soupsalad.dmi'
+ icon_state = "pokefish"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("rice and fish" = 4, "lettuce" = 2, "soy sauce" = 2)
+ foodtypes = SEAFOOD | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
+
+/obj/item/food/tempeh
+ name = "raw tempeh block"
+ desc = "Fungus fermented soybean cake, warm to the touch."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "tempeh"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8)
+ tastes = list("earthy" = 3, "nutty" = 2, "bland" = 1 )
+ foodtypes = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_CHEAP
+
+// sliceable into 4xtempehslices
+/obj/item/food/tempeh/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/tempehslice, 4, 5 SECONDS, table_required = TRUE)
+
+//add an icon for slices
+/obj/item/food/tempehslice
+ name = "tempeh slice"
+ desc = "A slice of tempeh, a slice of wkwkwk."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "tempehslice"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("earthy" = 3, "nutty" = 2, "bland" = 1)
+ foodtypes = VEGETABLES
+
+//add an icon for blends
+/obj/item/food/tempehstarter
+ name = "tempeh starter"
+ desc = "A mix of soy and joy. It's warm... and moving?"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "tempehstarter"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("nutty" = 2, "bland" = 2)
+ foodtypes = VEGETABLES | GROSS
+
+/obj/item/food/tofu
+ name = "tofu"
+ desc = "We all love tofu."
+ icon_state = "tofu"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("tofu" = 1)
+ foodtypes = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/tofu/prison
+ name = "soggy tofu"
+ desc = "You refuse to eat this strange bean curd."
+ tastes = list("sour, rotten water" = 1)
+ foodtypes = GROSS
+
+/obj/item/food/spiderleg
+ name = "spider leg"
+ desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "spiderleg"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/toxin = 2)
+ tastes = list("cobwebs" = 1)
+ foodtypes = MEAT | TOXIC
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/spiderleg/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/boiledspiderleg, rand(50 SECONDS, 60 SECONDS), TRUE, TRUE)
+
+/obj/item/food/cornedbeef
+ name = "corned beef and cabbage"
+ desc = "Now you can feel like a real tourist vacationing in Ireland."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "cornedbeef"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("meat" = 1, "cabbage" = 1)
+ foodtypes = MEAT | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/bearsteak
+ name = "Filet migrawr"
+ desc = "Because eating bear wasn't manly enough."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "bearsteak"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 9, /datum/reagent/consumable/ethanol/manly_dorf = 5)
+ tastes = list("meat" = 1, "salmon" = 1)
+ foodtypes = MEAT | ALCOHOL
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_EXOTIC
+
+/obj/item/food/raw_meatball
+ name = "raw meatball"
+ desc = "A great meal all round. Not a cord of wood. Kinda raw"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_meatball"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/meatball_type = /obj/item/food/meatball
+ var/patty_type = /obj/item/food/raw_patty
+
+/obj/item/food/raw_meatball/MakeGrillable()
+ AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_meatball/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE)
+
+/obj/item/food/raw_meatball/human
+ name = "strange raw meatball"
+ meatball_type = /obj/item/food/meatball/human
+ patty_type = /obj/item/food/raw_patty/human
+
+/obj/item/food/raw_meatball/corgi
+ name = "raw corgi meatball"
+ meatball_type = /obj/item/food/meatball/corgi
+ patty_type = /obj/item/food/raw_patty/corgi
+
+/obj/item/food/raw_meatball/xeno
+ name = "raw xeno meatball"
+ meatball_type = /obj/item/food/meatball/xeno
+ patty_type = /obj/item/food/raw_patty/xeno
+
+/obj/item/food/raw_meatball/bear
+ name = "raw bear meatball"
+ meatball_type = /obj/item/food/meatball/bear
+ patty_type = /obj/item/food/raw_patty/bear
+
+/obj/item/food/raw_meatball/chicken
+ name = "raw chicken meatball"
+ meatball_type = /obj/item/food/meatball/chicken
+ patty_type = /obj/item/food/raw_patty/chicken
+
+/obj/item/food/meatball
+ name = "meatball"
+ desc = "A great meal all round. Not a cord of wood."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "meatball"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT
+ food_flags = FOOD_FINGER_FOOD
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/meatball/human
+ name = "strange meatball"
+
+/obj/item/food/meatball/corgi
+ name = "corgi meatball"
+
+/obj/item/food/meatball/bear
+ name = "bear meatball"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meatball/xeno
+ name = "xenomorph meatball"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meatball/chicken
+ name = "chicken meatball"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_meatball"
+
+/obj/item/food/raw_patty
+ name = "raw patty"
+ desc = "I'm.....NOT REAAADDYY."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/patty_type = /obj/item/food/patty/plain
+
+/obj/item/food/raw_patty/MakeGrillable()
+ AddComponent(/datum/component/grillable, patty_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_patty/human
+ name = "strange raw patty"
+ patty_type = /obj/item/food/patty/human
+
+/obj/item/food/raw_patty/corgi
+ name = "raw corgi patty"
+ patty_type = /obj/item/food/patty/corgi
+
+/obj/item/food/raw_patty/bear
+ name = "raw bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+ patty_type = /obj/item/food/patty/bear
+
+/obj/item/food/raw_patty/xeno
+ name = "raw xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+ patty_type = /obj/item/food/patty/xeno
+
+/obj/item/food/raw_patty/chicken
+ name = "raw chicken patty"
+ tastes = list("chicken" = 1)
+ patty_type = /obj/item/food/patty/chicken
+
+/obj/item/food/patty
+ name = "patty"
+ desc = "The nanotrasen patty is the patty for you and me!"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+
+///Exists purely for the crafting recipe (because itll take subtypes)
+/obj/item/food/patty/plain
+
+/obj/item/food/patty/human
+ name = "strange patty"
+
+/obj/item/food/patty/corgi
+ name = "corgi patty"
+
+/obj/item/food/patty/bear
+ name = "bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/patty/xeno
+ name = "xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/patty/chicken
+ name = "chicken patty"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_patty"
+
+/obj/item/food/raw_sausage
+ name = "raw sausage"
+ desc = "A piece of mixed, long meat, but then raw."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_sausage"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp")
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/raw_sausage/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/sausage, rand(60 SECONDS, 75 SECONDS), TRUE)
+
+/obj/item/food/sausage
+ name = "sausage"
+ desc = "A piece of mixed, long meat."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "sausage"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | BREAKFAST
+ food_flags = FOOD_FINGER_FOOD
+ eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp")
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/sausage/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE)
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/sausage/american
+ name = "american sausage"
+ desc = "Snip."
+ icon_state = "american_sausage"
+
+/obj/item/food/sausage/american/MakeProcessable()
+ return
+
+/obj/item/food/salami
+ name = "salami"
+ desc = "A slice of cured salami."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "salami"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
+ tastes = list("meat" = 1, "smoke" = 1)
+ foodtypes = MEAT
+ food_flags = FOOD_FINGER_FOOD
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/rawkhinkali
+ name = "raw khinkali"
+ desc = "One hundred khinkalis? Do I look like a pig?"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "khinkali"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
+ tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/rawkhinkali/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/khinkali, rand(50 SECONDS, 60 SECONDS), TRUE)
+
+/obj/item/food/khinkali
+ name = "khinkali"
+ desc = "One hundred khinkalis? Do I look like a pig?"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "khinkali"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
+ bite_consumption = 3
+ tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+
+/obj/item/food/meatbun
+ name = "meat bun"
+ desc = "Has the potential to not be Dog."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "meatbun"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("bun" = 3, "meat" = 2)
+ foodtypes = GRAIN | MEAT | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/stewedsoymeat
+ name = "stewed soy meat"
+ desc = "Even non-vegetarians will LOVE this!"
+ icon_state = "stewedsoymeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("soy" = 1, "vegetables" = 1)
+ eatverbs = list("slurp", "sip", "inhale", "drink")
+ foodtypes = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/boiledspiderleg
+ name = "boiled spider leg"
+ desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "spiderlegcooked"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("hot peppers" = 1, "cobwebs" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+
+/obj/item/food/spidereggsham
+ name = "green eggs and ham"
+ desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "spidereggsham"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bite_consumption = 4
+ tastes = list("meat" = 1, "the colour green" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/sashimi
+ name = "carp sashimi"
+ desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself. You sure hope whoever made this is skilled."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "sashimi"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/capsaicin = 9, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("fish" = 1, "hot peppers" = 1)
+ foodtypes = SEAFOOD
+ w_class = WEIGHT_CLASS_TINY
+ //total price of this dish is 20 and a small amount more for soy sauce, all of which are available at the orders console
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/sashimi/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/nugget
+ name = "chicken nugget"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ icon = 'icons/obj/food/meat.dmi'
+ tastes = list("\"chicken\"" = 1)
+ foodtypes = MEAT
+ food_flags = FOOD_FINGER_FOOD
+ w_class = WEIGHT_CLASS_TINY
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/nugget/Initialize(mapload)
+ . = ..()
+ var/shape = pick("lump", "star", "lizard", "corgi")
+ desc = "A 'chicken' nugget vaguely shaped like a [shape]."
+ icon_state = "nugget_[shape]"
+
+/obj/item/food/pigblanket
+ name = "pig in a blanket"
+ desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "pigblanket"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 1, "butter" = 1)
+ foodtypes = MEAT | DAIRY | GRAIN
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/food/bbqribs
+ name = "bbq ribs"
+ desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "ribs"
+ w_class = WEIGHT_CLASS_NORMAL
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/bbqsauce = 10)
+ tastes = list("meat" = 3, "smokey sauce" = 1)
+ foodtypes = MEAT | SUGAR
+
+/obj/item/food/meatclown
+ name = "meat clown"
+ desc = "A delicious, round piece of meat clown. How horrifying."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "meatclown"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/banana = 2)
+ tastes = list("meat" = 5, "clowns" = 3, "sixteen teslas" = 1)
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/meatclown/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/slippery, 3 SECONDS)
+
+/obj/item/food/lasagna
+ name = "Lasagna"
+ desc = "A slice of lasagna. Perfect for a Monday afternoon."
+ icon_state = "lasagna"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/tomatojuice = 10)
+ tastes = list("meat" = 3, "pasta" = 3, "tomato" = 2, "cheese" = 2)
+ foodtypes = MEAT | DAIRY | GRAIN
+ venue_value = FOOD_PRICE_NORMAL
+
+//////////////////////////////////////////// KEBABS AND OTHER SKEWERS ////////////////////////////////////////////
+
+/obj/item/food/kebab
+ trash_type = /obj/item/stack/rods
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "kebab"
+ w_class = WEIGHT_CLASS_NORMAL
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 14)
+ tastes = list("meat" = 3, "metal" = 1)
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/kebab/human
+ name = "human-kebab"
+ desc = "A human meat, on a stick."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 6)
+ tastes = list("tender meat" = 3, "metal" = 1)
+ foodtypes = MEAT | GORE
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/kebab/monkey
+ name = "meat-kebab"
+ desc = "Delicious meat, on a stick."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 3, "metal" = 1)
+ foodtypes = MEAT
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/kebab/tofu
+ name = "tofu-kebab"
+ desc = "Vegan meat, on a stick."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15)
+ tastes = list("tofu" = 3, "metal" = 1)
+ foodtypes = VEGETABLES
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/kebab/tail
+ name = "lizard-tail kebab"
+ desc = "Severed lizard tail on a stick."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 30, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("meat" = 8, "metal" = 4, "scales" = 1)
+ foodtypes = MEAT | GORE
+
+/obj/item/food/kebab/rat
+ name = "rat-kebab"
+ desc = "Not so delicious rat meat, on a stick."
+ icon_state = "ratkebab"
+ w_class = WEIGHT_CLASS_NORMAL
+ trash_type = null
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("rat meat" = 1, "metal" = 1)
+ foodtypes = MEAT | GORE
+ venue_value = FOOD_PRICE_CHEAP
+
+/obj/item/food/kebab/rat/double
+ name = "double rat-kebab"
+ icon_state = "doubleratkebab"
+ tastes = list("rat meat" = 2, "metal" = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 20, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/iron = 2)
+
+/obj/item/food/kebab/fiesta
+ name = "fiesta skewer"
+ icon_state = "fiestaskewer"
+ tastes = list("tex-mex" = 3, "cumin" = 2)
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/capsaicin = 3)
+
+/obj/item/food/fried_chicken
+ name = "fried chicken"
+ desc = "A juicy hunk of chicken meat, fried to perfection."
+ icon_state = "fried_chicken1"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("chicken" = 3, "fried batter" = 1)
+ foodtypes = MEAT | FRIED
+ junkiness = 25
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/fried_chicken/Initialize(mapload)
+ . = ..()
+ if(prob(50))
+ icon_state = "fried_chicken2"
+
+/obj/item/food/beef_stroganoff
+ name = "beef stroganoff"
+ desc = "A russian dish that consists of beef and sauce. Really popular in japan, or at least that's what my animes would allude to."
+ icon_state = "beefstroganoff"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("beef" = 3, "sour cream" = 1, "salt" = 1, "pepper" = 1)
+ foodtypes = MEAT | VEGETABLES | DAIRY
+
+ w_class = WEIGHT_CLASS_SMALL
+ //basic ingredients, but a lot of them. just covering costs here
+ venue_value = FOOD_PRICE_NORMAL
+
+/obj/item/food/beef_wellington
+ name = "beef wellington"
+ desc = "A luxurious log of beef, covered in a fine mushroom duxelle and pancetta ham, then bound in puff pastry."
+ icon_state = "beef_wellington"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 21, /datum/reagent/consumable/nutriment/vitamin = 6)
+ tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1)
+ foodtypes = MEAT | VEGETABLES | GRAIN
+ w_class = WEIGHT_CLASS_NORMAL
+ venue_value = FOOD_PRICE_EXOTIC
+
+/obj/item/food/beef_wellington/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/beef_wellington_slice, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/beef_wellington_slice
+ name = "beef wellington slice"
+ desc = "A slice of beef wellington, topped with a rich gravy. Simply delicious."
+ icon_state = "beef_wellington_slice"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1)
+ foodtypes = MEAT | VEGETABLES | GRAIN
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_NORMAL
+
+/obj/item/food/full_english
+ name = "full english breakfast"
+ desc = "A hearty plate with all the trimmings, representing the pinnacle of the breakfast art."
+ icon_state = "full_english"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("sausage" = 1, "bacon" = 1, "egg" = 1, "tomato" = 1, "mushrooms" = 1, "bread" = 1, "beans" = 1)
+ foodtypes = MEAT | VEGETABLES | GRAIN | BREAKFAST
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_EXOTIC
diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm
new file mode 100644
index 0000000000000..b90f07e4523a8
--- /dev/null
+++ b/code/game/objects/items/food/meatslab.dm
@@ -0,0 +1,656 @@
+/obj/item/food/meat
+ custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4)
+ w_class = WEIGHT_CLASS_SMALL
+ icon = 'icons/obj/food/meat.dmi'
+ var/subjectname = ""
+ var/subjectjob = null
+
+/obj/item/food/meat/slab
+ name = "meat"
+ desc = "A slab of meat."
+ icon_state = "meat"
+ bite_consumption = 3
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ ///Legacy code, handles the coloring of the overlay of the cutlets made from this.
+ var/slab_color = "#FF0000"
+
+
+/obj/item/food/meat/slab/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/dryable, /obj/item/food/sosjerky/healthy)
+
+/obj/item/food/meat/slab/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+/obj/item/food/meat/slab/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 3 SECONDS, table_required = TRUE)
+
+///////////////////////////////////// HUMAN MEATS //////////////////////////////////////////////////////
+
+/obj/item/food/meat/slab/human
+ name = "meat"
+ tastes = list("tender meat" = 1)
+ foodtypes = MEAT | RAW | GORE
+ venue_value = FOOD_MEAT_HUMAN
+
+/obj/item/food/meat/slab/human/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+/obj/item/food/meat/slab/human/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/human/mutant/slime
+ icon_state = "slimemeat"
+ desc = "Because jello wasn't offensive enough to vegans."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/slimejelly = 3)
+ tastes = list("slime" = 1, "jelly" = 1)
+ foodtypes = MEAT | RAW | TOXIC
+ venue_value = FOOD_MEAT_MUTANT_RARE
+
+/obj/item/food/meat/slab/human/mutant/golem
+ icon_state = "golemmeat"
+ desc = "Edible rocks, welcome to the future."
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/iron = 3)
+ tastes = list("rock" = 1)
+ foodtypes = MEAT | RAW | GROSS
+ venue_value = FOOD_MEAT_MUTANT_RARE
+
+/obj/item/food/meat/slab/human/mutant/golem/adamantine
+ icon_state = "agolemmeat"
+ desc = "From the slime pen to the rune to the kitchen, science."
+ foodtypes = MEAT | RAW | GROSS
+
+/obj/item/food/meat/slab/human/mutant/lizard
+ icon_state = "lizardmeat"
+ desc = "Delicious dino damage."
+ tastes = list("meat" = 4, "scales" = 1)
+ foodtypes = MEAT | RAW | GORE
+ venue_value = FOOD_MEAT_MUTANT
+
+/obj/item/food/meat/slab/human/mutant/lizard/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human/lizard, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/human/mutant/plant
+ icon_state = "plantmeat"
+ desc = "All the joys of healthy eating with all the fun of cannibalism."
+ tastes = list("salad" = 1, "wood" = 1)
+ foodtypes = VEGETABLES
+ venue_value = FOOD_MEAT_MUTANT_RARE
+
+/obj/item/food/meat/slab/human/mutant/shadow
+ icon_state = "shadowmeat"
+ desc = "Ow, the edge."
+ tastes = list("darkness" = 1, "meat" = 1)
+ foodtypes = MEAT | RAW | GORE
+ venue_value = FOOD_MEAT_MUTANT_RARE
+
+/obj/item/food/meat/slab/human/mutant/fly
+ icon_state = "flymeat"
+ desc = "Nothing says tasty like maggot filled radioactive mutant flesh."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/uranium = 3)
+ tastes = list("maggots" = 1, "the inside of a reactor" = 1)
+ foodtypes = MEAT | RAW | GROSS | BUGS | GORE
+ venue_value = FOOD_MEAT_MUTANT
+
+/obj/item/food/meat/slab/human/mutant/moth
+ icon_state = "mothmeat"
+ desc = "Unpleasantly powdery and dry. Kind of pretty, though."
+ tastes = list("dust" = 1, "powder" = 1, "meat" = 2)
+ foodtypes = MEAT | RAW | BUGS | GORE
+ venue_value = FOOD_MEAT_MUTANT
+
+/obj/item/food/meat/slab/human/mutant/skeleton
+ name = "bone"
+ icon_state = "skeletonmeat"
+ desc = "There's a point where this needs to stop, and clearly we have passed it."
+ tastes = list("bone" = 1)
+ foodtypes = GROSS | GORE
+ venue_value = FOOD_MEAT_MUTANT_RARE
+
+/obj/item/food/meat/slab/human/mutant/skeleton/MakeProcessable()
+ return //skeletons dont have cutlets
+
+/obj/item/food/meat/slab/human/mutant/zombie
+ name = "meat (rotten)"
+ icon_state = "rottenmeat"
+ desc = "Halfway to becoming fertilizer for your garden."
+ tastes = list("brains" = 1, "meat" = 1)
+ foodtypes = RAW | MEAT | TOXIC | GORE | GROSS
+
+/obj/item/food/meat/slab/human/mutant/ethereal
+ icon_state = "etherealmeat"
+ desc = "So shiny you feel like ingesting it might make you shine too"
+ food_reagents = list(/datum/reagent/consumable/liquidelectricity/enriched = 10)
+ tastes = list("pure electricity" = 2, "meat" = 1)
+ foodtypes = RAW | MEAT | TOXIC | GORE
+ venue_value = FOOD_MEAT_MUTANT
+
+////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
+
+/obj/item/food/meat/slab/synthmeat
+ name = "synthmeat"
+ icon_state = "meat_old"
+ desc = "A synthetic slab of meat."
+ foodtypes = RAW | MEAT //hurr durr chemicals we're harmed in the production of this meat thus its non-vegan.
+ venue_value = FOOD_PRICE_WORTHLESS
+
+/obj/item/food/meat/slab/synthmeat/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/synth, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/meatproduct
+ name = "meat product"
+ icon_state = "meatproduct"
+ desc = "A slab of station reclaimed and chemically processed meat product."
+ tastes = list("meat flavoring" = 2, "modified starches" = 2, "natural & artificial dyes" = 1, "butyric acid" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/meatproduct/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/meatproduct, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/monkey
+ name = "monkey meat"
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/bugmeat
+ name = "bug meat"
+ icon_state = "spidermeat"
+ foodtypes = RAW | MEAT | BUGS
+
+/obj/item/food/meat/slab/mouse
+ name = "mouse meat"
+ desc = "A slab of mouse meat. Best not eat it raw."
+ foodtypes = RAW | MEAT | GORE
+
+/obj/item/food/meat/slab/mouse/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/corgi
+ name = "corgi meat"
+ desc = "Tastes like... well you know..."
+ tastes = list("meat" = 4, "a fondness for wearing hats" = 1)
+ foodtypes = RAW | MEAT | GORE
+
+/obj/item/food/meat/slab/corgi/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/mothroach
+ name = "mothroach meat"
+ desc = "A light slab of meat."
+ foodtypes = RAW | MEAT | GROSS
+
+/obj/item/food/meat/slab/mothroach/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/pug
+ name = "pug meat"
+ desc = "Tastes like... well you know..."
+ foodtypes = RAW | MEAT | GORE
+
+/obj/item/food/meat/slab/pug/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/killertomato
+ name = "killer tomato meat"
+ desc = "A slice from a huge tomato."
+ icon_state = "tomatomeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ tastes = list("tomato" = 1)
+ foodtypes = FRUIT
+
+/obj/item/food/meat/slab/killertomato/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/killertomato/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/bear
+ name = "bear meat"
+ desc = "A very manly slab of meat."
+ icon_state = "bearmeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6)
+ tastes = list("meat" = 1, "salmon" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/bear/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/bear/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/bear/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/xeno
+ name = "xeno meat"
+ desc = "A slab of meat."
+ icon_state = "xenomeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bite_consumption = 4
+ tastes = list("meat" = 1, "acid" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/xeno/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/xeno/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/spider
+ name = "spider meat"
+ desc = "A slab of spider meat. That is so Kafkaesque."
+ icon_state = "spidermeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("cobwebs" = 1)
+ foodtypes = RAW | MEAT | TOXIC
+
+/obj/item/food/meat/slab/spider/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/spider/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/slab/goliath
+ name = "goliath meat"
+ desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
+ icon_state = "goliathmeat"
+ tastes = list("meat" = 1)
+ foodtypes = RAW | MEAT | TOXIC
+
+/obj/item/food/meat/slab/goliath/burn()
+ visible_message(span_notice("[src] finishes cooking!"))
+ new /obj/item/food/meat/steak/goliath(loc)
+ qdel(src)
+
+/obj/item/food/meat/slab/meatwheat
+ name = "meatwheat clump"
+ desc = "This doesn't look like meat, but your standards aren't that high to begin with."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1)
+ icon_state = "meatwheat_clump"
+ bite_consumption = 4
+ tastes = list("meat" = 1, "wheat" = 1)
+ foodtypes = GRAIN
+
+/obj/item/food/meat/slab/gorilla
+ name = "gorilla meat"
+ desc = "Much meatier than monkey meat."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 5) //Plenty of fat!
+
+/obj/item/food/meat/rawbacon
+ name = "raw piece of bacon"
+ desc = "A raw piece of bacon."
+ icon_state = "baconb"
+ bite_consumption = 2
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/cooking_oil = 3)
+ tastes = list("bacon" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/rawbacon/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/bacon, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/bacon
+ name = "piece of bacon"
+ desc = "A delicious piece of bacon."
+ icon_state = "baconcookedb"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2)
+ tastes = list("bacon" = 1)
+ foodtypes = MEAT | BREAKFAST
+ burns_on_grill = TRUE
+
+/obj/item/food/meat/slab/gondola
+ name = "gondola meat"
+ desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/gondola_mutation_toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
+ tastes = list("meat" = 4, "tranquility" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/gondola/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/gondola/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+/obj/item/food/meat/slab/penguin
+ name = "penguin meat"
+ icon_state = "birdmeat"
+ desc = "A slab of penguin meat."
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/cooking_oil = 3)
+ tastes = list("beef" = 1, "cod fish" = 1)
+
+/obj/item/food/meat/slab/penguin/MakeProcessable()
+ . = ..()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/penguin/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+/obj/item/food/meat/slab/rawcrab
+ name = "raw crab meat"
+ desc = "A pile of raw crab meat."
+ icon_state = "crabmeatraw"
+ bite_consumption = 3
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cooking_oil = 3)
+ tastes = list("raw crab" = 1)
+ foodtypes = RAW | MEAT
+
+/obj/item/food/meat/slab/rawcrab/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/crab, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+/obj/item/food/meat/crab
+ name = "crab meat"
+ desc = "Some deliciously cooked crab meat."
+ icon_state = "crabmeat"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 2)
+ tastes = list("crab" = 1)
+ foodtypes = SEAFOOD
+ burns_on_grill = TRUE
+
+/obj/item/food/meat/slab/chicken
+ name = "chicken meat"
+ icon_state = "birdmeat"
+ desc = "A slab of raw chicken. Remember to wash your hands!"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) //low fat
+ tastes = list("chicken" = 1)
+
+/obj/item/food/meat/slab/chicken/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/meat/slab/chicken/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken)
+
+/obj/item/food/meat/slab/chicken/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/slab/pig
+ name = "raw pork"
+ icon_state = "pig_meat"
+ tastes = list("pig" = 1)
+ foodtypes = RAW | MEAT | GORE
+
+/obj/item/food/meat/slab/pig/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/pig, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
+
+////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
+/obj/item/food/meat/steak
+ name = "steak"
+ desc = "A piece of hot spicy meat."
+ icon_state = "meatsteak"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtypes = MEAT
+ tastes = list("meat" = 1)
+ burns_on_grill = TRUE
+
+/obj/item/food/meat/steak/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
+
+
+/obj/item/food/meat/steak/proc/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
+ SIGNAL_HANDLER
+ name = "[source_item.name] steak"
+
+/obj/item/food/meat/steak/plain
+ foodtypes = MEAT
+
+/obj/item/food/meat/steak/plain/human
+ tastes = list("tender meat" = 1)
+ foodtypes = MEAT | GORE
+
+///Make sure the steak has the correct name
+/obj/item/food/meat/steak/plain/human/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
+ . = ..()
+ if(istype(source_item, /obj/item/food/meat))
+ var/obj/item/food/meat/origin_meat = source_item
+ subjectname = origin_meat.subjectname
+ subjectjob = origin_meat.subjectjob
+ if(subjectname)
+ name = "[origin_meat.subjectname] meatsteak"
+ else if(subjectjob)
+ name = "[origin_meat.subjectjob] meatsteak"
+
+
+/obj/item/food/meat/steak/killertomato
+ name = "killer tomato steak"
+ tastes = list("tomato" = 1)
+ foodtypes = FRUIT
+
+/obj/item/food/meat/steak/bear
+ name = "bear steak"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meat/steak/xeno
+ name = "xeno steak"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meat/steak/spider
+ name = "spider steak"
+ tastes = list("cobwebs" = 1)
+
+/obj/item/food/meat/steak/goliath
+ name = "goliath steak"
+ desc = "A delicious, lava cooked steak."
+ resistance_flags = LAVA_PROOF | FIRE_PROOF
+ icon_state = "goliathsteak"
+ trash_type = null
+ tastes = list("meat" = 1, "rock" = 1)
+ foodtypes = MEAT
+
+/obj/item/food/meat/steak/gondola
+ name = "gondola steak"
+ tastes = list("meat" = 1, "tranquility" = 1)
+
+/obj/item/food/meat/steak/penguin
+ name = "penguin steak"
+ icon_state = "birdsteak"
+ tastes = list("beef" = 1, "cod fish" = 1)
+
+/obj/item/food/meat/steak/chicken
+ name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
+ icon_state = "birdsteak"
+ tastes = list("chicken" = 1)
+
+/obj/item/food/meat/steak/plain/human/lizard
+ name = "lizard steak"
+ icon_state = "birdsteak"
+ tastes = list("juicy chicken" = 3, "scales" = 1)
+ foodtypes = MEAT | GORE
+
+/obj/item/food/meat/steak/meatproduct
+ name = "thermally processed meat product"
+ icon_state = "meatproductsteak"
+ tastes = list("enhanced char" = 2, "suspicious tenderness" = 2, "natural & artificial dyes" = 2, "emulsifying agents" = 1)
+
+/obj/item/food/meat/steak/plain/synth
+ name = "synthsteak"
+ desc = "A synthetic meat steak. It doesn't look quite right, now does it?"
+ icon_state = "meatsteak_old"
+ tastes = list("meat" = 4, "cryoxandone" = 1)
+
+/obj/item/food/meat/steak/plain/pig
+ name = "pork chops"
+ icon_state = "pigsteak"
+ tastes = list("pig" = 1)
+ foodtypes = MEAT
+
+//////////////////////////////// MEAT CUTLETS ///////////////////////////////////////////////////////
+
+//Raw cutlets
+
+/obj/item/food/meat/rawcutlet
+ name = "raw cutlet"
+ desc = "A raw meat cutlet."
+ icon_state = "rawcutlet"
+ bite_consumption = 2
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ var/meat_type = "meat"
+
+/obj/item/food/meat/rawcutlet/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/item, list/chosen_option, atom/original_atom)
+ ..()
+ if(!istype(original_atom, /obj/item/food/meat/slab))
+ return
+ var/obj/item/food/meat/slab/original_slab = original_atom
+ var/mutable_appearance/filling = mutable_appearance(icon, "rawcutlet_coloration")
+ filling.color = original_slab.slab_color
+ add_overlay(filling)
+ name = "raw [original_atom.name] cutlet"
+ meat_type = original_atom.name
+
+/obj/item/food/meat/rawcutlet/plain
+ foodtypes = MEAT
+
+/obj/item/food/meat/rawcutlet/plain
+
+/obj/item/food/meat/rawcutlet/plain/human
+ tastes = list("tender meat" = 1)
+ foodtypes = MEAT | RAW | GORE
+
+/obj/item/food/meat/rawcutlet/plain/human/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain/human, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/plain/human/OnCreatedFromProcessing(mob/living/user, obj/item/item, list/chosen_option, atom/original_atom)
+ . = ..()
+ if(!istype(original_atom, /obj/item/food/meat))
+ return
+ var/obj/item/food/meat/origin_meat = original_atom
+ subjectname = origin_meat.subjectname
+ subjectjob = origin_meat.subjectjob
+ if(subjectname)
+ name = "raw [origin_meat.subjectname] cutlet"
+ else if(subjectjob)
+ name = "raw [origin_meat.subjectjob] cutlet"
+
+/obj/item/food/meat/rawcutlet/killertomato
+ name = "raw killer tomato cutlet"
+ tastes = list("tomato" = 1)
+ foodtypes = FRUIT
+
+/obj/item/food/meat/rawcutlet/killertomato/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/killertomato, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/bear
+ name = "raw bear cutlet"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meat/rawcutlet/bear/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/obj/item/food/meat/rawcutlet/bear/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/bear, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+/obj/item/food/meat/rawcutlet/xeno
+ name = "raw xeno cutlet"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meat/rawcutlet/xeno/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/xeno, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/spider
+ name = "raw spider cutlet"
+ tastes = list("cobwebs" = 1)
+
+/obj/item/food/meat/rawcutlet/spider/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/spider, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+/obj/item/food/meat/rawcutlet/gondola
+ name = "raw gondola cutlet"
+ tastes = list("meat" = 1, "tranquility" = 1)
+
+/obj/item/food/meat/rawcutlet/gondola/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/gondola, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+/obj/item/food/meat/rawcutlet/penguin
+ name = "raw penguin cutlet"
+ tastes = list("beef" = 1, "cod fish" = 1)
+
+/obj/item/food/meat/rawcutlet/penguin/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/penguin, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/chicken
+ name = "raw chicken cutlet"
+ tastes = list("chicken" = 1)
+
+/obj/item/food/meat/rawcutlet/chicken/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/chicken, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
+/obj/item/food/meat/rawcutlet/chicken/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+//Cooked cutlets
+
+/obj/item/food/meat/cutlet
+ name = "cutlet"
+ desc = "A cooked meat cutlet."
+ icon_state = "cutlet"
+ bite_consumption = 2
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT
+ burns_on_grill = TRUE
+
+/obj/item/food/meat/cutlet/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
+
+///This proc handles setting up the correct meat name for the cutlet, this should definitely be changed with the food rework.
+/obj/item/food/meat/cutlet/proc/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
+ SIGNAL_HANDLER
+ if(istype(source_item, /obj/item/food/meat/rawcutlet))
+ var/obj/item/food/meat/rawcutlet/original_cutlet = source_item
+ name = "[original_cutlet.meat_type] cutlet"
+
+/obj/item/food/meat/cutlet/plain
+
+/obj/item/food/meat/cutlet/plain/human
+ tastes = list("tender meat" = 1)
+ foodtypes = MEAT | GORE
+
+/obj/item/food/meat/cutlet/plain/human/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
+ . = ..()
+ if(istype(source_item, /obj/item/food/meat))
+ var/obj/item/food/meat/origin_meat = source_item
+ if(subjectname)
+ name = "[origin_meat.subjectname] [initial(name)]"
+ else if(subjectjob)
+ name = "[origin_meat.subjectjob] [initial(name)]"
+
+/obj/item/food/meat/cutlet/killertomato
+ name = "killer tomato cutlet"
+ tastes = list("tomato" = 1)
+ foodtypes = FRUIT
+
+/obj/item/food/meat/cutlet/bear
+ name = "bear cutlet"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meat/cutlet/xeno
+ name = "xeno cutlet"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meat/cutlet/spider
+ name = "spider cutlet"
+ tastes = list("cobwebs" = 1)
+
+/obj/item/food/meat/cutlet/gondola
+ name = "gondola cutlet"
+ tastes = list("meat" = 1, "tranquility" = 1)
+
+/obj/item/food/meat/cutlet/penguin
+ name = "penguin cutlet"
+ tastes = list("beef" = 1, "cod fish" = 1)
+
+/obj/item/food/meat/cutlet/chicken
+ name = "chicken cutlet"
+ tastes = list("chicken" = 1)
diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm
index afde878f5efb7..5999cb4e2084a 100644
--- a/code/game/objects/items/food/misc.dm
+++ b/code/game/objects/items/food/misc.dm
@@ -438,7 +438,7 @@
desc = "A rubbery strip of gum. You don't feel like eating it is a good idea."
color = "#913D3D"
food_reagents = list(/datum/reagent/blood = 15)
- tastes = list("hell" = 1)
+ tastes = list("hell" = 1, "people" = 1)
metabolization_amount = REAGENTS_METABOLISM
/// What the player hears from the bubblegum hallucination, and also says one of these when suiciding
var/static/list/hallucination_lines = list("I AM IMMORTAL.", "I SHALL TAKE YOUR WORLD.", "I SEE YOU.", "YOU CANNOT ESCAPE ME FOREVER.", "NOTHING CAN HOLD ME.")
diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm
new file mode 100644
index 0000000000000..908723a1c4e41
--- /dev/null
+++ b/code/game/objects/items/food/monkeycube.dm
@@ -0,0 +1,79 @@
+/obj/item/food/monkeycube
+ name = "monkey cube"
+ desc = "Just add water!"
+ icon_state = "monkeycube"
+ bite_consumption = 12
+ food_reagents = list(/datum/reagent/monkey_powder = 30)
+ tastes = list("the jungle" = 1, "bananas" = 1)
+ foodtypes = MEAT | SUGAR
+ food_flags = FOOD_FINGER_FOOD
+ w_class = WEIGHT_CLASS_TINY
+ var/faction
+ var/spawned_mob = /mob/living/carbon/human/species/monkey
+
+/obj/item/food/monkeycube/proc/Expand()
+ var/mob/spammer = get_mob_by_key(fingerprintslast)
+ var/mob/living/bananas = new spawned_mob(drop_location(), TRUE, spammer)
+ if(faction)
+ bananas.faction = faction
+ if (!QDELETED(bananas))
+ visible_message(span_notice("[src] expands!"))
+ bananas.log_message("spawned via [src], Last attached mob: [key_name(spammer)].", LOG_ATTACK)
+ else if (!spammer) // Visible message in case there are no fingerprints
+ visible_message(span_notice("[src] fails to expand!"))
+ qdel(src)
+
+/obj/item/food/monkeycube/suicide_act(mob/living/user)
+ user.visible_message(span_suicide("[user] is putting [src] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!"))
+ var/eating_success = do_after(user, 1 SECONDS, src)
+ if(QDELETED(user)) //qdeletion: the nuclear option of self-harm
+ return SHAME
+ if(!eating_success || QDELETED(src)) //checks if src is gone or if they failed to wait for a second
+ user.visible_message(span_suicide("[user] chickens out!"))
+ return SHAME
+ if(HAS_TRAIT(user, TRAIT_NOHUNGER)) //plasmamen don't have saliva/stomach acid
+ user.visible_message(span_suicide("[user] realizes [user.p_their()] body won't activate [src]!")
+ ,span_warning("Your body won't activate [src]..."))
+ return SHAME
+ playsound(user, 'sound/items/eatfood.ogg', rand(10, 50), TRUE)
+ user.temporarilyRemoveItemFromInventory(src) //removes from hands, keeps in M
+ addtimer(CALLBACK(src, .proc/finish_suicide, user), 15) //you've eaten it, you can run now
+
+ return MANUAL_SUICIDE
+
+/obj/item/food/monkeycube/proc/finish_suicide(mob/living/user) ///internal proc called by a monkeycube's suicide_act using a timer and callback. takes as argument the mob/living who activated the suicide
+ if(QDELETED(user) || QDELETED(src))
+ return
+ if(src.loc != user) //how the hell did you manage this
+ to_chat(user, span_warning("Something happened to [src]..."))
+ return
+ Expand()
+ user.visible_message(span_danger("[user]'s torso bursts open as a primate emerges!"))
+ user.gib(null, TRUE, null, TRUE)
+
+/obj/item/food/monkeycube/syndicate
+ faction = list("neutral", ROLE_SYNDICATE)
+
+/obj/item/food/monkeycube/gorilla
+ name = "gorilla cube"
+ desc = "A Waffle Co. brand gorilla cube. Now with extra molecules!"
+ bite_consumption = 20
+ food_reagents = list(/datum/reagent/monkey_powder = 30, /datum/reagent/medicine/strange_reagent = 5)
+ tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1)
+ spawned_mob = /mob/living/simple_animal/hostile/gorilla
+
+/obj/item/food/monkeycube/chicken
+ name = "chicken cube"
+ desc = "A new Nanotrasen classic, the chicken cube. Tastes like everything!"
+ bite_consumption = 20
+ food_reagents = list(/datum/reagent/consumable/eggyolk = 30, /datum/reagent/medicine/strange_reagent = 1)
+ tastes = list("chicken" = 1, "the country" = 1, "chicken bouillon" = 1)
+ spawned_mob = /mob/living/simple_animal/chicken
+
+/obj/item/food/monkeycube/bee
+ name = "bee cube"
+ desc = "We were sure it was a good idea. Just add water."
+ bite_consumption = 20
+ food_reagents = list(/datum/reagent/consumable/honey = 10, /datum/reagent/toxin = 5, /datum/reagent/medicine/strange_reagent = 1)
+ tastes = list("buzzing" = 1, "honey" = 1, "regret" = 1)
+ spawned_mob = /mob/living/simple_animal/hostile/bee
diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm
index 7f5e07fd58cd6..1e42b1f500cf1 100644
--- a/code/game/objects/items/food/pastries.dm
+++ b/code/game/objects/items/food/pastries.dm
@@ -116,7 +116,7 @@
name = "fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
- trash_type = /obj/item/paper
+ trash_type = /obj/item/paperslip
food_reagents = list(/datum/reagent/consumable/nutriment = 5)
tastes = list("cookie" = 1)
foodtypes = GRAIN | SUGAR
@@ -131,9 +131,14 @@
if (fortune)
fortune.forceMove(drop_location)
return fortune
- // Otherwise, make a blank page.
- var/out_paper = new trash_type(drop_location)
- return out_paper
+
+ // Otherwise, use a generic one
+ var/obj/item/paperslip/fortune_slip = new trash_type(drop_location)
+ fortune_slip.name = "fortune slip"
+ // if someone adds lottery tickets in the future, be sure to add random numbers to this
+ fortune_slip.desc = pick(GLOB.wisdoms)
+
+ return fortune_slip
/obj/item/food/fortunecookie/MakeLeaveTrash()
if(trash_type)
diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm
index dda051ec6c89c..a801bba0be261 100644
--- a/code/game/objects/items/food/salad.dm
+++ b/code/game/objects/items/food/salad.dm
@@ -2,7 +2,7 @@
////////////////////////////////////////////SALAD////////////////////////////////////////////
/obj/item/food/salad
icon = 'icons/obj/food/soupsalad.dmi'
- trash_type = /obj/item/reagent_containers/glass/bowl
+ trash_type = /obj/item/reagent_containers/cup/bowl
bite_consumption = 3
w_class = WEIGHT_CLASS_NORMAL
food_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 2)
@@ -127,7 +127,7 @@
foodtypes = GRAIN | MEAT | VEGETABLES
-/obj/item/reagent_containers/glass/bowl
+/obj/item/reagent_containers/cup/bowl
name = "bowl"
desc = "A simple bowl, used for soups and salads."
icon = 'icons/obj/food/soupsalad.dmi'
@@ -137,7 +137,7 @@
w_class = WEIGHT_CLASS_NORMAL
custom_price = PAYCHECK_CREW * 0.6
-/obj/item/reagent_containers/glass/bowl/Initialize(mapload)
+/obj/item/reagent_containers/cup/bowl/Initialize(mapload)
. = ..()
AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/salad/empty, CUSTOM_INGREDIENT_ICON_FILL, max_ingredients = 6)
diff --git a/code/game/objects/items/food/snacks.dm b/code/game/objects/items/food/snacks.dm
index 39203389d5a2d..acb0ad1eef9b1 100644
--- a/code/game/objects/items/food/snacks.dm
+++ b/code/game/objects/items/food/snacks.dm
@@ -24,7 +24,7 @@
junkiness = 10
bite_consumption = 10
tastes = list("candy" = 5, "weight loss" = 4, "insect larva" = 1)
- foodtypes = JUNKFOOD | RAW | GROSS
+ foodtypes = JUNKFOOD | RAW | BUGS
custom_price = 80
w_class = WEIGHT_CLASS_TINY
var/revelation = FALSE
@@ -386,7 +386,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
icon_state = "boritosred"
trash_type = /obj/item/trash/boritos/red
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 2, /datum/reagent/consumable/salt = 3, /datum/reagent/consumable/astrotame = 1, /datum/reagent/consumable/cornmeal = 1)
- tastes = list("fried corn" = 1, "nacho cheese" = 3)
+ tastes = list("fried corn" = 1, "nacho cheese" = 3)
/obj/item/food/cornchips/purple
name = "\improper Spicy Sweet Chili Boritos corn chips"
diff --git a/code/game/objects/items/food/soup.dm b/code/game/objects/items/food/soup.dm
index 22894ec657612..995cd654a2751 100644
--- a/code/game/objects/items/food/soup.dm
+++ b/code/game/objects/items/food/soup.dm
@@ -1,7 +1,7 @@
/obj/item/food/soup
w_class = WEIGHT_CLASS_NORMAL
icon = 'icons/obj/food/soupsalad.dmi'
- trash_type = /obj/item/reagent_containers/glass/bowl
+ trash_type = /obj/item/reagent_containers/cup/bowl
bite_consumption = 5
max_volume = 80
food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
@@ -55,7 +55,7 @@
name = "wing fang chu"
desc = "A savory dish of alien wing wang in soy."
icon_state = "wingfangchu"
- trash_type = /obj/item/reagent_containers/glass/bowl
+ trash_type = /obj/item/reagent_containers/cup/bowl
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/soysauce = 10, /datum/reagent/consumable/nutriment/vitamin = 7)
tastes = list("soy" = 1)
foodtypes = MEAT
@@ -157,7 +157,7 @@
icon_state = "eyeballsoup"
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/liquidgibs = 3)
tastes = list("tomato" = 1, "squirming" = 1)
- foodtypes = MEAT | GROSS
+ foodtypes = MEAT | GORE
/obj/item/food/soup/miso
name = "misosoup"
@@ -306,4 +306,4 @@
food_reagents = list (/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nutriment/protein = 2)
tastes = list("creamy vegetables"= 2, "sausage" = 1)
foodtypes = VEGETABLES | MEAT | GRAIN | BREAKFAST
-
+
diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm
index e1e5200f4ef0f..54fd8e08b9190 100644
--- a/code/game/objects/items/food/spaghetti.dm
+++ b/code/game/objects/items/food/spaghetti.dm
@@ -76,7 +76,7 @@
name = "beef noodle"
desc = "Nutritious, beefy and noodly."
icon_state = "beefnoodle"
- trash_type = /obj/item/reagent_containers/glass/bowl
+ trash_type = /obj/item/reagent_containers/cup/bowl
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
tastes = list("noodle" = 1, "meat" = 1)
foodtypes = GRAIN | MEAT | VEGETABLES
diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm
index 86dec2e543618..c9d3b8c9abf5e 100644
--- a/code/game/objects/items/gift.dm
+++ b/code/game/objects/items/gift.dm
@@ -77,7 +77,7 @@ GLOBAL_LIST_EMPTY(possible_gifts)
/obj/item/banhammer,
/obj/item/food/grown/ambrosia/deus,
/obj/item/food/grown/ambrosia/vulgaris,
- /obj/item/paicard,
+ /obj/item/pai_card,
/obj/item/instrument/violin,
/obj/item/instrument/guitar,
/obj/item/storage/belt/utility/full,
diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm
index 6f4252187acfc..693f70722306e 100644
--- a/code/game/objects/items/grenades/_grenade.dm
+++ b/code/game/objects/items/grenades/_grenade.dm
@@ -214,7 +214,9 @@
if(damage && attack_type == PROJECTILE_ATTACK && hit_projectile.damage_type != STAMINA && prob(15))
owner.visible_message(span_danger("[attack_text] hits [owner]'s [src], setting it off! What a shot!"))
var/turf/source_turf = get_turf(src)
- log_game("A projectile ([hitby]) detonated a grenade held by [key_name(owner)] at [COORD(source_turf)]")
+ var/logmsg = "held a grenade detonated by a projectile ([hitby]) at [COORD(source_turf)]"
+ owner.log_message(logmsg, LOG_GAME)
+ owner.log_message(logmsg, LOG_VICTIM)
message_admins("A projectile ([hitby]) detonated a grenade held by [key_name_admin(owner)] at [ADMIN_COORDJMP(source_turf)]")
detonate()
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 51870c4321080..f315d172c047d 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -9,11 +9,11 @@
/// Which stage of construction this grenade is currently at.
var/stage = GRENADE_EMPTY
/// The set of reagent containers that have been added to this grenade casing.
- var/list/obj/item/reagent_containers/glass/beakers = list()
+ var/list/obj/item/reagent_containers/cup/beakers = list()
/// The types of reagent containers that can be added to this grenade casing.
- var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle)
+ var/list/allowed_containers = list(/obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/cup/bottle)
/// The types of reagent containers that can't be added to this grenade casing.
- var/list/banned_containers = list(/obj/item/reagent_containers/glass/beaker/bluespace) //Containers to exclude from specific grenade subtypes
+ var/list/banned_containers = list(/obj/item/reagent_containers/cup/beaker/bluespace) //Containers to exclude from specific grenade subtypes
/// The maximum volume of the reagents in the grenade casing.
var/casing_holder_volume = 1000
/// The range that this grenade can splash reagents at if they aren't consumed on detonation.
@@ -29,21 +29,18 @@
/obj/item/grenade/chem_grenade/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
create_reagents(casing_holder_volume)
stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY.
wires = new /datum/wires/explosive/chem_grenade(src)
-/obj/item/grenade/chem_grenade/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
-
/obj/item/grenade/chem_grenade/examine(mob/user)
display_timer = (stage == GRENADE_READY) //show/hide the timer based on assembly state
. = ..()
if(user.can_see_reagents())
if(beakers.len)
. += span_notice("You scan the grenade and detect the following reagents:")
- for(var/obj/item/reagent_containers/glass/glass_beaker in beakers)
+ for(var/obj/item/reagent_containers/cup/glass_beaker in beakers)
for(var/datum/reagent/reagent in glass_beaker.reagents.reagent_list)
. += span_notice("[reagent.volume] units of [reagent.name] in the [glass_beaker.name].")
if(beakers.len == 1)
@@ -54,7 +51,7 @@
if(beakers.len == 2 && beakers[1].name == beakers[2].name)
. += span_notice("You see two [beakers[1].name]s inside the grenade.")
else
- for(var/obj/item/reagent_containers/glass/glass_beaker in beakers)
+ for(var/obj/item/reagent_containers/cup/glass_beaker in beakers)
. += span_notice("You see a [glass_beaker.name] inside the grenade.")
/obj/item/grenade/chem_grenade/update_name(updates)
@@ -160,7 +157,7 @@
to_chat(user, span_notice("You remove the activation mechanism from the [initial(name)] assembly."))
/obj/item/grenade/chem_grenade/attackby(obj/item/item, mob/user, params)
- if(istype(item, /obj/item/assembly) && stage == GRENADE_WIRED)
+ if(isassembly(item) && stage == GRENADE_WIRED)
wires.interact(user)
else if(stage == GRENADE_WIRED && is_type_in_list(item, allowed_containers))
. = TRUE //no afterattack
@@ -241,7 +238,7 @@
return
var/list/datum/reagents/reactants = list()
- for(var/obj/item/reagent_containers/glass/glass_beaker in beakers)
+ for(var/obj/item/reagent_containers/cup/glass_beaker in beakers)
reactants += glass_beaker.reagents
var/turf/detonation_turf = get_turf(src)
@@ -260,7 +257,7 @@
casedesc = "This casing affects a larger area than the basic model and can fit exotic containers, including slime cores and bluespace beakers. Heats contents by 25 K upon ignition."
icon_state = "large_grenade"
base_icon_state = "large_grenade"
- allowed_containers = list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/condiment, /obj/item/reagent_containers/food/drinks)
+ allowed_containers = list(/obj/item/reagent_containers/cup, /obj/item/reagent_containers/condiment, /obj/item/reagent_containers/cup/glass)
banned_containers = list()
affected_area = 5
ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades.
@@ -402,8 +399,8 @@
/obj/item/grenade/chem_grenade/metalfoam/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/aluminium, 30)
beaker_two.reagents.add_reagent(/datum/reagent/foaming_agent, 10)
@@ -420,8 +417,8 @@
/obj/item/grenade/chem_grenade/smart_metal_foam/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/large/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/large/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/aluminium, 75)
beaker_two.reagents.add_reagent(/datum/reagent/smart_foaming_agent, 25)
@@ -438,8 +435,8 @@
/obj/item/grenade/chem_grenade/incendiary/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/phosphorus, 25)
beaker_two.reagents.add_reagent(/datum/reagent/stable_plasma, 25)
@@ -456,8 +453,8 @@
/obj/item/grenade/chem_grenade/antiweed/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/toxin/plantbgone, 25)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 25)
@@ -475,8 +472,8 @@
/obj/item/grenade/chem_grenade/cleaner/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/fluorosurfactant, 40)
beaker_two.reagents.add_reagent(/datum/reagent/water, 40)
@@ -493,8 +490,8 @@
/obj/item/grenade/chem_grenade/ez_clean/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/large/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/large/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/large/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/fluorosurfactant, 40)
beaker_two.reagents.add_reagent(/datum/reagent/water, 40)
@@ -512,8 +509,8 @@
/obj/item/grenade/chem_grenade/teargas/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/large/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/large/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/large/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/large/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 60)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 40)
@@ -531,8 +528,8 @@
/obj/item/grenade/chem_grenade/facid/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 290)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 10)
@@ -551,8 +548,8 @@
/obj/item/grenade/chem_grenade/colorful/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/colorful_reagent, 25)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 25)
@@ -570,8 +567,8 @@
/obj/item/grenade/chem_grenade/glitter/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
beaker_one.reagents.add_reagent(glitter_type, 25)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 25)
@@ -603,8 +600,8 @@
/obj/item/grenade/chem_grenade/clf3/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/fluorosurfactant, 250)
beaker_one.reagents.add_reagent(/datum/reagent/clf3, 50)
@@ -621,8 +618,8 @@
/obj/item/grenade/chem_grenade/bioterrorfoam/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/cryptobiolin, 75)
beaker_one.reagents.add_reagent(/datum/reagent/water, 50)
@@ -641,8 +638,8 @@
/obj/item/grenade/chem_grenade/tuberculosis/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/bluespace/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/bluespace/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 50)
beaker_one.reagents.add_reagent(/datum/reagent/phosphorus, 50)
@@ -662,8 +659,8 @@
/obj/item/grenade/chem_grenade/holy/Initialize(mapload)
. = ..()
- var/obj/item/reagent_containers/glass/beaker/meta/beaker_one = new(src)
- var/obj/item/reagent_containers/glass/beaker/meta/beaker_two = new(src)
+ var/obj/item/reagent_containers/cup/beaker/meta/beaker_one = new(src)
+ var/obj/item/reagent_containers/cup/beaker/meta/beaker_two = new(src)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 150)
beaker_two.reagents.add_reagent(/datum/reagent/water/holywater, 150)
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 7bfee47bf0ea0..cd5e43c2daf2f 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -71,7 +71,7 @@
var/obj/item/bodypart/bodypart = user.get_holding_bodypart_of_item(src)
if(bodypart)
forceMove(get_turf(user))
- user.visible_message("[span_danger("[src] goes off in [user]'s hand, blowing [user.p_their()] [bodypart.name] to bloody shreds!")]", span_userdanger("[src] goes off in your hand, blowing your [bodypart.name] to bloody shreds!"))
+ user.visible_message("[span_danger("[src] goes off in [user]'s hand, blowing [user.p_their()] [bodypart.plaintext_zone] to bloody shreds!")]", span_userdanger("[src] goes off in your hand, blowing your [bodypart.plaintext_zone] to bloody shreds!"))
bodypart.dismember()
. = ..()
diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm
index 0d267b022a8c7..5803df6a47d50 100644
--- a/code/game/objects/items/grenades/ghettobomb.dm
+++ b/code/game/objects/items/grenades/ghettobomb.dm
@@ -38,12 +38,12 @@
check_parts = TRUE
/obj/item/grenade/iedcasing/spawned/Initialize(mapload)
- new /obj/item/reagent_containers/food/drinks/soda_cans/random(src)
+ new /obj/item/reagent_containers/cup/soda_cans/random(src)
return ..()
/obj/item/grenade/iedcasing/CheckParts(list/parts_list)
..()
- var/obj/item/reagent_containers/food/drinks/soda_cans/can = locate() in contents
+ var/obj/item/reagent_containers/cup/soda_cans/can = locate() in contents
if(!can)
stack_trace("[src] generated without a soda can!") //this shouldn't happen.
qdel(src)
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index d32c7d6974d9e..0ad29d388175d 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -25,13 +25,10 @@
/obj/item/grenade/c4/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
plastic_overlay = mutable_appearance(icon, "[inhand_icon_state]2", HIGH_OBJ_LAYER)
wires = new /datum/wires/explosive/c4(src)
-/obj/item/grenade/c4/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
-
/obj/item/grenade/c4/Destroy()
qdel(wires)
wires = null
@@ -103,19 +100,19 @@
active = TRUE
message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse")
- log_game("[key_name(user)] planted [name] on [target.name] at [AREACOORD(user)] with a [det_time] second fuse")
+ user.log_message("planted [name] on [target.name] with a [det_time] second fuse.", LOG_ATTACK)
notify_ghosts("[user] has planted \a [src] on [target] with a [det_time] second fuse!", source = bomb_target, action = (isturf(target) ? NOTIFY_JUMP : NOTIFY_ORBIT), flashwindow = FALSE, header = "Explosive Planted")
moveToNullspace() //Yep
- if(istype(bomb_target, /obj/item)) //your crappy throwing star can't fly so good with a giant brick of c4 on it.
+ if(isitem(bomb_target)) //your crappy throwing star can't fly so good with a giant brick of c4 on it.
var/obj/item/thrown_weapon = bomb_target
thrown_weapon.throw_speed = max(1, (thrown_weapon.throw_speed - 3))
thrown_weapon.throw_range = max(1, (thrown_weapon.throw_range - 3))
if(thrown_weapon.embedding)
thrown_weapon.embedding["embed_chance"] = 0
thrown_weapon.updateEmbedding()
- else if(istype(bomb_target, /mob/living))
+ else if(isliving(bomb_target))
plastic_overlay.layer = FLOAT_LAYER
target.add_overlay(plastic_overlay)
@@ -139,6 +136,7 @@
/obj/item/grenade/c4/suicide_act(mob/living/user)
message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_VERBOSEJMP(user)]")
+ user.log_message("suicided with [src].", LOG_ATTACK)
log_game("[key_name(user)] suicided with [src] at [AREACOORD(user)]")
user.visible_message(span_suicide("[user] activates [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!"))
shout_syndicate_crap(user)
diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm
index 4161337ab2c97..16589280b649f 100644
--- a/code/game/objects/items/hand_items.dm
+++ b/code/game/objects/items/hand_items.dm
@@ -158,9 +158,9 @@
return
if(brutal_noogie)
- SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "noogie_harsh", /datum/mood_event/noogie_harsh)
+ target.add_mood_event("noogie_harsh", /datum/mood_event/noogie_harsh)
else
- SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "noogie", /datum/mood_event/noogie)
+ target.add_mood_event("noogie", /datum/mood_event/noogie)
noogie_loop(user, target, 0)
@@ -321,7 +321,7 @@
if(!open_hands_taker)
to_chat(taker, span_warning("You can't high-five [offerer] with no open hands!"))
- SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five_full_hand) // not so successful now!
+ taker.add_mood_event("high_five", /datum/mood_event/high_five_full_hand) // not so successful now!
return
for(var/i in offerer.held_items)
@@ -335,16 +335,16 @@
playsound(offerer, 'sound/weapons/slap.ogg', 100, TRUE, 1)
offerer.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_DEUTERAGONIST = taker, DETAIL_HIGHFIVE_TYPE = "high ten"), story_value = STORY_VALUE_OKAY)
taker.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_DEUTERAGONIST = offerer, DETAIL_HIGHFIVE_TYPE = "high ten"), story_value = STORY_VALUE_OKAY)
- SEND_SIGNAL(offerer, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten)
- SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten)
+ offerer.add_mood_event("high_five", /datum/mood_event/high_ten)
+ taker.add_mood_event("high_five", /datum/mood_event/high_ten)
else
offerer.visible_message(span_notice("[taker] high-fives [offerer]!"), span_nicegreen("All right! You're high-fived by [taker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), ignored_mobs=taker)
to_chat(taker, span_nicegreen("You high-five [offerer]!"))
playsound(offerer, 'sound/weapons/slap.ogg', 50, TRUE, -1)
offerer.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_DEUTERAGONIST = taker, DETAIL_HIGHFIVE_TYPE = "high five"), story_value = STORY_VALUE_OKAY)
taker.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_DEUTERAGONIST = offerer, DETAIL_HIGHFIVE_TYPE = "high five"), story_value = STORY_VALUE_OKAY)
- SEND_SIGNAL(offerer, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five)
- SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five)
+ offerer.add_mood_event("high_five", /datum/mood_event/high_five)
+ taker.add_mood_event("high_five", /datum/mood_event/high_five)
qdel(src)
/obj/item/hand_item/kisser
@@ -445,7 +445,7 @@
living_target.visible_message(span_danger("[living_target] is hit by \a [src]."), span_userdanger("You're hit by \a [src]!"), vision_distance=COMBAT_MESSAGE_RANGE)
living_target.mind?.add_memory(MEMORY_KISS, list(DETAIL_PROTAGONIST = living_target, DETAIL_KISSER = firer), story_value = STORY_VALUE_OKAY)
- SEND_SIGNAL(living_target, COMSIG_ADD_MOOD_EVENT, "kiss", /datum/mood_event/kiss, firer, suppressed)
+ living_target.add_mood_event("kiss", /datum/mood_event/kiss, firer, suppressed)
if(isliving(firer))
var/mob/living/kisser = firer
kisser.mind?.add_memory(MEMORY_KISS, list(DETAIL_PROTAGONIST = living_target, DETAIL_KISSER = firer), story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLINDNESS)
@@ -483,8 +483,9 @@
def_zone = BODY_ZONE_HEAD // let's keep it PG, people
. = ..()
if(isliving(target))
- SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "kiss", /datum/mood_event/kiss, firer, suppressed)
- try_fluster(target)
+ var/mob/living/living_target = target
+ living_target.add_mood_event("kiss", /datum/mood_event/kiss, firer, suppressed)
+ try_fluster(living_target)
/obj/projectile/kiss/death
name = "kiss of death"
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 453af6f6e7c53..e59282ae9fff5 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -269,7 +269,7 @@
update_appearance()
playsound(src, 'sound/effects/his_grace_ascend.ogg', 100)
if(istype(master))
- master.update_inv_hands()
+ master.update_held_items()
master.visible_message("Gods will be watching.")
name = "[master]'s mythical toolbox of three powers"
master.client?.give_award(/datum/award/achievement/misc/ascension, master)
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index e8088d46a39ef..a94ce5ddae083 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -49,12 +49,13 @@
var/obj/effect/rune/target_rune = target
if(target_rune.log_when_erased)
- log_game("[target_rune.cultist_name] rune erased by [key_name(user)] using a null rod.")
+ user.log_message("erased [target_rune.cultist_name] rune using a null rod", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(user)] erased a [target_rune.cultist_name] rune with a null rod.")
SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE
/obj/item/nullrod/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!"))
+
return (BRUTELOSS|FIRELOSS)
/obj/item/nullrod/godhand
@@ -249,7 +250,11 @@
/obj/item/nullrod/scythe/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/butchering, 70, 110) //the harvest gives a high bonus chance
+ AddComponent(/datum/component/butchering, \
+ speed = 7 SECONDS, \
+ effectiveness = 110, \
+ )
+ //the harvest gives a high bonus chance
/obj/item/nullrod/scythe/vibro
name = "high frequency blade"
@@ -346,7 +351,12 @@
/obj/item/nullrod/chainsaw/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
- AddComponent(/datum/component/butchering, 30, 100, 0, hitsound)
+ AddComponent(/datum/component/butchering, \
+ speed = 3 SECONDS, \
+ effectiveness = 100, \
+ bonus_modifier = 0, \
+ butcher_sound = hitsound, \
+ )
/obj/item/nullrod/clown
name = "clown dagger"
@@ -445,7 +455,10 @@
/obj/item/nullrod/armblade/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
- AddComponent(/datum/component/butchering, 80, 70)
+ AddComponent(/datum/component/butchering, \
+ speed = 8 SECONDS, \
+ effectiveness = 70, \
+ )
/obj/item/nullrod/armblade/tentacle
name = "unholy blessing"
@@ -510,7 +523,10 @@
/obj/item/nullrod/tribal_knife/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
- AddComponent(/datum/component/butchering, 50, 100)
+ AddComponent(/datum/component/butchering, \
+ speed = 5 SECONDS, \
+ effectiveness = 100, \
+ )
/obj/item/nullrod/tribal_knife/Destroy()
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm
index a87451c4627ec..503cd3341963f 100644
--- a/code/game/objects/items/implants/implant_storage.dm
+++ b/code/game/objects/items/implants/implant_storage.dm
@@ -7,7 +7,7 @@
/obj/item/implant/storage/activate()
. = ..()
- atom_storage?.open_storage(src, imp_in)
+ atom_storage?.open_storage(imp_in)
/obj/item/implant/storage/removed(source, silent = FALSE, special = 0)
if(!special)
@@ -29,10 +29,14 @@
for(var/X in target.implants)
if(istype(X, type))
var/obj/item/implant/storage/imp_e = X
- if(!imp_e.atom_storage || (imp_e.atom_storage && imp_e.atom_storage.max_slots < max_slot_stacking))
+ if(!imp_e.atom_storage)
imp_e.create_storage(type = /datum/storage/implant)
qdel(src)
return TRUE
+ else if(imp_e.atom_storage.max_slots < max_slot_stacking)
+ imp_e.atom_storage.max_slots += initial(imp_e.atom_storage.max_slots)
+ imp_e.atom_storage.max_total_storage += initial(imp_e.atom_storage.max_total_storage)
+ return TRUE
return FALSE
create_storage(type = /datum/storage/implant)
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 61282d9246caa..e28ae7705ce23 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -93,7 +93,7 @@
if(P.implant(M))
visible_message(span_warning("[M] is implanted by [src]."))
return TRUE
- else if(istype(I, /obj/item/organ))
+ else if(isorgan(I))
var/obj/item/organ/P = I
P.Insert(M, FALSE, FALSE)
visible_message(span_warning("[M] is implanted by [src]."))
@@ -195,7 +195,7 @@
return FALSE
objective = tgui_input_text(user, "What order do you want to imprint on [C]?", "Brainwashing", max_length = 120)
message_admins("[ADMIN_LOOKUPFLW(user)] set brainwash machine objective to '[objective]'.")
- log_game("[key_name(user)] set brainwash machine objective to '[objective]'.")
+ user.log_message("set brainwash machine objective to '[objective]'.", LOG_GAME)
if(HAS_TRAIT(C, TRAIT_MINDSHIELD))
return FALSE
brainwash(C, objective)
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index ca16a4d25b27c..fb8d7d200459a 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -111,7 +111,7 @@
if(istype(A, /obj/item/clothing/suit/space))
to_chat(user, span_alert("Error unable to interface with device."))
return FALSE
- if(istype(A, /obj))
+ if(isobj(A))
O = A
if(C)
var/done_any = FALSE
diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm
index fb6d939edacee..812d56d9e0357 100644
--- a/code/game/objects/items/inspector.dm
+++ b/code/game/objects/items/inspector.dm
@@ -150,8 +150,11 @@
characters += GLOB.alphabet_upper
characters += GLOB.numerals
- info = random_string(rand(180,220), characters)
- info += "[prob(50) ? "=" : "=="]" //Based64 encoding
+ var/report_text = random_string(rand(180,220), characters)
+ report_text += "[prob(50) ? "=" : "=="]" //Based64 encoding
+
+ add_raw_text(report_text)
+ update_appearance()
/obj/item/paper/report/examine(mob/user)
. = ..()
@@ -159,7 +162,7 @@
. += span_notice("\The [src] contains data on [scanned_area.name].")
else if(scanned_area)
. += span_notice("\The [src] contains data on a vague area on station, you should throw it away.")
- else if(get_info_length())
+ else if(get_total_length())
icon_state = "slipfull"
. += span_notice("Wait a minute, this isn't an encrypted inspection report! You should throw it away.")
else
@@ -349,7 +352,8 @@
new_info += pick_list_replacements(CLOWN_NONSENSE_FILE, "non-honk-clown-words")
if(1000)
new_info += pick_list_replacements(CLOWN_NONSENSE_FILE, "rare")
- info += new_info.Join()
+ add_raw_text(new_info.Join())
+ update_appearance()
/obj/item/paper/fake_report/examine(mob/user)
. = ..()
@@ -357,7 +361,7 @@
. += span_notice("\The [src] contains no data on [scanned_area.name].")
else if(scanned_area)
. += span_notice("\The [src] contains no data on a vague area on station, you should throw it away.")
- else if(get_info_length())
+ else if(get_total_length())
. += span_notice("Wait a minute, this isn't an encrypted inspection report! You should throw it away.")
else
. += span_notice("Wait a minute, this thing's blank! You should throw it away.")
diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm
index 234795614b92b..6f9c31a77b3d5 100644
--- a/code/game/objects/items/knives.dm
+++ b/code/game/objects/items/knives.dm
@@ -33,7 +33,12 @@
///Adds the butchering component, used to override stats for special cases
/obj/item/knife/proc/set_butchering()
- AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force
+ AddComponent(/datum/component/butchering, \
+ speed = 8 SECONDS - force, \
+ effectiveness = 100, \
+ bonus_modifier = force - 10, \
+ )
+ //bonus chance increases depending on force
/obj/item/knife/suicide_act(mob/user)
user.visible_message(pick(span_suicide("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide."), \
@@ -87,8 +92,8 @@
force = 15
throwforce = 10
custom_materials = list(/datum/material/iron=18000)
- attack_verb_continuous = list("cleaves", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
- attack_verb_simple = list("cleave", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
+ attack_verb_continuous = list("slices", "dices", "chops", "cubes", "minces", "juliennes", "chiffonades", "batonnets")
+ attack_verb_simple = list("slice", "dice", "chop", "cube", "mince", "julienne", "chiffonade", "batonnet")
w_class = WEIGHT_CLASS_NORMAL
custom_price = PAYCHECK_CREW * 5
wound_bonus = 15
@@ -101,7 +106,11 @@
wound_bonus = 10
/obj/item/knife/hunting/set_butchering()
- AddComponent(/datum/component/butchering, 80 - force, 100, force + 10)
+ AddComponent(/datum/component/butchering, \
+ speed = 8 SECONDS - force, \
+ effectiveness = 100, \
+ bonus_modifier = force + 10, \
+ )
/obj/item/knife/combat
name = "combat knife"
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 86c531d80306b..78df10ab7c3c7 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -20,7 +20,7 @@
return
icon_state = "latexballon_blow"
inhand_icon_state = "latexballon"
- user.update_inv_hands()
+ user.update_held_items()
to_chat(user, span_notice("You blow up [src] with [tank]."))
air_contents = tank.remove_air_volume(3)
@@ -38,7 +38,7 @@
inhand_icon_state = "lgloves"
if(isliving(loc))
var/mob/living/user = src.loc
- user.update_inv_hands()
+ user.update_held_items()
loc.assume_air(air_contents)
/obj/item/latexballon/ex_act(severity, target)
diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm
index 5d4459c77b4a2..ea362e0d45d8d 100644
--- a/code/game/objects/items/mail.dm
+++ b/code/game/objects/items/mail.dm
@@ -160,7 +160,7 @@
for(var/iterator in 1 to goodie_count)
var/target_good = pick_weight(goodies)
var/atom/movable/target_atom = new target_good(src)
- body.log_message("[key_name(body)] received [target_atom.name] in the mail ([target_good])", LOG_GAME)
+ body.log_message("received [target_atom.name] in the mail ([target_good])", LOG_GAME)
return TRUE
@@ -268,7 +268,7 @@
worn_icon_state = "mailbag"
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/mail/Initialize()
+/obj/item/storage/bag/mail/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 42
@@ -286,15 +286,15 @@
var/nuclear_option_odds = 0.1
/obj/item/paper/fluff/junkmail_redpill/Initialize(mapload)
- . = ..()
if(!prob(nuclear_option_odds)) // 1 in 1000 chance of getting 2 random nuke code characters.
- info = "You need to escape the simulation. Don't forget the numbers, they help you remember: '[rand(0,9)][rand(0,9)][rand(0,9)]...'"
- return
+ add_raw_text("You need to escape the simulation. Don't forget the numbers, they help you remember: '[rand(0,9)][rand(0,9)][rand(0,9)]...'")
+ return ..()
var/code = random_nukecode()
for(var/obj/machinery/nuclearbomb/selfdestruct/self_destruct in GLOB.nuke_list)
self_destruct.r_code = code
message_admins("Through junkmail, the self-destruct code was set to \"[code]\".")
- info = "You need to escape the simulation. Don't forget the numbers, they help you remember: '[code[rand(1,5)]][code[rand(1,5)]]...'"
+ add_raw_text("You need to escape the simulation. Don't forget the numbers, they help you remember: '[code[rand(1,5)]][code[rand(1,5)]]...'")
+ return ..()
/obj/item/paper/fluff/junkmail_redpill/true //admin letter enabling players to brute force their way through the nuke code if they're so inclined.
nuclear_option_odds = 100
@@ -304,5 +304,5 @@
icon_state = "paper_words"
/obj/item/paper/fluff/junkmail_generic/Initialize(mapload)
- . = ..()
- info = pick(GLOB.junkmail_messages)
+ default_raw_text = pick(GLOB.junkmail_messages)
+ return ..()
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 11345dea7b44c..3176e9eae1813 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -33,7 +33,10 @@
/obj/item/melee/energy/Initialize(mapload)
. = ..()
make_transformable()
- AddComponent(/datum/component/butchering, _speed = 5 SECONDS, _butcher_sound = active_hitsound)
+ AddComponent(/datum/component/butchering, \
+ speed = 5 SECONDS, \
+ butcher_sound = active_hitsound, \
+ )
/obj/item/melee/energy/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -259,7 +262,7 @@
to_chat(user, span_warning("RNBW_ENGAGE"))
if(force >= active_force)
icon_state = "[initial(icon_state)]_on_rainbow"
- user.update_inv_hands()
+ user.update_held_items()
/obj/item/melee/energy/sword/pirate
name = "energy cutlass"
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index fcbff5025f98b..91eba869c5ad0 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -52,7 +52,11 @@
/obj/item/melee/synthetic_arm_blade/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/butchering, 60, 80) //very imprecise
+ AddComponent(/datum/component/butchering, \
+ speed = 6 SECONDS, \
+ effectiveness = 80, \
+ )
+ //very imprecise
/obj/item/melee/sabre
name = "officer's sabre"
@@ -79,7 +83,12 @@
/obj/item/melee/sabre/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results.
+ AddComponent(/datum/component/butchering, \
+ speed = 3 SECONDS, \
+ effectiveness = 95, \
+ bonus_modifier = 5, \
+ )
+ //fast and effective, but as a sword, it might damage the results.
/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 5348ecbf9e814..d328d557b9db0 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -56,7 +56,7 @@
var/turf/T = get_turf(A)
- if(istype(A, /obj/item/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart))
+ if(istype(A, /obj/item/reagent_containers/cup/bucket) || istype(A, /obj/structure/janitorialcart))
return
if(T)
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index 5c15cd4e8abe3..b481cc69f6ee1 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -162,28 +162,6 @@
if(!target) //target can be set to null from above code, or elsewhere
active = FALSE
-/obj/item/pinpointer/crew/prox //Weaker version of crew monitor primarily for EMT
- name = "proximity crew pinpointer"
- desc = "A handheld tracking device that displays its proximity to crew suit sensors."
- icon_state = "pinpointer_crewprox"
- worn_icon_state = "pinpointer_prox"
- custom_price = PAYCHECK_CREW * 3
-
-/obj/item/pinpointer/crew/prox/get_direction_icon(here, there)
- var/size = ""
- if(here == there)
- size = "small"
- else
- switch(get_dist(here, there))
- if(1 to 4)
- size = "xtrlarge"
- if(5 to 16)
- size = "large"
- //17 through 28 use the normal pinion, "pinondirect"
- if(29 to INFINITY)
- size = "small"
- return "pinondirect[size]"
-
/obj/item/pinpointer/pair
name = "pair pinpointer"
desc = "A handheld tracking device that locks onto its other half of the matching pair."
diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm
index a2c6d70331f43..2ae15fb8eb498 100644
--- a/code/game/objects/items/pitchfork.dm
+++ b/code/game/objects/items/pitchfork.dm
@@ -22,7 +22,7 @@
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
-/obj/item/pitchfork/ComponentInitialize()
+/obj/item/pitchfork/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, icon_wielded="[base_icon_state]1")
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index cb34230721c5f..ff6265203c603 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -112,7 +112,7 @@
if(stuffed || grenade)
to_chat(user, span_notice("You pet [src]. D'awww."))
if(grenade && !grenade.active)
- log_game("[key_name(user)] activated a hidden grenade in [src].")
+ user.log_message("activated a hidden grenade in [src].", LOG_VICTIM)
grenade.arm_grenade(user, msg = FALSE, volume = 10)
else
to_chat(user, span_notice("You try to pet [src], but it has no stuffing. Aww..."))
@@ -144,7 +144,7 @@
user.put_in_hands(grenade)
grenade = null
return
- if(istype(I, /obj/item/grenade))
+ if(isgrenade(I))
if(stuffed)
to_chat(user, span_warning("You need to remove some stuffing first!"))
return
@@ -156,8 +156,7 @@
user.visible_message(span_warning("[user] slides [grenade] into [src]."), \
span_danger("You slide [I] into [src]."))
grenade = I
- var/turf/grenade_turf = get_turf(src)
- log_game("[key_name(user)] added a grenade ([I.name]) to [src] at [AREACOORD(grenade_turf)].")
+ user.log_message("added a grenade ([I.name]) to [src]", LOG_GAME)
return
if(istype(I, /obj/item/toy/plush))
love(I, user)
@@ -577,7 +576,7 @@
icon_state = "plushie_awake"
inhand_icon_state = "plushie_awake"
-/obj/item/toy/plush/awakenedplushie/ComponentInitialize()
+/obj/item/toy/plush/awakenedplushie/Initialize(mapload)
. = ..()
AddComponent(/datum/component/edit_complainer)
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 19c7bd68f8886..4576e309c873f 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -42,6 +42,7 @@
max_integrity = 600
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100)
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
+ move_resist = MOVE_FORCE_OVERPOWERING
damage_deflection = 70
/// Make sure that the puzzle has the same puzzle_id as the keycard door!
var/puzzle_id = null
@@ -188,7 +189,7 @@
/// Banned combinations of the list in decimal
var/static/list/banned_combinations = list(-1, 47, 95, 203, 311, 325, 422, 473, 488, 500, 511)
-/obj/structure/light_puzzle/Initialize()
+/obj/structure/light_puzzle/Initialize(mapload)
. = ..()
var/generated_board = -1
while(generated_board in banned_combinations)
diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm
index 59e685692e7d7..6873b838ebde2 100644
--- a/code/game/objects/items/robot/ai_upgrades.dm
+++ b/code/game/objects/items/robot/ai_upgrades.dm
@@ -48,7 +48,7 @@
to_chat(AI, span_userdanger("[user] has upgraded you with surveillance software!"))
to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.")
to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process."))
- log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].")
+ user.log_message("has upgraded [key_name(AI)] with a [src].", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].")
qdel(src)
return TRUE
diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm
index 6f0dac4a52cfc..7e6837256342e 100644
--- a/code/game/objects/items/robot/items/generic.dm
+++ b/code/game/objects/items/robot/items/generic.dm
@@ -331,7 +331,7 @@
audible_message("HUMAN HARM")
playsound(get_turf(src), 'sound/ai/harmalarm.ogg', 70, 3)
COOLDOWN_START(src, alarm_cooldown, HARM_ALARM_SAFETY_COOLDOWN)
- user.log_message("used a Cyborg Harm Alarm in [AREACOORD(user)]", LOG_ATTACK)
+ user.log_message("used a Cyborg Harm Alarm", LOG_ATTACK)
if(iscyborg(user))
var/mob/living/silicon/robot/robot_user = user
to_chat(robot_user.connected_ai, "
[span_notice("NOTICE - Peacekeeping 'HARM ALARM' used by: [user]")]
")
@@ -351,4 +351,4 @@
carbon.adjust_timed_status_effect(50 SECONDS, /datum/status_effect/jitter)
playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3)
COOLDOWN_START(src, alarm_cooldown, HARM_ALARM_NO_SAFETY_COOLDOWN)
- user.log_message("used an emagged Cyborg Harm Alarm in [AREACOORD(user)]", LOG_ATTACK)
+ user.log_message("used an emagged Cyborg Harm Alarm", LOG_ATTACK)
diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm
index 94010001f8f8d..607064b003354 100644
--- a/code/game/objects/items/robot/items/hypo.dm
+++ b/code/game/objects/items/robot/items/hypo.dm
@@ -215,9 +215,12 @@
if(reagent.name == action)
selected_reagent = reagent
. = TRUE
- playsound(loc, 'sound/effects/pop.ogg', 50, FALSE)
- var/mob/living/silicon/robot/cyborg = src.loc
+ var/mob/living/silicon/robot/cyborg = loc
+ if(istype(loc, /obj/item/robot_model))
+ var/obj/item/robot_model/container_model = loc
+ cyborg = container_model.robot
+ playsound(cyborg, 'sound/effects/pop.ogg', 50, FALSE)
balloon_alert(cyborg, "dispensing [selected_reagent.name]")
break
diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm
index 00891ae0fe149..c91bb690113f6 100644
--- a/code/game/objects/items/robot/items/storage.dm
+++ b/code/game/objects/items/robot/items/storage.dm
@@ -95,8 +95,8 @@
name = "beaker storage apparatus"
desc = "A special apparatus for carrying beakers without spilling the contents."
icon_state = "borg_beaker_apparatus"
- storable = list(/obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle)
+ storable = list(/obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle)
/obj/item/borg/apparatus/beaker/Initialize(mapload)
add_glass()
@@ -105,7 +105,7 @@
return ..()
/obj/item/borg/apparatus/beaker/proc/add_glass()
- stored = new /obj/item/reagent_containers/glass/beaker/large(src)
+ stored = new /obj/item/reagent_containers/cup/beaker/large(src)
/obj/item/borg/apparatus/beaker/Destroy()
if(stored)
@@ -136,7 +136,7 @@
stored.pixel_x = 0
stored.pixel_y = 0
var/mutable_appearance/stored_copy = new /mutable_appearance(stored)
- if(istype(stored, /obj/item/reagent_containers/glass/beaker))
+ if(istype(stored, /obj/item/reagent_containers/cup/beaker))
arm.pixel_y = arm.pixel_y - 3
stored_copy.layer = FLOAT_LAYER
stored_copy.plane = FLOAT_PLANE
@@ -162,14 +162,14 @@
name = "beverage storage apparatus"
desc = "A special apparatus for carrying drinks without spilling the contents. Will resynthesize any drinks you pour out!"
icon_state = "borg_beaker_apparatus"
- storable = list(/obj/item/reagent_containers/food/drinks,
- /obj/item/reagent_containers/food/condiment)
+ storable = list(/obj/item/reagent_containers/cup/glass,
+ /obj/item/reagent_containers/condiment)
/obj/item/borg/apparatus/beaker/service/add_glass()
- stored = new /obj/item/reagent_containers/food/drinks/drinkingglass(src)
+ stored = new /obj/item/reagent_containers/cup/glass/drinkingglass(src)
handle_reflling(stored, loc.loc, force = TRUE)
-/obj/item/borg/apparatus/beaker/service/proc/handle_reflling(obj/item/reagent_containers/glass, mob/living/silicon/robot/bro, force = FALSE)
+/obj/item/borg/apparatus/beaker/service/proc/handle_reflling(obj/item/reagent_containers/cup/glass, mob/living/silicon/robot/bro, force = FALSE)
if (isnull(bro))
bro = loc
if (!iscyborg(bro))
@@ -179,7 +179,7 @@
glass.AddComponent(/datum/component/reagent_refiller, power_draw_callback = CALLBACK(bro, /mob/living/silicon/robot.proc/draw_power))
/obj/item/borg/apparatus/beaker/service/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- if (!istype(arrived, /obj/item/reagent_containers/food/drinks))
+ if (!istype(arrived, /obj/item/reagent_containers/cup/glass))
return
handle_reflling(arrived)
return ..()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 44d490bf14e35..8223abf9c7c11 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -310,7 +310,8 @@
forceMove(O)
O.robot_suit = src
- log_game("[key_name(user)] has put the MMI/posibrain of [key_name(M.brainmob)] into a cyborg shell at [AREACOORD(src)]")
+ user.log_message("put the MMI/posibrain of [key_name(M.brainmob)] into a cyborg shell", LOG_GAME)
+ M.brainmob.log_message("was put into a cyborg shell by [key_name(user)]", LOG_GAME, log_globally = FALSE)
if(!locomotion)
O.set_lockcharge(TRUE)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index f0e765ce7e0cc..46ed75728ee89 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -41,7 +41,7 @@
/obj/item/borg/upgrade/rename/attack_self(mob/user)
heldname = sanitize_name(tgui_input_text(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN), allow_numbers = TRUE)
- log_game("[key_name(user)] have set \"[heldname]\" as a name in a cyborg reclassification board at [loc_name(user)]")
+ user.log_message("set \"[heldname]\" as a name in a cyborg reclassification board at [loc_name(user)]", LOG_GAME)
/obj/item/borg/upgrade/rename/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -52,7 +52,7 @@
R.updatename()
if(oldname == R.real_name)
R.notify_ai(AI_NOTIFICATION_CYBORG_RENAMED, oldname, R.real_name)
- log_game("[key_name(user)] have used a cyborg reclassification board to rename [oldkeyname] to [key_name(R)] at [loc_name(user)]")
+ usr.log_message("used a cyborg reclassification board to rename [oldkeyname] to [key_name(R)]", LOG_GAME)
/obj/item/borg/upgrade/disablercooler
name = "cyborg rapid disabler cooling module"
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index de0718fe643cd..c16c46e8563df 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -129,10 +129,7 @@
/obj/item/shield/riot/flash/Initialize(mapload)
. = ..()
embedded_flash = new(src)
-
-/obj/item/shield/riot/flash/ComponentInitialize()
- . = .. ()
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
/obj/item/shield/riot/flash/attack(mob/living/M, mob/user)
. = embedded_flash.attack(M, user)
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index c70aa3dc2aa42..aea0643486664 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -21,10 +21,10 @@
/obj/item/singularityhammer/Initialize(mapload)
. = ..()
AddElement(/datum/element/kneejerk)
-
-/obj/item/singularityhammer/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="[base_icon_state]1")
+ AddComponent(/datum/component/two_handed, \
+ force_multiplier = 4, \
+ icon_wielded = "[base_icon_state]1", \
+ )
/obj/item/singularityhammer/update_icon_state()
icon_state = "[base_icon_state]0"
@@ -57,7 +57,7 @@
if(HAS_TRAIT(src, TRAIT_WIELDED))
if(charged)
charged = FALSE
- if(istype(A, /mob/living/))
+ if(isliving(A))
var/mob/living/Z = A
Z.take_bodypart_damage(20,0)
playsound(user, 'sound/weapons/marauder.ogg', 50, TRUE)
@@ -80,9 +80,13 @@
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
-/obj/item/mjollnir/ComponentInitialize()
+/obj/item/mjollnir/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/two_handed, force_multiplier=5, icon_wielded="[base_icon_state]1", attacksound=SFX_SPARKS)
+ AddComponent(/datum/component/two_handed, \
+ force_multiplier = 5, \
+ icon_wielded = "[base_icon_state]1", \
+ attacksound = SFX_SPARKS, \
+ )
/obj/item/mjollnir/update_icon_state()
icon_state = "[base_icon_state]0"
diff --git a/code/game/objects/items/skub.dm b/code/game/objects/items/skub.dm
index a35f817f54f4e..ba1231f152017 100644
--- a/code/game/objects/items/skub.dm
+++ b/code/game/objects/items/skub.dm
@@ -7,7 +7,7 @@
attack_verb_continuous = list("skubs")
attack_verb_simple = list("skub")
-/obj/item/skub/ComponentInitialize()
+/obj/item/skub/Initialize(mapload)
. = ..()
AddComponent(/datum/component/container_item/tank_holder, "holder_skub", FALSE)
diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm
index 764f706af5e09..ed95660053d6c 100644
--- a/code/game/objects/items/spear.dm
+++ b/code/game/objects/items/spear.dm
@@ -31,15 +31,21 @@
/// How much damage to do wielded
var/force_wielded = 18
-/obj/item/spear/Initialize()
+/obj/item/spear/Initialize(mapload)
. = ..()
force = force_unwielded
-
-/obj/item/spear/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
+ //decent in a pinch, but pretty bad.
AddComponent(/datum/component/jousting)
- AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[icon_prefix]1")
+
+ AddComponent(/datum/component/butchering, \
+ speed = 10 SECONDS, \
+ effectiveness = 70, \
+ )
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force_unwielded, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[icon_prefix]1", \
+ )
update_appearance()
/obj/item/spear/update_icon_state()
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index f8067896b1d5d..d6a906d243776 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -43,6 +43,13 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
. = ..()
update_appearance()
AddElement(/datum/element/openspace_item_click_handler)
+ var/static/list/tool_behaviors = list(
+ TOOL_WELDER = list(
+ SCREENTIP_CONTEXT_LMB = "Craft iron sheets",
+ SCREENTIP_CONTEXT_RMB = "Craft floor tiles",
+ ),
+ )
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
/obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters)
if(proximity_flag)
@@ -60,29 +67,41 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
else
icon_state = "rods"
-/obj/item/stack/rods/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_WELDER)
- if(get_amount() < 2)
- to_chat(user, span_warning("You need at least two rods to do this!"))
- return
+/obj/item/stack/rods/welder_act(mob/living/user, obj/item/tool)
+ if(get_amount() < 2)
+ balloon_alert(user, "not enough rods!")
+ return
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/sheet/iron/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into iron sheets with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(2)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
- if(W.use_tool(src, user, 0, volume=40))
- var/obj/item/stack/sheet/iron/new_item = new(usr.loc)
- user.visible_message(span_notice("[user.name] shaped [src] into iron sheets with [W]."), \
- span_notice("You shape [src] into iron sheets with [W]."), \
- span_hear("You hear welding."))
- var/obj/item/stack/rods/R = src
- src = null
- var/replace = (user.get_inactive_held_item()==R)
- R.use(2)
- if (!R && replace)
- user.put_in_hands(new_item)
- else
- return ..()
+/obj/item/stack/rods/welder_act_secondary(mob/living/user, obj/item/tool)
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/tile/iron/two/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into floor tiles with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(1)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
-/obj/item/stack/rods/cyborg/ComponentInitialize()
- . = ..()
+/obj/item/stack/rods/cyborg/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
+ return ..()
+
+/obj/item/stack/rods/two
+ amount = 2
/obj/item/stack/rods/ten
amount = 10
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 603585f1f755b..da13d3bfdfed3 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -290,7 +290,10 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
/obj/item/shard/Initialize(mapload)
. = ..()
AddComponent(/datum/component/caltrop, min_damage = force)
- AddComponent(/datum/component/butchering, 150, 65)
+ AddComponent(/datum/component/butchering, \
+ speed = 15 SECONDS, \
+ effectiveness = 65, \
+ )
icon_state = pick("large", "medium", "small")
switch(icon_state)
if("small")
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 66f00f94754cf..ac5322e98e65b 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -42,6 +42,14 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \
new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2), \
))
+/obj/item/stack/sheet/animalhide/mothroach
+ name = "mothroach hide"
+ desc = "A thin layer of mothroach hide."
+ singular_name = "mothroach hide piece"
+ icon_state = "sheet-mothroach"
+ inhand_icon_state = "sheet-mothroach"
+ merge_type = /obj/item/stack/sheet/animalhide/mothroach
+
/obj/item/stack/sheet/animalhide/gondola
name = "gondola hide"
desc = "The extremely valuable product of gondola hunting."
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 3852db9239e28..fa666cba8dc87 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -448,7 +448,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite
var/turf/T = get_turf(src)
message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]")
- log_game("Coal ignited by [key_name(user)] in [AREACOORD(T)]")
+ user.log_message("ignited coal", LOG_GAME)
fire_act(W.get_temperature())
return TRUE
else
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 19d58f5d45978..047ddc9481aad 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -145,6 +145,16 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
cost = 500
source = /datum/robot_energy_storage/iron
+/obj/item/stack/sheet/iron/Initialize(mapload)
+ . = ..()
+ var/static/list/tool_behaviors = list(
+ TOOL_WELDER = list(
+ SCREENTIP_CONTEXT_LMB = "Craft iron rods",
+ SCREENTIP_CONTEXT_RMB = "Craft floor tiles",
+ ),
+ )
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+
/obj/item/stack/sheet/iron/examine(mob/user)
. = ..()
. += span_notice("You can build a wall girder (unanchored) by right clicking on an empty floor.")
@@ -173,8 +183,34 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
user.visible_message(span_suicide("[user] begins whacking [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
return BRUTELOSS
+/obj/item/stack/sheet/iron/welder_act(mob/living/user, obj/item/tool)
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/rods/two/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into floor rods with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(1)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/item/stack/sheet/iron/welder_act_secondary(mob/living/user, obj/item/tool)
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/tile/iron/four/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into floor tiles with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(1)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
/obj/item/stack/sheet/iron/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters)
- if(istype(target, /turf/open))
+ if(isopenturf(target))
var/turf/open/build_on = target
if(!user.Adjacent(build_on))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
@@ -267,13 +303,13 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
- new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wooden, 3, time = 10),\
+ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/cup/bucket/wooden, 3, time = 10),\
new/datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 10),\
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \
+ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3), \
new/datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100), \
new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 10, time = 60, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("easel", /obj/structure/easel, 5, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
@@ -376,7 +412,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \
null, \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
- new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
+ new/datum/stack_recipe("rag", /obj/item/reagent_containers/cup/rag, 1), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
@@ -667,9 +703,9 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20), \
new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2), \
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
- new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/empty), \
- new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty, 3), \
- new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/food/drinks/colocup, 1), \
+ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty), \
+ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/large/empty, 3), \
+ new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1), \
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2), \
new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2), \
new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1)))
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index b67c15f12cf93..e697764369777 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -262,7 +262,7 @@
/obj/item/stack/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "Stack", name)
+ ui = new(user, src, "StackCrafting", name)
ui.open()
/obj/item/stack/ui_data(mob/user)
@@ -357,7 +357,8 @@
return
if(!is_valid_recipe(recipe, recipes)) //href exploit protection
return
- if(!multiplier || multiplier < 1) //href exploit protection
+ if(!multiplier || multiplier < 1 || !IS_FINITE(multiplier)) //href exploit protection
+ stack_trace("Invalid multiplier value in stack creation [multiplier], [usr] is likely attempting an exploit")
return
if(!building_checks(builder, recipe, multiplier))
return
diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
index 4494f61962328..f9e5cf8f870c3 100644
--- a/code/game/objects/items/stacks/tape.dm
+++ b/code/game/objects/items/stacks/tape.dm
@@ -72,7 +72,7 @@
to_chat(user, span_notice("You finish wrapping [target] with [src]."))
target.name = "[prefix] [target.name]"
- if(istype(target, /obj/item/grenade))
+ if(isgrenade(target))
var/obj/item/grenade/sticky_bomb = target
sticky_bomb.sticky = TRUE
diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm
index 10cdf75f4e55f..4193c22c669f0 100644
--- a/code/game/objects/items/stacks/tiles/tile_iron.dm
+++ b/code/game/objects/items/stacks/tiles/tile_iron.dm
@@ -83,22 +83,53 @@
/obj/item/stack/tile/iron/sepia,
)
-/obj/item/stack/tile/iron/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_WELDER)
- if(get_amount() < 4)
- to_chat(user, span_warning("You need at least four tiles to do this!"))
- return
- if(W.use_tool(src, user, 0, volume=40))
- var/obj/item/stack/sheet/iron/new_item = new(user.loc)
- user.visible_message(span_notice("[user] shaped [src] into [new_item] with [W]."), \
- span_notice("You shaped [src] into [new_item] with [W]."), \
- span_hear("You hear welding."))
- var/holding = user.is_holding(src)
- use(4)
- if(holding && QDELETED(src))
- user.put_in_hands(new_item)
- else
- return ..()
+/obj/item/stack/tile/iron/two
+ amount = 2
+
+/obj/item/stack/tile/iron/four
+ amount = 4
+
+/obj/item/stack/tile/iron/Initialize(mapload)
+ . = ..()
+ var/static/list/tool_behaviors = list(
+ TOOL_WELDER = list(
+ SCREENTIP_CONTEXT_LMB = "Craft iron sheets",
+ SCREENTIP_CONTEXT_RMB = "Craft iron rods",
+ ),
+ )
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+
+/obj/item/stack/tile/iron/welder_act(mob/living/user, obj/item/tool)
+ if(get_amount() < 4)
+ balloon_alert(user, "not enough tiles!")
+ return
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/sheet/iron/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into sheets with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(4)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/item/stack/tile/iron/welder_act_secondary(mob/living/user, obj/item/tool)
+ if(get_amount() < 2)
+ balloon_alert(user, "not enough tiles!")
+ return
+ if(tool.use_tool(src, user, delay = 0, volume = 40))
+ var/obj/item/stack/rods/new_item = new(user.loc)
+ user.visible_message(
+ span_notice("[user.name] shaped [src] into rods with [tool]."),
+ blind_message = span_hear("You hear welding."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
+ use(2)
+ user.put_in_inactive_hand(new_item)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
/obj/item/stack/tile/iron/base //this subtype should be used for most stuff
merge_type = /obj/item/stack/tile/iron/base
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index d6b3cefa34a8f..f3e24aadf90c2 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -21,7 +21,7 @@
resistance_flags = NONE
max_integrity = 300
-/obj/item/storage/backpack/Initialize()
+/obj/item/storage/backpack/Initialize(mapload)
. = ..()
create_storage(max_slots = 21, max_total_storage = 21)
@@ -29,7 +29,7 @@
* Backpack Types
*/
-/obj/item/storage/backpack/old/Initialize()
+/obj/item/storage/backpack/old/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 12
@@ -54,7 +54,7 @@
item_flags = NO_MAT_REDEMPTION
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50)
-/obj/item/storage/backpack/holding/Initialize()
+/obj/item/storage/backpack/holding/Initialize(mapload)
. = ..()
create_storage(max_specific_storage = WEIGHT_CLASS_GIGANTIC, max_total_storage = 35, max_slots = 30, type = /datum/storage/bag_of_holding)
@@ -79,7 +79,7 @@
. = ..()
regenerate_presents()
-/obj/item/storage/backpack/santabag/Initialize()
+/obj/item/storage/backpack/santabag/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 60
@@ -97,7 +97,7 @@
if(user.mind && HAS_TRAIT(user.mind, TRAIT_CANNOT_OPEN_PRESENTS))
var/turf/floor = get_turf(src)
var/obj/item/thing = new /obj/item/a_gift/anything(floor)
- if(!atom_storage.attempt_insert(src, thing, user, override = TRUE))
+ if(!atom_storage.attempt_insert(thing, user, override = TRUE))
qdel(thing)
@@ -331,7 +331,7 @@
inhand_icon_state = "duffel"
slowdown = 1
-/obj/item/storage/backpack/duffelbag/Initialize()
+/obj/item/storage/backpack/duffelbag/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 30
@@ -483,7 +483,7 @@
slowdown = 0
resistance_flags = FIRE_PROOF
-/obj/item/storage/backpack/duffelbag/syndie/Initialize()
+/obj/item/storage/backpack/duffelbag/syndie/Initialize(mapload)
. = ..()
atom_storage.silent = TRUE
@@ -634,12 +634,12 @@
new /obj/item/gun/ballistic/automatic/pistol/aps(src)
new /obj/item/ammo_box/magazine/m9mm_aps/fire(src)
new /obj/item/ammo_box/magazine/m9mm_aps/fire(src)
- new /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka(src)
+ new /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka(src)
new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
new /obj/item/grenade/syndieminibomb(src)
// For ClownOps.
-/obj/item/storage/backpack/duffelbag/clown/syndie/Initialize()
+/obj/item/storage/backpack/duffelbag/clown/syndie/Initialize(mapload)
. = ..()
slowdown = 0
atom_storage.silent = TRUE
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index 8ffd47933a82c..c11f4357b890d 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -20,7 +20,7 @@
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/bag/Initialize()
+/obj/item/storage/bag/Initialize(mapload)
. = ..()
atom_storage.allow_quick_gather = TRUE
atom_storage.allow_quick_empty = TRUE
@@ -41,7 +41,7 @@
///If true, can be inserted into the janitor cart
var/insertable = TRUE
-/obj/item/storage/bag/trash/Initialize()
+/obj/item/storage/bag/trash/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
atom_storage.max_total_storage = 30
@@ -84,7 +84,7 @@
inhand_icon_state = "bluetrashbag"
item_flags = NO_MAT_REDEMPTION
-/obj/item/storage/bag/trash/bluespace/Initialize()
+/obj/item/storage/bag/trash/bluespace/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 60
atom_storage.max_slots = 60
@@ -111,7 +111,7 @@
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_HUGE
atom_storage.max_total_storage = 50
- atom_storage.numerical_stacking = TRUE
+ atom_storage.numerical_stacking = TRUE
atom_storage.allow_quick_empty = TRUE
atom_storage.allow_quick_gather = TRUE
atom_storage.set_holdable(list(/obj/item/stack/ore))
@@ -151,11 +151,11 @@
if(box)
user.transferItemToLoc(thing, box)
show_message = TRUE
- else if(atom_storage.attempt_insert(src, thing, user))
+ else if(atom_storage.attempt_insert(thing, user))
show_message = TRUE
else
if(!spam_protection)
- to_chat(user, span_warning("Your [name] is full and can't hold any more!"))
+ balloon_alert(user, "bag full!")
spam_protection = TRUE
continue
if(show_message)
@@ -178,7 +178,7 @@
desc = "A revolution in convenience, this satchel allows for huge amounts of ore storage. It's been outfitted with anti-malfunction safety measures."
icon_state = "satchel_bspace"
-/obj/item/storage/bag/ore/holding/Initialize()
+/obj/item/storage/bag/ore/holding/Initialize(mapload)
. = ..()
atom_storage.max_slots = INFINITY
atom_storage.max_specific_storage = INFINITY
@@ -195,7 +195,7 @@
worn_icon_state = "plantbag"
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/plants/Initialize()
+/obj/item/storage/bag/plants/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 100
@@ -253,7 +253,7 @@
var/capacity = 300; //the number of sheets it can carry.
-/obj/item/storage/bag/sheetsnatcher/Initialize()
+/obj/item/storage/bag/sheetsnatcher/Initialize(mapload)
. = ..()
atom_storage.allow_quick_empty = TRUE
atom_storage.allow_quick_gather = TRUE
@@ -288,7 +288,7 @@
worn_icon_state = "bookbag"
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/books/Initialize()
+/obj/item/storage/bag/books/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 21
@@ -317,7 +317,7 @@
custom_materials = list(/datum/material/iron=3000)
custom_price = PAYCHECK_CREW * 0.6
-/obj/item/storage/bag/tray/Initialize()
+/obj/item/storage/bag/tray/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY //Plates are required bulky to keep them out of backpacks
atom_storage.set_holdable(list(
@@ -327,8 +327,8 @@
/obj/item/lighter,
/obj/item/organ,
/obj/item/plate,
- /obj/item/reagent_containers/food,
- /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/condiment,
+ /obj/item/reagent_containers/cup,
/obj/item/rollingpaper,
/obj/item/storage/box/gum,
/obj/item/storage/box/matches,
@@ -404,16 +404,16 @@
desc = "A bag for storing pills, patches, and bottles."
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/chemistry/Initialize()
+/obj/item/storage/bag/chemistry/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 200
atom_storage.max_slots = 50
atom_storage.set_holdable(list(
/obj/item/reagent_containers/chem_pack,
/obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/food/drinks/waterbottle,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/glass/waterbottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/medigel,
/obj/item/reagent_containers/pill,
/obj/item/reagent_containers/syringe,
@@ -431,7 +431,7 @@
desc = "A bag for the safe transportation and disposal of biowaste and other virulent materials."
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/bio/Initialize()
+/obj/item/storage/bag/bio/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 200
atom_storage.max_slots = 25
@@ -442,8 +442,8 @@
/obj/item/organ,
/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/hypospray/medipen,
/obj/item/reagent_containers/syringe,
))
@@ -460,7 +460,7 @@
desc = "A bag for the storage and transport of anomalous materials."
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/xeno/Initialize()
+/obj/item/storage/bag/xeno/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 200
atom_storage.max_slots = 25
@@ -471,8 +471,8 @@
/obj/item/organ,
/obj/item/petri_dish,
/obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/syringe,
/obj/item/slime_extract,
/obj/item/swab,
@@ -491,7 +491,7 @@
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS
resistance_flags = FLAMMABLE
-/obj/item/storage/bag/construction/Initialize()
+/obj/item/storage/bag/construction/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 100
atom_storage.max_slots = 50
@@ -500,7 +500,7 @@
/obj/item/assembly,
/obj/item/circuitboard,
/obj/item/electronics,
- /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/cup/beaker,
/obj/item/stack/cable_coil,
/obj/item/stack/ore/bluespace_crystal,
/obj/item/stock_parts,
@@ -514,7 +514,7 @@
inhand_icon_state = "quiver"
worn_icon_state = "harpoon_quiver"
-/obj/item/storage/bag/harpoon_quiver/Initialize()
+/obj/item/storage/bag/harpoon_quiver/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_TINY
atom_storage.max_slots = 40
diff --git a/code/game/objects/items/storage/basket.dm b/code/game/objects/items/storage/basket.dm
index 73904d99ab63c..1ea766822f85c 100644
--- a/code/game/objects/items/storage/basket.dm
+++ b/code/game/objects/items/storage/basket.dm
@@ -5,7 +5,7 @@
w_class = WEIGHT_CLASS_BULKY
resistance_flags = FLAMMABLE
-/obj/item/storage/basket/Initialize()
+/obj/item/storage/basket/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 21
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 3fc62d89f3438..41c14344e73bd 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -41,7 +41,7 @@
drop_sound = 'sound/items/handling/toolbelt_drop.ogg'
pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg'
-/obj/item/storage/belt/utility/Initialize()
+/obj/item/storage/belt/utility/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 21
@@ -205,7 +205,7 @@
inhand_icon_state = "medical"
worn_icon_state = "medical"
-/obj/item/storage/belt/medical/Initialize()
+/obj/item/storage/belt/medical/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 21
@@ -240,8 +240,8 @@
/obj/item/radio,
/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/hypospray,
/obj/item/reagent_containers/medigel,
/obj/item/reagent_containers/pill,
@@ -267,23 +267,23 @@
/obj/item/storage/belt/medical/paramedic/PopulateContents()
SSwardrobe.provide_type(/obj/item/sensor_device, src)
- SSwardrobe.provide_type(/obj/item/pinpointer/crew/prox, src)
SSwardrobe.provide_type(/obj/item/stack/medical/gauze/twelve, src)
- SSwardrobe.provide_type(/obj/item/reagent_containers/syringe, src)
SSwardrobe.provide_type(/obj/item/stack/medical/bone_gel, src)
SSwardrobe.provide_type(/obj/item/stack/sticky_tape/surgical, src)
- SSwardrobe.provide_type(/obj/item/reagent_containers/glass/bottle/formaldehyde, src)
+ SSwardrobe.provide_type(/obj/item/reagent_containers/syringe, src)
+ SSwardrobe.provide_type(/obj/item/reagent_containers/cup/bottle/calomel, src)
+ SSwardrobe.provide_type(/obj/item/reagent_containers/cup/bottle/formaldehyde, src)
update_appearance()
/obj/item/storage/belt/medical/paramedic/get_types_to_preload()
var/list/to_preload = list() //Yes this is a pain. Yes this is the point
to_preload += /obj/item/sensor_device
- to_preload += /obj/item/pinpointer/crew/prox
to_preload += /obj/item/stack/medical/gauze/twelve
- to_preload += /obj/item/reagent_containers/syringe
to_preload += /obj/item/stack/medical/bone_gel
to_preload += /obj/item/stack/sticky_tape/surgical
- to_preload += /obj/item/reagent_containers/glass/bottle/formaldehyde
+ to_preload += /obj/item/reagent_containers/syringe
+ to_preload += /obj/item/reagent_containers/cup/bottle/calomel
+ to_preload += /obj/item/reagent_containers/cup/bottle/formaldehyde
return to_preload
/obj/item/storage/belt/medical/ert
@@ -318,7 +318,7 @@
worn_icon_state = "security"
content_overlays = TRUE
-/obj/item/storage/belt/security/Initialize()
+/obj/item/storage/belt/security/Initialize(mapload)
. = ..()
atom_storage.max_slots = 5
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -357,7 +357,7 @@
content_overlays = FALSE
custom_premium_price = PAYCHECK_COMMAND * 3
-/obj/item/storage/belt/security/webbing/Initialize()
+/obj/item/storage/belt/security/webbing/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
@@ -369,7 +369,7 @@
worn_icon_state = "explorer1"
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/belt/mining/Initialize()
+/obj/item/storage/belt/mining/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -389,8 +389,8 @@
/obj/item/organ/internal/regenerative_core,
/obj/item/pickaxe,
/obj/item/radio,
- /obj/item/reagent_containers/food/drinks,
- /obj/item/reagent_containers/food/drinks/bottle,
+ /obj/item/reagent_containers/cup/glass,
+ /obj/item/reagent_containers/cup/glass/bottle,
/obj/item/reagent_containers/hypospray,
/obj/item/reagent_containers/pill,
/obj/item/resonator,
@@ -430,7 +430,7 @@
inhand_icon_state = "ebelt"
worn_icon_state = "ebelt"
-/obj/item/storage/belt/mining/primitive/Initialize()
+/obj/item/storage/belt/mining/primitive/Initialize(mapload)
. = ..()
atom_storage.max_slots = 5
@@ -441,7 +441,7 @@
inhand_icon_state = "soulstonebelt"
worn_icon_state = "soulstonebelt"
-/obj/item/storage/belt/soulstone/Initialize()
+/obj/item/storage/belt/soulstone/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.set_holdable(list(
@@ -464,7 +464,7 @@
worn_icon_state = "championbelt"
custom_materials = list(/datum/material/gold=400)
-/obj/item/storage/belt/champion/Initialize()
+/obj/item/storage/belt/champion/Initialize(mapload)
. = ..()
atom_storage.max_slots = 1
atom_storage.set_holdable(list(
@@ -486,7 +486,7 @@
worn_icon_state = "militarywebbing"
resistance_flags = FIRE_PROOF
-/obj/item/storage/belt/military/Initialize()
+/obj/item/storage/belt/military/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
@@ -498,13 +498,13 @@
var/sponsor = pick("Donk Co.", "Waffle Co.", "Roffle Co.", "Gorlax Marauders", "Tiger Cooperative")
desc = "A set of snack-tical webbing worn by athletes of the [sponsor] VR sports division."
-/obj/item/storage/belt/military/snack/Initialize()
+/obj/item/storage/belt/military/snack/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
atom_storage.set_holdable(list(
/obj/item/food,
- /obj/item/reagent_containers/food/drinks
+ /obj/item/reagent_containers/cup/glass
))
var/amount = 5
@@ -524,15 +524,15 @@
/obj/item/food/spacetwinkie,
/obj/item/food/spaghetti/pastatomato,
/obj/item/food/syndicake,
- /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola,
- /obj/item/reagent_containers/food/drinks/dry_ramen,
- /obj/item/reagent_containers/food/drinks/soda_cans/cola,
- /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb,
- /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime,
- /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_up,
- /obj/item/reagent_containers/food/drinks/soda_cans/starkist,
+ /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola,
+ /obj/item/reagent_containers/cup/glass/dry_ramen,
+ /obj/item/reagent_containers/cup/soda_cans/cola,
+ /obj/item/reagent_containers/cup/soda_cans/dr_gibb,
+ /obj/item/reagent_containers/cup/soda_cans/lemon_lime,
+ /obj/item/reagent_containers/cup/soda_cans/pwr_game,
+ /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind,
+ /obj/item/reagent_containers/cup/soda_cans/space_up,
+ /obj/item/reagent_containers/cup/soda_cans/starkist,
))
new rig_snacks(src)
@@ -568,7 +568,7 @@
inhand_icon_state = "security"
worn_icon_state = "assault"
-/obj/item/storage/belt/military/assault/Initialize()
+/obj/item/storage/belt/military/assault/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
@@ -585,7 +585,7 @@
inhand_icon_state = "security"
worn_icon_state = "grenadebeltnew"
-/obj/item/storage/belt/grenade/Initialize()
+/obj/item/storage/belt/grenade/Initialize(mapload)
. = ..()
atom_storage.max_slots = 30
atom_storage.numerical_stacking = TRUE
@@ -598,7 +598,7 @@
/obj/item/grenade/c4,
/obj/item/lighter,
/obj/item/multitool,
- /obj/item/reagent_containers/food/drinks/bottle/molotov,
+ /obj/item/reagent_containers/cup/glass/bottle/molotov,
/obj/item/screwdriver,
))
@@ -624,7 +624,7 @@
inhand_icon_state = "soulstonebelt"
worn_icon_state = "soulstonebelt"
-/obj/item/storage/belt/wands/Initialize()
+/obj/item/storage/belt/wands/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.set_holdable(list(
@@ -650,7 +650,7 @@
inhand_icon_state = "janibelt"
worn_icon_state = "janibelt"
-/obj/item/storage/belt/janitor/Initialize()
+/obj/item/storage/belt/janitor/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL // Set to this so the light replacer can fit.
@@ -685,7 +685,7 @@
inhand_icon_state = "bandolier"
worn_icon_state = "bandolier"
-/obj/item/storage/belt/bandolier/Initialize()
+/obj/item/storage/belt/bandolier/Initialize(mapload)
. = ..()
atom_storage.max_slots = 18
atom_storage.max_total_storage = 18
@@ -704,7 +704,7 @@
dying_key = DYE_REGISTRY_FANNYPACK
custom_price = PAYCHECK_CREW * 2
-/obj/item/storage/belt/fannypack/Initialize()
+/obj/item/storage/belt/fannypack/Initialize(mapload)
. = ..()
atom_storage.max_slots = 3
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
@@ -777,16 +777,18 @@
worn_icon_state = "sheath"
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/belt/sabre/Initialize()
+/obj/item/storage/belt/sabre/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_BELT)
atom_storage.max_slots = 1
atom_storage.rustle_sound = FALSE
atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY
- atom_storage.set_holdable(list(
- /obj/item/melee/sabre,
- ))
+ atom_storage.set_holdable(
+ list(
+ /obj/item/melee/sabre,
+ )
+ )
/obj/item/storage/belt/sabre/examine(mob/user)
. = ..()
@@ -802,7 +804,7 @@
user.put_in_hands(I)
update_appearance()
else
- to_chat(user, span_warning("[src] is empty!"))
+ balloon_alert(user, "it's empty!")
/obj/item/storage/belt/sabre/update_icon_state()
icon_state = initial(inhand_icon_state)
@@ -826,7 +828,7 @@
worn_icon_state = "plantbelt"
content_overlays = TRUE
-/obj/item/storage/belt/plant/Initialize()
+/obj/item/storage/belt/plant/Initialize(mapload)
. = ..()
atom_storage.max_slots = 6
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -837,8 +839,8 @@
/obj/item/gun/energy/floragun,
/obj/item/hatchet,
/obj/item/plant_analyzer,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/spray/pestspray,
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/secateurs,
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index e2a7f040bc924..9d9acea45349f 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -10,12 +10,12 @@
resistance_flags = FLAMMABLE
var/title = "book"
-/obj/item/storage/book/Initialize()
+/obj/item/storage/book/Initialize(mapload)
. = ..()
atom_storage.max_slots = 1
/obj/item/storage/book/attack_self(mob/user)
- to_chat(user, span_notice("The pages of [title] have been cut out!"))
+ balloon_alert(user, "pages cut out!")
GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon", "Insulationism", "Guru Granth Sahib"))
//If you get these two lists not matching in size, there will be runtimes and I will hurt you in ways you couldn't even begin to imagine
@@ -23,12 +23,6 @@ GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible"
GLOBAL_LIST_INIT(biblestates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "insuls", "gurugranthsahib"))
GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "kingyellow", "gurugranthsahib"))
-/mob/proc/bible_check() //The bible, if held, might protect against certain things
- var/obj/item/storage/book/bible/B = locate() in src
- if(is_holding(B))
- return B
- return 0
-
/obj/item/storage/book/bible
name = "bible"
desc = "Apply to head repeatedly."
@@ -52,6 +46,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
/obj/item/storage/book/bible/Initialize(mapload)
. = ..()
+ atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE_HOLY)
/obj/item/storage/book/bible/suicide_act(mob/user)
@@ -129,7 +124,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
var/mob/living/carbon/human/H = L
for(var/obj/item/bodypart/bodypart as anything in H.bodyparts)
if(!IS_ORGANIC_LIMB(bodypart))
- to_chat(user, span_warning("[src.deity_name] refuses to heal this metallic taint!"))
+ balloon_alert(user, "can't heal metal!")
return 0
var/heal_amt = 10
@@ -143,13 +138,13 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
H.visible_message(span_notice("[user] heals [H] with the power of [deity_name]!"))
to_chat(H, span_boldnotice("May the power of [deity_name] compel you to be healed!"))
playsound(src.loc, SFX_PUNCH, 25, TRUE, -1)
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing)
+ H.add_mood_event("blessing", /datum/mood_event/blessing)
return TRUE
/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
if (!ISADVANCEDTOOLUSER(user))
- to_chat(user, span_warning("You don't have the dexterity to do this!"))
+ balloon_alert(user, "not dextrous enough!")
return
if (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
@@ -172,7 +167,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
return
if(user == M)
- to_chat(user, span_warning("You can't heal yourself!"))
+ balloon_alert(user, "can't heal yourself!")
return
var/smack = TRUE
@@ -183,7 +178,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
var/mob/living/carbon/C = M
if(!istype(C.head, /obj/item/clothing/head/helmet))
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 60)
- to_chat(C, span_danger("You feel dumber."))
+ C.balloon_alert(C, "you feel dumber")
if(smack)
M.visible_message(span_danger("[user] beats [M] over the head with [src]!"), \
@@ -205,21 +200,21 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
return
for(var/obj/effect/rune/nearby_runes in orange(2,user))
nearby_runes.invisibility = 0
- to_chat(user, span_notice("You hit the floor with the bible."))
+ bible_smacked.balloon_alert(user, "floor smacked")
if(user?.mind?.holy_role)
if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/water)) // blesses all the water in the holder
- to_chat(user, span_notice("You bless [bible_smacked]."))
+ bible_smacked.balloon_alert(user, "blessed")
var/water2holy = bible_smacked.reagents.get_reagent_amount(/datum/reagent/water)
bible_smacked.reagents.del_reagent(/datum/reagent/water)
bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,water2holy)
if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/fuel/unholywater)) // yeah yeah, copy pasted code - sue me
- to_chat(user, span_notice("You purify [bible_smacked]."))
+ bible_smacked.balloon_alert(user, "purified")
var/unholy2clean = bible_smacked.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater)
bible_smacked.reagents.del_reagent(/datum/reagent/fuel/unholywater)
bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean)
if(istype(bible_smacked, /obj/item/storage/book/bible) && !istype(bible_smacked, /obj/item/storage/book/bible/syndicate))
- to_chat(user, span_notice("You purify [bible_smacked], conforming it to your belief."))
+ bible_smacked.balloon_alert(user, "converted")
var/obj/item/storage/book/bible/B = bible_smacked
B.name = name
B.icon_state = icon_state
@@ -227,7 +222,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
if(istype(bible_smacked, /obj/item/cult_bastard) && !IS_CULTIST(user))
var/obj/item/cult_bastard/sword = bible_smacked
- to_chat(user, span_notice("You begin to exorcise [sword]."))
+ bible_smacked.balloon_alert(user, "exorcising...")
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
if(do_after(user, 40, target = sword))
playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE)
@@ -251,7 +246,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
desc = "To be applied to the head repeatedly."
/obj/item/storage/book/bible/booze/PopulateContents()
- new /obj/item/reagent_containers/food/drinks/bottle/whiskey(src)
+ new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src)
/obj/item/storage/book/bible/syndicate
icon_state ="ebook"
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index c1a9f210cf5df..c73da60787c28 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -61,12 +61,12 @@
if(!foldable || (flags_1 & HOLOGRAM_1))
return
if(contents.len)
- to_chat(user, span_warning("You can't fold this box with items still inside!"))
+ balloon_alert(user, "items inside!")
return
if(!ispath(foldable))
return
- to_chat(user, span_notice("You fold [src] flat."))
+ balloon_alert(user, "folded")
var/obj/item/I = new foldable
qdel(src)
user.put_in_hands(I)
@@ -253,7 +253,7 @@
/obj/item/storage/box/beakers/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/reagent_containers/glass/beaker( src )
+ new /obj/item/reagent_containers/cup/beaker( src )
/obj/item/storage/box/beakers/bluespace
name = "box of bluespace beakers"
@@ -261,18 +261,18 @@
/obj/item/storage/box/beakers/bluespace/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/reagent_containers/glass/beaker/bluespace(src)
+ new /obj/item/reagent_containers/cup/beaker/bluespace(src)
/obj/item/storage/box/beakers/variety
name = "beaker variety box"
/obj/item/storage/box/beakers/variety/PopulateContents()
- new /obj/item/reagent_containers/glass/beaker(src)
- new /obj/item/reagent_containers/glass/beaker/large(src)
- new /obj/item/reagent_containers/glass/beaker/plastic(src)
- new /obj/item/reagent_containers/glass/beaker/meta(src)
- new /obj/item/reagent_containers/glass/beaker/noreact(src)
- new /obj/item/reagent_containers/glass/beaker/bluespace(src)
+ new /obj/item/reagent_containers/cup/beaker(src)
+ new /obj/item/reagent_containers/cup/beaker/large(src)
+ new /obj/item/reagent_containers/cup/beaker/plastic(src)
+ new /obj/item/reagent_containers/cup/beaker/meta(src)
+ new /obj/item/reagent_containers/cup/beaker/noreact(src)
+ new /obj/item/reagent_containers/cup/beaker/bluespace(src)
/obj/item/storage/box/medigels
name = "box of medical gels"
@@ -439,7 +439,7 @@
/obj/item/storage/box/drinkingglasses/PopulateContents()
for(var/i in 1 to 6)
- new /obj/item/reagent_containers/food/drinks/drinkingglass(src)
+ new /obj/item/reagent_containers/cup/glass/drinkingglass(src)
/obj/item/storage/box/condimentbottles
name = "box of condiment bottles"
@@ -448,7 +448,7 @@
/obj/item/storage/box/condimentbottles/PopulateContents()
for(var/i in 1 to 6)
- new /obj/item/reagent_containers/food/condiment(src)
+ new /obj/item/reagent_containers/condiment(src)
/obj/item/storage/box/cups
name = "box of paper cups"
@@ -457,7 +457,7 @@
/obj/item/storage/box/cups/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/reagent_containers/food/drinks/sillycup( src )
+ new /obj/item/reagent_containers/cup/glass/sillycup( src )
/obj/item/storage/box/donkpockets
name = "box of donk-pockets"
@@ -470,7 +470,7 @@
for(var/i in 1 to 6)
new donktype(src)
-/obj/item/storage/box/donkpockets/Initialize()
+/obj/item/storage/box/donkpockets/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/donkpocket))
@@ -511,7 +511,7 @@
illustration = null
var/cube_type = /obj/item/food/monkeycube
-/obj/item/storage/box/monkeycubes/Initialize()
+/obj/item/storage/box/monkeycubes/Initialize(mapload)
. = ..()
atom_storage.max_slots = 7
atom_storage.set_holdable(list(/obj/item/food/monkeycube))
@@ -530,7 +530,7 @@
icon_state = "monkeycubebox"
illustration = null
-/obj/item/storage/box/gorillacubes/Initialize()
+/obj/item/storage/box/gorillacubes/Initialize(mapload)
. = ..()
atom_storage.max_slots = 3
atom_storage.set_holdable(list(/obj/item/food/monkeycube))
@@ -687,7 +687,7 @@
icon_state = "spbox"
illustration = ""
-/obj/item/storage/box/snappops/Initialize()
+/obj/item/storage/box/snappops/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/toy/snappop))
atom_storage.max_slots = 8
@@ -711,7 +711,7 @@
base_icon_state = "matchbox"
illustration = null
-/obj/item/storage/box/matches/Initialize()
+/obj/item/storage/box/matches/Initialize(mapload)
. = ..()
atom_storage.max_slots = 10
atom_storage.set_holdable(list(/obj/item/match))
@@ -746,7 +746,7 @@
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
-/obj/item/storage/box/lights/Initialize()
+/obj/item/storage/box/lights/Initialize(mapload)
. = ..()
atom_storage.max_slots = 21
atom_storage.set_holdable(list(/obj/item/light/tube, /obj/item/light/bulb))
@@ -834,12 +834,12 @@
/obj/item/storage/box/clown/attackby(obj/item/I, mob/user, params)
if((istype(I, /obj/item/bodypart/l_arm/robot)) || (istype(I, /obj/item/bodypart/r_arm/robot)))
if(contents.len) //prevent accidently deleting contents
- to_chat(user, span_warning("You need to empty [src] out first!"))
+ balloon_alert(user, "items inside!")
return
if(!user.temporarilyRemoveItemFromInventory(I))
return
qdel(I)
- to_chat(user, span_notice("You add some wheels to the [src]! You've got a honkbot assembly now! Honk!"))
+ balloon_alert(user, "wheels added, honk!")
var/obj/item/bot_assembly/honkbot/A = new
qdel(src)
user.put_in_hands(A)
@@ -993,7 +993,7 @@
desc = "A paper sack with a crude smile etched onto the side."
else
return FALSE
- to_chat(user, span_notice("You make some modifications to [src] using your pen."))
+ balloon_alert(user, "modified")
icon_state = "paperbag_[choice]"
inhand_icon_state = "paperbag_[choice]"
return FALSE
@@ -1024,10 +1024,10 @@
if(user.incapacitated())
return FALSE
if(contents.len)
- to_chat(user, span_warning("You can't modify [src] with items still inside!"))
+ balloon_alert(user, "items inside!")
return FALSE
if(!P || !user.is_holding(P))
- to_chat(user, span_warning("You need a pen to modify [src]!"))
+ balloon_alert(user, "needs pen!")
return FALSE
return TRUE
@@ -1243,7 +1243,7 @@
foldable = null
custom_price = PAYCHECK_CREW
-/obj/item/storage/box/gum/Initialize()
+/obj/item/storage/box/gum/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/bubblegum))
atom_storage.max_slots = 4
@@ -1468,7 +1468,7 @@
for(var/i in 1 to 3)
new /obj/item/food/grown/tomato(src)
new /obj/item/food/meatball(src)
- new /obj/item/reagent_containers/food/drinks/bottle/wine(src)
+ new /obj/item/reagent_containers/cup/glass/bottle/wine(src)
/obj/item/storage/box/ingredients/vegetarian
theme_name = "vegetarian"
@@ -1757,9 +1757,9 @@
/obj/item/storage/box/mothic_goods/PopulateContents()
for(var/i in 1 to 12)
var/randomFood = pick_weight(list(/obj/item/food/grown/toechtauese = 10,
- /obj/item/reagent_containers/food/condiment/cornmeal = 5,
- /obj/item/reagent_containers/food/condiment/yoghurt = 5,
- /obj/item/reagent_containers/food/condiment/quality_oil = 5,
+ /obj/item/reagent_containers/condiment/cornmeal = 5,
+ /obj/item/reagent_containers/condiment/yoghurt = 5,
+ /obj/item/reagent_containers/condiment/quality_oil = 5,
/obj/item/food/cheese/mozzarella = 5,
/obj/item/food/cheese/firm_cheese = 5,
/obj/item/food/cheese/wheel = 5,
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 1edca97865668..63188876bc032 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -16,7 +16,7 @@
max_integrity = 150
var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New()
-/obj/item/storage/briefcase/Initialize()
+/obj/item/storage/briefcase/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 21
@@ -70,4 +70,3 @@
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/suppressor/specialoffer(src)
-
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index b36c7a60fc805..433368f935c92 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -29,7 +29,7 @@
/// What this container folds up into when it's empty.
var/obj/fold_result = /obj/item/stack/sheet/cardboard
-/obj/item/storage/fancy/Initialize()
+/obj/item/storage/fancy/Initialize(mapload)
. = ..()
atom_storage.max_slots = spawn_count
@@ -60,7 +60,7 @@
if(contents.len)
return
new fold_result(user.drop_location())
- to_chat(user, span_notice("You fold the [src] into [initial(fold_result.name)]."))
+ balloon_alert(user, "folded")
user.put_in_active_hand(fold_result)
qdel(src)
@@ -93,7 +93,7 @@
custom_premium_price = PAYCHECK_COMMAND * 1.75
contents_tag = "donut"
-/obj/item/storage/fancy/donut_box/Initialize()
+/obj/item/storage/fancy/donut_box/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/donut))
@@ -140,7 +140,7 @@
spawn_count = 12
contents_tag = "egg"
-/obj/item/storage/fancy/egg_box/Initialize()
+/obj/item/storage/fancy/egg_box/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/egg))
@@ -166,7 +166,7 @@
/obj/item/storage/fancy/candle_box/attack_self(mob/user)
if(!contents.len)
new fold_result(user.drop_location())
- to_chat(user, span_notice("You fold the [src] into [initial(fold_result.name)]."))
+ balloon_alert(user, "folded")
user.put_in_active_hand(fold_result)
qdel(src)
@@ -202,7 +202,7 @@
if(contents.len != 0 || !spawn_coupon)
return ..()
- to_chat(user, span_notice("You rip the back off \the [src] and get a coupon!"))
+ balloon_alert(user, "ooh, free coupon")
var/obj/item/coupon/attached_coupon = new
user.put_in_hands(attached_coupon)
attached_coupon.generate(rigged_omen)
@@ -213,7 +213,7 @@
atom_storage.max_slots = 0
return
-/obj/item/storage/fancy/cigarettes/Initialize()
+/obj/item/storage/fancy/cigarettes/Initialize(mapload)
. = ..()
atom_storage.quickdraw = TRUE
atom_storage.set_holdable(list(/obj/item/clothing/mask/cigarette, /obj/item/lighter))
@@ -359,7 +359,7 @@
spawn_count = 10
custom_price = PAYCHECK_LOWER
-/obj/item/storage/fancy/rollingpapers/Initialize()
+/obj/item/storage/fancy/rollingpapers/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/rollingpaper))
@@ -390,7 +390,7 @@
spawn_coupon = FALSE
display_cigs = FALSE
-/obj/item/storage/fancy/cigarettes/cigars/Initialize()
+/obj/item/storage/fancy/cigarettes/cigars/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/clothing/mask/cigarette/cigar))
@@ -439,7 +439,7 @@
spawn_type = /obj/item/food/tinychocolate
spawn_count = 8
-/obj/item/storage/fancy/heart_box/Initialize()
+/obj/item/storage/fancy/heart_box/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/tinychocolate))
@@ -454,6 +454,6 @@
spawn_type = /obj/item/food/nugget
spawn_count = 6
-/obj/item/storage/fancy/nugget_box/Initialize()
+/obj/item/storage/fancy/nugget_box/Initialize(mapload)
. = ..()
atom_storage.set_holdable(list(/obj/item/food/nugget))
diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm
index 5de3d48700416..20d86f28229e9 100644
--- a/code/game/objects/items/storage/garment.dm
+++ b/code/game/objects/items/storage/garment.dm
@@ -30,7 +30,7 @@
name = "chief engineer's garment bag"
desc = "A bag for storing extra clothes and shoes. This one belongs to the chief engineer."
-/obj/item/storage/bag/garment/Initialize()
+/obj/item/storage/bag/garment/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.numerical_stacking = FALSE
@@ -100,8 +100,10 @@
/obj/item/storage/bag/garment/chief_medical/PopulateContents()
new /obj/item/clothing/head/beret/medical/cmo(src)
+ new /obj/item/clothing/head/surgerycap/cmo(src)
new /obj/item/clothing/under/rank/medical/chief_medical_officer(src)
new /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt(src)
+ new /obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs(src)
new /obj/item/clothing/suit/toggle/labcoat/cmo(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/neck/cloak/cmo(src)
@@ -118,4 +120,3 @@
new /obj/item/clothing/neck/cloak/ce(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/clothing/suit/hooded/wintercoat/engineering/ce(src)
-
diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm
index 4b9e1ebacb483..abcf0d4b10dd1 100644
--- a/code/game/objects/items/storage/holsters.dm
+++ b/code/game/objects/items/storage/holsters.dm
@@ -17,7 +17,7 @@
. = ..()
REMOVE_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT)
-/obj/item/storage/belt/holster/Initialize()
+/obj/item/storage/belt/holster/Initialize(mapload)
. = ..()
atom_storage.max_slots = 1
atom_storage.max_total_storage = 16
@@ -35,7 +35,7 @@
name = "thermal shoulder holsters"
desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Meant to hold a twinned pair of thermal pistols, but can fit several kinds of energy handguns as well."
-/obj/item/storage/belt/holster/thermal/Initialize()
+/obj/item/storage/belt/holster/thermal/Initialize(mapload)
. = ..()
atom_storage.max_slots = 2
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -58,7 +58,7 @@
desc = "A holster able to carry handguns and some ammo. WARNING: Badasses only."
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/belt/holster/detective/Initialize()
+/obj/item/storage/belt/holster/detective/Initialize(mapload)
. = ..()
atom_storage.max_slots = 3
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -117,7 +117,7 @@
chameleon_action.initialize_disguises()
add_item_action(chameleon_action)
-/obj/item/storage/belt/holster/chameleon/Initialize()
+/obj/item/storage/belt/holster/chameleon/Initialize(mapload)
. = ..()
atom_storage.silent = TRUE
@@ -131,7 +131,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/storage/belt/holster/chameleon/Initialize()
+/obj/item/storage/belt/holster/chameleon/Initialize(mapload)
. = ..()
atom_storage.max_slots = 2
atom_storage.max_total_storage = WEIGHT_CLASS_NORMAL
@@ -161,7 +161,7 @@
worn_icon_state = "syndicate_holster"
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/belt/holster/nukie/Initialize()
+/obj/item/storage/belt/holster/nukie/Initialize(mapload)
. = ..()
atom_storage.max_slots = 2
atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index b005081c0527c..12c9f134c8c5a 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -13,7 +13,7 @@
var/icon_closed = "lockbox"
var/icon_broken = "lockbox+b"
-/obj/item/storage/lockbox/Initialize()
+/obj/item/storage/lockbox/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.max_total_storage = 14
@@ -24,27 +24,27 @@
var/locked = atom_storage.locked
if(W.GetID())
if(broken)
- to_chat(user, span_danger("It appears to be broken."))
+ balloon_alert(user, "broken!")
return
if(allowed(user))
atom_storage.locked = !locked
locked = atom_storage.locked
if(locked)
icon_state = icon_locked
- to_chat(user, span_danger("You lock the [src.name]!"))
atom_storage.close_all()
- return
else
icon_state = icon_closed
- to_chat(user, span_danger("You unlock the [src.name]!"))
- return
+
+ balloon_alert(user, locked ? "locked" : "unlocked")
+ return
+
else
- to_chat(user, span_danger("Access Denied."))
+ balloon_alert(user, "access denied!")
return
if(!locked)
return ..()
else
- to_chat(user, span_danger("It's locked!"))
+ balloon_alert(user, "locked!")
/obj/item/storage/lockbox/emag_act(mob/user)
if(!broken)
@@ -96,7 +96,7 @@
icon_closed = "medalbox"
icon_broken = "medalbox+b"
-/obj/item/storage/lockbox/medal/Initialize()
+/obj/item/storage/lockbox/medal/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
atom_storage.max_slots = 10
@@ -169,12 +169,12 @@
name = "security medal box"
desc = "A locked box used to store medals to be given to members of the security department."
req_access = list(ACCESS_HOS)
-
+
/obj/item/storage/lockbox/medal/med
name = "medical medal box"
desc = "A locked box used to store medals to be given to members of the medical department."
req_access = list(ACCESS_CMO)
-
+
/obj/item/storage/lockbox/medal/med/PopulateContents()
new /obj/item/clothing/accessory/medal/med_medal(src)
new /obj/item/clothing/accessory/medal/med_medal2(src)
@@ -225,7 +225,7 @@
buyer_account = _buyer_account
/obj/item/storage/lockbox/order/attackby(obj/item/W, mob/user, params)
- if(!istype(W, /obj/item/card/id))
+ if(!isidcard(W))
return ..()
var/obj/item/card/id/id_card = W
@@ -233,11 +233,10 @@
add_fingerprint(user)
if(id_card.registered_account != buyer_account)
- to_chat(user, span_warning("Bank account does not match with buyer!"))
+ balloon_alert(user, "incorrect bank account!")
return
atom_storage.locked = !privacy_lock
privacy_lock = atom_storage.locked
user.visible_message(span_notice("[user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock."),
span_notice("You [privacy_lock ? "" : "un"]lock [src]'s privacy lock."))
-
diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm
index 2c24b2e832f86..f4d8f96548ddc 100644
--- a/code/game/objects/items/storage/medkit.dm
+++ b/code/game/objects/items/storage/medkit.dm
@@ -60,7 +60,7 @@
inhand_icon_state = "medkit"
desc = "A high capacity aid kit for doctors, full of medical supplies and basic surgical equipment"
-/obj/item/storage/medkit/surgery/Initialize()
+/obj/item/storage/medkit/surgery/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL //holds the same equipment as a medibelt
atom_storage.max_slots = 12
@@ -69,8 +69,8 @@
/obj/item/healthanalyzer,
/obj/item/dnainjector,
/obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/cup/beaker,
+ /obj/item/reagent_containers/cup/bottle,
/obj/item/reagent_containers/pill,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/medigel,
@@ -256,9 +256,10 @@
name = "combat medical kit"
desc = "I hope you've got insurance."
icon_state = "medkit_tactical"
+ inhand_icon_state = "medkit-tactical"
damagetype_healed = "all"
-/obj/item/storage/medkit/tactical/Initialize()
+/obj/item/storage/medkit/tactical/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -281,7 +282,7 @@
//Making a medibot!
if(contents.len >= 1)
- to_chat(user, span_warning("You need to empty [src] out first!"))
+ balloon_alert(user, "items inside!")
return
var/obj/item/bot_assembly/medbot/medbot_assembly = new
@@ -296,7 +297,7 @@
else if (istype(src, /obj/item/storage/medkit/advanced))
medbot_assembly.set_skin("advanced")
user.put_in_hands(medbot_assembly)
- to_chat(user, span_notice("You add [bodypart] to [src]."))
+ medbot_assembly.balloon_alert(user, "arm added")
medbot_assembly.robot_arm = bodypart.type
medbot_assembly.medkit_type = type
qdel(bodypart)
@@ -316,7 +317,7 @@
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
-/obj/item/storage/pill_bottle/Initialize()
+/obj/item/storage/pill_bottle/Initialize(mapload)
. = ..()
atom_storage.allow_quick_gather = TRUE
atom_storage.set_holdable(list(/obj/item/reagent_containers/pill))
@@ -524,21 +525,17 @@
/// var to prevent it freezing the same things over and over
var/cooling = FALSE
-/obj/item/storage/organbox/Initialize()
+/obj/item/storage/organbox/Initialize(mapload)
. = ..()
- atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY /// you have to remove it from your bag before opening it but I think that's fine
- atom_storage.max_total_storage = 21
+
+ create_storage(type = /datum/storage/organ_box, max_specific_storage = WEIGHT_CLASS_BULKY, max_total_storage = 21)
atom_storage.set_holdable(list(
/obj/item/organ,
/obj/item/bodypart,
/obj/item/food/icecream
))
-/obj/item/storage/organbox/Initialize(mapload)
- . = ..()
create_reagents(100, TRANSPARENT)
- RegisterSignal(src, COMSIG_ATOM_ENTERED, .proc/freeze)
- RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/unfreeze)
START_PROCESSING(SSobj, src)
/obj/item/storage/organbox/process(delta_time)
@@ -576,7 +573,7 @@
var/obj/item/organ/internal/int_organ = I
int_organ.organ_flags |= ORGAN_FROZEN
return
- if(istype(I, /obj/item/bodypart))
+ if(isbodypart(I))
var/obj/item/bodypart/B = I
for(var/obj/item/organ/internal/int_organ in B.contents)
int_organ.organ_flags |= ORGAN_FROZEN
@@ -588,22 +585,22 @@
var/obj/item/organ/internal/int_organ = I
int_organ.organ_flags &= ~ORGAN_FROZEN
return
- if(istype(I, /obj/item/bodypart))
+ if(isbodypart(I))
var/obj/item/bodypart/B = I
for(var/obj/item/organ/internal/int_organ in B.contents)
int_organ.organ_flags &= ~ORGAN_FROZEN
/obj/item/storage/organbox/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
+ if(is_reagent_container(I) && I.is_open_container())
var/obj/item/reagent_containers/RC = I
var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user)
if(units)
- to_chat(user, span_notice("You transfer [units] units of the solution to [src]."))
+ balloon_alert(user, "[units]u transferred")
return
if(istype(I, /obj/item/plunger))
- to_chat(user, span_notice("You start furiously plunging [name]."))
+ balloon_alert(user, "plunging...")
if(do_after(user, 10, target = src))
- to_chat(user, span_notice("You finish plunging the [name]."))
+ balloon_alert(user, "plunged")
reagents.clear_reagents()
return
return ..()
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 138feab80f09e..7d21719fcec9c 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -33,7 +33,7 @@
var/can_hack_open = TRUE
-/obj/item/storage/secure/Initialize()
+/obj/item/storage/secure/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
atom_storage.max_total_storage = 14
@@ -56,25 +56,25 @@
/obj/item/storage/secure/screwdriver_act(mob/living/user, obj/item/tool)
if(tool.use_tool(src, user, 20))
panel_open = !panel_open
- to_chat(user, span_notice("You [panel_open ? "open" : "close"] the service panel."))
+ balloon_alert(user, "panel [panel_open ? "opened" : "closed"]")
return TRUE
/obj/item/storage/secure/multitool_act(mob/living/user, obj/item/tool)
. = TRUE
if(lock_hacking)
- to_chat(user, span_danger("This safe is already being hacked."))
+ balloon_alert(user, "already hacking!")
return
if(panel_open == TRUE)
- to_chat(user, span_danger("Now attempting to reset internal memory, please hold."))
+ balloon_alert(user, "hacking...")
lock_hacking = TRUE
if (tool.use_tool(src, user, 400))
- to_chat(user, span_danger("Internal memory reset - lock has been disengaged."))
+ balloon_alert(user, "hacked")
lock_set = FALSE
lock_hacking = FALSE
return
- to_chat(user, span_warning("You must unscrew the service panel before you can pulse the wiring!"))
+ balloon_alert(user, "unscrew panel!")
/obj/item/storage/secure/attack_self(mob/user)
var/locked = atom_storage.locked
@@ -143,7 +143,7 @@
new /obj/item/paper(src)
new /obj/item/pen(src)
-/obj/item/storage/secure/briefcase/Initialize()
+/obj/item/storage/secure/briefcase/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 21
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -172,7 +172,7 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe, 32)
-/obj/item/storage/secure/safe/Initialize()
+/obj/item/storage/secure/safe/Initialize(mapload)
. = ..()
atom_storage.set_holdable(cant_hold_list = list(/obj/item/storage/secure/briefcase))
atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC
diff --git a/code/game/objects/items/storage/sixpack.dm b/code/game/objects/items/storage/sixpack.dm
index dd67c5d222a8f..4f88dd4b1adad 100644
--- a/code/game/objects/items/storage/sixpack.dm
+++ b/code/game/objects/items/storage/sixpack.dm
@@ -21,16 +21,16 @@
. = ..()
update_appearance()
-/obj/item/storage/cans/Initialize()
+/obj/item/storage/cans/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
atom_storage.max_total_storage = 12
atom_storage.max_slots = 6
atom_storage.set_holdable(list(
- /obj/item/reagent_containers/food/drinks/soda_cans,
- /obj/item/reagent_containers/food/drinks/bottle/beer,
- /obj/item/reagent_containers/food/drinks/bottle/ale,
- /obj/item/reagent_containers/food/drinks/waterbottle
+ /obj/item/reagent_containers/cup/soda_cans,
+ /obj/item/reagent_containers/cup/glass/bottle/beer,
+ /obj/item/reagent_containers/cup/glass/bottle/ale,
+ /obj/item/reagent_containers/cup/glass/waterbottle
))
/obj/item/storage/cans/sixsoda
@@ -39,7 +39,7 @@
/obj/item/storage/cans/sixsoda/PopulateContents()
for(var/i in 1 to 6)
- new /obj/item/reagent_containers/food/drinks/soda_cans/cola(src)
+ new /obj/item/reagent_containers/cup/soda_cans/cola(src)
/obj/item/storage/cans/sixbeer
name = "beer bottle ring"
@@ -47,4 +47,4 @@
/obj/item/storage/cans/sixbeer/PopulateContents()
for(var/i in 1 to 6)
- new /obj/item/reagent_containers/food/drinks/bottle/beer(src)
+ new /obj/item/reagent_containers/cup/glass/bottle/beer(src)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index b44c548cd0bad..2bf724e3e2533 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -38,7 +38,7 @@
if(has_latches)
. += latches
-/obj/item/storage/toolbox/Initialize()
+/obj/item/storage/toolbox/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -101,7 +101,7 @@
force = 5
w_class = WEIGHT_CLASS_NORMAL
-/obj/item/storage/toolbox/mechanical/old/heirloom/Initialize()
+/obj/item/storage/toolbox/mechanical/old/heirloom/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
@@ -168,7 +168,7 @@
throwforce = 18
material_flags = NONE
-/obj/item/storage/toolbox/syndicate/Initialize()
+/obj/item/storage/toolbox/syndicate/Initialize(mapload)
. = ..()
atom_storage.silent = TRUE
@@ -205,7 +205,7 @@
w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox!
material_flags = NONE
-/obj/item/storage/toolbox/artistic/Initialize()
+/obj/item/storage/toolbox/artistic/Initialize(mapload)
. = ..()
atom_storage.max_total_storage = 20
atom_storage.max_slots = 10
@@ -271,7 +271,7 @@
w_class = WEIGHT_CLASS_NORMAL
has_latches = FALSE
-/obj/item/storage/toolbox/infiltrator/Initialize()
+/obj/item/storage/toolbox/infiltrator/Initialize(mapload)
. = ..()
atom_storage.max_slots = 10
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
@@ -310,7 +310,7 @@
if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox))
return
if(contents.len >= 1)
- to_chat(user, span_warning("They won't fit in, as there is already stuff inside!"))
+ balloon_alert(user, "not empty!")
return
if(T.use(10))
var/obj/item/bot_assembly/floorbot/B = new
@@ -328,16 +328,13 @@
B.toolbox_color = "s"
user.put_in_hands(B)
B.update_appearance()
- to_chat(user, span_notice("You add the tiles into the empty [name]. They protrude from the top."))
+ B.balloon_alert(user, "tiles added")
qdel(src)
else
- to_chat(user, span_warning("You need 10 floor tiles to start building a floorbot!"))
+ balloon_alert(user, "needs 10 tiles!")
return
/obj/item/storage/toolbox/haunted
name = "old toolbox"
custom_materials = list(/datum/material/hauntium = 500)
-
-
-
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index a9f5085655823..311bc3850f5fd 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -173,7 +173,7 @@
new /obj/item/card/id/advanced/chameleon(src)
new /obj/item/clothing/under/chameleon(src)
new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
- new /obj/item/reagent_containers/glass/rag(src)
+ new /obj/item/reagent_containers/cup/rag(src)
if(KIT_NINJA)
new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
@@ -222,7 +222,7 @@
new /obj/item/storage/belt/fannypack/yellow(src) // 0 tc
new /obj/item/grenade/spawnergrenade/buzzkill(src)
new /obj/item/grenade/spawnergrenade/buzzkill(src)
- new /obj/item/reagent_containers/glass/bottle/beesease(src) // 10 tc?
+ new /obj/item/reagent_containers/cup/bottle/beesease(src) // 10 tc?
new /obj/item/melee/beesword(src) //priceless
if(KIT_MR_FREEZE)
@@ -270,7 +270,7 @@
name = "Contractor Guide"
/obj/item/paper/contractor_guide/Initialize(mapload)
- info = {"Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,
+ default_raw_text = {"
Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,
this kit will provide you contracts to take on for TC payments.
Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the
@@ -309,8 +309,8 @@
ID card you have equipped, on top of the TC payment we give.
Good luck agent. You can burn this document with the supplied lighter.
"}
-
return ..()
+
/obj/item/storage/box/syndie_kit
name = "box"
desc = "A sleek, sturdy box."
@@ -385,7 +385,7 @@
/obj/item/storage/box/syndie_kit/space
name = "boxed space suit and helmet"
-/obj/item/storage/box/syndie_kit/space/Initialize()
+/obj/item/storage/box/syndie_kit/space/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
atom_storage.set_holdable(list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate))
@@ -410,24 +410,24 @@
/obj/item/storage/box/syndie_kit/chemical
name = "chemical kit"
-/obj/item/storage/box/syndie_kit/chemical/Initialize()
+/obj/item/storage/box/syndie_kit/chemical/Initialize(mapload)
. = ..()
atom_storage.max_slots = 14
/obj/item/storage/box/syndie_kit/chemical/PopulateContents()
- new /obj/item/reagent_containers/glass/bottle/polonium(src)
- new /obj/item/reagent_containers/glass/bottle/venom(src)
- new /obj/item/reagent_containers/glass/bottle/fentanyl(src)
- new /obj/item/reagent_containers/glass/bottle/formaldehyde(src)
- new /obj/item/reagent_containers/glass/bottle/spewium(src)
- new /obj/item/reagent_containers/glass/bottle/cyanide(src)
- new /obj/item/reagent_containers/glass/bottle/histamine(src)
- new /obj/item/reagent_containers/glass/bottle/initropidril(src)
- new /obj/item/reagent_containers/glass/bottle/pancuronium(src)
- new /obj/item/reagent_containers/glass/bottle/sodium_thiopental(src)
- new /obj/item/reagent_containers/glass/bottle/coniine(src)
- new /obj/item/reagent_containers/glass/bottle/curare(src)
- new /obj/item/reagent_containers/glass/bottle/amanitin(src)
+ new /obj/item/reagent_containers/cup/bottle/polonium(src)
+ new /obj/item/reagent_containers/cup/bottle/venom(src)
+ new /obj/item/reagent_containers/cup/bottle/fentanyl(src)
+ new /obj/item/reagent_containers/cup/bottle/formaldehyde(src)
+ new /obj/item/reagent_containers/cup/bottle/spewium(src)
+ new /obj/item/reagent_containers/cup/bottle/cyanide(src)
+ new /obj/item/reagent_containers/cup/bottle/histamine(src)
+ new /obj/item/reagent_containers/cup/bottle/initropidril(src)
+ new /obj/item/reagent_containers/cup/bottle/pancuronium(src)
+ new /obj/item/reagent_containers/cup/bottle/sodium_thiopental(src)
+ new /obj/item/reagent_containers/cup/bottle/coniine(src)
+ new /obj/item/reagent_containers/cup/bottle/curare(src)
+ new /obj/item/reagent_containers/cup/bottle/amanitin(src)
new /obj/item/reagent_containers/syringe(src)
/obj/item/storage/box/syndie_kit/nuke
@@ -457,7 +457,7 @@
for(var/i in 1 to 5)
new /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure(src)
new /obj/item/reagent_containers/syringe(src)
- new /obj/item/reagent_containers/glass/bottle/tuberculosiscure(src)
+ new /obj/item/reagent_containers/cup/bottle/tuberculosiscure(src)
/obj/item/storage/box/syndie_kit/chameleon
name = "chameleon kit"
@@ -494,7 +494,7 @@
new/obj/item/toy/crayon/rainbow(src)
/obj/item/storage/box/syndie_kit/romerol/PopulateContents()
- new /obj/item/reagent_containers/glass/bottle/romerol(src)
+ new /obj/item/reagent_containers/cup/bottle/romerol(src)
new /obj/item/reagent_containers/syringe(src)
new /obj/item/reagent_containers/dropper(src)
@@ -545,7 +545,7 @@
/obj/item/storage/box/syndie_kit/sleepytime/PopulateContents()
new /obj/item/clothing/under/syndicate/bloodred/sleepytime(src)
- new /obj/item/reagent_containers/food/drinks/mug/coco(src)
+ new /obj/item/reagent_containers/cup/glass/mug/coco(src)
new /obj/item/toy/plush/carpplushie(src)
new /obj/item/bedsheet/syndie(src)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 5906b5103405f..cbdf0c3291efc 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -10,7 +10,7 @@
var/list/combined_access
var/cached_flat_icon
-/obj/item/storage/wallet/Initialize()
+/obj/item/storage/wallet/Initialize(mapload)
. = ..()
atom_storage.max_slots = 4
atom_storage.set_holdable(list(
@@ -41,7 +41,7 @@
/obj/item/storage/wallet/Exited(atom/movable/gone, direction)
. = ..()
- if(istype(gone, /obj/item/card/id))
+ if(isidcard(gone))
refreshID()
/**
@@ -86,7 +86,7 @@
/obj/item/storage/wallet/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
- if(istype(arrived, /obj/item/card/id))
+ if(isidcard(arrived))
refreshID()
/obj/item/storage/wallet/update_overlays()
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index d2d02e0048bf4..b9ce200a0c6fa 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -122,7 +122,7 @@
return loc
/obj/item/tank/jetpack/suicide_act(mob/user)
- if (!istype(user, /mob/living/carbon/human))
+ if (!ishuman(user))
return ..()
var/mob/living/carbon/human/suffocater = user
suffocater.say("WHAT THE FUCK IS CARBON DIOXIDE?")
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index dfd68b339d58f..c05300dd2e4a7 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -78,6 +78,9 @@
/obj/item/tank/Initialize(mapload)
. = ..()
+ if(tank_holder_icon_state)
+ AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state)
+
air_contents = new(volume) //liters
air_contents.temperature = T20C
@@ -97,11 +100,6 @@
/obj/item/tank/proc/populate_gas()
return
-/obj/item/tank/ComponentInitialize()
- . = ..()
- if(tank_holder_icon_state)
- AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state)
-
/obj/item/tank/Destroy()
UnregisterSignal(air_contents, COMSIG_GASMIX_MERGED)
air_contents = null
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index df71835cdfa6a..b63034fac1d05 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -311,7 +311,7 @@
COOLDOWN_START(src, resin_cooldown, 10 SECONDS)
R.remove_any(100)
var/obj/effect/resin_container/resin = new (get_turf(src))
- log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
+ user.log_message("used Resin Launcher", LOG_GAME)
playsound(src,'sound/items/syringeproj.ogg',40,TRUE)
var/delay = 2
var/datum/move_loop/loop = SSmove_manager.move_towards(resin, target, delay, timeout = delay * 5, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
@@ -469,7 +469,7 @@
var/used_amount = inj_am / usage_ratio
reagents.trans_to(user, used_amount, multiplier=usage_ratio, methods = INJECT)
update_appearance()
- user.update_inv_back() //for overlays update
+ user.update_worn_back() //for overlays update
/datum/action/item_action/activate_injector
name = "Activate Injector"
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 04b1b4da012f2..5badeab736a59 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -486,7 +486,7 @@
/obj/item/paper/syndicate_teleporter
name = "Teleporter Guide"
- info = {"
+ default_raw_text = {"
Instructions on your new prototype teleporter:
This teleporter will teleport the user 4-8 meters in the direction they are facing.
diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm
index 464fa7ef2027a..19508395f9607 100644
--- a/code/game/objects/items/theft_tools.dm
+++ b/code/game/objects/items/theft_tools.dm
@@ -98,7 +98,7 @@
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_nuke")
/obj/item/paper/guides/antag/nuke_instructions
- info = "How to break into a Nanotrasen self-destruct terminal and remove its plutonium core:
\
+ default_raw_text = "How to break into a Nanotrasen self-destruct terminal and remove its plutonium core:
\
\
- Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel
\
- Dislodge and remove the front panel with a crowbar
\
@@ -109,7 +109,7 @@
"
/obj/item/paper/guides/antag/hdd_extraction
- info = "Source Code Theft & You - The Idiot's Guide to Crippling Nanotrasen Research & Development
\
+ default_raw_text = "Source Code Theft & You - The Idiot's Guide to Crippling Nanotrasen Research & Development
\
Rumour has it that Nanotrasen are using their R&D Servers to create something awful! They've codenamed it Project Goon, whatever that means.
\
This cannot be allowed to stand. Below is all our intel for stealing their source code and crippling their research efforts:
\
\
@@ -145,7 +145,7 @@
// STEALING SUPERMATTER
/obj/item/paper/guides/antag/supermatter_sliver
- info = "How to safely extract a supermatter sliver:
\
+ default_raw_text = "How to safely extract a supermatter sliver:
\
\
- You must have active magnetic anchoring at all times near an active supermatter crystal.
\
- Approach an active supermatter crystal with radiation shielded personal protective equipment. DO NOT MAKE PHYSICAL CONTACT.
\
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index dcc4b4d17ca4c..dccd8c3a708de 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -73,7 +73,7 @@
throwforce = 10
throw_speed = 2
-/obj/item/crowbar/large/old/Initialize()
+/obj/item/crowbar/large/old/Initialize(mapload)
. = ..()
if(prob(50))
icon_state = "crowbar_powergame"
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index ce468a70129ad..fb927d91721fd 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -51,15 +51,12 @@
/obj/item/weldingtool/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
+ AddElement(/datum/element/tool_flash, light_range)
create_reagents(max_fuel)
reagents.add_reagent(/datum/reagent/fuel, max_fuel)
update_appearance()
-/obj/item/weldingtool/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
- AddElement(/datum/element/tool_flash, light_range)
-
/obj/item/weldingtool/update_icon_state()
if(welding)
inhand_icon_state = "[initial(inhand_icon_state)]1"
@@ -152,7 +149,7 @@
var/mob/living/attacked_mob = attacked_atom
if(attacked_mob.ignite_mob())
message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]")
- log_game("[key_name(user)] set [key_name(attacked_mob)] on fire with [src] at [AREACOORD(user)]")
+ user.log_message("set [key_name(attacked_mob)] on fire with [src].", LOG_ATTACK)
if(!status && attacked_atom.is_refillable())
reagents.trans_to(attacked_atom, reagents.total_volume, transfered_by = user)
@@ -170,13 +167,14 @@
if(!QDELETED(attacked_atom) && isliving(attacked_atom)) // can't ignite something that doesn't exist
var/mob/living/attacked_mob = attacked_atom
if(attacked_mob.ignite_mob())
- message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]")
- log_game("[key_name(user)] set [key_name(attacked_mob)] on fire with [src] at [AREACOORD(user)]")
+ message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)].")
+ user.log_message("set [key_name(attacked_mob)] on fire with [src]", LOG_ATTACK)
/obj/item/weldingtool/attack_self(mob/user)
if(src.reagents.has_reagent(/datum/reagent/toxin/plasma))
message_admins("[ADMIN_LOOKUPFLW(user)] activated a rigged welder at [AREACOORD(user)].")
+ user.log_message("activated a rigged welder", LOG_VICTIM)
explode()
switched_on(user)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index a7743e3b067ee..3959765f8f6af 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -44,12 +44,9 @@
/obj/item/toy/waterballoon/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
create_reagents(10)
-/obj/item/toy/waterballoon/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
-
/obj/item/toy/waterballoon/attack(mob/living/carbon/human/M, mob/user)
return
@@ -70,7 +67,7 @@
update_appearance()
/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/reagent_containers/glass))
+ if(istype(I, /obj/item/reagent_containers/cup))
if(I.reagents)
if(I.reagents.total_volume <= 0)
to_chat(user, span_warning("[I] is empty."))
@@ -176,20 +173,20 @@
inhand_icon_state = "syndballoon"
random_color = FALSE
-/obj/item/toy/balloon/syndicate/pickup(mob/user)
+/obj/item/toy/balloon/syndicate/pickup(mob/living/user)
. = ..()
if(user && user.mind && user.mind.has_antag_datum(/datum/antagonist, TRUE))
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag)
+ user.add_mood_event("badass_antag", /datum/mood_event/badass_antag)
-/obj/item/toy/balloon/syndicate/dropped(mob/user)
+/obj/item/toy/balloon/syndicate/dropped(mob/living/user)
if(user)
- SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag)
+ user.clear_mood_event("badass_antag")
. = ..()
/obj/item/toy/balloon/syndicate/Destroy()
if(ismob(loc))
- var/mob/M = loc
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag)
+ var/mob/living/M = loc
+ M.clear_mood_event("badass_antag")
. = ..()
/obj/item/toy/balloon/arrest
@@ -1487,7 +1484,7 @@ GLOBAL_LIST_EMPTY(intento_players)
switch(intent)
if(HELP)
to_chat(victim, span_danger("[src] hugs you to make you feel better!"))
- SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
+ victim.add_mood_event("hug", /datum/mood_event/hug)
if(DISARM)
to_chat(victim, span_danger("You're knocked down from a shove by [src]!"))
victim.Knockdown(2 SECONDS)
diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm
index 7f4e666c99875..443c48c850787 100644
--- a/code/game/objects/items/vending_items.dm
+++ b/code/game/objects/items/vending_items.dm
@@ -22,6 +22,7 @@
// Built automatically from the corresponding vending machine.
// If null, considered to be full. Otherwise, is list(/typepath = amount).
var/list/products
+ var/list/product_categories
var/list/contraband
var/list/premium
@@ -40,7 +41,7 @@
. += "It can restock [num] item\s."
/obj/item/vending_refill/get_part_rating()
- if (!products || !contraband || !premium)
+ if (!products || !product_categories || !contraband || !premium)
return INFINITY
. = 0
for(var/key in products)
@@ -49,3 +50,10 @@
. += contraband[key]
for(var/key in premium)
. += premium[key]
+
+ for (var/list/category as anything in product_categories)
+ var/list/products = category["products"]
+ for (var/product_key in products)
+ . += products[product_key]
+
+ return .
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 30286a28e8703..b1eeac1e66e02 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -79,7 +79,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/butchering, 40, 105)
+ AddComponent(/datum/component/butchering, \
+ speed = 4 SECONDS, \
+ effectiveness = 105, \
+ )
/obj/item/claymore/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
@@ -318,7 +321,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.balloon_alert(user, "crafted spear")
return
- if(istype(attacking_item, /obj/item/assembly/igniter) && !(HAS_TRAIT(attacking_item, TRAIT_NODROP)))
+ if(isigniter(attacking_item) && !(HAS_TRAIT(attacking_item, TRAIT_NODROP)))
var/datum/crafting_recipe/recipe_to_use = /datum/crafting_recipe/stunprod
user.balloon_alert(user, "crafting cattleprod...")
if(do_after(user, initial(recipe_to_use.time), src))
@@ -390,8 +393,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/switchblade/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
- AddComponent(/datum/component/butchering, 7 SECONDS, 100)
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
+ AddComponent(/datum/component/butchering, \
+ speed = 7 SECONDS, \
+ effectiveness = 100, \
+ )
AddComponent(/datum/component/transforming, \
start_transformed = start_extended, \
force_on = 20, \
@@ -699,10 +705,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
name = "cricket bat"
icon_state = "baseball_bat_brit"
inhand_icon_state = "baseball_bat_brit"
- if(prob(50))
- desc = "You've got red on you."
- else
- desc = "You gotta know what a crumpet is to understand cricket."
+ desc = pick("You've got red on you.", "You gotta know what a crumpet is to understand cricket.")
AddElement(/datum/element/kneecapping)
@@ -799,6 +802,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/baseball_bat/homerun
name = "home run bat"
desc = "This thing looks dangerous... Dangerously good at baseball, that is."
+ icon_state = "baseball_bat_home"
+ inhand_icon_state = "baseball_bat_home"
homerun_able = TRUE
mob_thrower = TRUE
@@ -955,11 +960,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/highfrequencyblade/Initialize(mapload)
. = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
-
-/obj/item/highfrequencyblade/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/two_handed, wield_callback = CALLBACK(src, .proc/on_wield), unwield_callback = CALLBACK(src, .proc/on_unwield))
+ AddComponent(/datum/component/two_handed, \
+ wield_callback = CALLBACK(src, .proc/on_wield), \
+ unwield_callback = CALLBACK(src, .proc/on_unwield), \
+ )
+ AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS)
/obj/item/highfrequencyblade/update_icon_state()
icon_state = "hfrequency[HAS_TRAIT(src, TRAIT_WIELDED)]"
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 9282f26189620..b6c7483680741 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -93,11 +93,11 @@
var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10)
take_damage(amt, BRUTE)
-/obj/attack_slime(mob/living/simple_animal/slime/user)
+/obj/attack_slime(mob/living/simple_animal/slime/user, list/modifiers)
if(!user.is_adult)
return
- attack_generic(user, rand(10, 15), BRUTE, MELEE, 1)
-
+ if(attack_generic(user, rand(10, 15), BRUTE, MELEE, 1))
+ log_combat(user, src, "attacked")
/obj/singularity_act()
SSexplosions.high_mov_atom += src
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 168d4a33dd842..4c5ebe084db48 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -76,7 +76,6 @@
log_telecomms("Created [src]([REF(src)] in nullspace, assuming network to be in station")
network_id = NETWORK_NAME_COMBINE(STATION_NETWORK_ROOT, network_id) // I regret nothing!!
AddComponent(/datum/component/ntnet_interface, network_id, id_tag)
- /// Needs to run before as ComponentInitialize runs after this statement...why do we have ComponentInitialize again?
/obj/Destroy(force)
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 646bb7b700559..17499ed89802f 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -122,7 +122,7 @@
return FALSE
if(!SSmapping.level_trait(T.z,ZTRAIT_STATION))
return FALSE
- if(!istype(T, /turf/open/floor))
+ if(!isfloorturf(T))
return FALSE
return TRUE
@@ -424,7 +424,7 @@ That prevents a few funky behaviors.
to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.")
card.AI = null
AI.battery = circuit.battery
- if(core_mmi.braintype == "Android")
+ if(core_mmi && core_mmi.braintype == "Android")
AI.posibrain_inside = TRUE
else
AI.posibrain_inside = FALSE
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 1c8e806277745..7dc12e780e685 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -57,8 +57,15 @@
icon_state = "down"
anchored = FALSE
resistance_flags = NONE
+ ///The item it spawns when it's folded up.
var/foldabletype = /obj/item/roller
+/obj/structure/bed/roller/Initialize(mapload)
+ . = ..()
+ AddElement( \
+ /datum/element/contextual_screentip_bare_hands, \
+ rmb_text = "Fold up", \
+ )
/obj/structure/bed/roller/examine(mob/user)
. = ..()
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 26c59f1237bab..bfda2e7fb0634 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -198,7 +198,7 @@ LINEN BINS
desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper."
icon_state = "sheetqm"
inhand_icon_state = "sheetqm"
- dream_messages = list("a grey ID", "a shuttle", "a crate", "a sloth", "the quartermaster")
+ dream_messages = list("authority", "a silvery ID", "a shuttle", "a crate", "a sloth", "the quartermaster")
/obj/item/bedsheet/chaplain
name = "chaplain's blanket"
@@ -479,12 +479,13 @@ LINEN BINS
icon_state = "random_bedsheet"
bedsheet_type = BEDSHEET_ABSTRACT
-/obj/item/bedsheet/dorms_double/Initialize()
+/obj/item/bedsheet/dorms_double/Initialize(mapload)
..()
var/type = pick_weight(list("Colors" = 80, "Special" = 20))
switch(type)
if("Colors")
- type = pick(list(/obj/item/bedsheet,
+ type = pick(list(
+ /obj/item/bedsheet/double,
/obj/item/bedsheet/blue/double,
/obj/item/bedsheet/green/double,
/obj/item/bedsheet/grey/double,
@@ -493,13 +494,16 @@ LINEN BINS
/obj/item/bedsheet/red/double,
/obj/item/bedsheet/yellow/double,
/obj/item/bedsheet/brown/double,
- /obj/item/bedsheet/black/double))
+ /obj/item/bedsheet/black/double,
+ ))
if("Special")
- type = pick(list(/obj/item/bedsheet/patriot/double,
+ type = pick(list(
+ /obj/item/bedsheet/patriot/double,
/obj/item/bedsheet/rainbow/double,
/obj/item/bedsheet/ian/double,
/obj/item/bedsheet/cosmos/double,
- /obj/item/bedsheet/nanotrasen/double))
+ /obj/item/bedsheet/nanotrasen/double,
+ ))
var/obj/item/bedsheet = new type(loc)
bedsheet.dir = dir
return INITIALIZE_HINT_QDEL
diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm
index 6b04ee50f88fb..d087423c96ce8 100644
--- a/code/game/objects/structures/cannons/cannon.dm
+++ b/code/game/objects/structures/cannons/cannon.dm
@@ -75,16 +75,17 @@
balloon_alert(user, "needs [reagents.maximum_volume]u of charge!")
return
visible_message(ignition_message)
- log_game("Cannon fired by [key_name(user)] in [AREACOORD(src)]")
+ user.log_message("fired a cannon", LOG_ATTACK)
+ log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]")
addtimer(CALLBACK(src, .proc/fire), fire_delay)
charge_ignited = TRUE
return
- else if(istype(used_item, /obj/item/reagent_containers))
+ else if(is_reagent_container(used_item))
var/obj/item/reagent_containers/powder_keg = used_item
if(!(powder_keg.reagent_flags & OPENCONTAINER))
return ..()
- if(istype(powder_keg, /obj/item/reagent_containers/glass/rag))
+ if(istype(powder_keg, /obj/item/reagent_containers/cup/rag))
return ..()
if(!powder_keg.reagents.total_volume)
diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm
index 1ae484598d0aa..c259ea0e76f17 100644
--- a/code/game/objects/structures/cannons/cannon_instructions.dm
+++ b/code/game/objects/structures/cannons/cannon_instructions.dm
@@ -1,7 +1,7 @@
/obj/item/paper/crumpled/muddy/fluff/cannon_instructions
name = "Mast of Cannon's Past's Cannon Instructions"
desc = "A quickly written note detailing the basics of firing a cannon. Who wrote this?"
- info = @{"
+ default_raw_text = @{"
Ye don't know how to load cannon, and ye call yerself a fearsome pirate? I think ye be more alike a space sailor under the space monarchy's flag! Alas, everyone must learn how to blast holes in enemy ships. And thus:
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 9a3ccb4992815..008d171fd7dd4 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -100,7 +100,7 @@
/obj/structure/closet/update_icon()
. = ..()
- if(istype(src, /obj/structure/closet/supplypod))
+ if(issupplypod(src))
return
layer = opened ? BELOW_OBJ_LAYER : OBJ_LAYER
@@ -220,6 +220,8 @@
var/turf/T = get_turf(src)
for(var/obj/structure/closet/closet in T)
if(closet != src && !closet.wall_mounted)
+ if(user)
+ balloon_alert(user, "another closet is in the way!")
return FALSE
for(var/mob/living/L in T)
if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
@@ -309,7 +311,7 @@
else if(istype(AM, /obj/structure/closet))
return FALSE
else if(isobj(AM))
- if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
+ if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs() || ismecha(AM))
return FALSE
else if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
return TRUE
@@ -408,7 +410,7 @@
user.visible_message(span_notice("[user] [welded ? "welds shut" : "unwelded"] \the [src]."),
span_notice("You [welded ? "weld" : "unwelded"] \the [src] with \the [W]."),
span_hear("You hear welding."))
- log_game("[key_name(user)] [welded ? "welded":"unwelded"] closet [src] with [W] at [AREACOORD(src)]")
+ user.log_message("[welded ? "welded":"unwelded"] closet [src] with [W]", LOG_GAME)
update_appearance()
else if (can_install_electronics && istype(W, /obj/item/electronics/airlock)\
&& !secure && !electronics && !locked && (welded || !can_weld_shut) && !broken)
@@ -458,7 +460,7 @@
var/item_is_id = W.GetID()
if(!item_is_id)
return FALSE
- if(item_is_id || !toggle(user))
+ if((item_is_id || !toggle(user)) && !opened)
togglelock(user)
else
return FALSE
@@ -538,9 +540,11 @@
if(user.body_position == LYING_DOWN && get_dist(src, user) > 0)
return
- if(!toggle(user))
- togglelock(user)
+ if(toggle(user))
+ return
+ if(!opened)
+ togglelock(user)
/obj/structure/closet/attack_paw(mob/user, list/modifiers)
return attack_hand(user, modifiers)
diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
index 0662a6847a9b6..e2c083a719750 100644
--- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
@@ -22,6 +22,20 @@
var/tagged = FALSE // so closet code knows to put the tag overlay back
can_install_electronics = FALSE
+/obj/structure/closet/body_bag/Initialize(mapload)
+ . = ..()
+ var/static/list/tool_behaviors = list(
+ TOOL_WIRECUTTER = list(
+ SCREENTIP_CONTEXT_RMB = "Remove Tag",
+ ),
+ )
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+ AddElement( \
+ /datum/element/contextual_screentip_bare_hands, \
+ rmb_text = "Fold up", \
+ )
+ AddElement(/datum/element/contextual_screentip_sharpness, lmb_text = "Remove Tag")
+
/obj/structure/closet/body_bag/Destroy()
// If we have a stored bag, and it's in nullspace (not in someone's hand), delete it.
if (foldedbag_instance && !foldedbag_instance.loc)
@@ -37,20 +51,19 @@
return
if(!user.canUseTopic(src, BE_CLOSE))
return
- if(t)
- name = "[initial(name)] - [t]"
- tagged = TRUE
- update_appearance()
- else
- name = initial(name)
+ handle_tag("[t ? t : initial(name)]")
return
if(!tagged)
return
if(interact_tool.tool_behaviour == TOOL_WIRECUTTER || interact_tool.get_sharpness())
to_chat(user, span_notice("You cut the tag off [src]."))
- name = "body bag"
- tagged = FALSE
- update_appearance()
+ handle_tag()
+
+///Handles renaming of the bodybag's examine tag.
+/obj/structure/closet/body_bag/proc/handle_tag(tag_name)
+ name = tag_name ? "[initial(name)] - [tag_name]" : initial(name)
+ tagged = !!tag_name
+ update_appearance()
/obj/structure/closet/body_bag/update_overlays()
. = ..()
@@ -86,7 +99,7 @@
to_chat(the_folder, span_warning("You wrestle with [src], but it won't fold while unzipped."))
return
for(var/content_thing in contents)
- if(istype(content_thing, /mob) || istype(content_thing, /obj))
+ if(istype(content_thing, /mob) || isobj(content_thing))
to_chat(the_folder, span_warning("There are too many things inside of [src] to fold it up!"))
return
// toto we made it!
@@ -295,7 +308,7 @@
user.visible_message(span_notice("[user] [sinched ? null : "un"]sinches [src]."),
span_notice("You [sinched ? null : "un"]sinch [src]."),
span_hear("You hear stretching followed by metal clicking from [src]."))
- log_game("[key_name(user)] [sinched ? "sinched":"unsinched"] secure environmental bag [src] at [AREACOORD(src)]")
+ user.log_message("[sinched ? "sinched":"unsinched"] secure environmental bag [src]", LOG_GAME)
update_appearance()
/obj/structure/closet/body_bag/environmental/prisoner/pressurized
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 2bdf003891786..5ad44de7b38e1 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -15,7 +15,7 @@
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/head/soft/black = 2,
/obj/item/clothing/shoes/sneakers/black = 2,
- /obj/item/reagent_containers/glass/rag = 2,
+ /obj/item/reagent_containers/cup/rag = 2,
/obj/item/storage/box/beanbag = 1,
/obj/item/clothing/suit/armor/vest/alt = 1,
/obj/item/circuitboard/machine/dish_drive = 1,
@@ -42,7 +42,7 @@
/obj/item/clothing/suit/toggle/chef = 1,
/obj/item/clothing/under/rank/civilian/chef = 1,
/obj/item/clothing/head/chefhat = 1,
- /obj/item/reagent_containers/glass/rag = 1)
+ /obj/item/reagent_containers/cup/rag = 1)
generate_items_inside(items_inside,src)
/obj/structure/closet/jcloset
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
index 0dc35bba83752..eabfae7ab1511 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
@@ -13,6 +13,6 @@
/obj/structure/closet/secure_closet/bar/PopulateContents()
..()
for(var/i in 1 to 10)
- new /obj/item/reagent_containers/food/drinks/bottle/beer( src )
+ new /obj/item/reagent_containers/cup/glass/bottle/beer( src )
new /obj/item/etherealballdeployer(src)
new /obj/item/roulette_wheel_beacon(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 6f80dec88c557..74803f708f677 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -45,9 +45,9 @@
/obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents()
..()
for(var/i in 1 to 3)
- new /obj/item/reagent_containers/food/condiment/flour(src)
- new /obj/item/reagent_containers/food/condiment/rice(src)
- new /obj/item/reagent_containers/food/condiment/sugar(src)
+ new /obj/item/reagent_containers/condiment/flour(src)
+ new /obj/item/reagent_containers/condiment/rice(src)
+ new /obj/item/reagent_containers/condiment/sugar(src)
/obj/structure/closet/secure_closet/freezer/kitchen/maintenance
name = "maintenance refrigerator"
@@ -57,8 +57,8 @@
/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/PopulateContents()
..()
for(var/i in 1 to 5)
- new /obj/item/reagent_containers/food/condiment/milk(src)
- new /obj/item/reagent_containers/food/condiment/soymilk(src)
+ new /obj/item/reagent_containers/condiment/milk(src)
+ new /obj/item/reagent_containers/condiment/soymilk(src)
for(var/i in 1 to 2)
new /obj/item/storage/fancy/egg_box(src)
@@ -84,7 +84,7 @@
/obj/structure/closet/secure_closet/freezer/gulag_fridge/PopulateContents()
..()
for(var/i in 1 to 3)
- new /obj/item/reagent_containers/food/drinks/bottle/beer/light(src)
+ new /obj/item/reagent_containers/cup/glass/bottle/beer/light(src)
/obj/structure/closet/secure_closet/freezer/fridge
name = "refrigerator"
@@ -93,8 +93,8 @@
/obj/structure/closet/secure_closet/freezer/fridge/PopulateContents()
..()
for(var/i in 1 to 5)
- new /obj/item/reagent_containers/food/condiment/milk(src)
- new /obj/item/reagent_containers/food/condiment/soymilk(src)
+ new /obj/item/reagent_containers/condiment/milk(src)
+ new /obj/item/reagent_containers/condiment/soymilk(src)
for(var/i in 1 to 2)
new /obj/item/storage/fancy/egg_box(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 5e4f32c444efd..c275c838eb423 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -7,14 +7,14 @@
/obj/structure/closet/secure_closet/medical1/PopulateContents()
..()
var/static/items_inside = list(
- /obj/item/reagent_containers/glass/beaker = 2,
+ /obj/item/reagent_containers/cup/beaker = 2,
/obj/item/reagent_containers/dropper = 2,
/obj/item/storage/belt/medical = 1,
/obj/item/storage/box/syringes = 1,
- /obj/item/reagent_containers/glass/bottle/toxin = 1,
- /obj/item/reagent_containers/glass/bottle/morphine = 2,
- /obj/item/reagent_containers/glass/bottle/epinephrine= 3,
- /obj/item/reagent_containers/glass/bottle/multiver = 3,
+ /obj/item/reagent_containers/cup/bottle/toxin = 1,
+ /obj/item/reagent_containers/cup/bottle/morphine = 2,
+ /obj/item/reagent_containers/cup/bottle/epinephrine= 3,
+ /obj/item/reagent_containers/cup/bottle/multiver = 3,
/obj/item/storage/box/rxglasses = 1)
generate_items_inside(items_inside,src)
@@ -119,7 +119,7 @@
new /obj/item/storage/box/medigels(src)
new /obj/item/ph_booklet(src)
new /obj/item/reagent_containers/dropper(src)
- new /obj/item/reagent_containers/glass/bottle/acidic_buffer(src) //hopefully they get the hint
+ new /obj/item/reagent_containers/cup/bottle/acidic_buffer(src) //hopefully they get the hint
/obj/structure/closet/secure_closet/chemical/heisenberg //contains one of each beaker, syringe etc.
name = "advanced chemical closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 36a24bb843c38..918b2eaf8ee62 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -44,9 +44,10 @@
//Sad trombone
if(pickednum == 1)
- var/obj/item/paper/P = new /obj/item/paper(src)
- P.name = "\improper IOU"
- P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!"
+ var/obj/item/paper/paper = new /obj/item/paper(src)
+ paper.name = "\improper IOU"
+ paper.add_raw_text("Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!")
+ paper.update_appearance()
//Iron (common ore)
if(pickednum >= 2)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 0da4df23fdcf2..45649010659bb 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -166,7 +166,7 @@
/obj/structure/closet/wardrobe/mixed/PopulateContents()
if(prob(40))
- new /obj/item/clothing/suit/jacket(src)
+ new /obj/item/clothing/suit/jacket/bomber(src)
new /obj/item/clothing/under/color/white(src)
new /obj/item/clothing/under/color/jumpskirt/white(src)
new /obj/item/clothing/under/color/blue(src)
diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm
index 4b68e9fce4c2f..1b7ebb89c935c 100644
--- a/code/game/objects/structures/crates_lockers/crates/bins.dm
+++ b/code/game/objects/structures/crates_lockers/crates/bins.dm
@@ -28,7 +28,7 @@
var/obj/item/storage/bag/trash/T = W
to_chat(user, span_notice("You fill the bag."))
for(var/obj/item/O in src)
- T.atom_storage?.attempt_insert(T, O, user, TRUE)
+ T.atom_storage?.attempt_insert(O, user, TRUE)
T.update_appearance()
do_animate()
return TRUE
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index 9819481c9d24d..fdf5d24a77264 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -28,7 +28,8 @@
if(W.tool_behaviour == TOOL_CROWBAR)
if(manifest)
tear_manifest(user)
-
+ if(!open(user))
+ return FALSE
user.visible_message(span_notice("[user] pries \the [src] open."), \
span_notice("You pry open \the [src]."), \
span_hear("You hear splitting wood."))
@@ -39,7 +40,6 @@
new material_drop(src)
for(var/atom/movable/AM in contents)
AM.forceMove(T)
-
qdel(src)
else
diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm
index d1d5cfddb5ec6..544662f9cc107 100644
--- a/code/game/objects/structures/crates_lockers/crates/wooden.dm
+++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm
@@ -16,7 +16,7 @@
/obj/structure/closet/crate/wooden/toy/PopulateContents()
. = ..()
new /obj/item/megaphone/clown(src)
- new /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter(src)
+ new /obj/item/reagent_containers/cup/soda_cans/canned_laughter(src)
new /obj/item/pneumatic_cannon/pie(src)
new /obj/item/food/pie/cream(src)
new /obj/item/storage/crayons(src)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 54c8ad2ab9750..3d0949151f92f 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -50,8 +50,8 @@
if(doorname)
. += span_notice("There is a small paper placard on the assembly labelled \"[doorname]\".")
-/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/pen))
+/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, params)
+ if(istype(W, /obj/item/pen) && !user.combat_mode)
var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, MAX_NAME_LEN)
if(!t)
return
@@ -264,6 +264,13 @@
door.electronics = electronics
door.heat_proof = heat_proof_finished
door.security_level = 0
+ if(electronics.shell)
+ door.AddComponent( \
+ /datum/component/shell, \
+ unremovable_circuit_components = list(new /obj/item/circuit_component/airlock, new /obj/item/circuit_component/airlock_access_event), \
+ capacity = SHELL_CAPACITY_LARGE, \
+ shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION|SHELL_FLAG_REQUIRE_ANCHOR \
+ )
if(electronics.one_access)
door.req_one_access = electronics.accesses
else
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 15a9ce855579f..a5e9104382ce9 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -131,7 +131,7 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths)
. = ..()
if(.)
return
- if(!can_harvest(user) || !harvest_with_hands)
+ if(!can_harvest(user))
return
user.visible_message(span_notice("[user] starts to [harvest_verb] [src]..."),
@@ -182,7 +182,7 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths)
* Returns: TRUE if they can harvest, FALSE if not. Null if it's not harvestable at all.
*/
/obj/structure/flora/proc/can_harvest(mob/user, obj/item/harvesting_item)
- . = FALSE
+
if(harvested || !harvestable)
return null
@@ -199,6 +199,13 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths)
//Check to see if stone flora is being attacked by a mining item (same reason as above)
if((flora_flags & FLORA_STONE) && (harvesting_item.tool_behaviour == TOOL_MINING))
return TRUE
+ //We checked all item interactions and could not harvest, lets return
+ return FALSE
+
+ //If there was no harvesting item supplied, check if it is hand harvestable
+ if(harvest_with_hands)
+ return TRUE
+
return FALSE
/*
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 1d20dcdeb07a3..7a6a2a5991354 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -55,7 +55,7 @@
qdel(src)
return
- else if(istype(W, /obj/item/stack))
+ else if(isstack(W))
if(iswallturf(loc) || (locate(/obj/structure/falsewall) in src.loc.contents))
balloon_alert(user, "wall already present!")
return
@@ -358,7 +358,7 @@
/obj/structure/girder/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
- if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile))
+ if((mover.pass_flags & PASSGRILLE) || isprojectile(mover))
return prob(girderpasschance)
/obj/structure/girder/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index abc8c89277d11..5553f1d055cd1 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -163,7 +163,7 @@
/obj/structure/grille/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
- if(!. && istype(mover, /obj/projectile))
+ if(!. && isprojectile(mover))
return prob(30)
/obj/structure/grille/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE)
@@ -180,12 +180,13 @@
return TOOL_ACT_TOOLTYPE_SUCCESS
/obj/structure/grille/screwdriver_act(mob/living/user, obj/item/tool)
- if(!isturf(loc) || !anchored)
+ if(!isturf(loc))
return FALSE
add_fingerprint(user)
if(shock(user, 90))
return FALSE
- tool.play_tool_sound(src, 100)
+ if(!tool.use_tool(src, user, 0, volume=100))
+ return FALSE
set_anchored(!anchored)
user.visible_message(span_notice("[user] [anchored ? "fastens" : "unfastens"] [src]."), \
span_notice("You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor."))
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index 08ab8a00cc811..86596d6b9efea 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -203,7 +203,7 @@
to_chat(usr, span_warning("[src] needs to be wrenched to the floor!"))
return FALSE
- if (!istype(M, /mob/living/carbon/human))
+ if (!ishuman(M))
to_chat(usr, span_warning("It doesn't look like [M.p_they()] can fit into this properly!"))
return FALSE // Can't decapitate non-humans
@@ -214,10 +214,10 @@
return ..(M, user, check_loc = FALSE) //check_loc = FALSE to allow moving people in from adjacent turfs
/obj/structure/guillotine/post_buckle_mob(mob/living/M)
- if (!istype(M, /mob/living/carbon/human))
+ if (!ishuman(M))
return
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "dying", /datum/mood_event/deaths_door)
+ M.add_mood_event("dying", /datum/mood_event/deaths_door)
var/mob/living/carbon/human/H = M
if (H.dna)
@@ -242,7 +242,7 @@
M.regenerate_icons()
M.pixel_y -= -GUILLOTINE_HEAD_OFFSET // Move their body back
M.layer -= GUILLOTINE_LAYER_DIFF
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "dying")
+ M.clear_mood_event("dying")
..()
/obj/structure/guillotine/can_be_unfasten_wrench(mob/user, silent)
diff --git a/code/game/objects/structures/gym.dm b/code/game/objects/structures/gym.dm
index 11e9e40482a7e..58ae81b14f031 100644
--- a/code/game/objects/structures/gym.dm
+++ b/code/game/objects/structures/gym.dm
@@ -17,7 +17,7 @@
playsound(loc, pick(hit_sounds), 25, TRUE, -1)
if(isliving(user))
var/mob/living/L = user
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise)
+ L.add_mood_event("exercise", /datum/mood_event/exercise)
L.apply_status_effect(/datum/status_effect/exercised)
/obj/structure/weightmachine
@@ -64,7 +64,7 @@
update_appearance()
user.pixel_y = user.base_pixel_y
var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise)
+ user.add_mood_event("exercise", /datum/mood_event/exercise)
to_chat(user, finishmessage)
user.apply_status_effect(/datum/status_effect/exercised)
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index 758e55d7020ea..d1c28b4834b1b 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -141,7 +141,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(2)
new /obj/item/clothing/glasses/godeye(loc)
if(3)
- new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
+ new /obj/item/reagent_containers/cup/bottle/potion/flight(loc)
if(4)
new /obj/item/organ/internal/heart/cursed/wizard(loc)
if(5)
@@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(16)
new /obj/item/seeds/gatfruit(loc)
if(17)
- new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
+ new /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola(loc)
if(18)
new /obj/item/soulstone/anybody(loc)
if(19)
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index c737d7f414397..b24df6bfea2a2 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -9,8 +9,8 @@
var/obj/structure/ladder/down //the ladder below this one
var/obj/structure/ladder/up //the ladder above this one
var/crafted = FALSE
- /// Optional travel time for ladder in deciseconds
- var/travel_time = 0
+ /// travel time for ladder in deciseconds
+ var/travel_time = 1 SECONDS
/obj/structure/ladder/Initialize(mapload, obj/structure/ladder/up, obj/structure/ladder/down)
..()
@@ -23,8 +23,22 @@
src.down = down
down.up = src
down.update_appearance()
+
+ register_context()
+
return INITIALIZE_HINT_LATELOAD
+/obj/structure/ladder/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ if(up)
+ context[SCREENTIP_CONTEXT_LMB] = "Climb up"
+ if(down)
+ context[SCREENTIP_CONTEXT_RMB] = "Climb down"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/structure/ladder/examine(mob/user)
+ . = ..()
+ . += span_info("Left-click it to start moving up; Right-click to start moving down.")
+
/obj/structure/ladder/Destroy(force)
GLOB.ladders -= src
disconnect()
@@ -70,50 +84,89 @@
visible_message(span_danger("[src] is torn to pieces by the gravitational pull!"))
qdel(src)
-/obj/structure/ladder/proc/travel(going_up, mob/user, is_ghost, obj/structure/ladder/ladder)
+/obj/structure/ladder/proc/use(mob/user, going_up = TRUE)
+ if(!in_range(src, user) || DOING_INTERACTION(user, DOAFTER_SOURCE_CLIMBING_LADDER))
+ return
+
+ if(!up && !down)
+ balloon_alert(user, "doesn't lead anywhere!")
+ return
+ if(going_up ? !up : !down)
+ balloon_alert(user, "can't go any further [going_up ? "up" : "down"]")
+ return
+ if(travel_time)
+ INVOKE_ASYNC(src, .proc/start_travelling, user, going_up)
+ else
+ travel(user, going_up)
+ add_fingerprint(user)
+
+/obj/structure/ladder/proc/start_travelling(mob/user, going_up)
+ show_initial_fluff_message(user, going_up)
+ if(do_after(user, travel_time, target = src, interaction_key = DOAFTER_SOURCE_CLIMBING_LADDER))
+ travel(user, going_up)
+
+/// The message shown when the player starts climbing the ladder
+/obj/structure/ladder/proc/show_initial_fluff_message(mob/user, going_up)
+ var/up_down = going_up ? "up" : "down"
+ user.balloon_alert_to_viewers("climbing [up_down]...")
+
+/obj/structure/ladder/proc/travel(mob/user, going_up = TRUE, is_ghost = FALSE)
+ var/obj/structure/ladder/ladder = going_up ? up : down
+ if(!ladder)
+ balloon_alert(user, "there's nothing that way!")
+ return
var/response = SEND_SIGNAL(user, COMSIG_LADDER_TRAVEL, src, ladder, going_up)
if(response & LADDER_TRAVEL_BLOCK)
return
- if(!is_ghost)
- ladder.add_fingerprint(user)
- if(!do_after(user, travel_time, target = src))
- return
- show_fluff_message(going_up, user)
-
var/turf/target = get_turf(ladder)
user.zMove(target = target, z_move_flags = ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED|ZMOVE_INCLUDE_PULLED)
- ladder.use(user) //reopening ladder radial menu ahead
-/obj/structure/ladder/proc/use(mob/user, is_ghost=FALSE)
- if (!is_ghost && !in_range(src, user))
- return
+ if(!is_ghost)
+ show_final_fluff_message(user, ladder, going_up)
+ // to avoid having players hunt for the pixels of a ladder that goes through several stories and is
+ // partially covered by the sprites of their mobs, a radial menu will be displayed over them.
+ // this way players can keep climbing up or down with ease until they reach an end.
+ if(ladder.up && ladder.down)
+ ladder.show_options(user, is_ghost)
+
+/// The messages shown after the player has finished climbing. Players can see this happen from either src or the destination so we've 2 POVs here
+/obj/structure/ladder/proc/show_final_fluff_message(mob/user, obj/structure/ladder/destination, going_up)
+ var/up_down = going_up ? "up" : "down"
+
+ //POV of players around the source
+ visible_message(span_notice("[user] climbs [up_down] [src]."))
+ //POV of players around the destination
+ user.balloon_alert_to_viewers("climbed [up_down]")
+
+/// Shows a radial menu that players can use to climb up and down a stair.
+/obj/structure/ladder/proc/show_options(mob/user, is_ghost = FALSE)
var/list/tool_list = list()
- if (up)
- tool_list["Up"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH)
- if (down)
- tool_list["Down"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH)
- if (!length(tool_list))
- to_chat(user, span_warning("[src] doesn't seem to lead anywhere!"))
- return
+ tool_list["Up"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH)
+ tool_list["Down"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH)
+
+ var/datum/callback/check_menu
+ if(!is_ghost)
+ check_menu = CALLBACK(src, .proc/check_menu, user)
+ var/result = show_radial_menu(user, src, tool_list, custom_check = check_menu, require_near = !is_ghost, tooltips = TRUE)
- var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user, is_ghost), require_near = !is_ghost, tooltips = TRUE)
- if (!is_ghost && !in_range(src, user))
- return // nice try
+ var/going_up
switch(result)
if("Up")
- travel(TRUE, user, is_ghost, up)
+ going_up = TRUE
if("Down")
- travel(FALSE, user, is_ghost, down)
+ going_up = FALSE
if("Cancel")
return
- if(!is_ghost)
- add_fingerprint(user)
+ if(is_ghost || !travel_time)
+ travel(user, going_up, is_ghost)
+ else
+ INVOKE_ASYNC(src, .proc/start_travelling, user, going_up)
/obj/structure/ladder/proc/check_menu(mob/user, is_ghost)
- if(user.incapacitated() || (!user.Adjacent(src) && !is_ghost))
+ if(user.incapacitated() || (!user.Adjacent(src)))
return FALSE
return TRUE
@@ -123,39 +176,101 @@
return
use(user)
+/obj/structure/ladder/attack_hand_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+//Not be called when right clicking as a monkey. attack_hand_secondary() handles that.
/obj/structure/ladder/attack_paw(mob/user, list/modifiers)
- return use(user)
+ use(user)
+ return TRUE
/obj/structure/ladder/attack_alien(mob/user, list/modifiers)
- return use(user)
+ use(user)
+ return TRUE
+
+/obj/structure/ladder/attack_alien_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/structure/ladder/attack_larva(mob/user)
- return use(user)
+/obj/structure/ladder/attack_larva(mob/user, list/modifiers)
+ use(user)
+ return TRUE
-/obj/structure/ladder/attack_animal(mob/user)
- return use(user)
+/obj/structure/ladder/attack_larva_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/structure/ladder/attack_slime(mob/user)
- return use(user)
+/obj/structure/ladder/attack_animal(mob/user, list/modifiers)
+ use(user)
+ return TRUE
-/obj/structure/ladder/attackby(obj/item/W, mob/user, params)
- return use(user)
+/obj/structure/ladder/attack_animal_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/structure/ladder/attack_robot(mob/living/silicon/robot/R)
- if(R.Adjacent(src))
- return use(R)
+/obj/structure/ladder/attack_slime(mob/user, list/modifiers)
+ use(user)
+ return TRUE
+
+/obj/structure/ladder/attack_slime_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/structure/ladder/attackby(obj/item/item, mob/user, params)
+ use(user)
+ return TRUE
+
+/obj/structure/ladder/attackby_secondary(obj/item/item, mob/user, params)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/structure/ladder/attack_robot(mob/living/silicon/robot/user)
+ if(user.Adjacent(src))
+ use(user)
+ return TRUE
+
+/obj/structure/ladder/attack_robot_secondary(mob/living/silicon/robot/user)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || !user.Adjacent(src))
+ return SECONDARY_ATTACK_CONTINUE_CHAIN
+ use(user, going_up = FALSE)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/structure/ladder/attack_ghost(mob/dead/observer/user)
- use(user, TRUE)
+ ghost_use(user)
return ..()
-/obj/structure/ladder/proc/show_fluff_message(going_up, mob/user)
- if(going_up)
- user.visible_message(span_notice("[user] climbs up [src]."), span_notice("You climb up [src]."))
- else
- user.visible_message(span_notice("[user] climbs down [src]."), span_notice("You climb down [src]."))
-
+///Ghosts use the byond default popup menu function on right click, so this is going to work a little differently for them.
+/obj/structure/ladder/proc/ghost_use(mob/user)
+ if (!up && !down)
+ balloon_alert(user, "doesn't lead anywhere!")
+ return
+ if(!up) //only goes down
+ travel(user, going_up = FALSE, is_ghost = TRUE)
+ else if(!down) //only goes up
+ travel(user, going_up = TRUE, is_ghost = TRUE)
+ else //goes both ways
+ show_options(user, is_ghost = TRUE)
// Indestructible away mission ladders which link based on a mapped ID and height value rather than X/Y/Z.
/obj/structure/ladder/unbreakable
diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm
index 68d86eb44e5d7..6205d49326d0e 100644
--- a/code/game/objects/structures/lavaland/geyser.dm
+++ b/code/game/objects/structures/lavaland/geyser.dm
@@ -10,16 +10,12 @@
///set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
var/erupting_state = null
- //whether we are active and generating chems
- var/activated = FALSE
///what chem do we produce?
var/reagent_id = /datum/reagent/fuel/oil
///how much reagents we add every process (2 seconds)
var/potency = 2
///maximum volume
var/max_volume = 500
- ///how much we start with after getting activated
- var/start_volume = 50
///Have we been discovered with a mining scanner?
var/discovered = FALSE
@@ -35,12 +31,11 @@
AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC, 1, 5)
-///start producing chems, should be called just once
-/obj/structure/geyser/proc/start_chemming()
- activated = TRUE
create_reagents(max_volume, DRAINABLE)
- reagents.add_reagent(reagent_id, start_volume)
- START_PROCESSING(SSplumbing, src) //It's main function is to be plumbed, so use SSplumbing
+ reagents.add_reagent(reagent_id, max_volume)
+
+ RegisterSignal(src, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), .proc/start_chemming)
+
if(erupting_state)
icon_state = erupting_state
else
@@ -48,21 +43,21 @@
I.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(I)
-/obj/structure/geyser/process()
- if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive
- reagents.add_reagent(reagent_id, potency)
-/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced)
- if(!_reinforced)
- to_chat(user, span_warning("The [P.name] isn't strong enough!"))
- return
- if(activated)
- to_chat(user, span_warning("The [name] is already active!"))
- return
+///start making those CHHHHHEEEEEEMS. Called whenever chems are removed, it's fine because START_PROCESSING checks if we arent already processing
+/obj/structure/geyser/proc/start_chemming()
+ START_PROCESSING(SSplumbing, src) //It's main function is to be plumbed, so use SSplumbing
+
+///We're full so stop processing
+/obj/structure/geyser/proc/stop_chemming()
+ STOP_PROCESSING(SSplumbing, src)
- to_chat(user, span_notice("You start vigorously plunging [src]!"))
- if(do_after(user, 50 * P.plunge_mod, target = src) && !activated)
- start_chemming()
+///Add reagents until we are full
+/obj/structure/geyser/process()
+ if(reagents.total_volume <= reagents.maximum_volume)
+ reagents.add_reagent(reagent_id, potency)
+ else
+ stop_chemming() //we're full
/obj/structure/geyser/attackby(obj/item/item, mob/user, params)
if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner))
diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm
index 43d84b93ac4a6..f211ace452a2e 100644
--- a/code/game/objects/structures/lavaland/necropolis_tendril.dm
+++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm
@@ -41,9 +41,13 @@ GLOBAL_LIST_INIT(tendrils, list())
/obj/structure/spawner/lavaland/deconstruct(disassembled)
new /obj/effect/collapse(loc)
- new /obj/structure/closet/crate/necropolis/tendril(loc)
return ..()
+/obj/structure/spawner/lavaland/examine(mob/user)
+ var/list/examine_messages = ..()
+ examine_messages += span_notice("Once this thing gets hurts enough, it triggers a violent final retaliation.")
+ examine_messages += span_notice("You'll only have a few moments to run up, grab some loot with an open hand, and get out with it.")
+ return examine_messages
/obj/structure/spawner/lavaland/Destroy()
var/last_tendril = TRUE
@@ -69,26 +73,60 @@ GLOBAL_LIST_INIT(tendrils, list())
/obj/effect/collapse
name = "collapsing necropolis tendril"
- desc = "Get clear!"
+ desc = "Get your loot and get clear!"
layer = TABLE_LAYER
icon = 'icons/mob/nest.dmi'
icon_state = "tendril"
anchored = TRUE
density = TRUE
+ /// weakref list of which mobs have gotten their loot from this effect.
+ var/list/collected = list()
+ /// a bit of light as to make less unfair deaths from the chasm
var/obj/effect/light_emitter/tendril/emitted_light
/obj/effect/collapse/Initialize(mapload)
. = ..()
emitted_light = new(loc)
visible_message(span_boldannounce("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!"))
- visible_message(span_warning("Something falls free of the tendril!"))
+ balloon_alert_to_viewers("interact to grab loot before collapse!", vision_distance = 7)
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE)
addtimer(CALLBACK(src, .proc/collapse), 50)
+/obj/effect/collapse/examine(mob/user)
+ var/list/examine_messages = ..()
+ if(isliving(user))
+ if(has_collected(user))
+ examine_messages += span_boldnotice("You've grabbed what you can, now get out!")
+ else
+ examine_messages += span_boldnotice("You might have some time to grab some goodies with an open hand before it collapses!")
+ return examine_messages
+
+/obj/effect/collapse/attack_hand(mob/living/collector, list/modifiers)
+ . = ..()
+ if(has_collected(collector))
+ to_chat(collector, span_danger("You've already gotten some loot, just get out of there with it!"))
+ return
+ visible_message(span_warning("Something falls free of the tendril!"))
+ var/obj/structure/closet/crate/necropolis/tendril/loot = new /obj/structure/closet/crate/necropolis/tendril(loc)
+ collector.start_pulling(loot)
+ collected += WEAKREF(collector)
+
/obj/effect/collapse/Destroy()
+ QDEL_NULL(collected)
QDEL_NULL(emitted_light)
return ..()
+///Helper proc that resolves weakrefs to determine if collector is in collected list, returning a boolean.
+/obj/effect/collapse/proc/has_collected(mob/collector)
+ for(var/datum/weakref/weakref as anything in collected)
+ var/mob/living/resolved = weakref.resolve()
+ //it could have been collector, it could not have been, we don't care
+ if(!resolved)
+ continue
+ if(resolved == collector)
+ return TRUE
+ return FALSE
+
/obj/effect/collapse/proc/collapse()
for(var/mob/M in range(7,src))
shake_camera(M, 15, 1)
diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm
index 988203a7eebdd..2ce45d8f01899 100644
--- a/code/game/objects/structures/life_candle.dm
+++ b/code/game/objects/structures/life_candle.dm
@@ -24,7 +24,7 @@
var/respawn_time = 50
var/respawn_sound = 'sound/magic/staff_animation.ogg'
-/obj/structure/life_candle/ComponentInitialize()
+/obj/structure/life_candle/Initialize(mapload)
. = ..()
AddElement(/datum/element/movetype_handler)
diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm
index 0318ea568df7f..8f853291a7697 100644
--- a/code/game/objects/structures/maintenance.dm
+++ b/code/game/objects/structures/maintenance.dm
@@ -93,7 +93,7 @@ at the cost of risking a vicious bite.**/
if(iscyborg(user) || isalien(user) || !CanReachInside(user))
return ..()
add_fingerprint(user)
- if(istype(I, /obj/item/reagent_containers))
+ if(is_reagent_container(I))
if(istype(I, /obj/item/food/monkeycube))
var/obj/item/food/monkeycube/cube = I
cube.Expand()
@@ -218,7 +218,7 @@ at the cost of risking a vicious bite.**/
visible_message(span_danger("[src] emits a flash of light and creates... pants?"))
for(var/mob/living/viewing_mob in viewers(7, src))
viewing_mob.flash_act()
- var/obj/item/clothing/under/pants/altar/pants = new(get_turf(src))
+ var/obj/item/clothing/under/pants/slacks/altar/pants = new(get_turf(src))
pants.add_atom_colour(pants_color, ADMIN_COLOUR_PRIORITY)
COOLDOWN_START(src, use_cooldown, use_cooldown_duration)
addtimer(CALLBACK(src, /atom.proc/update_icon), 1 MINUTES + 0.1 SECONDS)
@@ -231,10 +231,11 @@ at the cost of risking a vicious bite.**/
return FALSE
return TRUE
-/obj/item/clothing/under/pants/altar
+/obj/item/clothing/under/pants/slacks/altar
name = "strange pants"
- desc = "A pair of pants. They do not look natural. They smell like fresh blood."
- icon_state = "whitepants"
+ desc = "A pair of pants. They do not look or feel natural, and smell like fresh blood."
+ greyscale_colors = "#ffffff#ffffff#ffffff"
+ flags_1 = NONE //If IS_PLAYER_COLORABLE gets added color-changing support (i.e. spraycans), these won't end up getting it too. Plus, it already has its own recolor.
#undef ALTAR_INACTIVE
#undef ALTAR_STAGEONE
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 35fad6d07e01e..c1d82f868f52c 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -233,9 +233,6 @@
max_integrity = 300
light_range = 2
-/obj/structure/mineral_door/uranium/ComponentInitialize()
- return
-
/obj/structure/mineral_door/sandstone
name = "sandstone door"
icon_state = "sandstone"
@@ -332,9 +329,6 @@
return ..()
-/obj/structure/mineral_door/paperframe/ComponentInitialize()
- return
-
/obj/structure/mineral_door/paperframe/Destroy()
if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH_NEIGHBORS(src)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index f1452e0364852..b6cefb8eb2c68 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -49,7 +49,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
hairdresser.hairstyle = new_style
- hairdresser.update_hair(is_creating = TRUE)
+ hairdresser.update_body_parts()
/obj/structure/mirror/examine_status(mob/user)
if(broken)
@@ -203,9 +203,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
to_chat(amazed_human, span_notice("Invalid color. Your color is not bright enough."))
return TRUE
- amazed_human.update_body()
- amazed_human.update_hair()
- amazed_human.update_body_parts()
+ amazed_human.update_body(is_creating = TRUE)
amazed_human.update_mutations_overlay() // no hulk lizard
if("gender")
@@ -252,7 +250,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
if(new_face_color)
amazed_human.facial_hair_color = sanitize_hexcolor(new_face_color)
amazed_human.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK)
- amazed_human.update_hair()
+ amazed_human.update_body_parts()
if(BODY_ZONE_PRECISE_EYES)
var/new_eye_color = input(amazed_human, "Choose your eye color", "Eye Color", amazed_human.eye_color_left) as color|null
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 7365ac7779d8a..a6689ad4e4e78 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -212,7 +212,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/item/paper/guides/jobs/medical/morgue
name = "morgue memo"
- info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.
Red lights mean there's a plain ol' dead body inside.
Yellow lights mean there's non-body objects inside.
Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.
Green lights mean the morgue system detects the body may be able to be brought back to life.
I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.
- CentCom medical inspector"
+ default_raw_text = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.
Red lights mean there's a plain ol' dead body inside.
Yellow lights mean there's non-body objects inside.
Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.
Green lights mean the morgue system detects the body may be able to be brought back to life.
I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.
- CentCom medical inspector"
/*
* Crematorium
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 1b4ecabe8a730..d530d4f27091f 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -14,7 +14,7 @@
var/framebuildstackamount = 5
var/buildstacktype = /obj/item/stack/sheet/iron
var/buildstackamount = 0
- var/list/allowed_projectile_typecache = list(/obj/projectile/beam)
+ var/list/allowed_projectile_typecache = list(/obj/projectile/beam, /obj/projectile/energy/nuclear_particle)
var/rotation_angle = -1
/obj/structure/reflector/Initialize(mapload)
diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm
index 12d6182b27473..c87d074549915 100644
--- a/code/game/objects/structures/shower.dm
+++ b/code/game/objects/structures/shower.dm
@@ -177,7 +177,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16))
if(SHOWER_BOILING)
current_temperature = SHOWER_NORMAL
user.visible_message(span_notice("[user] adjusts the shower with \the [I]."), span_notice("You adjust the shower with \the [I] to [current_temperature] temperature."))
- user.log_message("has wrenched a shower at [AREACOORD(src)] to [current_temperature].", LOG_ATTACK)
+ user.log_message("has wrenched a shower to [current_temperature].", LOG_ATTACK)
add_hiddenprint(user)
handle_mist()
return TRUE
@@ -238,10 +238,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16))
/obj/machinery/shower/proc/wash_atom(atom/target)
target.wash(CLEAN_RAD | CLEAN_WASH)
- SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower)
reagents.expose(target, (TOUCH), SHOWER_EXPOSURE_MULTIPLIER * SHOWER_SPRAY_VOLUME / max(reagents.total_volume, SHOWER_SPRAY_VOLUME))
if(isliving(target))
- check_heat(target)
+ var/mob/living/living_target = target
+ check_heat(living_target)
+ living_target.add_mood_event("shower", /datum/mood_event/nice_shower)
/**
* Toggle whether shower is actually on and outputting water.
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 1549687f1ce81..93b07c44e89d5 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -13,7 +13,7 @@
name = "table frame"
desc = "Four metal legs with four framing rods for a table. You could easily pass through this."
icon = 'icons/obj/structures.dmi'
- icon_state = "nu_table_frame"
+ icon_state = "table_frame"
density = FALSE
anchored = FALSE
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
@@ -90,13 +90,13 @@
/obj/structure/table_frame/wood
name = "wooden table frame"
desc = "Four wooden legs with four framing wooden rods for a wooden table. You could easily pass through this."
- icon_state = "nu_wood_frame"
+ icon_state = "wood_frame"
framestack = /obj/item/stack/sheet/mineral/wood
framestackamount = 2
resistance_flags = FLAMMABLE
/obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/stack))
+ if (isstack(I))
var/obj/item/stack/material = I
var/toConstruct // stores the table variant
var/carpet_type // stores the carpet type used for construction in case of poker tables
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index dd66862ece974..816d298c20f8c 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -164,7 +164,7 @@
pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [src]!"), \
span_userdanger("[user] slams you onto \the [src]!"))
log_combat(user, pushed_mob, "tabled", null, "onto [src]")
- SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
+ pushed_mob.add_mood_event("table", /datum/mood_event/table)
/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
pushed_mob.Knockdown(30)
@@ -178,10 +178,10 @@
if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user))
deconstruct(FALSE)
playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE)
- pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!"),
- span_userdanger("[user] smashes your [banged_limb.name] against \the [src]"))
+ pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [src]!"),
+ span_userdanger("[user] smashes your [banged_limb.plaintext_zone] against \the [src]"))
log_combat(user, pushed_mob, "head slammed", null, "against [src]")
- SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_limbsmash, banged_limb)
+ pushed_mob.add_mood_event("table", /datum/mood_event/table_limbsmash, banged_limb)
/obj/structure/table/screwdriver_act_secondary(mob/living/user, obj/item/tool)
if(flags_1 & NODECONSTRUCT_1 || !deconstruction_ready)
@@ -681,7 +681,7 @@
buckle_lying = NO_BUCKLE_LYING
buckle_requires_restraints = TRUE
custom_materials = list(/datum/material/silver = 2000)
- var/mob/living/carbon/human/patient = null
+ var/mob/living/carbon/patient = null
var/obj/machinery/computer/operating/computer = null
/obj/structure/table/optable/Initialize(mapload)
@@ -691,44 +691,57 @@
if(computer)
computer.table = src
break
+ RegisterSignal(loc, COMSIG_ATOM_ENTERED, .proc/mark_patient)
+ RegisterSignal(loc, COMSIG_ATOM_EXITED, .proc/unmark_patient)
/obj/structure/table/optable/Destroy()
- . = ..()
if(computer && computer.table == src)
computer.table = null
+ patient = null
+ UnregisterSignal(loc, COMSIG_ATOM_ENTERED)
+ UnregisterSignal(loc, COMSIG_ATOM_EXITED)
+ return ..()
/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob)
pushed_mob.forceMove(loc)
pushed_mob.set_resting(TRUE, TRUE)
visible_message(span_notice("[user] lays [pushed_mob] on [src]."))
- get_patient()
-
-/obj/structure/table/optable/proc/get_patient()
- var/mob/living/carbon/M = locate(/mob/living/carbon) in loc
- if(M)
- if(M.resting)
- set_patient(M)
- else
- set_patient(null)
-/obj/structure/table/optable/proc/set_patient(new_patient)
- if(patient)
- UnregisterSignal(patient, COMSIG_PARENT_QDELETING)
- patient = new_patient
- if(patient)
- RegisterSignal(patient, COMSIG_PARENT_QDELETING, .proc/patient_deleted)
+/// Any mob that enters our tile will be marked as a potential patient. They will be turned into a patient if they lie down.
+/obj/structure/table/optable/proc/mark_patient(datum/source, mob/living/carbon/potential_patient)
+ SIGNAL_HANDLER
+ if(!istype(potential_patient))
+ return
+ RegisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION, .proc/recheck_patient)
+ recheck_patient(potential_patient) // In case the mob is already lying down before they entered.
-/obj/structure/table/optable/proc/patient_deleted(datum/source)
+/// Unmark the potential patient.
+/obj/structure/table/optable/proc/unmark_patient(datum/source, mob/living/carbon/potential_patient)
+ SIGNAL_HANDLER
+ if(!istype(potential_patient))
+ return
+ if(potential_patient == patient)
+ recheck_patient(patient) // Can just set patient to null, but doing the recheck lets us find a replacement patient.
+ UnregisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION)
+
+/// Someone on our tile just lied down, got up, moved in, or moved out.
+/// potential_patient is the mob that had one of those four things change.
+/// The check is a bit broad so we can find a replacement patient.
+/obj/structure/table/optable/proc/recheck_patient(mob/living/carbon/potential_patient)
SIGNAL_HANDLER
- set_patient(null)
+ if(patient && patient != potential_patient)
+ return
-/obj/structure/table/optable/proc/check_eligible_patient()
- get_patient()
- if(!patient)
- return FALSE
- if(ishuman(patient))
- return TRUE
- return FALSE
+ if(potential_patient.body_position == LYING_DOWN && potential_patient.loc == loc)
+ patient = potential_patient
+ return
+
+ // Find another lying mob as a replacement.
+ for (var/mob/living/carbon/replacement_patient in loc.contents)
+ if(replacement_patient.body_position == LYING_DOWN)
+ patient = replacement_patient
+ return
+ patient = null
/*
* Racks
@@ -757,7 +770,7 @@
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
. = ..()
- if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
+ if ((!( isitem(O) ) || user.get_active_held_item() != O))
return
if(!user.dropItemToGround(O))
return
diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm
index c487c373ef965..0c21f500cf492 100644
--- a/code/game/objects/structures/toiletbong.dm
+++ b/code/game/objects/structures/toiletbong.dm
@@ -9,7 +9,7 @@
var/smokeradius = 1
var/mutable_appearance/weed_overlay
-/obj/structure/toiletbong/Initialize()
+/obj/structure/toiletbong/Initialize(mapload)
. = ..()
create_storage()
atom_storage.attack_hand_interact = FALSE
diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm
index b8cae3902234d..e8e3c6cfece42 100644
--- a/code/game/objects/structures/votingbox.dm
+++ b/code/game/objects/structures/votingbox.dm
@@ -116,9 +116,13 @@
voted += voter_card
to_chat(user,span_notice("You cast your vote."))
-/obj/structure/votebox/proc/valid_vote(obj/item/paper/I)
- if(I.get_info_length() > VOTE_TEXT_LIMIT || findtext(I.info,"Voting Results:
"))
+/obj/structure/votebox/proc/valid_vote(obj/item/paper/voting_slip)
+ if(voting_slip.get_total_length() > VOTE_TEXT_LIMIT)
return FALSE
+
+ for(var/datum/paper_input/text as anything in voting_slip.raw_text_inputs)
+ if(findtext(text.raw_text, "Voting Results:
"))
+ return FALSE
return TRUE
/obj/structure/votebox/proc/shred(mob/user)
@@ -163,21 +167,26 @@
/obj/structure/votebox/proc/print_tally(mob/user)
var/list/results = list()
var/i = 0
- for(var/obj/item/paper/P in contents)
+ for(var/obj/item/paper/paper_content in contents)
if(i++ > MAX_VOTES)
break
- var/text = P.info
- if(!valid_vote(P))
+ if(!valid_vote(paper_content))
continue
- if(!results[text])
- results[text] = 1
+
+ var/full_vote_text = ""
+ for(var/datum/paper_input/text as anything in paper_content.raw_text_inputs)
+ full_vote_text += "[text.raw_text]
"
+
+ if(!results[full_vote_text])
+ results[full_vote_text] = 1
else
- results[text] += 1
+ results[full_vote_text] += 1
+
sortTim(results, cmp=/proc/cmp_numeric_dsc, associative = TRUE)
if(!COOLDOWN_FINISHED(src, vote_print_cooldown))
return
COOLDOWN_START(src, vote_print_cooldown, 60 SECONDS)
- var/obj/item/paper/P = new(drop_location())
+ var/obj/item/paper/vote_tally_paper = new(drop_location())
var/list/tally = list()
tally += {"