The bar layout for the station is very old. We've decided to give it a facelift after our partnership with IKEA Intergalactic?.
We added some sweet retro arcade machines and much more seating area. We removed the stage since it hasn't ever been used.
You can run this place like a restaurant now that you have tables. Go whip up a menu with the Chef. You have a condiments table and your Requests Console has been moved so a noticeboard can be placed there. Take tickets from customers and pin them on the noticeboard for the Chef.
"
t += " Launch"
t += " Pull"
@@ -132,6 +132,16 @@
if(!new_name)
return
pad.display_name = new_name
+
+ if(href_list["setx"])
+ var/newx = input(usr, "Input new x offset", pad.display_name, pad.x_offset) as null|num
+ if(!isnull(newx))
+ pad.x_offset = CLAMP(newx, -pad.range, pad.range)
+
+ if(href_list["sety"])
+ var/newy = input(usr, "Input new y offset", pad.display_name, pad.y_offset) as null|num
+ if(!isnull(newy))
+ pad.y_offset = CLAMP(newy, -pad.range, pad.range)
if(href_list["remove"])
if(usr && alert(usr, "Are you sure?", "Remove Launchpad", "I'm Sure", "Abort") != "Abort")
@@ -145,4 +155,4 @@
sending = FALSE
teleport(usr, pad)
- updateDialog()
\ No newline at end of file
+ updateDialog()
diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm
index d07c351a22..dfadb73ab2 100644
--- a/code/game/machinery/computer/prisoner/_prisoner.dm
+++ b/code/game/machinery/computer/prisoner/_prisoner.dm
@@ -5,7 +5,7 @@
if(contained_id)
contained_id.forceMove(get_turf(src))
return ..()
-
+
/obj/machinery/computer/prisoner/examine(mob/user)
. = ..()
@@ -15,8 +15,9 @@
/obj/machinery/computer/prisoner/AltClick(mob/user)
+ ..()
id_eject(user)
- return ..()
+ return TRUE
/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/prisoner/P)
if(istype(P))
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 97cc0f5748..40ccc61b2b 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -115,8 +115,10 @@
return TRUE
/obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
+ . = TRUE
if(!defib)
to_chat(user, "It'd be hard to remove a defib unit from a mount that has none.")
return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index b94dbad2de..7614630477 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -153,9 +153,11 @@
. += "Alt-click to toggle modes."
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
toggle_mode(user)
+ return TRUE
/obj/item/grenade/barrier/proc/toggle_mode(mob/user)
switch(mode)
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index 3aad8d874c..7f21d1c1b3 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -97,8 +97,10 @@
do_the_dishes(TRUE)
/obj/machinery/dish_drive/AltClick(mob/living/user)
+ . = ..()
if(user.canUseTopic(src, !issilicon(user)))
do_the_dishes(TRUE)
+ return TRUE
/obj/machinery/dish_drive/proc/do_the_dishes(manual)
if(!contents.len)
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index c9e1e7195b..f62dceff6c 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -164,9 +164,11 @@
toggle_open(user)
/obj/machinery/dna_scannernew/AltClick(mob/user)
+ . = ..()
if(!user.canUseTopic(src, !issilicon(user)))
return
interact(user)
+ return TRUE
/obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm
index fcbb214bb6..2ce2711cb4 100644
--- a/code/game/machinery/doors/passworddoor.dm
+++ b/code/game/machinery/doors/passworddoor.dm
@@ -22,7 +22,7 @@
if(voice_activated)
flags_1 |= HEAR_1
-/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(!density || !voice_activated || radio_freq)
return
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index e6b8fe3b88..e1f9824524 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -51,10 +51,12 @@
open_machine()
/obj/machinery/harvester/AltClick(mob/user)
+ . = ..()
if(harvesting || !user || !isliving(user) || state_open)
return
if(can_harvest())
start_harvest()
+ return TRUE
/obj/machinery/harvester/proc/can_harvest()
if(!powered(EQUIP) || state_open || !occupant || !iscarbon(occupant))
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 79aef8ba7b..1e7d720ee9 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -408,7 +408,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(speaker && LAZYLEN(masters) && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios.
for(var/mob/living/silicon/ai/master in masters)
@@ -418,7 +418,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
for(var/I in holo_calls)
var/datum/holocall/HC = I
if(HC.connected_holopad == src && speaker != HC.hologram)
- HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode, source)
if(outgoing_call && speaker == outgoing_call.user)
outgoing_call.hologram.say(raw_message)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index d39de4d37d..c8beeb8c83 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -18,8 +18,8 @@
var/item_recycle_sound = 'sound/items/welder.ogg'
/obj/machinery/recycler/Initialize()
+ AddComponent(/datum/component/butchering/recycler, 1, amount_produced,amount_produced/5)
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), INFINITY, FALSE, null, null, null, TRUE)
- AddComponent(/datum/component/butchering, 1, amount_produced,amount_produced/5)
. = ..()
update_icon()
req_one_access = get_all_accesses() + get_all_centcom_access()
@@ -35,7 +35,7 @@
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.max_amount = mat_mod
amount_produced = min(50, amt_made) + 50
- var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering)
+ var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering/recycler)
butchering.effectiveness = amount_produced
butchering.bonus_modifier = amount_produced/5
@@ -83,20 +83,24 @@
is_powered = FALSE
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
-/obj/machinery/recycler/Bumped(atom/movable/AM)
-
- if(stat & (BROKEN|NOPOWER))
- return
+/obj/machinery/recycler/CanPass(atom/movable/AM)
+ . = ..()
if(!anchored)
return
- if(safety_mode)
- return
var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir)
- eat(AM)
+ return TRUE
+
+/obj/machinery/recycler/Crossed(atom/movable/AM)
+ eat(AM)
+ . = ..()
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(safety_mode)
+ return
var/list/to_eat
if(isitem(AM0))
to_eat = AM0.GetAllContentsIgnoring(GLOB.typecache_mob)
@@ -194,9 +198,6 @@
// Instantly lie down, also go unconscious from the pain, before you die.
L.Unconscious(100)
L.adjustBruteLoss(crush_damage)
- if(L.stat == DEAD && (L.butcher_results || L.guaranteed_butcher_results))
- var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering)
- butchering.Butcher(src,L)
/obj/machinery/recycler/deathtrap
name = "dangerous old crusher"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 081d91e56f..2ca0df75ae 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -16,6 +16,7 @@
. += "Alt-click it to start a wash cycle."
/obj/machinery/washing_machine/AltClick(mob/user)
+ . = ..()
if(!user.canUseTopic(src))
return
@@ -24,11 +25,11 @@
if(state_open)
to_chat(user, "Close the door first")
- return
+ return TRUE
if(bloody_mess)
to_chat(user, "[src] must be cleaned up first.")
- return
+ return TRUE
if(has_corgi)
bloody_mess = 1
@@ -37,6 +38,7 @@
update_icon()
addtimer(CALLBACK(src, .proc/wash_cycle), 200)
START_PROCESSING(SSfastprocess, src)
+ return TRUE
/obj/machinery/washing_machine/process()
if (!busy)
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index 4044951c42..812a9b0834 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -20,7 +20,7 @@
/obj/item/mecha_parts/mecha_equipment/drill/Initialize()
. = ..()
- AddComponent(/datum/component/butchering, 50, 100)
+ AddComponent(/datum/component/butchering, 50, 100, null, null, TRUE)
/obj/item/mecha_parts/mecha_equipment/drill/action(atom/target)
if(!action_checks(target))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index fe0ec33ed6..35500bed07 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -409,7 +409,7 @@
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
-/obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(speaker == occupant)
if(radio.broadcasting)
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index 7b00e208cc..86ec5e70da 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -138,8 +138,10 @@
chassis.toggle_strafe()
/obj/mecha/AltClick(mob/living/user)
+ . = ..()
if((user == occupant) && user.canUseTopic(src))
toggle_strafe()
+ return TRUE
/obj/mecha/proc/toggle_strafe()
strafe = !strafe
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index 875eaf5e60..0360c4ccc2 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -36,3 +36,7 @@
/obj/effect/projectile/impact/wormhole
icon_state = "wormhole_g"
+
+/obj/effect/projectile/impact/laser/wavemotion
+ name = "particle impact"
+ icon_state = "impact_wavemotion"
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index ad6b23f504..cbd4b21d39 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -28,3 +28,7 @@
/obj/effect/projectile/muzzle/wormhole
icon_state = "wormhole_g"
+
+/obj/effect/projectile/muzzle/laser/wavemotion
+ name = "particle backblast"
+ icon_state = "muzzle_wavemotion"
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index 23ecf438c4..0cd4589d4c 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -66,3 +66,7 @@
/obj/effect/projectile/tracer/wormhole
icon_state = "wormhole_g"
+
+/obj/effect/projectile/tracer/laser/wavemotion
+ name = "particle trail"
+ icon_state = "tracer_wavemotion"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a9056975b1..c5d198c05f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -81,6 +81,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/heat = 0
+ ///All items with sharpness of IS_SHARP or higher will automatically get the butchering component.
var/sharpness = IS_BLUNT
var/tool_behaviour = NONE
@@ -139,6 +140,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else if (!istype(embedding, /datum/embedding_behavior))
stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()")
+ if(sharpness) //give sharp objects butchering functionality, for consistency
+ AddComponent(/datum/component/butchering, 80 * toolspeed)
+
/obj/item/Destroy()
item_flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 97f5989eb4..fef0c55f5e 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -517,16 +517,17 @@ update_label("John Doe", "Clowny")
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
- return
+ return TRUE
if(alert("Are you sure you want to recolor your id?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",id_color) as color|null
if(!in_range(src, user) || !energy_color_input)
- return
+ return TRUE
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
- return
+ return TRUE
id_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
+ return TRUE
/obj/item/card/id/knight/Initialize()
. = ..()
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index ccd96525a3..2392973b22 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -945,10 +945,12 @@
to_chat(user, "You [suction ? "enable" : "disable"] the board's suction function.")
/obj/item/circuitboard/machine/dish_drive/AltClick(mob/living/user)
+ . = ..()
if(!user.Adjacent(src))
return
transmit = !transmit
to_chat(user, "You [transmit ? "enable" : "disable"] the board's automatic disposal transmission.")
+ return TRUE
/obj/item/circuitboard/machine/stacking_unit_console
name = "Stacking Machine Console (Machine Board)"
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 2a7b5d24cd..41ab418cf2 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -150,11 +150,13 @@
ui.open()
/obj/item/toy/crayon/spraycan/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(has_cap)
is_capped = !is_capped
to_chat(user, "The cap on [src] is now [is_capped ? "on" : "off"].")
update_icon()
+ return TRUE
/obj/item/toy/crayon/proc/staticDrawables()
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 63c9df9c4e..702347c220 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -27,6 +27,8 @@
var/pullshocksafely = FALSE //Dose the unit have the healdisk upgrade?
var/primetime = 0 // is the defib faster
var/timedeath = 10
+ var/disarm_shock_time = 10
+ var/always_emagged = FALSE
/obj/item/defibrillator/get_cell()
return cell
@@ -140,6 +142,7 @@
/obj/item/defibrillator/emag_act(mob/user)
. = ..()
+ always_emagged = TRUE
safety = !safety
to_chat(user, "You silently [safety ? "enable" : "disable"] [src]'s safety protocols with the cryptographic sequencer.")
return TRUE
@@ -154,7 +157,7 @@
safety = FALSE
visible_message("[src] beeps: Safety protocols disabled!")
playsound(src, 'sound/machines/defib_saftyOff.ogg', 50, 0)
- else
+ else if(!always_emagged)
safety = TRUE
visible_message("[src] beeps: Safety protocols enabled!")
playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0)
@@ -257,6 +260,8 @@
desc = "A belt-equipped blood-red defibrillator that can be rapidly deployed. Does not have the restrictions or safeties of conventional defibrillators and can revive through space suits."
combat = TRUE
safety = FALSE
+ always_emagged = TRUE
+ disarm_shock_time = 0
/obj/item/defibrillator/compact/combat/loaded/Initialize()
. = ..()
@@ -293,6 +298,7 @@
var/combat = FALSE //If it penetrates armor and gives additional functionality
var/grab_ghost = FALSE
var/tlimit = DEFIB_TIME_LIMIT * 10
+ var/disarm_shock_time = 10
var/mob/listeningTo
@@ -467,7 +473,7 @@
M.visible_message("[user] hastily places [src] on [M]'s chest!", \
"[user] hastily places [src] on [M]'s chest!")
busy = TRUE
- if(do_after(user, 10, target = M))
+ if(do_after(user, isnull(defib?.disarm_shock_time)? disarm_shock_time : defib.disarm_shock_time, target = M))
M.visible_message("[user] zaps [M] with [src]!", \
"[user] zaps [M] with [src]!")
M.adjustStaminaLoss(50)
@@ -734,9 +740,8 @@
/obj/item/disk/medical
name = "Defibrillator Upgrade Disk"
desc = "A blank upgrade disk, made for a defibrillator"
- icon = 'modular_citadel/icons/obj/defib_disks.dmi'
- icon_state = "upgrade_disk"
- item_state = "heal_disk"
+ icon_state = "heal_disk"
+ item_state = "defib_disk"
w_class = WEIGHT_CLASS_SMALL
/obj/item/disk/medical/defib_heal
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 37d2c77373..d97c07bf87 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -828,14 +828,14 @@ GLOBAL_LIST_EMPTY(PDAs)
send_message(U,list(P))
/obj/item/pda/AltClick()
- ..()
-
+ . = ..()
if(id)
remove_id()
playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1)
else
remove_pen()
playsound(src, 'sound/machines/button4.ogg', 50, 1)
+ return TRUE
/obj/item/pda/CtrlClick()
..()
@@ -1044,7 +1044,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (ismob(loc))
var/mob/M = loc
- M.show_message("Your [src] explodes!", 1)
+ M.show_message("Your [src] explodes!", MSG_VISUAL, "You hear a loud *pop*!", MSG_AUDIBLE)
else
visible_message("[src] explodes!", "You hear a loud *pop*!")
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 8be18a5f61..1e98c2c349 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -24,6 +24,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
+ rad_flags = RAD_PROTECT_CONTENTS //So the cartridges dont annoyingly get irradiated, and the signallers inside being radded as well
var/obj/item/integrated_signaler/radio = null
@@ -689,15 +690,16 @@ Code:
active_bot = null
if("summon") //Args are in the correct order, they are stated here just as an easy reminder.
- active_bot.bot_control(command= "summon", user_turf= get_turf(usr), user_access= host_pda.GetAccess())
+ active_bot.bot_control("summon", usr, host_pda.GetAccess())
else //Forward all other bot commands to the bot itself!
- active_bot.bot_control(command= href_list["op"], user= usr)
+ active_bot.bot_control(href_list["op"], usr)
playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work.
-
- active_bot.bot_control(href_list["mule"], usr, TRUE)
+ var/mob/living/simple_animal/bot/mulebot/mule = active_bot
+ if (istype(mule))
+ active_bot.bot_control(href_list["mule"], usr, TRUE)
if(!host_pda)
return
diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm
index 28bc559b93..d90399461b 100644
--- a/code/game/objects/items/devices/PDA/virus_cart.dm
+++ b/code/game/objects/items/devices/PDA/virus_cart.dm
@@ -72,12 +72,12 @@
difficulty += 2
var/datum/component/uplink/hidden_uplink = target.GetComponent(/datum/component/uplink)
if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink))
- U.show_message("An error flashes on your [src].", 1)
+ U.show_message("An error flashes on your [src].", MSG_VISUAL)
else
message_admins("[!is_special_character(U) ? "Non-antag " : ""][ADMIN_LOOKUPFLW(U)] triggered a PDA explosion on [target.name] at [ADMIN_VERBOSEJMP(target)].")
var/message_log = "triggered a PDA explosion on [target.name] at [AREACOORD(target)]."
U.log_message(message_log, LOG_ATTACK)
- U.show_message("Success!", 1)
+ U.show_message("Success!", MSG_VISUAL)
target.explode()
else
to_chat(U, "PDA not found.")
diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm
index 4a6e2d5a46..ff58af2405 100644
--- a/code/game/objects/items/devices/desynchronizer.dm
+++ b/code/game/objects/items/devices/desynchronizer.dm
@@ -32,6 +32,7 @@
. += "Can be used again to interrupt the effect early. The recharge time is the same as the time spent in desync."
/obj/item/desynchronizer/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num
@@ -40,6 +41,7 @@
new_duration = CLAMP(new_duration, 50, max_duration)
duration = new_duration
to_chat(user, "You set the duration to [DisplayTimeText(duration)].")
+ return TRUE
/obj/item/desynchronizer/proc/desync(mob/living/user)
if(sync_holder)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 8d7fa05ec6..c861ac1512 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -431,6 +431,7 @@
icon_state = "glowstick"
item_state = "glowstick"
grind_results = list("phenol" = 15, "hydrogen" = 10, "oxygen" = 5) //Meth-in-a-stick
+ rad_flags = RAD_NO_CONTAMINATE
var/fuel = 0
/obj/item/flashlight/glowstick/Initialize()
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index e6044ceadf..ce0e492393 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -182,14 +182,16 @@
return ..()
/obj/item/geiger_counter/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
- return ..()
+ return
if(!scanning)
to_chat(usr, "[src] must be on to reset its radiation level!")
- return 0
+ return TRUE
radiation_count = 0
to_chat(usr, "You flush [src]'s radiation counts, resetting it to normal.")
update_icon()
+ return TRUE
/obj/item/geiger_counter/emag_act(mob/user)
. = ..()
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 2368cdc4f0..acdb546a34 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -45,9 +45,11 @@ GLOBAL_LIST_EMPTY(GPS_list)
add_overlay("working")
/obj/item/gps/AltClick(mob/user)
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE))
return
toggletracking(user)
+ return TRUE
/obj/item/gps/proc/toggletracking(mob/user)
if(!user.canUseTopic(src, BE_CLOSE))
diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm
index fc9ccddaf9..33f839fa39 100644
--- a/code/game/objects/items/devices/quantum_keycard.dm
+++ b/code/game/objects/items/devices/quantum_keycard.dm
@@ -18,12 +18,14 @@
. += "Insert [src] into an active quantum pad to link it."
/obj/item/quantum_keycard/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
to_chat(user, "You start pressing [src]'s unlink button...")
if(do_after(user, 40, target = src))
to_chat(user, "The keycard beeps twice and disconnects the quantum link.")
qpad = null
+ return TRUE
/obj/item/quantum_keycard/update_icon()
if(qpad)
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 9f371f1ddb..1d0f94de71 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -326,8 +326,10 @@ GLOBAL_LIST_INIT(channel_tokens, list(
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
/obj/item/radio/headset/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !Adjacent(user) || user.incapacitated())
return
if (command)
use_command = !use_command
to_chat(user, "You toggle high-volume mode [use_command ? "on" : "off"].")
+ return TRUE
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index c8118e615f..efdf055743 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -113,7 +113,7 @@
return TRUE
-/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
+/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if (message_mode == MODE_INTERCOM)
return // Avoid hearing the same thing twice
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 55858e217a..7823e6bf87 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -274,7 +274,7 @@
signal.levels = list(T.z)
signal.broadcast()
-/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range)
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index d1e0f4841d..6fb5aa47d9 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -590,10 +590,10 @@ SLIME SCANNER
to_chat(user, "Temperature: [round(environment.temperature-T0C, 0.01)] °C ([round(environment.temperature, 0.01)] K)")
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
- ..()
+ . = ..()
if(user.canUseTopic(src))
-
+ . = TRUE
if(cooldown)
to_chat(user, "[src]'s barometer function is preparing itself.")
return
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 5a9a2027a0..a884524e11 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -94,7 +94,7 @@
icon_state = "taperecorder_idle"
-/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
. = ..()
if(mytape && recording)
mytape.timestamp += mytape.used_capacity
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 9dc3e421fd..b37c147357 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -122,7 +122,7 @@
interact(user)
return ..()
-/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
. = ..()
last_message = raw_message
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index d9525ab931..906572d018 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -138,11 +138,13 @@
toggle_igniter(user)
/obj/item/flamethrower/AltClick(mob/user)
+ . = ..()
if(ptank && isliving(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
user.put_in_hands(ptank)
ptank = null
to_chat(user, "You remove the plasma tank from [src]!")
update_icon()
+ return TRUE
/obj/item/flamethrower/examine(mob/user)
. = ..()
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index e8b5704e41..48ecf8273a 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -21,7 +21,7 @@
/obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M)
if(M.stat == DEAD) //They're dead!
return
- M.show_message("BANG", 2)
+ M.show_message("BANG", MSG_AUDIBLE)
var/distance = max(0,get_dist(get_turf(src),T))
//Flash
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 19dbf4fea3..079e0d79e9 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -205,3 +205,7 @@
/obj/item/inducer/sci/combat/Initialize()
. = ..()
update_icon()
+
+/obj/item/inducer/sci/supply
+ opened = FALSE
+ cell_type = /obj/item/stock_parts/cell/inducer_supply
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 561af8ded6..16262d61c3 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -320,11 +320,12 @@
M.update_inv_hands()
/obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user)
+ . = ..()
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
- return
+ return TRUE
if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
@@ -332,6 +333,7 @@
light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
+ return TRUE
/obj/item/melee/transforming/energy/sword/cx/examine(mob/user)
. = ..()
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 7eb35ed06b..5bccf91868 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -23,8 +23,8 @@
else
if(attack_verb_off.len)
attack_verb = attack_verb_off
- if(get_sharpness())
- AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active)
+ if(sharpness)
+ AddComponent(/datum/component/butchering, 50, 100, 0, hitsound)
/obj/item/melee/transforming/attack_self(mob/living/carbon/user)
if(transform_weapon(user))
@@ -65,13 +65,6 @@
icon_state = initial(icon_state)
w_class = initial(w_class)
total_mass = initial(total_mass)
- if(get_sharpness())
- var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering)
- BT.butchering_enabled = TRUE
- else
- var/datum/component/butchering/BT = GetComponent(/datum/component/butchering)
- if(BT)
- BT.butchering_enabled = FALSE
transform_messages(user, supress_message_text)
add_fingerprint(user)
return TRUE
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index b107010991..5af9c70d9b 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -70,6 +70,7 @@
update_icon()
/obj/item/pet_carrier/AltClick(mob/living/user)
+ . = ..()
if(open || !user.canUseTopic(src, BE_CLOSE))
return
locked = !locked
@@ -79,6 +80,7 @@
else
playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE)
update_icon()
+ return TRUE
/obj/item/pet_carrier/attack(mob/living/target, mob/living/user)
if(user.a_intent == INTENT_HARM)
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index ffbbea84dc..705dcad6c6 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -113,8 +113,10 @@
return
log_game("[key_name(user)] activated a hidden grenade in [src].")
grenade.preprime(user, msg = FALSE, volume = 10)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
else
to_chat(user, "You try to pet [src], but it has no stuffing. Aww...")
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
if(I.get_sharpness())
@@ -125,6 +127,7 @@
user.visible_message("[user] tears out the stuffing from [src]!", "You rip a bunch of the stuffing from [src]. Murderer.")
I.play_tool_sound(src)
stuffed = FALSE
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack)
else
to_chat(user, "You remove the grenade from [src].")
user.put_in_hands(grenade)
@@ -147,6 +150,7 @@
return
if(istype(I, /obj/item/toy/plush))
love(I, user)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay)
return
return ..()
@@ -158,7 +162,7 @@
//we are not catholic
if(young == TRUE || Kisser.young == TRUE)
- user.show_message("[src] plays tag with [Kisser].", 1,
+ user.show_message("[src] plays tag with [Kisser].", MSG_VISUAL,
"They're happy.", 0)
Kisser.cheer_up()
cheer_up()
@@ -166,10 +170,10 @@
//never again
else if(Kisser in scorned)
//message, visible, alternate message, neither visible nor audible
- user.show_message("[src] rejects the advances of [Kisser]!", 1,
+ user.show_message("[src] rejects the advances of [Kisser]!", MSG_VISUAL,
"That didn't feel like it worked.", 0)
else if(src in Kisser.scorned)
- user.show_message("[Kisser] realises who [src] is and turns away.", 1,
+ user.show_message("[Kisser] realises who [src] is and turns away.", MSG_VISUAL,
"That didn't feel like it worked.", 0)
//first comes love
@@ -190,7 +194,7 @@
new_lover(Kisser)
Kisser.new_lover(src)
else
- user.show_message("[src] rejects the advances of [Kisser], maybe next time?", 1,
+ user.show_message("[src] rejects the advances of [Kisser], maybe next time?", MSG_VISUAL,
"That didn't feel like it worked, this time.", 0)
//then comes marriage
@@ -1014,7 +1018,7 @@
icon_state = "maya"
item_state = "maya"
attack_verb = list("nuked", "arrested", "harmbatonned")
-
+
/obj/item/toy/plush/catgirl/marisa
desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win."
icon_state = "marisa"
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index c9fc59a3fe..53209fac2f 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -39,6 +39,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
/obj/item/stack/sheet/glass/fifty
amount = 50
+/obj/item/stack/sheet/glass/five
+ amount = 5
+
/obj/item/stack/sheet/glass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.glass_recipes
return ..()
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 96546d6eb6..63ebd24b16 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -55,6 +55,9 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
/obj/item/stack/sheet/mineral/sandstone/thirty
amount = 30
+/obj/item/stack/sheet/mineral/sandstone/twelve
+ amount = 12
+
/*
* Sandbags
*/
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index c10fb0fa2c..33a895cad7 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -620,6 +620,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
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/glass/beaker/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
/obj/item/stack/sheet/plastic
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 965e78036a..e8bd50f19b 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -350,6 +350,7 @@
. = ..()
/obj/item/stack/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(is_cyborg)
@@ -363,10 +364,11 @@
max = get_amount()
stackmaterial = min(max, stackmaterial)
if(stackmaterial == null || stackmaterial <= 0 || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
+ return TRUE
else
change_stack(user, stackmaterial)
to_chat(user, "You take [stackmaterial] sheets out of the stack")
+ return TRUE
/obj/item/stack/proc/change_stack(mob/user, amount)
if(!use(amount, TRUE, FALSE))
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 3fc9bd9535..18acb5e14d 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -82,6 +82,55 @@
item_state = "tile-fairygrass"
turf_type = /turf/open/floor/grass/fairy
resistance_flags = FLAMMABLE
+ color = "#33CCFF"
+
+/obj/item/stack/tile/fairygrass/white
+ name = "white fairygrass tile"
+ singular_name = "white fairygrass floor tile"
+ desc = "A patch of odd, glowing white grass."
+ turf_type = /turf/open/floor/grass/fairy/white
+ color = "#FFFFFF"
+
+/obj/item/stack/tile/fairygrass/red
+ name = "red fairygrass tile"
+ singular_name = "red fairygrass floor tile"
+ desc = "A patch of odd, glowing red grass."
+ turf_type = /turf/open/floor/grass/fairy/red
+ color = "#FF3333"
+
+/obj/item/stack/tile/fairygrass/yellow
+ name = "yellow fairygrass tile"
+ singular_name = "yellow fairygrass floor tile"
+ desc = "A patch of odd, glowing yellow grass."
+ turf_type = /turf/open/floor/grass/fairy/yellow
+ color = "#FFFF66"
+
+/obj/item/stack/tile/fairygrass/green
+ name = "green fairygrass tile"
+ singular_name = "green fairygrass floor tile"
+ desc = "A patch of odd, glowing green grass."
+ turf_type = /turf/open/floor/grass/fairy/green
+ color = "#99FF99"
+
+/obj/item/stack/tile/fairygrass/blue
+ name = "blue fairygrass tile"
+ singular_name = "blue fairygrass floor tile"
+ desc = "A patch of odd, glowing blue grass."
+ turf_type = /turf/open/floor/grass/fairy/blue
+
+/obj/item/stack/tile/fairygrass/purple
+ name = "purple fairygrass tile"
+ singular_name = "purple fairygrass floor tile"
+ desc = "A patch of odd, glowing purple grass."
+ turf_type = /turf/open/floor/grass/fairy/purple
+ color = "#D966FF"
+
+/obj/item/stack/tile/fairygrass/pink
+ name = "pink fairygrass tile"
+ singular_name = "pink fairygrass floor tile"
+ desc = "A patch of odd, glowing pink grass."
+ turf_type = /turf/open/floor/grass/fairy/pink
+ color = "#FFB3DA"
//Wood
/obj/item/stack/tile/wood
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index f6e169a4d5..15db8e2ebd 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -253,7 +253,7 @@
/obj/item/storage/backpack/satchel/bone
name = "bone satchel"
- desc = "A bone satchel fashend with watcher wings and large bones from goliath. Can be worn on the belt."
+ desc = "A grotesque satchel made of sinews and bones."
icon = 'icons/obj/mining.dmi'
icon_state = "goliath_saddle"
slot_flags = ITEM_SLOT_BACK
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 47d2d70db8..3a4579d3f8 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -757,23 +757,13 @@
STR.rustle_sound = FALSE
STR.max_w_class = WEIGHT_CLASS_BULKY
STR.can_hold = typecacheof(fitting_swords)
+ STR.quickdraw = TRUE
/obj/item/storage/belt/sabre/examine(mob/user)
. = ..()
if(length(contents))
. += "Alt-click it to quickly draw the blade."
-/obj/item/storage/belt/sabre/AltClick(mob/user)
- if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- if(length(contents))
- var/obj/item/I = contents[1]
- user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].")
- user.put_in_hands(I)
- update_icon()
- else
- to_chat(user, "[src] is empty.")
-
/obj/item/storage/belt/sabre/update_icon()
. = ..()
if(isliving(loc))
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index f9505fe948..e214db3c71 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -699,6 +699,7 @@
user.changeNext_move(CLICK_CD_MELEE)
playsound(loc, "rustle", 50, 1, -5)
user.visible_message("[user] hugs \the [src].","You hug \the [src].")
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
/////clown box & honkbot assembly
/obj/item/storage/box/clown
@@ -883,12 +884,12 @@
else if(W.get_sharpness())
if(!contents.len)
if(item_state == "paperbag_None")
- user.show_message("You cut eyeholes into [src].", 1)
+ user.show_message("You cut eyeholes into [src].", MSG_VISUAL)
new /obj/item/clothing/head/papersack(user.loc)
qdel(src)
return 0
else if(item_state == "paperbag_SmileyFace")
- user.show_message("You cut eyeholes into [src] and modify the design.", 1)
+ user.show_message("You cut eyeholes into [src] and modify the design.", MSG_VISUAL)
new /obj/item/clothing/head/papersack/smiley(user.loc)
qdel(src)
return 0
@@ -900,7 +901,7 @@
#undef HEART
#undef SMILEY
-/obj/item/storage/box/ingredients //This box is for the randomely chosen version the chef spawns with, it shouldn't actually exist.
+/obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef spawns with, it shouldn't actually exist.
name = "ingredients box"
illustration = "fruit"
var/theme_name
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 6cc2cb6882..f05078de81 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -157,6 +157,7 @@
to_chat(user, "You take \a [W] out of the pack.")
else
to_chat(user, "There are no [icon_type]s left in the pack.")
+ return TRUE
/obj/item/storage/fancy/cigarettes/update_icon()
if(fancy_open || !contents.len)
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index bd234d8188..3d27370334 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -114,11 +114,12 @@
. += "Alt-click to [open ? "close":"open"] it."
/obj/item/storage/lockbox/medal/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE))
if(!SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED))
open = (open ? FALSE : TRUE)
update_icon()
- ..()
+ return TRUE
/obj/item/storage/lockbox/medal/PopulateContents()
new /obj/item/clothing/accessory/medal/gold/captain(src)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 891a4689d0..2dbe42c159 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -37,7 +37,15 @@
/obj/item/screwdriver,
/obj/item/valentine,
/obj/item/stamp,
- /obj/item/key))
+ /obj/item/key,
+ /obj/item/cartridge,
+ /obj/item/camera_film,
+ /obj/item/stack/ore/bluespace_crystal,
+ /obj/item/reagent_containers/food/snacks/grown/poppy,
+ /obj/item/instrument/harmonica,
+ /obj/item/mining_voucher,
+ /obj/item/suit_voucher,
+ /obj/item/reagent_containers/pill))
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index e0e875b739..92b0036ee0 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -201,7 +201,7 @@
if(!current_location || current_area.noteleport || is_away_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf
to_chat(user, "\The [src] is malfunctioning.")
return
- user.show_message("Locked In.", 2)
+ user.show_message("Locked In.", MSG_AUDIBLE)
var/list/obj/effect/portal/created = create_portal_pair(current_location, get_teleport_turf(get_turf(T)), src, 300, 1, null, atmos_link_override)
if(!(LAZYLEN(created) == 2))
return
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index fe8b4b2d56..e4b95a5073 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -122,12 +122,21 @@
user.put_in_active_hand(pryjaws)
/obj/item/wirecutters/power/attack(mob/living/carbon/C, mob/user)
- if(istype(C) && C.handcuffed)
- user.visible_message("[user] cuts [C]'s restraints with [src]!")
- qdel(C.handcuffed)
- return
- else
- ..()
+ if(istype(C))
+ if(C.handcuffed)
+ user.visible_message("[user] cuts [C]'s restraints with [src]!")
+ qdel(C.handcuffed)
+ return
+ else if(C.has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
+ var/man = C == user ? "your" : "[C]'\s"
+ user.visible_message("[user] attempts to remove the durathread strand from around [man] neck.", \
+ "You attempt to remove the durathread strand from around [man] neck.")
+ if(do_after(user, 15, null, C))
+ user.visible_message("[user] succesfuly removes the durathread strand.",
+ "You succesfuly remove the durathread strand.")
+ C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+ return
+ ..()
/obj/item/wirecutters/advanced
name = "advanced wirecutters"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 0fcc034371..08c43f0437 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -182,7 +182,7 @@
return
src.add_fingerprint(user)
if (src.bullets < 1)
- user.show_message("*click*", 2)
+ user.show_message("*click*", MSG_AUDIBLE)
playsound(src, "gun_dry_fire", 30, 1)
return
playsound(user, 'sound/weapons/gunshot.ogg', 100, 1)
@@ -338,11 +338,12 @@
M.update_inv_hands()
/obj/item/toy/sword/cx/AltClick(mob/living/user)
+ . = ..()
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
- return
+ return TRUE
if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
@@ -350,6 +351,7 @@
light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
+ return TRUE
/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file)
. = ..()
@@ -401,6 +403,7 @@
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
var/active = FALSE
icon = 'icons/obj/items_and_weapons.dmi'
+ hitsound = 'sound/weapons/smash.ogg'
attack_verb = list("robusted")
/obj/item/toy/windupToolbox/attack_self(mob/user)
@@ -408,13 +411,33 @@
icon_state = "his_grace_awakened"
to_chat(user, "You wind up [src], it begins to rumble.")
active = TRUE
+ playsound(src, 'sound/effects/pope_entry.ogg', 100)
+ Rumble()
addtimer(CALLBACK(src, .proc/stopRumble), 600)
else
to_chat(user, "[src] is already active.")
+/obj/item/toy/windupToolbox/proc/Rumble()
+ var/static/list/transforms
+ if(!transforms)
+ var/matrix/M1 = matrix()
+ var/matrix/M2 = matrix()
+ var/matrix/M3 = matrix()
+ var/matrix/M4 = matrix()
+ M1.Translate(-1, 0)
+ M2.Translate(0, 1)
+ M3.Translate(1, 0)
+ M4.Translate(0, -1)
+ transforms = list(M1, M2, M3, M4)
+ animate(src, transform=transforms[1], time=0.2, loop=-1)
+ animate(transform=transforms[2], time=0.1)
+ animate(transform=transforms[3], time=0.2)
+ animate(transform=transforms[4], time=0.3)
+
/obj/item/toy/windupToolbox/proc/stopRumble()
icon_state = initial(icon_state)
active = FALSE
+ animate(src, transform=matrix())
/*
* Subtype of Double-Bladed Energy Swords
@@ -864,9 +887,10 @@
return ..()
/obj/item/toy/cards/deck/MouseDrop(atom/over_object)
+ . = ..()
var/mob/living/M = usr
if(!istype(M) || usr.incapacitated() || usr.lying)
- return ..()
+ return
if(Adjacent(usr))
if(over_object == M && loc != M)
M.put_in_hands(src)
@@ -878,9 +902,7 @@
to_chat(usr, "You pick up the deck.")
else
- . = ..()
- if(!.)
- to_chat(usr, "You can't reach it from here!")
+ to_chat(usr, "You can't reach it from here!")
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index f559d2801d..dd7d46d0d7 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -541,6 +541,7 @@
clean_blood()
/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
return
if(user.incapacitated() || !istype(user))
@@ -553,6 +554,7 @@
light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
+ return TRUE
/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file)
. = ..()
@@ -659,6 +661,7 @@
qdel(src)
/obj/item/twohanded/spear/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE))
..()
if(!explosive)
@@ -667,6 +670,7 @@
var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
if(input)
src.war_cry = input
+ return TRUE
/obj/item/twohanded/spear/CheckParts(list/parts_list)
var/obj/item/shard/tip = locate() in parts_list
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index e6c7f987d5..51386c791c 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -234,6 +234,7 @@
. = ..()
if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
reskin_obj(user)
+ return TRUE
/obj/proc/reskin_obj(mob/M)
if(!LAZYLEN(unique_reskin))
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index d19e76d238..e61a17b4ec 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -449,6 +449,9 @@
item_chair = null
var/turns = 0
+/obj/structure/chair/brass/ComponentInitialize()
+ return //it spins with the power of ratvar, not components.
+
/obj/structure/chair/brass/Destroy()
STOP_PROCESSING(SSfastprocess, src)
. = ..()
@@ -464,6 +467,7 @@
return
/obj/structure/chair/brass/AltClick(mob/living/user)
+ . = ..()
turns = 0
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
@@ -475,6 +479,7 @@
user.visible_message("[user] stops [src]'s uncontrollable spinning.", \
"You grab [src] and stop its wild spinning.")
STOP_PROCESSING(SSfastprocess, src)
+ return TRUE
/obj/structure/chair/bronze
name = "brass chair"
@@ -498,7 +503,7 @@
var/mutable_appearance/armrest
/obj/structure/chair/sofa/Initialize()
- armrest = mutable_appearance(icon, "[icon_state]_armrest")
+ armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
return ..()
/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 0f8963012f..38944c0384 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -342,25 +342,21 @@
. = TRUE
if(opened)
if(istype(W, cutting_tool))
+ var/welder = FALSE
if(istype(W, /obj/item/weldingtool))
if(!W.tool_start_check(user, amount=0))
return
-
- to_chat(user, "You begin cutting \the [src] apart...")
- if(W.use_tool(src, user, 40, volume=50))
- if(eigen_teleport)
- to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!")
- return
- if(!opened)
- return
- user.visible_message("[user] slices apart \the [src].",
- "You cut \the [src] apart with \the [W].",
- "You hear welding.")
- deconstruct(TRUE)
- return
- else // for example cardboard box is cut with wirecutters
- user.visible_message("[user] cut apart \the [src].", \
- "You cut \the [src] apart with \the [W].")
+ to_chat(user, "You begin [welder ? "slicing" : "deconstructing"] \the [src] apart...")
+ welder = TRUE
+ if(W.use_tool(src, user, 40, volume=50))
+ if(eigen_teleport)
+ to_chat(user, "The unstable nature of \the [src] makes it impossible to [welder ? "slice" : "deconstruct"]!")
+ return
+ if(!opened)
+ return
+ user.visible_message("[user] [welder ? "slice" : "deconstruct"]s apart \the [src].",
+ "You [welder ? "slice" : "deconstruct"] \the [src] apart with \the [W].",
+ "You hear [welder ? "welding" : "rustling of screws and metal"].")
deconstruct(TRUE)
return
if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
@@ -526,11 +522,12 @@
to_chat(user, "You fail to break out of [src]!")
/obj/structure/closet/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))
to_chat(user, "You can't do that right now!")
- return
+ return TRUE
togglelock(user)
+ return TRUE
/obj/structure/closet/CtrlShiftClick(mob/living/user)
if(!HAS_TRAIT(user, TRAIT_SKITTISH))
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index c9a2ad54ff..6548ec737c 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -4,6 +4,8 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
+ material_drop = /obj/item/stack/sheet/mineral/wood
+ cutting_tool = /obj/item/screwdriver
/obj/structure/closet/acloset
name = "strange closet"
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 f0c1495281..bfcb00f285 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
@@ -4,6 +4,8 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
+ material_drop = /obj/item/stack/sheet/mineral/wood
+ cutting_tool = /obj/item/screwdriver
/obj/structure/closet/secure_closet/bar/PopulateContents()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 9ee34b084a..8cf0852aaa 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -44,11 +44,14 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
+ material_drop = /obj/item/stack/sheet/mineral/wood
+ cutting_tool = /obj/item/screwdriver
/obj/structure/closet/secure_closet/personal/cabinet/PopulateContents()
new /obj/item/storage/backpack/satchel/leather/withwallet( src )
new /obj/item/instrument/piano_synth(src)
new /obj/item/radio/headset( src )
+ new /obj/item/clothing/head/colour(src)
/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params)
var/obj/item/card/id/I = W.GetID()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index a50ee6988c..835be8d2fc 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -161,12 +161,16 @@
..()
new /obj/item/clothing/accessory/armband/medblue(src)
new /obj/item/encryptionkey/headset_med(src)
+
/obj/structure/closet/secure_closet/detective
name = "\improper detective's cabinet"
req_access = list(ACCESS_FORENSICS_LOCKERS)
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
+ material_drop = /obj/item/stack/sheet/mineral/wood
+ cutting_tool = /obj/item/screwdriver
+
/obj/structure/closet/secure_closet/detective/PopulateContents()
..()
new /obj/item/clothing/under/rank/det(src)
diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm
index c0ca1277d3..1580c0104e 100644
--- a/code/game/objects/structures/crates_lockers/crates/bins.dm
+++ b/code/game/objects/structures/crates_lockers/crates/bins.dm
@@ -4,6 +4,8 @@
icon_state = "largebins"
open_sound = 'sound/effects/bin_open.ogg'
close_sound = 'sound/effects/bin_close.ogg'
+ material_drop = /obj/item/stack/sheet/plastic
+ material_drop_amount = 40
anchored = TRUE
horizontal = FALSE
delivery_icon = null
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 23643ae9cd..d6beaa2628 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -102,9 +102,11 @@
return attack_hand(user)
/obj/structure/extinguisher_cabinet/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
toggle_cabinet(user)
+ return TRUE
/obj/structure/extinguisher_cabinet/proc/toggle_cabinet(mob/user)
if(opened && broken)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index e3585b601e..688006a6e3 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -151,6 +151,9 @@
log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
+ if(has_owner)
+ var/datum/species/golem/G = H.dna.species
+ G.owner = owner
H.set_cloned_appearance()
if(!name)
if(has_owner)
@@ -321,8 +324,9 @@
/datum/outfit/hotelstaff
name = "Hotel Staff"
- uniform = /obj/item/clothing/under/assistantformal
+ uniform = /obj/item/clothing/under/telegram
shoes = /obj/item/clothing/shoes/laceup
+ head = /obj/item/clothing/head/hotel
r_pocket = /obj/item/radio/off
back = /obj/item/storage/backpack
implants = list(/obj/item/implant/mindshield)
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 4c6b9732d0..1f007b6993 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -14,8 +14,8 @@
if(source_projector)
projector = source_projector
projector.signs += src
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, alpha, RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
alpha = 0
- SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
/obj/structure/holosign/Destroy()
if(projector)
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index c4e1968e59..28427469ba 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -1,5 +1,7 @@
-//Loom, turns raw cotton and durathread into their respective fabrics.
+#define FABRIC_PER_SHEET 4
+
+///This is a loom. It's usually made out of wood and used to weave fabric like durathread or cotton into their respective cloth types.
/obj/structure/loom
name = "loom"
desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material."
@@ -8,14 +10,35 @@
density = TRUE
anchored = TRUE
-/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user)
- if(W.is_fabric && W.amount > 1)
- user.show_message("You start weaving the [W.name] through the loom..", 1)
- if(W.use_tool(src, user, W.pull_effort))
- new W.loom_result(drop_location())
- user.show_message("You weave the [W.name] into a workable fabric.", 1)
- W.amount = (W.amount - 2)
- if(W.amount < 1)
- qdel(W)
- else
- user.show_message("You need a valid fabric and at least 2 of said fabric before using this.", 1)
\ No newline at end of file
+/obj/structure/loom/attackby(obj/item/I, mob/user)
+ if(weave(I, user))
+ return
+ return ..()
+
+/obj/structure/loom/wrench_act(mob/living/user, obj/item/I)
+ ..()
+ default_unfasten_wrench(user, I, 5)
+ return TRUE
+
+///Handles the weaving.
+/obj/structure/loom/proc/weave(obj/item/stack/sheet/S, mob/user)
+ if(!istype(S) || !S.is_fabric)
+ return FALSE
+ if(!anchored)
+ user.show_message("The loom needs to be wrenched down.", MSG_VISUAL)
+ return FALSE
+ if(S.amount < FABRIC_PER_SHEET)
+ user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1)
+ return FALSE
+ user.show_message("You start weaving \the [S.name] through the loom..", MSG_VISUAL)
+ if(S.use_tool(src, user, S.pull_effort))
+ if(S.amount >= FABRIC_PER_SHEET)
+ new S.loom_result(drop_location())
+ S.use(FABRIC_PER_SHEET)
+ user.show_message("You weave \the [S.name] into a workable fabric.", MSG_VISUAL)
+ return TRUE
+
+/obj/structure/loom/unanchored
+ anchored = FALSE
+
+#undef FABRIC_PER_SHEET
\ No newline at end of file
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index b15d686b7b..a7f751e63c 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -226,9 +226,13 @@
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_eye_color)
- H.eye_color = sanitize_hexcolor(new_eye_color)
+ var/n_color = sanitize_hexcolor(new_eye_color)
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ if(eyes)
+ eyes.eye_color = n_color
+ H.eye_color = n_color
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
- H.update_body()
+ H.dna.species.handle_body()
if(choice)
curse(user)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 840597ba4c..cdd4cb5a31 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -167,11 +167,12 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
. += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it."
/obj/structure/bodycontainer/morgue/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, !issilicon(user)))
return
beeper = !beeper
to_chat(user, "You turn the speaker function [beeper ? "on" : "off"].")
+ return TRUE
/obj/structure/bodycontainer/morgue/update_icon()
if (!connected || connected.loc != src) // Open or tray is gone.
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 77aad5a9dd..cde60e15c1 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -167,10 +167,12 @@
return TRUE
/obj/structure/reflector/AltClick(mob/user)
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else if(finished)
rotate(user)
+ return TRUE
//TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX
diff --git a/code/game/say.dm b/code/game/say.dm
index 60189618be..3bfd11bac0 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -28,19 +28,21 @@ GLOBAL_LIST_INIT(freqtospan, list(
language = get_default_language()
send_speech(message, 7, src, , spans, message_language=language)
-/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args)
/atom/movable/proc/can_speak()
return 1
-/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode)
- var/rendered = compose_message(src, message_language, message, , spans, message_mode)
+/atom/movable/proc/send_speech(message, range = 7, atom/movable/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode)
+ var/rendered = compose_message(src, message_language, message, , spans, message_mode, source)
for(var/_AM in get_hearers_in_view(range, source))
var/atom/movable/AM = _AM
- AM.Hear(rendered, src, message_language, message, , spans, message_mode)
+ AM.Hear(rendered, src, message_language, message, , spans, message_mode, source)
-/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE)
+/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source)
+ if(!source)
+ source = speaker
//This proc uses text() because it is faster than appending strings. Thanks BYOND.
//Basic span
var/spanpart1 = ""
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index a8e6baf3fb..82f1a88253 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -104,6 +104,47 @@
light_range = 2
light_power = 0.80
light_color = "#33CCFF"
+ color = "#33CCFF"
+
+/turf/open/floor/grass/fairy/white
+ name = "white fairygrass patch"
+ light_color = "#FFFFFF"
+ color = "#FFFFFF"
+ floor_tile = /obj/item/stack/tile/fairygrass/white
+
+/turf/open/floor/grass/fairy/red
+ name = "red fairygrass patch"
+ light_color = "#FF3333"
+ color = "#FF3333"
+ floor_tile = /obj/item/stack/tile/fairygrass/red
+
+/turf/open/floor/grass/fairy/yellow
+ name = "yellow fairygrass patch"
+ light_color = "#FFFF66"
+ color = "#FFFF66"
+ floor_tile = /obj/item/stack/tile/fairygrass/yellow
+
+/turf/open/floor/grass/fairy/green
+ name = "green fairygrass patch"
+ light_color = "#99FF99"
+ color = "#99FF99"
+ floor_tile = /obj/item/stack/tile/fairygrass/green
+
+/turf/open/floor/grass/fairy/blue
+ name = "blue fairygrass patch"
+ floor_tile = /obj/item/stack/tile/fairygrass/blue
+
+/turf/open/floor/grass/fairy/purple
+ name = "purple fairygrass patch"
+ light_color = "#D966FF"
+ color = "#D966FF"
+ floor_tile = /obj/item/stack/tile/fairygrass/purple
+
+/turf/open/floor/grass/fairy/pink
+ name = "pink fairygrass patch"
+ light_color = "#FFB3DA"
+ color = "#FFB3DA"
+ floor_tile = /obj/item/stack/tile/fairygrass/pink
/turf/open/floor/grass/snow
gender = PLURAL
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 966083c71a..aeadceb2e5 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -176,6 +176,12 @@
/turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45,
/turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20)
+/turf/closed/mineral/random/high_chance/earth_like
+ icon_state = "rock_highchance_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
/turf/closed/mineral/random/low_chance
@@ -186,6 +192,12 @@
/turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40,
/turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1)
+/turf/closed/mineral/random/low_chance/earth_like
+ icon_state = "rock_lowchance_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
/turf/closed/mineral/random/volcanic
environment_type = "basalt"
@@ -220,6 +232,12 @@
/turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2,
/turf/closed/mineral/iron/volcanic = 95)
+/turf/closed/mineral/random/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
/turf/closed/mineral/iron
@@ -235,6 +253,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/iron/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/iron/ice
environment_type = "snow_cavern"
icon_state = "icerock_iron"
@@ -258,6 +283,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/uranium/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/diamond
mineralType = /obj/item/stack/ore/diamond
@@ -272,6 +304,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/diamond/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/diamond/ice
environment_type = "snow_cavern"
icon_state = "icerock_diamond"
@@ -295,6 +334,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/gold/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/silver
mineralType = /obj/item/stack/ore/silver
@@ -309,6 +355,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/silver/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/titanium
mineralType = /obj/item/stack/ore/titanium
@@ -323,6 +376,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/titanium/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/plasma
mineralType = /obj/item/stack/ore/plasma
@@ -337,6 +397,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/plasma/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/plasma/ice
environment_type = "snow_cavern"
icon_state = "icerock_plasma"
@@ -355,6 +422,12 @@
spread = 0
scan_state = "rock_Bananium"
+/turf/closed/mineral/bananium/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
/turf/closed/mineral/bscrystal
mineralType = /obj/item/stack/ore/bluespace_crystal
@@ -370,6 +443,13 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
+/turf/closed/mineral/bscrystal/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/volcanic
environment_type = "basalt"
@@ -383,6 +463,13 @@
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
defer_change = 1
+/turf/closed/mineral/earth_like
+ icon_state = "rock_oxy"
+ turf_type = /turf/open/floor/plating/asteroid
+ baseturfs = /turf/open/floor/plating/asteroid
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+ defer_change = TRUE
+
/turf/closed/mineral/ash_rock //wall piece
name = "rock"
icon = 'icons/turf/mining.dmi'
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 87db105072..895f8c9f88 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -720,20 +720,44 @@
if(!check_rights(R_SPAWN))
return
+ var/turf/T = get_turf(usr)
var/chosen = pick_closest_path(object)
if(!chosen)
return
if(ispath(chosen, /turf))
- var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
- var/atom/A = new chosen(usr.loc)
+ var/atom/A = new chosen(T)
A.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(usr)] spawned [chosen] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/admins/proc/podspawn_atom(object as text)
+ set category = "Debug"
+ set desc = "(atom path) Spawn an atom via supply drop"
+ set name = "Podspawn"
+
+ if(!check_rights(R_SPAWN))
+ return
+
+ var/chosen = pick_closest_path(object)
+ if(!chosen)
+ return
+ var/turf/T = get_turf(usr)
+
+ if(ispath(chosen, /turf))
+ T.ChangeTurf(chosen)
+ else
+ var/obj/structure/closet/supplypod/centcompod/pod = new()
+ var/atom/A = new chosen(pod)
+ A.flags_1 |= ADMIN_SPAWNED_1
+ new /obj/effect/abstract/DPtarget(T, pod)
+
+ log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]")
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/datum/admins/proc/spawn_cargo(object as text)
set category = "Debug"
set desc = "(atom path) Spawn a cargo crate"
@@ -875,7 +899,7 @@
/datum/admins/proc/dynamic_mode_options(mob/user)
var/dat = {"
Dynamic Mode Options
-
+
Common options
All these options can be changed midround.
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 5900847ef5..c3ffd10174 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/roll_dices //CIT CHANGE - Adds dice verb
))
GLOBAL_PROTECT(admin_verbs_fun)
-GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
+GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_spawn)
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/world/proc/AVerbsServer()
diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm
index 2901659ce9..702e2071bd 100644
--- a/code/modules/admin/sound_emitter.dm
+++ b/code/modules/admin/sound_emitter.dm
@@ -52,9 +52,11 @@
edit_emitter(user)
/obj/effect/sound_emitter/AltClick(mob/user)
+ . = ..()
if(check_rights_for(user.client, R_SOUNDS))
activate(user)
to_chat(user, "Sound emitter activated.")
+ return TRUE
/obj/effect/sound_emitter/proc/edit_emitter(mob/user)
var/dat = ""
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 4de2d9b5ca..5b751ffe30 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2355,7 +2355,7 @@
var/atom/target //Where the object will be spawned
var/where = href_list["object_where"]
- if (!( where in list("onfloor","inhand","inmarked") ))
+ if (!( where in list("onfloor","frompod","inhand","inmarked") ))
where = "onfloor"
@@ -2366,7 +2366,7 @@
where = "onfloor"
target = usr
- if("onfloor")
+ if("onfloor", "frompod")
switch(href_list["offset_type"])
if ("absolute")
target = locate(0 + X,0 + Y,0 + Z)
@@ -2382,7 +2382,10 @@
else
target = marked_datum
+ var/obj/structure/closet/supplypod/centcompod/pod
if(target)
+ if(where == "frompod")
+ pod = new()
for (var/path in paths)
for (var/i = 0; i < number; i++)
if(path in typesof(/turf))
@@ -2391,7 +2394,11 @@
if(N && obj_name)
N.name = obj_name
else
- var/atom/O = new path(target)
+ var/atom/O
+ if(where == "frompod")
+ O = new path(pod)
+ else
+ O = new path(target)
if(!QDELETED(O))
O.flags_1 |= ADMIN_SPAWNED_1
if(obj_dir)
@@ -2411,6 +2418,8 @@
R.module.add_module(I, TRUE, TRUE)
R.activate_module(I)
+ if(pod)
+ new /obj/effect/abstract/DPtarget(target, pod)
if (number == 1)
log_admin("[key_name(usr)] created a [english_list(paths)]")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 7a222d1ebc..f97822a043 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1249,7 +1249,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
return
- var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
+ var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1277,6 +1277,22 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/turf/startT = spaceDebrisStartLoc(startside, T.z)
var/turf/endT = spaceDebrisFinishLoc(startside, T.z)
new /obj/effect/immovablerod(startT, endT,target)
+ if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK)
+ var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text
+ var/obj/structure/closet/supplypod/centcompod/pod = new()
+ pod.damage = 40
+ pod.explosionSize = list(0,0,0,2)
+ pod.effectStun = TRUE
+ if (isnull(target_path)) //The user pressed "Cancel"
+ return
+ if (target_path != "empty")//if you didn't type empty, we want to load the pod with a delivery
+ var/delivery = text2path(target_path)
+ if(!ispath(delivery))
+ delivery = pick_closest_path(target_path)
+ if(!delivery)
+ alert("ERROR: Incorrect / improper path given.")
+ new delivery(pod)
+ new /obj/effect/abstract/DPtarget(get_turf(target), pod)
if(ADMIN_PUNISHMENT_SUPPLYPOD)
var/datum/centcom_podlauncher/plaunch = new(usr)
if(!holder)
@@ -1289,6 +1305,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
plaunch.temp_pod.explosionSize = list(0,0,0,2)
plaunch.temp_pod.effectStun = TRUE
plaunch.ui_interact(usr)
+ return //We return here because punish_log() is handled by the centcom_podlauncher datum
if(ADMIN_PUNISHMENT_MAZING)
if(!puzzle_imprison(target))
@@ -1298,11 +1315,13 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
creamy.splat(target)
- var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]."
- message_admins(msg)
- admin_ticket_log(target, msg)
- log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].")
+ punish_log(target, punishment)
+/client/proc/punish_log(var/whom, var/punishment)
+ var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
+ message_admins(msg)
+ admin_ticket_log(whom, msg)
+ log_admin("[key_name(usr)] punished [key_name(whom)] with [punishment].")
/client/proc/trigger_centcom_recall()
if(!check_rights(R_ADMIN))
diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm
index b37c007664..953b876b35 100644
--- a/code/modules/antagonists/blob/blob/theblob.dm
+++ b/code/modules/antagonists/blob/blob/theblob.dm
@@ -244,6 +244,7 @@
return ..()
/obj/structure/blob/proc/chemeffectreport()
+ RETURN_TYPE(/list)
. = list()
if(overmind)
. += "Material: [overmind.blob_reagent_datum.name]."
@@ -253,6 +254,7 @@
. += "No Material Detected! "
/obj/structure/blob/proc/typereport()
+ RETURN_TYPE(/list)
. = list("Blob Type:[uppertext(initial(name))]")
. += "Health:[obj_integrity]/[max_integrity]"
. += "Effects:[scannerreport()]"
diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm
index 72d8a127ab..1e06fb39de 100644
--- a/code/modules/antagonists/changeling/powers/headcrab.dm
+++ b/code/modules/antagonists/changeling/powers/headcrab.dm
@@ -25,7 +25,8 @@
to_chat(H, "You are blinded by a shower of blood!")
H.Stun(20)
H.blur_eyes(20)
- H.adjust_eye_damage(5)
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ eyes?.applyOrganDamage(5)
H.confused += 3
for(var/mob/living/silicon/S in range(2,user))
to_chat(S, "Your sensors are disabled by a shower of blood!")
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index 58835e0cd4..d4d5349c70 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -162,9 +162,11 @@
access_display(user)
/obj/item/clockwork/slab/AltClick(mob/living/user)
+ . = ..()
if(is_servant_of_ratvar(user) && linking && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
linking = null
to_chat(user, "Object link canceled.")
+ return TRUE
/obj/item/clockwork/slab/proc/access_display(mob/living/user)
if(!is_servant_of_ratvar(user))
diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
index 9d241148b4..2a916c7a2f 100644
--- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
+++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm
@@ -48,10 +48,11 @@
/obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim)
if(iscultist(victim))
+ var/obj/item/organ/eyes/eyes = victim.getorganslot(ORGAN_SLOT_EYES)
to_chat(victim, "\"It looks like Nar'Sie's dogs really don't value their eyes.\"")
to_chat(victim, "Your eyes explode with horrific pain!")
victim.emote("scream")
- victim.become_blind(EYE_DAMAGE)
+ eyes?.applyOrganDamage(eyes.maxHealth)
victim.adjust_blurriness(30)
victim.adjust_blindness(30)
return TRUE
@@ -141,21 +142,23 @@
if(glasses_right && !WS.up && !GLOB.ratvar_awakens && !GLOB.ratvar_approaches)
apply_eye_damage(H)
else
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(GLOB.ratvar_awakens)
H.cure_nearsighted(list(EYE_DAMAGE))
H.cure_blind(list(EYE_DAMAGE))
- H.adjust_eye_damage(-eye_damage_done)
+ eyes?.applyOrganDamage(-eye_damage_done)
eye_damage_done = 0
else if(prob(50) && eye_damage_done)
- H.adjust_eye_damage(-1)
+ eyes?.applyOrganDamage(-1)
eye_damage_done = max(0, eye_damage_done - 1)
if(!eye_damage_done)
qdel(src)
/datum/status_effect/wraith_spectacles/proc/apply_eye_damage(mob/living/carbon/human/H)
- if(HAS_TRAIT(H, TRAIT_BLIND))
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ if(HAS_TRAIT(H, TRAIT_BLIND) || !eyes)
return
- H.adjust_eye_damage(0.5)
+ eyes.applyOrganDamage(0.5)
eye_damage_done += 0.5
if(eye_damage_done >= 20)
H.adjust_blurriness(2)
@@ -166,7 +169,7 @@
if(eye_damage_done >= blind_breakpoint)
if(!HAS_TRAIT(H, TRAIT_BLIND))
to_chat(H, "A piercing white light floods your vision. Suddenly, all goes dark!")
- H.become_blind(EYE_DAMAGE)
+ eyes.applyOrganDamage(eyes.maxHealth)
if(prob(min(20, 5 + eye_damage_done)))
to_chat(H, "Your eyes continue to burn.")
diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
index 47faea6dc8..86099d8c79 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
@@ -98,7 +98,7 @@
else
to_chat(M, message)
-/mob/camera/eminence/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/camera/eminence/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(is_reebe(z) || is_servant_of_ratvar(speaker) || GLOB.ratvar_approaches || GLOB.ratvar_awakens) //Away from Reebe, the Eminence can't hear anything
to_chat(src, message)
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
index 9989058d43..df2383f892 100644
--- a/code/modules/antagonists/cult/cult.dm
+++ b/code/modules/antagonists/cult/cult.dm
@@ -128,7 +128,8 @@
current.clear_alert("bloodsense")
if(ishuman(current))
var/mob/living/carbon/human/H = current
- H.eye_color = initial(H.eye_color)
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ H.eye_color = eyes?.eye_color || initial(H.eye_color)
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
REMOVE_TRAIT(H, TRAIT_CULT_EYES, "valid_cultist")
H.update_body()
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index 6ac3f93764..516f30d896 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -117,7 +117,7 @@ the new instance inside the host to be updated to the template's stats.
follow_next(Dir & NORTHWEST)
last_move_tick = world.time
-/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
@@ -129,7 +129,7 @@ the new instance inside the host to be updated to the template's stats.
else
link = ""
// Recompose the message, because it's scrambled by default
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)
to_chat(src, "[link] [message]")
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index 17d200a685..d6582a294f 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -5,7 +5,7 @@
ShiftClickOn(A)
return
if(modifiers["alt"])
- AltClickNoInteract(src, A)
+ altclick_listed_turf(A)
return
if(ishuman(A))
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index c1f8d6d349..ac19df3631 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -23,7 +23,6 @@
owner.special_role = special_role
if(give_objectives)
forge_traitor_objectives()
- RegisterSignal(owner.current, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
finalize_traitor()
..()
@@ -49,17 +48,17 @@
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
- UnregisterSignal(owner.current, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
SSticker.mode.traitors -= owner
if(!silent && owner.current)
to_chat(owner.current," You are no longer the [special_role]! ")
owner.special_role = null
+ . = ..()
/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args)
- var/message = hearing_args[HEARING_MESSAGE]
+ var/message = hearing_args[HEARING_RAW_MESSAGE]
message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1")
message = GLOB.syndicate_code_response_regex.Replace(message, "$1")
- hearing_args[HEARING_MESSAGE] = message
+ hearing_args[HEARING_RAW_MESSAGE] = message
/datum/antagonist/traitor/proc/add_objective(datum/objective/O)
objectives += O
@@ -261,16 +260,20 @@
/datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override)
. = ..()
update_traitor_icons_added()
- var/mob/living/silicon/ai/A = mob_override || owner.current
- if(istype(A) && traitor_kind == TRAITOR_AI)
+ var/mob/M = mob_override || owner.current
+ if(isAI(M) && traitor_kind == TRAITOR_AI)
+ var/mob/living/silicon/ai/A = M
A.hack_software = TRUE
+ RegisterSignal(M, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
/datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override)
. = ..()
update_traitor_icons_removed()
- var/mob/living/silicon/ai/A = mob_override || owner.current
- if(istype(A) && traitor_kind == TRAITOR_AI)
+ var/mob/M = mob_override || owner.current
+ if(isAI(M) && traitor_kind == TRAITOR_AI)
+ var/mob/living/silicon/ai/A = M
A.hack_software = FALSE
+ UnregisterSignal(M, COMSIG_MOVABLE_HEAR)
/datum/antagonist/traitor/proc/give_codewords()
if(!owner.current)
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 7ad5f827e1..f72f726988 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -25,7 +25,7 @@
. = ..()
. += "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode."
-/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(speaker == src)
return
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index cafdafb671..196bf70fdc 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -72,11 +72,13 @@
air.copy_from(copy)
/turf/return_air()
+ RETURN_TYPE(/datum/gas_mixture)
var/datum/gas_mixture/GM = new
GM.copy_from_turf(src)
return GM
/turf/open/return_air()
+ RETURN_TYPE(/datum/gas_mixture)
return air
/turf/temperature_expose()
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 58ab9c6183..cbbfc05f39 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -823,11 +823,11 @@
return ..()
/obj/machinery/airalarm/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
- else
- togglelock(user)
+ togglelock(user)
+ return TRUE
/obj/machinery/airalarm/proc/togglelock(mob/living/user)
if(stat & (NOPOWER|BROKEN))
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 2e4cccf5a3..ee4d1bda11 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -338,10 +338,9 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/AltClick(mob/living/L)
- if(is_type_in_list(src, GLOB.ventcrawl_machinery))
- L.handle_ventcrawl(src)
- return
- ..()
+ if(is_type_in_typecache(src, GLOB.ventcrawl_machinery))
+ return L.handle_ventcrawl(src)
+ return ..()
/obj/machinery/atmospherics/proc/can_crawl_through()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index b95b15efbd..c05c3bb3c9 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -44,6 +44,7 @@ Thus, the two variables affect pump operation are set in New():
return ..()
/obj/machinery/atmospherics/components/binary/pump/AltClick(mob/user)
+ . = ..()
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
@@ -51,6 +52,7 @@ Thus, the two variables affect pump operation are set in New():
to_chat(user,"You maximize the pressure on the [src].")
investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ return TRUE
/obj/machinery/atmospherics/components/binary/pump/layer1
piping_layer = PIPING_LAYER_MIN
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index ae3eb8a877..adca444b10 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -28,6 +28,7 @@
return ..()
/obj/machinery/atmospherics/components/trinary/filter/AltClick(mob/user)
+ . = ..()
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
@@ -35,6 +36,7 @@
to_chat(user,"You maximize the flow rate on the [src].")
investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ return TRUE
/obj/machinery/atmospherics/components/trinary/filter/layer1
piping_layer = PIPING_LAYER_MIN
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index 9e4deaf3d8..9646b78321 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -30,6 +30,7 @@
return ..()
/obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user)
+ . = ..()
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
@@ -37,6 +38,7 @@
to_chat(user,"You maximize the pressure on the [src].")
investigate_log("Mixer, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Mixer, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ return TRUE
//node 3 is the outlet, nodes 1 & 2 are intakes
/obj/machinery/atmospherics/components/trinary/mixer/layer1
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index ca8b21593f..0a54503be5 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -399,13 +399,14 @@
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(state_open)
close_machine()
else
open_machine()
update_icon()
- return ..()
+ return TRUE
/obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user)
return // we don't see the pipe network while inside cryo.
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index 4f16406456..4dd2216b19 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -36,6 +36,10 @@
icon_state = "red"
gas_type = /datum/gas/nitrogen
+/obj/machinery/atmospherics/components/unary/tank/nitrous_oxide
+ icon_state = "red_white"
+ gas_type = /datum/gas/nitrous_oxide
+
/obj/machinery/atmospherics/components/unary/tank/air
icon_state = "grey"
name = "pressure tank (Air)"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index b52dc158e4..2e06e68709 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -210,13 +210,15 @@
min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user)
+ . = ..()
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
- target_temperature = min_temperature
+ target_temperature = min_temperature
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ return TRUE
/obj/machinery/atmospherics/components/unary/thermomachine/heater
name = "heater"
@@ -240,6 +242,7 @@
max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts
/obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user)
+ . = ..()
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
@@ -247,3 +250,4 @@
target_temperature = max_temperature
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ return TRUE
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 81540b0698..b47b6b42c1 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -81,11 +81,13 @@
return air_contents
/obj/machinery/portable_atmospherics/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, !ismonkey(user)))
return
if(holding)
to_chat(user, "You remove [holding] from [src].")
replace_tank(user, TRUE)
+ return TRUE
/obj/machinery/portable_atmospherics/examine(mob/user)
. = ..()
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index f57374db7c..c45461317d 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -19,7 +19,7 @@
//Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc
//Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch)
/datum/centcom_podlauncher
- var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector ))
+ var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/abstract/DPtarget, /obj/effect/supplypod_selector ))
var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back
var/client/holder //client of whoever is using this datum
var/area/bay //What bay we're using to launch shit from.
@@ -29,9 +29,10 @@
var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2)
var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor
var/effectBurst = FALSE //Effect that launches 5 at once in a 3x3 area centered on the target
+ var/effectAnnounce = TRUE
var/numTurfs = 0 //Counts the number of turfs with things we can launch in the chosen bay (in the centcom map)
var/launchCounter = 1 //Used with the "Ordered" launch mode (launchChoice = 1) to see what item is launched
- var/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting
+ var/atom/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting
var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1)
var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea
var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs
@@ -66,12 +67,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1)
data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2)
data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2)
+ data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts
data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching
data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing
data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom)
data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
+ data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands
data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing
data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land
data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
@@ -81,12 +84,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites
data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
+ data["effectAnnounce"] = effectAnnounce
data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target)
data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay
+ data["fallingSound"] = temp_pod.fallingSound != initial(temp_pod.fallingSound)//Admin sound to play as the pod falls
data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands
data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens
data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves
- data["soundVolume"] = temp_pod.soundVolume != 50 //Admin sound to play when the pod leaves
+ data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves
return data
/datum/centcom_podlauncher/ui_act(action, params)
@@ -227,6 +232,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("effectLimb") //Toggle: Anyone carbon mob under the pod loses a limb when it lands
temp_pod.effectLimb = !temp_pod.effectLimb
. = TRUE
+ if("effectOrgans") //Toggle: Any carbon mob under the pod loses every limb and organ
+ temp_pod.effectOrgans = !temp_pod.effectOrgans
+ . = TRUE
if("effectBluespace") //Toggle: Deletes the pod after landing
temp_pod.bluespace = !temp_pod.bluespace
. = TRUE
@@ -245,6 +253,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("effectBurst") //Toggle: Launch 5 pods (with a very slight delay between) in a 3x3 area centered around the target
effectBurst = !effectBurst
. = TRUE
+ if("effectAnnounce") //Toggle: Sends a ghost announcement.
+ effectAnnounce = !effectAnnounce
+ . = TRUE
if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from
temp_pod.reversing = !temp_pod.reversing
. = TRUE
@@ -261,11 +272,23 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
. = TRUE
////////////////////////////TIMER DELAYS//////////////////
+ if("fallDuration") //Change the falling animation duration
+ if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the fall duration has already been changed when we push the "change value" button, then set it to default
+ temp_pod.fallDuration = initial(temp_pod.fallDuration)
+ return
+ var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num
+ if (isnull(timeInput))
+ return
+ if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default
+ alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.")
+ timeInput = initial(temp_pod.fallDuration)
+ temp_pod.fallDuration = 10 * timeInput
+ . = TRUE
if("landingDelay") //Change the time it takes the pod to land, after firing
if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default
temp_pod.landingDelay = initial(temp_pod.landingDelay)
return
- var/timeInput = input("Delay Time", "Enter the time it takes for the pod to land, in seconds", 0.5) as null|num
+ var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default
@@ -277,7 +300,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default
temp_pod.openingDelay = initial(temp_pod.openingDelay)
return
- var/timeInput = input("Delay Time", "Enter the time it takes for the pod to open after landing, in seconds", 3) as null|num
+ var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput)) //Sanitize input
@@ -289,7 +312,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default
temp_pod.departureDelay = initial(temp_pod.departureDelay)
return
- var/timeInput = input("Delay Time", "Enter the time it takes for the pod to leave after opening, in seconds", 3) as null|num
+ var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput))
@@ -299,31 +322,57 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
. = TRUE
////////////////////////////ADMIN SOUNDS//////////////////
+ if("fallingSound") //Admin sound from a local file that plays when the pod falls
+ if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound))
+ temp_pod.fallingSound = initial(temp_pod.fallingSound)
+ temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength)
+ return
+ var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound
+ if (isnull(soundInput))
+ return
+ var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num
+ if (isnull(timeInput))
+ return
+ if (!isnum(timeInput))
+ alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.")
+ temp_pod.fallingSound = soundInput
+ temp_pod.fallingSoundLength = 10 * timeInput
+ . = TRUE
if("landingSound") //Admin sound from a local file that plays when the pod lands
if (!isnull(temp_pod.landingSound))
temp_pod.landingSound = null
return
- temp_pod.landingSound = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound
+ var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound
+ if (isnull(soundInput))
+ return
+ temp_pod.landingSound = soundInput
. = TRUE
if("openingSound") //Admin sound from a local file that plays when the pod opens
if (!isnull(temp_pod.openingSound))
temp_pod.openingSound = null
return
- temp_pod.openingSound = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound
+ var/soundInput = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound
+ if (isnull(soundInput))
+ return
+ temp_pod.openingSound = soundInput
. = TRUE
if("leavingSound") //Admin sound from a local file that plays when the pod leaves
if (!isnull(temp_pod.leavingSound))
temp_pod.leavingSound = null
return
- temp_pod.leavingSound = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound
+ var/soundInput = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound
+ if (isnull(soundInput))
+ return
+ temp_pod.leavingSound = soundInput
. = TRUE
if("soundVolume") //Admin sound from a local file that plays when the pod leaves
- if (temp_pod.soundVolume != 50)
- temp_pod.soundVolume = 50
+ if (temp_pod.soundVolume != initial(temp_pod.soundVolume))
+ temp_pod.soundVolume = initial(temp_pod.soundVolume)
return
- temp_pod.soundVolume = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num
- if (isnull(temp_pod.soundVolume))
- temp_pod.soundVolume = 50
+ var/soundInput = input(holder, "Please pick a volume. Default is between 1 and 100 with 80 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num
+ if (isnull(soundInput))
+ return
+ temp_pod.soundVolume = soundInput
. = TRUE
////////////////////////////STYLE CHANGES//////////////////
//Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines)
@@ -364,6 +413,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("styleGondola")
temp_pod.setStyle(STYLE_GONDOLA)
. = TRUE
+ if("styleSeeThrough")
+ temp_pod.setStyle(STYLE_SEETHROUGH)
+ . = TRUE
if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod
refreshBay()
. = TRUE
@@ -403,12 +455,17 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if(left_click) //When we left click:
preLaunch() //Fill the acceptableTurfs list from the orderedArea list. Then, fill up the launchList list with items from the acceptableTurfs list based on the manner of launch (ordered, random, etc)
if (!isnull(specificTarget))
- target = get_turf(specificTarget) //if we have a specific mob target, then always launch the pod at the turf of the mob
+ target = get_turf(specificTarget) //if we have a specific target, then always launch the pod at the turf of the target
else if (target)
target = get_turf(target) //Make sure we're aiming at a turf rather than an item or effect or something
else
return //if target is null and we don't have a specific target, cancel
-
+ if (effectAnnounce)
+ deadchat_broadcast("A special package is being launched at the station!", turf_target = target)
+ var/list/bouttaDie = list()
+ for (var/mob/living/M in target)
+ bouttaDie.Add(M)
+ supplypod_punish_log(bouttaDie)
if (!effectBurst) //If we're not using burst mode, just launch normally.
launch(target)
else
@@ -422,7 +479,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
else
launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target
sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire.
- log_admin("Centcom Supplypod Launch: [key_name(user)] launched a supplypod in [AREACOORD(target)]")
/datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched
orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay
@@ -486,11 +542,11 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those
for (var/atom/movable/O in launchList)
DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod
- new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location
+ new /obj/effect/abstract/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location
else
for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList
O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod
- new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
+ new /obj/effect/abstract/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
if (launchClone)
launchCounter++ //We only need to increment launchCounter if we are cloning objects.
//If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order
@@ -508,4 +564,26 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode
qdel(temp_pod) //Delete the temp_pod
qdel(selector) //Delete the selector effect
- . = ..()
\ No newline at end of file
+ . = ..()
+
+/datum/centcom_podlauncher/proc/supplypod_punish_log(var/list/whoDyin)
+ var/podString = effectBurst ? "5 pods" : "a pod"
+ var/whomString = ""
+ if (LAZYLEN(whoDyin))
+ for (var/mob/living/M in whoDyin)
+ whomString += "[key_name(M)], "
+
+ var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s"
+ var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]"
+ var/explosionString = ""
+ var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4]
+ if (explosion_sum != 0)
+ explosionString = " Boom=|"
+ for (var/X in temp_pod.explosionSize)
+ explosionString += "[X]|"
+
+ var/msg = "launched [podString][whomString].[delayString][damageString][explosionString]]"
+ message_admins("[key_name_admin(usr)] [msg] in [AREACOORD(specificTarget)].")
+ if (!isemptylist(whoDyin))
+ for (var/mob/living/M in whoDyin)
+ admin_ticket_log(M, "[key_name_admin(usr)] [msg]")
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index 6170c80f8e..e38e5b55b9 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -183,7 +183,7 @@
LZ = pick(empty_turfs)
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
SSshuttle.points -= SO.pack.cost
- new /obj/effect/DPtarget(LZ, podType, SO)
+ new /obj/effect/abstract/DPtarget(LZ, podType, SO)
. = TRUE
update_icon()
else
@@ -200,7 +200,7 @@
for(var/i in 1 to MAX_EMAG_ROCKETS)
var/LZ = pick(empty_turfs)
LAZYREMOVE(empty_turfs, LZ)
- new /obj/effect/DPtarget(LZ, podType, SO)
+ new /obj/effect/abstract/DPtarget(LZ, podType, SO)
. = TRUE
update_icon()
CHECK_TICK
diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm
index b507b617c3..7b78facf00 100644
--- a/code/modules/cargo/gondolapod.dm
+++ b/code/modules/cargo/gondolapod.dm
@@ -39,7 +39,14 @@
set name = "Release Contents"
set category = "Gondola"
set desc = "Release any contents stored within your vast belly."
- linked_pod.open(src)
+ linked_pod.open(src, forced = TRUE)
+
+/mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user)
+ ..()
+ if (contents.len)
+ to_chat(user, "It looks like it hasn't made its delivery yet.")
+ else
+ to_chat(user, "It looks like it has already made its delivery.")
/mob/living/simple_animal/pet/gondola/gondolapod/verb/check()
set name = "Count Contents"
@@ -47,7 +54,7 @@
set desc = "Take a deep look inside youself, and count up what's inside"
var/total = contents.len
if (total)
- to_chat(src, "You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.")
+ to_chat(src, "You detect [total] object\s within your incredibly vast belly.")
else
to_chat(src, "A closer look inside yourself reveals... nothing.")
diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm
index ee983784fe..58677814a6 100644
--- a/code/modules/cargo/packs/armory.dm
+++ b/code/modules/cargo/packs/armory.dm
@@ -61,7 +61,7 @@
/datum/supply_pack/security/armory/dragnetgun
name = "DRAGnet gun Crate"
- desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open."
+ desc = "Contains two DRAGnet guns. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open."
cost = 3250
contains = list(/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet)
diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm
index 1987369d20..30153ef077 100644
--- a/code/modules/cargo/packs/emergency.dm
+++ b/code/modules/cargo/packs/emergency.dm
@@ -44,8 +44,51 @@
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
+/datum/supply_pack/emergency/medicalemergency
+ name = "Emergency Medical Supplies" //Almost all of this can be ordered seperatly for a much cheaper price, but the HUD increases it.
+ desc = "Emergency supplies for a front-line medic. Contains two boxes of body bags, a medical HUD, a defib unit, medical belt, toxin bottles, epipens, and several types of medical kits."
+ cost = 10000
+ contains = list(/obj/item/storage/box/bodybags,
+ /obj/item/storage/box/bodybags,
+ /obj/item/clothing/glasses/hud/health,
+ /obj/item/defibrillator/loaded,
+ /obj/item/storage/belt/medical,
+ /obj/item/storage/firstaid/toxin,
+ /obj/item/storage/firstaid/o2,
+ /obj/item/storage/firstaid/brute,
+ /obj/item/storage/firstaid/fire,
+ /obj/item/reagent_containers/glass/bottle/toxin,
+ /obj/item/reagent_containers/glass/bottle/toxin,
+ /obj/item/storage/box/medipens)
+ crate_name = "medical emergency crate"
+ crate_type = /obj/structure/closet/crate/medical
+
+/datum/supply_pack/emergency/medemergencylite
+ name = "Emergency Medical Supplies (Lite)"
+ desc = "A less than optimal, but still effective, set of tools for emergency care. Contains a box of bodybags, some normal (and advanced) health analyzers, healing sprays, a single first aid kit, charcoal, some gauze, a bottle of toxins, and some spare medipens."
+ cost = 2800
+ contains = list(/obj/item/storage/box/bodybags,
+ /obj/item/stack/medical/gauze,
+ /obj/item/stack/medical/gauze,
+ /obj/item/healthanalyzer,
+ /obj/item/healthanalyzer,
+ /obj/item/healthanalyzer/advanced,
+ /obj/item/storage/firstaid/regular,
+ /obj/item/reagent_containers/medspray/styptic,
+ /obj/item/reagent_containers/medspray/silver_sulf,
+ /obj/item/reagent_containers/medspray/synthflesh,
+ /obj/item/reagent_containers/glass/bottle/charcoal,
+ /obj/item/reagent_containers/glass/bottle/charcoal,
+ /obj/item/reagent_containers/glass/bottle/toxin,
+ /obj/item/reagent_containers/hypospray/medipen,
+ /obj/item/reagent_containers/hypospray/medipen,
+ /obj/item/reagent_containers/hypospray/medipen,
+ /obj/item/reagent_containers/hypospray/medipen)
+ crate_name = "medical emergency crate (lite)"
+ crate_type = /obj/structure/closet/crate/medical
+
/datum/supply_pack/emergency/radiatione_emergency
- name = "Emergenc Radiation Protection Crate"
+ name = "Emergency Radiation Protection Crate"
desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning."
cost = 2500
contains = list(/obj/item/clothing/head/radiation,
@@ -61,7 +104,7 @@
/datum/supply_pack/emergency/rcds
name = "Emergency RCDs"
- desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!"
+ desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of RCDs to be able to easily fix up any problem you may have!"
cost = 1500
contains = list(/obj/item/construction/rcd,
/obj/item/construction/rcd)
@@ -70,7 +113,7 @@
/datum/supply_pack/emergency/soft_suit
name = "Emergency Space Suit "
- desc = "Is there bombs going off left and right? Is there meteors shooting around the station? Well we have two fragile space suit for emergencys as well as air and masks."
+ desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suit for emergencies. Comes with air and masks."
cost = 1200
contains = list(/obj/item/tank/internals/air,
/obj/item/tank/internals/air,
@@ -137,6 +180,18 @@
/obj/item/storage/box/metalfoam)
crate_name = "metal foam grenade crate"
+/datum/supply_pack/emergency/mre
+ name = "MRE supply kit (emergency rations)"
+ desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
+ cost = 2000
+ contains = list(/obj/item/storage/box/mre/menu1/safe,
+ /obj/item/storage/box/mre/menu1/safe,
+ /obj/item/storage/box/mre/menu2/safe,
+ /obj/item/storage/box/mre/menu2/safe,
+ /obj/item/storage/box/mre/menu3,
+ /obj/item/storage/box/mre/menu4/safe)
+ crate_name = "MRE crate (emergency rations)"
+
/datum/supply_pack/emergency/syndicate
name = "NULL_ENTRY"
desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() "
@@ -205,7 +260,6 @@
name = "Space Suit Crate"
desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open."
cost = 3000
- access = ACCESS_EVA
contains = list(/obj/item/clothing/suit/space,
/obj/item/clothing/suit/space,
/obj/item/clothing/head/helmet/space,
@@ -254,22 +308,3 @@
crate_name = "weed control crate"
crate_type = /obj/structure/closet/crate/secure/hydroponics
-/datum/supply_pack/medical/anitvirus
- name = "Virus Containment Crate"
- desc = "Viro let out a death plague Mk II again? Someone didnt wash there hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it brakes out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
- cost = 3000
- access = ACCESS_MEDICAL
- contains = list(/mob/living/simple_animal/bot/medbot,
- /obj/item/clothing/head/bio_hood,
- /obj/item/clothing/head/bio_hood,
- /obj/item/clothing/suit/bio_suit,
- /obj/item/clothing/suit/bio_suit,
- /obj/item/reagent_containers/syringe/antiviral,
- /obj/item/reagent_containers/syringe/antiviral,
- /obj/item/reagent_containers/syringe/antiviral,
- /obj/item/reagent_containers/syringe/antiviral,
- /obj/item/reagent_containers/syringe/antiviral,
- /obj/item/storage/box/syringes,
- /obj/item/storage/box/beakers)
- crate_name = "virus containment unit crate"
- crate_type = /obj/structure/closet/crate/secure/plasma
diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm
index 19cb53489e..f09c9e429d 100644
--- a/code/modules/cargo/packs/engineering.dm
+++ b/code/modules/cargo/packs/engineering.dm
@@ -56,6 +56,7 @@
name = "Engineering Hardsuit"
desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!"
cost = 2250
+ access = ACCESS_ENGINE
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/engine)
@@ -65,7 +66,7 @@
name = "Atmospherics Hardsuit"
desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open."
cost = 5000
- access = ACCESS_CE
+ access = ACCESS_CE //100% Fire and Bio resistance
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/engine/atmos)
@@ -74,7 +75,7 @@
/datum/supply_pack/engineering/industrialrcd
name = "Industrial RCD"
- desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles."
+ desc = "An industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Does not contain spare ammo for the industrial RCD or any other RCD models."
cost = 4500
access = ACCESS_CE
contains = list(/obj/item/construction/rcd/industrial)
@@ -91,15 +92,11 @@
crate_name = "insulated gloves crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
-/obj/item/stock_parts/cell/inducer_supply
- maxcharge = 5000
- charge = 5000
-
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers."
cost = 2300
- contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently.
+ contains = list(/obj/item/inducer/sci/supply, /obj/item/inducer/sci/supply)
crate_name = "inducer crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
@@ -121,18 +118,6 @@
crate_name = "power cell crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
-
-/datum/supply_pack/engineering/siezedpower
- name = "Siezed Power Cell Crate"
- desc = "We took the means of power! Contains three high-voltage plus power cells."
- cost = 1300
- contraband = TRUE
- contains = list(/obj/item/stock_parts/cell/high/plus,
- /obj/item/stock_parts/cell/high/plus,
- /obj/item/stock_parts/cell/high/plus)
- crate_name = "siezed crate"
- crate_type = /obj/structure/closet/crate/engineering/electrical
-
/datum/supply_pack/engineering/shuttle_engine
name = "Shuttle Engine Crate"
desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open."
@@ -142,22 +127,6 @@
crate_name = "shuttle engine crate"
crate_type = /obj/structure/closet/crate/secure/engineering
-/datum/supply_pack/engineering/siezedproduction
- name = "The Means of Production"
- desc = "We will win for we have took over the production! S five metal sheets, five wire, three matter bins, one manipulater and one sheet of glass."
- cost = 1500
- contraband = TRUE
- contains = list(/obj/item/stock_parts/cell/high/plus,
- /obj/item/circuitboard/machine/autolathe,
- /obj/item/stack/cable_coil/random/five,
- /obj/item/stack/sheet/metal/five,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/manipulator,
- /obj/item/stack/sheet/glass,)
- crate_name = "siezed crate"
-
/datum/supply_pack/engineering/tools
name = "Toolbox Crate"
desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes."
@@ -184,7 +153,7 @@
/datum/supply_pack/engineering/dna_vault
name = "DNA Vault Parts"
- desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes."
+ desc = "Secure the longevity of the current state of civilization within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." //C'mon now, it's nae just humans on the station these days
cost = 12000
special = TRUE
contains = list(
diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm
index 9ab1827784..1b55c0540a 100644
--- a/code/modules/cargo/packs/livestock.dm
+++ b/code/modules/cargo/packs/livestock.dm
@@ -58,7 +58,7 @@
name = "Chicken Crate"
desc = "The chicken goes bwaak!"
cost = 2000
- contains = list( /mob/living/simple_animal/chick)
+ contains = list(/mob/living/simple_animal/chick)
crate_name = "chicken crate"
/datum/supply_pack/critter/crab
@@ -135,7 +135,7 @@
/obj/item/clothing/neck/petcollar)
crate_name = "pug crate"
-/datum/supply_pack/organic/critter/kiwi
+/datum/supply_pack/critter/kiwi
name = "Space kiwi Crate"
cost = 2000
contains = list( /mob/living/simple_animal/kiwi)
@@ -150,6 +150,18 @@
/mob/living/simple_animal/hostile/retaliate/poison/snake)
crate_name = "snake crate"
+/datum/supply_pack/critter/mouse
+ name = "Mouse Crate"
+ desc = "Good for snakes and lizards of all ages. Contains ~12 feeder mice."
+ cost = 2000
+ contains = list(/mob/living/simple_animal/mouse,)
+ crate_name = "mouse crate"
+
+/datum/supply_pack/critter/mouse/generate()
+ . = ..()
+ for(var/i in 1 to 11)
+ new /mob/living/simple_animal/mouse(.)
+
/datum/supply_pack/critter/secbat
name = "Security Bat Crate"
desc = "Contains five security bats, perfect to Bat-up any security officer."
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 615fbfe827..c9862282dc 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -9,6 +9,10 @@
/datum/supply_pack/materials
group = "Canisters & Materials"
+//////////////////////////////////////////////////////////////////////////////
+///////////////////////////// Materials //////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
/datum/supply_pack/materials/cardboard50
name = "50 Cardboard Sheets"
desc = "Create a bunch of boxes."
@@ -58,6 +62,13 @@
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
crate_name = "sandstone blocks crate"
+/datum/supply_pack/materials/rawlumber
+ name = "50 Towercap Logs"
+ desc = "Raw logs from towercaps. Contains fifty logs."
+ cost = 1000
+ contains = list(/obj/item/grown/log)
+ crate_name = "lumber crate"
+
/datum/supply_pack/materials/wood50
name = "50 Wood Planks"
desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
@@ -65,22 +76,31 @@
contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
crate_name = "wood planks crate"
-/datum/supply_pack/organic/rawcotton
+/datum/supply_pack/materials/rawcotton
name = "Raw Cotton Crate"
desc = "Plushies have been on the down in the market, and now due to a flood of raw cotton the price of it is so cheap, its a steal! Contains 40 raw cotton sheets."
- cost = 800 // 100 net cost, 20 x 20 = 400. 300 proffit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000
+ cost = 800 // 100 net cost, 20 x 20 = 400. 300 profit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000
contains = list(/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/ten
)
crate_name = "cotton crate"
crate_type = /obj/structure/closet/crate/hydroponics
-/datum/supply_pack/organic/rawlumber
- name = "Raw Lumber Crate"
- desc = "Raw logs from towercaps. Contains fifty logs."
- cost = 1000
- contains = list(/obj/item/grown/log)
- crate_name = "lumber crate"
+/datum/supply_pack/materials/rawcottonbulk
+ name = "Raw Cotton Crate (Bulk)"
+ desc = "We have so much of this stuff we need to get rid of it in -bulk- now. This crate contains 240 raw cotton sheets."
+ cost = 1300 // 100 net cost (per 40 cotton) , 20 x 20 = 400. 300 profit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000
+ contains = list(/obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ /obj/item/stack/sheet/cotton/thirty,
+ )
+ crate_name = "bulk cotton crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/critter/animal_feed/generate()
. = ..()
@@ -89,7 +109,7 @@
/datum/supply_pack/materials/rcdammo
name = "Spare RDC ammo"
- desc = "This crate contains sixteen RCD ammo packs, to help with any holes or projects people mite be working on."
+ desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on."
cost = 3750
contains = list(/obj/item/rcd_ammo,
/obj/item/rcd_ammo,
@@ -109,6 +129,18 @@
/obj/item/rcd_ammo)
crate_name = "rcd ammo"
+/datum/supply_pack/materials/loom
+ name = "Loom"
+ desc = "A large pre-made loom."
+ cost = 1000
+ contains = list(/obj/structure/loom/unanchored)
+ crate_name = "loom crate"
+ crate_type = /obj/structure/closet/crate/large
+
+//////////////////////////////////////////////////////////////////////////////
+///////////////////////////// Canisters //////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
/datum/supply_pack/materials/bz
name = "BZ Canister Crate"
desc = "Contains a canister of BZ. Requires Toxins access to open."
@@ -159,6 +191,10 @@
crate_name = "water vapor canister crate"
crate_type = /obj/structure/closet/crate/large
+//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////// Tanks ////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
/datum/supply_pack/materials/fueltank
name = "Fuel Tank Crate"
desc = "Contains a welding fuel tank. Caution, highly flammable."
@@ -191,18 +227,4 @@
crate_name = "high-capacity water tank crate"
crate_type = /obj/structure/closet/crate/large
-/datum/supply_pack/materials/loom
- name = "Loom"
- desc = "A large pre-made loom."
- cost = 1000
- contains = list(/obj/structure/loom)
- crate_name = "loom crate"
- crate_type = /obj/structure/closet/crate/large
-/datum/supply_pack/materials/wooden_barrel
- name = "Wooden Barrel"
- desc = "Wooden barrels ready for storage."
- cost = 1500
- contains = list(/obj/structure/fermenting_barrel)
- crate_name = "wooden barrel crate"
- crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 656474cc1d..1e5097fd11 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -10,6 +10,16 @@
group = "Medical"
crate_type = /obj/structure/closet/crate/medical
+/datum/supply_pack/medical/bodybags
+ name = "Bodybags"
+ desc = "For when the bodies hit the floor. Contains 4 boxes of bodybags."
+ cost = 1200
+ contains = list(/obj/item/storage/box/bodybags,
+ /obj/item/storage/box/bodybags,
+ /obj/item/storage/box/bodybags,
+ /obj/item/storage/box/bodybags,)
+ crate_name = "bodybag crate"
+
/datum/supply_pack/medical/firstaidbruises
name = "Bruise Treatment Kit Crate"
desc = "Contains three first aid kits focused on healing bruises and broken bones."
@@ -30,9 +40,10 @@
/datum/supply_pack/medical/bloodpacks
name = "Blood Pack Variety Crate"
- desc = "Contains ten different blood packs for reintroducing blood to patients."
+ desc = "Contains nine different blood packs for reintroducing blood to patients, plus two universal synthetic blood packs."
cost = 3000
- contains = list(/obj/item/reagent_containers/blood/random,
+ contains = list(/obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/random,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
@@ -46,18 +57,6 @@
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
-/datum/supply_pack/medical/bloodpackssynth
- name = "Synthetics Blood Pack Crate"
- desc = "Contains five synthetics blood packs for reintroducing blood to patients."
- cost = 3000
- contains = list(/obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics)
- crate_name = "blood freezer"
- crate_type = /obj/structure/closet/crate/freezer
-
/datum/supply_pack/medical/defibs
name = "Defibrillator Crate"
desc = "Contains two defibrillators for bringing the recently deceased back to life."
@@ -85,7 +84,7 @@
/datum/supply_pack/science/adv_surgery_tools
name = "Med-Co Advanced surgery tools"
- desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open."
+ desc = "A full set of Med-Co advanced surgery tools! In addition to that it contains both a can of synthflesh and a can of sterilizine. Requires Surgery access to open."
cost = 5500
access = ACCESS_SURGERY
contains = list(/obj/item/storage/belt/medical/surgery_belt_adv,
@@ -96,8 +95,9 @@
/datum/supply_pack/medical/medicalhardsuit
name = "Medical Hardsuit"
- desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers."
+ desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers. Requires medical access to open."
cost = 2750
+ access = ACCESS_MEDICAL
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/medical)
@@ -174,7 +174,7 @@
/datum/supply_pack/medical/advrad
name = "Radiation Treatment Crate Deluxe"
- desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pill bottle, as well as a radiation treatment deluxe pill bottle!"
+ desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!"
cost = 3500
contains = list(/obj/item/storage/pill_bottle/antirad_plus,
/obj/item/storage/pill_bottle/mutarad,
@@ -226,3 +226,23 @@
crate_name = "virus crate"
crate_type = /obj/structure/closet/crate/secure/plasma
dangerous = TRUE
+
+/datum/supply_pack/medical/anitvirus
+ name = "Virus Containment Crate"
+ desc = "Viro let out a death plague Mk II again? Someone didnt wash their hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it breaks out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
+ cost = 3000
+ access = ACCESS_MEDICAL
+ contains = list(/mob/living/simple_animal/bot/medbot,
+ /obj/item/clothing/head/bio_hood,
+ /obj/item/clothing/head/bio_hood,
+ /obj/item/clothing/suit/bio_suit,
+ /obj/item/clothing/suit/bio_suit,
+ /obj/item/reagent_containers/syringe/antiviral,
+ /obj/item/reagent_containers/syringe/antiviral,
+ /obj/item/reagent_containers/syringe/antiviral,
+ /obj/item/reagent_containers/syringe/antiviral,
+ /obj/item/reagent_containers/syringe/antiviral,
+ /obj/item/storage/box/syringes,
+ /obj/item/storage/box/beakers)
+ crate_name = "virus containment unit crate"
+ crate_type = /obj/structure/closet/crate/secure/plasma
\ No newline at end of file
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index c380d5411e..aa680e1b1e 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -9,6 +9,21 @@
/datum/supply_pack/misc
group = "Miscellaneous Supplies"
+//////////////////////////////////////////////////////////////////////////////
+//////////////////// Paperwork and Writing Supplies //////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/* I did it Kevin
+/datum/supply_pack/misc/abandonedcrate
+ name = "Abandoned Crate"
+ desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE"
+ contraband = TRUE
+ cost = 12800
+ contains = list(/obj/structure/closet/crate/secure/loot)
+ crate_name = "abandoned crate"
+ crate_type = /obj/structure/closet/crate/large
+ dangerous = TRUE
+*/
/datum/supply_pack/misc/artsupply
name = "Art Supplies"
desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!"
@@ -29,39 +44,6 @@
crate_name = "art supply crate"
crate_type = /obj/structure/closet/crate/wooden
-/datum/supply_pack/misc/captain_pen
- name = "Captain Pen"
- desc = "A spare Captain fountain pen."
- access = ACCESS_CAPTAIN
- cost = 10000
- contains = list(/obj/item/pen/fountain/captain)
- crate_name = "captain pen"
- crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
-
-/datum/supply_pack/misc/bicycle
- name = "Bicycle"
- desc = "Nanotrasen reminds all employees to never toy with powers outside their control."
- cost = 1000000
- contains = list(/obj/vehicle/ridden/bicycle)
- crate_name = "Bicycle Crate"
- crate_type = /obj/structure/closet/crate/large
-
-/datum/supply_pack/misc/bigband
- name = "Big Band Instrument Collection"
- desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!"
- cost = 5000
- crate_name = "Big band musical instruments collection"
- contains = list(/obj/item/instrument/violin,
- /obj/item/instrument/guitar,
- /obj/item/instrument/glockenspiel,
- /obj/item/instrument/accordion,
- /obj/item/instrument/saxophone,
- /obj/item/instrument/trombone,
- /obj/item/instrument/recorder,
- /obj/item/instrument/harmonica,
- /obj/structure/piano/unanchored)
- crate_type = /obj/structure/closet/crate/wooden
-
/datum/supply_pack/misc/book_crate
name = "Book Crate"
desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads."
@@ -98,6 +80,15 @@
/obj/item/storage/briefcase)
crate_name = "bureaucracy crate"
+/datum/supply_pack/misc/captain_pen
+ name = "Captain Pen"
+ desc = "A spare Captain fountain pen."
+ access = ACCESS_CAPTAIN
+ cost = 10000
+ contains = list(/obj/item/pen/fountain/captain)
+ crate_name = "captain pen"
+ crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
+
/datum/supply_pack/misc/fountainpens
name = "Calligraphy Crate"
desc = "Sign death warrants in style with these seven executive fountain pens."
@@ -107,14 +98,6 @@
crate_type = /obj/structure/closet/crate/wooden
crate_name = "calligraphy crate"
-/datum/supply_pack/misc/wrapping_paper
- name = "Festive Wrapping Paper Crate"
- desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper."
- cost = 1000
- contains = list(/obj/item/stack/wrapping_paper)
- crate_type = /obj/structure/closet/crate/wooden
- crate_name = "festive wrapping paper crate"
-
/datum/supply_pack/misc/paper_work
name = "Freelance Paper work"
desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (20) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
@@ -143,16 +126,134 @@
)
crate_name = "Paperwork"
-/datum/supply_pack/misc/funeral
- name = "Funeral Supply crate"
- desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers."
- cost = 800
- contains = list(/obj/item/clothing/under/burial,
- /obj/item/reagent_containers/food/snacks/grown/harebell,
- /obj/item/reagent_containers/food/snacks/grown/poppy/geranium
- )
- crate_name = "coffin"
- crate_type = /obj/structure/closet/crate/coffin
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// Entertainment ///////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/misc/randombedsheets
+ name = "Bedsheet Crate (R)"
+ desc = "Snuggle up in some sweet sheets with this assorted bedsheet crate. Each set comes with eight random bedsheets for your slumbering pleasure!"
+ cost = 2000
+ contains = list(/obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random,
+ /obj/item/bedsheet/random) //I'm lazy, and I copy paste stuff.
+ crate_name = "random bedsheet crate"
+
+/datum/supply_pack/misc/coloredsheets
+ name = "Bedsheet Crate (C)"
+ desc = "Give your night life a splash of color with this crate filled with bedsheets! Contains a total of nine different-colored sheets."
+ cost = 1250
+ contains = list(/obj/item/bedsheet/blue,
+ /obj/item/bedsheet/green,
+ /obj/item/bedsheet/orange,
+ /obj/item/bedsheet/purple,
+ /obj/item/bedsheet/red,
+ /obj/item/bedsheet/yellow,
+ /obj/item/bedsheet/brown,
+ /obj/item/bedsheet/black,
+ /obj/item/bedsheet/rainbow)
+ crate_name = "colored bedsheet crate"
+
+/datum/supply_pack/misc/bicycle
+ name = "Bicycle"
+ desc = "Nanotrasen reminds all employees to never toy with powers outside their control."
+ cost = 1000000
+ contains = list(/obj/vehicle/ridden/bicycle)
+ crate_name = "Bicycle Crate"
+ crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/misc/bigband
+ name = "Big Band Instrument Collection"
+ desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!"
+ cost = 5000
+ crate_name = "Big band musical instruments collection"
+ contains = list(/obj/item/instrument/violin,
+ /obj/item/instrument/guitar,
+ /obj/item/instrument/glockenspiel,
+ /obj/item/instrument/accordion,
+ /obj/item/instrument/saxophone,
+ /obj/item/instrument/trombone,
+ /obj/item/instrument/recorder,
+ /obj/item/instrument/harmonica,
+ /obj/structure/piano/unanchored)
+ crate_type = /obj/structure/closet/crate/wooden
+
+/datum/supply_pack/misc/cbtpack
+ name = "CBT Equipment"
+ desc = "(*!&@#CBT is a special term coined by high ranking syndicate operatives for a special form of information extraction. While the training required to use this shipment is highly classified, the distribution of it's contents are not. In addition to this crates unusual contents, we have added a bar of soap.#@*$"
+ hidden = TRUE
+ cost = 2400
+ contains = list(/mob/living/simple_animal/chicken,
+ /obj/item/toy/beach_ball/holoball,
+ /obj/item/melee/baton/cattleprod,
+ /obj/item/soap/syndie)
+ crate_name = "cbt crate"
+ crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/misc/casinocrate
+ name = "Casino Crate"
+ desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!"
+ cost = 3000
+ contains = list(/obj/item/circuitboard/computer/arcade/battle,
+ /obj/item/circuitboard/computer/arcade/battle,
+ /obj/item/circuitboard/computer/arcade/orion_trail,
+ /obj/item/circuitboard/computer/arcade/orion_trail,
+ /obj/item/circuitboard/computer/arcade/minesweeper,
+ /obj/item/circuitboard/computer/arcade/minesweeper,
+ /obj/item/circuitboard/computer/slot_machine,
+ /obj/item/circuitboard/computer/slot_machine,
+ /obj/item/circuitboard/computer/slot_machine,
+ /obj/item/circuitboard/computer/slot_machine,
+ /obj/item/circuitboard/computer/slot_machine,
+ /obj/item/circuitboard/computer/slot_machine)
+ crate_name = "casino crate"
+
+/datum/supply_pack/misc/coincrate
+ name = "Coin Crate"
+ desc = "Psssst, hey, you. Yes, you. I've heard that coins can do some special things on your station, give you access to some pretty cool stuff. Here's the deal, you give me some credits, and I give so some coins. Sound like a deal? I'll give you 10 for 10000 creds."
+ contraband = TRUE
+ cost = 10000
+ contains = list(/obj/item/coin/silver)
+ crate_name = "coin crate"
+ crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/misc/coincrate/generate()
+ . = ..()
+ for(var/i in 1 to 9)
+ new /obj/item/coin/silver(.)
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// Misc Supplies ///////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/misc/exoticfootwear
+ name = "Exotic Footwear Crate"
+ desc = "Popularised by lizards and exotic dancers, the footwear included in this shipment is sure to give your feet the breathing room they deserve. Sweet Kicks Inc. is not responsible for any damage, distress, or @r0u$a1 caused by this shipment."
+ cost = 4337
+ contains = list(/obj/item/clothing/shoes/wraps,
+ /obj/item/clothing/shoes/wraps,
+ /obj/item/clothing/shoes/wraps/silver,
+ /obj/item/clothing/shoes/wraps/silver,
+ /obj/item/clothing/shoes/wraps/red,
+ /obj/item/clothing/shoes/wraps/red,
+ /obj/item/clothing/shoes/wraps/blue,
+ /obj/item/clothing/shoes/wraps/blue,
+ /obj/item/clothing/shoes/clown_shoes,
+ /obj/item/clothing/shoes/kindleKicks)
+ crate_name = "footie crate"
+
+/datum/supply_pack/misc/wrapping_paper
+ name = "Festive Wrapping Paper Crate"
+ desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, or the Clown's severed head? You can do all that, with this crate full of wrapping paper."
+ cost = 1000
+ contains = list(/obj/item/stack/wrapping_paper)
+ crate_type = /obj/structure/closet/crate/wooden
+ crate_name = "festive wrapping paper crate"
/datum/supply_pack/misc/jukebox
name = "Jukebox"
@@ -160,9 +261,147 @@
contains = list(/obj/machinery/jukebox)
crate_name = "Jukebox"
+/datum/supply_pack/misc/potted_plants
+ name = "Potted Plants Crate"
+ desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
+ cost = 730
+ contains = list(/obj/item/twohanded/required/kirbyplants/random,
+ /obj/item/twohanded/required/kirbyplants/random,
+ /obj/item/twohanded/required/kirbyplants/random,
+ /obj/item/twohanded/required/kirbyplants/random,
+ /obj/item/twohanded/required/kirbyplants/random)
+ crate_name = "potted plants crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
+/datum/supply_pack/misc/religious_supplies
+ name = "Religious Supplies Crate"
+ desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
+ cost = 4000 // it costs so much because the Space Church is ran by Space Jews
+ contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/storage/book/bible/booze,
+ /obj/item/storage/book/bible/booze,
+ /obj/item/clothing/suit/hooded/chaplain_hoodie,
+ /obj/item/clothing/suit/hooded/chaplain_hoodie
+ )
+ crate_name = "religious supplies crate"
+
+/datum/supply_pack/misc/funeral
+ name = "Funeral Supplies"
+ desc = "Mourn your dead properly buy sending them off with love filled notes, clean clothes, and a proper ceremony. Contains two candle packs, funeral garb, flowers, a paperbin , and crayons to help aid in religious rituals. Coffin included."
+ cost = 1200
+ contains = list(/obj/item/clothing/under/burial,
+ /obj/item/storage/fancy/candle_box,
+ /obj/item/storage/fancy/candle_box,
+ /obj/item/reagent_containers/food/snacks/grown/harebell,
+ /obj/item/reagent_containers/food/snacks/grown/harebell,
+ /obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
+ /obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
+ /obj/item/reagent_containers/food/snacks/grown/poppy/lily,
+ /obj/item/reagent_containers/food/snacks/grown/poppy/lily,
+ /obj/item/storage/crayons,
+ /obj/item/paper_bin
+ )
+ crate_name = "coffin"
+ crate_type = /obj/structure/closet/crate/coffin
+
+/datum/supply_pack/misc/shower
+ name = "Shower Supplies"
+ desc = "Everyone needs a bit of R&R. Make sure you get can get yours by ordering this crate filled with towels, rubber duckies, and some soap!"
+ cost = 1000
+ contains = list(/obj/item/reagent_containers/rag/towel,
+ /obj/item/reagent_containers/rag/towel,
+ /obj/item/reagent_containers/rag/towel,
+ /obj/item/reagent_containers/rag/towel,
+ /obj/item/reagent_containers/rag/towel,
+ /obj/item/reagent_containers/rag/towel,
+ /obj/item/bikehorn/rubberducky,
+ /obj/item/bikehorn/rubberducky,
+ /obj/item/soap/nanotrasen)
+ crate_name = "shower crate"
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////// Misc + Decor ////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/misc/carpet_exotic
+ name = "Exotic Carpet Crate"
+ desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
+ cost = 7000
+ contains = list(/obj/item/stack/tile/carpet/blue/fifty,
+ /obj/item/stack/tile/carpet/blue/fifty,
+ /obj/item/stack/tile/carpet/cyan/fifty,
+ /obj/item/stack/tile/carpet/cyan/fifty,
+ /obj/item/stack/tile/carpet/green/fifty,
+ /obj/item/stack/tile/carpet/green/fifty,
+ /obj/item/stack/tile/carpet/orange/fifty,
+ /obj/item/stack/tile/carpet/orange/fifty,
+ /obj/item/stack/tile/carpet/purple/fifty,
+ /obj/item/stack/tile/carpet/purple/fifty,
+ /obj/item/stack/tile/carpet/red/fifty,
+ /obj/item/stack/tile/carpet/red/fifty,
+ /obj/item/stack/tile/carpet/royalblue/fifty,
+ /obj/item/stack/tile/carpet/royalblue/fifty,
+ /obj/item/stack/tile/carpet/royalblack/fifty,
+ /obj/item/stack/tile/carpet/royalblack/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
+ /obj/item/stack/tile/carpet/monochrome/fifty,
+ /obj/item/stack/tile/carpet/monochrome/fifty)
+ crate_name = "exotic carpet crate"
+
+/datum/supply_pack/misc/carpet
+ name = "Premium Carpet Crate"
+ desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients."
+ cost = 1350
+ contains = list(/obj/item/stack/tile/carpet/fifty,
+ /obj/item/stack/tile/carpet/fifty,
+ /obj/item/stack/tile/carpet/black/fifty,
+ /obj/item/stack/tile/carpet/black/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
+ /obj/item/stack/tile/carpet/monochrome/fifty,
+ /obj/item/stack/tile/carpet/monochrome/fifty)
+ crate_name = "premium carpet crate"
+
+/datum/supply_pack/misc/party
+ name = "Party Equipment"
+ desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!"
+ cost = 2000
+ contains = list(/obj/item/storage/box/drinkingglasses,
+ /obj/item/reagent_containers/food/drinks/shaker,
+ /obj/item/reagent_containers/food/drinks/bottle/patron,
+ /obj/item/reagent_containers/food/drinks/bottle/goldschlager,
+ /obj/item/reagent_containers/food/drinks/ale,
+ /obj/item/reagent_containers/food/drinks/ale,
+ /obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/flashlight/glowstick,
+ /obj/item/flashlight/glowstick/red,
+ /obj/item/flashlight/glowstick/blue,
+ /obj/item/flashlight/glowstick/cyan,
+ /obj/item/flashlight/glowstick/orange,
+ /obj/item/flashlight/glowstick/yellow,
+ /obj/item/flashlight/glowstick/pink)
+ crate_name = "party equipment crate"
+
+/datum/supply_pack/misc/noslipfloor
+ name = "High-traction Floor Tiles"
+ desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!"
+ cost = 2000
+ contains = list(/obj/item/stack/tile/noslip/thirty,
+ /obj/item/stack/tile/noslip/thirty)
+ crate_name = "high-traction floor tiles crate"
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// Lewd Supplies ///////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
/datum/supply_pack/misc/lewd
name = "Lewd Crate" // OwO
- desc = "Psss want to have a good time with your sluts? Well I got what you want maid clothing, dildos, collars and more!"
+ desc = "Pssst, want to have a good time with your sluts? Well I got what you want! Maid clothing, dildos, collars and more!"
cost = 5250
contraband = TRUE
contains = list(/obj/item/dildo/custom,
@@ -191,40 +430,4 @@
crate_name = "deluxe keg"
crate_type = /obj/structure/closet/crate
-/datum/supply_pack/misc/religious_supplies
- name = "Religious Supplies Crate"
- desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
- cost = 4000 // it costs so much because the Space Church is ran by Space Jews
- contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
- /obj/item/reagent_containers/food/drinks/bottle/holywater,
- /obj/item/storage/book/bible/booze,
- /obj/item/storage/book/bible/booze,
- /obj/item/clothing/suit/hooded/chaplain_hoodie,
- /obj/item/clothing/suit/hooded/chaplain_hoodie
- )
- crate_name = "religious supplies crate"
-/datum/supply_pack/misc/randomised/promiscuous
- name = "Promiscuous Organs"
- desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick."
- cost = 4000 //Only get 2!
- contraband = TRUE
- var/num_contained = 2
- contains = list(/obj/item/autosurgeon/penis,
- /obj/item/autosurgeon/testicles,
- /obj/item/autosurgeon/vagina,
- /obj/item/autosurgeon/breasts,
- /obj/item/autosurgeon/womb)
- crate_name = "promiscuous organs"
-
-/datum/supply_pack/misc/toner
- name = "Toner Crate"
- desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'"
- cost = 1000
- contains = list(/obj/item/toner,
- /obj/item/toner,
- /obj/item/toner,
- /obj/item/toner,
- /obj/item/toner,
- /obj/item/toner)
- crate_name = "toner crate"
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 78f10b0908..3ffe24ac1c 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -10,35 +10,13 @@
group = "Food & Hydroponics"
crate_type = /obj/structure/closet/crate/freezer
-/datum/supply_pack/organic/hydroponics/beekeeping_suits
- name = "Beekeeper Suit Crate"
- desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear."
- cost = 1300
- contains = list(/obj/item/clothing/head/beekeeper_head,
- /obj/item/clothing/suit/beekeeper_suit,
- /obj/item/clothing/head/beekeeper_head,
- /obj/item/clothing/suit/beekeeper_suit)
- crate_name = "beekeeper suits"
- crate_type = /obj/structure/closet/crate/hydroponics
-
-/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
- name = "Beekeeping Starter Crate"
- desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
- cost = 1800
- contains = list(/obj/structure/beebox/unwrenched,
- /obj/item/honey_frame,
- /obj/item/honey_frame,
- /obj/item/honey_frame,
- /obj/item/queen_bee/bought,
- /obj/item/clothing/head/beekeeper_head,
- /obj/item/clothing/suit/beekeeper_suit,
- /obj/item/melee/flyswatter)
- crate_name = "beekeeping starter crate"
- crate_type = /obj/structure/closet/crate/hydroponics
+//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////// Food /////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/organic/candy/randomised
name = "Candy Crate"
- desc = "For people that have a insatiable sweet tooth! Has ten candies to be eaten up.."
+ desc = "For people that have an insatiable sweet tooth! Has ten candies to be eaten up.."
cost = 2500
var/num_contained = 10 //number of items picked to be contained in a randomised crate
contains = list(/obj/item/reagent_containers/food/snacks/candy,
@@ -69,28 +47,9 @@
/obj/item/storage/fancy/donut_box)
crate_name = "candy crate"
-/datum/supply_pack/organic/exoticseeds
- name = "Exotic Seeds Crate"
- desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
- cost = 1500
- contains = list(/obj/item/seeds/nettle,
- /obj/item/seeds/replicapod,
- /obj/item/seeds/replicapod,
- /obj/item/seeds/replicapod,
- /obj/item/seeds/plump,
- /obj/item/seeds/liberty,
- /obj/item/seeds/amanita,
- /obj/item/seeds/reishi,
- /obj/item/seeds/banana,
- /obj/item/seeds/eggplant/eggy,
- /obj/item/seeds/random,
- /obj/item/seeds/random)
- crate_name = "exotic seeds crate"
- crate_type = /obj/structure/closet/crate/hydroponics
-
/datum/supply_pack/organic/food
name = "Food Crate"
- desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, a enzyme and sugar bottle, and three slabs of monkeymeat."
+ desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, an enzyme and sugar bottle, and three slabs of monkeymeat."
cost = 1000
contains = list(/obj/item/reagent_containers/food/condiment/flour,
/obj/item/reagent_containers/food/condiment/flour,
@@ -113,6 +72,24 @@
/obj/item/reagent_containers/food/snacks/grown/banana)
crate_name = "food crate"
+/datum/supply_pack/organic/fiestatortilla
+ name = "Fiesta Crate"
+ desc = "Spice up the kitchen with this fiesta themed food order! Contains 8 tortilla based food items, as well as a sombrero, moustache, and cloak!"
+ cost = 2750
+ contains = list(/obj/item/clothing/head/sombrero,
+ /obj/item/clothing/suit/hooded/cloak/david,
+ /obj/item/clothing/mask/fakemoustache,
+ /obj/item/reagent_containers/food/snacks/taco,
+ /obj/item/reagent_containers/food/snacks/taco,
+ /obj/item/reagent_containers/food/snacks/taco/plain,
+ /obj/item/reagent_containers/food/snacks/taco/plain,
+ /obj/item/reagent_containers/food/snacks/enchiladas,
+ /obj/item/reagent_containers/food/snacks/enchiladas,
+ /obj/item/reagent_containers/food/snacks/carneburrito,
+ /obj/item/reagent_containers/food/snacks/cheesyburrito,
+ /obj/item/reagent_containers/glass/bottle/capsaicin,
+ /obj/item/reagent_containers/glass/bottle/capsaicin)
+ crate_name = "fiesta crate"
/datum/supply_pack/organic/fruit_1
name = "Fruit Basic Crate"
@@ -140,7 +117,7 @@
/datum/supply_pack/organic/fruit_2
name = "Fruit Delux Crate"
- desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas lastly ten strawberry."
+ desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas, peaches, and lastly seven strawberry. Includes one serving tray."
cost = 3500
contains = list(/obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/berries,
@@ -166,6 +143,9 @@
/obj/item/reagent_containers/food/snacks/grown/eggplant,
/obj/item/reagent_containers/food/snacks/grown/eggplant,
/obj/item/reagent_containers/food/snacks/grown/eggplant,
+ /obj/item/reagent_containers/food/snacks/grown/peach,
+ /obj/item/reagent_containers/food/snacks/grown/peach,
+ /obj/item/reagent_containers/food/snacks/grown/peach,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
@@ -173,9 +153,7 @@
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
- /obj/item/reagent_containers/food/snacks/grown/strawberry,
- /obj/item/reagent_containers/food/snacks/grown/strawberry,
- /obj/item/reagent_containers/food/snacks/grown/strawberry)
+ /obj/item/storage/bag/tray)
crate_name = "fruit crate"
/datum/supply_pack/organic/cream_piee
@@ -188,84 +166,51 @@
access = ACCESS_THEATRE
crate_type = /obj/structure/closet/crate/secure
-/datum/supply_pack/organic/hunting
- name = "Huntting gear"
- desc = "Even in space, we can fine prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a huntting shotgun. "
- cost = 3500
+/datum/supply_pack/organic/fakemeat
+ name = "Meat Crate"
+ desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*."
+ cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp.
+ contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/carpmeat/imitation,
+ /obj/item/reagent_containers/food/snacks/carpmeat/imitation,
+ /obj/item/reagent_containers/food/snacks/carpmeat/imitation,
+ /obj/item/reagent_containers/food/snacks/carpmeat/imitation)
+ crate_name = "meaty crate"
+ crate_type = /obj/structure/closet/crate/freezer
+
+/datum/supply_pack/organic/monkeydripmeat
+ name = "*Meat* Crate"
+ desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!"
+ cost = 2150
contraband = TRUE
- contains = list(/obj/item/clothing/head/flatcap,
- /obj/item/clothing/suit/hooded/wintercoat/captain,
- /obj/item/reagent_containers/food/drinks/bottle/cognac,
- /obj/item/storage/fancy/cigarettes/cigars/havana,
- /obj/item/clothing/gloves/color/white,
- /obj/item/clothing/under/rank/curator,
- /obj/item/gun/ballistic/shotgun/lethal)
- access = ACCESS_ARMORY
- crate_name = "sporting crate"
- crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
+ contains = list(/obj/item/reagent_containers/food/snacks/monkeycube,
+ /obj/item/restraints/handcuffs/cable,
+ /obj/machinery/iv_drip,
+ /obj/item/reagent_containers/glass/beaker/cryoxadone,
+ /obj/item/reagent_containers/glass/beaker/cryoxadone)
+ crate_name = "monkey meat crate"
-/datum/supply_pack/organic/hydroponics
- name = "Hydroponics Crate"
- desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
- cost = 1750
- contains = list(/obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/hatchet,
- /obj/item/cultivator,
- /obj/item/plant_analyzer,
- /obj/item/clothing/gloves/botanic_leather,
- /obj/item/clothing/suit/apron)
- crate_name = "hydroponics crate"
- crate_type = /obj/structure/closet/crate/hydroponics
-
-/datum/supply_pack/organic/hydroponics/hydrotank
- name = "Hydroponics Backpack Crate"
- desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open."
- cost = 1200
- access = ACCESS_HYDROPONICS
- contains = list(/obj/item/watertank)
- crate_name = "hydroponics backpack crate"
- crate_type = /obj/structure/closet/crate/secure
-
-/datum/supply_pack/organic/cutlery
- name = "Kitchen Cutlery Deluxe Set"
- desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
- cost = 10000
- contraband = TRUE
- contains = list(/obj/item/sharpener,
- /obj/item/kitchen/fork,
- /obj/item/kitchen/fork,
- /obj/item/kitchen/knife,
- /obj/item/kitchen/knife,
- /obj/item/kitchen/knife,
- /obj/item/kitchen/knife,
- /obj/item/kitchen/knife/butcher,
- /obj/item/kitchen/knife/butcher,
- /obj/item/kitchen/rollingpin, //Deluxe for a reason
- /obj/item/trash/plate,
- /obj/item/trash/plate,
- /obj/item/trash/plate,
- /obj/item/trash/plate,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
- /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
- /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
- crate_name = "kitchen cutlery deluxe set"
-
-/datum/supply_pack/organic/mre
- name = "MRE supply kit (emergency rations)"
- desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
- cost = 2000
- contains = list(/obj/item/storage/box/mre/menu1/safe,
- /obj/item/storage/box/mre/menu1/safe,
- /obj/item/storage/box/mre/menu2/safe,
- /obj/item/storage/box/mre/menu2/safe,
- /obj/item/storage/box/mre/menu3,
- /obj/item/storage/box/mre/menu4/safe)
- crate_name = "MRE crate (emergency rations)"
+/datum/supply_pack/organic/mixedboxes
+ name = "Mixed Ingredient Boxes"
+ desc = "Get overwhelmed with inspiration by ordering these boxes of surprise ingredients! Get four boxes filled with an assortment of products!"
+ cost = 2300
+ contains = list(/obj/item/storage/box/ingredients/wildcard,
+ /obj/item/storage/box/ingredients/wildcard,
+ /obj/item/storage/box/ingredients/wildcard,
+ /obj/item/storage/box/ingredients/wildcard)
+ crate_name = "wildcard food crate"
+ crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/organic/pizza
name = "Pizza Crate"
@@ -301,16 +246,105 @@
considered \[REDACTED\] and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \
of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.")
-/datum/supply_pack/organic/potted_plants
- name = "Potted Plants Crate"
- desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
- cost = 730
- contains = list(/obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random)
- crate_name = "potted plants crate"
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////// Hydroponics /////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/organic/hydroponics/beekeeping_suits
+ name = "Beekeeper Suit Crate"
+ desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear."
+ cost = 1300
+ contains = list(/obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit,
+ /obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit)
+ crate_name = "beekeeper suits"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
+/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
+ name = "Beekeeping Starter Crate"
+ desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit & helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
+ cost = 1800
+ contains = list(/obj/structure/beebox/unwrenched,
+ /obj/item/honey_frame,
+ /obj/item/honey_frame,
+ /obj/item/honey_frame,
+ /obj/item/queen_bee/bought,
+ /obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit,
+ /obj/item/melee/flyswatter)
+ crate_name = "beekeeping starter crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
+/datum/supply_pack/organic/exoticseeds
+ name = "Exotic Seeds Crate"
+ desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
+ cost = 1500
+ contains = list(/obj/item/seeds/nettle,
+ /obj/item/seeds/replicapod,
+ /obj/item/seeds/replicapod,
+ /obj/item/seeds/replicapod,
+ /obj/item/seeds/plump,
+ /obj/item/seeds/liberty,
+ /obj/item/seeds/amanita,
+ /obj/item/seeds/reishi,
+ /obj/item/seeds/banana,
+ /obj/item/seeds/eggplant/eggy,
+ /obj/item/seeds/random,
+ /obj/item/seeds/random)
+ crate_name = "exotic seeds crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
+/* Maintenance Garden Crate basically does this and more.
+/datum/supply_pack/organic/hydroponics
+ name = "Hydroponics Crate"
+ desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
+ cost = 1750
+ contains = list(/obj/item/reagent_containers/spray/plantbgone,
+ /obj/item/reagent_containers/spray/plantbgone,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/hatchet,
+ /obj/item/cultivator,
+ /obj/item/plant_analyzer,
+ /obj/item/clothing/gloves/botanic_leather,
+ /obj/item/clothing/suit/apron)
+ crate_name = "hydroponics crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+*/
+/datum/supply_pack/organic/hydroponics/hydrotank
+ name = "Hydroponics Backpack Crate"
+ desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open."
+ cost = 1200
+ access = ACCESS_HYDROPONICS
+ contains = list(/obj/item/watertank)
+ crate_name = "hydroponics backpack crate"
+ crate_type = /obj/structure/closet/crate/secure
+
+/datum/supply_pack/organic/hydroponics/maintgarden
+ name = "Maintenance Garden Crate"
+ desc = "Set up your own tiny paradise with do-it-yourself botany kit. Contains sandstone for dirt plots, pest spray, ammonia, a portable seed generator, basic botanical tools, and some seeds to start off with."
+ cost = 2700
+ contains = list(/obj/item/storage/bag/plants/portaseeder,
+ /obj/item/reagent_containers/spray/pestspray,
+ /obj/item/stack/sheet/mineral/sandstone/twelve,
+ /obj/item/reagent_containers/glass/bucket,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/hatchet,
+ /obj/item/cultivator,
+ /obj/item/plant_analyzer,
+ /obj/item/flashlight,
+ /obj/item/seeds/carrot,
+ /obj/item/seeds/carrot,
+ /obj/item/seeds/tower,
+ /obj/item/seeds/tower,
+ /obj/item/seeds/watermelon,
+ /obj/item/seeds/watermelon,
+ /obj/item/seeds/grass,
+ /obj/item/seeds/grass)
+ crate_name = "maint garden crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/seeds
@@ -333,9 +367,29 @@
crate_name = "seeds crate"
crate_type = /obj/structure/closet/crate/hydroponics
+//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////// Misc /////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/organic/hunting
+ name = "Hunting Gear"
+ desc = "Even in space, we can find prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a hunting shotgun. "
+ cost = 3500
+ contraband = TRUE
+ contains = list(/obj/item/clothing/head/flatcap,
+ /obj/item/clothing/suit/hooded/wintercoat/captain,
+ /obj/item/reagent_containers/food/drinks/bottle/cognac,
+ /obj/item/storage/fancy/cigarettes/cigars/havana,
+ /obj/item/clothing/gloves/color/white,
+ /obj/item/clothing/under/rank/curator,
+ /obj/item/gun/ballistic/shotgun/lethal)
+ access = ACCESS_ARMORY
+ crate_name = "sporting crate"
+ crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
+
/datum/supply_pack/organic/vday
name = "Surplus Valentine Crate"
- desc = "Turns out we got warehouses of this love-y dove-y crap. Were sending out small barged buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards."
+ desc = "Turns out we got warehouses of this love-y dove-y crap. We're sending out small bargain buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards."
cost = 3000
contraband = TRUE
contains = list(/obj/item/storage/fancy/heart_box,
diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm
index 25b8b2ddfb..981e343045 100644
--- a/code/modules/cargo/packs/science.dm
+++ b/code/modules/cargo/packs/science.dm
@@ -131,7 +131,7 @@
/datum/supply_pack/science/relic
name = "Relic Crate"
- desc = "Ever want to play with old discounted toys? Look no more. Contains two relics."
+ desc = "Ever wanted to play with old discounted toys? Look no further. Contains two relics."
cost = 1000
contraband = TRUE
contains = list(/obj/item/relic,
diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm
index 14bde519e1..8fd5b6eb58 100644
--- a/code/modules/cargo/packs/service.dm
+++ b/code/modules/cargo/packs/service.dm
@@ -9,143 +9,25 @@
/datum/supply_pack/service
group = "Service"
-/datum/supply_pack/service/advlighting
- name = "Advanced Lighting crate"
- desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
- cost = 2750
- contains = list(/obj/item/construction/rld,
- /obj/item/flashlight/lamp,
- /obj/item/flashlight/lamp,
- /obj/item/flashlight/lamp/green,
- /obj/item/storage/box/lights/mixed)
- crate_name = "advanced lighting crate"
- crate_type = /obj/structure/closet/crate/secure
+//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////// Cargo ////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/service/cargo_supples
name = "Cargo Supplies Crate"
- desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping."
+ desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping. Now with extra toner cartidges!"
cost = 1000
contains = list(/obj/item/stamp,
/obj/item/stamp/denied,
/obj/item/export_scanner,
/obj/item/destTagger,
/obj/item/hand_labeler,
+ /obj/item/toner,
+ /obj/item/toner,
+ /obj/item/stack/packageWrap,
/obj/item/stack/packageWrap)
crate_name = "cargo supplies crate"
-/datum/supply_pack/service/carpet_exotic
- name = "Exotic Carpet Crate"
- desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
- cost = 7000
- contains = list(/obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "exotic carpet crate"
-
-/datum/supply_pack/service/food_cart
- name = "Food Cart Crate"
- desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!"
- cost = 1000
- contains = list(/obj/machinery/food_cart)
- crate_name = "food cart crate"
- crate_type = /obj/structure/closet/crate
-
-/datum/supply_pack/service/noslipfloor
- name = "High-traction Floor Tiles"
- desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!"
- cost = 2000
- contains = list(/obj/item/stack/tile/noslip/thirty,
- /obj/item/stack/tile/noslip/thirty)
- crate_name = "high-traction floor tiles crate"
-
-/datum/supply_pack/service/icecream_cart
- name = "Ice Cream Cart Crate"
- desc = "Plasma fire a to hot for you, want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream."
- cost = 2750 //Comes prestocked with basic ingredients
- contains = list(/obj/machinery/icecream_vat)
- crate_name = "ice cream vat crate"
- crate_type = /obj/structure/closet/crate
-
-/datum/supply_pack/service/janitor
- name = "Janitorial Supplies Crate"
- desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag."
- cost = 1300
- contains = list(/obj/item/reagent_containers/glass/bucket,
- /obj/item/reagent_containers/glass/bucket,
- /obj/item/reagent_containers/glass/bucket,
- /obj/item/mop,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/storage/bag/trash,
- /obj/item/reagent_containers/spray/cleaner,
- /obj/item/reagent_containers/rag,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/item/soap/nanotrasen)
- crate_name = "janitorial supplies crate"
-
-/datum/supply_pack/service/janitor/janicart
- name = "Janitorial Cart and Galoshes Crate"
- desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart."
- cost = 2000
- contains = list(/obj/structure/janitorialcart,
- /obj/item/clothing/shoes/galoshes)
- crate_name = "janitorial cart crate"
- crate_type = /obj/structure/closet/crate/large
-
-/datum/supply_pack/service/janitor/janitank
- name = "Janitor Backpack Crate"
- desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open."
- cost = 1000
- access = ACCESS_JANITOR
- contains = list(/obj/item/watertank/janitor)
- crate_name = "janitor backpack crate"
- crate_type = /obj/structure/closet/crate/secure
-
-/datum/supply_pack/service/janitor/janpremium
- name = "Janitor Premium Supplies"
- desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia."
- cost = 1750
- access = ACCESS_JANITOR
- contains = list(/obj/item/caution,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/reagent_containers/rag,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/reagent_containers/spray/drying_agent)
- crate_name = "janitor backpack crate"
-
-/datum/supply_pack/service/janitor/janpimp
- name = "Custodial Cruiser"
- desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
- cost = 3000
- access = ACCESS_JANITOR
- contains = list(/obj/vehicle/ridden/janicart,
- /obj/item/key/janitor)
- crate_name = "janitor ride crate"
- crate_type = /obj/structure/closet/crate/large
-
/datum/supply_pack/service/mule
name = "MULEbot Crate"
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
@@ -154,59 +36,6 @@
crate_name = "\improper MULEbot Crate"
crate_type = /obj/structure/closet/crate/large
-/datum/supply_pack/service/party
- name = "Party Equipment"
- desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!"
- cost = 2000
- contains = list(/obj/item/storage/box/drinkingglasses,
- /obj/item/reagent_containers/food/drinks/shaker,
- /obj/item/reagent_containers/food/drinks/bottle/patron,
- /obj/item/reagent_containers/food/drinks/bottle/goldschlager,
- /obj/item/reagent_containers/food/drinks/ale,
- /obj/item/reagent_containers/food/drinks/ale,
- /obj/item/reagent_containers/food/drinks/beer,
- /obj/item/reagent_containers/food/drinks/beer,
- /obj/item/reagent_containers/food/drinks/beer,
- /obj/item/reagent_containers/food/drinks/beer,
- /obj/item/flashlight/glowstick,
- /obj/item/flashlight/glowstick/red,
- /obj/item/flashlight/glowstick/blue,
- /obj/item/flashlight/glowstick/cyan,
- /obj/item/flashlight/glowstick/orange,
- /obj/item/flashlight/glowstick/yellow,
- /obj/item/flashlight/glowstick/pink)
- crate_name = "party equipment crate"
-
-/datum/supply_pack/service/carpet
- name = "Premium Carpet Crate"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains the classics."
- cost = 1000
- contains = list(/obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/black/fifty)
- crate_name = "premium carpet crate"
-
-/datum/supply_pack/service/carpet2
- name = "Premium Carpet Crate #2"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome"
- cost = 1000
- contains = list(/obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "premium carpet crate #2"
-
-/datum/supply_pack/service/lightbulbs
- name = "Replacement Lights"
- desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer."
- cost = 1200
- contains = list(/obj/item/storage/box/lights/mixed,
- /obj/item/storage/box/lights/mixed,
- /obj/item/storage/box/lights/mixed,
- /obj/item/lightreplacer)
- crate_name = "replacement lights"
-
/datum/supply_pack/service/minerkit
name = "Shaft Miner Starter Kit"
desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open."
@@ -223,9 +52,188 @@
crate_type = /obj/structure/closet/crate/secure
//////////////////////////////////////////////////////////////////////////////
-/////////////////////////// Vending Restocks /////////////////////////////////
+/////////////////////// Chef, Botanist, Bartender ////////////////////////////
//////////////////////////////////////////////////////////////////////////////
+/datum/supply_pack/service/buildabar
+ name = "Build a Bar Crate"
+ desc = "Looking to set up your own little safe haven? Maintenance bar too much of a bummer to work on? Maybe you just want to set up shop right in front of the bartender. Whatever your reasons, get a jump-start on this with this handy kit. Contains circuitboards for bar equipment, some parts, and some basic bartending supplies. (Batteries not Included)"
+ cost = 3750
+ contains = list(/obj/item/storage/box/drinkingglasses,
+ /obj/item/storage/box/drinkingglasses,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/matter_bin,
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/capacitor,
+ /obj/item/stock_parts/capacitor,
+ /obj/item/stack/sheet/metal/ten,
+ /obj/item/stack/sheet/metal/five,
+ /obj/item/stack/sheet/glass/five,
+ /obj/item/stack/cable_coil/random,
+ /obj/item/reagent_containers/rag,
+ /obj/item/book/manual/wiki/barman_recipes,
+ /obj/item/book/granter/action/drink_fling,
+ /obj/item/reagent_containers/food/drinks/shaker,
+ /obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
+ /obj/item/circuitboard/machine/chem_dispenser/drinks,
+ /obj/item/circuitboard/machine/dish_drive)
+ crate_name = "build a bar crate"
+
+/datum/supply_pack/service/food_cart
+ name = "Food Cart Crate"
+ desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!"
+ cost = 1000
+ contains = list(/obj/machinery/food_cart)
+ crate_name = "food cart crate"
+ crate_type = /obj/structure/closet/crate
+
+/datum/supply_pack/service/icecream_cart
+ name = "Ice Cream Cart Crate"
+ desc = "Plasma fire too hot for you? Want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream."
+ cost = 2750 //Comes prestocked with basic ingredients
+ contains = list(/obj/machinery/icecream_vat)
+ crate_name = "ice cream vat crate"
+ crate_type = /obj/structure/closet/crate
+
+/datum/supply_pack/service/cutlery
+ name = "Kitchen Cutlery Deluxe Set"
+ desc = "Need to slice and dice away those ''Tomatoes''? Well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
+ cost = 10000
+ contraband = TRUE
+ contains = list(/obj/item/sharpener, //Deluxe for a reason
+ /obj/item/kitchen/fork,
+ /obj/item/kitchen/fork,
+ /obj/item/kitchen/knife,
+ /obj/item/kitchen/knife,
+ /obj/item/kitchen/knife,
+ /obj/item/kitchen/knife,
+ /obj/item/kitchen/knife/butcher,
+ /obj/item/kitchen/knife/butcher,
+ /obj/item/kitchen/rollingpin,
+ /obj/item/trash/plate,
+ /obj/item/trash/plate,
+ /obj/item/trash/plate,
+ /obj/item/trash/plate,
+ /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
+ /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
+ crate_name = "kitchen cutlery deluxe set"
+
+//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////// Janitor //////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_pack/service/advlighting
+ name = "Advanced Lighting crate"
+ desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
+ cost = 2750
+ contains = list(/obj/item/construction/rld,
+ /obj/item/flashlight/lamp,
+ /obj/item/flashlight/lamp,
+ /obj/item/flashlight/lamp/green,
+ /obj/item/storage/box/lights/mixed)
+ crate_name = "advanced lighting crate"
+ crate_type = /obj/structure/closet/crate/secure
+
+/datum/supply_pack/service/lightbulbs
+ name = "Replacement Lights" //Subgrouping this with Advanced Lighting Crate, they're both lighting related.
+ desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer."
+ cost = 1200
+ contains = list(/obj/item/storage/box/lights/mixed,
+ /obj/item/storage/box/lights/mixed,
+ /obj/item/storage/box/lights/mixed,
+ /obj/item/lightreplacer)
+ crate_name = "replacement lights"
+
+/datum/supply_pack/service/janitor/advanced
+ name = "Advanced Sanitation Crate"
+ desc = "Contains all the essentials for an advanced spacefaring cleanup crew. This kit includes a trashbag, an advanced mop, a bottle of space cleaner, a floor buffer, and a holosign projector. Requires Janitorial Access to Open"
+ cost = 5700
+ access = ACCESS_JANITOR
+ contains = list(/obj/item/storage/bag/trash/bluespace,
+ /obj/item/reagent_containers/spray/cleaner,
+ /obj/item/mop/advanced,
+ /obj/item/lightreplacer,
+ /obj/item/janiupgrade,
+ /obj/item/holosign_creator)
+ crate_name = "advanced santation crate"
+ crate_type = /obj/structure/closet/crate/secure
+
+/datum/supply_pack/service/janitor/janpimp
+ name = "Custodial Cruiser"
+ desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
+ cost = 3000
+ access = ACCESS_JANITOR
+ contains = list(/obj/vehicle/ridden/janicart,
+ /obj/item/key/janitor)
+ crate_name = "janitor ride crate"
+ crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/service/janitor/janitank
+ name = "Janitor Backpack Crate"
+ desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open."
+ cost = 1000
+ access = ACCESS_JANITOR
+ contains = list(/obj/item/watertank/janitor)
+ crate_name = "janitor backpack crate"
+ crate_type = /obj/structure/closet/crate/secure
+
+/datum/supply_pack/service/janitor/janpremium
+ name = "Janitor Supplies (Premium)"
+ desc = "The custodial union is in a tizzy, so we've gathered up some better supplies for you. In this crate you can get a brand new chem, Drying Agent. This stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, several cleaning grenades, some spare bottles of ammonia, and an MCE (or Massive Cleaning Explosive)."
+ cost = 2700
+ contains = list(/obj/item/grenade/clusterbuster/cleaner,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/reagent_containers/rag,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
+ /obj/item/reagent_containers/spray/drying_agent)
+ crate_name = "premium janitorial crate"
+
+/datum/supply_pack/service/janitor/starter
+ name = "Janitorial Supplies (Standard)"
+ desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag."
+ cost = 1300
+ contains = list(/obj/item/reagent_containers/glass/bucket,
+ /obj/item/reagent_containers/glass/bucket,
+ /obj/item/reagent_containers/glass/bucket,
+ /obj/item/mop,
+ /obj/item/caution,
+ /obj/item/caution,
+ /obj/item/caution,
+ /obj/item/storage/bag/trash,
+ /obj/item/reagent_containers/spray/cleaner,
+ /obj/item/reagent_containers/rag,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/soap/nanotrasen)
+ crate_name = "standard janitorial crate"
+
+/datum/supply_pack/service/janitor/janicart
+ name = "Janicart and Galoshes Crate"
+ desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart."
+ cost = 2000
+ contains = list(/obj/structure/janitorialcart,
+ /obj/item/clothing/shoes/galoshes)
+ crate_name = "janitorial cart crate"
+ crate_type = /obj/structure/closet/crate/large
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////// Vendor Refills //////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
/datum/supply_pack/service/vending/bartending
name = "Bartending Supply Crate"
desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!"
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index 89e221c339..5f3d6dab0a 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -15,15 +15,17 @@
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
anchored = TRUE //So it cant slide around after landing
anchorable = FALSE
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
//*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well!
var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing
var/landingDelay = 30 //How long the pod takes to land after launching
var/openingDelay = 30 //How long the pod takes to open after landing
- var/departureDelay = 30 //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom)
+ var/departureDelay = 30 //How long the pod takes to leave after opening. If bluespace = TRUE, it deletes. If reversing = TRUE, it flies back to centcom.
var/damage = 0 //Damage that occurs to any mob under the pod when it lands.
var/effectStun = FALSE //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
+ var/effectOrgans = FALSE //If true, yeets out every limb and organ from anyone caught under the pod when it lands
var/effectGib = FALSE //If true, anyone under the pod will be gibbed when it lands
var/effectStealth = FALSE //If true, a target icon isnt displayed on the turf where the pod will land
var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
@@ -31,10 +33,13 @@
var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here
var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
+ var/fallDuration = 4
+ var/fallingSoundLength = 11
+ var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands
var/landingSound //Admin sound to play when the pod lands
var/openingSound //Admin sound to play when the pod opens
var/leavingSound //Admin sound to play when the pod leaves
- var/soundVolume = 50 //Volume to play sounds at. Ignores the cap
+ var/soundVolume = 80 //Volume to play sounds at. Ignores the cap
var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map.
var/list/explosionSize = list(0,0,2,3)
@@ -48,16 +53,18 @@
style = STYLE_CENTCOM
bluespace = TRUE
explosionSize = list(0,0,0,0)
- landingDelay = 5 //Very speedy!
+ landingDelay = 20 //Very speedy!
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/structure/closet/supplypod/Initialize()
- ..()
+ . = ..()
setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly
/obj/structure/closet/supplypod/update_icon()
cut_overlays()
- if (style != STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays
+ if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays
+ return
+ else
if (opened)
add_overlay("[icon_state]_open")
else
@@ -75,7 +82,7 @@
update_icon()
/obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user)
- if (bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways.
+ if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways.
return FALSE
else
..()
@@ -86,9 +93,6 @@
/obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding.
return
-/obj/structure/closet/supplypod/prevent_content_explosion() //Useful for preventing epicenter explosions from damaging contents
- return TRUE
-
/obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums
return
@@ -101,17 +105,33 @@
if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people):
var/mob/living/carbon/CM = M
for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands
- if(bodypart.body_part != HEAD && bodypart.body_zone != CHEST)//we dont want to kill him, just teach em a lesson!
+ if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson!
if (bodypart.dismemberable)
bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half!
break
+ if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob
+ var/mob/living/carbon/CM = M
+ for(var/X in CM.internal_organs)
+ var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in
+ var/obj/item/organ/O = X
+ O.Remove(CM) //Note that this isn't the same proc as for lists
+ O.forceMove(T) //Move the organ outta the body
+ O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away
+ sleep(1)
+ for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands
+ var/destination = get_edge_target_turf(T, pick(GLOB.alldirs))
+ if (bodypart.dismemberable)
+ bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half!
+ bodypart.throw_at(destination, 2, 3)
+ sleep(1)
+
if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on
M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em)
M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs
- M.adjustBruteLoss(damage)
-
-
- if (B[1] || B[2] || B[3] || B[4]) //If the explosion list isn't all zeroes, call an explosion
+ else
+ M.adjustBruteLoss(damage)
+ var/explosion_sum = B[1] + B[2] + B[3] + B[4]
+ if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion
explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing
else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true)
playsound(src, "explosion", landingSound ? 15 : 80, 1)
@@ -128,22 +148,31 @@
/obj/structure/closet/supplypod/open(atom/movable/holder, var/broken = FALSE, var/forced = FALSE) //The holder var represents an atom whose contents we will be working with
var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about
+ if (!holder)
+ return
+ if(opened)
+ return
+ opened = TRUE //This is to ensure we don't open something that has already been opened
var/mob/M
if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents
M = holder
if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter)
return
- opened = TRUE //This is to ensure we don't open something that has already been opened
if (openingSound)
- playsound(get_turf(holder), openingSound, soundVolume, 0, 0)
+ playsound(get_turf(holder), openingSound, soundVolume, 0, 0) //Special admin sound to play
INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition
+ if (style == STYLE_SEETHROUGH)
+ update_icon()
for (var/atom/movable/O in holder.contents) //Go through the contents of the holder
O.forceMove(T) //move everything from the contents of the holder to the turf of the holder
- if (!effectQuiet) //If we aren't being quiet, play an open sound
+ if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound
playsound(get_turf(holder), open_sound, 15, 1, -3)
if (broken) //If the pod is opening because it's been destroyed, we end here
return
- addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
+ if (style == STYLE_SEETHROUGH)
+ depart(src)
+ else
+ addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
/obj/structure/closet/supplypod/proc/depart(atom/movable/holder)
if (leavingSound)
@@ -151,7 +180,7 @@
if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom
close(holder)
else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists)
- if (style != STYLE_INVISIBLE)
+ if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH)
do_sparks(5, TRUE, holder) //Create some sparks right before closing
qdel(src) //Delete ourselves and the holder
if (holder != src)
@@ -164,13 +193,14 @@
if (ismob(O) && !isliving(O)) //We dont want to take ghosts with us
continue
O.forceMove(holder) //Put objects inside before we close
- var/obj/effect/temp_visual/risingPod = new /obj/effect/temp_visual/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
+ var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot
holder.forceMove(bay) //Move the pod back to centcom, where it belongs
animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod
+ QDEL_IN(risingPod, 10)
reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() )
+ bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever
open(holder, forced = TRUE)
- return
/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details
update_icon()
@@ -179,12 +209,11 @@
update_icon()
/obj/structure/closet/supplypod/Destroy()
- if (!opened) //If we havent opened yet, we're opening because we've been destroyed. Lets dump our contents by opening up
- open(src, broken = TRUE)
- return ..()
+ open(src, broken = TRUE) //Lets dump our contents by opening up
+ . = ..()
//------------------------------------FALLING SUPPLY POD-------------------------------------//
-/obj/effect/temp_visual/DPfall //Falling pod
+/obj/effect/abstract/DPfall //Falling pod
name = ""
icon = 'icons/obj/supplypods.dmi'
pixel_x = -16
@@ -192,17 +221,22 @@
pixel_z = 200
desc = "Get out of the way!"
layer = FLY_LAYER//that wasnt flying, that was falling with style!
- randomdir = FALSE
icon_state = ""
-/obj/effect/temp_visual/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod)
- if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible
+/obj/effect/abstract/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod)
+ if (pod.style == STYLE_SEETHROUGH)
+ pixel_x = -16
+ pixel_y = 0
+ for (var/atom/movable/O in pod.contents)
+ var/icon/I = getFlatIcon(O) //im so sorry
+ add_overlay(I)
+ else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible
icon_state = "[pod.icon_state]_falling"
name = pod.name
. = ..()
//------------------------------------TEMPORARY_VISUAL-------------------------------------//
-/obj/effect/DPtarget //This is the object that forceMoves the supplypod to it's location
+/obj/effect/abstract/DPtarget //This is the object that forceMoves the supplypod to it's location
name = "Landing Zone Indicator"
desc = "A holographic projection designating the landing zone of something. It's probably best to stand back."
icon = 'icons/mob/actions/actions_items.dmi'
@@ -212,45 +246,60 @@
var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate
var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target
-/obj/effect/ex_act()
- return
-
-/obj/effect/DPtarget/Initialize(mapload, podParam, var/datum/supply_order/SO = null)
+/obj/effect/abstract/DPtarget/Initialize(mapload, podParam, single_order = null)
+ . = ..()
if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does)
podParam = new podParam() //If its just a path, instantiate it
pod = podParam
- if (SO)
- SO.generate(pod)
- for (var/mob/living/M in podParam) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace)
+ if (single_order)
+ if (istype(single_order, /datum/supply_order))
+ var/datum/supply_order/SO = single_order
+ SO.generate(pod)
+ else if (istype(single_order, /atom/movable))
+ var/atom/movable/O = single_order
+ O.forceMove(pod)
+ for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace)
M.forceMove(src)
if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them
for (var/mob/living/M in get_turf(src))
M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid.
if (pod.effectStealth) //If effectStealth is true we want to be invisible
- alpha = 255
+ icon_state = ""
+ if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength)
+ pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound
+ pod.fallingSound = 'sound/weapons/mortar_whistle.ogg'
+ var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration
+ if (soundStartTime < 0)
+ soundStartTime = 1
+ if (!pod.effectQuiet)
+ addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime)
addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay)
-/obj/effect/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle
- fallingPod = new /obj/effect/temp_visual/DPfall(drop_location(), pod)
+/obj/effect/abstract/DPtarget/proc/playFallingSound()
+ playsound(src, pod.fallingSound, pod.soundVolume, 1, 6)
+
+/obj/effect/abstract/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle
+ fallingPod = new /obj/effect/abstract/DPfall(drop_location(), pod)
var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate
var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from
- fallingPod.pixel_x = cos(angle)*200 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target
- fallingPod.pixel_z = sin(angle)*200
+ fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target
+ fallingPod.pixel_z = sin(angle)*400
var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps
M.Turn(rotation) //Turn our matrix accordingly
fallingPod.transform = M //Transform the animated pod according to the matrix
M = matrix(pod.transform) //Make another matrix based on the pod
M.Turn(rotation) //Turn the matrix
pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho)
- animate(fallingPod, pixel_z = 0, pixel_x = -16, time = 3, , easing = LINEAR_EASING) //Make the pod fall! At an angle!
- addtimer(CALLBACK(src, .proc/endLaunch), 3, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
+ animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle!
+ addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
-/obj/effect/DPtarget/proc/endLaunch()
+/obj/effect/abstract/DPtarget/proc/endLaunch()
+ pod.update_icon()
pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position
+ QDEL_NULL(fallingPod) //Delete the falling pod effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears
for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out
M.forceMove(pod)
pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place
- QDEL_NULL(fallingPod) //The fallingPod's (the animated effect, not the actual pod) purpose is complete. It can rest easy now
qdel(src) //ditto
//------------------------------------UPGRADES-------------------------------------//
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
index 915d671fe8..006f1a8084 100644
--- a/code/modules/cargo/supplypod_beacon.dm
+++ b/code/modules/cargo/supplypod_beacon.dm
@@ -76,12 +76,14 @@
to_chat(user, "[src] linked to [C].")
/obj/item/supplypod_beacon/AltClick(mob/user)
+ . = ..()
if (!user.canUseTopic(src, !issilicon(user)))
return
if (express_console)
unlink_console()
else
to_chat(user, "There is no linked console!")
+ return TRUE
/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console
diff --git a/code/modules/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm
index 311c22955d..3f86a617e6 100644
--- a/code/modules/client/verbs/aooc.dm
+++ b/code/modules/client/verbs/aooc.dm
@@ -116,7 +116,7 @@ GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f")
antaglisting |= M.current.client
for(var/mob/M in GLOB.player_list)
- if(M.client && (M.stat == DEAD || M.client.holder))
+ if(M.client && (M.stat == DEAD || M.client.holder || is_special_character(M)))
antaglisting |= M.client
for(var/client/C in antaglisting)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index f8f1a67e5a..dc9e46c4b4 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -253,16 +253,14 @@ BLIND // can't see anything
H.update_suit_sensors()
/obj/item/clothing/under/AltClick(mob/user)
- if(..())
- return 1
-
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
+ if(attached_accessory)
+ remove_accessory(user)
else
- if(attached_accessory)
- remove_accessory(user)
- else
- rolldown()
+ rolldown()
+ return TRUE
/obj/item/clothing/under/verb/jumpsuit_adjust()
set name = "Adjust Jumpsuit Style"
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 608f71cf11..206165a495 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -43,15 +43,16 @@
//called when thermal glasses are emped.
/obj/item/clothing/glasses/proc/thermal_overload()
- if(ishuman(src.loc))
- var/mob/living/carbon/human/H = src.loc
- if(!(HAS_TRAIT(H, TRAIT_BLIND)))
- if(H.glasses == src)
- to_chat(H, "[src] overloads and blinds you!")
- H.flash_act(visual = 1)
- H.blind_eyes(3)
- H.blur_eyes(5)
- H.adjust_eye_damage(5)
+ if(!ishuman(loc))
+ return
+ var/mob/living/carbon/human/H = loc
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ if((!HAS_TRAIT(H, TRAIT_BLIND) || !eyes) && H.glasses == src)
+ to_chat(H, "[src] overloads and blinds you!")
+ H.flash_act(visual = 1)
+ H.blind_eyes(3)
+ H.blur_eyes(5)
+ eyes.applyOrganDamage(5)
/obj/item/clothing/glasses/meson
name = "optical meson scanner"
@@ -427,19 +428,17 @@
..()
/obj/item/clothing/glasses/AltClick(mob/user)
+ . = ..()
if(glass_colour_type && ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.client)
- if(H.client.prefs)
- if(src == H.glasses)
- H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour
- if(H.client.prefs.uses_glasses_colour)
- to_chat(H, "You will now see glasses colors.")
- else
- to_chat(H, "You will no longer see glasses colors.")
- H.update_glasses_color(src, 1)
- else
- return ..()
+ if(H.client?.prefs && src == H.glasses)
+ H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour
+ if(H.client.prefs.uses_glasses_colour)
+ to_chat(H, "You will now see glasses colors.")
+ else
+ to_chat(H, "You will no longer see glasses colors.")
+ H.update_glasses_color(src, 1)
+ return TRUE
/obj/item/clothing/glasses/proc/change_glass_color(mob/living/carbon/human/H, datum/client_colour/glass_colour/new_color_type)
var/old_colour_type = glass_colour_type
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 90c0690534..dc7e1df15f 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -27,7 +27,6 @@
icon_state = "chef"
item_state = "chef"
dynamic_hair_suffix = ""
-
dog_fashion = /datum/dog_fashion/head/chef
/obj/item/clothing/head/collectable/paper
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index fa61b81177..19f03dfd0a 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -115,8 +115,10 @@
toggle_helmet_light(user)
/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE))
toggle_welding_screen(user)
+ return TRUE
/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user)
if(weldingvisortoggle(user))
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 8ff6fe8bd1..05116c8b97 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -104,16 +104,16 @@
. += "Alt-click to take a candy corn."
/obj/item/clothing/head/fedora/det_hat/AltClick(mob/user)
- if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- ..()
- if(loc == user)
- if(candy_cooldown < world.time)
- var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src)
- user.put_in_hands(CC)
- to_chat(user, "You slip a candy corn from your hat.")
- candy_cooldown = world.time+1200
- else
- to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.")
+ . = ..()
+ if(loc == user && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ if(candy_cooldown < world.time)
+ var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src)
+ user.put_in_hands(CC)
+ to_chat(user, "You slip a candy corn from your hat.")
+ candy_cooldown = world.time+1200
+ else
+ to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.")
+ return TRUE
//Mime
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 909d23e49b..dabfaf06cd 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -113,10 +113,8 @@
desc = "Wearing these makes you look useless, and only good for your sex appeal."
icon_state = "bunny"
dynamic_hair_suffix = ""
-
dog_fashion = /datum/dog_fashion/head/rabbit
-
/obj/item/clothing/head/flatcap
name = "flat cap"
desc = "A working man's cap."
@@ -205,7 +203,6 @@
item_state = "sombrero"
desc = "You can practically taste the fiesta."
flags_inv = HIDEHAIR
-
dog_fashion = /datum/dog_fashion/head/sombrero
/obj/item/clothing/head/sombrero/green
@@ -369,3 +366,17 @@
item_state = "assu_helmet"
desc = "A cheap replica of old riot helmet without visor. It has \"D.A.B.\" written on the front."
flags_inv = HIDEHAIR
+
+/obj/item/clothing/head/hotel
+ name = "Telegram cap"
+ desc = "A bright red cap warn by hotel staff. Or people who want to be a singing telegram"
+ icon_state = "telegramhat"
+ item_color = "telegramhat"
+ dog_fashion = null
+
+/obj/item/clothing/head/colour
+ name = "Singer cap"
+ desc = "A light white hat that has bands of color. Just makes you want to sing and dance!"
+ icon_state = "colour"
+ item_color = "colour"
+ dog_fashion = /datum/dog_fashion/head/colour
\ No newline at end of file
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 8754c89511..69ec1ccedd 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -22,11 +22,11 @@
/obj/item/clothing/head/soft/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- flip(user)
+ flip(user)
+ return TRUE
/obj/item/clothing/head/soft/proc/flip(mob/user)
@@ -139,4 +139,4 @@
flags_inv = HIDEEYES|HIDEFACE
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
strip_delay = 90 //You dont take a Major Leage cap
- dog_fashion = null
\ No newline at end of file
+ dog_fashion = null
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 7d0c4a455e..f4335d17e8 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -23,11 +23,11 @@
adjustmask(user)
/obj/item/clothing/mask/breath/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- adjustmask(user)
+ adjustmask(user)
+ return TRUE
/obj/item/clothing/mask/breath/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e7032ead13..c6eac4ac56 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -65,7 +65,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg)
var/mob/wearer = loc
if(msg && ishuman(wearer))
- wearer.show_message("[icon2html(src, wearer)][msg]", 1)
+ wearer.show_message("[icon2html(src, wearer)][msg]", MSG_VISUAL)
/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity)
. = ..()
@@ -964,13 +964,12 @@
. += energy_overlay
/obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user)
- if(user.incapacitated() || !istype(user))
+ . = ..()
+ if(!in_range(src, user) || !istype(user))
+ return
+ if(user.incapacitated())
to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
- return
- if(user.incapacitated() || !istype(user) || !in_range(src, user))
- return
+ return TRUE
if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",energy_color) as color|null
@@ -986,6 +985,7 @@
user.update_inv_wear_suit()
light_color = energy_color
update_light()
+ return TRUE
/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index d150cb5ca8..b67fda421e 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -505,6 +505,21 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
+/obj/item/clothing/suit/hooded/wintercoat/centcom
+ name = "centcom winter coat"
+ icon_state = "coatcentcom"
+ item_state = "coatcentcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
+
+/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/centcom
+ icon_state = "winterhood_centcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
@@ -723,6 +738,15 @@
/obj/item/clothing/head/hooded/winterhood/qm
icon_state = "winterhood_qm"
+/obj/item/clothing/suit/hooded/wintercoat/aformal
+ name = "assistant's formal winter coat"
+ icon_state = "coataformal"
+ item_state = "coataformal"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
+
+/obj/item/clothing/head/hooded/winterhood/aformal
+ icon_state = "winterhood_aformal"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
@@ -734,6 +758,27 @@
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "winterhood_miner"
+/obj/item/clothing/suit/hooded/wintercoat/ratvar
+ name = "ratvarian winter coat"
+ icon_state = "coatratvar"
+ item_state = "coatratvar"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
+
+/obj/item/clothing/head/hooded/winterhood/ratvar
+ icon_state = "winterhood_ratvar"
+ light_range = 3
+ light_power = 1
+ light_color = "#B18B25" //clockwork slab background top color
+
+/obj/item/clothing/suit/hooded/wintercoat/narsie
+ name = "narsian winter coat"
+ icon_state = "coatnarsie"
+ item_state = "coatnarsie"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
+
+/obj/item/clothing/head/hooded/winterhood/narsie
+ icon_state = "winterhood_narsie"
+
/obj/item/clothing/suit/spookyghost
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index f869eb5d44..559d3006a1 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -92,11 +92,11 @@
//Toggle exosuits for different aesthetic styles (hoodies, suit jacket buttons, etc)
/obj/item/clothing/suit/toggle/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- suit_toggle(user)
+ suit_toggle(user)
+ return TRUE
/obj/item/clothing/suit/toggle/ui_action_click()
suit_toggle()
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 0a0499b5f9..e165297a3f 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -67,10 +67,12 @@
return
/obj/item/clothing/accessory/AltClick(mob/user)
+ . = ..()
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(initial(above_suit))
above_suit = !above_suit
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
+ return TRUE
/obj/item/clothing/accessory/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index b4ad844f4d..51e34c7b3e 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -5,6 +5,7 @@
item_color = "red_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/pj/blue
name = "blue pj's"
desc = "Sleepwear."
@@ -12,6 +13,7 @@
item_color = "blue_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/patriotsuit
name = "Patriotic Suit"
desc = "Motorcycle not included."
@@ -19,6 +21,7 @@
item_state = "ek"
item_color = "ek"
can_adjust = FALSE
+
/obj/item/clothing/under/scratch
name = "white suit"
desc = "A white suit, suitable for an excellent host."
@@ -43,6 +46,7 @@
icon_state = "sl_suit"
item_color = "sl_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/roman
name = "\improper Roman armor"
desc = "Ancient Roman armor. Made of metallic and leather straps."
@@ -52,6 +56,7 @@
can_adjust = FALSE
strip_delay = 100
resistance_flags = NONE
+
/obj/item/clothing/under/waiter
name = "waiter's outfit"
desc = "It's a very smart uniform with a special pocket for tip."
@@ -59,6 +64,7 @@
item_state = "waiter"
item_color = "waiter"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/prisoner
name = "prison jumpsuit"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
@@ -85,12 +91,14 @@
icon_state = "mailman"
item_state = "b_suit"
item_color = "mailman"
+
/obj/item/clothing/under/rank/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_state = "p_suit"
item_color = "psyche"
+
/obj/item/clothing/under/rank/clown/sexy
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
@@ -98,6 +106,7 @@
item_state = "sexyclown"
item_color = "sexyclown"
can_adjust = FALSE
+
/obj/item/clothing/under/jabroni
name = "Jabroni Outfit"
desc = "The leather club is two sectors down."
@@ -105,6 +114,7 @@
item_state = "darkholme"
item_color = "darkholme"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
@@ -112,6 +122,7 @@
item_state = "gy_suit"
item_color = "vice"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
@@ -119,12 +130,14 @@
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = TRUE
+
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
+
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -141,6 +154,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
@@ -157,24 +171,28 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
+
/obj/item/clothing/under/owl
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
item_color = "owl"
can_adjust = FALSE
+
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
item_color = "griffin"
can_adjust = FALSE
+
/obj/item/clothing/under/cloud
name = "cloud"
desc = "cloud"
icon_state = "cloud"
item_color = "cloud"
can_adjust = FALSE
+
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
@@ -218,18 +236,21 @@
item_state = "bl_suit"
item_color = "black_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/suit_jacket/really_black
name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
item_color = "really_black_suit"
+
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
item_color = "black_suit_fem"
+
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
@@ -237,48 +258,56 @@
item_state = "dg_suit"
item_color = "green_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
item_color = "red_suit"
+
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
item_color = "charcoal_suit"
+
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
item_color = "navy_suit"
+
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
item_color = "burgundy_suit"
+
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
item_color = "checkered_suit"
+
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
item_color = "tan_suit"
+
/obj/item/clothing/under/suit_jacket/white
name = "white suit"
desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!"
icon_state = "white_suit"
item_state = "white_suit"
item_color = "white_suit"
+
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
@@ -286,6 +315,7 @@
item_state = "burial"
item_color = "burial"
has_sensor = NO_SENSORS
+
/obj/item/clothing/under/skirt/black
name = "black skirt"
desc = "A black skirt, very fancy!"
@@ -294,6 +324,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/blue
name = "blue skirt"
desc = "A blue, casual skirt."
@@ -303,6 +334,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/red
name = "red skirt"
desc = "A red, casual skirt."
@@ -312,6 +344,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/purple
name = "purple skirt"
desc = "A purple, casual skirt."
@@ -321,6 +354,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/schoolgirl
name = "blue schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -330,21 +364,25 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/schoolgirl/red
name = "red schoolgirl uniform"
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
item_color = "schoolgirlred"
+
/obj/item/clothing/under/schoolgirl/green
name = "green schoolgirl uniform"
icon_state = "schoolgirlgreen"
item_state = "schoolgirlgreen"
item_color = "schoolgirlgreen"
+
/obj/item/clothing/under/schoolgirl/orange
name = "orange schoolgirl uniform"
icon_state = "schoolgirlorange"
item_state = "schoolgirlorange"
item_color = "schoolgirlorange"
+
/obj/item/clothing/under/overalls
name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
@@ -352,6 +390,7 @@
item_state = "lb_suit"
item_color = "overalls"
can_adjust = FALSE
+
/obj/item/clothing/under/pirate
name = "pirate outfit"
desc = "Yarr."
@@ -359,6 +398,7 @@
item_state = "pirate"
item_color = "pirate"
can_adjust = FALSE
+
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
@@ -366,6 +406,7 @@
item_state = "soviet"
item_color = "soviet"
can_adjust = FALSE
+
/obj/item/clothing/under/redcoat
name = "redcoat uniform"
desc = "Looks old."
@@ -373,6 +414,7 @@
item_state = "redcoat"
item_color = "redcoat"
can_adjust = FALSE
+
/obj/item/clothing/under/kilt
name = "kilt"
desc = "Includes shoes and plaid."
@@ -382,6 +424,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/kilt/highlander
desc = "You're the only one worthy of this kilt."
@@ -398,6 +441,7 @@
body_parts_covered = CHEST|GROIN|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
desc = "Are you not entertained? Is that not why you are here?"
@@ -408,9 +452,11 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = NO_SENSORS
+
/obj/item/clothing/under/sundress
name = "sundress"
desc = "Makes you want to frolic in a field of daisies."
@@ -420,6 +466,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/captainparade
name = "captain's parade uniform"
desc = "A captain's luxury-wear, for special occasions."
@@ -427,6 +474,7 @@
item_state = "by_suit"
item_color = "captain_parade"
can_adjust = FALSE
+
/obj/item/clothing/under/hosparademale
name = "head of security's parade uniform"
desc = "A male head of security's luxury-wear, for special occasions."
@@ -434,6 +482,7 @@
item_state = "r_suit"
item_color = "hos_parade_male"
can_adjust = FALSE
+
/obj/item/clothing/under/hosparadefem
name = "head of security's parade uniform"
desc = "A female head of security's luxury-wear, for special occasions."
@@ -442,6 +491,7 @@
item_color = "hos_parade_fem"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/assistantformal
name = "assistant's formal uniform"
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
@@ -449,6 +499,7 @@
item_state = "gy_suit"
item_color = "assistant_formal"
can_adjust = FALSE
+
/obj/item/clothing/under/blacktango
name = "black tango dress"
desc = "Filled with Latin fire."
@@ -457,6 +508,7 @@
item_color = "black_tango"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
@@ -466,6 +518,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_FULL
can_adjust = FALSE
+
/obj/item/clothing/under/sailordress
name = "sailor dress"
desc = "Formal wear for a leading lady."
@@ -475,6 +528,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
@@ -483,6 +537,7 @@
item_color = "red_evening_gown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/maid
name = "maid costume"
desc = "Maid in China."
@@ -492,10 +547,12 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/maid/Initialize()
. = ..()
var/obj/item/clothing/accessory/maidapron/A = new (src)
attach_accessory(A)
+
/obj/item/clothing/under/janimaid
name = "maid uniform"
desc = "A simple maid uniform for housekeeping."
@@ -505,6 +562,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/plaid_skirt
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
@@ -514,6 +572,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/plaid_skirt/blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
@@ -523,6 +582,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/plaid_skirt/purple
name = "purple plaid skirt"
desc = "A preppy purple skirt with a white blouse."
@@ -532,6 +592,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/singery
name = "yellow performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -542,6 +603,7 @@
fitted = NO_FEMALE_UNIFORM
alternate_worn_layer = ABOVE_SHOES_LAYER
can_adjust = FALSE
+
/obj/item/clothing/under/singerb
name = "blue performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -552,6 +614,7 @@
alternate_worn_layer = ABOVE_SHOES_LAYER
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/plaid_skirt/green
name = "green plaid skirt"
desc = "A preppy green skirt with a white blouse."
@@ -561,14 +624,17 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/jester
name = "jester suit"
desc = "A jolly dress, well suited to entertain your master, nuncle."
icon_state = "jester"
item_color = "jester"
can_adjust = FALSE
+
/obj/item/clothing/under/jester/alt
icon_state = "jester2"
+
/obj/item/clothing/under/geisha
name = "geisha suit"
desc = "Cute space ninja senpai not included."
@@ -576,12 +642,14 @@
item_color = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
+
/obj/item/clothing/under/villain
name = "villain suit"
desc = "A change of wardrobe is necessary if you ever want to catch a real superhero."
icon_state = "villain"
item_color = "villain"
can_adjust = FALSE
+
/obj/item/clothing/under/sailor
name = "sailor suit"
desc = "Skipper's in the wardroom drinkin gin'."
@@ -650,6 +718,7 @@
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
+
/obj/item/clothing/under/mummy
name = "mummy wrapping"
desc = "Return the slab or suffer my stale references."
@@ -660,6 +729,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/scarecrow
name = "scarecrow clothes"
desc = "Perfect camouflage for hiding in botany."
@@ -670,6 +740,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/draculass
name = "draculass coat"
desc = "A dress inspired by the ancient \"Victorian\" era."
@@ -679,6 +750,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/drfreeze
name = "doctor freeze's jumpsuit"
desc = "A modified scientist jumpsuit to look extra cool."
@@ -686,6 +758,7 @@
item_state = "drfreeze"
item_color = "drfreeze"
can_adjust = FALSE
+
/obj/item/clothing/under/lobster
name = "foam lobster suit"
desc = "Who beheaded the college mascot?"
@@ -694,6 +767,7 @@
item_color = "lobster"
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
+
/obj/item/clothing/under/gondola
name = "gondola hide suit"
desc = "Now you're cooking."
@@ -701,6 +775,7 @@
item_state = "lb_suit"
item_color = "gondola"
can_adjust = FALSE
+
/obj/item/clothing/under/skeleton
name = "skeleton jumpsuit"
desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!"
@@ -720,6 +795,14 @@
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
+/obj/item/clothing/under/telegram
+ name = "telegram suit"
+ desc = "Bright and red, hard to miss. Mostly warn by hotel staff or singing telegram."
+ icon_state = "telegram"
+ item_state = "telegram"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
+
/obj/item/clothing/under/durathread
name = "durathread jumpsuit"
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm
index fdfb959fe6..00878d1c59 100644
--- a/code/modules/crafting/recipes/recipes_misc.dm
+++ b/code/modules/crafting/recipes/recipes_misc.dm
@@ -47,16 +47,17 @@
/datum/crafting_recipe/goldenbox
name = "Gold Plated Toolbox"
result = /obj/item/storage/toolbox/gold_fake
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
/obj/item/stack/cable_coil = 10,
/obj/item/stack/sheet/mineral/gold = 1,
- /obj/item/stock_parts/cell = 1,
/datum/reagent/water = 15)
time = 40
category = CAT_MISC
/datum/crafting_recipe/bronze_driver
name = "Bronze Plated Screwdriver"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/screwdriver/bronze
reqs = list(/obj/item/screwdriver = 1,
/obj/item/stack/cable_coil = 10,
@@ -67,6 +68,7 @@
/datum/crafting_recipe/bronze_welder
name = "Bronze Plated Welding Tool"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/weldingtool/bronze
reqs = list(/obj/item/weldingtool = 1,
/obj/item/stack/cable_coil = 10,
@@ -77,6 +79,7 @@
/datum/crafting_recipe/bronze_wirecutters
name = "Bronze Plated Wirecutters"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/wirecutters/bronze
reqs = list(/obj/item/wirecutters = 1,
/obj/item/stack/cable_coil = 10,
@@ -87,6 +90,7 @@
/datum/crafting_recipe/bronze_crowbar
name = "Bronze Plated Crowbar"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/crowbar/bronze
reqs = list(/obj/item/crowbar = 1,
/obj/item/stack/cable_coil = 10,
@@ -97,6 +101,7 @@
/datum/crafting_recipe/bronze_wrench
name = "Bronze Plated Wrench"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/wrench/bronze
reqs = list(/obj/item/wrench = 1,
/obj/item/stack/cable_coil = 10,
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index eaa31c01bf..944fbb8df8 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -187,9 +187,11 @@
return time2text(world.time + 432000, ":ss")
/obj/item/detective_scanner/AltClick(mob/living/user)
+ . = ..()
// Best way for checking if a player can use while not incapacitated, etc
if(!user.canUseTopic(src, be_close=TRUE))
return
+ . = TRUE
if(!LAZYLEN(log))
to_chat(user, "Cannot clear logs, the scanner has no logs.")
return
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index e041d566e9..41b2bfee5a 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
throwforce = 100
density = TRUE
anchored = TRUE
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/mob/living/wizard
var/z_original = 0
var/destination
@@ -100,9 +101,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/ex_act(severity, target)
return 0
-/obj/structure/closet/supplypod/prevent_content_explosion()
- return TRUE
-
/obj/effect/immovablerod/singularity_act()
return
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 26591547c0..236eed5c09 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -21,7 +21,7 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
- startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
+ startWhen = rand(60, 90) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
if(GLOB.singularity_counter)
startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
endWhen = startWhen + 60
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index 88059f7468..f006f2b358 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -133,7 +133,7 @@
shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator)
if(RUSKY_PARTY)
- var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party]
+ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/misc/party]
pack.generate(pick_n_take(empty_shuttle_turfs))
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index b5f02b79d7..f5262742e2 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -21,7 +21,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/delusion = 2,
/datum/hallucination/shock = 1,
/datum/hallucination/death = 1,
- /datum/hallucination/oh_yeah = 1
+ /datum/hallucination/oh_yeah = 1,
+ /datum/hallucination/sleeping_carp = 1
))
@@ -1294,3 +1295,26 @@ GLOBAL_LIST_INIT(hallucination_list, list(
H.preparePixelProjectile(target, start)
H.fire()
qdel(src)
+
+/datum/hallucination/sleeping_carp
+
+/datum/hallucination/sleeping_carp/New(mob/living/carbon/C, forced = TRUE)
+ set waitfor = FALSE
+ ..()
+ var/list/mobsyup
+ for (var/mob/living/carbon/A in orange(C,1))
+ if (get_dist(C,A) < 2)
+ LAZYADD(mobsyup,A)
+ if (!LAZYLEN(mobsyup))
+ qdel(src)
+ return
+ var/mob/living/carbon/G = pick(mobsyup)
+ if (prob(50))
+ C.visible_message("[C] falls to the ground screaming and clutching [C.p_their()] wrist!", \
+ "[G] grabs your wrist and violently wrenches it to the side!")
+ C.emote("scream")
+ C.dropItemToGround(C.get_active_held_item())
+ C.Knockdown(60)
+ else
+ to_chat(C,"[G] violently grabs you!")
+ qdel(src)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index d838b31aba..b8a63afb7f 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -319,13 +319,13 @@ All foods are distributed among various categories. Use common sense.
if(iscorgi(M))
var/mob/living/L = M
if(bitecount == 0 || prob(50))
- M.emote("me", 1, "nibbles away at \the [src]")
+ M.emote("me", EMOTE_VISIBLE, "nibbles away at \the [src]")
bitecount++
L.taste(reagents) // why should carbons get all the fun?
if(bitecount >= 5)
var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")
if(sattisfaction_text)
- M.emote("me", 1, "[sattisfaction_text]")
+ M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]")
qdel(src)
// //////////////////////////////////////////////Store////////////////////////////////////////
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index fed4fa21ec..a58435959c 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -229,7 +229,7 @@
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
- list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ list_reagents = list("nutriment" = 4)
tastes = list("cream" = 2, "waffle" = 1)
var/ice_creamed = 0
var/cone_type
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index e67de92773..4efac6f508 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -186,8 +186,10 @@
..()
/obj/machinery/microwave/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, !issilicon(usr)))
cook()
+ return TRUE
/obj/machinery/microwave/ui_interact(mob/user)
. = ..()
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index fe038ce3f1..4fbb931b32 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -130,9 +130,11 @@
update_icon()
/obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user)
+ . = ..()
if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE))
return
Flip()
+ return TRUE
/obj/item/toy/cards/singlecard/cas/update_icon()
if(flipped)
diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm
index 5b9b2ac21d..24225c1a20 100644
--- a/code/modules/holiday/halloween/halloween.dm
+++ b/code/modules/holiday/halloween/halloween.dm
@@ -252,12 +252,11 @@
// Spooky Uplink Items //
/////////////////////////
-/datum/uplink_item/dangerous/crossbow/candy
+/datum/uplink_item/stealthy_weapons/crossbow/candy
name = "Candy Corn Crossbow"
desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!"
category = "Holiday"
item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
- cost = 12
surplus = 0
/datum/uplink_item/device_tools/emag/hack_o_lantern
diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm
index 4787d62230..a898b76ee8 100644
--- a/code/modules/hydroponics/grown/cotton.dm
+++ b/code/modules/hydroponics/grown/cotton.dm
@@ -32,7 +32,7 @@
var/cotton_name = "raw cotton"
/obj/item/grown/cotton/attack_self(mob/user)
- user.show_message("You pull some [cotton_name] out of the [name]!", 1)
+ user.show_message("You pull some [cotton_name] out of the [name]!", MSG_VISUAL)
var/seed_modifier = 0
if(seed)
seed_modifier = round(seed.potency / 25)
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 08ce71ad37..8fc141e152 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -56,11 +56,41 @@
/obj/item/reagent_containers/food/snacks/grown/grass/fairy
seed = /obj/item/seeds/grass/fairy
name = "fairygrass"
- desc = "Blue, glowing, and smells fainly of mushrooms."
+ desc = "Glowing, and smells fainly of mushrooms."
icon_state = "fairygrassclump"
filling_color = "#3399ff"
stacktype = /obj/item/stack/tile/fairygrass
+/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user)
+ var/datum/plant_gene/trait/glow/G = null
+ for(var/datum/plant_gene/trait/glow/gene in seed.genes)
+ G = gene
+ break
+
+ stacktype = initial(stacktype)
+
+ if(G)
+ switch(G.type)
+ if(/datum/plant_gene/trait/glow/white)
+ stacktype = /obj/item/stack/tile/fairygrass/white
+ if(/datum/plant_gene/trait/glow/red)
+ stacktype = /obj/item/stack/tile/fairygrass/red
+ if(/datum/plant_gene/trait/glow/yellow)
+ stacktype = /obj/item/stack/tile/fairygrass/yellow
+ if(/datum/plant_gene/trait/glow/green)
+ stacktype = /obj/item/stack/tile/fairygrass/green
+ if(/datum/plant_gene/trait/glow/blue)
+ stacktype = /obj/item/stack/tile/fairygrass/blue
+ if(/datum/plant_gene/trait/glow/purple)
+ stacktype = /obj/item/stack/tile/fairygrass/purple
+ if(/datum/plant_gene/trait/glow/pink)
+ stacktype = /obj/item/stack/tile/fairygrass/pink
+
+ . = ..()
+
+
+
+
// Carpet
/obj/item/seeds/grass/carpet
name = "pack of carpet seeds"
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 9d91d028ba..16992b3e96 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -226,9 +226,12 @@
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0)
+ addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100))
+
+/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate()
reagents.chem_temp = 1000 //Sets off the black powder
reagents.handle_reactions()
-
+
// Lavaland cactus
/obj/item/seeds/lavaland/cactus
diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm
index 02bc776b78..46dc49a169 100644
--- a/code/modules/hydroponics/grown/pumpkin.dm
+++ b/code/modules/hydroponics/grown/pumpkin.dm
@@ -29,7 +29,7 @@
/obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params)
if(W.get_sharpness())
- user.show_message("You carve a face into [src]!", 1)
+ user.show_message("You carve a face into [src]!", MSG_VISUAL)
new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc)
qdel(src)
return
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 9a660ac282..9d7081ad65 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -51,7 +51,7 @@
/obj/item/grown/log/attackby(obj/item/W, mob/user, params)
if(W.sharpness)
- user.show_message("You make [plank_name] out of \the [src]!", 1)
+ user.show_message("You make [plank_name] out of \the [src]!", MSG_VISUAL)
var/seed_modifier = 0
if(seed)
seed_modifier = round(seed.potency / 25)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 74185e9b3f..3597ed5be6 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -299,7 +299,7 @@
rate = 0.04
glow_color = "#AAD84B"
-datum/plant_gene/trait/glow/white
+/datum/plant_gene/trait/glow/white
name = "White Bioluminescence"
glow_color = "#FFFFFF"
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 93ddedebc0..d8bf82a4b4 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -615,6 +615,11 @@
return
..()
+/obj/item/electronic_assembly/can_trigger_gun(mob/living/user) //sanity checks against pocket death weapon circuits
+ if(!can_fire_equipped || !user.is_holding(src))
+ return FALSE
+ return ..()
+
/obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves.
name = "type-a electronic assembly"
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index cec3e2348e..40bcbe016b 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -402,3 +402,8 @@ a creative player the means to solve many problems. Circuits are held inside an
return TRUE
return FALSE
+
+/obj/item/integrated_circuit/can_trigger_gun(mob/living/user)
+ if(!user.is_holding(src))
+ return FALSE
+ return ..()
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index b7feedd312..46f8017b10 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -859,7 +859,7 @@
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 5
-/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
. = ..()
var/translated = FALSE
if(speaker && message)
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index fb00897eec..0bdf0547f9 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -11,7 +11,7 @@
w_class = WEIGHT_CLASS_SMALL
complexity = 10
cooldown_per_use = 1
- ext_cooldown = 2
+ ext_cooldown = 4
inputs = list("direction" = IC_PINTYPE_DIR)
outputs = list("obstacle" = IC_PINTYPE_REF)
activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT)
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index 7bccbfafcd..350f05914d 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -81,9 +81,13 @@
to_chat(user, "There's no weapon to remove from the mechanism.")
/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
- if(!installed_gun || !installed_gun.handle_pins())
+ if(!assembly || !installed_gun)
return
- if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
+ if(isliving(assembly.loc))
+ var/mob/living/L = assembly.loc
+ if(!assembly.can_fire_equipped || !L.is_holding(assembly) || !installed_gun.can_trigger_gun(L)) //includes pins, hulk and other chunky fingers checks.
+ return
+ else if(!isturf(assembly.loc) || !installed_gun.handle_pins())
return
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
@@ -92,18 +96,17 @@
var/datum/integrated_io/mode1 = inputs[3]
mode = mode1.data
- if(assembly)
- if(isnum(xo.data))
- xo.data = round(xo.data, 1)
- if(isnum(yo.data))
- yo.data = round(yo.data, 1)
+ if(isnum(xo.data))
+ xo.data = round(xo.data, 1)
+ if(isnum(yo.data))
+ yo.data = round(yo.data, 1)
- var/turf/T = get_turf(assembly)
- var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
- var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
+ var/turf/T = get_turf(assembly)
+ var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
+ var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
- assembly.visible_message("[assembly] fires [installed_gun]!")
- shootAt(locate(target_x, target_y, T.z))
+ assembly.visible_message("[assembly] fires [installed_gun]!")
+ shootAt(locate(target_x, target_y, T.z))
/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
var/turf/T = get_turf(src)
@@ -246,26 +249,30 @@
if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
return
- if(!AT || !AT.air_contents)
+ var/obj/item/I = get_object()
+ var/turf/T = get_turf(I)
+ if(!T)
+ return
+ if(isliving(I.loc))
+ var/mob/living/L = I.loc
+ if(!I.can_trigger_gun(L)) //includes hulk and other chunky fingers checks.
+ return
+ if(HAS_TRAIT(L, TRAIT_PACIFISM) && A.throwforce)
+ to_chat(L, " [I] is lethally chambered! You don't want to risk harming anyone...")
+ return
+ else if(T != I.loc)
return
- if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
+ if(!AT || !AT.air_contents)
return
if(max_w_class && (A.w_class > max_w_class))
return
- if(!assembly.can_fire_equipped && ishuman(assembly.loc))
- return
-
// Is the target inside the assembly or close to it?
if(!check_target(A, exclude_components = TRUE))
return
- var/turf/T = get_turf(get_object())
- if(!T)
- return
-
// If the item is in mob's inventory, try to remove it from there.
if(ismob(A.loc))
var/mob/living/M = A.loc
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index ad665ab701..4bcfab5836 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -36,7 +36,7 @@
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
- AI.set_core_display_icon(M.client)
+ AI.set_core_display_icon(null, M.client)
//we may have been created after our borg
if(SSticker.current_state == GAME_STATE_SETTING_UP)
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index f98f0755c8..4cfd2e447f 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -181,10 +181,11 @@
else
return ..()
+//this helps you not blow up so easily by overriding unlocking which results in an immediate boom.
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom.
+ if(user.canUseTopic(src, BE_CLOSE))
+ attack_hand(user)
+ return TRUE
/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user)
if(locked)
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index 00ce37b79a..9d595664ff 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -59,6 +59,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
+ . = TRUE
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
@@ -128,9 +129,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
return ..()
/obj/structure/marker_beacon/AltClick(mob/living/user)
- ..()
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
+ . = TRUE
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 054103e8dc..ab3b20ac9f 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -398,6 +398,7 @@
fire_sound = 'sound/weapons/batonextend.ogg'
max_charges = 1
item_flags = NEEDS_PERMIT | NOBLUDGEON
+ w_class = WEIGHT_CLASS_BULKY
force = 18
/obj/item/ammo_casing/magic/hook
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 7eeab05466..69cbd0830a 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -22,7 +22,7 @@
. = say_dead(message)
-/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
@@ -35,6 +35,6 @@
to_follow = V.source
var/link = FOLLOW_LINK(src, to_follow)
// Recompose the message, because it's scrambled by default
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)
to_chat(src, "[link] [message]")
diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm
index 2f8ffb4c01..f5d210b94b 100644
--- a/code/modules/mob/living/carbon/alien/damage_procs.dm
+++ b/code/modules/mob/living/carbon/alien/damage_procs.dm
@@ -7,9 +7,9 @@
/* CIT CHANGE - Pffffffffffffhahahahahhaha-- No.
//aliens are immune to stamina damage.
-/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1)
+/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1)
return
-/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1)
+/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1)
return
*/
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index b0e9b808df..c5aeb2c1c7 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -355,30 +355,30 @@
if (damage == 1)
to_chat(src, "Your eyes sting a little.")
if(prob(40))
- adjust_eye_damage(1)
+ eyes.applyOrganDamage(1)
else if (damage == 2)
to_chat(src, "Your eyes burn.")
- adjust_eye_damage(rand(2, 4))
+ eyes.applyOrganDamage(rand(2, 4))
else if( damage >= 3)
to_chat(src, "Your eyes itch and burn severely!")
- adjust_eye_damage(rand(12, 16))
+ eyes.applyOrganDamage(rand(12, 16))
- if(eyes.eye_damage > 10)
+ if(eyes.damage > 10)
blind_eyes(damage)
blur_eyes(damage * rand(3, 6))
- if(eyes.eye_damage > 20)
- if(prob(eyes.eye_damage - 20))
+ if(eyes.damage > 20)
+ if(prob(eyes.damage - 20))
if(!HAS_TRAIT(src, TRAIT_NEARSIGHT))
to_chat(src, "Your eyes start to burn badly!")
become_nearsighted(EYE_DAMAGE)
- else if(prob(eyes.eye_damage - 25))
+ else if(prob(eyes.damage - 25))
if(!HAS_TRAIT(src, TRAIT_BLIND))
to_chat(src, "You can't see anything!")
- become_blind(EYE_DAMAGE)
+ eyes.applyOrganDamage(eyes.maxHealth)
else
to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9eab9054f5..3ae2e3bdbd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1043,6 +1043,21 @@
/mob/living/carbon/human/species/golem/plastic
race = /datum/species/golem/plastic
+/mob/living/carbon/human/species/golem/bronze
+ race = /datum/species/golem/bronze
+
+/mob/living/carbon/human/species/golem/cardboard
+ race = /datum/species/golem/cardboard
+
+/mob/living/carbon/human/species/golem/leather
+ race = /datum/species/golem/leather
+
+/mob/living/carbon/human/species/golem/bone
+ race = /datum/species/golem/bone
+
+/mob/living/carbon/human/species/golem/durathread
+ race = /datum/species/golem/durathread
+
/mob/living/carbon/human/species/golem/clockwork
race = /datum/species/golem/clockwork
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 327ad6760c..f9fa5d84da 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -661,6 +661,12 @@
if(health >= 0)
if(src == M)
+ if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
+ to_chat(src, "You attempt to remove the durathread strand from around your neck.")
+ if(do_after(src, 35, null, src))
+ to_chat(src, "You succesfuly remove the durathread strand.")
+ remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+ return
var/to_send = ""
visible_message("[src] examines [p_them()]self.", \
"You check yourself for injuries.")
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 26703977d2..69ec619e5d 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -191,7 +191,6 @@
if(G.vision_correction)
if(HAS_TRAIT(src, TRAIT_NEARSIGHT))
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
- adjust_eye_damage(0)
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
update_sight()
if(!QDELETED(src))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 7ff4f355d5..96bd62b1f6 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
QDEL_NULL(eyes)
if(should_have_eyes && !eyes)
eyes = new mutanteyes
- eyes.Insert(C)
+ eyes.Insert(C, TRUE)
if(ears && (replace_current || !should_have_ears))
ears.Remove(C,1)
@@ -1537,6 +1537,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
+ user.dna.species.spec_unarmedattacked(user, target)
if(user.limb_destroyer)
target.dismembering_strike(user, affecting.body_zone)
@@ -1550,6 +1551,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(target.lying)
target.forcesay(GLOB.hit_appends)
+/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
+ return
+
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
// CITADEL EDIT slap mouthy gits and booty
var/aim_for_mouth = user.zone_selected == "mouth"
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index edd0be01b0..48ce55a052 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -862,27 +862,27 @@
if(M.stat == DEAD) //F
return
if(M == H)
- H.show_message("You cringe with pain as your body rings around you!", 2)
+ H.show_message("You cringe with pain as your body rings around you!", MSG_AUDIBLE)
H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
H.soundbang_act(2, 0, 100, 1)
H.jitteriness += 7
var/distance = max(0,get_dist(get_turf(H),get_turf(M)))
switch(distance)
if(0 to 1)
- M.show_message("GONG!", 2)
+ M.show_message("GONG!", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
M.soundbang_act(1, 0, 30, 3)
M.confused += 10
M.jitteriness += 4
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
if(2 to 3)
- M.show_message("GONG!", 2)
+ M.show_message("GONG!", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE)
M.soundbang_act(1, 0, 15, 2)
M.jitteriness += 3
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
else
- M.show_message("GONG!", 2)
+ M.show_message("GONG!", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE)
@@ -944,6 +944,21 @@
grab_sound = 'sound/weapons/whipgrab.ogg'
attack_sound = 'sound/weapons/whip.ogg'
+/datum/species/golem/durathread
+ name = "Durathread Golem"
+ id = "durathread golem"
+ prefix = "Durathread"
+ limbs_id = "d_golem"
+ special_names = list("Boll","Weave")
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES)
+ fixed_mut_color = null
+ inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
+
+/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
+ . = ..()
+ target.apply_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+
/datum/species/golem/bone
name = "Bone Golem"
id = "bone golem"
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index bc2d6132e1..eed3a17c34 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -85,7 +85,7 @@
return not_handled
-/mob/living/carbon/doUnEquip(obj/item/I)
+/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
return
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 3c587a05dd..16a9f07ceb 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -98,7 +98,7 @@
var/datum/gas_mixture/breath
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING))
+ if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || HAS_TRAIT(src, TRAIT_MAGIC_CHOKE) || (lungs && lungs.organ_flags & ORGAN_FAILING))
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
else if(health <= crit_threshold)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index f9c2e2dd3d..025c1a2f75 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -63,8 +63,6 @@
var/amount
if(reagents.has_reagent("morphine"))
amount = -1
- if(reagents.has_reagent("nuka_cola"))
- amount = -1
if(amount)
add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 766bd376b1..6c497bb8d4 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -2,44 +2,6 @@
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait.
-/mob/living/carbon/damage_eyes(amount)
- var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
- if (!eyes)
- return
- if(amount>0)
- eyes.eye_damage = amount
- if(eyes.eye_damage > 20)
- if(eyes.eye_damage > 30)
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
- else
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
-
-/mob/living/carbon/set_eye_damage(amount)
- var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
- if (!eyes)
- return
- eyes.eye_damage = max(amount,0)
- if(eyes.eye_damage > 20)
- if(eyes.eye_damage > 30)
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
- else
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
- else
- clear_fullscreen("eye_damage")
-
-/mob/living/carbon/adjust_eye_damage(amount)
- var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
- if (!eyes)
- return
- eyes.eye_damage = max(eyes.eye_damage+amount, 0)
- if(eyes.eye_damage > 20)
- if(eyes.eye_damage > 30)
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
- else
- overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
- else
- clear_fullscreen("eye_damage")
-
/mob/living/carbon/adjust_drugginess(amount)
druggy = max(druggy+amount, 0)
if(druggy)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index dc43ab8b07..57b65a53f7 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -225,10 +225,10 @@
/mob/living/proc/getStaminaLoss()
return staminaloss
-/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
+/mob/living/proc/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
-/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
+/mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
// heal ONE external organ, organ gets randomly selected from damaged ones.
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6ced2a05a1..5299618177 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -502,7 +502,6 @@
bodytemperature = BODYTEMP_NORMAL
set_blindness(0)
set_blurriness(0)
- set_eye_damage(0)
cure_nearsighted()
cure_blind()
cure_husk()
@@ -1221,7 +1220,8 @@
if("eye_blind")
set_blindness(var_value)
if("eye_damage")
- set_eye_damage(var_value)
+ var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
+ E?.setOrganDamage(var_value)
if("eye_blurry")
set_blurriness(var_value)
if("maxHealth")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 174fd5c394..4c670129c1 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -212,11 +212,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(succumbed)
succumb()
- to_chat(src, compose_message(src, language, message, , spans, message_mode))
+ to_chat(src, compose_message(src, language, message, null, spans, message_mode))
return 1
-/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(!client)
return
@@ -231,13 +231,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
deaf_type = 2 // Since you should be able to hear yourself without looking
// Recompose message for AI hrefs, language incomprehension.
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
- message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)
- show_message(message, 2, deaf_message, deaf_type)
- return message
-
-/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+ show_message(message, MSG_AUDIBLE, deaf_message, deaf_type)
return message
/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode)
@@ -248,8 +244,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source)
var/list/the_dead = list()
var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas
- if(say_test(message) == "2") //CIT CHANGE - ditto
- yellareas = get_areas_in_range(message_range*0.5,src) //CIT CHANGE - ditto
+ if(!eavesdrop_range && say_test(message) == "2") //CIT CHANGE - ditto
+ yellareas = get_areas_in_range(message_range*0.5, source) //CIT CHANGE - ditto
for(var/_M in GLOB.player_list)
var/mob/M = _M
if(M.stat != DEAD) //not dead, not important
@@ -260,7 +256,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
continue
if(!M.client || !client) //client is so that ghosts don't have to listen to mice
continue
- if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing
+ if(get_dist(M, source) > 7 || M.z != z) //they're out of range of normal hearing
if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off
continue
if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off
@@ -272,15 +268,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/eavesrendered
if(eavesdrop_range)
eavesdropping = stars(message)
- eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode)
+ eavesrendered = compose_message(src, message_language, eavesdropping, null, spans, message_mode, FALSE, source)
- var/rendered = compose_message(src, message_language, message, , spans, message_mode)
+ var/rendered = compose_message(src, message_language, message, null, spans, message_mode, FALSE, source)
for(var/_AM in listening)
var/atom/movable/AM = _AM
if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM]))
- AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode)
+ AM.Hear(eavesrendered, src, message_language, eavesdropping, null, spans, message_mode, source)
else
- AM.Hear(rendered, src, message_language, message, , spans, message_mode)
+ AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message)
//speech bubble
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index b9e289be5b..0444458841 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -176,13 +176,13 @@
fire_stacks = 0
. = ..()
-/mob/living/silicon/ai/proc/set_core_display_icon(client/C)
+/mob/living/silicon/ai/proc/set_core_display_icon(input, client/C)
if(client && !C)
C = client
- if(!(C?.prefs?.preferred_ai_core_display))
- icon_state = display_icon_override || initial(icon_state)
+ if(!input && !C?.prefs?.preferred_ai_core_display)
+ icon_state = initial(icon_state)
else
- var/preferred_icon = display_icon_override || C.prefs.preferred_ai_core_display
+ var/preferred_icon = input ? input : C.prefs.preferred_ai_core_display
icon_state = resolve_ai_icon(preferred_icon)
/mob/living/silicon/ai/verb/pick_icon()
@@ -202,8 +202,9 @@
if(!ai_core_icon || incapacitated())
return
+
display_icon_override = ai_core_icon
- set_core_display_icon()
+ set_core_display_icon(ai_core_icon)
/mob/living/silicon/ai/Stat()
..()
@@ -600,7 +601,10 @@
if(incapacitated())
return
var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Thinking", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow")
- emote_display = input("Please, select a status!", "AI Status", null, null) in ai_emotions
+ var/n_emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
+ if(!n_emote)
+ return
+ emote_display = n_emote
for (var/each in GLOB.ai_status_displays) //change status of displays
var/obj/machinery/status_display/ai/M = each
M.emotion = emote_display
@@ -827,7 +831,7 @@
var/rendered = "[start][hrefpart][namepart] ([jobpart]) [raw_message]"
- show_message(rendered, 2)
+ show_message(rendered, MSG_AUDIBLE)
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
..()
@@ -887,7 +891,7 @@
. = ..()
if(.) //successfully ressuscitated from death
set_eyeobj_visible(TRUE)
- set_core_display_icon()
+ set_core_display_icon(display_icon_override)
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
malfhack = null
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index c28f08d5b0..7477ba7713 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -191,7 +191,7 @@
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
-/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker))
ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index 8fbd7afbdd..91a6709bc9 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -30,10 +30,10 @@
/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
-/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage.
+/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage.
return FALSE
-/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1)
+/mob/living/silicon/setStaminaLoss(amount, updating_health = 1)
return FALSE
/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4f844151a2..0484e39c1a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1295,6 +1295,6 @@
bellyup = 1
update_icons()
-/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
+/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_health = 1)
if(istype(cell))
cell.charge -= amount*5
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index cda4978f50..b9cee43138 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -13,6 +13,7 @@
mob_biotypes = list(MOB_ROBOTIC)
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
speech_span = SPAN_ROBOT
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
no_vore = TRUE
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
@@ -71,9 +72,6 @@
/mob/living/silicon/contents_explosion(severity, target)
return
-/mob/living/silicon/prevent_content_explosion()
- return TRUE
-
/mob/living/silicon/proc/cancelAlarm()
return
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 105cdaf5b0..e61cfad068 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -674,11 +674,11 @@ Pass a positive integer as an argument to override a bot's default speed.
destination = nearest_beacon
//PDA control. Some bots, especially MULEs, may have more parameters.
-/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, turf/user_turf, list/user_access = list())
+/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, list/user_access = list())
if(!on || emagged == 2 || remote_disabled) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands.
return TRUE //ACCESS DENIED
if(client)
- bot_control_message(command,user,user_turf,user_access)
+ bot_control_message(command, user)
// process control input
switch(command)
if("patroloff")
@@ -690,7 +690,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if("summon")
bot_reset()
- summon_target = user_turf
+ summon_target = get_turf(user)
if(user_access.len != 0)
access_card.access = user_access + prev_access //Adds the user's access, if any.
mode = BOT_SUMMON
@@ -702,15 +702,14 @@ Pass a positive integer as an argument to override a bot's default speed.
return
//
-/mob/living/simple_animal/bot/proc/bot_control_message(command,user,user_turf,user_access)
+/mob/living/simple_animal/bot/proc/bot_control_message(command, user)
switch(command)
if("patroloff")
to_chat(src, "STOP PATROL")
if("patrolon")
to_chat(src, "START PATROL")
if("summon")
- var/area/a = get_area(user_turf)
- to_chat(src, "PRIORITY ALERT:[user] in [a.name]!")
+ to_chat(src, "PRIORITY ALERT:[user] in [get_area_name(user)]!")
if("stop")
to_chat(src, "STOP!")
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 72f255137d..426de81da0 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -218,7 +218,7 @@
bot_control(action, usr) // Kill this later.
. = TRUE
-/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0, turf/user_turf, list/user_access = list())
+/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = FALSE)
if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires.
return
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 58d8a3ccca..73fd2b5569 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -169,40 +169,40 @@
/mob/living/simple_animal/pet/cat/Life()
if(!stat && !buckled && !client)
if(prob(1))
- emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
+ emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
icon_state = "[icon_living]_rest"
collar_type = "[initial(collar_type)]_rest"
resting = 1
update_canmove()
else if (prob(1))
- emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
+ emote("me", EMOTE_VISIBLE, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit"
collar_type = "[initial(collar_type)]_sit"
resting = 1
update_canmove()
else if (prob(1))
if (resting)
- emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting."))
+ emote("me", EMOTE_VISIBLE, pick("gets up and meows.", "walks around.", "stops resting."))
icon_state = "[icon_living]"
collar_type = "[initial(collar_type)]"
resting = 0
update_canmove()
else
- emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
+ emote("me", EMOTE_VISIBLE, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE!
if((src.loc) && isturf(src.loc))
if(!stat && !resting && !buckled)
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
- emote("me", 1, "splats \the [M]!")
+ emote("me", EMOTE_VISIBLE, "splats \the [M]!")
M.splat()
movement_target = null
stop_automated_movement = 0
break
for(var/obj/item/toy/cattoy/T in view(1,src))
if (T.cooldown < (world.time - 400))
- emote("me", 1, "bats \the [T] around with its paw!")
+ emote("me", EMOTE_VISIBLE, "bats \the [T] around with its paw!")
T.cooldown = world.time
..()
@@ -241,10 +241,10 @@
if(change > 0)
if(M && stat != DEAD)
new /obj/effect/temp_visual/heart(loc)
- emote("me", 1, "purrs!")
+ emote("me", EMOTE_VISIBLE, "purrs!")
else
if(M && stat != DEAD)
- emote("me", 1, "hisses!")
+ emote("me", EMOTE_VISIBLE, "hisses!")
/mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie
name = "Keeki"
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index c194233c42..eb7129181d 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -459,10 +459,10 @@
movement_target.attack_animal(src)
else if(ishuman(movement_target.loc) )
if(prob(20))
- emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
+ emote("me", EMOTE_VISIBLE, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
if(prob(1))
- emote("me", 1, pick("dances around.","chases its tail!"))
+ emote("me", EMOTE_VISIBLE, pick("dances around.","chases its tail!"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -618,7 +618,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
- emote("me", 1, pick("dances around.","chases her tail."))
+ emote("me", EMOTE_VISIBLE, pick("dances around.","chases her tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -629,7 +629,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
- emote("me", 1, pick("chases its tail."))
+ emote("me", EMOTE_VISIBLE, pick("chases its tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -648,8 +648,8 @@
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
new /obj/effect/temp_visual/heart(loc)
- emote("me", 1, "yaps happily!")
+ emote("me", EMOTE_VISIBLE, "yaps happily!")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi)
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
- emote("me", 1, "growls!")
+ emote("me", EMOTE_VISIBLE, "growls!")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index 3ece5d4e27..49514d0d12 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -3,8 +3,8 @@
ranged = 1 //technically
ranged_message = "charges"
ranged_cooldown_time = 20
- damage_coeff = list(BRUTE = 0, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
- playstyle_string = "As a charger type you do medium damage, take half damage, immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding."
+ damage_coeff = list(BRUTE = 0.2, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
+ playstyle_string = "As a charger type you do medium damage, take half damage, have near immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding."
magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault."
tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online."
carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index b1af34eb02..e9f767376a 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -29,6 +29,7 @@
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
+ altclick_listed_turf(A)
return
if(loc == summoner)
to_chat(src, "You must be manifested to create bombs!")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
index b111caae50..718bfd71af 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
@@ -6,8 +6,8 @@
attack_sound = 'sound/items/welder.ogg'
attacktext = "ignites"
melee_damage_type = BURN
- damage_coeff = list(BRUTE = 0.7, BURN = 0, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you."
+ damage_coeff = list(BRUTE = 0.7, BURN = 0.1, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
+ playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are almost immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you."
magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index d31809e9aa..b9783ed116 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -105,8 +105,9 @@
/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A)
if(!istype(A))
+ altclick_listed_turf(A)
return
- if(src.loc == summoner)
+ if(loc == summoner)
to_chat(src, "You must be manifested to warp a target!")
return
if(!beacon)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 9cd0504315..0377efd16e 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -364,7 +364,7 @@
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
if(target && emote_taunt.len && prob(taunt_chance))
- emote("me", 1, "[pick(emote_taunt)] at [target].")
+ emote("me", EMOTE_VISIBLE, "[pick(emote_taunt)] at [target].")
taunt_chance = max(taunt_chance-7,2)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index f685ff1f97..51a9d8d62b 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -376,7 +376,7 @@ Difficulty: Very Hard
. += observer_desc
. += "It is activated by [activation_method]."
-/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
..()
if(isliving(speaker))
ActivationReaction(speaker, ACTIVATE_SPEECH)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index b1694a6172..0e3cde5628 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -80,7 +80,7 @@ Difficulty: Medium
return FALSE
return ..()
-/mob/living/simple_animal/hostile/megafauna/dragon/visible_message()
+/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs)
if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
return
return ..()
@@ -267,6 +267,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A)
if(!istype(A))
+ altclick_listed_turf(A)
return
if(swoop_cooldown >= world.time)
to_chat(src, "You need to wait 20 seconds between swoop attacks!")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index cca39cfea6..6279821170 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -441,7 +441,7 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
- return
+ return altclick_listed_turf(A)
blink(A)
//Hierophant overlays
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index d62f59cdd7..8c2fbef15e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -25,6 +25,7 @@
mob_size = MOB_SIZE_LARGE
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/list/crusher_loot
var/medal_type
var/score_type = BOSS_SCORE
@@ -41,9 +42,6 @@
QDEL_NULL(internal)
. = ..()
-/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion()
- return TRUE
-
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
return
@@ -118,8 +116,10 @@
recovery_time = world.time + buffer_time
/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill)
- if(!medal_type || (flags_1 & ADMIN_SPAWNED_1) || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set
+ if(!medal_type || (flags_1 & ADMIN_SPAWNED_1)) //Don't award medals if the medal type isn't set
return FALSE
+ if(!SSmedals.hub_enabled) // This allows subtypes to carry on other special rewards not tied with medals. (such as bubblegum's arena shuttle)
+ return TRUE
for(var/mob/living/L in view(7,src))
if(L.stat || !L.client)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5f9c8700bd..3d23baae48 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -143,7 +143,7 @@
stat("Held Item", held_item)
stat("Mode",a_intent)
-/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
+/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()
if(speaker != src && prob(50)) //Dont imitate ourselves
if(!radio_freq || prob(10))
@@ -437,7 +437,7 @@
//Search for item to steal
parrot_interest = search_for_item()
if(parrot_interest)
- emote("me", 1, "looks in [parrot_interest]'s direction and takes flight.")
+ emote("me", EMOTE_VISIBLE, "looks in [parrot_interest]'s direction and takes flight.")
parrot_state = PARROT_SWOOP | PARROT_STEAL
icon_state = icon_living
return
@@ -459,7 +459,7 @@
if(AM)
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
parrot_interest = AM
- emote("me", 1, "turns and flies towards [parrot_interest].")
+ emote("me", EMOTE_VISIBLE, "turns and flies towards [parrot_interest].")
parrot_state = PARROT_SWOOP | PARROT_STEAL
return
else //Else it's a perch
@@ -760,7 +760,7 @@
held_item = null
if(health < maxHealth)
adjustBruteLoss(-10)
- emote("me", 1, "[src] eagerly downs the cracker.")
+ emote("me", EMOTE_VISIBLE, "[src] eagerly downs the cracker.")
return 1
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index ea86ac8963..52e58aea4e 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -185,16 +185,16 @@
say(pick(speak), forced = "poly")
else
if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len))
- emote("me", 1, pick(emote_see))
+ emote("me", EMOTE_VISIBLE, pick(emote_see))
if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len))
- emote("me", 2, pick(emote_hear))
+ emote("me", EMOTE_AUDIBLE, pick(emote_hear))
if((emote_hear && emote_hear.len) && (emote_see && emote_see.len))
var/length = emote_hear.len + emote_see.len
var/pick = rand(1,length)
if(pick <= emote_see.len)
- emote("me", 1, pick(emote_see))
+ emote("me", EMOTE_VISIBLE, pick(emote_see))
else
- emote("me", 2, pick(emote_hear))
+ emote("me", EMOTE_AUDIBLE, pick(emote_hear))
/mob/living/simple_animal/proc/environment_is_safe(datum/gas_mixture/environment, check_temp = FALSE)
diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm
index a2618b711e..c48249d80f 100644
--- a/code/modules/mob/living/simple_animal/slime/say.dm
+++ b/code/modules/mob/living/simple_animal/slime/say.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
. = ..()
if(speaker != src && !radio_freq && !stat)
if (speaker in Friends)
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index cacd1c7c56..7f8513bfd9 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
/mob/living/proc/handle_ventcrawl(atom/A)
if(!ventcrawler || !Adjacent(A))
return
+ . = TRUE //return value to stop the client from being shown the turf contents stat tab on alt-click.
if(stat)
to_chat(src, "You must be conscious to do this!")
return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 7a4603228a..d4528fb91f 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -85,106 +85,120 @@
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
if(type)
- if(type & 1 && eye_blind )//Vision related
+ if(type & MSG_VISUAL && eye_blind )//Vision related
if(!alt_msg)
return
else
msg = alt_msg
type = alt_type
- if(type & 2 && !can_hear())//Hearing related
+ if(type & MSG_AUDIBLE && !can_hear())//Hearing related
if(!alt_msg)
return
else
msg = alt_msg
type = alt_type
- if(type & 1 && eye_blind)
+ if(type & MSG_VISUAL && eye_blind)
return
// voice muffling
if(stat == UNCONSCIOUS)
- if(type & 2) //audio
+ if(type & MSG_AUDIBLE) //audio
to_chat(src, "... You can almost hear something ...")
- else
- to_chat(src, msg)
+ return
+ to_chat(src, msg)
-// Show a message to all player mobs who sees this atom
-// Show a message to the src mob (if the src is a mob)
-// Use for atoms performing visible actions
-// message is output to anyone who can see, e.g. "The [src] does something!"
-// self_message (optional) is what the src mob sees e.g. "You do something!"
-// blind_message (optional) is what blind people will hear e.g. "You hear something!"
-// vision_distance (optional) define how many tiles away the message can be seen.
-// ignored_mob (optional) doesn't show any message to a given mob if TRUE.
-
-/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs, no_ghosts = FALSE)
+/**
+ * Generate a visible message from this atom
+ *
+ * Show a message to all player mobs who sees this atom
+ *
+ * Show a message to the src mob (if the src is a mob)
+ *
+ * Use for atoms performing visible actions
+ *
+ * message is output to anyone who can see, e.g. "The [src] does something!"
+ *
+ * Vars:
+ * * self_message (optional) is what the src mob sees e.g. "You do something!"
+ * * blind_message (optional) is what blind people will hear e.g. "You hear something!"
+ * * vision_distance (optional) define how many tiles away the message can be seen.
+ * * ignored_mobs (optional) doesn't show any message to any given mob in the list.
+ */
+/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs)
var/turf/T = get_turf(src)
if(!T)
return
+ var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs.
+ if(!length(hearers))
+ return
if(!islist(ignored_mobs))
ignored_mobs = list(ignored_mobs)
- var/range = 7
- if(vision_distance)
- range = vision_distance
- for(var/mob/M in get_hearers_in_view(range, src))
+ hearers -= ignored_mobs
+ if(self_message)
+ hearers -= src
+ for(var/mob/M in hearers)
if(!M.client)
continue
- if(M in ignored_mobs)
- continue
+ //This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = message
- if(isobserver(M) && no_ghosts)
+ //CITADEL EDIT, required for vore code to remove (T != loc && T != src)) as a check
+ if(M.see_invisible[message]"
if(emote_type == EMOTE_AUDIBLE)
- user.audible_message(message=message,hearing_distance=1, no_ghosts = TRUE)
+ user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list)
else
- user.visible_message(message=message,self_message=message,vision_distance=1, no_ghosts = TRUE)
+ user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list)
log_emote("[key_name(user)] : (SUBTLER) [message]")
message = null
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index 606d6d4f66..17311daec2 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -134,17 +134,6 @@
/mob/proc/Dizzy(amount)
dizziness = max(dizziness,amount,0)
-/////////////////////////////////// EYE DAMAGE ////////////////////////////////////
-
-/mob/proc/damage_eyes(amount)
- return
-
-/mob/proc/adjust_eye_damage(amount)
- return
-
-/mob/proc/set_eye_damage(amount)
- return
-
/////////////////////////////////// EYE_BLIND ////////////////////////////////////
/mob/proc/blind_eyes(amount)
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index 1b3501f78b..79c74de2eb 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -126,7 +126,7 @@
portable_drive.verb_pickup()
/obj/item/modular_computer/AltClick(mob/user)
- ..()
+ . = ..()
if(issilicon(user))
return
@@ -142,7 +142,7 @@
return
if(ai_slot)
ai_slot.try_eject(null, user)
-
+ return TRUE
// Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs.
/obj/item/modular_computer/GetAccess()
diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm
index 4d4dee1b8c..ce8ab9659c 100644
--- a/code/modules/modular_computers/computers/item/laptop.dm
+++ b/code/modules/modular_computers/computers/item/laptop.dm
@@ -86,8 +86,8 @@
/obj/item/modular_computer/laptop/AltClick(mob/user)
if(screen_on) // Close it.
try_toggle_open(user)
- else
- return ..()
+ return TRUE
+ return ..()
/obj/item/modular_computer/laptop/proc/toggle_open(mob/living/user=null)
if(screen_on)
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index b3476e7046..a988003b67 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -94,8 +94,9 @@
cpu.eject_card()
/obj/machinery/modular_computer/AltClick(mob/user)
+ . = ..()
if(cpu)
- cpu.AltClick(user)
+ return cpu.AltClick(user)
//ATTACK HAND IGNORING PARENT RETURN VALUE
// On-click handling. Turns on the computer if it's off and opens the GUI.
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index ecef5a703a..2ca6ce2611 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -44,10 +44,12 @@
return ..()
/obj/item/paperplane/suicide_act(mob/living/user)
+ var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES)
user.Stun(200)
user.visible_message("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")
user.adjust_blurriness(6)
- user.adjust_eye_damage(rand(6,8))
+ if(eyes)
+ eyes.applyOrganDamage(rand(6,8))
sleep(10)
return (BRUTELOSS)
@@ -111,9 +113,11 @@
if(prob(hit_probability))
if(H.is_eyes_covered())
return
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
visible_message("\The [src] hits [H] in the eye!")
H.adjust_blurriness(6)
- H.adjust_eye_damage(rand(6,8))
+ if(eyes)
+ eyes.applyOrganDamage(rand(6,8))
H.Knockdown(40)
H.emote("scream")
@@ -122,6 +126,7 @@
. += "Alt-click [src] to fold it into a paper plane."
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK))
return
to_chat(user, "You fold [src] into the shape of a plane!")
@@ -134,3 +139,4 @@
I = new plane_type(user, src)
user.put_in_hands(I)
+ return TRUE
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index fece60f268..7567fc1a52 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -174,11 +174,15 @@
*/
/obj/item/pen/edagger
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
+ sharpness = IS_SHARP
var/on = FALSE
/obj/item/pen/edagger/Initialize()
. = ..()
- AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg', TRUE)
+ AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg')
+
+/obj/item/pen/edagger/get_sharpness()
+ return on * sharpness
/obj/item/pen/edagger/attack_self(mob/living/user)
if(on)
@@ -201,8 +205,6 @@
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
to_chat(user, "[src] is now active.")
- var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
- butchering.butchering_enabled = on
update_icon()
/obj/item/pen/edagger/update_icon()
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 9d01eca0cf..96738e5021 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -46,13 +46,14 @@
. += "Alt-click to change its focusing, allowing you to set how big of an area it will capture."
/obj/item/camera/AltClick(mob/user)
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE))
return
var/desired_x = input(user, "How high do you want the camera to shoot, between [picture_size_x_min] and [picture_size_x_max]?", "Zoom", picture_size_x) as num
var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num
picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT)
-
+ return TRUE
/obj/item/camera/attack(mob/living/carbon/human/M, mob/user)
return
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5e3888a8c5..5da29bf5ac 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -702,11 +702,11 @@
return ..()
/obj/machinery/power/apc/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
- else
- togglelock(user)
+ togglelock(user)
+ return TRUE
/obj/machinery/power/apc/proc/togglelock(mob/living/user)
if(obj_flags & EMAGGED)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 2855e3c321..ded99d6fa6 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -360,3 +360,7 @@
var/area/A = get_area(src)
if(!A.lightswitch || !A.light_power)
charge = 0 //For naturally depowered areas, we start with no power
+
+//found inside the inducers ordered from cargo.
+/obj/item/stock_parts/cell/inducer_supply
+ maxcharge = 5000
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 9184c7e4eb..68ffcb909a 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -75,6 +75,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
icon_state = "darkmatter"
density = TRUE
anchored = TRUE
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/uid = 1
var/static/gl_uid = 1
light_range = 4
@@ -676,18 +677,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
for(var/mob/living/L in range(10))
investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER)
if(L in view())
- L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
- "The unearthly ringing subsides and you notice you have new radiation burns.", 2)
+ L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", MSG_VISUAL,\
+ "The unearthly ringing subsides and you notice you have new radiation burns.", MSG_AUDIBLE)
else
- L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2)
+ L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", MSG_AUDIBLE)
//Do not blow up our internal radio
/obj/machinery/power/supermatter_crystal/contents_explosion(severity, target)
return
-/obj/machinery/power/supermatter_crystal/prevent_content_explosion()
- return TRUE
-
/obj/machinery/power/supermatter_crystal/engine
is_main_engine = TRUE
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 026f725e2f..531c6082b0 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -198,8 +198,13 @@
/obj/item/gun/can_trigger_gun(mob/living/user)
. = ..()
+ if(!.)
+ return
if(!handle_pins(user))
return FALSE
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && chambered?.harmful) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
+ to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...")
+ return FALSE
/obj/item/gun/proc/handle_pins(mob/living/user)
if(pin)
@@ -275,10 +280,6 @@
addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1))
else
if(chambered)
- if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
- if(chambered.harmful) // Is the bullet chambered harmful?
- to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...")
- return
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 1e1b518849..571525d8f0 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -225,10 +225,11 @@
spread = 2
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
toggle_stock(user)
- . = ..()
+ return TRUE
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/examine(mob/user)
. = ..()
@@ -289,8 +290,10 @@
to_chat(user, "You switch to tube A.")
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
pump()
+ return TRUE
// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 9103340790..1e2070de1b 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -60,10 +60,10 @@
/obj/item/firing_pin/proc/auth_fail(mob/living/user)
if(user)
- user.show_message(fail_message, 1)
+ user.show_message(fail_message, MSG_VISUAL)
if(selfdestruct)
if(user)
- user.show_message("SELF-DESTRUCTING... ", 1)
+ user.show_message("SELF-DESTRUCTING... ", MSG_VISUAL)
to_chat(user, "[gun] explodes!")
explosion(get_turf(gun), -1, 0, 2, 3)
if(gun)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
deleted file mode 100644
index 047d50beaf..0000000000
--- a/code/modules/projectiles/projectile/energy.dm
+++ /dev/null
@@ -1,203 +0,0 @@
-/obj/item/projectile/energy
- name = "energy"
- icon_state = "spark"
- damage = 0
- damage_type = BURN
- flag = "energy"
- is_reflectable = TRUE
-
-/obj/item/projectile/energy/chameleon
- nodamage = TRUE
-
-/obj/item/projectile/energy/electrode
- name = "electrode"
- icon_state = "spark"
- color = "#FFFF00"
- nodamage = 1
- knockdown = 100
- stutter = 5
- jitter = 20
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 7
- tracer_type = /obj/effect/projectile/tracer/stun
- muzzle_type = /obj/effect/projectile/muzzle/stun
- impact_type = /obj/effect/projectile/impact/stun
-
-/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
- do_sparks(1, TRUE, src)
- else if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(C.dna && C.dna.check_mutation(HULK))
- C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE))
- addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
-
-/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
- do_sparks(1, TRUE, src)
- ..()
-
-/obj/item/projectile/energy/net
- name = "energy netting"
- icon_state = "e_netting"
- damage = 10
- damage_type = STAMINA
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 10
-
-/obj/item/projectile/energy/net/Initialize()
- . = ..()
- SpinAnimation()
-
-/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE)
- if(isliving(target))
- var/turf/Tloc = get_turf(target)
- if(!locate(/obj/effect/nettingportal) in Tloc)
- new /obj/effect/nettingportal(Tloc)
- ..()
-
-/obj/item/projectile/energy/net/on_range()
- do_sparks(1, TRUE, src)
- ..()
-
-/obj/effect/nettingportal
- name = "DRAGnet teleportation field"
- desc = "A field of bluespace energy, locking on to teleport a target."
- icon = 'icons/effects/effects.dmi'
- icon_state = "dragnetfield"
- light_range = 3
- anchored = TRUE
-
-/obj/effect/nettingportal/Initialize()
- . = ..()
- var/obj/item/radio/beacon/teletarget = null
- for(var/obj/machinery/computer/teleporter/com in GLOB.machines)
- if(com.target)
- if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
- teletarget = com.target
-
- addtimer(CALLBACK(src, .proc/pop, teletarget), 30)
-
-/obj/effect/nettingportal/proc/pop(teletarget)
- if(teletarget)
- for(var/mob/living/L in get_turf(src))
- do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
- else
- for(var/mob/living/L in get_turf(src))
- do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
-
- qdel(src)
-
-/obj/effect/nettingportal/singularity_act()
- return
-
-/obj/effect/nettingportal/singularity_pull()
- return
-
-
-/obj/item/projectile/energy/trap
- name = "energy snare"
- icon_state = "e_snare"
- nodamage = 1
- knockdown = 20
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 4
-
-/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE)
- if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap
- new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
- else if(iscarbon(target))
- var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
- B.Crossed(target)
- ..()
-
-/obj/item/projectile/energy/trap/on_range()
- new /obj/item/restraints/legcuffs/beartrap/energy(loc)
- ..()
-
-/obj/item/projectile/energy/trap/cyborg
- name = "Energy Bola"
- icon_state = "e_snare"
- nodamage = 1
- knockdown = 0
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 10
-
-/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE)
- if(!ismob(target) || blocked >= 100)
- do_sparks(1, TRUE, src)
- qdel(src)
- if(iscarbon(target))
- var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
- B.Crossed(target)
- QDEL_IN(src, 10)
- ..()
-
-/obj/item/projectile/energy/trap/cyborg/on_range()
- do_sparks(1, TRUE, src)
- qdel(src)
-
-/obj/item/projectile/energy/declone
- name = "radiation beam"
- icon_state = "declone"
- damage = 20
- damage_type = CLONE
- irradiate = 10
- impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
-
-/obj/item/projectile/energy/dart //ninja throwing dart
- name = "dart"
- icon_state = "toxin"
- damage = 5
- damage_type = TOX
- knockdown = 100
- range = 7
-
-/obj/item/projectile/energy/bolt //ebow bolts
- name = "bolt"
- icon_state = "cbbolt"
- damage = 8
- damage_type = TOX
- nodamage = 0
- knockdown = 100
- stutter = 5
-
-/obj/item/projectile/energy/bolt/halloween
- name = "candy corn"
- icon_state = "candy_corn"
-
-/obj/item/projectile/energy/bolt/large
- damage = 20
-
-/obj/item/projectile/energy/tesla
- name = "tesla bolt"
- icon_state = "tesla_projectile"
- impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
- var/chain
-
-/obj/item/projectile/energy/tesla/fire(setAngle)
- if(firer)
- chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
- ..()
-
-/obj/item/projectile/energy/tesla/Destroy()
- qdel(chain)
- return ..()
-
-/obj/item/projectile/energy/tesla/revolver
- name = "energy orb"
-
-/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target)
- . = ..()
- if(isliving(target))
- tesla_zap(target, 3, 10000)
- qdel(src)
-
-/obj/item/projectile/energy/tesla/cannon
- name = "tesla orb"
-
-/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target)
- . = ..()
- tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE)
- qdel(src)
diff --git a/code/modules/projectiles/projectile/megabuster.dm b/code/modules/projectiles/projectile/megabuster.dm
index bfe9f40297..8abb182a1e 100644
--- a/code/modules/projectiles/projectile/megabuster.dm
+++ b/code/modules/projectiles/projectile/megabuster.dm
@@ -6,7 +6,6 @@
damage_type = BURN
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- icon = 'modular_citadel/icons/obj/VGprojectile.dmi'
lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi'
righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi'
@@ -14,6 +13,5 @@
name = "buster pellet"
icon_state = "megabuster"
nodamage = 1
- icon = 'modular_citadel/icons/obj/VGprojectile.dmi'
lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi'
righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi'
diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm
index f9adb9f3d7..038200b9df 100644
--- a/code/modules/projectiles/projectile/plasma.dm
+++ b/code/modules/projectiles/projectile/plasma.dm
@@ -1,5 +1,4 @@
obj/item/projectile/energy/plasmabolt
- icon = 'modular_citadel/icons/obj/VGProjectile.dmi'
name = "plasma bolt"
icon_state = "plasma"
flag = "energy"
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index fb064b6146..f2c6dd2fb5 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -843,7 +843,7 @@
return FALSE
if (D.id == "water" && !no_react && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany.
- if (pH <= 2)
+ if (pH < 2)
SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions")
var/datum/effect_system/smoke_spread/chem/s = new
var/turf/T = get_turf(my_atom)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 7e5cb21822..a3dd3c8049 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -428,10 +428,11 @@
return final_list
/obj/machinery/chem_dispenser/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
replace_beaker(user)
- return
+ return TRUE
/obj/machinery/chem_dispenser/drinks/Initialize()
. = ..()
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index eeb452dbb5..b4f14c69a7 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -29,10 +29,11 @@
icon_state = "mixer0b"
/obj/machinery/chem_heater/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
replace_beaker(user)
- return
+ return TRUE
/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index f540ae850d..06e33ddf9f 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -112,10 +112,11 @@
return ..()
/obj/machinery/chem_master/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
replace_beaker(user)
- return
+ return TRUE
/obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 05fa4d382a..6ae0a682d8 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -237,10 +237,11 @@
return ..()
/obj/machinery/computer/pandemic/AltClick(mob/living/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
replace_beaker(user)
- return
+ return TRUE
/obj/machinery/computer/pandemic/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index bd60880324..f96acf2d71 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -199,17 +199,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")
if(prob(5) && iscarbon(M))
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(HAS_TRAIT(M, TRAIT_BLIND))
- var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES)
- if(istype(eye))
- eye.Remove(M)
- eye.forceMove(get_turf(M))
+ if(eyes)
+ eyes.Remove(M)
+ eyes.forceMove(get_turf(M))
to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head!")
M.emote("scream")
M.adjustBruteLoss(15)
else
to_chat(M, "You scream in terror as you go blind!")
- M.become_blind(EYE_DAMAGE)
+ eyes?.applyOrganDamage(eyes.maxHealth)
M.emote("scream")
if(prob(3) && iscarbon(M))
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 80dac84f18..08594dee5b 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -407,10 +407,6 @@
glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
-/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L)
- ..()
- L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
-
/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L)
L.remove_movespeed_modifier(id)
..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index e3962e89c2..2a8ad86646 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -793,6 +793,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
+ eyes.applyOrganDamage(-2)
if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE))
if(prob(20))
to_chat(M, "Your vision slowly returns...")
@@ -807,8 +808,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
else if(M.eye_blind || M.eye_blurry)
M.set_blindness(0)
M.set_blurriness(0)
- else if(eyes.eye_damage > 0)
- M.adjust_eye_damage(-1)
..()
/datum/reagent/medicine/atropine
@@ -881,40 +880,49 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
- description = "A miracle drug capable of bringing the dead back to life. Only functions if the target has less than 100 brute and burn damage (independent of one another), and causes slight damage to the living."
+ description = "A miracle drug capable of bringing the dead back to life. Only functions when applied by patch or spray, if the target has less than 100 brute and burn damage (independent of one another) and hasn't been husked. Causes slight damage to the living."
reagent_state = LIQUID
color = "#A0E85E"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "magnets"
pH = 0
-/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume)
+/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.stat == DEAD)
- if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100)
- M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
+ if(M.suiciding || M.hellbound) //they are never coming back
+ M.visible_message("[M]'s body does not react...")
return
- M.visible_message("[M]'s body convulses a bit.")
- if(!M.suiciding && !(HAS_TRAIT(M, TRAIT_NOCLONE)) && !M.hellbound)
- if(!M)
- return
- if(M.notify_ghost_cloning(source = M))
- spawn (100) //so the ghost has time to re-enter
- return
+ if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived
+ M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
+ M.do_jitter_animation(10)
+ return
+ else
+ M.visible_message("[M]'s body starts convulsing!")
+ M.notify_ghost_cloning(source = M)
+ M.do_jitter_animation(10)
+ addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds
+ addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80)
+
+ spawn(100) //so the ghost has time to re-enter
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits)))
+ C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL*C.blood_ratio) //so you don't instantly re-die from a lack of blood
+ for(var/organ in C.internal_organs)
+ var/obj/item/organ/O = organ
+ if(O.damage > O.maxHealth/2)
+ O.setOrganDamage(O.maxHealth/2) //so you don't instantly die from organ damage when being revived
- else
M.adjustOxyLoss(-20, 0)
M.adjustToxLoss(-20, 0)
- var/mob/living/carbon/H = M
- for(var/organ in H.internal_organs)
- var/obj/item/organ/O = organ
- O.setOrganDamage(0)
M.updatehealth()
-
if(M.revive())
+ M.grab_ghost()
M.emote("gasp")
log_combat(M, M, "revived", src)
..()
+
/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(0.5*REM, 0)
M.adjustFireLoss(0.5*REM, 0)
@@ -1524,5 +1532,5 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/polypyr/overdose_process(mob/living/M)
M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5)
..()
- . = 1
+ . = 1
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index e91719504e..bb65392057 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1654,7 +1654,7 @@
description = "Cheap and extremely common type of plant nutriment."
color = "#376400" // RBG: 50, 100, 0
tox_prob = 10
- pH = 2
+ pH = 2.5
/datum/reagent/plantnutriment/left4zednutriment
name = "Left 4 Zed"
@@ -1662,7 +1662,7 @@
description = "Unstable nutriment that makes plants mutate more often than usual."
color = "#1A1E4D" // RBG: 26, 30, 77
tox_prob = 25
- pH = 1.5
+ pH = 3.5
/datum/reagent/plantnutriment/robustharvestnutriment
name = "Robust Harvest"
@@ -1670,7 +1670,7 @@
description = "Very potent nutriment that prevents plants from mutating."
color = "#9D9D00" // RBG: 157, 157, 0
tox_prob = 15
- pH = 1
+ pH = 2.5
// GOON OTHERS
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index e77cf5b9dc..f97204b45e 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -33,7 +33,7 @@
toxpwr = 0
taste_description = "slime"
taste_mult = 0.9
- pH = 2
+ pH = 2.3
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
if(!..())
@@ -220,7 +220,7 @@
color = "#49002E" // rgb: 73, 0, 46
toxpwr = 1
taste_mult = 1
- pH = 2
+ pH = 2.7
/datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/structure/alien/weeds))
@@ -986,4 +986,3 @@
to_chat(M, "[tox_message]")
. = 1
..()
-
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index b29a1c6809..ad1efc1da7 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -99,7 +99,6 @@
/datum/chemical_reaction/reagent_explosion/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
- sleep(rand(50,100))
..(holder, created_volume, T)
/datum/chemical_reaction/thermite
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 85cb544667..f1a4d1554e 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -338,8 +338,10 @@
return FALSE
/obj/item/hypospray/mkii/AltClick(mob/user)
+ . = ..()
if(vial)
vial.attack_self(user)
+ return TRUE
// Gunna allow this for now, still really don't approve - Pooj
/obj/item/hypospray/mkii/emag_act(mob/user)
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
index 414208d0bf..d09b18f244 100644
--- a/code/modules/reagents/reagent_containers/rags.dm
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -104,6 +104,7 @@
msg += "'s liquids into \the [target]"
reagents.trans_to(target, reagents.total_volume)
to_chat(user, "[msg].")
+ return TRUE
/obj/item/reagent_containers/rag/towel
diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm
index dfc58f8c2d..2e36a9deaa 100644
--- a/code/modules/recycling/disposal/holder.dm
+++ b/code/modules/recycling/disposal/holder.dm
@@ -117,7 +117,7 @@
if(user.incapacitated())
return
for(var/mob/M in range(5, get_turf(src)))
- M.show_message("CLONG, clong!", 2)
+ M.show_message("CLONG, clong!", MSG_AUDIBLE)
playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
// called to vent all gas in holder to a location
diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm
index 88779df447..920c42b411 100644
--- a/code/modules/research/nanites/nanite_hijacker.dm
+++ b/code/modules/research/nanites/nanite_hijacker.dm
@@ -14,6 +14,7 @@
return
if(disk)
eject()
+ return TRUE
/obj/item/nanite_hijacker/examine(mob/user)
. = ..()
diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm
index 3b242d28df..a7c8533521 100644
--- a/code/modules/research/nanites/nanite_remote.dm
+++ b/code/modules/research/nanites/nanite_remote.dm
@@ -35,6 +35,7 @@
update_icon()
else
to_chat(user, "Access denied.")
+ return TRUE
/obj/item/nanite_remote/emag_act(mob/user)
. = ..()
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index c143c4fb2d..205603e12e 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -28,6 +28,7 @@
var/datum/action/innate/monkey_recycle/monkey_recycle_action
var/datum/action/innate/slime_scan/scan_action
var/datum/action/innate/feed_potion/potion_action
+ var/datum/action/innate/hotkey_help/hotkey_help
var/list/stored_slimes
var/obj/item/slimepotion/slime/current_potion
@@ -48,6 +49,7 @@
monkey_recycle_action = new
scan_action = new
potion_action = new
+ hotkey_help = new
stored_slimes = list()
RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
@@ -100,6 +102,27 @@
potion_action.Grant(user)
actions += potion_action
+ if(hotkey_help)
+ hotkey_help.target = src
+ hotkey_help.Grant(user)
+ actions += hotkey_help
+
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl)
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt)
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift)
+ RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift)
+ RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl)
+ RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl)
+
+/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user)
+ UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL)
+ UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT)
+ UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT)
+ UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT)
+ UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL)
+ UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
+ ..()
+
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
if(current_potion == deleted)
current_potion = null
@@ -169,7 +192,7 @@
S.visible_message("[S] warps in!")
X.stored_slimes -= S
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
@@ -194,7 +217,7 @@
S.forceMove(X)
X.stored_slimes += S
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/feed_slime
@@ -215,9 +238,11 @@
if (!QDELETED(food))
food.LAssailant = C
X.monkeys --
- to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
+ to_chat(owner, "[X] now has [X.monkeys] monkey(s) left.")
+ else
+ to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/monkey_recycle
@@ -239,7 +264,7 @@
X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/slime_scan
name = "Scan Slime"
@@ -256,7 +281,7 @@
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
slime_scan(S, C)
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/feed_potion
name = "Apply Potion"
@@ -280,7 +305,10 @@
X.current_potion.attack(S, C)
break
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
+
+
+//Demodularized Code
/obj/item/disk/xenobio_console_upgrade
name = "Xenobiology console upgrade disk"
@@ -307,3 +335,169 @@
name = "Xenobiology console advanced slime upgrade disk"
desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)
+
+
+//Xenobio Hotkeys Port
+
+/datum/action/innate/hotkey_help
+ name = "Hotkey Help"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
+ button_icon_state = "hotkey_help"
+
+/datum/action/innate/hotkey_help/Activate()
+ if(!target || !isliving(owner))
+ return
+ to_chat(owner, "Click shortcuts:")
+ to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes. (Requires Basic Slime Console upgrade)")
+ to_chat(owner, "Ctrl-click a slime to scan it.")
+ to_chat(owner, "Alt-click a slime to feed it a potion. (Requires Advanced Slime Console upgrade)")
+ to_chat(owner, "Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey. (Requires Monkey Console upgrade)")
+
+//
+// Alternate clicks for slime, monkey and open turf if using a xenobio console
+
+// Scans slime
+/mob/living/simple_animal/slime/CtrlClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src)
+ ..()
+
+//Feeds a potion to slime
+/mob/living/simple_animal/slime/AltClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src)
+ ..()
+
+//Picks up slime
+/mob/living/simple_animal/slime/ShiftClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src)
+ ..()
+
+//Place slimes
+/turf/open/ShiftClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src)
+ ..()
+
+//Place monkey
+/turf/open/CtrlClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src)
+ ..()
+
+//Pick up monkey
+/mob/living/carbon/monkey/CtrlClick(mob/user)
+ SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src)
+ ..()
+
+// Scans slime
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S)
+ if(!GLOB.cameranet.checkTurfVis(S.loc))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/area/mobarea = get_area(S.loc)
+ if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible)
+ slime_scan(S, C)
+
+//Feeds a potion to slime
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S)
+ if(!(upgradetier & XENOBIO_UPGRADE_SLIMEADV)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEADV
+ to_chat(user, "This console does not have the advanced slime upgrade.")
+ return
+ if(!GLOB.cameranet.checkTurfVis(S.loc))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
+ var/area/mobarea = get_area(S.loc)
+ if(QDELETED(X.current_potion))
+ to_chat(C, "No potion loaded.")
+ return
+ if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible)
+ X.current_potion.attack(S, C)
+
+//Picks up slime
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S)
+ if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
+ to_chat(user, "This console does not have the basic slime upgrade.")
+ return
+ if(!GLOB.cameranet.checkTurfVis(S.loc))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
+ var/area/mobarea = get_area(S.loc)
+ if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible)
+ if(X.stored_slimes.len >= X.max_slimes)
+ to_chat(C, "Slime storage is full.")
+ return
+ if(S.ckey)
+ to_chat(C, "The slime wiggled free!")
+ return
+ if(S.buckled)
+ S.Feedstop(silent = TRUE)
+ S.visible_message("[S] vanishes in a flash of light!")
+ S.forceMove(X)
+ X.stored_slimes += S
+
+//Place slimes
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T)
+ if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
+ to_chat(user, "This console does not have the basic slime upgrade.")
+ return
+ if(!GLOB.cameranet.checkTurfVis(T))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
+ var/area/turfarea = get_area(T)
+ if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible)
+ for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
+ S.forceMove(T)
+ S.visible_message("[S] warps in!")
+ X.stored_slimes -= S
+
+//Place monkey
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T)
+ if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ to_chat(user, "This console does not have the monkey upgrade.")
+ return
+ if(!GLOB.cameranet.checkTurfVis(T))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
+ var/area/turfarea = get_area(T)
+ if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible)
+ if(X.monkeys >= 1)
+ var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C)
+ if (!QDELETED(food))
+ food.LAssailant = C
+ X.monkeys--
+ X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
+ to_chat(C, "[X] now has [X.monkeys] monkey(s) stored.")
+ else
+ to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
+
+//Pick up monkey
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M)
+ if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ to_chat(user, "This console does not have the monkey upgrade.")
+ return
+ if(!GLOB.cameranet.checkTurfVis(M.loc))
+ to_chat(user, "Target is not near a camera. Cannot proceed.")
+ return
+ var/mob/living/C = user
+ var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
+ var/area/mobarea = get_area(M.loc)
+ if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible)
+ if(!M.stat)
+ return
+ M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!")
+ X.monkeys = round(X.monkeys + 0.2,0.1)
+ qdel(M)
+ if (X.monkeys == (round(X.monkeys,1)))
+ to_chat(C, "[X] now has [X.monkeys] monkey(s) available.")
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index d12195cc52..b6e0db2646 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -85,7 +85,8 @@
/obj/item/stack/tile/bronze = /datum/species/golem/bronze,
/obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard,
/obj/item/stack/sheet/leather = /datum/species/golem/leather,
- /obj/item/stack/sheet/bone = /datum/species/golem/bone)
+ /obj/item/stack/sheet/bone = /datum/species/golem/bone,
+ /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread)
if(istype(I, /obj/item/stack))
var/obj/item/stack/O = I
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index cd641adb33..f64b5e4d01 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -284,6 +284,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
var/datum/action/peepholeCancel/PHC = new
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
PHC.Grant(user)
+ return TRUE
/turf/closed/indestructible/hoteldoor/check_eye(mob/user)
if(get_dist(get_turf(src), get_turf(user)) >= 2)
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index f7a06af388..28e813ccac 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -22,6 +22,7 @@
"[user] begins to perform surgery on [target]'s eyes.")
/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES)
display_results(user, target, "You succeed in fixing [target]'s eyes.",
"[user] successfully fixes [target]'s eyes!",
"[user] completes the surgery on [target]'s eyes.")
@@ -29,7 +30,7 @@
target.set_blindness(0)
target.cure_nearsighted(list(EYE_DAMAGE))
target.blur_eyes(35) //this will fix itself slowly.
- target.set_eye_damage(0)
+ E.setOrganDamage(0)
return TRUE
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 81627104e8..65172a1545 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -44,6 +44,9 @@
hunger_threshold = NUTRITION_LEVEL_HUNGRY
poison_amount = 10
+#define MAX_HEAL_COOLDOWN 15 MINUTES
+#define DEF_CONVALESCENCE_TIME 15 SECONDS
+
/obj/item/organ/cyberimp/chest/reviver
name = "Reviver implant"
desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!"
@@ -51,43 +54,49 @@
implant_color = "#AD0000"
slot = ORGAN_SLOT_HEART_AID
var/revive_cost = 0
- var/reviving = 0
+ var/reviving = FALSE
var/cooldown = 0
+ var/convalescence_time = 0
/obj/item/organ/cyberimp/chest/reviver/on_life()
if(reviving)
- if(owner.stat == UNCONSCIOUS)
- addtimer(CALLBACK(src, .proc/heal), 30)
+ var/do_heal = world.time < convalescence_time
+ if(revive_cost >= MAX_HEAL_COOLDOWN)
+ do_heal = FALSE
+ else if(owner.stat && owner.stat != DEAD)
+ do_heal = TRUE
+ else if(!do_heal)
+ convalescence_time = world.time + DEF_CONVALESCENCE_TIME
+ if(do_heal)
+ addtimer(CALLBACK(src, .proc/heal), 3 SECONDS)
else
cooldown = revive_cost + world.time
reviving = FALSE
to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].")
return
- if(cooldown > world.time)
- return
- if(owner.stat != UNCONSCIOUS)
- return
- if(owner.suiciding)
+ if(cooldown > world.time || owner.stat == CONSCIOUS || owner.stat == DEAD || owner.suiciding)
return
revive_cost = 0
+ convalescence_time = 0
reviving = TRUE
to_chat(owner, "You feel a faint buzzing as your reviver implant starts patching your wounds...")
/obj/item/organ/cyberimp/chest/reviver/proc/heal()
if(owner.getOxyLoss())
owner.adjustOxyLoss(-5)
- revive_cost += 5
+ revive_cost += 0.5 SECONDS
if(owner.getBruteLoss())
owner.adjustBruteLoss(-2)
- revive_cost += 40
+ revive_cost += 4 SECONDS
if(owner.getFireLoss())
owner.adjustFireLoss(-2)
- revive_cost += 40
+ revive_cost += 4 SECONDS
if(owner.getToxLoss())
owner.adjustToxLoss(-1)
- revive_cost += 40
+ revive_cost += 4 SECONDS
+
/obj/item/organ/cyberimp/chest/reviver/emp_act(severity)
. = ..()
@@ -95,25 +104,27 @@
return
if(reviving)
- revive_cost += 200
+ revive_cost += 20 SECONDS
else
- cooldown += 200
+ cooldown += 20 SECONDS
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.stat != DEAD && prob(50 / severity) && H.can_heartattack())
H.set_heartattack(TRUE)
to_chat(H, "You feel a horrible agony in your chest!")
- addtimer(CALLBACK(src, .proc/undo_heart_attack), 600 / severity)
+ addtimer(CALLBACK(src, .proc/undo_heart_attack), 60 SECONDS / severity)
/obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack()
var/mob/living/carbon/human/H = owner
- if(!istype(H))
+ if(!H || !istype(H))
return
H.set_heartattack(FALSE)
- if(H.stat == CONSCIOUS)
+ if(H.stat == CONSCIOUS || H.stat == SOFT_CRIT)
to_chat(H, "You feel your heart beating again!")
+#undef MAX_HEAL_COOLDOWN
+#undef DEF_CONVALESCENCE_TIME
/obj/item/organ/cyberimp/chest/thrusters
name = "implantable thrusters set"
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index d877af7451..c61f1a8122 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -21,7 +21,6 @@
var/sight_flags = 0
var/see_in_dark = 2
- var/eye_damage = 0
var/tint = 0
var/eye_color = "" //set to a hex code to override a mob's eye color
var/old_eye_color = "fff"
@@ -31,18 +30,21 @@
var/damaged = FALSE //damaged indicates that our eyes are undergoing some level of negative effect
/obj/item/organ/eyes/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE)
- ..()
+ . = ..()
+ if(!.)
+ return
if(damage == initial(damage))
clear_eye_trauma()
if(ishuman(owner))
- var/mob/living/carbon/human/HMN = owner
- old_eye_color = HMN.eye_color
+ var/mob/living/carbon/human/H = owner
+ old_eye_color = H.eye_color
if(eye_color)
- HMN.eye_color = eye_color
- HMN.regenerate_icons()
+ H.eye_color = eye_color
else
- eye_color = HMN.eye_color
- if(HAS_TRAIT(HMN, TRAIT_NIGHT_VISION) && !lighting_alpha)
+ eye_color = H.eye_color
+ if(!special)
+ H.dna?.species?.handle_body() //regenerate eyeballs overlays.
+ if(HAS_TRAIT(H, TRAIT_NIGHT_VISION) && !lighting_alpha)
lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT
see_in_dark = 8
M.update_tint()
@@ -51,13 +53,15 @@
/obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0)
clear_eye_trauma()
- ..()
+ . = ..()
if(ishuman(M) && eye_color)
- var/mob/living/carbon/human/HMN = M
- HMN.eye_color = old_eye_color
- HMN.regenerate_icons()
- M.update_tint()
- M.update_sight()
+ var/mob/living/carbon/human/H = M
+ H.eye_color = old_eye_color
+ if(!special)
+ H.dna.species.handle_body()
+ if(!special)
+ M.update_tint()
+ M.update_sight()
/obj/item/organ/eyes/on_life()
..()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 2b823da9d5..a180bd947e 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -25,6 +25,7 @@
var/now_fixed
var/high_threshold_cleared
var/low_threshold_cleared
+ rad_flags = RAD_NO_CONTAMINATE
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
if(!iscarbon(M) || owner == M)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 83b0eb4d17..dedff3ae04 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -754,7 +754,7 @@
var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job|spot of bother|gone and done it now|blast it|buggered it up")
//phase 0
var/static/regex/saymyname_words = regex("say my name|who am i|whoami")
- var/static/regex/wakeup_words = regex("revert|awaken|snap|attention")
+ var/static/regex/wakeup_words = regex("revert|awaken|snap|attention")
//phase1
var/static/regex/petstatus_words = regex("how are you|what is your status|are you okay")
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush")
@@ -1143,7 +1143,7 @@
switch(E.phase)
if(2 to INFINITY)
playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) //I'm very tempted to write a Fermis clause that makes them merowr.ogg if it's me. But, I also don't think snowflakism is okay. I would've gotten away for it too, if it wern't for my morals.
- H.emote("me", 1, "lets out a nya!")
+ H.emote("me", EMOTE_VISIBLE, "lets out a nya!")
E.cooldown += 1
//SLEEP
@@ -1230,7 +1230,7 @@
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
if (E.phase == 3)
var/speaktrigger = ""
- C.emote("me", 1, "whispers something quietly.")
+ C.emote("me", EMOTE_VISIBLE, "whispers something quietly.")
if (get_dist(user, C) > 1)//Requires user to be next to their pet.
to_chat(user, "You need to be next to your pet to hear them!")
continue
@@ -1253,7 +1253,7 @@
to_chat(user, "[H] seems incapable of being implanted with triggers.")
continue
else
- user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
+ user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
user.SetStun(1000)//Hands are handy, so you have to stay still
H.SetStun(1000)
if (E.mental_capacity >= 5)
@@ -1294,7 +1294,7 @@
to_chat(user, "[H] seems incapable of being implanted with an echoing phrase.")
continue
else
- user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
+ user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.")
user.SetStun(1000)//Hands are handy, so you have to stay still
H.SetStun(1000)
var/trigger = stripped_input(user, "Enter the loop phrase", MAX_MESSAGE_LEN)
@@ -1317,7 +1317,7 @@
to_chat(user, "You need to be next to your pet to give them a new objective!")
continue
else
- user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
+ user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
user.SetStun(1000)//So you can't run away!
H.SetStun(1000)
if (E.mental_capacity >= 200)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index aef3b31895..cf663e353f 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1,13 +1,9 @@
-GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
-
-/proc/get_uplink_items(var/datum/game_mode/gamemode = null, allow_sales = TRUE, allow_restricted = TRUE)
- var/list/filtered_uplink_items = list()
+/proc/get_uplink_items(datum/game_mode/gamemode, allow_sales = TRUE, allow_restricted = TRUE)
+ var/list/filtered_uplink_items = GLOB.uplink_categories.Copy() // list of uplink categories without associated values.
var/list/sale_items = list()
for(var/path in GLOB.uplink_items)
var/datum/uplink_item/I = new path
- if(!I.item)
- continue
if(I.include_modes.len)
if(!gamemode && SSticker.mode && !(SSticker.mode.type in I.include_modes))
continue
@@ -23,9 +19,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
if (I.restricted && !allow_restricted)
continue
- if(!filtered_uplink_items[I.category])
- filtered_uplink_items[I.category] = list()
- filtered_uplink_items[I.category][I.name] = I
+ LAZYSET(filtered_uplink_items[I.category], I.name, I)
+
if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1)
sale_items += I
if(allow_sales)
@@ -45,9 +40,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]"
A.item = I.item
- if(!filtered_uplink_items[A.category])
- filtered_uplink_items[A.category] = list()
- filtered_uplink_items[A.category][A.name] = A
+ LAZYSET(filtered_uplink_items[A.category], A.name, A)
+
+ for(var/category in filtered_uplink_items)
+ if(!filtered_uplink_items[category]) //empty categories with no associated uplink item. Remove.
+ filtered_uplink_items -= category
+
return filtered_uplink_items
@@ -106,16 +104,77 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
to_chat(user, "[A] materializes onto the floor.")
return A
-//Discounts (dynamically filled above)
-/datum/uplink_item/discounts
- category = "Discounted Gear"
+/*
+ Uplink Categories:
+ Due to how the typesof() in-built byond proc works, it should be kept in mind
+ the order categories are displayed in the uplink UI is same to the order they are loaded in the code.
+ I trust no extra filter is needed as long as they are all contained within the following lines.
+ When adding new uplink categories, please keep them separate from their sub paths here and without set item.
+ Failure to comply may result in the new categories being listed at the bottom of the UI.
+*/
+
+/datum/uplink_item/holiday
+ category = "Holiday"
-//All bundles and telecrystals
/datum/uplink_item/bundles_TC
category = "Bundles and Telecrystals"
surplus = 0
cant_discount = TRUE
+/datum/uplink_item/dangerous
+ category = "Conspicuous and Dangerous Weapons"
+
+/datum/uplink_item/stealthy_weapons
+ category = "Stealthy and Inconspicuous Weapons"
+
+/datum/uplink_item/ammo
+ category = "Ammunition"
+ surplus = 40
+
+/datum/uplink_item/explosives
+ category = "Grenades and Explosives"
+
+/datum/uplink_item/support
+ category = "Support and Mechanized Exosuits"
+ surplus = 0
+ include_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/suits
+ category = "Space Suits, Hardsuits and Clothing"
+ surplus = 40
+
+/datum/uplink_item/stealthy_tools
+ category = "Stealth and Camouflage Items"
+
+/datum/uplink_item/device_tools
+ category = "Devices and Tools"
+
+/datum/uplink_item/implants
+ category = "Implants"
+ surplus = 50
+
+/datum/uplink_item/role_restricted
+ category = "Role-Restricted"
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+ surplus = 0
+
+/datum/uplink_item/badass
+ category = "(Pointless) Badassery"
+ surplus = 0
+
+//Discounts (dynamically filled above)
+/datum/uplink_item/discounts
+ category = "Discounted Gear"
+
+
+/*
+ Uplink Items:
+ Unlike categories, uplink item entries are automatically sorted alphabetically on server init in a global list,
+ When adding new entries to the file, please keep them sorted by category.
+*/
+
+//All bundles and telecrystals
+
/datum/uplink_item/bundles_TC/chemical
name = "Bioterror bundle"
desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \
@@ -288,8 +347,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
// Dangerous Items
-/datum/uplink_item/dangerous
- category = "Conspicuous and Dangerous Weapons"
/datum/uplink_item/dangerous/pistol
name = "Stechkin Pistol"
@@ -544,8 +601,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 10
// Stealthy Weapons
-/datum/uplink_item/stealthy_weapons
- category = "Stealthy and Inconspicuous Weapons"
/datum/uplink_item/stealthy_weapons/combatglovesplus
name = "Combat Gloves Plus"
@@ -564,12 +619,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 13
surplus = 0
-/datum/uplink_item/dangerous/phantomthief
- name = "Syndicate Mask"
- desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles"
- item = /obj/item/clothing/glasses/phantomthief/syndicate
- cost = 2
-
/datum/uplink_item/stealthy_weapons/dart_pistol
name = "Dart Pistol"
desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \
@@ -671,9 +720,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 6
// Ammunition
-/datum/uplink_item/ammo
- category = "Ammunition"
- surplus = 40
/datum/uplink_item/ammo/pistol
name = "10mm Handgun Magazine"
@@ -923,8 +969,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 1
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/explosives
- category = "Grenades and Explosives"
+//Grenades and Explosives
/datum/uplink_item/explosives/bioterrorfoam
name = "Bioterror Foam Grenade"
@@ -1081,10 +1126,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
//Support and Mechs
-/datum/uplink_item/support
- category = "Support and Mechanized Exosuits"
- surplus = 0
- include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/support/clown_reinforcement
name = "Clown Reinforcements"
@@ -1155,8 +1196,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 140
// Stealth Items
-/datum/uplink_item/stealthy_tools
- category = "Stealth and Camouflage Items"
/datum/uplink_item/stealthy_tools/agent_card
name = "Agent Identification Card"
@@ -1266,17 +1305,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
item = /obj/item/jammer
cost = 5
-/*/datum/uplink_item/stealthy_tools/syndi_borer
- name = "Syndicate Brain Slug"
- desc = "A small cortical borer, modified to be completely loyal to the owner. \
- Genetically infertile, these brain slugs can assist medically in a support role, or take direct action \
- to assist their host."
- item = /obj/item/antag_spawner/syndi_borer
- refundable = TRUE
- cost = 10
- surplus = 20 //Let's not have this be too common
- exclude_modes = list(/datum/game_mode/nuclear) */
-
/datum/uplink_item/stealthy_tools/smugglersatchel
name = "Smuggler's Satchel"
desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \
@@ -1287,9 +1315,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
surplus = 30
//Space Suits and Hardsuits
-/datum/uplink_item/suits
- category = "Space Suits, Hardsuits and Clothing"
- surplus = 40
/datum/uplink_item/suits/turtlenck
name = "Tactical Turtleneck"
@@ -1364,8 +1389,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
exclude_modes = list()
// Devices and Tools
-/datum/uplink_item/device_tools
- category = "Devices and Tools"
/datum/uplink_item/device_tools/emag
name = "Cryptographic Sequencer"
@@ -1380,6 +1403,12 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
item = /obj/item/emagrecharge
cost = 2
+/datum/uplink_item/device_tools/phantomthief
+ name = "Syndicate Mask"
+ desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles"
+ item = /obj/item/clothing/glasses/phantomthief/syndicate
+ cost = 2
+
/datum/uplink_item/device_tools/cutouts
name = "Adaptive Cardboard Cutouts"
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \
@@ -1599,9 +1628,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
// Implants
-/datum/uplink_item/implants
- category = "Implants"
- surplus = 50
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
@@ -1698,10 +1724,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
include_modes = list(/datum/game_mode/nuclear)
// Role-specific items
-/datum/uplink_item/role_restricted
- category = "Role-Restricted"
- exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
- surplus = 0
/datum/uplink_item/role_restricted/ancient_jumpsuit
name = "Ancient Jumpsuit"
@@ -1929,10 +1951,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
item = /obj/item/gun/energy/emitter
restricted_roles = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
-// Pointless
-/datum/uplink_item/badass
- category = "(Pointless) Badassery"
- surplus = 0
+// Pointless (Badassery)
/datum/uplink_item/badass/costumes/obvious_chameleon
name = "Broken Chameleon Kit"
@@ -1986,12 +2005,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
item = /obj/item/storage/secure/briefcase/syndie
cost = 1
-/datum/uplink_item/badass/phantomthief
- name = "Syndicate Mask"
- desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles"
- item = /obj/item/clothing/glasses/phantomthief/syndicate
- cost = 2
-
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, \
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index e4cb090448..ac7fa879f4 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -60,6 +60,7 @@
.++
/obj/vehicle/proc/return_controllers_with_flag(flag)
+ RETURN_TYPE(/list/mob)
. = list()
for(var/i in occupants)
if(occupants[i] & flag)
diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm
index 27da0f6cea..13a139ef2e 100644
--- a/code/modules/vehicles/ridden.dm
+++ b/code/modules/vehicles/ridden.dm
@@ -49,6 +49,7 @@
return ..()
/obj/vehicle/ridden/AltClick(mob/user)
+ . = ..()
if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(!is_occupant(user))
to_chat(user, "You must be riding the [src] to remove [src]'s key!")
@@ -57,7 +58,7 @@
inserted_key.forceMove(drop_location())
user.put_in_hands(inserted_key)
inserted_key = null
- return ..()
+ return TRUE
/obj/vehicle/ridden/driver_move(mob/user, direction)
if(key_type && !is_key(inserted_key))
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index 8c21b050aa..0dd7ff32a8 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -94,6 +94,7 @@
qdel(src)
/obj/vehicle/ridden/scooter/skateboard/AltClick(mob/user)
+ . = ..()
var/datum/component/riding/R = src.GetComponent(/datum/component/riding)
if (!adjusted_speed)
R.vehicle_move_delay = 0
@@ -103,6 +104,7 @@
R.vehicle_move_delay = 1
to_chat(user, "You adjust the wheels on [src] to make it go slower.")
adjusted_speed = FALSE
+ return TRUE
//CONSTRUCTION
/obj/item/scooter_frame
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 5c2b45dace..ad54c8a0c8 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -595,7 +595,7 @@
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc)))
- H.show_message(struggle_outer_message, 1) // visible
+ H.show_message(struggle_outer_message, MSG_VISUAL) // visible
to_chat(R,struggle_user_message)
diff --git a/html/changelog.html b/html/changelog.html
index 61bc43a99b..8eabba83df 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -23,11 +23,9 @@
- Current Project Maintainers: deathride58, LetterJay, kevinz000, BlackMajor, Izzy
- Currently Active GitHub contributor list:-Click Here-
- Coders: Fermis, Poojawa, deathride58, kevinz000, Trilbyspaceclone, nik707, Ghommie as well as the /tg/ crew.
- Spriters: Michiyamenotehifunana, CameronWoof, and the folks who contributed to /tg/ station project.
- Sounds: /tg/ Sound crew.
- Main Testers: You poor saps, our player base.
- Thanks to: /tg/station, Baystation 12, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Invisty for the title image. Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
+ Thanks to: /tg/station, Baystation 12, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Invisty for the title image. Also a thanks to anybody who has contributed.
Have a bug to report? Visit our Issue Tracker.
- Please ensure that the bug has not already been reported upstream and use the template provided here!.
+ Please ensure that the bug has not already been reported, use the template provided here!.
+ Currently Active GitHub contributor list:-Click Here-
@@ -56,6 +49,504 @@
-->
+
+
07 December 2019
+
AffectedArc07 updated:
+
+
Fixes a LOT of code edge cases
+
+
Anonymous updated:
+
+
Added NEET-- I mean, DAB Suit and Helmet into loadout. Exclusive to Assistants, for obvious reasons, and don't provide any armor. Goes well with balaclava, finger-less gloves and jackboots for that true tactic~~f~~ool experience.
+
Renamed loadout name appropriately (ASSU -> DAB)
+
+
Arturlang updated:
+
+
PDA catridges cant be irradiated anymore.
+
+
Bhijn updated:
+
+
Item mousedrop() now provides a return value indicating whether or not behavior has been overridden somehow.
+
Defibs now properly check that their loc is the same as the user for mousedrop() calls, meaning ghosts can no longer make you equip defibs. Plus extra sanity checks.
+
Pet carriers no longer attack turfs while trying to unload their contents.
+
Decks of cards now function as they originally intended when attempting to use their drag and drop behavior.
+
Paper bins and papercutters no longer act wonky when you're trying to pull a piece of paper from them.
+
Adds clothing drag n drop sanity checks.
+
Sythetic hats now have extra sanity checks
+
+
Coconutwarrior97 updated:
+
+
Can only wrench down two transit tubes per turf.
+
+
Commandersand updated:
+
+
Added more stuff to loadout,check uniforms mask and backpack
+
+
DeltaFire15 updated:
+
+
Adds eight new plushies
+
Adds icons for the new plushies and adds a new icon for the skylar plush
+
Deleted a old, no-longer used icon for the skylar plush
Organ fridges to all maps near surgery with a random sensible organ, steralizine and synthtissue.
+
the med hand scanner to be less of a mishmash of random things
+
a little icon to the HUD if someone's heart has failed.
+
Lets neurine's brain splash attack work via syringe.
+
a new surgery; Emergency Cardioversion Induction for use on the recently deceased
+
Synthtissue to be less demanding on growth size for organ regeneration and improves clarify of it's growth gated effects.
+
Synthtissue now is more useful than synthflesh on the dead
+
+
Fox McCloud updated:
+
+
Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot would be less prone to igniting
+
+
Fox McCloud, Ghommie updated:
+
+
Fixes being able to mech-punch other mobs, as a pacifist
+
Fixes being able to hurt people, as a pacifist, by throwing them into a wall or other mob, or by using most martial arts (save for the unpredictable psychotic brawl, and the stamina-damage-only boxing).
+
Buffs boxing to outdamage natural stamina regeneration. Made the chance of outright missing your opponent actually possible.
+
Pacifists can now engage in the (laughably not harmful) sweet sweet art of boxing now.
+
+
Ghommie updated:
+
+
Fixing implant cases being lost inside implant pads when trying to eject them with your active hand full.
+
Moved the implant pad's case ejection from attack_hand() to AltClick(), added examination infos about it.
+
Fixed holodeck sleepers leaving sleeper buffers behind when deleted.
+
Fixed traitor codewords highlight and some other hear signal hooks spans highlight (phobias, split personality, hypnosis) or modifiers (mind echo)
+
Fixed traitor codewords highlight not passing down with the mind datum and stickying to the first mob.
+
Fixed the incongruent bone satchel description.
+
Fixed sofa overlays doing nothing, because their layer wasn't properly set.
+
Suicide and cryo now prevents ghost/midround roles for a definite duration of 30 minutes (and more if that was done before 30 minutes in the game passed), down from the rest of the round.
+
fixed several midround roles bypassing and nulling the aforementioned prevention measures.
+
Fixed the little issue of PDA skins not updating on job equip.
+
Anomaly Crystals of the clowning type will now rename the victim to their clown name preference when triggered, instead of giving them a random clown name.
+
Lowered blob event earliest start from 1 hour to 40 minutes (ergo one third), and the required player population from 40 to 35.
+
Several fixes and QoL for dullahans. They can see and hear visible and audible messages now, don't need a space helmet they can't wear anyway to be space/temperature proof, can examine things through shiftclick, and, most of all, fixed their head being unpickable. Fixed dullahans gibbing when revived or had their limbs regenerated.
+
humans should now drop gibs when gibbed again.
+
synths (not to be confused with IPCs), android and corporate species, as well as robotic simple mobs, will now spawn robotic giblets instead of organic ones.
+
You can't wear dakimakuras in any other inappropriate slots save for the back slot anymore, degenerates.
+
Insert snarky remark about clock welders actually displaying the welder flame overlay when turned on now here.
+
Minor ninja tweaks and stealth nerfs. The stealth penalty for the many combat-related actions, bumping and now teleporting/dashing or firing guns has been increased a by a third. There is now a cooldown of 5 seconds on toggling stealth as well as a slighty slowed stealth in/out animation.
+
Ported slighty better matchbox sprites from CEV-Eris, also resprited cigar boxes myself.
+
Fixed abductors/abductees objectives by porting an objective code.
+
Riding component fix
+
fixing a few runtimes on lightgeists, libido trait, rcd, one admin transformation topic, chem dispensers, glowing robotic eyes...
+
Porting CEV-eris delivery packages sprites and dunking the old syndie cybernetics box sprite.
+
Certain objects shouldn't be able to become radioactive because of a bitflag that previously was checked nowhere in the code anymore.
+
Added a new PDA reskin, sprites from CEV-Eris
+
Clock cult starts with some spare vitality matrix charge scaled of the number of starter servants.
+
Made the vitality matrix sigil slighty more visible, also allowed conversion runes to heal fresh converts at the cost of some vitality charge.
+
Crawling won't save you from the wrath of ocular wardens and pressure sensors anymore, heretics. fix: Pressure sensors are no more triggered by floating/flying mobs.
+
Strawberry milk and tea have sprites now.
+
Fixed the Aux base camera door settings and toggle window type actions. Also enabling the user to modify both door access and type.
+
Improved the two grayscale towel item sprites a little.
+
Fixed towels onmob suit overlays. Again.
+
Fixed some reagents taste descriptions.
+
Fixed hidden random event reports only priting a paper message without sending the message to the consoles' message list.
+
Rosary beads prayer now works on non-carbon mobs too, and won't break when performed on a monkey or other humanoids.
+
You can flagellate people with rosary beads on harm intent. It's even mediocrer than the sord though.
+
Moved the `Stealth and Camouflage Items` uplink category next to `Devices and Tools`.
+
Deleted a duplicate phatom thief mask entry from the uplink.
+
Fixed missing delivery packages sprites
+
fixed a few minor issues with console frames building.
+
Wizards can use the teleport spell from their den once again.
+
Wizards will now receive feedback messages when attempting to cast teleport or use the warp whistle while in a no-teleport area.
+
New clockwork cultist, gondola, monkey and securitron cardboard cutouts.
+
Fixed aliens gasping randomly once in a while.
+
fixed superlube waterflower, my bad.
+
Fixed closing the aux base construction RCD's door access settings window throwing you out of camera mode when closed.
+
Removed not functional aux base RCD's door type menu. Use airlock painters, maybe.
+
Honkbot oil spills are of the slippery kind now. Honk.
+
local code scavenger finds forgotten slighty improved apc sprites left buried in old dusty folders.
+
Seven old and otherwordly pAI holochassis icons have crawled their way out of the modular citadel catacombs.
+
chem dispenser beakers end up in your hand yet again.
+
Bikehorns squeak yet again, the world is safe.
+
Cyborgs can now actually use cameras from a distance.
+
Suicides are yet again painful and instant and won't throw people in deep crit from full health.
+
fixed rogue pixels on the energy gu- ahem blaster carbine... and a few apc lights states being neigh-indistinguishable.
+
Fixed several "behind" layer tail sprites skipping areas normally covered by bodyparts.
+
Morgues' original alert beeping sound has been restored, they no longer go "ammunition depleted"
+
Fixed missing hypereutactic left inhand sprites.
+
Dying, ghosting, having your mind / ckey transferred to another mob, going softcrit or otherwise unconscious now properly turn off combat mode.
+
combat mode can't be toggled on while non fully conscious anymore.
+
Fixed limbs' set_disabled NOT dropping your held items, updating your hand slot inventory screen image, prompting chat messages and making your character scream like a sissy.
+
Lusty xenomoprh maids will now actually clean tiles they travel onto yet again.
+
Fixed double whitespace gap in human and AI examine. Fixed single whitespace in carbon examine.
+
Removed a few useless supply packs: "Siezed" power cells, means of production and promiscous organs.
+
Merged the synthetic blood supply pack into the standard blood supply pack, effectively removing a random type blood pack in favor of two synthetic ones.
+
Merged together premium carpet pack n°1 and n°2 to hold one of each standard pattern.
+
You can no longer estimate the amount of reagents found inside a damp rag.
+
You can now squeeze a rag's reagents into another open container, as long as the other one is not full.
+
Fixed ED-209 being unbuildable past the welding step.
+
Fixed ai displays status being reset to "Neutral" on login, regardless of choice.
+
Fixed tinfoil hats giving random traumas.
+
+
Ghommie (original PR by Denton) updated:
+
+
Added three new .38 ammo types. TRAC bullets, which embed a tracking implant inside the target's body. The implant only lasts for five minutes and doesn't work as a teleport beacon. Hot Shot bullets set targets on fire; Iceblox bullets drastically lower the target's body temperature. They are available after researching the Subdermal Implants node (TRAC) or Exotic Ammunition node (Hot Shot/Iceblox).
+
Renamed the Technological Shells research node to Exotic Ammunition.
+
The "lifespan_postmortem" var now determines how long tracking implants work after death.
+
.357 AP speedloaders can now be ordered from syndicate uplinks.
+
lowered the cost of uplink's .357 speedloaderd from 4 to 3.
+
+
Ghommie (original PR by nicbn and Menshin) updated:
+
+
You can click on things that are under flaps or holo barriers.
+
+
Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak) updated:
+
+
Adds the intelliLantern, a big ol' spooky intelliCard skin
+
crafting recipe for the new intelliCard skin (requires 1 pumpkin, 1 intelliCard, 5 cables and a wirecutter as a tool)
+
changed the intelliTater crafting recipe to match the intelliLantern recipe (but with a potato for obvious reasons) add:cute pai gameboy face :3
+
+
Ghommie, porting lot of PRs by MrDoomBringer, AnturK, nemvar and coiax. updated:
+
+
Admins can now launch supplypods the old, slightly quicker way as well
+
Centcom-launched supplypods will now properly delimb you (if they are designated to do so) instead of touching you then literally yeeting all of your internal organs out of your body.
+
Centcom can now specify if they want to yeet all of your organs out of your body with a supplypod
+
Supplypods sound a bit nicer as the land now.
+
admins can now adjust the animation duration for centcom-launched supplypods
+
admins can adjust any sounds that are played as the supplypod lands
+
Reverse-Supplypods (the admin-launched ones) no longer stay behind after rising up, and also auto-delete from centcom.
+
The centcom podlauncher now has better logging
+
Admins can now allow ghosts to follow the delivery of Centcom-launched supply pods
+
Admins can now use the Centcom Podlauncher to launch things without the things looking like they're being sent inside a pod.
+
sparks will not generate if the quietLanding effect is on, for the centcom podlauncher
+
makes input text clearer for the centcom podlauncher
+
New 'Podspawn' verb, which functions like 'Spawn', except any atoms movable spawned will be dropped in via a no-damage, no-explosion Centcom supply pod.
+
Removed an oversight that made many obj/effect subtypes accidentally bombproof.
+
+
GrayRachnid updated:
+
+
Added saboteur syndicate engiborg
+
changed cyborg tool icons and the secborg taser/laser icons.
+
Fixes golden toolbox missing inhand sprite
+
Added traumas
+
Added science powergame tool
+
a few hearing args
+
fixed my mistakes
+
tweaked the number of ingredients/pancakes you can stack.
+
+
Hatterhat updated:
+
+
The Big Red Button now sets bomb timers to 2 seconds, instead of 5.
+
Gloves of the North Star (not Hugs of the North Star) now use all their intents very, very fast. This does not apply to grabs' click cooldown, nor shoving people.
+
The seedvault/alien plant DNA manipulator can now be printed off with Alien Biotechnology.
+
+
Iroquois-Pliskin updated:
+
+
Removed Clockwork Cult Surgical facility from Reebe
+
+
Jerry Derpington, baldest of the balds, and nemvar. updated:
+
+
Nanotrasen has lost communication to two away mission sites that contained a beach for Nanotrasen employees.
+
Nanotrasen has been able to locate a new away mission site that ALSO has a beach. Nanotrasen employees will be able to enjoy the beach after all!
+
Seashells have been added to the game.
+
+
KathrinBailey updated:
+
+
Two extra 'luxury' dorms rooms!
+
Gas miners to atmos.
+
Posters around the station.
+
Vacant room added to the Starboard Bow with it's own APC, above electrical maintenance.
+
New trendy clothes to the locker room, giving variety and bringing fashion back onto Nanotrasen stations.
+
Coloured bedsheet and towel bin.
+
Maid uniforms for the janitor.
+
Completely reworked bar. Milk kegs added in bar office. The bar has been changed for a homey restaurant feel just in time for Christmas! You can now run it as an actual restaurant! Local Bartender Icktsie III loved it so much he rolled around on the new floor smiling happily.
+
Dorms rework. Fitness room now has lots of costumes and outfits.
+
Junk removed from engineering, welding goggles added.
+
Welding tools in engineering replaced with industrial welding tools.
+
Package wrappers and hand labellers now in major departments.
+
Cell charger moved from engineering lobby to the protolathe room, just like how it is in all of the other maps and just where the cell charger is actually needed.
+
Library redesigned to have a private room and a 3x3 private study that is cleaned up.
+
Paper bins have gone big or gone home, with premium stationery scattered around. Engineering and security now have a labeller and packaging supplies.
+
Dark spot top left of Botany fixed.
+
Huge galactic-sized dark spot in bar fixed.
+
Light replacers now are less horrifically overpowered and PTSD-inducing for the server.
+
Fixes issue 9706: https://github.com/Citadel-Station-13/Citadel-Station-13/issues/9706 Part of maint getting hit by radstorms.
+_Kathrin's Box Beautification:_
Added support for Multi-Z power, atmospherics and disposals
+
massive service department nerf: space can no longer be extra crispy.
+
+
Knouli updated:
+
+
attack_self proc for the legion core which triggers a self-heal al la the previous 'afterattack' proc, as if clicking on the character's own sprite to self-heal
+
admin logging for all three use cases of legion core healing - afterattack, attack_self, and implanted ui_action_click
+
+
Krysonism, Ghommie updated:
+
+
NT has made breakthroughs in ice cream science, ice creams can now be flavoured with any reagent!
+
The ice cream vat now accepts beakers.
+
Grape and Peach icecreams have scoop overlays yet again.
+
+
Linzolle updated:
+
+
butchering component update
+
hat tossing can no longer knock hats off
+
strange reagent being unable to revive simplemobs
+
jitter animation and more clear text to strange reagent revival
+
+
Mickyy5 updated:
+
+
Nanotrasen are now issuing Plasmamen with plasma in their survival boxes
+
+
MrJWhit updated:
+
+
tweaked brain damage line
+
+
Naksu, ShizCalev updated:
+
+
Refactored examine-code
+
Examining a human with a burned prosthetic limb will no longer tell you that the limb is blistered.
+
Items will now inform you if they are resistant to frost, fire, acid, and lava when examined.
+
+
Owai-Seek updated:
+
+
"silly" bounties
+
"gardenchef" bounties
+
several bounties that require seriously good RNG to pull off.
+
moved several chef and assistant bounties to silly and gardenchef
+
modified several bounty point rewards
+
added new files "silly.dm" and "gardenchef.dm"
+
15+ new crates for cargo
+
organizes crates and moving them to proper categories
+
some dumb stuff like toner crates re
+
leg wraps and sweaters to clothesmate
+
screwdriver and cable coil to janidrobe
+
screwdriver and cable coil to janibelt whitelist (for fixing/placing light fixtures)
+
monkey cube, syringe, enzyme, soy sauce, and cryoxadone to chef's vendor (contraband and premium)
+
add cracker, beans, honey bars, lollipops, chocolate coin, and spider lollipop to snack vendors (contraband and premium)
+
newspaper to loadout menu for bapping purposes
+
removed poppy pretzels from snack vendor premium
+
maid uniform (janimaid alt) to kinkmate.
+
moves gear harness from premium to normal stock in kinkmate
+
re-balanced metal shield bounty
+
cryoxadone bottle (for use in chef vendor)
+
+
PersianXerxes updated:
+
+
Reduces the grace period for meteors from a minimum of 5 and maximum of 10 to 3 and 6 minutes respectively.
+
Adds a pair of VR sleepers to Box Station's permabrig
+
Adds a pair of VR sleepers to Delta Station's permabrig
+
Adds a pair of VR sleepers to Pubby Station's permabrig
+
Adds a pair of VR sleepers to Meta Station's permabrig
+
+
Putnam updated:
+
+
From-ghosts dynamic rulesets now actually listen to "required candidates"
+
Every dynamic-triggered event is now blacklisted from being triggered by the random events system when dynamic can trigger them.
+
Dynamic voting now features extended, if recent rounds have been chaotic.
+
Roundstart rulesets now scale on population ready rather than total population.
+
Threat log now accurately represents what actually used the threat.
+
Verbose threat log (admin-only) now shows ALL threat level changes.
+
VR mobs can no longer be dynamic midround antags.
+
Personal closets can use anything that holds an ID card now.
+
+
Putnam3145 updated:
+
+
traitors work now
+
Gas filters now push gas the same way volume pumps do.
+
Gas filters now won't clog if only one output is clogged.
+
Glowsticks can no longer be radioactively contaminated (one more supermatter contam exploit gone)
+
traitor removal is no longer borked
+
Dynamic voting
+
Added DYNAMIC_VOTING to game_options
+
SDGF now copies memories as well as antag data and factions.
+
Summon events now properly costs threat.
+
Refunded spells refund threat, too.
+
Made wizard spells inherently have a requirement and cost.
+
Meteor wave is no longer repeatable in dynamic.
+
tweaked nuke ops
+
Organs can no longer be radioactively contaminated.
+
+
Robustin, Subject217 updated:
+
+
The NukeOp Shuttle hull has been dramatically hardened. The walls are now "R-Walls" with far greater explosion resistance.
+
The NukeOp Shuttle guns have been significantly buffed. They now rapidly fire a new type of penetrator round, at a greater range, and have far greater explosion resistance.
+
The nuclear device on the NukeOp Shuttle is now in an anchored state by default, the Nuke can only be unanchored by inserting the disk and entering the proper code.
+
Non-Syndicate cyborgs are now unable to access the NukeOp Shuttle Console.
+
You can now unanchor Nukes even when the floor under them has been destroyed
adds the mining winter coat to mining wardrobes and mining lockers
+
+
ShizCalev updated:
+
+
Ghosts can now see active AI cameras.
+
Fixed a couple of laser / energy guns never switching to the empty icon despite being unable to fire.
+
+
Swindly updated:
+
+
Fixed MMIs not being able to use mecha equipment
+
Fixed MMIs not getting mecha mouse pointers
+
Fixed MMIs not getting medical HUDs in Odysseuses
+
Brains can now switch to harm intent
+
+
Tetr4 updated:
+
+
Turning a tile with gas effects into space now gets rid of the effects.
+
+
Trilbyspaceclone updated:
+
+
plastic trash cart crafting with plastic
+
wallets are known for now holding more items
+
shades and clowns HP
+
six more crates, A barrel, A Loom, 40 cotton sheets, two sets of fruit crates, raw lumber crate
+
All fermi chems, Boozes, Medical, food chems now sell
+
Loads more to sell - Mech gear, Cooking and more!
+
Moved around the vaule of some things and removed elastic of most items
+
Rebreather implants will now loss vaule, Do to being just metal and glass
+
lowered how many chems are in lewd chem kegs to be around 150-100 as well as the fancy booze kegs
+
bad returns and tools used
+
8 new cargo crates!
+
tablet cargo crate by -3k
+
Closes a bunch of issues
+
updates changlogs and such
+
fixed a catnip not having sprites
+
Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw and base ball bat into bulky items so they may fit
+
changes header to be more cit-like
+
new clothing for the hotel staff and a hat
+
+
Ty-the-Smonk updated:
+
+
You can now interact with self sustaining crossbreeds
+
+
Useroth updated:
+
+
Colored fairygrass variants.
+
Added a missing cherrybulb seedpack sprite
+
numbered storages now are sorted in a consistent way, instead of depending on ordering of their contents var
+
strange seeds as a buyable traitor botanist item
+
resolves the issues revolving around blackpowder exploding where the reaction happened, instead of where it actually is through making it explode instantly
+
the explosion delay moved from blackpowder directly into bomb cherries, to keep them functioning as intended
+
A bunch of newer tg plants
+
A bunch of newer tg plant traits
+
A couple of newer tg plant reagents
+
the new plants now properly get their reagents and reagent genes instead of being empty with UNKNOWN reagents listed in the DNA machine
+
extradimensional oranges now contain haloperidol
+
extradimensional oranges now actually grow properly and give proper seeds.
+
+
Weblure updated:
+
+
Button added to slime console that prints out the hotkey commands to the user. [Includes DMI update]
+
Shift-click a slime to pick it up, or the floor to drop all held slimes. (Requires Basic Slime Console upgrade)
+
Ctrl-click a slime to scan it.
+
Alt-click a slime to feed it a potion. (Requires Advanced Slime Console upgrade)
+
Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey. (Requires Monkey Console upgrade)
+
If the console does not have the required upgrade, an error message will print to the user.
+
You can now pick up a single slime from a pile, instead of all of them at once.
+
When recycling monkeys, the console will now report how many monkeys it has (will not report decimal increases).
+
Console now alerts you when you're out of monkeys and reports your current decimal amount.
+
Console messages are now styled consistently.
+
+
XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie) updated:
+
+
Holding an ID in your hands uses it instead of your worn ID for authentication purposes.
+
If you don't have an ID in your id slot, the belt slot will be checked as well.
+
small cleanup to id and bounty console html generation
+
Hop console now hurts your eyes less. Red button text replaced with green.
+
IDs with ID console access now go into the Confirm Identity slot by default like they used to, similarly IDs without it go into the Target slot by default again
+
Can easily swap out IDs by clicking the machine or the UI fields with another ID
+
ID console now names which IDs are added/removed in its visible messages
+
Labels the ID slot fields when logged in so you know which is which
+
Can use Job Management without an ID provided the console is logged in (matches how the console now stays logged in even without an ID)
+
Can log in without an ID in the Target field (matches how the machine now stays logged in even after the ID is removed from the Target field)
+
Cleans up UI slightly (had some duplicate/conflicting buttons)
+
Fixes ID console duping issues. Includes some ID containers, such as PDAs, tablets and wallets, into the swapping behavior when an ID card is being removed and the item is being held.
+
+
Xantholne updated:
+
+
New Berets for most heads and departments available in their autodrobes or lockers
+
+
YakumoChen updated:
+
+
New AI Holograms and Displays! Ported from /vg/station.
+
+
actioninja updated:
+
+
med records no longer can eat id cards for no reason
+
Chat is properly sent to legacy window if goonchat fails to load again.
+
+
dapnee updated:
+
+
fixed closet initialisation being broken
+
emergency closets no longer have a 1% chance to delete themselves
+
Communications console window no longer updates, won't steal focus anymore.
+
Trimline neutral end exists now.
+
+
dzahlus updated:
+
+
added a new gun sounds
+
removed an old gun sounds
+
+
him updated:
+
+
hos and aeg guns now conform to le epic taser rework standards
+
+
kappa-sama updated:
+
+
changed flavor text of alien tech on uplink
+
added TG's icons for traitor, russian, and golden revolver
+
+
kevinz000 updated:
+
+
you can now choose never for this round for magical antags
+
Cargo has passive point generation again at 750 points/minute
+
Mindshield crate price increased from 3000 to 4000
+
Miasma sell price reduced from 15/mol to 4/mol
+
bluespace wizard apprentice now has blink instead of targeted area teleportation
it now takes 4 strands to make one piece of durathread cloth
+
Looms can now be attacked.
+
Durathread golem weaves his magic
+
Supply ordered looms are unanchored. Bring a wrench.
+
+
r4d6 updated:
+
+
Added Departements Winter Coats to the loadout list.
+
+
04 November 2019
4dplanner, MMiracles updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 75cb5f4040..f5e4fea7cb 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -23119,3 +23119,540 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
less power or emag borgs for higher prices, limited uses, but higher power.
ursamedium:
- imageadd: Gas icons changed.
+2019-12-07:
+ AffectedArc07:
+ - code_imp: Fixes a LOT of code edge cases
+ Anonymous:
+ - rscadd: Added NEET-- I mean, DAB Suit and Helmet into loadout. Exclusive to Assistants,
+ for obvious reasons, and don't provide any armor. Goes well with balaclava,
+ finger-less gloves and jackboots for that true tactic~~f~~ool experience.
+ - tweak: Renamed loadout name appropriately (ASSU -> DAB)
+ Arturlang:
+ - tweak: PDA catridges cant be irradiated anymore.
+ Bhijn:
+ - code_imp: Item mousedrop() now provides a return value indicating whether or not
+ behavior has been overridden somehow.
+ - bugfix: Defibs now properly check that their loc is the same as the user for mousedrop()
+ calls, meaning ghosts can no longer make you equip defibs. Plus extra sanity
+ checks.
+ - bugfix: Pet carriers no longer attack turfs while trying to unload their contents.
+ - bugfix: Decks of cards now function as they originally intended when attempting
+ to use their drag and drop behavior.
+ - bugfix: Paper bins and papercutters no longer act wonky when you're trying to
+ pull a piece of paper from them.
+ - bugfix: Adds clothing drag n drop sanity checks.
+ - bugfix: Sythetic hats now have extra sanity checks
+ Coconutwarrior97:
+ - bugfix: Can only wrench down two transit tubes per turf.
+ Commandersand:
+ - rscadd: Added more stuff to loadout,check uniforms mask and backpack
+ DeltaFire15:
+ - rscadd: Adds eight new plushies
+ - imageadd: Adds icons for the new plushies and adds a new icon for the skylar plush
+ - imagedel: Deleted a old, no-longer used icon for the skylar plush
+ - spellcheck: Fixed a typo in the trilby plush
+ Fermis:
+ - tweak: tweaks botany reagent pHes
+ - tweak: Purity, Astral, RNG, MK, SMilk, SDGF, furranium, hatmium, eigen, nanite.
+ - bugfix: Eigen and purity.
+ - refactor: refactored sleepers!
+ - rscadd: Organ fridges to all maps near surgery with a random sensible organ, steralizine
+ and synthtissue.
+ - tweak: the med hand scanner to be less of a mishmash of random things
+ - rscadd: a little icon to the HUD if someone's heart has failed.
+ - tweak: Lets neurine's brain splash attack work via syringe.
+ - rscadd: a new surgery; Emergency Cardioversion Induction for use on the recently
+ deceased
+ - tweak: Synthtissue to be less demanding on growth size for organ regeneration
+ and improves clarify of it's growth gated effects.
+ - tweak: Synthtissue now is more useful than synthflesh on the dead
+ Fox McCloud:
+ - bugfix: Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot
+ would be less prone to igniting
+ Fox McCloud, Ghommie:
+ - bugfix: Fixes being able to mech-punch other mobs, as a pacifist
+ - bugfix: Fixes being able to hurt people, as a pacifist, by throwing them into
+ a wall or other mob, or by using most martial arts (save for the unpredictable
+ psychotic brawl, and the stamina-damage-only boxing).
+ - balance: Buffs boxing to outdamage natural stamina regeneration. Made the chance
+ of outright missing your opponent actually possible.
+ - tweak: Pacifists can now engage in the (laughably not harmful) sweet sweet art
+ of boxing now.
+ Ghommie:
+ - bugfix: Fixing implant cases being lost inside implant pads when trying to eject
+ them with your active hand full.
+ - tweak: Moved the implant pad's case ejection from attack_hand() to AltClick(),
+ added examination infos about it.
+ - bugfix: Fixed holodeck sleepers leaving sleeper buffers behind when deleted.
+ - bugfix: Fixed traitor codewords highlight and some other hear signal hooks spans
+ highlight (phobias, split personality, hypnosis) or modifiers (mind echo)
+ - bugfix: Fixed traitor codewords highlight not passing down with the mind datum
+ and stickying to the first mob.
+ - spellcheck: Fixed the incongruent bone satchel description.
+ - bugfix: Fixed sofa overlays doing nothing, because their layer wasn't properly
+ set.
+ - tweak: Suicide and cryo now prevents ghost/midround roles for a definite duration
+ of 30 minutes (and more if that was done before 30 minutes in the game passed),
+ down from the rest of the round.
+ - bugfix: fixed several midround roles bypassing and nulling the aforementioned
+ prevention measures.
+ - bugfix: Fixed the little issue of PDA skins not updating on job equip.
+ - tweak: Anomaly Crystals of the clowning type will now rename the victim to their
+ clown name preference when triggered, instead of giving them a random clown
+ name.
+ - balance: Lowered blob event earliest start from 1 hour to 40 minutes (ergo one
+ third), and the required player population from 40 to 35.
+ - bugfix: Several fixes and QoL for dullahans. They can see and hear visible and
+ audible messages now, don't need a space helmet they can't wear anyway to be
+ space/temperature proof, can examine things through shiftclick, and, most of
+ all, fixed their head being unpickable. Fixed dullahans gibbing when revived
+ or had their limbs regenerated.
+ - bugfix: humans should now drop gibs when gibbed again.
+ - rscadd: synths (not to be confused with IPCs), android and corporate species,
+ as well as robotic simple mobs, will now spawn robotic giblets instead of organic
+ ones.
+ - bugfix: You can't wear dakimakuras in any other inappropriate slots save for the
+ back slot anymore, degenerates.
+ - bugfix: Insert snarky remark about clock welders actually displaying the welder
+ flame overlay when turned on now here.
+ - balance: Minor ninja tweaks and stealth nerfs. The stealth penalty for the many
+ combat-related actions, bumping and now teleporting/dashing or firing guns has
+ been increased a by a third. There is now a cooldown of 5 seconds on toggling
+ stealth as well as a slighty slowed stealth in/out animation.
+ - imageadd: Ported slighty better matchbox sprites from CEV-Eris, also resprited
+ cigar boxes myself.
+ - bugfix: Fixed abductors/abductees objectives by porting an objective code.
+ - bugfix: Riding component fix
+ - bugfix: fixing a few runtimes on lightgeists, libido trait, rcd, one admin transformation
+ topic, chem dispensers, glowing robotic eyes...
+ - imageadd: Porting CEV-eris delivery packages sprites and dunking the old syndie
+ cybernetics box sprite.
+ - bugfix: Certain objects shouldn't be able to become radioactive because of a bitflag
+ that previously was checked nowhere in the code anymore.
+ - rscadd: Added a new PDA reskin, sprites from CEV-Eris
+ - rscadd: Clock cult starts with some spare vitality matrix charge scaled of the
+ number of starter servants.
+ - balance: Made the vitality matrix sigil slighty more visible, also allowed conversion
+ runes to heal fresh converts at the cost of some vitality charge.
+ - bugfix: 'Crawling won''t save you from the wrath of ocular wardens and pressure
+ sensors anymore, heretics. fix: Pressure sensors are no more triggered by floating/flying
+ mobs.'
+ - bugfix: Strawberry milk and tea have sprites now.
+ - bugfix: Fixed the Aux base camera door settings and toggle window type actions.
+ Also enabling the user to modify both door access and type.
+ - imageadd: Improved the two grayscale towel item sprites a little.
+ - bugfix: Fixed towels onmob suit overlays. Again.
+ - spellcheck: Fixed some reagents taste descriptions.
+ - bugfix: Fixed hidden random event reports only priting a paper message without
+ sending the message to the consoles' message list.
+ - bugfix: Rosary beads prayer now works on non-carbon mobs too, and won't break
+ when performed on a monkey or other humanoids.
+ - tweak: You can flagellate people with rosary beads on harm intent. It's even mediocrer
+ than the sord though.
+ - tweak: Moved the `Stealth and Camouflage Items` uplink category next to `Devices
+ and Tools`.
+ - bugfix: Deleted a duplicate phatom thief mask entry from the uplink.
+ - bugfix: Fixed missing delivery packages sprites
+ - bugfix: fixed a few minor issues with console frames building.
+ - bugfix: Wizards can use the teleport spell from their den once again.
+ - tweak: Wizards will now receive feedback messages when attempting to cast teleport
+ or use the warp whistle while in a no-teleport area.
+ - rscadd: New clockwork cultist, gondola, monkey and securitron cardboard cutouts.
+ - bugfix: Fixed aliens gasping randomly once in a while.
+ - bugfix: fixed superlube waterflower, my bad.
+ - bugfix: Fixed closing the aux base construction RCD's door access settings window
+ throwing you out of camera mode when closed.
+ - rscdel: Removed not functional aux base RCD's door type menu. Use airlock painters,
+ maybe.
+ - rscadd: Honkbot oil spills are of the slippery kind now. Honk.
+ - imageadd: local code scavenger finds forgotten slighty improved apc sprites left
+ buried in old dusty folders.
+ - bugfix: Seven old and otherwordly pAI holochassis icons have crawled their way
+ out of the modular citadel catacombs.
+ - bugfix: chem dispenser beakers end up in your hand yet again.
+ - bugfix: Bikehorns squeak yet again, the world is safe.
+ - bugfix: Cyborgs can now actually use cameras from a distance.
+ - bugfix: Suicides are yet again painful and instant and won't throw people in deep
+ crit from full health.
+ - bugfix: fixed rogue pixels on the energy gu- ahem blaster carbine... and a few
+ apc lights states being neigh-indistinguishable.
+ - bugfix: Fixed several "behind" layer tail sprites skipping areas normally covered
+ by bodyparts.
+ - bugfix: Morgues' original alert beeping sound has been restored, they no longer
+ go "ammunition depleted"
+ - bugfix: Fixed missing hypereutactic left inhand sprites.
+ - bugfix: Dying, ghosting, having your mind / ckey transferred to another mob, going
+ softcrit or otherwise unconscious now properly turn off combat mode.
+ - bugfix: combat mode can't be toggled on while non fully conscious anymore.
+ - bugfix: Fixed limbs' set_disabled NOT dropping your held items, updating your
+ hand slot inventory screen image, prompting chat messages and making your character
+ scream like a sissy.
+ - bugfix: Lusty xenomoprh maids will now actually clean tiles they travel onto yet
+ again.
+ - bugfix: Fixed double whitespace gap in human and AI examine. Fixed single whitespace
+ in carbon examine.
+ - rscdel: 'Removed a few useless supply packs: "Siezed" power cells, means of production
+ and promiscous organs.'
+ - tweak: Merged the synthetic blood supply pack into the standard blood supply pack,
+ effectively removing a random type blood pack in favor of two synthetic ones.
+ - tweak: "Merged together premium carpet pack n\xB01 and n\xB02 to hold one of each\
+ \ standard pattern."
+ - tweak: You can no longer estimate the amount of reagents found inside a damp rag.
+ - tweak: You can now squeeze a rag's reagents into another open container, as long
+ as the other one is not full.
+ - bugfix: Fixed ED-209 being unbuildable past the welding step.
+ - bugfix: Fixed ai displays status being reset to "Neutral" on login, regardless
+ of choice.
+ - bugfix: Fixed tinfoil hats giving random traumas.
+ Ghommie (original PR by Denton):
+ - rscadd: Added three new .38 ammo types. TRAC bullets, which embed a tracking implant
+ inside the target's body. The implant only lasts for five minutes and doesn't
+ work as a teleport beacon. Hot Shot bullets set targets on fire; Iceblox bullets
+ drastically lower the target's body temperature. They are available after researching
+ the Subdermal Implants node (TRAC) or Exotic Ammunition node (Hot Shot/Iceblox).
+ - tweak: Renamed the Technological Shells research node to Exotic Ammunition.
+ - code_imp: The "lifespan_postmortem" var now determines how long tracking implants
+ work after death.
+ - rscadd: .357 AP speedloaders can now be ordered from syndicate uplinks.
+ - balance: lowered the cost of uplink's .357 speedloaderd from 4 to 3.
+ Ghommie (original PR by nicbn and Menshin):
+ - bugfix: You can click on things that are under flaps or holo barriers.
+ Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak):
+ - rscadd: Adds the intelliLantern, a big ol' spooky intelliCard skin
+ - rscadd: crafting recipe for the new intelliCard skin (requires 1 pumpkin, 1 intelliCard,
+ 5 cables and a wirecutter as a tool)
+ - tweak: changed the intelliTater crafting recipe to match the intelliLantern recipe
+ (but with a potato for obvious reasons) add:cute pai gameboy face :3
+ Ghommie, porting lot of PRs by MrDoomBringer, AnturK, nemvar and coiax.:
+ - admin: Admins can now launch supplypods the old, slightly quicker way as well
+ - bugfix: Centcom-launched supplypods will now properly delimb you (if they are
+ designated to do so) instead of touching you then literally yeeting all of your
+ internal organs out of your body.
+ - admin: Centcom can now specify if they want to yeet all of your organs out of
+ your body with a supplypod
+ - soundadd: Supplypods sound a bit nicer as the land now.
+ - admin: admins can now adjust the animation duration for centcom-launched supplypods
+ - admin: admins can adjust any sounds that are played as the supplypod lands
+ - bugfix: Reverse-Supplypods (the admin-launched ones) no longer stay behind after
+ rising up, and also auto-delete from centcom.
+ - admin: The centcom podlauncher now has better logging
+ - tweak: Admins can now allow ghosts to follow the delivery of Centcom-launched
+ supply pods
+ - admin: Admins can now use the Centcom Podlauncher to launch things without the
+ things looking like they're being sent inside a pod.
+ - admin: sparks will not generate if the quietLanding effect is on, for the centcom
+ podlauncher
+ - admin: makes input text clearer for the centcom podlauncher
+ - admin: New 'Podspawn' verb, which functions like 'Spawn', except any atoms movable
+ spawned will be dropped in via a no-damage, no-explosion Centcom supply pod.
+ - bugfix: Removed an oversight that made many obj/effect subtypes accidentally bombproof.
+ GrayRachnid:
+ - rscadd: Added saboteur syndicate engiborg
+ - tweak: changed cyborg tool icons and the secborg taser/laser icons.
+ - bugfix: Fixes golden toolbox missing inhand sprite
+ - rscadd: Added traumas
+ - rscadd: Added science powergame tool
+ - tweak: a few hearing args
+ - bugfix: fixed my mistakes
+ - tweak: tweaked the number of ingredients/pancakes you can stack.
+ Hatterhat:
+ - tweak: The Big Red Button now sets bomb timers to 2 seconds, instead of 5.
+ - tweak: Gloves of the North Star (not Hugs of the North Star) now use all their
+ intents very, very fast. This does not apply to grabs' click cooldown, nor shoving
+ people.
+ - rscadd: The seedvault/alien plant DNA manipulator can now be printed off with
+ Alien Biotechnology.
+ Iroquois-Pliskin:
+ - rscdel: Removed Clockwork Cult Surgical facility from Reebe
+ Jerry Derpington, baldest of the balds, and nemvar.:
+ - rscdel: Nanotrasen has lost communication to two away mission sites that contained
+ a beach for Nanotrasen employees.
+ - rscadd: Nanotrasen has been able to locate a new away mission site that ALSO has
+ a beach. Nanotrasen employees will be able to enjoy the beach after all!
+ - rscadd: Seashells have been added to the game.
+ KathrinBailey:
+ - rscadd: Two extra 'luxury' dorms rooms!
+ - rscadd: Gas miners to atmos.
+ - rscadd: Posters around the station.
+ - rscadd: Vacant room added to the Starboard Bow with it's own APC, above electrical
+ maintenance.
+ - rscadd: New trendy clothes to the locker room, giving variety and bringing fashion
+ back onto Nanotrasen stations.
+ - rscadd: Coloured bedsheet and towel bin.
+ - rscadd: Maid uniforms for the janitor.
+ - tweak: Completely reworked bar. Milk kegs added in bar office. The bar has been
+ changed for a homey restaurant feel just in time for Christmas! You can now
+ run it as an actual restaurant! Local Bartender Icktsie III loved it so much
+ he rolled around on the new floor smiling happily.
+ - tweak: Dorms rework. Fitness room now has lots of costumes and outfits.
+ - tweak: Junk removed from engineering, welding goggles added.
+ - tweak: Welding tools in engineering replaced with industrial welding tools.
+ - tweak: Package wrappers and hand labellers now in major departments.
+ - tweak: Cell charger moved from engineering lobby to the protolathe room, just
+ like how it is in all of the other maps and just where the cell charger is actually
+ needed.
+ - tweak: Library redesigned to have a private room and a 3x3 private study that
+ is cleaned up.
+ - tweak: Paper bins have gone big or gone home, with premium stationery scattered
+ around. Engineering and security now have a labeller and packaging supplies.
+ - bugfix: Dark spot top left of Botany fixed.
+ - bugfix: Huge galactic-sized dark spot in bar fixed.
+ - bugfix: Light replacers now are less horrifically overpowered and PTSD-inducing
+ for the server.
+ - bugfix: 'Fixes issue 9706: https://github.com/Citadel-Station-13/Citadel-Station-13/issues/9706
+ Part of maint getting hit by radstorms.
+
+ _Kathrin''s Box Beautification:_'
+ - rscadd: Ports TG's pews https://github.com/tgstation/tgstation/pull/42712
+ - rscadd: The first step of a corporate incursion of Space IKEA into Nanotrasen.
+ Kevinz000, Cruix, MrStonedOne, Denton, Kmc2000, Anturk, MrDoomBringer, Dennok, TheChosenEvilOne, Ghommie:
+ - rscadd: Added support for Multi-Z power, atmospherics and disposals
+ - bugfix: 'massive service department nerf: space can no longer be extra crispy.'
+ Knouli:
+ - rscadd: attack_self proc for the legion core which triggers a self-heal al la
+ the previous 'afterattack' proc, as if clicking on the character's own sprite
+ to self-heal
+ - rscadd: admin logging for all three use cases of legion core healing - afterattack,
+ attack_self, and implanted ui_action_click
+ Krysonism, Ghommie:
+ - rscadd: NT has made breakthroughs in ice cream science, ice creams can now be
+ flavoured with any reagent!
+ - tweak: The ice cream vat now accepts beakers.
+ - bugfix: Grape and Peach icecreams have scoop overlays yet again.
+ Linzolle:
+ - code_imp: butchering component update
+ - tweak: hat tossing can no longer knock hats off
+ - bugfix: strange reagent being unable to revive simplemobs
+ - rscadd: jitter animation and more clear text to strange reagent revival
+ Mickyy5:
+ - rscadd: Nanotrasen are now issuing Plasmamen with plasma in their survival boxes
+ MrJWhit:
+ - tweak: tweaked brain damage line
+ Naksu, ShizCalev:
+ - refactor: Refactored examine-code
+ - bugfix: Examining a human with a burned prosthetic limb will no longer tell you
+ that the limb is blistered.
+ - tweak: Items will now inform you if they are resistant to frost, fire, acid, and
+ lava when examined.
+ Owai-Seek:
+ - rscadd: '"silly" bounties'
+ - rscadd: '"gardenchef" bounties'
+ - rscdel: several bounties that require seriously good RNG to pull off.
+ - tweak: moved several chef and assistant bounties to silly and gardenchef
+ - balance: modified several bounty point rewards
+ - server: added new files "silly.dm" and "gardenchef.dm"
+ - rscadd: 15+ new crates for cargo
+ - tweak: organizes crates and moving them to proper categories
+ - rscdel: some dumb stuff like toner crates re
+ - rscadd: leg wraps and sweaters to clothesmate
+ - rscadd: screwdriver and cable coil to janidrobe
+ - rscadd: screwdriver and cable coil to janibelt whitelist (for fixing/placing light
+ fixtures)
+ - rscadd: monkey cube, syringe, enzyme, soy sauce, and cryoxadone to chef's vendor
+ (contraband and premium)
+ - rscadd: add cracker, beans, honey bars, lollipops, chocolate coin, and spider
+ lollipop to snack vendors (contraband and premium)
+ - rscadd: newspaper to loadout menu for bapping purposes
+ - rscdel: removed poppy pretzels from snack vendor premium
+ - rscadd: maid uniform (janimaid alt) to kinkmate.
+ - tweak: moves gear harness from premium to normal stock in kinkmate
+ - balance: re-balanced metal shield bounty
+ - rscadd: cryoxadone bottle (for use in chef vendor)
+ PersianXerxes:
+ - tweak: Reduces the grace period for meteors from a minimum of 5 and maximum of
+ 10 to 3 and 6 minutes respectively.
+ - rscadd: Adds a pair of VR sleepers to Box Station's permabrig
+ - rscadd: Adds a pair of VR sleepers to Delta Station's permabrig
+ - rscadd: Adds a pair of VR sleepers to Pubby Station's permabrig
+ - rscadd: Adds a pair of VR sleepers to Meta Station's permabrig
+ Putnam:
+ - bugfix: From-ghosts dynamic rulesets now actually listen to "required candidates"
+ - bugfix: Every dynamic-triggered event is now blacklisted from being triggered
+ by the random events system when dynamic can trigger them.
+ - rscadd: Dynamic voting now features extended, if recent rounds have been chaotic.
+ - tweak: Roundstart rulesets now scale on population ready rather than total population.
+ - bugfix: Threat log now accurately represents what actually used the threat.
+ - tweak: Verbose threat log (admin-only) now shows ALL threat level changes.
+ - bugfix: VR mobs can no longer be dynamic midround antags.
+ - bugfix: Personal closets can use anything that holds an ID card now.
+ Putnam3145:
+ - bugfix: traitors work now
+ - balance: Gas filters now push gas the same way volume pumps do.
+ - balance: Gas filters now won't clog if only one output is clogged.
+ - tweak: Glowsticks can no longer be radioactively contaminated (one more supermatter
+ contam exploit gone)
+ - bugfix: traitor removal is no longer borked
+ - rscadd: Dynamic voting
+ - config: Added DYNAMIC_VOTING to game_options
+ - tweak: SDGF now copies memories as well as antag data and factions.
+ - bugfix: Summon events now properly costs threat.
+ - bugfix: Refunded spells refund threat, too.
+ - refactor: Made wizard spells inherently have a requirement and cost.
+ - tweak: Meteor wave is no longer repeatable in dynamic.
+ - tweak: tweaked nuke ops
+ - bugfix: Organs can no longer be radioactively contaminated.
+ Robustin, Subject217:
+ - balance: The NukeOp Shuttle hull has been dramatically hardened. The walls are
+ now "R-Walls" with far greater explosion resistance.
+ - balance: The NukeOp Shuttle guns have been significantly buffed. They now rapidly
+ fire a new type of penetrator round, at a greater range, and have far greater
+ explosion resistance.
+ - balance: The nuclear device on the NukeOp Shuttle is now in an anchored state
+ by default, the Nuke can only be unanchored by inserting the disk and entering
+ the proper code.
+ - balance: Non-Syndicate cyborgs are now unable to access the NukeOp Shuttle Console.
+ - bugfix: You can now unanchor Nukes even when the floor under them has been destroyed
+ Seris02:
+ - rscadd: added sleeping carp hallucination
+ - rscadd: Centcom + Assistant's formal winter coat + loadout + narsian + ratvarian
+ winter coats
+ - rscadd: GPS location on examine
+ - bugfix: fixed the meteor hallucination
+ - tweak: tweaked the way the tapered penis looks
+ - rscadd: Added nine winter coats
+ - imageadd: added images for the winter coats
+ - tweak: adds the mining winter coat to mining wardrobes and mining lockers
+ ShizCalev:
+ - tweak: Ghosts can now see active AI cameras.
+ - bugfix: Fixed a couple of laser / energy guns never switching to the empty icon
+ despite being unable to fire.
+ Swindly:
+ - bugfix: Fixed MMIs not being able to use mecha equipment
+ - bugfix: Fixed MMIs not getting mecha mouse pointers
+ - bugfix: Fixed MMIs not getting medical HUDs in Odysseuses
+ - tweak: Brains can now switch to harm intent
+ Tetr4:
+ - bugfix: Turning a tile with gas effects into space now gets rid of the effects.
+ Trilbyspaceclone:
+ - rscadd: plastic trash cart crafting with plastic
+ - rscadd: wallets are known for now holding more items
+ - tweak: shades and clowns HP
+ - rscadd: six more crates, A barrel, A Loom, 40 cotton sheets, two sets of fruit
+ crates, raw lumber crate
+ - rscadd: All fermi chems, Boozes, Medical, food chems now sell
+ - rscadd: Loads more to sell - Mech gear, Cooking and more!
+ - tweak: Moved around the vaule of some things and removed elastic of most items
+ - balance: Rebreather implants will now loss vaule, Do to being just metal and glass
+ - balance: lowered how many chems are in lewd chem kegs to be around 150-100 as
+ well as the fancy booze kegs
+ - bugfix: bad returns and tools used
+ - rscadd: 8 new cargo crates!
+ - tweak: tablet cargo crate by -3k
+ - admin: Closes a bunch of issues
+ - server: updates changlogs and such
+ - bugfix: fixed a catnip not having sprites
+ - balance: Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw
+ and base ball bat into bulky items so they may fit
+ - server: changes header to be more cit-like
+ - rscadd: new clothing for the hotel staff and a hat
+ Ty-the-Smonk:
+ - bugfix: You can now interact with self sustaining crossbreeds
+ Useroth:
+ - rscadd: Colored fairygrass variants.
+ - bugfix: Added a missing cherrybulb seedpack sprite
+ - bugfix: numbered storages now are sorted in a consistent way, instead of depending
+ on ordering of their contents var
+ - rscadd: strange seeds as a buyable traitor botanist item
+ - bugfix: resolves the issues revolving around blackpowder exploding where the reaction
+ happened, instead of where it actually is through making it explode instantly
+ - tweak: the explosion delay moved from blackpowder directly into bomb cherries,
+ to keep them functioning as intended
+ - rscadd: A bunch of newer tg plants
+ - rscadd: A bunch of newer tg plant traits
+ - rscadd: A couple of newer tg plant reagents
+ - bugfix: the new plants now properly get their reagents and reagent genes instead
+ of being empty with UNKNOWN reagents listed in the DNA machine
+ - rscadd: extradimensional oranges now contain haloperidol
+ - bugfix: extradimensional oranges now actually grow properly and give proper seeds.
+ Weblure:
+ - rscadd: Button added to slime console that prints out the hotkey commands to the
+ user. [Includes DMI update]
+ - rscadd: Shift-click a slime to pick it up, or the floor to drop all held slimes.
+ (Requires Basic Slime Console upgrade)
+ - rscadd: Ctrl-click a slime to scan it.
+ - rscadd: Alt-click a slime to feed it a potion. (Requires Advanced Slime Console
+ upgrade)
+ - rscadd: Ctrl-click on a dead monkey to recycle it, or the floor to place a new
+ monkey. (Requires Monkey Console upgrade)
+ - rscadd: If the console does not have the required upgrade, an error message will
+ print to the user.
+ - rscadd: You can now pick up a single slime from a pile, instead of all of them
+ at once.
+ - tweak: When recycling monkeys, the console will now report how many monkeys it
+ has (will not report decimal increases).
+ - tweak: Console now alerts you when you're out of monkeys and reports your current
+ decimal amount.
+ - tweak: Console messages are now styled consistently.
+ XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie):
+ - tweak: Holding an ID in your hands uses it instead of your worn ID for authentication
+ purposes.
+ - tweak: If you don't have an ID in your id slot, the belt slot will be checked
+ as well.
+ - code_imp: small cleanup to id and bounty console html generation
+ - tweak: Hop console now hurts your eyes less. Red button text replaced with green.
+ - tweak: IDs with ID console access now go into the Confirm Identity slot by default
+ like they used to, similarly IDs without it go into the Target slot by default
+ again
+ - rscadd: Can easily swap out IDs by clicking the machine or the UI fields with
+ another ID
+ - rscadd: ID console now names which IDs are added/removed in its visible messages
+ - rscadd: Labels the ID slot fields when logged in so you know which is which
+ - tweak: Can use Job Management without an ID provided the console is logged in
+ (matches how the console now stays logged in even without an ID)
+ - tweak: Can log in without an ID in the Target field (matches how the machine now
+ stays logged in even after the ID is removed from the Target field)
+ - tweak: Cleans up UI slightly (had some duplicate/conflicting buttons)
+ - bugfix: Fixes ID console duping issues. Includes some ID containers, such as PDAs,
+ tablets and wallets, into the swapping behavior when an ID card is being removed
+ and the item is being held.
+ Xantholne:
+ - rscadd: New Berets for most heads and departments available in their autodrobes
+ or lockers
+ YakumoChen:
+ - imageadd: New AI Holograms and Displays! Ported from /vg/station.
+ actioninja:
+ - bugfix: med records no longer can eat id cards for no reason
+ - bugfix: Chat is properly sent to legacy window if goonchat fails to load again.
+ dapnee:
+ - bugfix: fixed closet initialisation being broken
+ - rscdel: emergency closets no longer have a 1% chance to delete themselves
+ - bugfix: Communications console window no longer updates, won't steal focus anymore.
+ - bugfix: Trimline neutral end exists now.
+ dzahlus:
+ - soundadd: added a new gun sounds
+ - sounddel: removed an old gun sounds
+ him:
+ - bugfix: hos and aeg guns now conform to le epic taser rework standards
+ kappa-sama:
+ - tweak: changed flavor text of alien tech on uplink
+ - imageadd: added TG's icons for traitor, russian, and golden revolver
+ kevinz000:
+ - rscadd: you can now choose never for this round for magical antags
+ - rscadd: Cargo has passive point generation again at 750 points/minute
+ - balance: Mindshield crate price increased from 3000 to 4000
+ - balance: Miasma sell price reduced from 15/mol to 4/mol
+ - balance: bluespace wizard apprentice now has blink instead of targeted area teleportation
+ - balance: Emagged medibots now charcoal toxinlovers.
+ - balance: disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage
+ - balance: kinetic crushers no longer drop if you try to use it with one hand
+ - config: added multi_keyed_list, delimiter defaults to |.
+ - balance: Light pink extracts no longer speed you up. Instead, they give stamina
+ regeneration and free sprinting.
+ kiwedespars:
+ - rscdel: removed moth fluff coloring you like your wings
+ - balance: made insect not so bad.
+ nemvar:
+ - bugfix: You now get a message if your PDA explodes while you are holding it.
+ - tweak: The lavaland clown ruin has some new pranks ready.
+ - rscadd: Added a new loot item to the lavaland clown ruin.
+ - rscdel: Removed the slime core from said ruin.
+ - balance: The clown PDA now properly slips people on jogging move intent regardless
+ of fatigue. Honkmother's will.
+ nemvar, ShizCalev, Qustinnus/Floyd, Ghommie:
+ - rscadd: You can now unfasten the loom.
+ - tweak: it now takes 4 strands to make one piece of durathread cloth
+ - bugfix: Looms can now be attacked.
+ - rscadd: Durathread golem weaves his magic
+ - tweak: Supply ordered looms are unanchored. Bring a wrench.
+ r4d6:
+ - rscadd: Added Departements Winter Coats to the loadout list.
diff --git a/html/changelogs/AutoChangeLog-pr-10005.yml b/html/changelogs/AutoChangeLog-pr-10005.yml
deleted file mode 100644
index 728de78c37..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10005.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Commandersand"
-delete-after: True
-changes:
- - rscadd: "Added more stuff to loadout,check uniforms mask and backpack"
diff --git a/html/changelogs/AutoChangeLog-pr-10010.yml b/html/changelogs/AutoChangeLog-pr-10010.yml
deleted file mode 100644
index 2926093ee4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10010.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixing implant cases being lost inside implant pads when trying to eject them with your active hand full."
- - tweak: "Moved the implant pad's case ejection from attack_hand() to AltClick(), added examination infos about it."
diff --git a/html/changelogs/AutoChangeLog-pr-10015.yml b/html/changelogs/AutoChangeLog-pr-10015.yml
deleted file mode 100644
index 61ce93cd88..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10015.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "traitors work now"
diff --git a/html/changelogs/AutoChangeLog-pr-10016.yml b/html/changelogs/AutoChangeLog-pr-10016.yml
deleted file mode 100644
index 783b56ff0b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10016.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Bhijn"
-delete-after: True
-changes:
- - code_imp: "Item mousedrop() now provides a return value indicating whether or not behavior has been overridden somehow."
- - bugfix: "Defibs now properly check that their loc is the same as the user for mousedrop() calls, meaning ghosts can no longer make you equip defibs. Plus extra sanity checks."
- - bugfix: "Pet carriers no longer attack turfs while trying to unload their contents."
- - bugfix: "Decks of cards now function as they originally intended when attempting to use their drag and drop behavior."
- - bugfix: "Paper bins and papercutters no longer act wonky when you're trying to pull a piece of paper from them."
- - bugfix: "Adds clothing drag n drop sanity checks."
- - bugfix: "Sythetic hats now have extra sanity checks"
diff --git a/html/changelogs/AutoChangeLog-pr-10017.yml b/html/changelogs/AutoChangeLog-pr-10017.yml
deleted file mode 100644
index a208dce4a6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10017.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "Gas filters now push gas the same way volume pumps do."
- - balance: "Gas filters now won't clog if only one output is clogged."
diff --git a/html/changelogs/AutoChangeLog-pr-10031.yml b/html/changelogs/AutoChangeLog-pr-10031.yml
deleted file mode 100644
index 707cb80f66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10031.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed holodeck sleepers leaving sleeper buffers behind when deleted."
diff --git a/html/changelogs/AutoChangeLog-pr-10037.yml b/html/changelogs/AutoChangeLog-pr-10037.yml
new file mode 100644
index 0000000000..b0f0501516
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10037.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed hulks, sleeping carp users, pacifists and people with chunky fingers being able to unrestrictly use gun and pneumatic cannon circuit assemblies."
+ - bugfix: "Fixed gun circuit assemblies being only usable by human mobs."
+ - balance: "Doubled the locomotion circuit external cooldown, thus halving the movable assemblies' movespeed."
diff --git a/html/changelogs/AutoChangeLog-pr-10044.yml b/html/changelogs/AutoChangeLog-pr-10044.yml
new file mode 100644
index 0000000000..8d1782c3a8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10044.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "Made wooden cabinet/closets... actually made of wood."
+ - tweak: "Wooden cabinets are now deconstructable with a screwdriver."
+ - tweak: "Deconstruction of large crates and other closet subtypes deconstructable with tools other than the welder is no longer instant."
diff --git a/html/changelogs/AutoChangeLog-pr-10053.yml b/html/changelogs/AutoChangeLog-pr-10053.yml
new file mode 100644
index 0000000000..36d392d8f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10053.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed welding, thirteen loko, welding and wraith spectacles not blinding people as expected. Thank you all whomst reported this issue in the suggestions box channel instead of the github repository's issues section, very smart!"
diff --git a/html/changelogs/AutoChangeLog-pr-10057.yml b/html/changelogs/AutoChangeLog-pr-10057.yml
new file mode 100644
index 0000000000..be285bfc57
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10057.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed on_mob eyes overlays not updating properly in certain cases."
+ - bugfix: "Fixed deconversion from bloodshot eyes blood cult resetting your eyes' color to pitch black instead of their previous color, more or less."
diff --git a/html/changelogs/AutoChangeLog-pr-10068.yml b/html/changelogs/AutoChangeLog-pr-10068.yml
new file mode 100644
index 0000000000..39b2c37c28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10068.yml
@@ -0,0 +1,5 @@
+author: "Fikou"
+delete-after: True
+changes:
+ - tweak: "the windup toolbox now has some more \"realistic\" sounds"
+ - bugfix: "the windup toolbox now rumbles again"
diff --git a/html/changelogs/AutoChangeLog-pr-10071.yml b/html/changelogs/AutoChangeLog-pr-10071.yml
new file mode 100644
index 0000000000..3632bdfa86
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10071.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes bubblegum's death not unlocking the arena shuttle buyment."
diff --git a/html/changelogs/AutoChangeLog-pr-10082.yml b/html/changelogs/AutoChangeLog-pr-10082.yml
new file mode 100644
index 0000000000..e5c669f798
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10082.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Launchpads can now take number inputs for offsets rather than just buttons."
diff --git a/html/changelogs/AutoChangeLog-pr-10083.yml b/html/changelogs/AutoChangeLog-pr-10083.yml
new file mode 100644
index 0000000000..c60c3fea36
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10083.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed space hermit asteroid rocks unintendedly spawning airless asteroid turf when mined, save for the perimeter."
diff --git a/html/changelogs/AutoChangeLog-pr-10085.yml b/html/changelogs/AutoChangeLog-pr-10085.yml
new file mode 100644
index 0000000000..a82f052fed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10085.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes reviver implant having been a crapshot ever since soft-crit was introduced years ago."
+ - tweak: "Added a \"convalescence\" time (about 15 seconds) after the user is out of unconsciousbess/crit to ensure they are properly stabilized."
+ - tweak: "Added a 15 minutes hardcap for accumulated revive cooldown (equivalent to 150 points of brute or burn healed) above which the implant starts cooling down regardless of user's conditions."
diff --git a/html/changelogs/AutoChangeLog-pr-10086.yml b/html/changelogs/AutoChangeLog-pr-10086.yml
new file mode 100644
index 0000000000..08dff8ee5c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10086.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed AI core displays I may have broken with my coding extravaganza."
diff --git a/html/changelogs/AutoChangeLog-pr-10094.yml b/html/changelogs/AutoChangeLog-pr-10094.yml
new file mode 100644
index 0000000000..ee9513489d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10094.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "coder cat failers to push the last commit from year(s) ago"
diff --git a/html/changelogs/AutoChangeLog-pr-10099.yml b/html/changelogs/AutoChangeLog-pr-10099.yml
new file mode 100644
index 0000000000..9ad4bfdfc2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10099.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed a few holo barriers lacking transparency."
diff --git a/html/changelogs/AutoChangeLog-pr-9614.yml b/html/changelogs/AutoChangeLog-pr-10101.yml
similarity index 61%
rename from html/changelogs/AutoChangeLog-pr-9614.yml
rename to html/changelogs/AutoChangeLog-pr-10101.yml
index ae47ffb4a3..059c8b2d85 100644
--- a/html/changelogs/AutoChangeLog-pr-9614.yml
+++ b/html/changelogs/AutoChangeLog-pr-10101.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - tweak: "shades and clowns HP"
+ - admin: "Updates the changlogs"
diff --git a/html/changelogs/AutoChangeLog-pr-10108.yml b/html/changelogs/AutoChangeLog-pr-10108.yml
new file mode 100644
index 0000000000..67c6396763
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10108.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - balance: "Clock cult kindle no longer cares about oxygen damage"
diff --git a/html/changelogs/AutoChangeLog-pr-10114.yml b/html/changelogs/AutoChangeLog-pr-10114.yml
new file mode 100644
index 0000000000..f413760ff9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10114.yml
@@ -0,0 +1,4 @@
+author: "r4d6"
+delete-after: True
+changes:
+ - rscadd: "Added a N2O pressure tank"
diff --git a/html/changelogs/AutoChangeLog-pr-10116.yml b/html/changelogs/AutoChangeLog-pr-10116.yml
new file mode 100644
index 0000000000..70c1b4590d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10116.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "acute hepatic pharmacokinesis now works if you already have relevant genitals"
diff --git a/html/changelogs/AutoChangeLog-pr-10130.yml b/html/changelogs/AutoChangeLog-pr-10130.yml
new file mode 100644
index 0000000000..1f6ba6ac6a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10130.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - code_imp: "modular is gone"
diff --git a/html/changelogs/AutoChangeLog-pr-9663.yml b/html/changelogs/AutoChangeLog-pr-10132.yml
similarity index 57%
rename from html/changelogs/AutoChangeLog-pr-9663.yml
rename to html/changelogs/AutoChangeLog-pr-10132.yml
index ad11e40878..d8755d2b90 100644
--- a/html/changelogs/AutoChangeLog-pr-9663.yml
+++ b/html/changelogs/AutoChangeLog-pr-10132.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - bugfix: "bad returns and tools used"
+ - tweak: "meat hook from HUGE to bulky"
diff --git a/html/changelogs/AutoChangeLog-pr-10140.yml b/html/changelogs/AutoChangeLog-pr-10140.yml
new file mode 100644
index 0000000000..d5e33fa02d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10140.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Dynamic has a (totally unused for any relevant purpose) roundstart report now."
diff --git a/html/changelogs/AutoChangeLog-pr-10143.yml b/html/changelogs/AutoChangeLog-pr-10143.yml
new file mode 100644
index 0000000000..45dfe225c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10143.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Dynamic from-ghost antags no longer double dip on threat refunds when the mode fails due to not enough applications."
diff --git a/html/changelogs/AutoChangeLog-pr-9268.yml b/html/changelogs/AutoChangeLog-pr-9268.yml
deleted file mode 100644
index 3d856b6842..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9268.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Fermis"
-delete-after: True
-changes:
- - tweak: "Purity, Astral, RNG, MK, SMilk, SDGF, furranium, hatmium, eigen, nanite."
- - bugfix: "Eigen and purity."
diff --git a/html/changelogs/AutoChangeLog-pr-9323.yml b/html/changelogs/AutoChangeLog-pr-9323.yml
deleted file mode 100644
index 19e91deaf5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9323.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "you can now choose never for this round for magical antags"
diff --git a/html/changelogs/AutoChangeLog-pr-9430.yml b/html/changelogs/AutoChangeLog-pr-9430.yml
deleted file mode 100644
index 8552d00926..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9430.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Ghommie (original PR by Denton)"
-delete-after: True
-changes:
- - rscadd: "Added three new .38 ammo types. TRAC bullets, which embed a tracking implant inside the target's body. The implant only lasts for five minutes and doesn't work as a teleport beacon. Hot Shot bullets set targets on fire; Iceblox bullets drastically lower the target's body temperature. They are available after researching the Subdermal Implants node (TRAC) or Exotic Ammunition node (Hot Shot/Iceblox)."
- - tweak: "Renamed the Technological Shells research node to Exotic Ammunition."
- - code_imp: "The \"lifespan_postmortem\" var now determines how long tracking implants work after death."
- - rscadd: ".357 AP speedloaders can now be ordered from syndicate uplinks."
- - balance: "lowered the cost of uplink's .357 speedloaderd from 4 to 3."
diff --git a/html/changelogs/AutoChangeLog-pr-9453.yml b/html/changelogs/AutoChangeLog-pr-9453.yml
deleted file mode 100644
index bcb35f7394..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9453.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "Suicide and cryo now prevents ghost/midround roles for a definite duration of 30 minutes (and more if that was done before 30 minutes in the game passed), down from the rest of the round."
- - bugfix: "fixed several midround roles bypassing and nulling the aforementioned prevention measures."
diff --git a/html/changelogs/AutoChangeLog-pr-9518.yml b/html/changelogs/AutoChangeLog-pr-9518.yml
deleted file mode 100644
index 67a2c25938..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9518.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie (original PR by nicbn and Menshin)"
-delete-after: True
-changes:
- - bugfix: "You can click on things that are under flaps or holo barriers."
diff --git a/html/changelogs/AutoChangeLog-pr-9530.yml b/html/changelogs/AutoChangeLog-pr-9530.yml
deleted file mode 100644
index ace41e9e97..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9530.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed the little issue of PDA skins not updating on job equip."
- - tweak: "Anomaly Crystals of the clowning type will now rename the victim to their clown name preference when triggered, instead of giving them a random clown name."
diff --git a/html/changelogs/AutoChangeLog-pr-9538.yml b/html/changelogs/AutoChangeLog-pr-9538.yml
new file mode 100644
index 0000000000..a036a8d24a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9538.yml
@@ -0,0 +1,5 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Combat defibs now instant stun on disarm rather than 1 second again"
+ - balance: "Defibs are now always emagged when emagged with an emag rather than EMP."
diff --git a/html/changelogs/AutoChangeLog-pr-9544.yml b/html/changelogs/AutoChangeLog-pr-9544.yml
deleted file mode 100644
index 1b0d979b7f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9544.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "tweaked brain damage line"
diff --git a/html/changelogs/AutoChangeLog-pr-9554.yml b/html/changelogs/AutoChangeLog-pr-9554.yml
deleted file mode 100644
index 229f5a5d0c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9554.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Anonymous"
-delete-after: True
-changes:
- - rscadd: "Added NEET-- I mean, DAB Suit and Helmet into loadout. Exclusive to Assistants, for obvious reasons, and don't provide any armor. Goes well with balaclava, finger-less gloves and jackboots for that true tactic~~f~~ool experience."
diff --git a/html/changelogs/AutoChangeLog-pr-9557.yml b/html/changelogs/AutoChangeLog-pr-9557.yml
deleted file mode 100644
index f88e9cced8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9557.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - rscadd: "Dynamic voting"
- - config: "Added DYNAMIC_VOTING to game_options"
diff --git a/html/changelogs/AutoChangeLog-pr-9574.yml b/html/changelogs/AutoChangeLog-pr-9574.yml
deleted file mode 100644
index 240d5ad0af..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9574.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - rscadd: "Added Departements Winter Coats to the loadout list."
diff --git a/html/changelogs/AutoChangeLog-pr-9611.yml b/html/changelogs/AutoChangeLog-pr-9611.yml
deleted file mode 100644
index 48a0e9982b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9611.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "Cargo has passive point generation again at 750 points/minute"
- - balance: "Mindshield crate price increased from 3000 to 4000"
- - balance: "Miasma sell price reduced from 15/mol to 4/mol"
diff --git a/html/changelogs/AutoChangeLog-pr-9628.yml b/html/changelogs/AutoChangeLog-pr-9628.yml
deleted file mode 100644
index 45315940ac..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9628.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "six more crates, A barrel, A Loom, 40 cotton sheets, two sets of fruit crates, raw lumber crate"
- - rscadd: "All fermi chems, Boozes, Medical, food chems now sell"
- - rscadd: "Loads more to sell - Mech gear, Cooking and more!"
- - tweak: "Moved around the vaule of some things and removed elastic of most items"
- - balance: "Rebreather implants will now loss vaule, Do to being just metal and glass"
- - balance: "lowered how many chems are in lewd chem kegs to be around 150-100 as well as the fancy booze kegs"
diff --git a/html/changelogs/AutoChangeLog-pr-9629.yml b/html/changelogs/AutoChangeLog-pr-9629.yml
new file mode 100644
index 0000000000..f0419e4ce9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9629.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "aooc toggling now only broadcasts to antagonists"
diff --git a/html/changelogs/AutoChangeLog-pr-9632.yml b/html/changelogs/AutoChangeLog-pr-9632.yml
deleted file mode 100644
index 41abee528f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9632.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Kevinz000, Cruix, MrStonedOne, Denton, Kmc2000, Anturk, MrDoomBringer, Dennok, TheChosenEvilOne, Ghommie"
-delete-after: True
-changes:
- - rscadd: "Added support for Multi-Z power, atmospherics and disposals"
- - bugfix: "massive service department nerf: space can no longer be extra crispy."
diff --git a/html/changelogs/AutoChangeLog-pr-9666.yml b/html/changelogs/AutoChangeLog-pr-9666.yml
deleted file mode 100644
index 9d4511b3e9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9666.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Lowered blob event earliest start from 1 hour to 40 minutes (ergo one third), and the required player population from 40 to 35."
diff --git a/html/changelogs/AutoChangeLog-pr-9680.yml b/html/changelogs/AutoChangeLog-pr-9680.yml
deleted file mode 100644
index e2e9aa0b64..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9680.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "\"silly\" bounties"
- - rscadd: "\"gardenchef\" bounties"
- - rscdel: "several bounties that require seriously good RNG to pull off."
- - tweak: "moved several chef and assistant bounties to silly and gardenchef"
- - balance: "modified several bounty point rewards"
- - server: "added new files \"silly.dm\" and \"gardenchef.dm\""
diff --git a/html/changelogs/AutoChangeLog-pr-9681.yml b/html/changelogs/AutoChangeLog-pr-9681.yml
deleted file mode 100644
index c4c289425b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9681.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "bluespace wizard apprentice now has blink instead of targeted area teleportation"
diff --git a/html/changelogs/AutoChangeLog-pr-9683.yml b/html/changelogs/AutoChangeLog-pr-9683.yml
deleted file mode 100644
index 44f6bb1759..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9683.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Several fixes and QoL for dullahans. They can see and hear visible and audible messages now, don't need a space helmet they can't wear anyway to be space/temperature proof, can examine things through shiftclick, and, most of all, fixed their head being unpickable. Fixed dullahans gibbing when revived or had their limbs regenerated."
diff --git a/html/changelogs/AutoChangeLog-pr-9688.yml b/html/changelogs/AutoChangeLog-pr-9688.yml
deleted file mode 100644
index 29606173a4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9688.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "humans should now drop gibs when gibbed again."
- - rscadd: "synths (not to be confused with IPCs), android and corporate species, as well as robotic simple mobs, will now spawn robotic giblets instead of organic ones."
diff --git a/html/changelogs/AutoChangeLog-pr-9689.yml b/html/changelogs/AutoChangeLog-pr-9689.yml
deleted file mode 100644
index e1733d92ef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9689.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "You can't wear dakimakuras in any other inappropriate slots save for the back slot anymore, degenerates."
diff --git a/html/changelogs/AutoChangeLog-pr-9694.yml b/html/changelogs/AutoChangeLog-pr-9694.yml
deleted file mode 100644
index 6c4842e70e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9694.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "him"
-delete-after: True
-changes:
- - bugfix: "hos and aeg guns now conform to le epic taser rework standards"
diff --git a/html/changelogs/AutoChangeLog-pr-9695.yml b/html/changelogs/AutoChangeLog-pr-9695.yml
deleted file mode 100644
index 60455c2bb5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9695.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak)"
-delete-after: True
-changes:
- - rscadd: "Adds the intelliLantern, a big ol' spooky intelliCard skin"
- - rscadd: "crafting recipe for the new intelliCard skin (requires 1 pumpkin, 1 intelliCard, 5 cables and a wirecutter as a tool)"
- - tweak: "changed the intelliTater crafting recipe to match the intelliLantern recipe (but with a potato for obvious reasons)
-add:cute pai gameboy face :3"
diff --git a/html/changelogs/AutoChangeLog-pr-9696.yml b/html/changelogs/AutoChangeLog-pr-9696.yml
deleted file mode 100644
index 3188173d54..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9696.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Insert snarky remark about clock welders actually displaying the welder flame overlay when turned on now here."
diff --git a/html/changelogs/AutoChangeLog-pr-9703.yml b/html/changelogs/AutoChangeLog-pr-9703.yml
deleted file mode 100644
index 312057c2c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9703.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Emagged medibots now charcoal toxinlovers."
diff --git a/html/changelogs/AutoChangeLog-pr-9704.yml b/html/changelogs/AutoChangeLog-pr-9704.yml
deleted file mode 100644
index f4c8127241..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Minor ninja tweaks and stealth nerfs. The stealth penalty for the many combat-related actions, bumping and now teleporting/dashing or firing guns has been increased a by a third. There is now a cooldown of 5 seconds on toggling stealth as well as a slighty slowed stealth in/out animation."
diff --git a/html/changelogs/AutoChangeLog-pr-9705.yml b/html/changelogs/AutoChangeLog-pr-9705.yml
deleted file mode 100644
index c3dafc0582..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9705.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - tweak: "changed flavor text of alien tech on uplink"
diff --git a/html/changelogs/AutoChangeLog-pr-9709.yml b/html/changelogs/AutoChangeLog-pr-9709.yml
deleted file mode 100644
index 73d3164433..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9709.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "8 new cargo crates!"
- - tweak: "tablet cargo crate by -3k"
diff --git a/html/changelogs/AutoChangeLog-pr-9710.yml b/html/changelogs/AutoChangeLog-pr-9710.yml
deleted file mode 100644
index fc815f5255..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9710.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - admin: "Closes a bunch of issues"
- - server: "updates changlogs and such"
diff --git a/html/changelogs/AutoChangeLog-pr-9713.yml b/html/changelogs/AutoChangeLog-pr-9713.yml
deleted file mode 100644
index fcefecf94d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9713.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - bugfix: "fixed a catnip not having sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9715.yml b/html/changelogs/AutoChangeLog-pr-9715.yml
deleted file mode 100644
index a7cfb50426..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9715.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - imageadd: "Ported slighty better matchbox sprites from CEV-Eris, also resprited cigar boxes myself."
diff --git a/html/changelogs/AutoChangeLog-pr-9716.yml b/html/changelogs/AutoChangeLog-pr-9716.yml
deleted file mode 100644
index 704b263b50..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9716.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed abductors/abductees objectives by porting an objective code."
diff --git a/html/changelogs/AutoChangeLog-pr-9717.yml b/html/changelogs/AutoChangeLog-pr-9717.yml
deleted file mode 100644
index 7ac1988b74..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9717.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "SDGF now copies memories as well as antag data and factions."
diff --git a/html/changelogs/AutoChangeLog-pr-9720.yml b/html/changelogs/AutoChangeLog-pr-9720.yml
deleted file mode 100644
index f4c4aade36..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9720.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage"
diff --git a/html/changelogs/AutoChangeLog-pr-9723.yml b/html/changelogs/AutoChangeLog-pr-9723.yml
deleted file mode 100644
index 2952fc8273..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9723.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Riding component fix"
diff --git a/html/changelogs/AutoChangeLog-pr-9726.yml b/html/changelogs/AutoChangeLog-pr-9726.yml
deleted file mode 100644
index 9e8f3bf71e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9726.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "fixing a few runtimes on lightgeists, libido trait, rcd, one admin transformation topic, chem dispensers, glowing robotic eyes..."
diff --git a/html/changelogs/AutoChangeLog-pr-9730.yml b/html/changelogs/AutoChangeLog-pr-9730.yml
deleted file mode 100644
index 6caf95bcbc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9730.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "kinetic crushers no longer drop if you try to use it with one hand"
diff --git a/html/changelogs/AutoChangeLog-pr-9734.yml b/html/changelogs/AutoChangeLog-pr-9734.yml
deleted file mode 100644
index dd134e480c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - imageadd: "Porting CEV-eris delivery packages sprites and dunking the old syndie cybernetics box sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-9742.yml b/html/changelogs/AutoChangeLog-pr-9742.yml
deleted file mode 100644
index ef5822e959..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9742.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "GPS location on examine"
diff --git a/html/changelogs/AutoChangeLog-pr-9744.yml b/html/changelogs/AutoChangeLog-pr-9744.yml
deleted file mode 100644
index a653e77c1a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9744.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "fixed the meteor hallucination"
diff --git a/html/changelogs/AutoChangeLog-pr-9745.yml b/html/changelogs/AutoChangeLog-pr-9745.yml
deleted file mode 100644
index 95a6d943b5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9745.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Certain objects shouldn't be able to become radioactive because of a bitflag that previously was checked nowhere in the code anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-9746.yml b/html/changelogs/AutoChangeLog-pr-9746.yml
deleted file mode 100644
index e4b1c312ea..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9746.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "actioninja"
-delete-after: True
-changes:
- - bugfix: "med records no longer can eat id cards for no reason"
diff --git a/html/changelogs/AutoChangeLog-pr-9747.yml b/html/changelogs/AutoChangeLog-pr-9747.yml
new file mode 100644
index 0000000000..01caf36136
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9747.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed AI holopad speech text being small and whispers that in multiple exclamation marks echo through multiple areas."
diff --git a/html/changelogs/AutoChangeLog-pr-9749.yml b/html/changelogs/AutoChangeLog-pr-9749.yml
deleted file mode 100644
index 3113fa08c3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9749.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw and base ball bat into bulky items so they may fit"
diff --git a/html/changelogs/AutoChangeLog-pr-9764.yml b/html/changelogs/AutoChangeLog-pr-9764.yml
deleted file mode 100644
index a3ad009e81..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9764.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "AffectedArc07"
-delete-after: True
-changes:
- - code_imp: "Fixes a LOT of code edge cases"
diff --git a/html/changelogs/AutoChangeLog-pr-9765.yml b/html/changelogs/AutoChangeLog-pr-9765.yml
deleted file mode 100644
index 1cb21916cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9765.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "dapnee"
-delete-after: True
-changes:
- - bugfix: "fixed closet initialisation being broken"
- - rscdel: "emergency closets no longer have a 1% chance to delete themselves"
diff --git a/html/changelogs/AutoChangeLog-pr-9769.yml b/html/changelogs/AutoChangeLog-pr-9769.yml
deleted file mode 100644
index 2a1f92f68c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9769.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-author: "XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie)"
-delete-after: True
-changes:
- - tweak: "Holding an ID in your hands uses it instead of your worn ID for authentication purposes."
- - tweak: "If you don't have an ID in your id slot, the belt slot will be checked as well."
- - code_imp: "small cleanup to id and bounty console html generation"
- - tweak: "Hop console now hurts your eyes less. Red button text replaced with green."
- - tweak: "IDs with ID console access now go into the Confirm Identity slot by default like they used to, similarly IDs without it go into the Target slot by default again"
- - rscadd: "Can easily swap out IDs by clicking the machine or the UI fields with another ID"
- - rscadd: "ID console now names which IDs are added/removed in its visible messages"
- - rscadd: "Labels the ID slot fields when logged in so you know which is which"
- - tweak: "Can use Job Management without an ID provided the console is logged in (matches how the console now stays logged in even without an ID)"
- - tweak: "Can log in without an ID in the Target field (matches how the machine now stays logged in even after the ID is removed from the Target field)"
- - tweak: "Cleans up UI slightly (had some duplicate/conflicting buttons)"
- - bugfix: "Fixes ID console duping issues. Includes some ID containers, such as PDAs, tablets and wallets, into the swapping behavior when an ID card is being removed and the item is being held."
diff --git a/html/changelogs/AutoChangeLog-pr-9771.yml b/html/changelogs/AutoChangeLog-pr-9771.yml
deleted file mode 100644
index 55652519e4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9771.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Robustin, Subject217"
-delete-after: True
-changes:
- - balance: "The NukeOp Shuttle hull has been dramatically hardened. The walls are now \"R-Walls\" with far greater explosion resistance."
- - balance: "The NukeOp Shuttle guns have been significantly buffed. They now rapidly fire a new type of penetrator round, at a greater range, and have far greater explosion resistance."
- - balance: "The nuclear device on the NukeOp Shuttle is now in an anchored state by default, the Nuke can only be unanchored by inserting the disk and entering the proper code."
- - balance: "Non-Syndicate cyborgs are now unable to access the NukeOp Shuttle Console."
- - bugfix: "You can now unanchor Nukes even when the floor under them has been destroyed"
diff --git a/html/changelogs/AutoChangeLog-pr-9772.yml b/html/changelogs/AutoChangeLog-pr-9772.yml
deleted file mode 100644
index 675b9a9cde..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9772.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - rscadd: "Adds eight new plushies"
- - imageadd: "Adds icons for the new plushies and adds a new icon for the skylar plush"
- - imagedel: "Deleted a old, no-longer used icon for the skylar plush"
- - spellcheck: "Fixed a typo in the trilby plush"
diff --git a/html/changelogs/AutoChangeLog-pr-9773.yml b/html/changelogs/AutoChangeLog-pr-9773.yml
deleted file mode 100644
index e02fe07a37..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9773.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Added a new PDA reskin, sprites from CEV-Eris"
diff --git a/html/changelogs/AutoChangeLog-pr-9775.yml b/html/changelogs/AutoChangeLog-pr-9775.yml
deleted file mode 100644
index 07ed8efdbe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9775.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "nemvar"
-delete-after: True
-changes:
- - tweak: "The lavaland clown ruin has some new pranks ready."
- - rscadd: "Added a new loot item to the lavaland clown ruin."
- - rscdel: "Removed the slime core from said ruin."
- - balance: "The clown PDA now properly slips people on jogging move intent regardless of fatigue. Honkmother's will."
diff --git a/html/changelogs/AutoChangeLog-pr-9779.yml b/html/changelogs/AutoChangeLog-pr-9779.yml
deleted file mode 100644
index b6d1046957..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9779.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Clock cult starts with some spare vitality matrix charge scaled of the number of starter servants."
- - balance: "Made the vitality matrix sigil slighty more visible, also allowed conversion runes to heal fresh converts at the cost of some vitality charge."
- - bugfix: "Crawling won't save you from the wrath of ocular wardens and pressure sensors anymore, heretics. fix: Pressure sensors are no more triggered by floating/flying mobs."
diff --git a/html/changelogs/AutoChangeLog-pr-9780.yml b/html/changelogs/AutoChangeLog-pr-9780.yml
deleted file mode 100644
index b014218fbc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9780.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "The Big Red Button now sets bomb timers to 2 seconds, instead of 5."
diff --git a/html/changelogs/AutoChangeLog-pr-9781.yml b/html/changelogs/AutoChangeLog-pr-9781.yml
deleted file mode 100644
index c8e73b3b9d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9781.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "Gloves of the North Star (not Hugs of the North Star) now use all their intents very, very fast. This does not apply to grabs' click cooldown, nor shoving people."
diff --git a/html/changelogs/AutoChangeLog-pr-9782.yml b/html/changelogs/AutoChangeLog-pr-9782.yml
deleted file mode 100644
index f29da71edc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9782.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Strawberry milk and tea have sprites now."
diff --git a/html/changelogs/AutoChangeLog-pr-9783.yml b/html/changelogs/AutoChangeLog-pr-9783.yml
deleted file mode 100644
index 0362b582f6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9783.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed the Aux base camera door settings and toggle window type actions. Also enabling the user to modify both door access and type."
diff --git a/html/changelogs/AutoChangeLog-pr-9785.yml b/html/changelogs/AutoChangeLog-pr-9785.yml
deleted file mode 100644
index 17d4f5325b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9785.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - imageadd: "Improved the two grayscale towel item sprites a little."
- - bugfix: "Fixed towels onmob suit overlays. Again."
diff --git a/html/changelogs/AutoChangeLog-pr-9786.yml b/html/changelogs/AutoChangeLog-pr-9786.yml
deleted file mode 100644
index f8b69521cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9786.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - spellcheck: "Fixed some reagents taste descriptions."
diff --git a/html/changelogs/AutoChangeLog-pr-9788.yml b/html/changelogs/AutoChangeLog-pr-9788.yml
deleted file mode 100644
index 503f3dbb0e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9788.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - tweak: "tweaked the way the tapered penis looks"
diff --git a/html/changelogs/AutoChangeLog-pr-9790.yml b/html/changelogs/AutoChangeLog-pr-9790.yml
deleted file mode 100644
index 4f243774c4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9790.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "PersianXerxes"
-delete-after: True
-changes:
- - tweak: "Reduces the grace period for meteors from a minimum of 5 and maximum of 10 to 3 and 6 minutes respectively."
diff --git a/html/changelogs/AutoChangeLog-pr-9791.yml b/html/changelogs/AutoChangeLog-pr-9791.yml
deleted file mode 100644
index 587fbce481..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9791.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - imageadd: "added TG's icons for traitor, russian, and golden revolver"
diff --git a/html/changelogs/AutoChangeLog-pr-9797.yml b/html/changelogs/AutoChangeLog-pr-9797.yml
deleted file mode 100644
index eb50cb7254..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9797.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "PersianXerxes"
-delete-after: True
-changes:
- - rscadd: "Adds a pair of VR sleepers to Box Station's permabrig"
- - rscadd: "Adds a pair of VR sleepers to Delta Station's permabrig"
- - rscadd: "Adds a pair of VR sleepers to Pubby Station's permabrig"
- - rscadd: "Adds a pair of VR sleepers to Meta Station's permabrig"
diff --git a/html/changelogs/AutoChangeLog-pr-9800.yml b/html/changelogs/AutoChangeLog-pr-9800.yml
deleted file mode 100644
index 244518bd40..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9800.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - server: "changes header to be more cit-like"
diff --git a/html/changelogs/AutoChangeLog-pr-9801.yml b/html/changelogs/AutoChangeLog-pr-9801.yml
deleted file mode 100644
index 986f271fd8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9801.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed hidden random event reports only priting a paper message without sending the message to the consoles' message list."
diff --git a/html/changelogs/AutoChangeLog-pr-9802.yml b/html/changelogs/AutoChangeLog-pr-9802.yml
deleted file mode 100644
index 183515f5f1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9802.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Rosary beads prayer now works on non-carbon mobs too, and won't break when performed on a monkey or other humanoids."
- - tweak: "You can flagellate people with rosary beads on harm intent. It's even mediocrer than the sord though."
diff --git a/html/changelogs/AutoChangeLog-pr-9803.yml b/html/changelogs/AutoChangeLog-pr-9803.yml
deleted file mode 100644
index cd81b52620..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9803.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Jerry Derpington, baldest of the balds, and nemvar."
-delete-after: True
-changes:
- - rscdel: "Nanotrasen has lost communication to two away mission sites that contained a beach for Nanotrasen employees."
- - rscadd: "Nanotrasen has been able to locate a new away mission site that ALSO has a beach. Nanotrasen employees will be able to enjoy the beach after all!"
- - rscadd: "Seashells have been added to the game."
diff --git a/html/changelogs/AutoChangeLog-pr-9812.yml b/html/changelogs/AutoChangeLog-pr-9812.yml
deleted file mode 100644
index d669d20343..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9812.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed missing delivery packages sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9813.yml b/html/changelogs/AutoChangeLog-pr-9813.yml
deleted file mode 100644
index fbf1c6f022..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9813.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - tweak: "Ghosts can now see active AI cameras."
diff --git a/html/changelogs/AutoChangeLog-pr-9814.yml b/html/changelogs/AutoChangeLog-pr-9814.yml
deleted file mode 100644
index 6e806b8860..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9814.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - config: "added multi_keyed_list, delimiter defaults to |."
diff --git a/html/changelogs/AutoChangeLog-pr-9816.yml b/html/changelogs/AutoChangeLog-pr-9816.yml
deleted file mode 100644
index 512d60e7eb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9816.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Swindly"
-delete-after: True
-changes:
- - bugfix: "Fixed MMIs not being able to use mecha equipment"
- - bugfix: "Fixed MMIs not getting mecha mouse pointers"
- - bugfix: "Fixed MMIs not getting medical HUDs in Odysseuses"
- - tweak: "Brains can now switch to harm intent"
diff --git a/html/changelogs/AutoChangeLog-pr-9818.yml b/html/changelogs/AutoChangeLog-pr-9818.yml
deleted file mode 100644
index 44222d2359..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9818.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "GrayRachnid"
-delete-after: True
-changes:
- - rscadd: "Added saboteur syndicate engiborg"
- - tweak: "changed cyborg tool icons and the secborg taser/laser icons."
diff --git a/html/changelogs/AutoChangeLog-pr-9822.yml b/html/changelogs/AutoChangeLog-pr-9822.yml
deleted file mode 100644
index 425a667086..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9822.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Summon events now properly costs threat."
- - bugfix: "Refunded spells refund threat, too."
- - refactor: "Made wizard spells inherently have a requirement and cost."
diff --git a/html/changelogs/AutoChangeLog-pr-9823.yml b/html/changelogs/AutoChangeLog-pr-9823.yml
deleted file mode 100644
index 3408f04171..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9823.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "Added nine winter coats"
- - imageadd: "added images for the winter coats"
- - tweak: "adds the mining winter coat to mining wardrobes and mining lockers"
diff --git a/html/changelogs/AutoChangeLog-pr-9828.yml b/html/changelogs/AutoChangeLog-pr-9828.yml
deleted file mode 100644
index 53dbebba28..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9828.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Meteor wave is no longer repeatable in dynamic."
diff --git a/html/changelogs/AutoChangeLog-pr-9831.yml b/html/changelogs/AutoChangeLog-pr-9831.yml
deleted file mode 100644
index 569fd14f69..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9831.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "tweaked nuke ops"
diff --git a/html/changelogs/AutoChangeLog-pr-9835.yml b/html/changelogs/AutoChangeLog-pr-9835.yml
deleted file mode 100644
index 675eedef02..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9835.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ty-the-Smonk"
-delete-after: True
-changes:
- - bugfix: "You can now interact with self sustaining crossbreeds"
diff --git a/html/changelogs/AutoChangeLog-pr-9837.yml b/html/changelogs/AutoChangeLog-pr-9837.yml
deleted file mode 100644
index a20d04effc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9837.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - bugfix: "Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot would be less prone to igniting"
diff --git a/html/changelogs/AutoChangeLog-pr-9838.yml b/html/changelogs/AutoChangeLog-pr-9838.yml
deleted file mode 100644
index 5a99c27abe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9838.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "actioninja"
-delete-after: True
-changes:
- - bugfix: "Chat is properly sent to legacy window if goonchat fails to load again."
diff --git a/html/changelogs/AutoChangeLog-pr-9842.yml b/html/changelogs/AutoChangeLog-pr-9842.yml
deleted file mode 100644
index d816911560..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9842.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Anonymous"
-delete-after: True
-changes:
- - tweak: "Renamed loadout name appropriately (ASSU -> DAB)"
diff --git a/html/changelogs/AutoChangeLog-pr-9846.yml b/html/changelogs/AutoChangeLog-pr-9846.yml
deleted file mode 100644
index d3721b6c32..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9846.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "KathrinBailey"
-delete-after: True
-changes:
- - rscadd: "Ports TG's pews https://github.com/tgstation/tgstation/pull/42712"
- - rscadd: "The first step of a corporate incursion of Space IKEA into Nanotrasen."
diff --git a/html/changelogs/AutoChangeLog-pr-9850.yml b/html/changelogs/AutoChangeLog-pr-9850.yml
deleted file mode 100644
index f6aee261a4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9850.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "fixed a few minor issues with console frames building."
diff --git a/html/changelogs/AutoChangeLog-pr-9852.yml b/html/changelogs/AutoChangeLog-pr-9852.yml
deleted file mode 100644
index 4a17480992..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9852.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Wizards can use the teleport spell from their den once again."
- - tweak: "Wizards will now receive feedback messages when attempting to cast teleport or use the warp whistle while in a no-teleport area."
diff --git a/html/changelogs/AutoChangeLog-pr-9853.yml b/html/changelogs/AutoChangeLog-pr-9853.yml
deleted file mode 100644
index f752f6bf16..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9853.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "New clockwork cultist, gondola, monkey and securitron cardboard cutouts."
diff --git a/html/changelogs/AutoChangeLog-pr-9858.yml b/html/changelogs/AutoChangeLog-pr-9858.yml
deleted file mode 100644
index c211cd5962..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9858.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed aliens gasping randomly once in a while."
diff --git a/html/changelogs/AutoChangeLog-pr-9864.yml b/html/changelogs/AutoChangeLog-pr-9864.yml
deleted file mode 100644
index ff1f4f6508..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9864.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Knouli"
-delete-after: True
-changes:
- - rscadd: "attack_self proc for the legion core which triggers a self-heal al la the previous 'afterattack' proc, as if clicking on the character's own sprite to self-heal"
- - rscadd: "admin logging for all three use cases of legion core healing - afterattack, attack_self, and implanted ui_action_click"
diff --git a/html/changelogs/AutoChangeLog-pr-9865.yml b/html/changelogs/AutoChangeLog-pr-9865.yml
deleted file mode 100644
index 6bef9d6b5b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9865.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Useroth"
-delete-after: True
-changes:
- - bugfix: "numbered storages now are sorted in a consistent way, instead of depending on ordering of their contents var"
diff --git a/html/changelogs/AutoChangeLog-pr-9866.yml b/html/changelogs/AutoChangeLog-pr-9866.yml
deleted file mode 100644
index 1e6e8d0e88..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9866.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Useroth"
-delete-after: True
-changes:
- - rscadd: "strange seeds as a buyable traitor botanist item"
diff --git a/html/changelogs/AutoChangeLog-pr-9867.yml b/html/changelogs/AutoChangeLog-pr-9867.yml
deleted file mode 100644
index 4333d5eb73..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9867.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Naksu, ShizCalev"
-delete-after: True
-changes:
- - refactor: "Refactored examine-code"
- - bugfix: "Examining a human with a burned prosthetic limb will no longer tell you that the limb is blistered."
- - tweak: "Items will now inform you if they are resistant to frost, fire, acid, and lava when examined."
diff --git a/html/changelogs/AutoChangeLog-pr-9868.yml b/html/changelogs/AutoChangeLog-pr-9868.yml
deleted file mode 100644
index 18c4388dcd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9868.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "fixed superlube waterflower, my bad."
diff --git a/html/changelogs/AutoChangeLog-pr-9869.yml b/html/changelogs/AutoChangeLog-pr-9869.yml
deleted file mode 100644
index ecb3ac6cb7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9869.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The seedvault/alien plant DNA manipulator can now be printed off with Alien Biotechnology."
diff --git a/html/changelogs/AutoChangeLog-pr-9871.yml b/html/changelogs/AutoChangeLog-pr-9871.yml
deleted file mode 100644
index 3940d256c2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9871.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "dzahlus"
-delete-after: True
-changes:
- - soundadd: "added a new gun sounds"
- - sounddel: "removed an old gun sounds"
diff --git a/html/changelogs/AutoChangeLog-pr-9873.yml b/html/changelogs/AutoChangeLog-pr-9873.yml
deleted file mode 100644
index b0568bad14..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9873.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed closing the aux base construction RCD's door access settings window throwing you out of camera mode when closed."
- - rscdel: "Removed not functional aux base RCD's door type menu. Use airlock painters, maybe."
diff --git a/html/changelogs/AutoChangeLog-pr-9874.yml b/html/changelogs/AutoChangeLog-pr-9874.yml
deleted file mode 100644
index 2e932c458b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9874.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Honkbot oil spills are of the slippery kind now. Honk."
diff --git a/html/changelogs/AutoChangeLog-pr-9875.yml b/html/changelogs/AutoChangeLog-pr-9875.yml
deleted file mode 100644
index 4e14a561e7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9875.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - bugfix: "From-ghosts dynamic rulesets now actually listen to \"required candidates\""
diff --git a/html/changelogs/AutoChangeLog-pr-9876.yml b/html/changelogs/AutoChangeLog-pr-9876.yml
deleted file mode 100644
index 4bc0a19954..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9876.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - imageadd: "local code scavenger finds forgotten slighty improved apc sprites left buried in old dusty folders."
diff --git a/html/changelogs/AutoChangeLog-pr-9877.yml b/html/changelogs/AutoChangeLog-pr-9877.yml
deleted file mode 100644
index c84cb7aa92..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9877.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Seven old and otherwordly pAI holochassis icons have crawled their way out of the modular citadel catacombs."
diff --git a/html/changelogs/AutoChangeLog-pr-9880.yml b/html/changelogs/AutoChangeLog-pr-9880.yml
deleted file mode 100644
index 0f9dfa58f3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9880.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - bugfix: "Every dynamic-triggered event is now blacklisted from being triggered by the random events system when dynamic can trigger them."
diff --git a/html/changelogs/AutoChangeLog-pr-9881.yml b/html/changelogs/AutoChangeLog-pr-9881.yml
deleted file mode 100644
index 3ff9081e66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9881.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - rscadd: "Dynamic voting now features extended, if recent rounds have been chaotic."
diff --git a/html/changelogs/AutoChangeLog-pr-9882.yml b/html/changelogs/AutoChangeLog-pr-9882.yml
deleted file mode 100644
index 581149a51f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9882.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fermis"
-delete-after: True
-changes:
- - refactor: "refactored sleepers!"
diff --git a/html/changelogs/AutoChangeLog-pr-9886.yml b/html/changelogs/AutoChangeLog-pr-9886.yml
deleted file mode 100644
index 64c011e37c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9886.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "chem dispenser beakers end up in your hand yet again."
- - bugfix: "Bikehorns squeak yet again, the world is safe."
diff --git a/html/changelogs/AutoChangeLog-pr-9887.yml b/html/changelogs/AutoChangeLog-pr-9887.yml
deleted file mode 100644
index c76016575b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9887.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Fox McCloud, Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixes being able to mech-punch other mobs, as a pacifist"
- - bugfix: "Fixes being able to hurt people, as a pacifist, by throwing them into a wall or other mob, or by using most martial arts (save for the unpredictable psychotic brawl, and the stamina-damage-only boxing)."
- - balance: "Buffs boxing to outdamage natural stamina regeneration. Made the chance of outright missing your opponent actually possible."
- - tweak: "Pacifists can now engage in the (laughably not harmful) sweet sweet art of boxing now."
diff --git a/html/changelogs/AutoChangeLog-pr-9889.yml b/html/changelogs/AutoChangeLog-pr-9889.yml
deleted file mode 100644
index 68094bd33d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9889.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "GrayRachnid"
-delete-after: True
-changes:
- - bugfix: "Fixes golden toolbox missing inhand sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-9891.yml b/html/changelogs/AutoChangeLog-pr-9891.yml
deleted file mode 100644
index 105749ea29..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9891.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - tweak: "Roundstart rulesets now scale on population ready rather than total population."
diff --git a/html/changelogs/AutoChangeLog-pr-9893.yml b/html/changelogs/AutoChangeLog-pr-9893.yml
deleted file mode 100644
index 157602a3b8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9893.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - bugfix: "Threat log now accurately represents what actually used the threat."
- - tweak: "Verbose threat log (admin-only) now shows ALL threat level changes."
diff --git a/html/changelogs/AutoChangeLog-pr-9895.yml b/html/changelogs/AutoChangeLog-pr-9895.yml
deleted file mode 100644
index 213e7cdb73..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9895.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Fermis"
-delete-after: True
-changes:
- - rscadd: "Organ fridges to all maps near surgery with a random sensible organ, steralizine and synthtissue."
- - tweak: "the med hand scanner to be less of a mishmash of random things"
- - rscadd: "a little icon to the HUD if someone's heart has failed."
- - tweak: "Lets neurine's brain splash attack work via syringe."
- - rscadd: "a new surgery; Emergency Cardioversion Induction for use on the recently deceased"
- - tweak: "Synthtissue to be less demanding on growth size for organ regeneration and improves clarify of it's growth gated effects."
- - tweak: "Synthtissue now is more useful than synthflesh on the dead"
diff --git a/html/changelogs/AutoChangeLog-pr-9896.yml b/html/changelogs/AutoChangeLog-pr-9896.yml
deleted file mode 100644
index 378129d227..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9896.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Cyborgs can now actually use cameras from a distance."
diff --git a/html/changelogs/AutoChangeLog-pr-9898.yml b/html/changelogs/AutoChangeLog-pr-9898.yml
deleted file mode 100644
index 002e3b544d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9898.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Suicides are yet again painful and instant and won't throw people in deep crit from full health."
diff --git a/html/changelogs/AutoChangeLog-pr-9902.yml b/html/changelogs/AutoChangeLog-pr-9902.yml
deleted file mode 100644
index 9a9d7f4597..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9902.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Useroth"
-delete-after: True
-changes:
- - rscadd: "A bunch of newer tg plants"
- - rscadd: "A bunch of newer tg plant traits"
- - rscadd: "A couple of newer tg plant reagents"
diff --git a/html/changelogs/AutoChangeLog-pr-9903.yml b/html/changelogs/AutoChangeLog-pr-9903.yml
new file mode 100644
index 0000000000..0c21b30fd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9903.yml
@@ -0,0 +1,4 @@
+author: "PersianXerxes"
+delete-after: True
+changes:
+ - rscdel: "Removed night vision quirk"
diff --git a/html/changelogs/AutoChangeLog-pr-9906.yml b/html/changelogs/AutoChangeLog-pr-9906.yml
deleted file mode 100644
index 67c5c20b58..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9906.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xantholne"
-delete-after: True
-changes:
- - rscadd: "New Berets for most heads and departments available in their autodrobes or lockers"
diff --git a/html/changelogs/AutoChangeLog-pr-9907.yml b/html/changelogs/AutoChangeLog-pr-9907.yml
deleted file mode 100644
index 6bd27c6e50..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9907.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - bugfix: "VR mobs can no longer be dynamic midround antags."
diff --git a/html/changelogs/AutoChangeLog-pr-9908.yml b/html/changelogs/AutoChangeLog-pr-9908.yml
deleted file mode 100644
index fb0ae06238..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9908.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "fixed rogue pixels on the energy gu- ahem blaster carbine... and a few apc lights states being neigh-indistinguishable."
diff --git a/html/changelogs/AutoChangeLog-pr-9909.yml b/html/changelogs/AutoChangeLog-pr-9909.yml
deleted file mode 100644
index 7cfb6ce5b2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9909.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "kiwedespars"
-delete-after: True
-changes:
- - rscdel: "removed moth fluff coloring you like your wings"
- - balance: "made insect not so bad."
diff --git a/html/changelogs/AutoChangeLog-pr-9915.yml b/html/changelogs/AutoChangeLog-pr-9915.yml
deleted file mode 100644
index 652a942d13..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9915.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "leg wraps and sweaters to clothesmate"
- - rscadd: "screwdriver and cable coil to janidrobe"
- - rscadd: "screwdriver and cable coil to janibelt whitelist (for fixing/placing light fixtures)"
- - rscadd: "monkey cube, syringe, enzyme, soy sauce, and cryoxadone to chef's vendor (contraband and premium)"
- - rscadd: "add cracker, beans, honey bars, lollipops, chocolate coin, and spider lollipop to snack vendors (contraband and premium)"
- - rscadd: "newspaper to loadout menu for bapping purposes"
- - rscdel: "removed poppy pretzels from snack vendor premium"
- - rscadd: "maid uniform (janimaid alt) to kinkmate."
- - tweak: "moves gear harness from premium to normal stock in kinkmate"
- - balance: "re-balanced metal shield bounty"
- - rscadd: "cryoxadone bottle (for use in chef vendor)"
diff --git a/html/changelogs/AutoChangeLog-pr-9920.yml b/html/changelogs/AutoChangeLog-pr-9920.yml
deleted file mode 100644
index 68e336f042..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9920.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "YakumoChen"
-delete-after: True
-changes:
- - imageadd: "New AI Holograms and Displays! Ported from /vg/station."
diff --git a/html/changelogs/AutoChangeLog-pr-9922.yml b/html/changelogs/AutoChangeLog-pr-9922.yml
deleted file mode 100644
index 3c293c742c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9922.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "GrayRachnid"
-delete-after: True
-changes:
- - rscadd: "Added traumas"
- - rscadd: "Added science powergame tool"
- - tweak: "a few hearing args"
diff --git a/html/changelogs/AutoChangeLog-pr-9941.yml b/html/changelogs/AutoChangeLog-pr-9941.yml
deleted file mode 100644
index f7f011f38e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9941.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam"
-delete-after: True
-changes:
- - bugfix: "Personal closets can use anything that holds an ID card now."
diff --git a/html/changelogs/AutoChangeLog-pr-9942.yml b/html/changelogs/AutoChangeLog-pr-9942.yml
deleted file mode 100644
index 3b6925289b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9942.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Useroth"
-delete-after: True
-changes:
- - bugfix: "the new plants now properly get their reagents and reagent genes instead of being empty with UNKNOWN reagents listed in the DNA machine"
diff --git a/html/changelogs/AutoChangeLog-pr-9943.yml b/html/changelogs/AutoChangeLog-pr-9943.yml
deleted file mode 100644
index 8164ff2701..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9943.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "dapnee"
-delete-after: True
-changes:
- - bugfix: "Communications console window no longer updates, won't steal focus anymore."
- - bugfix: "Trimline neutral end exists now."
diff --git a/html/changelogs/AutoChangeLog-pr-9946.yml b/html/changelogs/AutoChangeLog-pr-9946.yml
deleted file mode 100644
index e045c5006f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9946.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Light pink extracts no longer speed you up. Instead, they give stamina regeneration and free sprinting."
diff --git a/html/changelogs/AutoChangeLog-pr-9948.yml b/html/changelogs/AutoChangeLog-pr-9948.yml
deleted file mode 100644
index 4f337660be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9948.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Morgues' original alert beeping sound has been restored, they no longer go \"ammunition depleted\""
diff --git a/html/changelogs/AutoChangeLog-pr-9957.yml b/html/changelogs/AutoChangeLog-pr-9957.yml
deleted file mode 100644
index 234fecdf79..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9957.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed missing hypereutactic left inhand sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9959.yml b/html/changelogs/AutoChangeLog-pr-9959.yml
deleted file mode 100644
index e222659096..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9959.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Dying, ghosting, having your mind / ckey transferred to another mob, going softcrit or otherwise unconscious now properly turn off combat mode."
- - bugfix: "combat mode can't be toggled on while non fully conscious anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-9960.yml b/html/changelogs/AutoChangeLog-pr-9960.yml
deleted file mode 100644
index d6701d7eb4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9960.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Krysonism, Ghommie"
-delete-after: True
-changes:
- - rscadd: "NT has made breakthroughs in ice cream science, ice creams can now be flavoured with any reagent!"
- - tweak: "The ice cream vat now accepts beakers."
- - bugfix: "Grape and Peach icecreams have scoop overlays yet again."
diff --git a/html/changelogs/AutoChangeLog-pr-9962.yml b/html/changelogs/AutoChangeLog-pr-9962.yml
deleted file mode 100644
index d1ac38193f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9962.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed limbs' set_disabled NOT dropping your held items, updating your hand slot inventory screen image, prompting chat messages and making your character scream like a sissy."
diff --git a/html/changelogs/AutoChangeLog-pr-9964.yml b/html/changelogs/AutoChangeLog-pr-9964.yml
deleted file mode 100644
index 76687969ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9964.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "GrayRachnid"
-delete-after: True
-changes:
- - bugfix: "fixed my mistakes"
diff --git a/html/changelogs/AutoChangeLog-pr-9965.yml b/html/changelogs/AutoChangeLog-pr-9965.yml
deleted file mode 100644
index 6a7562aa46..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9965.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "GrayRachnid"
-delete-after: True
-changes:
- - tweak: "tweaked the number of ingredients/pancakes you can stack."
diff --git a/html/changelogs/AutoChangeLog-pr-9966.yml b/html/changelogs/AutoChangeLog-pr-9966.yml
deleted file mode 100644
index 2b4a027949..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9966.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Lusty xenomoprh maids will now actually clean tiles they travel onto yet again."
diff --git a/html/changelogs/AutoChangeLog-pr-9967.yml b/html/changelogs/AutoChangeLog-pr-9967.yml
deleted file mode 100644
index 8d9448d290..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9967.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Mickyy5"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen are now issuing Plasmamen with plasma in their survival boxes"
diff --git a/html/changelogs/AutoChangeLog-pr-9969.yml b/html/changelogs/AutoChangeLog-pr-9969.yml
deleted file mode 100644
index 2aac34acd4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9969.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Linzolle"
-delete-after: True
-changes:
- - tweak: "hat tossing can no longer knock hats off"
diff --git a/html/changelogs/AutoChangeLog-pr-9972.yml b/html/changelogs/AutoChangeLog-pr-9972.yml
deleted file mode 100644
index ab9047a1ce..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9972.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed double whitespace gap in human and AI examine. Fixed single whitespace in carbon examine."
diff --git a/html/changelogs/AutoChangeLog-pr-9976.yml b/html/changelogs/AutoChangeLog-pr-9976.yml
deleted file mode 100644
index 3db57e2c5a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9976.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Coconutwarrior97"
-delete-after: True
-changes:
- - bugfix: "Can only wrench down two transit tubes per turf."
diff --git a/html/changelogs/AutoChangeLog-pr-9977.yml b/html/changelogs/AutoChangeLog-pr-9977.yml
deleted file mode 100644
index 8a4d2dc304..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9977.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Useroth"
-delete-after: True
-changes:
- - rscadd: "extradimensional oranges now contain haloperidol"
- - bugfix: "extradimensional oranges now actually grow properly and give proper seeds."
diff --git a/html/changelogs/AutoChangeLog-pr-9980.yml b/html/changelogs/AutoChangeLog-pr-9980.yml
deleted file mode 100644
index b5deb45f2d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9980.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Tetr4"
-delete-after: True
-changes:
- - bugfix: "Turning a tile with gas effects into space now gets rid of the effects."
diff --git a/html/changelogs/AutoChangeLog-pr-9981.yml b/html/changelogs/AutoChangeLog-pr-9981.yml
deleted file mode 100644
index cd7957df0f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9981.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "You can no longer estimate the amount of reagents found inside a damp rag."
- - tweak: "You can now squeeze a rag's reagents into another open container, as long as the other one is not full."
diff --git a/html/changelogs/AutoChangeLog-pr-9983.yml b/html/changelogs/AutoChangeLog-pr-9983.yml
new file mode 100644
index 0000000000..b8cd4f0f5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9983.yml
@@ -0,0 +1,6 @@
+author: "Ghommie, Skogol"
+delete-after: True
+changes:
+ - refactor: "refactored altclick interaction to allow alt-click interactable objects to parent call without forcing the turf contents stat menu open."
+ - tweak: "Alt clicking will no longer show turf contents for items inside bags etc."
+ - tweak: "Alt clicking the source of your turf contents stat menu will now close said menu."
diff --git a/html/changelogs/AutoChangeLog-pr-9988.yml b/html/changelogs/AutoChangeLog-pr-9988.yml
deleted file mode 100644
index 7fb1c5c6d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9988.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed ED-209 being unbuildable past the welding step."
diff --git a/html/changelogs/AutoChangeLog-pr-9989.yml b/html/changelogs/AutoChangeLog-pr-9989.yml
deleted file mode 100644
index 6e19e7eb5e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9989.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Fixed a couple of laser / energy guns never switching to the empty icon despite being unable to fire."
diff --git a/html/changelogs/AutoChangeLog-pr-9992.yml b/html/changelogs/AutoChangeLog-pr-9992.yml
deleted file mode 100644
index fb59893d34..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9992.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed ai displays status being reset to \"Neutral\" on login, regardless of choice."
diff --git a/html/changelogs/AutoChangeLog-pr-9996.yml b/html/changelogs/AutoChangeLog-pr-9996.yml
deleted file mode 100644
index 1562cfd766..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9996.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed tinfoil hats giving random traumas."
diff --git a/html/create_object.html b/html/create_object.html
index 3609e46916..461dd37383 100644
--- a/html/create_object.html
+++ b/html/create_object.html
@@ -40,6 +40,7 @@
Where:
@@ -105,4 +106,4 @@