From 1133e9051734a257ebfb8e58674309c81ffc442f Mon Sep 17 00:00:00 2001
From: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Date: Wed, 15 May 2024 11:06:30 -0500
Subject: [PATCH 001/498] Shift-clicking an offer for an item will examine the
item (#83180)
## About The Pull Request
- When you are offered an item, you can shift-click the alert to examine
the item in the person's hands.
- Plus screen tips for offers.
- Plus examine boxing alert examine text.

## Why It's Good For The Game
Simple thing. I figure people can get use out of it by, say, presenting
their ID for inspection, holding a paper out for someone to read,
checking how much ammo is in a gun someone hands you, etc etc.
## Changelog
:cl: Melbert
qol: When you are offered something, you can shift-click the alert to
examine the item rather than take it.
qol: Examine blocks for screen alert examining.
qol: Screentips for offer alerts.
/:cl:
---
code/_onclick/hud/alert.dm | 39 ++++++++++++++++++++++++++++++++++++--
1 file changed, 37 insertions(+), 2 deletions(-)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index ac10680db27bc..2cfa8147c490f 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -301,12 +301,25 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/// The offer we're linked to, yes this is suspiciously like a status effect alert
var/datum/status_effect/offering/offer
/// Additional text displayed in the description of the alert.
- var/additional_desc_text = "Click this alert to take it."
+ var/additional_desc_text = "Click this alert to take it, or shift click it to examiante it."
+ /// Text to override what appears in screentips for the alert
+ var/screentip_override_text
+ /// Whether the offered item can be examined by shift-clicking the alert
+ var/examinable = TRUE
+
+/atom/movable/screen/alert/give/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ register_context()
/atom/movable/screen/alert/give/Destroy()
offer = null
return ..()
+/atom/movable/screen/alert/give/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ context[SCREENTIP_CONTEXT_LMB] = screentip_override_text || "Take [offer.offered_item.name]"
+ context[SCREENTIP_CONTEXT_SHIFT_LMB] = "Examine"
+ return CONTEXTUAL_SCREENTIP_SET
+
/**
* Handles assigning most of the variables for the alert that pops up when an item is offered
*
@@ -357,6 +370,16 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
handle_transfer()
+/atom/movable/screen/alert/give/examine(mob/user)
+ if(!examinable)
+ return ..()
+
+ return list(
+ span_boldnotice(name),
+ span_info("[offer.owner] is offering you the following item (click the alert to take it!):"),
+ "
[jointext(offer.offered_item.examine(user), "\n")]",
+ )
+
/// An overrideable proc used simply to hand over the item when claimed, this is a proc so that high-fives can override them since nothing is actually transferred
/atom/movable/screen/alert/give/proc/handle_transfer()
var/mob/living/carbon/taker = owner
@@ -367,6 +390,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/atom/movable/screen/alert/give/highfive
additional_desc_text = "Click this alert to slap it."
+ screentip_override_text = "High Five"
+ examinable = FALSE
/// Tracks active "to slow"ing so we can't spam click
var/too_slowing_this_guy = FALSE
@@ -425,6 +450,10 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
if(QDELETED(offer.offered_item))
examine_list += span_warning("[source]'s arm appears tensed up, as if [source.p_they()] plan on pulling it back suddenly...")
+/atom/movable/screen/alert/give/hand
+ screentip_override_text = "Take Hand"
+ examinable = FALSE
+
/atom/movable/screen/alert/give/hand/get_receiving_name(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving)
additional_desc_text = "Click this alert to take it and let [offerer.p_them()] pull you around!"
return "[offerer.p_their()] [receiving.name]"
@@ -1057,7 +1086,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
return FALSE
var/list/modifiers = params2list(params)
if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat
- to_chat(usr, span_boldnotice("[name] - [desc]"))
+ to_chat(usr, examine_block(jointext(examine(usr), "\n")))
return FALSE
var/datum/our_master = master_ref?.resolve()
if(our_master && click_master)
@@ -1071,3 +1100,9 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
master_ref = null
owner = null
screen_loc = ""
+
+/atom/movable/screen/alert/examine(mob/user)
+ return list(
+ span_boldnotice(name),
+ span_info(desc),
+ )
From e12e3dfca19130ef604595de7020b568fefdc1f4 Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 04:06:56 +1200
Subject: [PATCH 002/498] Automatic changelog for PR #83180 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83180.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83180.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83180.yml b/html/changelogs/AutoChangeLog-pr-83180.yml
new file mode 100644
index 0000000000000..7a1e7732ac064
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83180.yml
@@ -0,0 +1,6 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - qol: "When you are offered something, you can shift-click the alert to examine the item rather than take it."
+ - qol: "Examine blocks for screen alert examining."
+ - qol: "Screentips for offer alerts."
\ No newline at end of file
From b5f6b04fe81e8523c18e8ae3ab0355d9db8385c4 Mon Sep 17 00:00:00 2001
From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Date: Wed, 15 May 2024 20:53:12 +0300
Subject: [PATCH 003/498] parrots try to immitate voices (#82773)
## About The Pull Request
whenever parrots repeat lines they will try to mimic the speaker's
voice. it wont sound exact but theyre trying their best
## Why It's Good For The Game
adds more detail and character to the line repeating feature
## Changelog
:cl:
add: parrots will now try to immitate the speaker's voice
/:cl:
---
code/datums/components/listen_and_repeat.dm | 43 ++++++++++++++++---
.../pets/parrot/parrot_ai/parroting_action.dm | 36 +++++++++++-----
2 files changed, 63 insertions(+), 16 deletions(-)
diff --git a/code/datums/components/listen_and_repeat.dm b/code/datums/components/listen_and_repeat.dm
index 93d2dde93f006..0ebeda27b3f69 100644
--- a/code/datums/components/listen_and_repeat.dm
+++ b/code/datums/components/listen_and_repeat.dm
@@ -2,12 +2,16 @@
#define MAX_SPEECH_BUFFER_SIZE 500
/// Tendency we have to ignore radio chatter
#define RADIO_IGNORE_CHANCE 10
+/// The line we will re-iterate
+#define MESSAGE_LINE "line"
+/// the tts voice it should be said in
+#define MESSAGE_VOICE "voice"
+/// the tone it should be said in
+#define MESSAGE_PITCH "pitch"
/// Simple element that will deterministically set a value based on stuff that the source has heard and will then compel the source to repeat it.
/// Requires a valid AI Blackboard.
/datum/component/listen_and_repeat
- /// List of things that we start out having in our speech buffer
- var/list/desired_phrases = null
/// The AI Blackboard Key we assign the value to.
var/blackboard_key = null
/// Probability we speak
@@ -16,14 +20,22 @@
var/switch_phrase_probability = null
/// List of things that we've heard and will repeat.
var/list/speech_buffer = null
+ /// list we give speech that doesnt have a voice or a pitch
+ var/static/list/invalid_voice = list(
+ MESSAGE_VOICE = "invalid",
+ MESSAGE_PITCH = 0,
+ )
/datum/component/listen_and_repeat/Initialize(list/desired_phrases, blackboard_key)
. = ..()
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
- if(!isnull(desired_phrases))
- LAZYADD(speech_buffer, desired_phrases)
+ for(var/speech in desired_phrases)
+ if(!islist(desired_phrases[speech]) || !desired_phrases[speech][MESSAGE_VOICE] || !desired_phrases[speech][MESSAGE_PITCH])
+ LAZYSET(speech_buffer, speech, invalid_voice)
+ continue
+ LAZYSET(speech_buffer, speech, desired_phrases[speech])
src.blackboard_key = blackboard_key
@@ -47,6 +59,16 @@
if(speaker == source) // don't parrot ourselves
return
+ var/list/speaker_sound
+
+ if(!SStts.tts_enabled || !ismovable(speaker))
+ speaker_sound = invalid_voice
+ else
+ speaker_sound = list()
+ var/atom/movable/movable_speaker = speaker
+ speaker_sound[MESSAGE_VOICE] = movable_speaker.voice || "invalid"
+ speaker_sound[MESSAGE_PITCH] = (movable_speaker.pitch && SStts.pitch_enabled ? movable_speaker.pitch : 0)
+
if(over_radio && prob(RADIO_IGNORE_CHANCE))
return
@@ -55,7 +77,7 @@
for(var/i in 1 to number_of_excess_strings)
LAZYREMOVE(speech_buffer, pick(speech_buffer))
- LAZYOR(speech_buffer, html_decode(message))
+ LAZYSET(speech_buffer, html_decode(message), speaker_sound)
/// Called to set a new value for the blackboard key.
/datum/component/listen_and_repeat/proc/set_new_blackboard_phrase(datum/source)
@@ -67,7 +89,13 @@
return NO_NEW_PHRASE_AVAILABLE
var/selected_phrase = pick(speech_buffer)
- controller.set_blackboard_key(blackboard_key, selected_phrase)
+ var/list/to_return = list(MESSAGE_LINE = selected_phrase)
+
+ if(islist(speech_buffer[selected_phrase]))
+ to_return[MESSAGE_VOICE] = speech_buffer[selected_phrase][MESSAGE_VOICE]
+ to_return[MESSAGE_PITCH] = speech_buffer[selected_phrase][MESSAGE_PITCH]
+
+ controller.override_blackboard_key(blackboard_key, to_return)
/// Exports all the speech buffer data to a dedicated blackboard key on the source.
/datum/component/listen_and_repeat/proc/on_write_memory(datum/source, dead, gibbed)
@@ -81,3 +109,6 @@
#undef MAX_SPEECH_BUFFER_SIZE
#undef RADIO_IGNORE_CHANCE
+#undef MESSAGE_VOICE
+#undef MESSAGE_PITCH
+#undef MESSAGE_LINE
diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
index 493d67cbca8c8..ab8ad3957b1fb 100644
--- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
+++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
@@ -1,3 +1,4 @@
+#define MAXIMUM_PARROT_PITCH 24
/// When a parrot... parrots...
/datum/ai_planning_subtree/parrot_as_in_repeat
operational_datums = list(/datum/component/listen_and_repeat)
@@ -23,28 +24,43 @@
/datum/ai_behavior/perform_speech/parrot
action_cooldown = 7.5 SECONDS // gets really annoying (moreso than usual) really fast otherwise
-/datum/ai_behavior/perform_speech/parrot/perform(seconds_per_tick, datum/ai_controller/controller, speech, speech_sound)
+/datum/ai_behavior/perform_speech/parrot/perform(seconds_per_tick, datum/ai_controller/controller, list/speech, speech_sound)
var/mob/living/basic/parrot/speaking_pawn = controller.pawn
var/list/available_channels = speaking_pawn.get_available_channels()
- var/modified_speech = speech
+ var/modified_speech = speech["line"]
var/use_radio = prob(50) // we might not even use the radio if we even have a channel
-#define HAS_CHANNEL_PREFIX (speech[1] in GLOB.department_radio_prefixes) && (copytext_char(speech, 2, 3) in GLOB.department_radio_keys) // determine if we need to crop the channel prefix
+ var/has_channel_prefix = (modified_speech[1] in GLOB.department_radio_prefixes) && (copytext_char(modified_speech, 2, 3) in GLOB.department_radio_keys) // determine if we need to crop the channel prefix
if(!length(available_channels)) // might not even use the radio at all
- if(HAS_CHANNEL_PREFIX)
- modified_speech = copytext_char(speech, 3)
+ if(has_channel_prefix)
+ modified_speech = copytext_char(modified_speech, 3)
else
- if(HAS_CHANNEL_PREFIX)
- modified_speech = "[use_radio ? pick(available_channels) : ""][copytext_char(speech, 3)]"
+ if(has_channel_prefix)
+ modified_speech = "[use_radio ? pick(available_channels) : ""][copytext_char(modified_speech, 3)]"
else
- modified_speech = "[use_radio ? pick(available_channels) : ""][speech]"
-
+ modified_speech = "[use_radio ? pick(available_channels) : ""][modified_speech]"
+ if(SStts.tts_enabled)
+ modify_voice(speaking_pawn, speech)
speaking_pawn.say(modified_speech, forced = "AI Controller")
if(speech_sound)
playsound(speaking_pawn, speech_sound, 80, vary = TRUE)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-#undef HAS_CHANNEL_PREFIX
+/datum/ai_behavior/perform_speech/parrot/proc/modify_voice(mob/living/speaking_pawn, list/speech)
+ if(SStts.available_speakers.Find(speech["voice"]))
+ speaking_pawn.voice = speech["voice"]
+ if(speech["pitch"] && SStts.pitch_enabled)
+ speaking_pawn.pitch = min(speech["pitch"] + rand(6, 12), MAXIMUM_PARROT_PITCH)
+
+/datum/ai_behavior/perform_speech/parrot/finish_action(datum/ai_controller/controller, succeeded)
+ . = ..()
+ if(!succeeded)
+ return
+ var/mob/living/living_pawn = controller.pawn
+ living_pawn.voice = living_pawn::voice
+ living_pawn.pitch = living_pawn::pitch
+
+#undef MAXIMUM_PARROT_PITCH
From 1946ba129d4cab3579d92e470cbc32667d17f4fd Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 05:53:33 +1200
Subject: [PATCH 004/498] Automatic changelog for PR #82773 [ci skip]
---
html/changelogs/AutoChangeLog-pr-82773.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-82773.yml
diff --git a/html/changelogs/AutoChangeLog-pr-82773.yml b/html/changelogs/AutoChangeLog-pr-82773.yml
new file mode 100644
index 0000000000000..f48957da95e6a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-82773.yml
@@ -0,0 +1,4 @@
+author: "Ben10Omintrix"
+delete-after: True
+changes:
+ - rscadd: "parrots will now try to immitate the speaker's voice"
\ No newline at end of file
From 53518e043bfe5c8bef980b3e5230e3933fb62b94 Mon Sep 17 00:00:00 2001
From: tmyqlfpir <80724828+tmyqlfpir@users.noreply.github.com>
Date: Thu, 16 May 2024 05:31:18 +1000
Subject: [PATCH 005/498] Circuit editor QoL and new circuit components
(#82969)
## About The Pull Request
This PR introduces a number of minor quality of life improvements to
already existing circuit components, and adds three new components.
## Why It's Good For The Game
This improves the overall experience for circuits.
### UI changes
Grid align is now an option for circuit designers. It will round objects
to the nearest 10px units internally, and can be toggled on/off by the
new additional button beside the component menu button. This makes
circuits easier on the eyes as things are pixel perfect aligned.
All three buttons have been given tool tips.
### Tweaked Components
* Adds a on/off flag to the voice activator component
-- This saves power for circuits as you're not forced to use a compare
flag check to turn off voice activation
* Adds a quiet mode flag to speech component
-- This is ideal when you want a device to speak, but don't want other
people to hear. A good example would be a handheld translator that you
only want to hear yourself.
### New Components
* An NTNet Send component that allows everything to be input much like
the list literal component
-- This makes sending stuff over NTNet easier for the user, and use less
power as it won't require an additional list literal component
* A health comparison component that checks the entity's health state,
and can return true or false depending if the entity is alive, sleeping,
unconscious, critical or dead
-- This could be achieved by using a health sensor and a compare
component, however it lacks the ability to know when a entity is
unconscious or sleeping
* A quick toggle component to allow the switching between a true and
false state
-- This could be achieved by using a logic component and self linking,
however this makes it far easier for newcomers to make something as
simple as an on/off switch (such as a handheld translator which uses the
front button to turn on/off)
## Changelog
:cl:
qol: Add tooltips to circuit editor buttons
qol: Add grid alignment mode to circuit editor
add: Added new compare health state component
add: Added new NTNet send list literal component
add: Added new toggle component
qol: Added activity toggle to voice activator component
qol: Added quiet mode to speech component
qol: NTNet send component will not use power/trigger if NTNet is offline
/:cl:
---
.../research/designs/wiremod_designs.dm | 15 +++++
code/modules/research/techweb/all_nodes.dm | 3 +
.../wiremod/components/action/speech.dm | 5 +-
.../wiremod/components/atom/health_state.dm | 56 +++++++++++++++++++
code/modules/wiremod/components/atom/hear.dm | 6 ++
.../modules/wiremod/components/math/toggle.dm | 36 ++++++++++++
.../wiremod/components/ntnet/ntnet_send.dm | 11 +++-
.../components/ntnet/ntnet_send_literal.dm | 30 ++++++++++
code/modules/wiremod/core/component.dm | 11 ++++
.../wiremod/core/integrated_circuit.dm | 11 ++++
tgstation.dme | 3 +
.../IntegratedCircuit/ObjectComponent.jsx | 15 +++--
.../interfaces/IntegratedCircuit/index.jsx | 15 +++++
13 files changed, 209 insertions(+), 8 deletions(-)
create mode 100644 code/modules/wiremod/components/atom/health_state.dm
create mode 100644 code/modules/wiremod/components/math/toggle.dm
create mode 100644 code/modules/wiremod/components/ntnet/ntnet_send_literal.dm
diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm
index 3606dd67e2e60..204ecaa289bcf 100644
--- a/code/modules/research/designs/wiremod_designs.dm
+++ b/code/modules/research/designs/wiremod_designs.dm
@@ -81,6 +81,11 @@
id = "comp_logic"
build_path = /obj/item/circuit_component/compare/logic
+/datum/design/component/toggle
+ name = "Toggle Component"
+ id = "comp_toggle"
+ build_path = /obj/item/circuit_component/compare/toggle
+
/datum/design/component/delay
name = "Delay Component"
id = "comp_delay"
@@ -221,6 +226,11 @@
id = "comp_health"
build_path = /obj/item/circuit_component/health
+/datum/design/component/compare/health_state
+ name = "Compare Health State Component"
+ id = "comp_health_state"
+ build_path = /obj/item/circuit_component/compare/health_state
+
/datum/design/component/matscanner
name = "Material Scanner"
id = "comp_matscanner"
@@ -337,6 +347,11 @@
id = "comp_ntnet_send"
build_path = /obj/item/circuit_component/ntnet_send
+/datum/design/component/list_literal/ntnet_send
+ name = "NTNet Transmitter List Literal"
+ id = "comp_ntnet_send_list_literal"
+ build_path = /obj/item/circuit_component/list_literal/ntnet_send
+
/datum/design/component/list_literal
name = "List Literal Component"
id = "comp_list_literal"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 37245958aa369..69552a4923ca3 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -344,6 +344,7 @@
"comp_get_column",
"comp_gps",
"comp_health",
+ "comp_health_state",
"comp_hear",
"comp_id_access_reader",
"comp_id_getter",
@@ -368,6 +369,7 @@
"comp_not",
"comp_ntnet_receive",
"comp_ntnet_send",
+ "comp_ntnet_send_list_literal",
"comp_pinpointer",
"comp_pressuresensor",
"comp_radio",
@@ -386,6 +388,7 @@
"comp_tempsensor",
"comp_textcase",
"comp_timepiece",
+ "comp_toggle",
"comp_tonumber",
"comp_tostring",
"comp_trigonometry",
diff --git a/code/modules/wiremod/components/action/speech.dm b/code/modules/wiremod/components/action/speech.dm
index 0e2936bcfbfdb..f149cba9122bc 100644
--- a/code/modules/wiremod/components/action/speech.dm
+++ b/code/modules/wiremod/components/action/speech.dm
@@ -11,6 +11,8 @@
/// The message to send
var/datum/port/input/message
+ /// The quiet mode flag
+ var/datum/port/input/quietmode
/// The cooldown for this component of how often it can send speech messages.
var/speech_cooldown = 1 SECONDS
@@ -21,6 +23,7 @@
/obj/item/circuit_component/speech/populate_ports()
message = add_input_port("Message", PORT_TYPE_STRING, trigger = null)
+ quietmode = add_input_port("Quiet Mode", PORT_TYPE_NUMBER, default = 0)
/obj/item/circuit_component/speech/input_received(datum/port/input/port)
if(!parent.shell)
@@ -31,5 +34,5 @@
if(message.value)
var/atom/movable/shell = parent.shell
- shell.say(message.value, forced = "circuit speech | [parent.get_creator()]")
+ shell.say(message.value, forced = "circuit speech | [parent.get_creator()]", message_range = quietmode.value > 0 ? WHISPER_RANGE : MESSAGE_RANGE)
TIMER_COOLDOWN_START(shell, COOLDOWN_CIRCUIT_SPEECH, speech_cooldown)
diff --git a/code/modules/wiremod/components/atom/health_state.dm b/code/modules/wiremod/components/atom/health_state.dm
new file mode 100644
index 0000000000000..dc83a41fdfd8d
--- /dev/null
+++ b/code/modules/wiremod/components/atom/health_state.dm
@@ -0,0 +1,56 @@
+/**
+ * # Compare Health State Component
+ *
+ * Returns true when state matches entity.
+ */
+
+/obj/item/circuit_component/compare/health_state
+ display_name = "Compare Health State"
+ desc = "A component that compares the health state of an organism, and returns true or false."
+ category = "Entity"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// Compare state option
+ var/datum/port/input/option/state_option
+
+ var/max_range = 5
+
+/obj/item/circuit_component/compare/health_state/get_ui_notices()
+ . = ..()
+ . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info")
+
+/obj/item/circuit_component/compare/health_state/populate_options()
+ input_port = add_input_port("Organism", PORT_TYPE_ATOM)
+
+ var/static/component_options = list(
+ "Alive",
+ "Asleep",
+ "Critical",
+ "Unconscious",
+ "Deceased",
+ )
+ state_option = add_option_port("Comparison Option", component_options)
+
+/obj/item/circuit_component/compare/health_state/do_comparisons()
+ var/mob/living/organism = input_port.value
+ var/turf/current_turf = get_location()
+ if(!istype(organism) || current_turf.z != organism.z || get_dist(current_turf, organism) > max_range)
+ return FALSE
+
+ var/current_option = state_option.value
+ var/state = organism.stat
+ switch(current_option)
+ if("Alive")
+ return state != DEAD
+ if("Asleep")
+ return !!organism.IsSleeping() && !organism.IsUnconscious()
+ if("Critical")
+ return state == SOFT_CRIT || state == HARD_CRIT
+ if("Unconscious")
+ return state == UNCONSCIOUS || state == HARD_CRIT || !!organism.IsUnconscious()
+ if("Deceased")
+ return state == DEAD
+ //Unknown state, something fucked up really bad - just return false
+ return FALSE
diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm
index 3c3f05691b2d6..98c45a77f6fc2 100644
--- a/code/modules/wiremod/components/atom/hear.dm
+++ b/code/modules/wiremod/components/atom/hear.dm
@@ -8,6 +8,9 @@
desc = "A component that listens for messages. Requires a shell."
category = "Entity"
+ /// The on/off port
+ var/datum/port/input/on
+
/// The message heard
var/datum/port/output/message_port
/// The language heard
@@ -20,6 +23,7 @@
var/datum/port/output/trigger_port
/obj/item/circuit_component/hear/populate_ports()
+ on = add_input_port("On", PORT_TYPE_NUMBER, default = 1)
message_port = add_output_port("Message", PORT_TYPE_STRING)
language_port = add_output_port("Language", PORT_TYPE_STRING)
speaker_port = add_output_port("Speaker", PORT_TYPE_ATOM)
@@ -40,6 +44,8 @@
return Hear(arglist(arguments))
/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range)
+ if(!on.value)
+ return FALSE
if(speaker == parent?.shell)
return FALSE
diff --git a/code/modules/wiremod/components/math/toggle.dm b/code/modules/wiremod/components/math/toggle.dm
new file mode 100644
index 0000000000000..9f51c974cb31f
--- /dev/null
+++ b/code/modules/wiremod/components/math/toggle.dm
@@ -0,0 +1,36 @@
+/**
+ * # Toggle Component
+ *
+ * Does a toggle between true and false on trigger
+ */
+/obj/item/circuit_component/compare/toggle
+ display_name = "Toggle"
+ desc = "A component that toggles between on and off when triggered. All input ports (except for set toggle) will trigger the component."
+ category = "Math"
+
+ /// A signal to reset the toggle back to 0
+ var/datum/port/input/toggle_set
+ /// A signal to toggle and return the current state
+ var/datum/port/input/toggle_and_compare
+
+ var/toggle_state = FALSE
+
+/obj/item/circuit_component/compare/toggle/populate_custom_ports()
+ toggle_set = add_input_port("Set Toggle State", PORT_TYPE_NUMBER)
+ toggle_and_compare = add_input_port("Toggle And Compare", PORT_TYPE_SIGNAL)
+ toggle_state = FALSE
+
+/obj/item/circuit_component/compare/toggle/input_received(datum/port/input/port)
+ if(port == toggle_set)
+ toggle_state = !!port.value
+ return
+ if(COMPONENT_TRIGGERED_BY(toggle_and_compare, port))
+ toggle_state = !toggle_state
+ if(toggle_state)
+ true.set_output(COMPONENT_SIGNAL)
+ else
+ false.set_output(COMPONENT_SIGNAL)
+ return ..()
+
+/obj/item/circuit_component/compare/toggle/do_comparisons()
+ return toggle_state
diff --git a/code/modules/wiremod/components/ntnet/ntnet_send.dm b/code/modules/wiremod/components/ntnet/ntnet_send.dm
index 105af11760bc1..7ff4372927f3f 100644
--- a/code/modules/wiremod/components/ntnet/ntnet_send.dm
+++ b/code/modules/wiremod/components/ntnet/ntnet_send.dm
@@ -27,12 +27,17 @@
data_package = add_input_port("Data Package", PORT_TYPE_LIST(PORT_TYPE_ANY))
enc_key = add_input_port("Encryption Key", PORT_TYPE_STRING)
+/obj/item/circuit_component/ntnet_send/should_receive_input(datum/port/input/port)
+ . = ..()
+ if(!.)
+ return FALSE
+ /// If the server is down, don't use power or attempt to send data
+ return find_functional_ntnet_relay()
+
/obj/item/circuit_component/ntnet_send/pre_input_received(datum/port/input/port)
if(port == list_options)
var/new_datatype = list_options.value
data_package.set_datatype(PORT_TYPE_LIST(new_datatype))
/obj/item/circuit_component/ntnet_send/input_received(datum/port/input/port)
- if(!find_functional_ntnet_relay())
- return
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CIRCUIT_NTNET_DATA_SENT, list("data" = data_package.value, "enc_key" = enc_key.value, "port" = WEAKREF(data_package)))
+ send_ntnet_data(data_package, enc_key.value)
diff --git a/code/modules/wiremod/components/ntnet/ntnet_send_literal.dm b/code/modules/wiremod/components/ntnet/ntnet_send_literal.dm
new file mode 100644
index 0000000000000..49e1c2b00abe5
--- /dev/null
+++ b/code/modules/wiremod/components/ntnet/ntnet_send_literal.dm
@@ -0,0 +1,30 @@
+/**
+ * # NTNet Transmitter List Literal Component
+ *
+ * Create a list literal and send a data package through NTNet
+ *
+ * This file is based off of ntnet_send.dm
+ * Any changes made to those files should be copied over with discretion
+ */
+/obj/item/circuit_component/list_literal/ntnet_send
+ display_name = "NTNet Transmitter List Literal"
+ desc = "Creates a list literal data package and sends it through NTNet. If Encryption Key is set then transmitted data will be only picked up by receivers with the same Encryption Key."
+ category = "NTNet"
+
+ /// Encryption key
+ var/datum/port/input/enc_key
+
+/obj/item/circuit_component/list_literal/ntnet_send/populate_ports()
+ . = ..()
+ enc_key = add_input_port("Encryption Key", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/list_literal/ntnet_send/should_receive_input(datum/port/input/port)
+ . = ..()
+ if(!.)
+ return FALSE
+ /// If the server is down, don't use power or attempt to send data
+ return find_functional_ntnet_relay()
+
+/obj/item/circuit_component/list_literal/ntnet_send/input_received(datum/port/input/port)
+ . = ..()
+ send_ntnet_data(list_output, enc_key.value)
diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm
index 4d8344e1e6aa1..cf142d1e36520 100644
--- a/code/modules/wiremod/core/component.dm
+++ b/code/modules/wiremod/core/component.dm
@@ -405,3 +405,14 @@
*/
/obj/item/circuit_component/proc/unregister_usb_parent(atom/movable/shell)
return
+
+/**
+ * Called when a circuit component requests to send Ntnet data signal.
+ *
+ * Arguments:
+ * * port - The required list port needed by the Ntnet recieve
+ * * key - The encryption key
+ * * signal_type - The signal type used for sending this global signal (optional, default is COMSIG_GLOB_CIRCUIT_NTNET_DATA_SENT)
+ */
+/obj/item/circuit_component/proc/send_ntnet_data(datum/port/input/port, key, signal_type = COMSIG_GLOB_CIRCUIT_NTNET_DATA_SENT)
+ SEND_GLOBAL_SIGNAL(signal_type, list("data" = port.value, "enc_key" = key, "port" = WEAKREF(port)))
diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm
index 7dde89e511612..5a825b81482e8 100644
--- a/code/modules/wiremod/core/integrated_circuit.dm
+++ b/code/modules/wiremod/core/integrated_circuit.dm
@@ -80,6 +80,9 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
/// The Y position of the screen. Used for adding components.
var/screen_y = 0
+ /// The grid mode state for the circuit.
+ var/grid_mode = TRUE
+
/// The current size of the circuit.
var/current_size = 0
@@ -400,6 +403,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
.["examined_notices"] = examined?.get_ui_notices()
.["examined_rel_x"] = examined_rel_x
.["examined_rel_y"] = examined_rel_y
+ .["grid_mode"] = grid_mode
.["is_admin"] = (admin_only || isAdminGhostAI(user)) && check_rights_for(user.client, R_VAREDIT)
@@ -577,6 +581,9 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
else
set_display_name("")
. = TRUE
+ if("toggle_grid_mode")
+ toggle_grid_mode()
+ . = TRUE
if("set_examined_component")
var/component_id = text2num(params["component_id"])
if(!WITHIN_RANGE(component_id, attached_components))
@@ -709,6 +716,10 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
else
shell.name = initial(shell.name)
+/// Toggles the grid mode property for this circuit.
+/obj/item/integrated_circuit/proc/toggle_grid_mode()
+ grid_mode = !grid_mode
+
/**
* Returns the creator of the integrated circuit. Used in admin messages and other related things.
*/
diff --git a/tgstation.dme b/tgstation.dme
index 3dfe9614fc214..839c7b6628a64 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6087,6 +6087,7 @@
#include "code\modules\wiremod\components\atom\direction.dm"
#include "code\modules\wiremod\components\atom\gps.dm"
#include "code\modules\wiremod\components\atom\health.dm"
+#include "code\modules\wiremod\components\atom\health_state.dm"
#include "code\modules\wiremod\components\atom\hear.dm"
#include "code\modules\wiremod\components\atom\matscanner.dm"
#include "code\modules\wiremod\components\atom\pinpointer.dm"
@@ -6130,9 +6131,11 @@
#include "code\modules\wiremod\components\math\logic.dm"
#include "code\modules\wiremod\components\math\not.dm"
#include "code\modules\wiremod\components\math\random.dm"
+#include "code\modules\wiremod\components\math\toggle.dm"
#include "code\modules\wiremod\components\math\trigonometry.dm"
#include "code\modules\wiremod\components\ntnet\ntnet_receive.dm"
#include "code\modules\wiremod\components\ntnet\ntnet_send.dm"
+#include "code\modules\wiremod\components\ntnet\ntnet_send_literal.dm"
#include "code\modules\wiremod\components\sensors\pressuresensor.dm"
#include "code\modules\wiremod\components\sensors\tempsensor.dm"
#include "code\modules\wiremod\components\sensors\view_sensor.dm"
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/ObjectComponent.jsx b/tgui/packages/tgui/interfaces/IntegratedCircuit/ObjectComponent.jsx
index d51c39714efc6..22f7c6ce1a84f 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/ObjectComponent.jsx
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/ObjectComponent.jsx
@@ -39,8 +39,8 @@ export class ObjectComponent extends Component {
if (dragPos) {
act('set_component_coordinates', {
component_id: index,
- rel_x: dragPos.x,
- rel_y: dragPos.y,
+ rel_x: this.roundToGrid(dragPos.x),
+ rel_y: this.roundToGrid(dragPos.y),
});
}
@@ -81,6 +81,12 @@ export class ObjectComponent extends Component {
);
}
+ // Round the units to the grid (bypass if grid mode is off)
+ roundToGrid(input_value) {
+ if (!this.props.gridMode) return input_value;
+ return Math.round(input_value / 10) * 10;
+ }
+
render() {
const {
input_ports,
@@ -99,14 +105,15 @@ export class ObjectComponent extends Component {
onPortRightClick = noop,
onPortMouseUp = noop,
act = noop,
+ gridMode = true,
...rest
} = this.props;
const { startPos, dragPos } = this.state;
let [x_pos, y_pos] = [x, y];
if (dragPos && startPos && startPos.x === x_pos && startPos.y === y_pos) {
- x_pos = dragPos.x;
- y_pos = dragPos.y;
+ x_pos = this.roundToGrid(dragPos.x);
+ y_pos = this.roundToGrid(dragPos.y);
}
// Assigned onto the ports
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.jsx b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.jsx
index 79e4df4109f32..316a1754b4588 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.jsx
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.jsx
@@ -401,6 +401,7 @@ export class IntegratedCircuit extends Component {
examined_rel_y,
screen_x,
screen_y,
+ grid_mode,
is_admin,
variables,
global_basic_types,
@@ -473,6 +474,7 @@ export class IntegratedCircuit extends Component {
position="absolute"
top={0}
color="transparent"
+ tooltip="Show Variables Menu"
icon="cog"
selected={variableMenuOpen}
onClick={() =>
@@ -487,6 +489,7 @@ export class IntegratedCircuit extends Component {
position="absolute"
top={0}
color="transparent"
+ tooltip="Show Components Menu"
icon="plus"
selected={componentMenuOpen}
onClick={() =>
@@ -496,6 +499,17 @@ export class IntegratedCircuit extends Component {
}
/>
+
+
{!!is_admin && (
),
)}
From 84472cb08f0ff4ca9e29818ff1f705e02e55e0fd Mon Sep 17 00:00:00 2001
From: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Date: Wed, 15 May 2024 12:43:09 -0700
Subject: [PATCH 006/498] [no gbp] Fixes uniform alt click while resting
(#83231)
## About The Pull Request
Allow_resting was not enabled set for uniforms
## Why It's Good For The Game
Fixes #83225
## Changelog
:cl:
fix: You can adjust your uniform while lying down again
/:cl:
---
code/modules/clothing/under/_under.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 3f64aec43431e..a2e560743ffc0 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -11,6 +11,7 @@
drop_sound = 'sound/items/handling/cloth_drop.ogg'
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
limb_integrity = 30
+ interaction_flags_click = ALLOW_RESTING
/// Has this undersuit been freshly laundered and, as such, imparts a mood bonus for wearing
var/freshly_laundered = FALSE
From ae64cae59f1341937090c4bfa74f5a0b5ec3e0f1 Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 08:13:18 +1200
Subject: [PATCH 007/498] Automatic changelog for PR #82969 [ci skip]
---
html/changelogs/AutoChangeLog-pr-82969.yml | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-82969.yml
diff --git a/html/changelogs/AutoChangeLog-pr-82969.yml b/html/changelogs/AutoChangeLog-pr-82969.yml
new file mode 100644
index 0000000000000..e3eb15e3317b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-82969.yml
@@ -0,0 +1,11 @@
+author: "tmyqlfpir"
+delete-after: True
+changes:
+ - qol: "Add tooltips to circuit editor buttons"
+ - qol: "Add grid alignment mode to circuit editor"
+ - rscadd: "Added new compare health state component"
+ - rscadd: "Added new NTNet send list literal component"
+ - rscadd: "Added new toggle component"
+ - qol: "Added activity toggle to voice activator component"
+ - qol: "Added quiet mode to speech component"
+ - qol: "NTNet send component will not use power/trigger if NTNet is offline"
\ No newline at end of file
From b832885c31f184e42141dedc7c11e4c7f1be1412 Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 08:26:05 +1200
Subject: [PATCH 008/498] Automatic changelog for PR #83231 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83231.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83231.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83231.yml b/html/changelogs/AutoChangeLog-pr-83231.yml
new file mode 100644
index 0000000000000..858b9ae5df079
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83231.yml
@@ -0,0 +1,4 @@
+author: "jlsnow301"
+delete-after: True
+changes:
+ - bugfix: "You can adjust your uniform while lying down again"
\ No newline at end of file
From 428c594a72450fe4b2dc0251b5e4b6cfcea85418 Mon Sep 17 00:00:00 2001
From: Changelogs
Date: Thu, 16 May 2024 00:20:37 +0000
Subject: [PATCH 009/498] Automatic changelog compile [ci skip]
---
html/changelogs/AutoChangeLog-pr-82773.yml | 4 --
html/changelogs/AutoChangeLog-pr-82969.yml | 11 ----
html/changelogs/AutoChangeLog-pr-83115.yml | 5 --
html/changelogs/AutoChangeLog-pr-83130.yml | 4 --
html/changelogs/AutoChangeLog-pr-83135.yml | 5 --
html/changelogs/AutoChangeLog-pr-83139.yml | 5 --
html/changelogs/AutoChangeLog-pr-83152.yml | 4 --
html/changelogs/AutoChangeLog-pr-83155.yml | 4 --
html/changelogs/AutoChangeLog-pr-83158.yml | 9 ---
html/changelogs/AutoChangeLog-pr-83166.yml | 4 --
html/changelogs/AutoChangeLog-pr-83167.yml | 4 --
html/changelogs/AutoChangeLog-pr-83180.yml | 6 --
html/changelogs/AutoChangeLog-pr-83182.yml | 4 --
html/changelogs/AutoChangeLog-pr-83184.yml | 6 --
html/changelogs/AutoChangeLog-pr-83198.yml | 4 --
html/changelogs/AutoChangeLog-pr-83202.yml | 4 --
html/changelogs/AutoChangeLog-pr-83205.yml | 5 --
html/changelogs/AutoChangeLog-pr-83222.yml | 4 --
html/changelogs/AutoChangeLog-pr-83224.yml | 4 --
html/changelogs/AutoChangeLog-pr-83231.yml | 4 --
html/changelogs/archive/2024-05.yml | 68 ++++++++++++++++++++++
21 files changed, 68 insertions(+), 100 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-82773.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-82969.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83115.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83130.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83135.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83139.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83152.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83155.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83158.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83166.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83167.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83180.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83182.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83184.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83198.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83202.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83205.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83222.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83224.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-83231.yml
diff --git a/html/changelogs/AutoChangeLog-pr-82773.yml b/html/changelogs/AutoChangeLog-pr-82773.yml
deleted file mode 100644
index f48957da95e6a..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-82773.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ben10Omintrix"
-delete-after: True
-changes:
- - rscadd: "parrots will now try to immitate the speaker's voice"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-82969.yml b/html/changelogs/AutoChangeLog-pr-82969.yml
deleted file mode 100644
index e3eb15e3317b9..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-82969.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "tmyqlfpir"
-delete-after: True
-changes:
- - qol: "Add tooltips to circuit editor buttons"
- - qol: "Add grid alignment mode to circuit editor"
- - rscadd: "Added new compare health state component"
- - rscadd: "Added new NTNet send list literal component"
- - rscadd: "Added new toggle component"
- - qol: "Added activity toggle to voice activator component"
- - qol: "Added quiet mode to speech component"
- - qol: "NTNet send component will not use power/trigger if NTNet is offline"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83115.yml b/html/changelogs/AutoChangeLog-pr-83115.yml
deleted file mode 100644
index 8332590a5c372..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83115.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "PKPenguin321"
-delete-after: True
-changes:
- - rscadd: "New funny wizard staff/wand that shrinks stuff."
- - rscadd: "Being shrunken now leaves you vulnerable to being crushed to death."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83130.yml b/html/changelogs/AutoChangeLog-pr-83130.yml
deleted file mode 100644
index 6f37db7ce876e..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83130.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jacquerel"
-delete-after: True
-changes:
- - admin: "Admins can now more easily modify whether a Blood Brother can convert someone"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83135.yml b/html/changelogs/AutoChangeLog-pr-83135.yml
deleted file mode 100644
index 2aef5c475939c..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83135.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Derpguy3"
-delete-after: True
-changes:
- - qol: "Additional box types can be crafted from cardboard. Happy organizing."
- - spellcheck: "A typo in box crafting for prescription glasses has been fixed."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83139.yml b/html/changelogs/AutoChangeLog-pr-83139.yml
deleted file mode 100644
index cddc75c450d4f..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83139.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Jane"
-delete-after: True
-changes:
- - qol: "Shovels, Serrated Bone Shovels, and Entrenching Tools can now be hung upon Miner and Coroner Winter Coats, as well as the Coroner's Labcoat!"
- - image: "Mirrored the mirrored sprites to display Shovels in the suit slot properly."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83152.yml b/html/changelogs/AutoChangeLog-pr-83152.yml
deleted file mode 100644
index 42e3112b5eb03..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83152.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Shadow-Quill"
-delete-after: True
-changes:
- - qol: "The \"Confirm Order\" button on Cargo consoles is now active when the cargo shuttle is at Central Command instead of at the station."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83155.yml b/html/changelogs/AutoChangeLog-pr-83155.yml
deleted file mode 100644
index 5b202368871c9..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83155.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - bugfix: "Fixes the knife offset for pipeguns"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83158.yml b/html/changelogs/AutoChangeLog-pr-83158.yml
deleted file mode 100644
index fac82a6a702b7..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83158.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "SyncIt21"
-delete-after: True
-changes:
- - qol: "adds examines & screentips for tool & container actions on the smoke machine"
- - qol: "smoke machine no longer requires a power cell for construction"
- - code_imp: "autodocs & removes vars for some machine, Updated attack chain to latest standards for smoke machine"
- - bugfix: "You no longer hit the smoke machine with the beaker"
- - bugfix: "You can hit the smoke machine with tools & beakers when in combat mode"
- - bugfix: "no abstract & hologram item interactions allowed with smoke machine"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83166.yml b/html/changelogs/AutoChangeLog-pr-83166.yml
deleted file mode 100644
index b1e1abd77dc87..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83166.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "grungussuss and Virgilcore"
-delete-after: True
-changes:
- - sound: "portals now have a unique sound to them"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83167.yml b/html/changelogs/AutoChangeLog-pr-83167.yml
deleted file mode 100644
index ed7e631a67662..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83167.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Pickle-Coding"
-delete-after: True
-changes:
- - balance: "There are reports of malfunctioning guns being confiscated."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83180.yml b/html/changelogs/AutoChangeLog-pr-83180.yml
deleted file mode 100644
index 7a1e7732ac064..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83180.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Melbert"
-delete-after: True
-changes:
- - qol: "When you are offered something, you can shift-click the alert to examine the item rather than take it."
- - qol: "Examine blocks for screen alert examining."
- - qol: "Screentips for offer alerts."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83182.yml b/html/changelogs/AutoChangeLog-pr-83182.yml
deleted file mode 100644
index 51d92537dd2c1..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83182.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - bugfix: "The SC/FISHER can now shoot floor lights."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83184.yml b/html/changelogs/AutoChangeLog-pr-83184.yml
deleted file mode 100644
index d50037930daf8..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83184.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "jlsnow301"
-delete-after: True
-changes:
- - bugfix: "Bitrunning antagonists no longer gib on teleport"
- - bugfix: "Cyber tac now have a visible name / ID"
- - bugfix: "Renamed the bitrunning malfunction event to just \"Malfunction: x\""
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83198.yml b/html/changelogs/AutoChangeLog-pr-83198.yml
deleted file mode 100644
index 08fec4a6436d4..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83198.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DaxDupont"
-delete-after: True
-changes:
- - bugfix: "Fixes error when running docker compose on apt upgrade"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83202.yml b/html/changelogs/AutoChangeLog-pr-83202.yml
deleted file mode 100644
index 4e2f473207bf6..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83202.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Time-Green"
-delete-after: True
-changes:
- - bugfix: "Space Ninja and other space spawned antags get a 1 minute radiation shield in the radioactive nebula"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83205.yml b/html/changelogs/AutoChangeLog-pr-83205.yml
deleted file mode 100644
index 8cb565fcbf3b1..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83205.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SyncIt21"
-delete-after: True
-changes:
- - bugfix: "cell chargers, mechbay port chargers & recharge stations heat lost is directly proportional to energy drawn from the grid to charge their respective cells"
- - bugfix: "cyborgs should charge more frequently & to their max capacity at recharge stations"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83222.yml b/html/changelogs/AutoChangeLog-pr-83222.yml
deleted file mode 100644
index 7181439df97a6..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83222.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Spam clicking a modkit with a kinetic accelerator can no longer lead to ghosted versions of the modkits appearing in the modkit list, breaking the gun."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83224.yml b/html/changelogs/AutoChangeLog-pr-83224.yml
deleted file mode 100644
index 9b5cdf696fc60..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83224.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seven"
-delete-after: True
-changes:
- - bugfix: "Destroyed solar panels no longer drop their overlays"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-83231.yml b/html/changelogs/AutoChangeLog-pr-83231.yml
deleted file mode 100644
index 858b9ae5df079..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83231.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "jlsnow301"
-delete-after: True
-changes:
- - bugfix: "You can adjust your uniform while lying down again"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml
index 22f63142dca3a..c8c9bc2f9955c 100644
--- a/html/changelogs/archive/2024-05.yml
+++ b/html/changelogs/archive/2024-05.yml
@@ -318,3 +318,71 @@
- bugfix: Fixes random decal in space on Tramstation
necromanceranne:
- bugfix: Fixes an accidental reversion to greyscale plate armor.
+2024-05-16:
+ Ben10Omintrix:
+ - rscadd: parrots will now try to immitate the speaker's voice
+ DaxDupont:
+ - bugfix: Fixes error when running docker compose on apt upgrade
+ Derpguy3:
+ - qol: Additional box types can be crafted from cardboard. Happy organizing.
+ - spellcheck: A typo in box crafting for prescription glasses has been fixed.
+ Hatterhat:
+ - bugfix: The SC/FISHER can now shoot floor lights.
+ Jacquerel:
+ - admin: Admins can now more easily modify whether a Blood Brother can convert someone
+ Jane:
+ - qol: Shovels, Serrated Bone Shovels, and Entrenching Tools can now be hung upon
+ Miner and Coroner Winter Coats, as well as the Coroner's Labcoat!
+ - image: Mirrored the mirrored sprites to display Shovels in the suit slot properly.
+ Melbert:
+ - qol: When you are offered something, you can shift-click the alert to examine
+ the item rather than take it.
+ - qol: Examine blocks for screen alert examining.
+ - qol: Screentips for offer alerts.
+ PKPenguin321:
+ - rscadd: New funny wizard staff/wand that shrinks stuff.
+ - rscadd: Being shrunken now leaves you vulnerable to being crushed to death.
+ Pickle-Coding:
+ - balance: There are reports of malfunctioning guns being confiscated.
+ Seven:
+ - bugfix: Destroyed solar panels no longer drop their overlays
+ Shadow-Quill:
+ - qol: The "Confirm Order" button on Cargo consoles is now active when the cargo
+ shuttle is at Central Command instead of at the station.
+ ShizCalev:
+ - bugfix: Spam clicking a modkit with a kinetic accelerator can no longer lead to
+ ghosted versions of the modkits appearing in the modkit list, breaking the gun.
+ SyncIt21:
+ - bugfix: cell chargers, mechbay port chargers & recharge stations heat lost is
+ directly proportional to energy drawn from the grid to charge their respective
+ cells
+ - bugfix: cyborgs should charge more frequently & to their max capacity at recharge
+ stations
+ - qol: adds examines & screentips for tool & container actions on the smoke machine
+ - qol: smoke machine no longer requires a power cell for construction
+ - code_imp: autodocs & removes vars for some machine, Updated attack chain to latest
+ standards for smoke machine
+ - bugfix: You no longer hit the smoke machine with the beaker
+ - bugfix: You can hit the smoke machine with tools & beakers when in combat mode
+ - bugfix: no abstract & hologram item interactions allowed with smoke machine
+ Time-Green:
+ - bugfix: Space Ninja and other space spawned antags get a 1 minute radiation shield
+ in the radioactive nebula
+ grungussuss and Virgilcore:
+ - sound: portals now have a unique sound to them
+ jlsnow301:
+ - bugfix: Bitrunning antagonists no longer gib on teleport
+ - bugfix: Cyber tac now have a visible name / ID
+ - bugfix: 'Renamed the bitrunning malfunction event to just "Malfunction: x"'
+ - bugfix: You can adjust your uniform while lying down again
+ necromanceranne:
+ - bugfix: Fixes the knife offset for pipeguns
+ tmyqlfpir:
+ - qol: Add tooltips to circuit editor buttons
+ - qol: Add grid alignment mode to circuit editor
+ - rscadd: Added new compare health state component
+ - rscadd: Added new NTNet send list literal component
+ - rscadd: Added new toggle component
+ - qol: Added activity toggle to voice activator component
+ - qol: Added quiet mode to speech component
+ - qol: NTNet send component will not use power/trigger if NTNet is offline
From 926f8197aadf6c01b0cdb46adfcf5da32c9aab79 Mon Sep 17 00:00:00 2001
From: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Date: Thu, 16 May 2024 01:51:25 -0400
Subject: [PATCH 010/498] Remove sleeper protocol objective + Remove the upper
limit to sabotage RND server/Telecomms (#83206)
## About The Pull Request
Deletes the sleeper protocol objective

https://discord.com/channels/326822144233439242/326831214667235328/1239270421921005570
Removes the upper limit to sabotage telecomms/RND servers

https://discord.com/channels/326822144233439242/326831214667235328/1239269962707636375
## Why It's Good For The Game
Removes a bad objective.
Removes a non-sensical upper limit to sabotage rnd/telecomms.
## Changelog
:cl:
del: Removes the sleeper protocol traitor objective
balance: RND server/Telecomms sabotage can now show up even later in the
round
/:cl:
---
.../traitor/objectives/sabotage_machinery.dm | 1 -
.../sleeper_protocol.dm | 74 -------------------
tgstation.dme | 2 +-
3 files changed, 1 insertion(+), 76 deletions(-)
rename code/modules/{antagonists/traitor/objectives => surgery}/sleeper_protocol.dm (50%)
diff --git a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm
index 5a31c4c173976..5f3e2387a351f 100644
--- a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm
+++ b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm
@@ -66,7 +66,6 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han
telecrystal_reward = list(3, 4)
progression_minimum = 15 MINUTES
- progression_maximum = 30 MINUTES
applicable_jobs = list(
JOB_STATION_ENGINEER = /obj/machinery/telecomms/hub,
diff --git a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm b/code/modules/surgery/sleeper_protocol.dm
similarity index 50%
rename from code/modules/antagonists/traitor/objectives/sleeper_protocol.dm
rename to code/modules/surgery/sleeper_protocol.dm
index 6ec71ff08bd90..693b0fbfb5c4a 100644
--- a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm
+++ b/code/modules/surgery/sleeper_protocol.dm
@@ -1,70 +1,3 @@
-/datum/traitor_objective_category/sleeper_protocol
- name = "Sleeper Protocol"
- objectives = list(
- /datum/traitor_objective/sleeper_protocol = 1,
- /datum/traitor_objective/sleeper_protocol/everybody = 1,
- )
-
-/datum/traitor_objective/sleeper_protocol
- name = "Perform the sleeper protocol on a crewmember"
- description = "Use the button below to materialize a surgery disk in your hand, where you'll then be able to perform the sleeper protocol on a crewmember. If the disk gets destroyed, the objective will fail. This will only work on living and sentient crewmembers."
-
- progression_minimum = 0 MINUTES
-
- progression_reward = list(8 MINUTES, 15 MINUTES)
- telecrystal_reward = 1
-
- var/list/limited_to = list(
- JOB_CHIEF_MEDICAL_OFFICER,
- JOB_MEDICAL_DOCTOR,
- JOB_PARAMEDIC,
- JOB_ROBOTICIST,
- )
-
- var/obj/item/disk/surgery/sleeper_protocol/disk
-
- var/mob/living/current_registered_mob
-
- var/inverted_limitation = FALSE
-
-/datum/traitor_objective/sleeper_protocol/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!disk)
- buttons += add_ui_button("", "Clicking this will materialize the sleeper protocol surgery in your hand", "save", "summon_disk")
- return buttons
-
-/datum/traitor_objective/sleeper_protocol/ui_perform_action(mob/living/user, action)
- switch(action)
- if("summon_disk")
- if(disk)
- return
- disk = new(user.drop_location())
- user.put_in_hands(disk)
- AddComponent(/datum/component/traitor_objective_register, disk, \
- fail_signals = list(COMSIG_QDELETING))
-
-/datum/traitor_objective/sleeper_protocol/proc/on_surgery_success(datum/source, datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
- SIGNAL_HANDLER
- if(istype(step, /datum/surgery_step/brainwash/sleeper_agent))
- succeed_objective()
-
-/datum/traitor_objective/sleeper_protocol/can_generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/datum/job/job = generating_for.assigned_role
- if(!(job.title in limited_to) && !inverted_limitation)
- return FALSE
- if((job.title in limited_to) && inverted_limitation)
- return FALSE
- if(length(possible_duplicates) > 0)
- return FALSE
- return TRUE
-
-/datum/traitor_objective/sleeper_protocol/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- AddComponent(/datum/component/traitor_objective_mind_tracker, generating_for, \
- signals = list(COMSIG_MOB_SURGERY_STEP_SUCCESS = PROC_REF(on_surgery_success)))
- return TRUE
-
-/datum/traitor_objective/sleeper_protocol/ungenerate_objective()
- disk = null
/obj/item/disk/surgery/sleeper_protocol
name = "Suspicious Surgery Disk"
desc = "The disk provides instructions on how to turn someone into a sleeper agent for the Syndicate."
@@ -128,10 +61,3 @@
if(!.)
return
target.gain_trauma(new /datum/brain_trauma/mild/phobia/conspiracies(), TRAUMA_RESILIENCE_LOBOTOMY)
-
-/datum/traitor_objective/sleeper_protocol/everybody //Much harder for non-med and non-robo
- progression_minimum = 30 MINUTES
- progression_reward = list(8 MINUTES, 15 MINUTES)
- telecrystal_reward = 1
-
- inverted_limitation = TRUE
diff --git a/tgstation.dme b/tgstation.dme
index 839c7b6628a64..e3495c200453a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3239,7 +3239,6 @@
#include "code\modules\antagonists\traitor\objectives\kill_pet.dm"
#include "code\modules\antagonists\traitor\objectives\locate_weakpoint.dm"
#include "code\modules\antagonists\traitor\objectives\sabotage_machinery.dm"
-#include "code\modules\antagonists\traitor\objectives\sleeper_protocol.dm"
#include "code\modules\antagonists\traitor\objectives\steal.dm"
#include "code\modules\antagonists\traitor\objectives\abstract\target_player.dm"
#include "code\modules\antagonists\traitor\objectives\final_objective\battle_royale.dm"
@@ -5816,6 +5815,7 @@
#include "code\modules\surgery\prosthetic_replacement.dm"
#include "code\modules\surgery\repair_puncture.dm"
#include "code\modules\surgery\revival.dm"
+#include "code\modules\surgery\sleeper_protocol.dm"
#include "code\modules\surgery\stomachpump.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\surgery\surgery_helpers.dm"
From 150418d37872fb677a324f5ebdbe5041ffc175b1 Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 17:51:44 +1200
Subject: [PATCH 011/498] Automatic changelog for PR #83206 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83206.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83206.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83206.yml b/html/changelogs/AutoChangeLog-pr-83206.yml
new file mode 100644
index 0000000000000..c9c07eda832f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83206.yml
@@ -0,0 +1,5 @@
+author: "Xander3359"
+delete-after: True
+changes:
+ - rscdel: "Removes the sleeper protocol traitor objective"
+ - balance: "RND server/Telecomms sabotage can now show up even later in the round"
\ No newline at end of file
From 2d5f4480631b050652cf1817cb3dd7fb2f88cb66 Mon Sep 17 00:00:00 2001
From: _0Steven <42909981+00-Steven@users.noreply.github.com>
Date: Thu, 16 May 2024 08:11:59 +0200
Subject: [PATCH 012/498] Assorted minor alt-click reskinning fixes, primarily
context-based (#83105)
## About The Pull Request
This is a collection of tiny alt-click context fixes that I found during
testing #82920, but I felt were not right to put in there.
Most of the following explanation is for posterity, like they're mostly
one-liners, there's only so much explanation to do.
First off, the emotion mask would reset `current_skin` for infinite
reskinning, while we have the `INFINITE_RESKIN` flag:
https://github.com/tgstation/tgstation/blob/0c562fd74299f8ce92a81c0a932b8ec4862189af/code/modules/clothing/masks/costume.dm#L16-L19
We set this to `INFINITE_RESKIN` for sanity's sake.
Then, `/obj/item/clothing/under/add_context(...)` would call its parent,
but sometimes return `NONE` when its parent returned
`CONTEXTUAL_SCREENTIP_SET`:
https://github.com/tgstation/tgstation/blob/0c562fd74299f8ce92a81c0a932b8ec4862189af/code/modules/clothing/under/_under.dm#L83
This is bad, because reskinning context is handled on the parent
(`/obj/item`), and we have an item inheriting this which can be
reskinned, the mech pilot's suit:
https://github.com/tgstation/tgstation/blob/0c562fd74299f8ce92a81c0a932b8ec4862189af/code/modules/clothing/under/costume.dm#L224-L240
So we make this return the parent return value rather than `NONE`:
```dm
return changed ? CONTEXTUAL_SCREENTIP_SET : .
```
Next up, `/obj/item/clothing/accessory/add_context(...)` would never
actually call the parent and thus neither the reskinning context. It
also checks for whether you have an item in your active hand when
context is added, even though the context it adds actually only applies
when the accessory itself is in your active hand.
https://github.com/tgstation/tgstation/blob/0c562fd74299f8ce92a81c0a932b8ec4862189af/code/modules/clothing/under/accessories/_accessories.dm#L205-L210
So we instead make it call the parent first, check for whether the
accessory itself is in our active hand, and return the parent value if
not:
```dm
/obj/item/clothing/accessory/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(held_item != source)
return .
(...)
```
This resolves our issue.
We're almost there!
`/obj/item/reagent_containers/spray/medical/add_context(...)` exists,
but is entirely redundant due to this now being handled on the base
item, and also misses some of the checks it has.
https://github.com/tgstation/tgstation/blob/0c562fd74299f8ce92a81c0a932b8ec4862189af/code/modules/reagents/reagent_containers/spray.dm#L442-L447
So we just remove it.
Finally, what is to me the funniest one:
https://github.com/tgstation/tgstation/blob/9145ecb7e1e44635a1056fc704adfa3d764325e6/code/game/objects/items_reskin.dm#L8-L9
To add reskinning context, we check `item_flags` for `INFINITE_RESKIN`,
while it is actually on `obj_flags`.
So, instead, we were checking for the equivalent value in `item_flags`,
being `IN_STORAGE`.
https://github.com/tgstation/tgstation/blob/9145ecb7e1e44635a1056fc704adfa3d764325e6/code/__DEFINES/obj_flags.dm#L15
https://github.com/tgstation/tgstation/blob/9145ecb7e1e44635a1056fc704adfa3d764325e6/code/__DEFINES/obj_flags.dm#L34
And thus reskinning context for infinitely reskinnables would only show
up if they were in storage.
For now, we just update this to use `obj_flags` instead.
That's everything I found so far, which this should all fix.
## Why It's Good For The Game
Having working item usage context tends to be a good thing.
## Changelog
:cl:
fix: Emotion masks no longer use a janky workaround for infinite
reskinning.
fix: Mech pilot suit shows reskinning usage context correctly.
fix: Accessories show "wear above/below suit" usage context
appropriately.
fix: Accessories don't block reskinning usage context when they
shouldn't.
fix: Showing reskinning usage context cares about the infinite
reskinning flag, rather than whether it's in storage or not.
del: Removed redundant reskinning usage context code from medical
sprays, now shows reskinning usage context like other reskinnables.
/:cl:
---
code/game/objects/items.dm | 2 +-
code/modules/clothing/masks/costume.dm | 2 +-
code/modules/clothing/under/_under.dm | 3 ++-
code/modules/clothing/under/accessories/_accessories.dm | 5 +++--
code/modules/reagents/reagent_containers/spray.dm | 9 ---------
5 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 497d1fa611dc6..1c2293746d611 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -288,7 +288,7 @@
if(!unique_reskin)
return
- if(current_skin && !(item_flags & INFINITE_RESKIN))
+ if(current_skin && !(obj_flags & INFINITE_RESKIN))
return
context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin"
diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm
index 626d8ce4a65d4..844b823880ac4 100644
--- a/code/modules/clothing/masks/costume.dm
+++ b/code/modules/clothing/masks/costume.dm
@@ -4,6 +4,7 @@
icon_state = "joy"
clothing_flags = MASKINTERNALS
flags_inv = HIDESNOUT
+ obj_flags = parent_type::obj_flags | INFINITE_RESKIN
unique_reskin = list(
"Joy" = "joy",
"Flushed" = "flushed",
@@ -16,7 +17,6 @@
/obj/item/clothing/mask/joy/reskin_obj(mob/user)
. = ..()
user.update_worn_mask()
- current_skin = null//so we can infinitely reskin
/obj/item/clothing/mask/mummy
name = "mummy mask"
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index a2e560743ffc0..a39a10d26f822 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -66,6 +66,7 @@
. = ..()
var/changed = FALSE
+
if(isnull(held_item) && has_sensor == HAS_SENSORS)
context[SCREENTIP_CONTEXT_RMB] = "Toggle suit sensors"
changed = TRUE
@@ -86,7 +87,7 @@
context[SCREENTIP_CONTEXT_ALT_LMB] = "Wear [adjusted == ALT_STYLE ? "normally" : "casually"]"
changed = TRUE
- return changed ? CONTEXTUAL_SCREENTIP_SET : NONE
+ return changed ? CONTEXTUAL_SCREENTIP_SET : .
/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm
index fdaf666638da3..bfc6c1293fea4 100644
--- a/code/modules/clothing/under/accessories/_accessories.dm
+++ b/code/modules/clothing/under/accessories/_accessories.dm
@@ -210,8 +210,9 @@
. += "It can be worn above or below your suit. Right-click to toggle."
/obj/item/clothing/accessory/add_context(atom/source, list/context, obj/item/held_item, mob/user)
- if(!isnull(held_item))
- return NONE
+ . = ..()
+ if(held_item != source)
+ return .
context[SCREENTIP_CONTEXT_RMB] = "Wear [above_suit ? "below" : "above"] suit"
return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 389396ed3fc79..be40215039de4 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -438,15 +438,6 @@
"Yellow" = "sprayer_med_yellow",
"Blue" = "sprayer_med_blue")
-
-/obj/item/reagent_containers/spray/medical/add_context(atom/source, list/context, obj/item/held_item, mob/user)
- . = ..()
-
- if(!current_skin)
- context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin"
- return CONTEXTUAL_SCREENTIP_SET
-
-
/obj/item/reagent_containers/spray/medical/reskin_obj(mob/M)
..()
switch(icon_state)
From e55f24b784ff5d8f4905cabeb357ce9d60996fad Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 18:12:19 +1200
Subject: [PATCH 013/498] Automatic changelog for PR #83105 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83105.yml | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83105.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83105.yml b/html/changelogs/AutoChangeLog-pr-83105.yml
new file mode 100644
index 0000000000000..7673df80a511d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83105.yml
@@ -0,0 +1,9 @@
+author: "00-Steven"
+delete-after: True
+changes:
+ - bugfix: "Emotion masks no longer use a janky workaround for infinite reskinning."
+ - bugfix: "Mech pilot suit shows reskinning usage context correctly."
+ - bugfix: "Accessories show \"wear above/below suit\" usage context appropriately."
+ - bugfix: "Accessories don't block reskinning usage context when they shouldn't."
+ - bugfix: "Showing reskinning usage context cares about the infinite reskinning flag, rather than whether it's in storage or not."
+ - rscdel: "Removed redundant reskinning usage context code from medical sprays, now shows reskinning usage context like other reskinnables."
\ No newline at end of file
From ec41cba0876ee2ae0751e58b3ec0197a490621e4 Mon Sep 17 00:00:00 2001
From: Lufferly <40921881+Lufferly@users.noreply.github.com>
Date: Thu, 16 May 2024 01:39:03 -0700
Subject: [PATCH 014/498] Fixes wings working in space (#83239)
## About The Pull Request
Fixes #82035
Fixes #82184
Wings no longer are able to function in space if you activated them in
an environment they can function in.
This surfaced another bug where the wings would stop flying but would
leave the mob in a weird state where they weren't flying but were still
negating gravity, calling refresh_gravity fixed this, if this is a bad
way to do this let me know.
## Why It's Good For The Game
Bugfix, wings not working in space is an intentional balance
consideration.
## Changelog
:cl: Seven
fix: Wings no longer work in space if you activated them beforehand.
/:cl:
---
.../modules/surgery/organs/external/wings/functional_wings.dm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm
index a9eab672c1bdb..da3fe3353035c 100644
--- a/code/modules/surgery/organs/external/wings/functional_wings.dm
+++ b/code/modules/surgery/organs/external/wings/functional_wings.dm
@@ -50,7 +50,7 @@
///Called on_life(). Handle flight code and check if we're still flying
/obj/item/organ/external/wings/functional/proc/handle_flight(mob/living/carbon/human/human)
- if(human.movement_type & ~FLYING)
+ if(!(human.movement_type & FLYING))
return FALSE
if(!can_fly(human))
toggle_flight(human)
@@ -113,6 +113,8 @@
passtable_off(human, SPECIES_FLIGHT_TRAIT)
close_wings()
+ human.refresh_gravity()
+
///SPREAD OUR WINGS AND FLLLLLYYYYYY
/obj/item/organ/external/wings/functional/proc/open_wings()
var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay
From fb7e9fc2457a559eba2aac14096566063598f0cf Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Thu, 16 May 2024 20:39:29 +1200
Subject: [PATCH 015/498] Automatic changelog for PR #83239 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83239.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83239.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83239.yml b/html/changelogs/AutoChangeLog-pr-83239.yml
new file mode 100644
index 0000000000000..8b96b93986733
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83239.yml
@@ -0,0 +1,4 @@
+author: "Seven"
+delete-after: True
+changes:
+ - bugfix: "Wings no longer work in space if you activated them beforehand."
\ No newline at end of file
From 125d63727c8c38bee2a74593908d0c012a5d06ac Mon Sep 17 00:00:00 2001
From: RengaN02 <60517664+RengaN02@users.noreply.github.com>
Date: Thu, 16 May 2024 17:31:03 +0300
Subject: [PATCH 016/498] Fixes some atoms conduct electricity flag (#83230)
## About The Pull Request
Fixes: https://github.com/tgstation/tgstation/issues/83229
I think this code was done this way by a little mistake, and a metal
sword should conduct electricity anyway (right?).

## Why It's Good For The Game
its a fix
## Changelog
:cl: Rengan
fix: Officers sabre and grilles now conducts electricity as it should.
/:cl:
---
code/game/objects/items/melee/misc.dm | 3 +--
code/game/objects/structures/grille.dm | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 3310aa11faada..b3d33cd99e984 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -60,8 +60,7 @@
inhand_icon_state = "sabre"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- obj_flags = CONDUCTS_ELECTRICITY
- obj_flags = UNIQUE_RENAME
+ obj_flags = CONDUCTS_ELECTRICITY | UNIQUE_RENAME
force = 15
throwforce = 10
demolition_mod = 0.75 //but not metal
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index a25dfaada505f..37b894e277307 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -10,8 +10,7 @@
density = TRUE
anchored = TRUE
pass_flags_self = PASSGRILLE | PASSWINDOW
- obj_flags = CONDUCTS_ELECTRICITY
- obj_flags = CAN_BE_HIT | IGNORE_DENSITY
+ obj_flags = CONDUCTS_ELECTRICITY | CAN_BE_HIT | IGNORE_DENSITY
pressure_resistance = 5*ONE_ATMOSPHERE
armor_type = /datum/armor/structure_grille
max_integrity = 50
From 40ca497e2b02b27a0a4cbe17aee53e6b456a3b45 Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Fri, 17 May 2024 02:31:22 +1200
Subject: [PATCH 017/498] Automatic changelog for PR #83230 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83230.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83230.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83230.yml b/html/changelogs/AutoChangeLog-pr-83230.yml
new file mode 100644
index 0000000000000..b2a39e53c22c6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83230.yml
@@ -0,0 +1,4 @@
+author: "Rengan"
+delete-after: True
+changes:
+ - bugfix: "Officers sabre and grilles now conducts electricity as it should."
\ No newline at end of file
From 190440935f86b1dcfc15fdb960f9947a0921011f Mon Sep 17 00:00:00 2001
From: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com>
Date: Thu, 16 May 2024 09:34:23 -0500
Subject: [PATCH 018/498] Neckties can be worn below suits and accessories
(#83131)
## About The Pull Request
This has been bothering me for ages (...as can be seen from when I first
started work on this) so I decided to take it into my own hands to fix
my issues with this
IRL neckties are worn *below* suit jackets and waistcoats, it also
bothers me so much that I have to take off my tie when wearing MODsuits
and such or else it looks goofy as hell
## Why It's Good For The Game
It makes various outfits look nicer, makes it so wearing MODsuits with
ties doesn't look goofy, and still grants you the option to make the tie
render over your suit, in case you want the "business space suit" look
Also I fixed a minor bug, which I don't think was reported.
Examples
Worn under suit

Worn over suit

Worn with waistcoat

## Changelog
:cl:
qol: Neckties are now worn underneath suit items and accessories, they
can still be optionally worn over them in case you want the "business
space suit" look
fix: Fixed a bug where accessories wouldn't correctly apply over suits
if you equipped the jumpsuit they're attached to after the suit
/:cl:
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
---
code/__DEFINES/mobs.dm | 40 ++++++++++---------
code/modules/clothing/neck/_neck.dm | 22 ++++++++++
code/modules/clothing/under/_under.dm | 2 +-
.../under/accessories/_accessories.dm | 3 +-
4 files changed, 47 insertions(+), 20 deletions(-)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 5428f2ac3dd58..743610359844e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -661,39 +661,41 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list(
/// Total number of layers for mob overlays
/// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK
/// Also consider updating layers_to_offset
-#define TOTAL_LAYERS 34
+#define TOTAL_LAYERS 35
/// Mutations layer - Tk headglows, cold resistance glow, etc
-#define MUTATIONS_LAYER 34
+#define MUTATIONS_LAYER 35
/// Mutantrace features (tail when looking south) that must appear behind the body parts
-#define BODY_BEHIND_LAYER 33
+#define BODY_BEHIND_LAYER 34
/// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST
-#define BODYPARTS_LOW_LAYER 32
+#define BODYPARTS_LOW_LAYER 33
/// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER
-#define BODYPARTS_LAYER 31
+#define BODYPARTS_LAYER 32
/// Mutantrace features (snout, body markings) that must appear above the body parts
-#define BODY_ADJ_LAYER 30
+#define BODY_ADJ_LAYER 31
/// Underwear, undershirts, socks, eyes, lips(makeup)
-#define BODY_LAYER 29
+#define BODY_LAYER 30
/// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
-#define FRONT_MUTATIONS_LAYER 28
+#define FRONT_MUTATIONS_LAYER 29
/// Damage indicators (cuts and burns)
-#define DAMAGE_LAYER 27
+#define DAMAGE_LAYER 28
/// Jumpsuit clothing layer
-#define UNIFORM_LAYER 26
+#define UNIFORM_LAYER 27
/// ID card layer
-#define ID_LAYER 25
+#define ID_LAYER 26
/// ID card layer (might be deprecated)
-#define ID_CARD_LAYER 24
+#define ID_CARD_LAYER 25
/// Layer for bodyparts that should appear above every other bodypart - Currently only used for hands
-#define BODYPARTS_HIGH_LAYER 23
+#define BODYPARTS_HIGH_LAYER 24
/// Gloves layer
-#define GLOVES_LAYER 22
+#define GLOVES_LAYER 23
/// Shoes layer
-#define SHOES_LAYER 21
+#define SHOES_LAYER 22
/// Layer for masks that are worn below ears and eyes (like Balaclavas) (layers below hair, use flagsinv=HIDEHAIR as needed)
-#define LOW_FACEMASK_LAYER 20
+#define LOW_FACEMASK_LAYER 21
/// Ears layer (Spessmen have ears? Wow)
-#define EARS_LAYER 19
+#define EARS_LAYER 20
+/// Layer for neck apperal that should appear below the suit slot (like neckties)
+#define LOW_NECK_LAYER 19
/// Suit layer (armor, coats, etc.)
#define SUIT_LAYER 18
/// Glasses layer
@@ -702,7 +704,7 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list(
#define BELT_LAYER 16 //Possible make this an overlay of somethign required to wear a belt?
/// Suit storage layer (tucking a gun or baton underneath your armor)
#define SUIT_STORE_LAYER 15
-/// Neck layer (for wearing ties and bedsheets)
+/// Neck layer (for wearing capes and bedsheets)
#define NECK_LAYER 14
/// Back layer (for backpacks and equipment on your back)
#define BACK_LAYER 13
@@ -749,7 +751,9 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
"[BELT_LAYER]" = LOWER_BODY,
// Everything below looks fine with or without a filter, so we can skip it and just offset
// (In practice they'd be fine if they got a filter but we can optimize a bit by not.)
+ "[NECK_LAYER]" = UPPER_BODY,
"[GLASSES_LAYER]" = UPPER_BODY,
+ "[LOW_NECK_LAYER]" = UPPER_BODY,
"[ABOVE_BODY_FRONT_GLASSES_LAYER]" = UPPER_BODY, // currently unused
"[ABOVE_BODY_FRONT_HEAD_LAYER]" = UPPER_BODY, // only used for head stuff
"[GLOVES_LAYER]" = LOWER_BODY,
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index a41442c0fb9db..e9ee2b9d75928 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -44,6 +44,7 @@
icon = 'icons/obj/clothing/neck.dmi'
icon_state = "tie_greyscale_tied"
inhand_icon_state = "" //no inhands
+ alternate_worn_layer = LOW_NECK_LAYER // So that it renders below suit jackets, MODsuits, etc
w_class = WEIGHT_CLASS_SMALL
custom_price = PAYCHECK_CREW
greyscale_config = /datum/greyscale_config/ties
@@ -66,6 +67,7 @@
/obj/item/clothing/neck/tie/examine(mob/user)
. = ..()
+ . += span_notice("The tie can be worn above or below your suit. Alt-Right-click to toggle.")
if(clip_on)
. += span_notice("Looking closely, you can see that it's actually a cleverly disguised clip-on.")
else if(!is_tied)
@@ -102,6 +104,14 @@
user.update_clothing(ITEM_SLOT_NECK)
return CLICK_ACTION_SUCCESS
+/obj/item/clothing/neck/tie/alt_click_secondary(mob/user)
+ . = ..()
+ if(!user.can_perform_action(src, NEED_DEXTERITY))
+ return
+ alternate_worn_layer = alternate_worn_layer == initial(alternate_worn_layer) ? NONE : initial(alternate_worn_layer)
+ user.update_clothing(ITEM_SLOT_NECK)
+ balloon_alert(user, "wearing [alternate_worn_layer == initial(alternate_worn_layer) ? "below" : "above"] suits")
+
/obj/item/clothing/neck/tie/update_icon()
. = ..()
if(clip_on)
@@ -120,6 +130,7 @@
/obj/item/clothing/neck/tie/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
+ context[SCREENTIP_CONTEXT_ALT_RMB] = "Wear [alternate_worn_layer == initial(alternate_worn_layer) ? "above" : "below"] suit"
if(clip_on)
return
if(is_tied)
@@ -128,6 +139,17 @@
context[SCREENTIP_CONTEXT_ALT_LMB] = "Tie"
return CONTEXTUAL_SCREENTIP_SET
+/obj/item/clothing/neck/tie/worn_overlays(mutable_appearance/standing, isinhands)
+ . = ..()
+ var/mob/living/carbon/human/wearer = loc
+ if(!ishuman(wearer) || !wearer.w_uniform)
+ return
+ var/obj/item/clothing/under/undershirt = wearer.w_uniform
+ if(!istype(undershirt) || !LAZYLEN(undershirt.attached_accessories))
+ return
+ if(alternate_worn_layer)
+ . += undershirt.accessory_overlay
+
/obj/item/clothing/neck/tie/blue
name = "blue tie"
icon_state = "tie_greyscale_untied"
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index a39a10d26f822..b6c8ccf2f2d8c 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -53,7 +53,7 @@
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF)
register_context()
- AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING, body = TRUE)
+ AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK, body = TRUE)
/obj/item/clothing/under/setup_reskinning()
if(!check_setup_reskinning())
diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm
index bfc6c1293fea4..91854bc386bf0 100644
--- a/code/modules/clothing/under/accessories/_accessories.dm
+++ b/code/modules/clothing/under/accessories/_accessories.dm
@@ -165,11 +165,12 @@
SIGNAL_HANDLER
accessory_dropped(source, user)
- user.update_clothing(ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING)
+ user.update_clothing(ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK)
/// Called when the uniform this accessory is pinned to is equipped in a valid slot
/obj/item/clothing/accessory/proc/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
equipped(user, user.get_slot_by_item(clothes)) // so we get any actions, item_flags get set, etc
+ user.update_clothing(ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK)
return
/// Called when the uniform this accessory is pinned to is dropped
From a8fc20d6664aed0498d432cafc4f73ca3302f52c Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Fri, 17 May 2024 02:34:44 +1200
Subject: [PATCH 019/498] Automatic changelog for PR #83131 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83131.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83131.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83131.yml b/html/changelogs/AutoChangeLog-pr-83131.yml
new file mode 100644
index 0000000000000..f1370e041bdab
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83131.yml
@@ -0,0 +1,5 @@
+author: "siliconOpossum"
+delete-after: True
+changes:
+ - qol: "Neckties are now worn underneath suit items and accessories, they can still be optionally worn over them in case you want the \"business space suit\" look"
+ - bugfix: "Fixed a bug where accessories wouldn't correctly apply over suits if you equipped the jumpsuit they're attached to after the suit"
\ No newline at end of file
From 091e3af54e9442489ba23c1dfefc9a9e1aeb57cf Mon Sep 17 00:00:00 2001
From: Thunder12345
Date: Thu, 16 May 2024 17:11:37 +0100
Subject: [PATCH 020/498] Restores Balance to the Candle Economy (#83240)
## About The Pull Request
Reduces the favour gain of candled from 50 to 40. This prevents infinite
free favour farming by buying 5 candles for 200 and selling them for
250.
## Why It's Good For The Game
Letting people generate free infinite resources from nothing is both
lame and a violation of the laws of thermodynamics, at least walking to
the biogenerator to make candles requires a minimal level of
effort/interaction.
## Changelog
:cl:
fix: Pyre chaplains can no longer generate infinite favour for free by
buying and selling candles. Candles now offer for 40 favour, down from
50.
/:cl:
---
code/modules/religion/religion_sects.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index 5d5d3909ec759..a8f23225a8ba8 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -238,7 +238,7 @@
to_chat(user, span_notice("The candle needs to be lit to be offered!"))
return
to_chat(user, span_notice("[GLOB.deity] is pleased with your sacrifice."))
- adjust_favor(50, user) //it's not a lot but hey there's a pacifist favor option at least
+ adjust_favor(40, user) //it's not a lot but hey there's a pacifist favor option at least
qdel(offering)
return TRUE
From 501c8c79a59acd4599e04096e534f9593d9ebe8d Mon Sep 17 00:00:00 2001
From: orange man <61334995+comfyorange@users.noreply.github.com>
Date: Fri, 17 May 2024 04:11:57 +1200
Subject: [PATCH 021/498] Automatic changelog for PR #83240 [ci skip]
---
html/changelogs/AutoChangeLog-pr-83240.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-83240.yml
diff --git a/html/changelogs/AutoChangeLog-pr-83240.yml b/html/changelogs/AutoChangeLog-pr-83240.yml
new file mode 100644
index 0000000000000..b39d1f3647ccd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-83240.yml
@@ -0,0 +1,4 @@
+author: "Thunder12345"
+delete-after: True
+changes:
+ - bugfix: "Pyre chaplains can no longer generate infinite favour for free by buying and selling candles. Candles now offer for 40 favour, down from 50."
\ No newline at end of file
From 650492a26d71ba668e89bf97bd97b91a515745be Mon Sep 17 00:00:00 2001
From: starrm4nn <139372157+starrm4nn@users.noreply.github.com>
Date: Thu, 16 May 2024 16:12:15 +0000
Subject: [PATCH 022/498] Fixes Spess Knife's cutter tool having an invisible
sprite (#83246)
## About The Pull Request
fixed the cutter tool making the spess knife invisible
## Why It's Good For The Game
bugs are bad
## Changelog
:cl:
fix: Fixed the spess knife's cutter tool icon being invisible.
/:cl:
---
icons/obj/tools.dmi | Bin 35556 -> 32658 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 6bb1b8b41f67c5578111985462240c3ce3860e43..ec8216ccc3e7bef185186a59056a11fe15371c36 100644
GIT binary patch
literal 32658
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