diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index bd6c25c436..fc1be6de5e 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -89,6 +89,11 @@ to_chat(user, "You can't tackle while tased!") return + var/left_paralysis = HAS_TRAIT(user, TRAIT_PARALYSIS_L_ARM) + var/right_paralysis = HAS_TRAIT(user, TRAIT_PARALYSIS_R_ARM) + if(left_paralysis && right_paralysis) + to_chat(user, "You can't tackle without the use of your arms!") + user.face_atom(A) var/list/modifiers = params2list(params) @@ -283,6 +288,10 @@ attack_mod -= 2 if(HAS_TRAIT(sacker, TRAIT_GIANT)) attack_mod += 2 + var/left_paralysis = HAS_TRAIT(sacker, TRAIT_PARALYSIS_L_ARM) + var/right_paralysis = HAS_TRAIT(sacker, TRAIT_PARALYSIS_R_ARM) + if(left_paralysis || right_paralysis) + attack_mod -= 2 if(ishuman(target)) var/mob/living/carbon/human/S = sacker diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 44030b0417..b5b55c1e14 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -31,9 +31,8 @@ Bonus var/bleed = FALSE var/pain = FALSE threshold_desc = list( - "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.", - "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.", - "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met." + "Resistance 7" = "Erodes the host's skin, causing them to bleed profusely.", + "Transmission 8" = "Eat's away at the host's musclemass, causing increased fatigue." ) /datum/symptom/flesh_eating/Start(datum/disease/advance/A) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index ae139104f0..6217665157 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -13,6 +13,8 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/save_key /// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\] var/examine_no_preview = FALSE + /// Examine FULLY views. Overrides examine_no_preview + var/examine_full_view = FALSE /datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE) . = ..() @@ -37,7 +39,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being var/mob/M = target LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src) - M.verbs |= /mob/proc/manage_flavor_tests + add_verb(M, /mob/proc/manage_flavor_tests) if(save_key && ishuman(target)) RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text) @@ -71,6 +73,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code examine_list += "\[[flavor_name]\]" return var/msg = replacetext(text, "\n", " ") + if(examine_full_view) + examine_list += "[msg]" + return if(length_char(msg) <= 40) examine_list += "[msg]" else @@ -113,6 +118,21 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/datum/element/flavor_text/F = choices[chosen] F.set_flavor(src) +/mob/proc/set_pose() + set name = "Set Pose" + set desc = "Sets your temporary flavor text" + set category = "IC" + + var/list/L = GLOB.mobs_with_editable_flavor_text[src] + var/datum/element/flavor_text/carbon/temporary/T + for(var/i in L) + if(istype(i, /datum/element/flavor_text/carbon/temporary)) + T = i + if(!T) + to_chat(src, "Your mob type does not support temporary flavor text.") + return + T.set_flavor(src) + /datum/element/flavor_text/proc/set_flavor(mob/user) if(!(user in texts_by_atom)) return FALSE @@ -135,7 +155,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert, /datum/antagonist/nukeop, /datum/antagonist/wizard)) -/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE) +/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE) if(!iscarbon(target)) return ELEMENT_INCOMPATIBLE . = ..() @@ -167,3 +187,19 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code texts_by_atom[user] = "" if(user.dna) user.dna.features[save_key] = "" + +/datum/element/flavor_text/carbon/temporary + examine_full_view = TRUE + max_len = 1024 + +/datum/element/flavor_text/carbon/temporary/Attach(datum/target, text, _name, _addendum, _max_len, _always_show, _edit, _save_key, _examine_no_preview) + . = ..() + if(. & ELEMENT_INCOMPATIBLE) + return + if(ismob(target)) + add_verb(target, /mob/proc/set_pose) + +/datum/element/flavor_Text/carbon/temporary/Detach(datum/source, force) + . = ..() + if(ismob(source)) + remove_verb(source, /mob/proc/set_pose) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 9bc20565a6..3588b7be63 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -33,6 +33,8 @@ //--end of love :'(-- var/snowflake_id //if we set from a config snowflake plushie. + /// wrapper, do not use, read only + var/__ADMIN_SET_TO_ID var/can_random_spawn = TRUE //if this is FALSE, don't spawn this for random plushies. /obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) @@ -112,10 +114,21 @@ return ..() +/obj/item/toy/plush/vv_get_var(var_name) + if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID)) + return debug_variable("__ADMIN: SET SNOWFLAKE ID", snowflake_id, 0, src) + return ..() + +/obj/item/toy/plush/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID)) + return set_snowflake_from_config(var_value) + return ..() + /obj/item/toy/plush/proc/set_snowflake_from_config(id) var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) var/list/jsonlist = configlist[id] - ASSERT(jsonlist) + if(!jsonlist) + return FALSE jsonlist = json_decode(jsonlist) if(jsonlist["inherit_from"]) var/path = text2path(jsonlist["inherit_from"]) @@ -151,6 +164,7 @@ var/datum/component/squeak/S = GetComponent(/datum/component/squeak) S?.override_squeak_sounds = squeak_override snowflake_id = id + return TRUE /obj/item/toy/plush/handle_atom_del(atom/A) if(A == grenade) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index 25602c8588..d54f008108 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -98,7 +98,7 @@ var/pck = pick("assasinate","protect") switch(pck) if("assasinate") - var/datum/objective/assassinate/A = new + var/datum/objective/assassinate/once/A = new A.owner = owner var/list/owners = A.get_owners() A.find_target(owners,protection) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 9b816a9f90..64ab4791d3 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -133,12 +133,12 @@ return TRUE /datum/job/proc/GetAntagRep() - . = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)] + . = CONFIG_GET(keyed_list/antag_rep)[ckey(title)] if(. == null) return antag_rep /datum/job/proc/GetThreat() - . = CONFIG_GET(keyed_list/job_threat)[lowertext(title)] + . = CONFIG_GET(keyed_list/job_threat)[ckey(title)] if(. == null) return threat diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm index f966051ed3..94ebf42a2a 100644 --- a/code/modules/mob/dead/observer/respawn.dm +++ b/code/modules/mob/dead/observer/respawn.dm @@ -155,16 +155,18 @@ penalize = client.prefs.respawn_restrictions_active client.prefs.respawn_restrictions_active = penalize - to_chat(src, "You have been respawned to the lobby. \ + message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.") + log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.") + var/mob/dead/new_player/N = transfer_to_lobby() + + to_chat(N, "You have been respawned to the lobby. \ Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \ Any character you join as has NO knowledge of round events unless specified otherwise by an admin.") - message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.") - log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.") - transfer_to_lobby() - /** * Actual proc that removes us and puts us back on lobby + * + * Returns the new mob. */ /mob/dead/observer/proc/transfer_to_lobby() if(!client) // if no one's in us we can just be deleted @@ -179,3 +181,4 @@ var/mob/dead/new_player/M = new /mob/dead/new_player M.ckey = ckey + return M diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d8f3018757..761a7e6e75 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -44,7 +44,7 @@ AddComponent(/datum/component/mood) AddComponent(/datum/component/combat_mode) AddElement(/datum/element/flavor_text/carbon, _name = "Flavor Text", _save_key = "flavor_text") - AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") + AddElement(/datum/element/flavor_text/carbon/temporary, "", "Set Pose (Temporary Flavor Text)", "This should be used only for things pertaining to the current round!", _save_key = null) //AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE) //Skyrat change - we have our own OOC notes /mob/living/carbon/human/Destroy() @@ -545,7 +545,7 @@ to_chat(usr, "Successfully added comment.") return to_chat(usr, "Unable to locate a data core entry for this person.") - + if(href_list["lookitem"]) //It's for the show item at sandcode/code/modules/mob/living/carbon/show.dm var/obj/item/I = locate(href_list["lookitem"]) if(I in view(4)) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm index 5d2693915d..ed3c7e21d4 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm @@ -62,7 +62,6 @@ H.add_movespeed_modifier(/datum/movespeed_modifier/slime_puddle) - H.layer -= 1 //go one layer down so people go over you ENABLE_BITFIELD(H.pass_flags, PASSMOB) //this actually lets people pass over you squeak = H.AddComponent(/datum/component/squeak, custom_sounds = list('sound/effects/blobattack.ogg')) //blorble noise when people step on you @@ -103,7 +102,6 @@ REMOVE_TRAIT(H, TRAIT_HUMAN_NO_RENDER, SLIMEPUDDLE_TRAIT) H.update_disabled_bodyparts(silent = TRUE) H.remove_movespeed_modifier(/datum/movespeed_modifier/slime_puddle) - H.layer += 1 //go one layer back above! DISABLE_BITFIELD(H.pass_flags, PASSMOB) is_puddle = FALSE if(squeak) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 317211a2f7..20fbe186c6 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -86,15 +86,6 @@ proc/get_top_level_mob(var/mob/S) else if(!params) var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN) if(subtle_emote && !check_invalid(user, subtle_emote)) - var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") - switch(type) - if("Visible") - emote_type = EMOTE_VISIBLE - if("Hearable") - emote_type = EMOTE_AUDIBLE - else - alert("Unable to use this emote, must be either hearable or visible.") - return message = subtle_emote else return FALSE @@ -111,6 +102,80 @@ proc/get_top_level_mob(var/mob/S) user.visible_message(message = message, self_message = message, vision_distance = 1, ignored_mobs = GLOB.dead_mob_list, omni = TRUE) +///////////////// SUBTLE 3: DARE DICE + +/datum/emote/living/subtler_table + key = "subtler_table" + key_third_person = "subtler_table" + message = null + mob_type_blacklist_typecache = list(/mob/living/brain) + +/datum/emote/living/subtler_table/proc/check_invalid(mob/user, input) + if(stop_bad_mime.Find(input, 1, 1)) + to_chat(user, "Invalid emote.") + return TRUE + return FALSE + +/datum/emote/living/subtler_table/run_emote(mob/user, params, type_override = null) + if(!locate(/obj/structure/table) in range(user, 1)) + to_chat(user, "There are no tables around you.") + return FALSE + if(jobban_isbanned(user, "emote")) + to_chat(user, "You cannot send subtle emotes (banned).") + return FALSE + else if(user.client && user.client.prefs.muted & MUTE_IC) + to_chat(user, "You cannot send IC messages (muted).") + return FALSE + else if(!params) + var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN) + if(subtle_emote && !check_invalid(user, subtle_emote)) + message = subtle_emote + else + return FALSE + else + message = params + if(type_override) + emote_type = type_override + . = TRUE + if(!can_run_emote(user)) + return FALSE + + user.log_message("[message] (TABLE-WRAPPING)", LOG_SUBTLER) + message = "[user] [user.say_emphasis(message)]" + + var/list/show_to = list() + var/list/processing = list() + var/safety = 25 + for(var/obj/structure/table/T in range(user, 1)) + processing |= T + for(var/i in processing) + var/obj/structure/table/T = i + if(safety-- <= 0) + to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)") + break + if(get_dist(T, user) > 7) + continue // nah + processing |= T + for(var/mob/living/M in range(T, 1)) // no ghosts/cameramobs + show_to |= M + var/obj/structure/table/other + other = locate() in get_step(T, NORTH) + if(other) + processing |= other + other = locate() in get_step(T, SOUTH) + if(other) + processing |= other + other = locate() in get_step(T, WEST) + if(other) + processing |= other + other = locate() in get_step(T, EAST) + if(other) + processing |= other + + for(var/i in show_to) + var/mob/M = i + M.show_message(message) + ///////////////// VERB CODE /mob/living/verb/subtle() set name = "Subtle" @@ -128,3 +193,12 @@ proc/get_top_level_mob(var/mob/S) to_chat(usr, "Speech is currently admin-disabled.") return usr.emote("subtler") + +///////////////// VERB CODE 3 +/mob/living/verb/subtler_table() + set name = "Subtler Around Table" + set category = "IC" + if(GLOB.say_disabled) //This is dumb but it's here because heehoo copypaste, who the FUCK uses this to identify lag? + to_chat(usr, "Speech is currently admin-disabled.") + return + usr.emote("subtler_table") diff --git a/html/changelogs/AutoChangeLog-pr-13869.yml b/html/changelogs/AutoChangeLog-pr-13869.yml new file mode 100644 index 0000000000..5d4ca4817c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13869.yml @@ -0,0 +1,6 @@ +author: "timothyteakettle" +delete-after: True +changes: + - tweak: "slime puddles are no longer layered down one layer" + - tweak: "you cannot tackle with two paralysed arms" + - tweak: "tackling with a single paralysed arm lowers your tackle roll by 2" diff --git a/html/changelogs/AutoChangeLog-pr-13882.yml b/html/changelogs/AutoChangeLog-pr-13882.yml new file mode 100644 index 0000000000..fe545bdc23 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13882.yml @@ -0,0 +1,4 @@ +author: "ERP mains" +delete-after: True +changes: + - rscadd: "Subtler Around Table is now a verb" diff --git a/html/changelogs/AutoChangeLog-pr-13883.yml b/html/changelogs/AutoChangeLog-pr-13883.yml new file mode 100644 index 0000000000..884adafffe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13883.yml @@ -0,0 +1,5 @@ +author: "silicons" +delete-after: True +changes: + - rscadd: "set-pose has been added" + - tweak: "temporary flavor text renamed to set pose, fully visible in examine" diff --git a/html/changelogs/AutoChangeLog-pr-13887.yml b/html/changelogs/AutoChangeLog-pr-13887.yml new file mode 100644 index 0000000000..83069a4e64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13887.yml @@ -0,0 +1,4 @@ +author: "HeroWithYay" +delete-after: True +changes: + - bugfix: "Changed description of Necrotizing Fasciitis symptom."